From a2a13ce4949a6c89b628884ec0553da0dfdd4d27 Mon Sep 17 00:00:00 2001
From: tru321 <84877585+tru321@users.noreply.github.com>
Date: Wed, 1 Dec 2021 13:44:41 +0800
Subject: [PATCH] Added DataHandler for NpcTalk
This should stopping unregistered and logged out players to interact with NPC. Which prevent them smuggling or duplicating items via NPC items slot.
---
TShockAPI/GetDataHandlers.cs | 57 ++++++++++++++++++++++++++++++++++++
1 file changed, 57 insertions(+)
diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index c4366961..a668cdef 100644
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -118,6 +118,7 @@ namespace TShockAPI
{ PacketTypes.PlaceChest, HandlePlaceChest },
{ PacketTypes.Zones, HandlePlayerZone },
{ PacketTypes.PasswordSend, HandlePassword },
+ { PacketTypes.NpcTalk, HandleNpcTalk },
{ PacketTypes.PlayerAnimation, HandlePlayerAnimation },
{ PacketTypes.PlayerMana, HandlePlayerMana },
{ PacketTypes.PlayerTeam, HandlePlayerTeam },
@@ -1066,6 +1067,39 @@ namespace TShockAPI
return args.Handled;
}
+ ///
+ /// Using when player trying to talk to a NPC
+ ///
+ public class NpcTalkEventArgs : GetDataHandledEventArgs
+ {
+ ///
+ /// Player Id
+ ///
+ public byte PlayerId { get; set; }
+ ///
+ /// NPC Id player's talk to
+ ///
+ public short NPCTalkTarget { get; set; }
+ }
+ public static HandlerList NpcTalk = new HandlerList();
+ private static bool OnNpcTalk(TSPlayer player, MemoryStream data, byte _plr, short _npctarget)
+ {
+ if (NpcTalk == null)
+ {
+ return false;
+ }
+
+ var args = new NpcTalkEventArgs
+ {
+ Player = player,
+ Data = data,
+ PlayerId = _plr,
+ NPCTalkTarget = _npctarget,
+ };
+ NpcTalk.Invoke(null, args);
+ return args.Handled;
+ }
+
///
/// For use with a PlayerAnimation event
///
@@ -3104,6 +3138,29 @@ namespace TShockAPI
return true;
}
+ private static bool HandleNpcTalk(GetDataHandlerArgs args)
+ {
+ var plr = args.Data.ReadInt8();
+ var npc = args.Data.ReadInt16();
+
+ if (OnNpcTalk(args.Player, args.Data, plr, npc))
+ return true;
+ //Rejecting player who trying to talk to a npc if player were disabled, mainly for unregistered and logged out players. Preventing smuggling or duplicating their items if player put it in a npc's item slot
+ if (args.Player.IsBeingDisabled())
+ {
+ TShock.Log.ConsoleDebug("GetDataHandlers / HandleNpcTalk rejected npc talk {0}", args.Player.Name);
+ args.Player.SendData(PacketTypes.NpcTalk, "", plr, -1);
+ return true;
+ }
+
+ if (args.Player.IsBouncerThrottled())
+ {
+ TShock.Log.ConsoleDebug("Bouncer / HandleNpcTalk rejected from bouncer throttle from {0}", args.Player.Name);
+ return true;
+ }
+ return false;
+ }
+
private static bool HandlePlayerAnimation(GetDataHandlerArgs args)
{
if (OnPlayerAnimation(args.Player, args.Data))