// Decompiled with JetBrains decompiler // Type: Terraria.GameContent.Creative.CreativePowerManager // Assembly: Terraria, Version=1.4.0.5, Culture=neutral, PublicKeyToken=null // MVID: 67F9E73E-0A81-4937-A22C-5515CD405A83 // Assembly location: C:\Users\mikeyisbaeyt\Downloads\depotdownloader-2.4.5\depots\105601\6707058\Terraria.exe using System.Collections.Generic; using System.IO; using Terraria.GameContent.NetModules; using Terraria.Net; namespace Terraria.GameContent.Creative { public class CreativePowerManager { public static readonly CreativePowerManager Instance = new CreativePowerManager(); private Dictionary _powersById = new Dictionary(); private Dictionary _powersByName = new Dictionary(); private ushort _powersCount; private static bool _initialized = false; private const string _powerPermissionsLineHeader = "journeypermission_"; private CreativePowerManager() { } public void Register(string nameInServerConfig) where T : ICreativePower, new() { T obj = new T(); CreativePowerManager.PowerTypeStorage.Power = obj; CreativePowerManager.PowerTypeStorage.Id = this._powersCount; CreativePowerManager.PowerTypeStorage.Name = nameInServerConfig; obj.DefaultPermissionLevel = PowerPermissionLevel.CanBeChangedByEveryone; obj.CurrentPermissionLevel = PowerPermissionLevel.CanBeChangedByEveryone; this._powersById[this._powersCount] = (ICreativePower) obj; this._powersByName[nameInServerConfig] = (ICreativePower) obj; obj.PowerId = this._powersCount; obj.ServerConfigName = nameInServerConfig; ++this._powersCount; } public T GetPower() where T : ICreativePower => CreativePowerManager.PowerTypeStorage.Power; public ushort GetPowerId() where T : ICreativePower => CreativePowerManager.PowerTypeStorage.Id; public bool TryGetPower(ushort id, out ICreativePower power) => this._powersById.TryGetValue(id, out power); public static void TryListingPermissionsFrom(string line) { int length = "journeypermission_".Length; if (line.Length < length || !line.ToLower().StartsWith("journeypermission_")) return; string[] strArray = line.Substring(length).Split('='); int result; if (strArray.Length != 2 || !int.TryParse(strArray[1].Trim(), out result)) return; PowerPermissionLevel powerPermissionLevel = (PowerPermissionLevel) Utils.Clamp(result, 0, 2); string lower = strArray[0].Trim().ToLower(); CreativePowerManager.Initialize(); ICreativePower creativePower; if (!CreativePowerManager.Instance._powersByName.TryGetValue(lower, out creativePower)) return; creativePower.DefaultPermissionLevel = powerPermissionLevel; creativePower.CurrentPermissionLevel = powerPermissionLevel; } public static void Initialize() { if (CreativePowerManager._initialized) return; CreativePowerManager.Instance.Register("time_setfrozen"); CreativePowerManager.Instance.Register("time_setdawn"); CreativePowerManager.Instance.Register("time_setnoon"); CreativePowerManager.Instance.Register("time_setdusk"); CreativePowerManager.Instance.Register("time_setmidnight"); CreativePowerManager.Instance.Register("godmode"); CreativePowerManager.Instance.Register("wind_setstrength"); CreativePowerManager.Instance.Register("rain_setstrength"); CreativePowerManager.Instance.Register("time_setspeed"); CreativePowerManager.Instance.Register("rain_setfrozen"); CreativePowerManager.Instance.Register("wind_setfrozen"); CreativePowerManager.Instance.Register("increaseplacementrange"); CreativePowerManager.Instance.Register("setdifficulty"); CreativePowerManager.Instance.Register("biomespread_setfrozen"); CreativePowerManager.Instance.Register("setspawnrate"); CreativePowerManager._initialized = true; } public void Reset() { foreach (KeyValuePair keyValuePair in this._powersById) { keyValuePair.Value.CurrentPermissionLevel = keyValuePair.Value.DefaultPermissionLevel; if (keyValuePair.Value is IPersistentPerWorldContent persistentPerWorldContent2) persistentPerWorldContent2.Reset(); if (keyValuePair.Value is IPersistentPerPlayerContent perPlayerContent2) perPlayerContent2.Reset(); } } public void SaveToWorld(BinaryWriter writer) { lock (this._powersById) { foreach (KeyValuePair keyValuePair in this._powersById) { if (keyValuePair.Value is IPersistentPerWorldContent persistentPerWorldContent2) { writer.Write(true); writer.Write(keyValuePair.Key); persistentPerWorldContent2.Save(writer); } } } writer.Write(false); } public void LoadFromWorld(BinaryReader reader, int versionGameWasLastSavedOn) { ICreativePower creativePower; while (reader.ReadBoolean() && this._powersById.TryGetValue(reader.ReadUInt16(), out creativePower) && creativePower is IPersistentPerWorldContent persistentPerWorldContent) persistentPerWorldContent.Load(reader, versionGameWasLastSavedOn); } public void ValidateWorld(BinaryReader reader, int versionGameWasLastSavedOn) { ICreativePower creativePower; while (reader.ReadBoolean() && this._powersById.TryGetValue(reader.ReadUInt16(), out creativePower) && creativePower is IPersistentPerWorldContent persistentPerWorldContent) persistentPerWorldContent.ValidateWorld(reader, versionGameWasLastSavedOn); } public void SyncThingsToJoiningPlayer(int playerIndex) { foreach (KeyValuePair keyValuePair in this._powersById) { NetPacket packet = NetCreativePowerPermissionsModule.SerializeCurrentPowerPermissionLevel(keyValuePair.Key, (int) keyValuePair.Value.CurrentPermissionLevel); NetManager.Instance.SendToClient(packet, playerIndex); } foreach (KeyValuePair keyValuePair in this._powersById) { if (keyValuePair.Value is IOnPlayerJoining onPlayerJoining1) onPlayerJoining1.OnPlayerJoining(playerIndex); } } public void SaveToPlayer(Player player, BinaryWriter writer) { foreach (KeyValuePair keyValuePair in this._powersById) { if (keyValuePair.Value is IPersistentPerPlayerContent perPlayerContent1) { writer.Write(true); writer.Write(keyValuePair.Key); perPlayerContent1.Save(player, writer); } } writer.Write(false); } public void LoadToPlayer(Player player, BinaryReader reader, int versionGameWasLastSavedOn) { ICreativePower creativePower; while (reader.ReadBoolean() && this._powersById.TryGetValue(reader.ReadUInt16(), out creativePower)) { if (creativePower is IPersistentPerPlayerContent perPlayerContent2) perPlayerContent2.Load(player, reader, versionGameWasLastSavedOn); } } public void ApplyLoadedDataToPlayer(Player player) { foreach (KeyValuePair keyValuePair in this._powersById) { if (keyValuePair.Value is IPersistentPerPlayerContent perPlayerContent1) perPlayerContent1.ApplyLoadedDataToOutOfPlayerFields(player); } } public void ResetDataForNewPlayer(Player player) { foreach (KeyValuePair keyValuePair in this._powersById) { if (keyValuePair.Value is IPersistentPerPlayerContent perPlayerContent1) { perPlayerContent1.Reset(); perPlayerContent1.ResetDataForNewPlayer(player); } } } private class PowerTypeStorage where T : ICreativePower { public static ushort Id; public static string Name; public static T Power; } } }