diff --git a/CHANGELOG.md b/CHANGELOG.md
index 907240f0..abd236ca 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -75,6 +75,7 @@ Putting this stuff down here so things don't conflict as often.
* Fixed chest item changes not triggering any range checks, tile checks, or correct chest checks. (@hakusaro)
* Added `TSPlayer` to `GetDataHandlers.PlayerBuff`. (@hakusaro)
* Added `TSPlayer` and `PlayerDeathReason` to `GetDataHandlers.PlayerDamage`. (@hakusaro)
+* Added `TSPlayer` to `GetDataHandlers.NPCStrike`. (@hakusaro)
## TShock 4.3.25
* Fixed a critical exploit in the Terraria protocol that could cause massive unpreventable world corruption as well as a number of other problems. Thanks to @bartico6 for reporting. Fixed by the efforts of @QuiCM, @hakusaro, and tips in the right directioon from @bartico6.
diff --git a/TShockAPI/Bouncer.cs b/TShockAPI/Bouncer.cs
index dfc53968..5a759abd 100644
--- a/TShockAPI/Bouncer.cs
+++ b/TShockAPI/Bouncer.cs
@@ -41,6 +41,7 @@ namespace TShockAPI
{
// Setup hooks
+ GetDataHandlers.NPCStrike.Register(OnNPCStrike);
GetDataHandlers.ItemDrop.Register(OnItemDrop);
GetDataHandlers.PlayerBuff.Register(OnPlayerBuff);
GetDataHandlers.ChestItemChange.Register(OnChestItemChange);
@@ -58,6 +59,63 @@ namespace TShockAPI
GetDataHandlers.TileEdit.Register(OnTileEdit);
}
+ /// Handles the NPC Strike event for Bouncer.
+ /// The object that triggered the event.
+ /// The packet arguments that the event has.
+ internal void OnNPCStrike(object sender, GetDataHandlers.NPCStrikeEventArgs args)
+ {
+ short id = args.ID;
+ byte direction = args.Direction;
+ short dmg = args.Damage;
+ float knockback = args.Knockback;
+ byte crit = args.Critical;
+
+ if (Main.npc[id] == null)
+ {
+ args.Handled = true;
+ return;
+ }
+
+ if (dmg > TShock.Config.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap))
+ {
+ if (TShock.Config.KickOnDamageThresholdBroken)
+ {
+ TShock.Utils.Kick(args.Player, string.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage));
+ args.Handled = true;
+ return;
+ }
+ else
+ {
+ args.Player.Disable(String.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage), DisableFlags.WriteToLogAndConsole);
+ }
+ args.Player.SendData(PacketTypes.NpcUpdate, "", id);
+ args.Handled = true;
+ return;
+ }
+
+ if (TShock.CheckIgnores(args.Player))
+ {
+ args.Player.SendData(PacketTypes.NpcUpdate, "", id);
+ args.Handled = true;
+ return;
+ }
+
+ if (TShock.Config.RangeChecks &&
+ TShock.CheckRangePermission(args.Player, (int)(Main.npc[id].position.X / 16f), (int)(Main.npc[id].position.Y / 16f), 128))
+ {
+ args.Player.SendData(PacketTypes.NpcUpdate, "", id);
+ args.Handled = true;
+ return;
+ }
+
+ if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000)
+ {
+ args.Player.SendData(PacketTypes.NpcUpdate, "", id);
+ args.Handled = true;
+ return;
+ }
+ }
+
/// Called when a player is damaged.
/// The object that triggered the event.
/// The packet arguments that the event has.
diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index 27bd2dd8..e6555cc3 100644
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -1214,6 +1214,8 @@ namespace TShockAPI
///
public class NPCStrikeEventArgs : HandledEventArgs
{
+ /// The TSPlayer that triggered the event.
+ public TSPlayer Player { get; set; }
///
/// ???
///
@@ -1240,13 +1242,14 @@ namespace TShockAPI
///
public static HandlerList NPCStrike;
- private static bool OnNPCStrike(short id, byte dir, short dmg, float knockback, byte crit)
+ private static bool OnNPCStrike(TSPlayer player, short id, byte dir, short dmg, float knockback, byte crit)
{
if (NPCStrike == null)
return false;
var args = new NPCStrikeEventArgs
{
+ Player = player,
ID = id,
Direction = dir,
Damage = dmg,
@@ -2593,33 +2596,9 @@ namespace TShockAPI
var direction = (byte)(args.Data.ReadInt8() - 1);
var crit = args.Data.ReadInt8();
- if (OnNPCStrike(id, direction, dmg, knockback, crit))
+ if (OnNPCStrike(args.Player, id, direction, dmg, knockback, crit))
return true;
- if (Main.npc[id] == null)
- return true;
-
- if (dmg > TShock.Config.MaxDamage && !args.Player.HasPermission(Permissions.ignoredamagecap))
- {
- if (TShock.Config.KickOnDamageThresholdBroken)
- {
- TShock.Utils.Kick(args.Player, string.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage));
- return true;
- }
- else
- {
- args.Player.Disable(String.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage), DisableFlags.WriteToLogAndConsole);
- }
- args.Player.SendData(PacketTypes.NpcUpdate, "", id);
- return true;
- }
-
- if (TShock.CheckIgnores(args.Player))
- {
- args.Player.SendData(PacketTypes.NpcUpdate, "", id);
- return true;
- }
-
if (Main.npc[id].townNPC && !args.Player.HasPermission(Permissions.hurttownnpc))
{
args.Player.SendErrorMessage("You do not have permission to hurt this NPC.");
@@ -2627,19 +2606,6 @@ namespace TShockAPI
return true;
}
- if (TShock.Config.RangeChecks &&
- TShock.CheckRangePermission(args.Player, (int)(Main.npc[id].position.X / 16f), (int)(Main.npc[id].position.Y / 16f), 128))
- {
- args.Player.SendData(PacketTypes.NpcUpdate, "", id);
- return true;
- }
-
- if ((DateTime.UtcNow - args.Player.LastThreat).TotalMilliseconds < 5000)
- {
- args.Player.SendData(PacketTypes.NpcUpdate, "", id);
- return true;
- }
-
return false;
}