diff --git a/CHANGELOG.md b/CHANGELOG.md index f8e2f20e..d4268cad 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -104,6 +104,8 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin * Multiple fields got slightly renamed. * Modifying ToggleExpert command. Main.expertMode is no longer settable. Using a Main.GameMode int property comparsion. * GameCulture no longer has static fields to get local language. Using methods to return/compare language. + * Added permission "tshock.npc.spawnpets" which restricts pet spawns. This can cause high network load, so it's restricted. (@hakusaro) + * Updated OnTeleport to support new args per protocol changes. (@hakusaro) ## TShock 4.3.26 * Removed the stat tracking system. (@hakusaro) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 57851fb7..94e1e76e 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1431,8 +1431,8 @@ namespace TShockAPI /// Flag is a bit field /// if the first bit is set -> 0 = player, 1 = NPC /// if the second bit is set, ignore this packet - /// if the third bit is set, style +1 - /// if the fourth bit is set, style +1 + /// if the third bit is set, "get extra info from target" is true + /// if the fourth bit is set, extra information is valid to read /// public byte Flag { get; set; } /// @@ -1443,12 +1443,20 @@ namespace TShockAPI /// Y Location /// public float Y { get; set; } + /// + /// Style + /// + public byte Style { get; set; } + /// + /// "Extra info" + /// + public int ExtraInfo { get; set; } } /// /// NPCStrike - Called when an NPC is attacked /// public static HandlerList Teleport = new HandlerList(); - private static bool OnTeleport(TSPlayer player, MemoryStream data, Int16 id, byte f, float x, float y) + private static bool OnTeleport(TSPlayer player, MemoryStream data, Int16 id, byte f, float x, float y, byte style, int extraInfo) { if (Teleport == null) return false; @@ -1460,7 +1468,9 @@ namespace TShockAPI ID = id, Flag = f, X = x, - Y = y + Y = y, + Style = style, + ExtraInfo = extraInfo }; Teleport.Invoke(null, args); return args.Handled; @@ -2821,6 +2831,9 @@ namespace TShockAPI return false; } + private static readonly int[] invasions = { -1, -2, -3, -4, -5, -6, -7, -8, -10, -11 }; + private static readonly int[] pets = { -12, -13, -14 }; + private static readonly int[] bosses = { 4, 13, 50, 125, 126, 134, 127, 128, 131, 129, 130, 222, 245, 266, 370, 657 }; private static bool HandleSpawnBoss(GetDataHandlerArgs args) { if (args.Player.IsBouncerThrottled()) @@ -2828,104 +2841,67 @@ namespace TShockAPI return true; } - var spawnboss = false; - var invasion = false; var plr = args.Data.ReadInt16(); - var Type = args.Data.ReadInt16(); + var thingType = args.Data.ReadInt16(); NPC npc = new NPC(); - npc.SetDefaults(Type); - spawnboss = npc.boss; - if (!spawnboss) - { - switch (Type) - { - case -1: - case -2: - case -3: - case -4: - case -5: - case -6: - case -7: - case -8: - invasion = true; - break; - case 4: - case 13: - case 50: - case 75: - case 125: - case 126: - case 127: - case 128: - case 129: - case 130: - case 131: - case 134: - case 222: - case 245: - case 266: - case 370: - case 398: - case 422: - case 439: - case 493: - case 507: - case 517: - spawnboss = true; - break; - } - } - if (spawnboss && !args.Player.HasPermission(Permissions.summonboss)) + npc.SetDefaults(thingType); + + if (bosses.Contains(thingType) && !args.Player.HasPermission(Permissions.summonboss)) { args.Player.SendErrorMessage("You don't have permission to summon a boss."); return true; } - if (invasion && !args.Player.HasPermission(Permissions.startinvasion)) + + if (invasions.Contains(thingType) && !args.Player.HasPermission(Permissions.startinvasion)) { args.Player.SendErrorMessage("You don't have permission to start an invasion."); return true; } - if (!spawnboss && !invasion) + + if (pets.Contains(thingType) && !args.Player.HasPermission(Permissions.spawnpets)) + { + args.Player.SendErrorMessage("You don't have permission to spawn pets."); return true; + } if (plr != args.Player.Index) return true; - string boss; - switch (Type) + string thing; + switch (thingType) { case -8: - boss = "a Moon Lord"; + thing = "a Moon Lord"; break; case -7: - boss = "a Martian invasion"; + thing = "a Martian invasion"; break; case -6: - boss = "an eclipse"; + thing = "an eclipse"; break; case -5: - boss = "a frost moon"; + thing = "a frost moon"; break; case -4: - boss = "a pumpkin moon"; + thing = "a pumpkin moon"; break; case -3: - boss = "the Pirates"; + thing = "the Pirates"; break; case -2: - boss = "the Snow Legion"; + thing = "the Snow Legion"; break; case -1: - boss = "a Goblin Invasion"; + thing = "a Goblin Invasion"; break; default: - boss = String.Format("the {0}", npc.FullName); + thing = String.Format("the {0}", npc.FullName); break; } if (TShock.Config.AnonymousBossInvasions) - TShock.Utils.SendLogs(string.Format("{0} summoned {1}!", args.Player.Name, boss), Color.PaleVioletRed, args.Player); + TShock.Utils.SendLogs(string.Format("{0} summoned {1}!", args.Player.Name, thing), Color.PaleVioletRed, args.Player); else - TShock.Utils.Broadcast(String.Format("{0} summoned {1}!", args.Player.Name, boss), 175, 75, 255); + TShock.Utils.Broadcast(String.Format("{0} summoned {1}!", args.Player.Name, thing), 175, 75, 255); return false; } @@ -3023,13 +2999,12 @@ namespace TShockAPI short id = args.Data.ReadInt16(); var x = args.Data.ReadSingle(); var y = args.Data.ReadSingle(); - - if (OnTeleport(args.Player, args.Data, id, flag, x, y)) - return true; + byte style = args.Data.ReadInt8(); int type = 0; - byte style = 0; bool isNPC = type == 1; + int extraInfo = -1; + bool getPositionFromTarget = false; if (flag[0]) { @@ -3041,13 +3016,16 @@ namespace TShockAPI } if (flag[2]) { - style++; + getPositionFromTarget = true; } if (flag[3]) { - style += 2; + extraInfo = args.Data.ReadInt32(); } + if (OnTeleport(args.Player, args.Data, id, flag, x, y, style, extraInfo)) + return true; + //Rod of Discord teleport (usually (may be used by modded clients to teleport)) if (type == 0 && !args.Player.HasPermission(Permissions.rod)) { diff --git a/TShockAPI/Permissions.cs b/TShockAPI/Permissions.cs index efd5062d..0aebd037 100644 --- a/TShockAPI/Permissions.cs +++ b/TShockAPI/Permissions.cs @@ -189,7 +189,7 @@ namespace TShockAPI [Description("User can edit the spawnrate.")] public static readonly string spawnrate = "tshock.npc.spawnrate"; - [Description("User can start an invasion.")] + [Description("User can start an invasion. Warning: high network use. Easy to abuse.")] public static readonly string invade = "tshock.npc.invade"; [Description("User can hurt town NPCs.")] @@ -198,6 +198,9 @@ namespace TShockAPI [Description("User can spawn bosses.")] public static readonly string spawnboss = "tshock.npc.spawnboss"; + [Description("User can spawn pets. Warning: high network use. Easy to abuse.")] + public static readonly string spawnpets = "tshock.npc.spawnpets"; + [Description("User can rename NPCs.")] public static readonly string renamenpc = "tshock.npc.rename";