From b9dedd77dcb03a0e47ae0beeb12a7f19568beaad Mon Sep 17 00:00:00 2001 From: AxeelAnder <1491773534@qq.com> Date: Sat, 20 Oct 2018 17:44:34 +0800 Subject: [PATCH] add some anti-cheat code --- TShockAPI/Bouncer.cs | 60 +++++++++++++++++++++++++++++++++++- TShockAPI/GetDataHandlers.cs | 2 +- TShockAPI/TShock.cs | 32 +++++++++++++++++++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs index b71c7de8..79dce7d1 100644 --- a/TShockAPI/Bouncer.cs +++ b/TShockAPI/Bouncer.cs @@ -480,10 +480,68 @@ namespace TShockAPI if (args.Player.IsBeingDisabled()) { - args.Player.SendData(PacketTypes.NpcAddBuff, "", id); args.Handled = true; return; } + + if (!args.Player.HasPermission(Permissions.ignorenpcaddbuffdetection)) + { + bool cheat = false; + + if(TShock.NPCAddBuffTimeMax.ContainsKey(type)) + { + if(time > TShock.NPCAddBuffTimeMax[type]) + { + cheat = true; + } + + if(npc.townNPC && npc.netID != NPCID.Guide && npc.netID != NPCID.Clothier) + { + if(type != BuffID.Lovestruck && type != BuffID.Stinky && type != BuffID.DryadsWard && + type != BuffID.Wet && type != BuffID.Slimed) + { + cheat = true; + } + } + // Want to check voodoo doll but it may be wrong. + //else if(npc.netID == NPCID.Guide) + //{ + // bool hasDoll = false; + // foreach (var item in args.Player.Accessories) + // { + // if (item.netID == ItemID.GuideVoodooDoll) + // { + // hasDoll = true; + // break; + // } + // } + // cheat = !hasDoll; + //} + //else if (npc.netID == NPCID.Clothier) + //{ + // bool hasDoll = false; + // foreach (var item in args.Player.Accessories) + // { + // if (item.netID == ItemID.ClothierVoodooDoll) + // { + // hasDoll = true; + // break; + // } + // } + // cheat = !hasDoll; + //} + } + else + { + cheat = true; + } + + if (cheat) + { + args.Player.Disable("Add buff to NPC abnormally.", DisableFlags.WriteToLogAndConsole); + args.Handled = true; + } + } } /// Handles Buff events. diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs index 6673dd64..a7792569 100644 --- a/TShockAPI/GetDataHandlers.cs +++ b/TShockAPI/GetDataHandlers.cs @@ -2678,7 +2678,7 @@ namespace TShockAPI if (OnNPCAddBuff(args.Player, args.Data, id, type, time)) return true; - return true; + return false; } private static bool HandlePlayerAddBuff(GetDataHandlerArgs args) diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs index f839019d..18cff28e 100644 --- a/TShockAPI/TShock.cs +++ b/TShockAPI/TShock.cs @@ -131,6 +131,9 @@ namespace TShockAPI /// public static Dictionary RESTStartupTokens = new Dictionary(); + /// The longest time of buffs players can add to NPCs. + public static Dictionary NPCAddBuffTimeMax; + /// The TShock anti-cheat/anti-exploit system. internal Bouncer Bouncer; @@ -323,6 +326,7 @@ namespace TShockAPI RestApi = new SecureRest(Netplay.ServerIP, Config.RestApiPort); RestManager = new RestManager(RestApi); RestManager.RegisterRestfulCommands(); + NPCAddBuffTimeMax = InitNPCAddBuffTimeMax(); Bouncer = new Bouncer(); RegionSystem = new RegionHandler(Regions); @@ -385,6 +389,34 @@ namespace TShockAPI } } + private Dictionary InitNPCAddBuffTimeMax() + { + var dict = new Dictionary(); + + dict.Add(BuffID.Poisoned, 3600); + dict.Add(BuffID.OnFire, 1200); + dict.Add(BuffID.CursedInferno, 420); + dict.Add(BuffID.Frostburn, 900); + dict.Add(BuffID.Ichor, 1200); + dict.Add(BuffID.Venom, 1260); + dict.Add(BuffID.Midas, 120); + dict.Add(BuffID.Wet, 1500); + dict.Add(BuffID.Slimed, 1500); + dict.Add(BuffID.Lovestruck, 1800); + dict.Add(BuffID.Stinky, 1800); + dict.Add(BuffID.SoulDrain, 30); + dict.Add(BuffID.ShadowFlame, 660); + dict.Add(BuffID.DryadsWard, 120); + dict.Add(BuffID.BoneJavelin, 900); + dict.Add(BuffID.StardustMinionBleed, 900); + dict.Add(BuffID.DryadsWardDebuff, 120); + dict.Add(BuffID.Daybreak, 300); + dict.Add(BuffID.BetsysCurse, 600); + dict.Add(BuffID.Oiled, 540); + + return dict; + } + protected void CrashReporter_HeapshotRequesting(object sender, EventArgs e) { foreach (TSPlayer player in TShock.Players)