using System.Collections.Generic; using System.IO; using System.IO.Streams; using static TShockAPI.GetDataHandlers; namespace TShockAPI.Handlers.NetModules { /// /// Provides handling for the Creative Power net module. Checks permissions on all creative powers /// public class CreativePowerHandler : INetModuleHandler { /// /// The power type being activated /// public CreativePowerTypes PowerType { get; set; } /// /// Reads the power type from the stream /// /// public void Deserialize(MemoryStream data) { PowerType = (CreativePowerTypes)data.ReadInt16(); } /// /// Determines if the player has permission to use the power type /// /// /// public void HandlePacket(TSPlayer player, out bool rejectPacket) { if (!HasPermission(PowerType, player)) { rejectPacket = true; return; } rejectPacket = false; } /// /// Determines if a player has permission to use a specific creative power /// /// /// /// public static bool HasPermission(CreativePowerTypes powerType, TSPlayer player) { if (!PowerToPermissionMap.TryGetValue(powerType, out string permission)) { TShock.Log.ConsoleDebug(GetString("CreativePowerHandler received permission check request for unknown creative power")); return false; } //prevent being told about the spawnrate permission on join until relogic fixes if (!player.HasReceivedNPCPermissionError && powerType == CreativePowerTypes.SetSpawnRate) { player.HasReceivedNPCPermissionError = true; return false; } if (!player.HasPermission(permission)) { player.SendErrorMessage(PermissionToDescriptionMap[permission]); return false; } return true; } /// /// Maps creative powers to permission nodes /// public static Dictionary PowerToPermissionMap = new Dictionary { { CreativePowerTypes.FreezeTime, Permissions.journey_timefreeze }, { CreativePowerTypes.SetDawn, Permissions.journey_timeset }, { CreativePowerTypes.SetNoon, Permissions.journey_timeset }, { CreativePowerTypes.SetDusk, Permissions.journey_timeset }, { CreativePowerTypes.SetMidnight, Permissions.journey_timeset }, { CreativePowerTypes.Godmode, Permissions.journey_godmode }, { CreativePowerTypes.WindStrength, Permissions.journey_windstrength }, { CreativePowerTypes.RainStrength, Permissions.journey_rainstrength }, { CreativePowerTypes.TimeSpeed, Permissions.journey_timespeed }, { CreativePowerTypes.RainFreeze, Permissions.journey_rainfreeze }, { CreativePowerTypes.WindFreeze, Permissions.journey_windfreeze }, { CreativePowerTypes.IncreasePlacementRange, Permissions.journey_placementrange }, { CreativePowerTypes.WorldDifficulty, Permissions.journey_setdifficulty }, { CreativePowerTypes.BiomeSpreadFreeze, Permissions.journey_biomespreadfreeze }, { CreativePowerTypes.SetSpawnRate, Permissions.journey_setspawnrate }, }; /// /// Maps journey mode permission nodes to descriptions of what the permission allows /// public static Dictionary PermissionToDescriptionMap = new Dictionary { { Permissions.journey_timefreeze, GetString("You do not have permission to freeze the time of the server.") }, { Permissions.journey_timeset, GetString("You do not have permission to modify the time of the server.") }, { Permissions.journey_godmode, GetString("You do not have permission to toggle godmode.") }, { Permissions.journey_windstrength, GetString("You do not have permission to modify the wind strength of the server.") }, { Permissions.journey_rainstrength, GetString("You do not have permission to modify the rain strength of the server.") }, { Permissions.journey_timespeed, GetString("You do not have permission to modify the time speed of the server.") }, { Permissions.journey_rainfreeze, GetString("You do not have permission to freeze the rain strength of the server.") }, { Permissions.journey_windfreeze, GetString("You do not have permission to freeze the wind strength of the server.") }, { Permissions.journey_placementrange, GetString("You do not have permission to modify the tile placement range of your character.") }, { Permissions.journey_setdifficulty, GetString("You do not have permission to modify the world difficulty of the server.") }, { Permissions.journey_biomespreadfreeze, GetString("You do not have permission to freeze the biome spread of the server.") }, { Permissions.journey_setspawnrate, GetString("You do not have permission to modify the NPC spawn rate of the server.") }, }; } }