diff --git a/CHANGELOG.md b/CHANGELOG.md
index 85daa04d..41263289 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -67,6 +67,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
* All `GetDataHandlers` hooks now inherit from `GetDataHandledEventArgs` which includes a `TSPlayer` and a `MemoryStream` of raw data. (@hakusaro)
* Replaced `Utils.FindPlayer` with `TSPlayer.FindByNameOrID` to more appropriately be object orientated. (@hakusaro)
* Removed `Utils.ActivePlayers()` -- use `TShock.Players.Length` instead. (@hakusaro)
+* Moved `Utils.Kick()` to `TSPlayer` since its first argument was a `TSPlayer` object. (@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 dd898b62..a3268bf0 100644
--- a/TShockAPI/Bouncer.cs
+++ b/TShockAPI/Bouncer.cs
@@ -256,7 +256,7 @@ namespace TShockAPI
{
if (TShock.Config.KickOnDamageThresholdBroken)
{
- TShock.Utils.Kick(args.Player, string.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage));
+ args.Player.Kick(string.Format("NPC damage exceeded {0}.", TShock.Config.MaxDamage));
args.Handled = true;
return;
}
@@ -313,7 +313,7 @@ namespace TShockAPI
{
if (TShock.Config.KickOnDamageThresholdBroken)
{
- TShock.Utils.Kick(args.Player, string.Format("Player damage exceeded {0}.", TShock.Config.MaxDamage));
+ args.Player.Kick(string.Format("Player damage exceeded {0}.", TShock.Config.MaxDamage));
args.Handled = true;
return;
}
@@ -958,7 +958,7 @@ namespace TShockAPI
{
if (playerDeathReason.GetDeathText(TShock.Players[id].Name).ToString().Length > 500)
{
- TShock.Utils.Kick(TShock.Players[id], "Death reason outside of normal bounds.", true);
+ TShock.Players[id].Kick("Death reason outside of normal bounds.", true);
args.Handled = true;
return;
}
diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index 32e06ad5..5f0fc008 100644
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -783,7 +783,7 @@ namespace TShockAPI
{
TShock.Log.Warn(String.Format("{0} ({1}) had {2} or more invalid login attempts and was kicked automatically.",
args.Player.IP, args.Player.Name, TShock.Config.MaximumLoginAttempts));
- TShock.Utils.Kick(args.Player, "Too many invalid login attempts.");
+ args.Player.Kick("Too many invalid login attempts.");
return;
}
@@ -1279,7 +1279,7 @@ namespace TShockAPI
string reason = args.Parameters.Count > 1
? String.Join(" ", args.Parameters.GetRange(1, args.Parameters.Count - 1))
: "Misbehaviour.";
- if (!TShock.Utils.Kick(players[0], reason, !args.Player.RealPlayer, false, args.Player.Name))
+ if (!players[0].Kick(reason, !args.Player.RealPlayer, false, args.Player.Name))
{
args.Player.SendErrorMessage("You can't kick another admin!");
}
diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs
index 26dac4e9..bb94688a 100644
--- a/TShockAPI/TSPlayer.cs
+++ b/TShockAPI/TSPlayer.cs
@@ -1579,6 +1579,38 @@ namespace TShockAPI
LogStackFrame();
}
+ ///
+ /// Disconnects this player from the server with a reason.
+ ///
+ /// The reason to display to the user and to the server on kick.
+ /// If the kick should happen regardless of immunity to kick permissions.
+ /// If no message should be broadcasted to the server.
+ /// The originator of the kick, for display purposes.
+ /// If the player's server side character should be saved on kick.
+ public bool Kick(string reason, bool force = false, bool silent = false, string adminUserName = null, bool saveSSI = false)
+ {
+ if (!ConnectionAlive)
+ return true;
+ if (force || !HasPermission(Permissions.immunetokick))
+ {
+ SilentKickInProgress = silent;
+ if (IsLoggedIn && saveSSI)
+ SaveServerCharacter();
+ Disconnect(string.Format("Kicked: {0}", reason));
+ TShock.Log.ConsoleInfo(string.Format("Kicked {0} for : '{1}'", Name, reason));
+ string verb = force ? "force " : "";
+ if (!silent)
+ {
+ if (string.IsNullOrWhiteSpace(adminUserName))
+ TShock.Utils.Broadcast(string.Format("{0} was {1}kicked for '{2}'", Name, verb, reason.ToLower()), Color.Green);
+ else
+ TShock.Utils.Broadcast(string.Format("{0} {1}kicked {2} for '{3}'", adminUserName, verb, Name, reason.ToLower()), Color.Green);
+ }
+ return true;
+ }
+ return false;
+ }
+
[Conditional("DEBUG")]
private void LogStackFrame()
{
diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs
index 6329dab9..61714a8c 100644
--- a/TShockAPI/TShock.cs
+++ b/TShockAPI/TShock.cs
@@ -1426,7 +1426,7 @@ namespace TShockAPI
if (args.Text.Length > 500)
{
- Utils.Kick(tsplr, "Crash attempt via long chat packet.", true);
+ tsplr.Kick("Crash attempt via long chat packet.", true);
args.Handled = true;
return;
}
diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs
index 8f92e8ad..54411a55 100644
--- a/TShockAPI/Utils.cs
+++ b/TShockAPI/Utils.cs
@@ -558,41 +558,7 @@ namespace TShockAPI
/// bool saveSSI (default: false)
public void ForceKick(TSPlayer player, string reason, bool silent = false, bool saveSSI = false)
{
- Kick(player, reason, true, silent, null, saveSSI);
- }
-
- ///
- /// Kicks a player from the server..
- ///
- /// TSPlayer player
- /// string reason
- /// bool force (default: false)
- /// bool silent (default: false)
- /// string adminUserName (default: null)
- /// bool saveSSI (default: false)
- public bool Kick(TSPlayer player, string reason, bool force = false, bool silent = false, string adminUserName = null, bool saveSSI = false)
- {
- if (!player.ConnectionAlive)
- return true;
- if (force || !player.HasPermission(Permissions.immunetokick))
- {
- string playerName = player.Name;
- player.SilentKickInProgress = silent;
- if (player.IsLoggedIn && saveSSI)
- player.SaveServerCharacter();
- player.Disconnect(string.Format("Kicked: {0}", reason));
- TShock.Log.ConsoleInfo(string.Format("Kicked {0} for : '{1}'", playerName, reason));
- string verb = force ? "force " : "";
- if (!silent)
- {
- if (string.IsNullOrWhiteSpace(adminUserName))
- Broadcast(string.Format("{0} was {1}kicked for '{2}'", playerName, verb, reason.ToLower()), Color.Green);
- else
- Broadcast(string.Format("{0} {1}kicked {2} for '{3}'", adminUserName, verb, playerName, reason.ToLower()), Color.Green);
- }
- return true;
- }
- return false;
+ player.Kick(reason, true, silent, null, saveSSI);
}
///