From 29fb74e578d87702c9bae2a268cdebebbb6d1d96 Mon Sep 17 00:00:00 2001 From: Chris <2648373+QuiCM@users.noreply.github.com> Date: Sat, 30 Mar 2019 16:02:50 +1030 Subject: [PATCH] Add a check for NPC Item strike packets (solves #1651) --- TShockAPI/GetDataHandlers.cs | 64 ++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index bd09f992..cfa890de 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -1246,6 +1246,7 @@ namespace TShockAPI { PacketTypes.ItemOwner, HandleItemOwner }, { PacketTypes.PlayerHp, HandlePlayerHp }, { PacketTypes.PlayerMana, HandlePlayerMana }, + { PacketTypes.NpcItemStrike, HandleNpcItemStrike }, { PacketTypes.NpcStrike, HandleNpcStrike }, { PacketTypes.NpcSpecial, HandleSpecial }, { PacketTypes.PlayerAnimation, HandlePlayerAnimation }, @@ -3553,6 +3554,69 @@ namespace TShockAPI return false; } + private static bool HandleNpcItemStrike(GetDataHandlerArgs args) + { + var npcId = args.Data.ReadInt16(); + + if (npcId < 0 || npcId > Main.npc.Length) + { + //Need a valid npc + return true; + } + + if (Main.npc[npcId] == null || Main.npc[npcId].active == false) + { + //Only allow striking valid NPCs + return true; + } + + var item = args.Player.SelectedItem ?? args.Player.ItemInHand; + if (item == null) + { + //Shouldn't be able to strike an NPC without holding an item + return true; + } + + var direction = args.TPlayer.direction; + var dmg = item.damage; + var knockback = item.knockBack; + + //Clients can spoof item damage and it won't be reflected on the server. There's no point checking item damage unless this is changed + + if (OnNPCStrike(npcId, (byte)direction, (short)item.damage, item.knockBack, 0)) + { + return true; + } + + if (TShock.CheckIgnores(args.Player)) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", npcId); + return true; + } + + if (Main.npc[npcId].townNPC && !args.Player.HasPermission(Permissions.hurttownnpc)) + { + args.Player.SendErrorMessage("You do not have permission to hurt this NPC."); + args.Player.SendData(PacketTypes.NpcUpdate, "", npcId); + return true; + } + + if (TShock.Config.RangeChecks && + TShock.CheckRangePermission(args.Player, (int)(Main.npc[npcId].position.X / 16f), (int)(Main.npc[npcId].position.Y / 16f), 128)) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", npcId); + return true; + } + + if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000) + { + args.Player.SendData(PacketTypes.NpcUpdate, "", npcId); + return true; + } + + return false; + } + private static bool HandleNpcStrike(GetDataHandlerArgs args) { var id = args.Data.ReadInt16();