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)