Merge remote-tracking branch 'sgk/patch-morei18n' into general-devel

This commit is contained in:
Lucas Nicodemus 2022-11-09 23:08:34 -08:00
commit a9aa988547
No known key found for this signature in database
13 changed files with 227 additions and 214 deletions

View file

@ -1266,16 +1266,16 @@ namespace TShockAPI
{ {
if (TShock.Config.Settings.KickOnProjectileThresholdBroken) if (TShock.Config.Settings.KickOnProjectileThresholdBroken)
{ {
args.Player.Kick(GetString("Projectile update threshold exceeded {0}.", TShock.Config.Settings.ProjectileThreshold)); args.Player.Kick(GetString("Projectile create threshold exceeded {0}.", TShock.Config.Settings.ProjectileThreshold));
} }
else else
{ {
args.Player.Disable(GetString("Reached projectile update threshold."), DisableFlags.WriteToLogAndConsole); args.Player.Disable(GetString("Reached projectile create threshold."), DisableFlags.WriteToLogAndConsole);
args.Player.RemoveProjectile(ident, owner); args.Player.RemoveProjectile(ident, owner);
} }
TShock.Log.ConsoleDebug(GetString("Bouncer / OnNewProjectile rejected from projectile update threshold from {0} {1}/{2}", args.Player.Name, args.Player.ProjectileThreshold, TShock.Config.Settings.ProjectileThreshold)); TShock.Log.ConsoleDebug(GetString("Bouncer / OnNewProjectile rejected from projectile create threshold from {0} {1}/{2}", args.Player.Name, args.Player.ProjectileThreshold, TShock.Config.Settings.ProjectileThreshold));
TShock.Log.ConsoleDebug(GetString("If this player wasn't hacking, please report the projectile update threshold they were disabled for to TShock so we can improve this!")); TShock.Log.ConsoleDebug(GetString("If this player wasn't hacking, please report the projectile create threshold they were disabled for to TShock so we can improve this!"));
args.Handled = true; args.Handled = true;
return; return;
} }
@ -1995,21 +1995,21 @@ namespace TShockAPI
if (npc.townNPC) if (npc.townNPC)
{ {
if (type != BuffID.Poisoned if (type != BuffID.Poisoned
&& type != BuffID.OnFire && type != BuffID.OnFire
&& type != BuffID.Confused && type != BuffID.Confused
&& type != BuffID.CursedInferno && type != BuffID.CursedInferno
&& type != BuffID.Ichor && type != BuffID.Ichor
&& type != BuffID.Venom && type != BuffID.Venom
&& type != BuffID.Midas && type != BuffID.Midas
&& type != BuffID.Wet && type != BuffID.Wet
&& type != BuffID.Lovestruck && type != BuffID.Lovestruck
&& type != BuffID.Stinky && type != BuffID.Stinky
&& type != BuffID.Slimed && type != BuffID.Slimed
&& type != BuffID.DryadsWard && type != BuffID.DryadsWard
&& type != BuffID.GelBalloonBuff && type != BuffID.GelBalloonBuff
&& type != BuffID.OnFire3 && type != BuffID.OnFire3
&& type != BuffID.Frostburn2 && type != BuffID.Frostburn2
&& type != BuffID.Shimmer) && type != BuffID.Shimmer)
{ {
detectedNPCBuffTimeCheat = true; detectedNPCBuffTimeCheat = true;
} }
@ -2587,7 +2587,7 @@ namespace TShockAPI
} }
else else
{ {
TShock.Log.ConsoleDebug("Bouncer / OnPlayerDamage rejected damage threshold2 from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxDamage); TShock.Log.ConsoleDebug(GetString("Bouncer / OnPlayerDamage rejected damage threshold2 from {0} {1}/{2}", args.Player.Name, damage, TShock.Config.Settings.MaxDamage));
args.Player.Disable(GetString("Player damage exceeded {0}.", TShock.Config.Settings.MaxDamage), DisableFlags.WriteToLogAndConsole); args.Player.Disable(GetString("Player damage exceeded {0}.", TShock.Config.Settings.MaxDamage), DisableFlags.WriteToLogAndConsole);
} }
args.Player.SendData(PacketTypes.PlayerHp, "", id); args.Player.SendData(PacketTypes.PlayerHp, "", id);

View file

@ -649,7 +649,7 @@ namespace TShockAPI
string cmdName; string cmdName;
if (index == 0) // Space after the command specifier should not be supported if (index == 0) // Space after the command specifier should not be supported
{ {
player.SendErrorMessage(GetString("Invalid command entered. Type {0}help for a list of valid commands.", Specifier)); player.SendErrorMessage(GetString("You entered a space after {0} instead of a command. Type {0}help for a list of valid commands.", Specifier));
return true; return true;
} }
else if (index < 0) else if (index < 0)
@ -6455,7 +6455,10 @@ namespace TShockAPI
if (time < 0 || time > timeLimit) if (time < 0 || time > timeLimit)
time = timeLimit; time = timeLimit;
target.SetBuff(id, time * 60); target.SetBuff(id, time * 60);
user.SendSuccessMessage(GetString($"You have buffed {(target == user ? GetString("yourself") : target.Name)} with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!")); if (target == user)
user.SendSuccessMessage(GetString($"You buffed yourself with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds."));
else
target.SendSuccessMessage(GetString($"You have buffed {user.Name} with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!"));
if (!args.Silent && target != user) if (!args.Silent && target != user)
target.SendSuccessMessage(GetString($"{user.Name} has buffed you with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!")); target.SendSuccessMessage(GetString($"{user.Name} has buffed you with {TShock.Utils.GetBuffName(id)} ({TShock.Utils.GetBuffDescription(id)}) for {time} seconds!"));
} }

View file

@ -16,7 +16,7 @@ You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>. along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel; using System.ComponentModel;
using System.IO; using System.IO;
@ -117,10 +117,10 @@ namespace TShockAPI.Configuration
var def = field.GetValue(defaults); var def = field.GetValue(defaults);
sb.AppendLine("## {0} ".SFormat(name)); sb.AppendLine($"## {name} ");
sb.AppendLine("{0}".SFormat(desc)); sb.AppendLine($"{desc}");
sb.AppendLine("* **Field type**: `{0}`".SFormat(type)); sb.AppendLine(GetString("* **Field type**: `{0}`", type));
sb.AppendLine("* **Default**: `{0}`".SFormat(def)); sb.AppendLine(GetString("* **Default**: `{0}`", def));
sb.AppendLine(); sb.AppendLine();
} }

View file

@ -314,7 +314,7 @@ namespace TShockAPI.Configuration
/// <summary>The reason given if banning a mediumcore player on death.</summary> /// <summary>The reason given if banning a mediumcore player on death.</summary>
[Description("The reason given if banning a mediumcore player on death.")] [Description("The reason given if banning a mediumcore player on death.")]
public string MediumcoreBanReason = "Death results in a ban"; public string MediumcoreBanReason = GetString("Death results in a ban");
/// <summary>Disbales IP bans by default, if no arguments are passed to the ban command.</summary> /// <summary>Disbales IP bans by default, if no arguments are passed to the ban command.</summary>
[Description("Disbales IP bans by default, if no arguments are passed to the ban command.")] [Description("Disbales IP bans by default, if no arguments are passed to the ban command.")]
@ -326,15 +326,15 @@ namespace TShockAPI.Configuration
/// <summary>The reason given when kicking players for not being on the whitelist.</summary> /// <summary>The reason given when kicking players for not being on the whitelist.</summary>
[Description("The reason given when kicking players for not being on the whitelist.")] [Description("The reason given when kicking players for not being on the whitelist.")]
public string WhitelistKickReason = "You are not on the whitelist."; public string WhitelistKickReason = GetString("You are not on the whitelist.");
/// <summary>The reason given when kicking players that attempt to join while the server is full.</summary> /// <summary>The reason given when kicking players that attempt to join while the server is full.</summary>
[Description("The reason given when kicking players that attempt to join while the server is full.")] [Description("The reason given when kicking players that attempt to join while the server is full.")]
public string ServerFullReason = "Server is full"; public string ServerFullReason = GetString("Server is full");
/// <summary>The reason given when kicking players that attempt to join while the server is full with no reserved slots available.</summary> /// <summary>The reason given when kicking players that attempt to join while the server is full with no reserved slots available.</summary>
[Description("The reason given when kicking players that attempt to join while the server is full with no reserved slots available.")] [Description("The reason given when kicking players that attempt to join while the server is full with no reserved slots available.")]
public string ServerFullNoReservedReason = "Server is full. No reserved slots open."; public string ServerFullNoReservedReason = GetString("Server is full. No reserved slots open.");
/// <summary>Whether or not to kick hardcore players on death.</summary> /// <summary>Whether or not to kick hardcore players on death.</summary>
[Description("Whether or not to kick hardcore players on death.")] [Description("Whether or not to kick hardcore players on death.")]
@ -342,7 +342,7 @@ namespace TShockAPI.Configuration
/// <summary>The reason given when kicking hardcore players on death.</summary> /// <summary>The reason given when kicking hardcore players on death.</summary>
[Description("The reason given when kicking hardcore players on death.")] [Description("The reason given when kicking hardcore players on death.")]
public string HardcoreKickReason = "Death results in a kick"; public string HardcoreKickReason = GetString("Death results in a kick");
/// <summary>Whether or not to ban hardcore players on death.</summary> /// <summary>Whether or not to ban hardcore players on death.</summary>
[Description("Whether or not to ban hardcore players on death.")] [Description("Whether or not to ban hardcore players on death.")]
@ -350,7 +350,7 @@ namespace TShockAPI.Configuration
/// <summary>The reason given when banning hardcore players on death.</summary> /// <summary>The reason given when banning hardcore players on death.</summary>
[Description("The reason given when banning hardcore players on death.")] [Description("The reason given when banning hardcore players on death.")]
public string HardcoreBanReason = "Death results in a ban"; public string HardcoreBanReason = GetString("Death results in a ban");
/// <summary>If GeoIP is enabled, this will kick users identified as being under a proxy.</summary> /// <summary>If GeoIP is enabled, this will kick users identified as being under a proxy.</summary>
[Description("If GeoIP is enabled, this will kick users identified as being under a proxy.")] [Description("If GeoIP is enabled, this will kick users identified as being under a proxy.")]
@ -489,7 +489,7 @@ namespace TShockAPI.Configuration
/// <summary>The superadmin chat prefix.</summary> /// <summary>The superadmin chat prefix.</summary>
[Description("The superadmin chat prefix.")] [Description("The superadmin chat prefix.")]
public string SuperAdminChatPrefix = "(Super Admin) "; public string SuperAdminChatPrefix = GetString("(Super Admin) ");
/// <summary>The superadmin chat suffix.</summary> /// <summary>The superadmin chat suffix.</summary>
[Description("The superadmin chat suffix.")] [Description("The superadmin chat suffix.")]
@ -635,10 +635,10 @@ namespace TShockAPI.Configuration
var def = field.GetValue(defaults); var def = field.GetValue(defaults);
sb.AppendLine("## {0} ".SFormat(name)); sb.AppendLine($"## {name} ");
sb.AppendLine("{0}".SFormat(desc)); sb.AppendLine($"{desc}");
sb.AppendLine("* **Field type**: `{0}`".SFormat(type)); sb.AppendLine(GetString("* **Field type**: `{0}`", type));
sb.AppendLine("* **Default**: `{0}`".SFormat(def)); sb.AppendLine(GetString("* **Default**: `{0}`", def));
sb.AppendLine(); sb.AppendLine();
} }

View file

@ -2447,22 +2447,22 @@ namespace TShockAPI
if (OnPlayerInfo(args.Player, args.Data, playerid, hair, skinVariant, difficulty, name)) if (OnPlayerInfo(args.Player, args.Data, playerid, hair, skinVariant, difficulty, name))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected plugin phase {0}", name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerInfo rejected plugin phase {0}", name));
args.Player.Kick("A plugin on this server stopped your login.", true, true); args.Player.Kick(GetString("A plugin on this server stopped your login."), true, true);
return true; return true;
} }
if (name.Trim().Length == 0) if (name.Trim().Length == 0)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected name length 0"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerInfo rejected name length 0"));
args.Player.Kick("You have been Bounced.", true, true); args.Player.Kick(GetString("You have been Bounced."), true, true);
return true; return true;
} }
if (name.Trim().StartsWith("tsi:") || name.Trim().StartsWith("tsn:")) if (name.Trim().StartsWith("tsi:") || name.Trim().StartsWith("tsn:"))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / rejecting player for name prefix starting with tsi: or tsn:."); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / rejecting player for name prefix starting with tsi: or tsn:."));
args.Player.Kick("Illegal name: prefixes tsi: and tsn: are forbidden.", true, true); args.Player.Kick(GetString("Illegal name: prefixes tsi: and tsn: are forbidden."), true, true);
return true; return true;
} }
@ -2507,20 +2507,20 @@ namespace TShockAPI
} }
if (TShock.Config.Settings.SoftcoreOnly && difficulty != 0) if (TShock.Config.Settings.SoftcoreOnly && difficulty != 0)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected softcore required"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerInfo rejected softcore required"));
args.Player.Kick("You need to join with a softcore player.", true, true); args.Player.Kick(GetString("You need to join with a softcore player."), true, true);
return true; return true;
} }
if (TShock.Config.Settings.MediumcoreOnly && difficulty < 1) if (TShock.Config.Settings.MediumcoreOnly && difficulty < 1)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected mediumcore required"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerInfo rejected mediumcore required"));
args.Player.Kick("You need to join with a mediumcore player or higher.", true, true); args.Player.Kick(GetString("You need to join with a mediumcore player or higher."), true, true);
return true; return true;
} }
if (TShock.Config.Settings.HardcoreOnly && difficulty < 2) if (TShock.Config.Settings.HardcoreOnly && difficulty < 2)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerInfo rejected hardcore required"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerInfo rejected hardcore required"));
args.Player.Kick("You need to join with a hardcore player.", true, true); args.Player.Kick(GetString("You need to join with a hardcore player."), true, true);
return true; return true;
} }
args.Player.Difficulty = difficulty; args.Player.Difficulty = difficulty;
@ -2551,7 +2551,7 @@ namespace TShockAPI
return true; return true;
if (args.Player.IgnoreSSCPackets) if (args.Player.IgnoreSSCPackets)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerSlot rejected ignore ssc packets"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerSlot rejected ignore ssc packets"));
args.Player.SendData(PacketTypes.PlayerSlot, "", args.Player.Index, slot, prefix); args.Player.SendData(PacketTypes.PlayerSlot, "", args.Player.Index, slot, prefix);
return true; return true;
} }
@ -2617,8 +2617,8 @@ namespace TShockAPI
if (args.Player.PlayerData.exists && TShock.ServerSideCharacterConfig.Settings.WarnPlayersAboutBypassPermission) if (args.Player.PlayerData.exists && TShock.ServerSideCharacterConfig.Settings.WarnPlayersAboutBypassPermission)
{ {
args.Player.SendWarningMessage(GetString("Bypass SSC is enabled for your account. SSC data will not be loaded or saved.")); args.Player.SendWarningMessage(GetString("Bypass SSC is enabled for your account. SSC data will not be loaded or saved."));
TShock.Log.ConsoleInfo(args.Player.Name + " has SSC data in the database, but has the tshock.ignore.ssc permission. This means their SSC data is being ignored."); TShock.Log.ConsoleInfo(GetString($"{args.Player.Name} has SSC data in the database, but has the tshock.ignore.ssc permission. This means their SSC data is being ignored."));
TShock.Log.ConsoleInfo("You may wish to consider removing the tshock.ignore.ssc permission or negating it for this player."); TShock.Log.ConsoleInfo(GetString("You may wish to consider removing the tshock.ignore.ssc permission or negating it for this player."));
} }
args.Player.PlayerData.CopyCharacter(args.Player); args.Player.PlayerData.CopyCharacter(args.Player);
TShock.CharacterDB.InsertPlayerData(args.Player); TShock.CharacterDB.InsertPlayerData(args.Player);
@ -2634,7 +2634,7 @@ namespace TShockAPI
args.Player.IsDisabledForBannedWearable = false; args.Player.IsDisabledForBannedWearable = false;
args.Player.SendSuccessMessage(GetString($"Authenticated as {account.Name} successfully.")); args.Player.SendSuccessMessage(GetString($"Authenticated as {account.Name} successfully."));
TShock.Log.ConsoleInfo($"{args.Player.Name} authenticated successfully as user {args.Player.Name}."); TShock.Log.ConsoleInfo(GetString($"{args.Player.Name} authenticated successfully as user {args.Player.Name}."));
Hooks.PlayerHooks.OnPlayerPostLogin(args.Player); Hooks.PlayerHooks.OnPlayerPostLogin(args.Player);
return true; return true;
} }
@ -2666,7 +2666,7 @@ namespace TShockAPI
if (TShock.Utils.GetActivePlayerCount() + 1 > TShock.Config.Settings.MaxSlots && if (TShock.Utils.GetActivePlayerCount() + 1 > TShock.Config.Settings.MaxSlots &&
!args.Player.HasPermission(Permissions.reservedslot)) !args.Player.HasPermission(Permissions.reservedslot))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleGetSection rejected reserve slot"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleGetSection rejected reserve slot"));
args.Player.Kick(TShock.Config.Settings.ServerFullReason, true, true); args.Player.Kick(TShock.Config.Settings.ServerFullReason, true, true);
return true; return true;
} }
@ -2679,7 +2679,7 @@ namespace TShockAPI
{ {
if (args.Player.Dead && args.Player.RespawnTimer > 0) if (args.Player.Dead && args.Player.RespawnTimer > 0)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawn rejected dead player spawn request {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawn rejected dead player spawn request {0}", args.Player.Name));
return true; return true;
} }
@ -2697,7 +2697,7 @@ namespace TShockAPI
args.Player.sX = Main.spawnTileX; args.Player.sX = Main.spawnTileX;
args.Player.sY = Main.spawnTileY; args.Player.sY = Main.spawnTileY;
args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48); args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48);
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawn force teleport 'vanilla spawn' {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawn force teleport 'vanilla spawn' {0}", args.Player.Name));
} }
else if ((Main.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0) && (args.TPlayer.SpawnX > 0) && ((args.TPlayer.SpawnX != args.Player.sX) && (args.TPlayer.SpawnY != args.Player.sY))) else if ((Main.ServerSideCharacter) && (args.Player.sX > 0) && (args.Player.sY > 0) && (args.TPlayer.SpawnX > 0) && ((args.TPlayer.SpawnX != args.Player.sX) && (args.TPlayer.SpawnY != args.Player.sY)))
@ -2708,7 +2708,7 @@ namespace TShockAPI
if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == TileID.Beds)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY - 1))) if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == TileID.Beds)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY - 1)))
{ {
args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48); args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48);
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawn force teleport phase 1 {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawn force teleport phase 1 {0}", args.Player.Name));
} }
} }
@ -2717,7 +2717,7 @@ namespace TShockAPI
if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == TileID.Beds)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY - 1))) if (((Main.tile[args.Player.sX, args.Player.sY - 1].active() && Main.tile[args.Player.sX, args.Player.sY - 1].type == TileID.Beds)) && (WorldGen.StartRoomCheck(args.Player.sX, args.Player.sY - 1)))
{ {
args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48); args.Player.Teleport(args.Player.sX * 16, (args.Player.sY * 16) - 48);
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawn force teleport phase 2 {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawn force teleport phase 2 {0}", args.Player.Name));
} }
} }
@ -2732,7 +2732,7 @@ namespace TShockAPI
{ {
if (args.Player == null || args.TPlayer == null || args.Data == null) if (args.Player == null || args.TPlayer == null || args.Data == null)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / OnPlayerUpdate rejected from null player."); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / OnPlayerUpdate rejected from null player."));
return true; return true;
} }
@ -2754,7 +2754,7 @@ namespace TShockAPI
{ {
originalPosition = new Vector2?(args.Data.ReadVector2()); originalPosition = new Vector2?(args.Data.ReadVector2());
homePosition = new Vector2?(args.Data.ReadVector2()); homePosition = new Vector2?(args.Data.ReadVector2());
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerUpdate home position delta {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerUpdate home position delta {0}", args.Player.Name));
} }
if (OnPlayerUpdate(args.Player, args.Data, playerID, controls, miscData1, miscData2, miscData3, selectedItem, position, velocity, originalPosition, homePosition)) if (OnPlayerUpdate(args.Player, args.Data, playerID, controls, miscData1, miscData2, miscData3, selectedItem, position, velocity, originalPosition, homePosition))
@ -2774,7 +2774,7 @@ namespace TShockAPI
if (max > TShock.Config.Settings.MaxHP && !args.Player.HasPermission(Permissions.ignorehp)) if (max > TShock.Config.Settings.MaxHP && !args.Player.HasPermission(Permissions.ignorehp))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerHp rejected over max hp {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerHp rejected over max hp {0}", args.Player.Name));
args.Player.Disable("Maximum HP beyond limit", DisableFlags.WriteToLogAndConsole); args.Player.Disable("Maximum HP beyond limit", DisableFlags.WriteToLogAndConsole);
return true; return true;
} }
@ -2826,13 +2826,13 @@ namespace TShockAPI
if (x >= Main.maxTilesX || y >= Main.maxTilesY || x < 0 || y < 0) // Check for out of range if (x >= Main.maxTilesX || y >= Main.maxTilesY || x < 0 || y < 0) // Check for out of range
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleDoorUse rejected out of range door {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleDoorUse rejected out of range door {0}", args.Player.Name));
return true; return true;
} }
if (action < 0 || action > 5) if (action < 0 || action > 5)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleDoorUse rejected type 0 5 check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleDoorUse rejected type 0 5 check {0}", args.Player.Name));
return true; return true;
} }
@ -2841,7 +2841,7 @@ namespace TShockAPI
&& tileType != TileID.TallGateClosed && tileType != TileID.TallGateOpen && tileType != TileID.TallGateClosed && tileType != TileID.TallGateOpen
&& tileType != TileID.TrapdoorClosed && tileType != TileID.TrapdoorOpen) && tileType != TileID.TrapdoorClosed && tileType != TileID.TrapdoorOpen)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleDoorUse rejected door gap check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleDoorUse rejected door gap check {0}", args.Player.Name));
return true; return true;
} }
@ -2959,7 +2959,7 @@ namespace TShockAPI
{ {
args.Player.SendErrorMessage(GetString("You do not have permission to hurt Town NPCs.")); args.Player.SendErrorMessage(GetString("You do not have permission to hurt Town NPCs."));
args.Player.SendData(PacketTypes.NpcUpdate, "", id); args.Player.SendData(PacketTypes.NpcUpdate, "", id);
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleNpcStrike rejected npc strike {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"GetDataHandlers / HandleNpcStrike rejected npc strike {args.Player.Name}"));
return true; return true;
} }
@ -2969,7 +2969,7 @@ namespace TShockAPI
{ {
args.Player.SendErrorMessage(GetString("You do not have permission to summon the Empress of Light.")); args.Player.SendErrorMessage(GetString("You do not have permission to summon the Empress of Light."));
args.Player.SendData(PacketTypes.NpcUpdate, "", id); args.Player.SendData(PacketTypes.NpcUpdate, "", id);
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleNpcStrike rejected EoL summon from {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"GetDataHandlers / HandleNpcStrike rejected EoL summon from {args.Player.Name}"));
return true; return true;
} }
else if (!TShock.Config.Settings.AnonymousBossInvasions) else if (!TShock.Config.Settings.AnonymousBossInvasions)
@ -2986,7 +2986,7 @@ namespace TShockAPI
{ {
args.Player.SendErrorMessage(GetString("You do not have permission to summon the Lunatic Cultist!")); args.Player.SendErrorMessage(GetString("You do not have permission to summon the Lunatic Cultist!"));
args.Player.SendData(PacketTypes.NpcUpdate, "", id); args.Player.SendData(PacketTypes.NpcUpdate, "", id);
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleNpcStrike rejected Cultist summon from {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"GetDataHandlers / HandleNpcStrike rejected Cultist summon from {args.Player.Name}"));
return true; return true;
} }
} }
@ -3011,7 +3011,7 @@ namespace TShockAPI
if (type == ProjectileID.Tombstone) if (type == ProjectileID.Tombstone)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleProjectileKill rejected tombstone {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleProjectileKill rejected tombstone {0}", args.Player.Name));
args.Player.RemoveProjectile(ident, owner); args.Player.RemoveProjectile(ident, owner);
return true; return true;
} }
@ -3022,11 +3022,11 @@ namespace TShockAPI
// https://github.com/Pryaxis/TShock/commit/a5aa9231239926f361b7246651e32144bbf28dda // https://github.com/Pryaxis/TShock/commit/a5aa9231239926f361b7246651e32144bbf28dda
if (type == ProjectileID.Bomb || type == ProjectileID.DeathLaser) if (type == ProjectileID.Bomb || type == ProjectileID.DeathLaser)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleProjectileKill permitted skeletron prime exemption {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleProjectileKill permitted skeletron prime exemption {0}", args.Player.Name));
TShock.Log.ConsoleDebug("If this was not skeletron prime related, please report to TShock what happened."); TShock.Log.ConsoleDebug(GetString("If this was not skeletron prime related, please report to TShock what happened."));
return false; return false;
} }
TShock.Log.ConsoleDebug("GetDataHandlers / HandleProjectileKill rejected banned projectile {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleProjectileKill rejected banned projectile {0}", args.Player.Name));
args.Player.RemoveProjectile(ident, owner); args.Player.RemoveProjectile(ident, owner);
return true; return true;
} }
@ -3049,14 +3049,14 @@ namespace TShockAPI
if (id != args.Player.Index) if (id != args.Player.Index)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTogglePvp rejected index mismatch {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTogglePvp rejected index mismatch {0}", args.Player.Name));
return true; return true;
} }
string pvpMode = TShock.Config.Settings.PvPMode.ToLowerInvariant(); string pvpMode = TShock.Config.Settings.PvPMode.ToLowerInvariant();
if (pvpMode == "disabled" || pvpMode == "always" || (DateTime.UtcNow - args.Player.LastPvPTeamChange).TotalSeconds < 5) if (pvpMode == "disabled" || pvpMode == "always" || (DateTime.UtcNow - args.Player.LastPvPTeamChange).TotalSeconds < 5)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTogglePvp rejected fastswitch {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTogglePvp rejected fastswitch {0}", args.Player.Name));
args.Player.SendData(PacketTypes.TogglePvp, "", id); args.Player.SendData(PacketTypes.TogglePvp, "", id);
return true; return true;
} }
@ -3091,7 +3091,7 @@ namespace TShockAPI
item.netDefaults(type); item.netDefaults(type);
if (stacks > item.maxStack) if (stacks > item.maxStack)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleChestItem rejected max stacks {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleChestItem rejected max stacks {0}", args.Player.Name));
return true; return true;
} }
@ -3116,7 +3116,7 @@ namespace TShockAPI
if (!args.Player.HasBuildPermission(x, y) && TShock.Config.Settings.RegionProtectChests) if (!args.Player.HasBuildPermission(x, y) && TShock.Config.Settings.RegionProtectChests)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleChestActive rejected build permission and region check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleChestActive rejected build permission and region check {0}", args.Player.Name));
args.Player.SendData(PacketTypes.ChestOpen, "", -1); args.Player.SendData(PacketTypes.ChestOpen, "", -1);
return true; return true;
} }
@ -3141,7 +3141,7 @@ namespace TShockAPI
{ {
if (args.Player == null || args.TPlayer == null || args.Data == null) if (args.Player == null || args.TPlayer == null || args.Data == null)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerZone rejected null check"); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerZone rejected null check"));
return true; return true;
} }
@ -3209,7 +3209,7 @@ namespace TShockAPI
args.Player.SendMessage(GetString($"Authenticated as {args.Player.Name} successfully."), Color.LimeGreen); args.Player.SendMessage(GetString($"Authenticated as {args.Player.Name} successfully."), Color.LimeGreen);
TShock.Log.ConsoleInfo($"{args.Player.Name} authenticated successfully as user {args.Player.Name}."); TShock.Log.ConsoleInfo(GetString($"{args.Player.Name} authenticated successfully as user {args.Player.Name}."));
TShock.UserAccounts.SetUserAccountUUID(account, args.Player.UUID); TShock.UserAccounts.SetUserAccountUUID(account, args.Player.UUID);
Hooks.PlayerHooks.OnPlayerPostLogin(args.Player); Hooks.PlayerHooks.OnPlayerPostLogin(args.Player);
return true; return true;
@ -3228,11 +3228,11 @@ namespace TShockAPI
NetMessage.SendData((int)PacketTypes.WorldInfo, args.Player.Index); NetMessage.SendData((int)PacketTypes.WorldInfo, args.Player.Index);
return true; return true;
} }
args.Player.Kick("Invalid server password.", true, true); args.Player.Kick(GetString("Invalid server password."), true, true);
return true; return true;
} }
args.Player.Kick("You have been Bounced.", true, true); args.Player.Kick(GetParticularString("Likely non-vanilla client send zero-length password", "You have been Bounced for invalid password."), true, true);
return true; return true;
} }
@ -3247,21 +3247,21 @@ namespace TShockAPI
//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 //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()) if (args.Player.IsBeingDisabled())
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleNpcTalk rejected npc talk {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleNpcTalk rejected npc talk {0}", args.Player.Name));
args.Player.SendData(PacketTypes.NpcTalk, "", plr, -1); args.Player.SendData(PacketTypes.NpcTalk, "", plr, -1);
return true; return true;
} }
if (args.Player.IsBouncerThrottled()) if (args.Player.IsBouncerThrottled())
{ {
TShock.Log.ConsoleDebug("Bouncer / HandleNpcTalk rejected from bouncer throttle from {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("Bouncer / HandleNpcTalk rejected from bouncer throttle from {0}", args.Player.Name));
return true; return true;
} }
// -1 is a magic value, represents not talking to an NPC // -1 is a magic value, represents not talking to an NPC
if (npc < -1 || npc >= Main.maxNPCs) if (npc < -1 || npc >= Main.maxNPCs)
{ {
TShock.Log.ConsoleDebug("Bouncer / HandleNpcTalk rejected from bouncer out of bounds from {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("Bouncer / HandleNpcTalk rejected from bouncer out of bounds from {0}", args.Player.Name));
return true; return true;
} }
return false; return false;
@ -3286,7 +3286,7 @@ namespace TShockAPI
if (max > TShock.Config.Settings.MaxMP && !args.Player.HasPermission(Permissions.ignoremp)) if (max > TShock.Config.Settings.MaxMP && !args.Player.HasPermission(Permissions.ignoremp))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerMana rejected max mana {0} {1}/{2}", args.Player.Name, max, TShock.Config.Settings.MaxMP); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerMana rejected max mana {0} {1}/{2}", args.Player.Name, max, TShock.Config.Settings.MaxMP));
args.Player.Disable("Maximum MP beyond limit", DisableFlags.WriteToLogAndConsole); args.Player.Disable("Maximum MP beyond limit", DisableFlags.WriteToLogAndConsole);
return true; return true;
} }
@ -3313,7 +3313,7 @@ namespace TShockAPI
if ((DateTime.UtcNow - args.Player.LastPvPTeamChange).TotalSeconds < 5) if ((DateTime.UtcNow - args.Player.LastPvPTeamChange).TotalSeconds < 5)
{ {
args.Player.SendData(PacketTypes.PlayerTeam, "", id); args.Player.SendData(PacketTypes.PlayerTeam, "", id);
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerTeam rejected team fastswitch {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerTeam rejected team fastswitch {0}", args.Player.Name));
return true; return true;
} }
@ -3331,7 +3331,7 @@ namespace TShockAPI
if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY) if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSignRead rejected out of bounds {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSignRead rejected out of bounds {0}", args.Player.Name));
return true; return true;
} }
@ -3351,14 +3351,14 @@ namespace TShockAPI
if (!args.Player.HasBuildPermission(x, y)) if (!args.Player.HasBuildPermission(x, y))
{ {
args.Player.SendData(PacketTypes.SignNew, "", id); args.Player.SendData(PacketTypes.SignNew, "", id);
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSign rejected sign on build permission {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSign rejected sign on build permission {0}", args.Player.Name));
return true; return true;
} }
if (!args.Player.IsInRange(x, y)) if (!args.Player.IsInRange(x, y))
{ {
args.Player.SendData(PacketTypes.SignNew, "", id); args.Player.SendData(PacketTypes.SignNew, "", id);
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSign rejected sign range check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSign rejected sign range check {0}", args.Player.Name));
return true; return true;
} }
return false; return false;
@ -3393,7 +3393,7 @@ namespace TShockAPI
if (Netplay.Clients[args.TPlayer.whoAmI].State < 2 && (buff == 156 || buff == 47 || buff == 149)) if (Netplay.Clients[args.TPlayer.whoAmI].State < 2 && (buff == 156 || buff == 47 || buff == 149))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerBuffList zeroed player buff due to below state 2 {0} {1}", args.Player.Name, buff); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerBuffList zeroed player buff due to below state 2 {0} {1}", args.Player.Name, buff));
buff = 0; buff = 0;
} }
@ -3408,7 +3408,7 @@ namespace TShockAPI
} }
} }
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerBuffList handled event and sent data {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerBuffList handled event and sent data {0}", args.Player.Name));
NetMessage.SendData((int)PacketTypes.PlayerBuff, -1, args.Player.Index, NetworkText.Empty, args.Player.Index); NetMessage.SendData((int)PacketTypes.PlayerBuff, -1, args.Player.Index, NetworkText.Empty, args.Player.Index);
return true; return true;
} }
@ -3423,7 +3423,7 @@ namespace TShockAPI
if (type == 1 && TShock.Config.Settings.DisableDungeonGuardian) if (type == 1 && TShock.Config.Settings.DisableDungeonGuardian)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpecial rejected type 1 for {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpecial rejected type 1 for {0}", args.Player.Name));
args.Player.SendMessage(GetString("The Dungeon Guardian returned you to your spawn point."), Color.Purple); args.Player.SendMessage(GetString("The Dungeon Guardian returned you to your spawn point."), Color.Purple);
args.Player.Spawn(PlayerSpawnContext.RecallFromItem); args.Player.Spawn(PlayerSpawnContext.RecallFromItem);
return true; return true;
@ -3433,13 +3433,13 @@ namespace TShockAPI
{ {
if (!args.Player.HasPermission(Permissions.usesundial)) if (!args.Player.HasPermission(Permissions.usesundial))
{ {
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleSpecial rejected enchanted sundial permission {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"GetDataHandlers / HandleSpecial rejected enchanted sundial permission {args.Player.Name}"));
args.Player.SendErrorMessage(GetString("You do not have permission to use the Enchanted Sundial.")); args.Player.SendErrorMessage(GetString("You do not have permission to use the Enchanted Sundial."));
return true; return true;
} }
else if (TShock.Config.Settings.ForceTime != "normal") else if (TShock.Config.Settings.ForceTime != "normal")
{ {
TShock.Log.ConsoleDebug($"GetDataHandlers / HandleSpecial rejected enchanted sundial permission (ForceTime) {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"GetDataHandlers / HandleSpecial rejected enchanted sundial permission (ForceTime) {args.Player.Name}"));
if (!args.Player.HasPermission(Permissions.cfgreload)) if (!args.Player.HasPermission(Permissions.cfgreload))
{ {
args.Player.SendErrorMessage(GetString("You cannot use the Enchanted Sundial because time is stopped.")); args.Player.SendErrorMessage(GetString("You cannot use the Enchanted Sundial because time is stopped."));
@ -3489,7 +3489,7 @@ namespace TShockAPI
if (!args.Player.HasPermission(Permissions.movenpc)) if (!args.Player.HasPermission(Permissions.movenpc))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / UpdateNPCHome rejected no permission {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / UpdateNPCHome rejected no permission {0}", args.Player.Name));
args.Player.SendErrorMessage(GetString("You do not have permission to relocate Town NPCs.")); args.Player.SendErrorMessage(GetString("You do not have permission to relocate Town NPCs."));
args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY, args.Player.SendData(PacketTypes.UpdateNPCHome, "", id, Main.npc[id].homeTileX, Main.npc[id].homeTileY,
Convert.ToByte(Main.npc[id].homeless)); Convert.ToByte(Main.npc[id].homeless));
@ -3504,7 +3504,7 @@ namespace TShockAPI
{ {
if (args.Player.IsBouncerThrottled()) if (args.Player.IsBouncerThrottled())
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawnBoss rejected bouner throttled {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawnBoss rejected bouner throttled {0}", args.Player.Name));
return true; return true;
} }
@ -3514,21 +3514,21 @@ namespace TShockAPI
var isKnownBoss = thingType > 0 && thingType < Main.maxNPCTypes && NPCID.Sets.MPAllowedEnemies[thingType]; var isKnownBoss = thingType > 0 && thingType < Main.maxNPCTypes && NPCID.Sets.MPAllowedEnemies[thingType];
if ((isKnownBoss || thingType == -16) && !args.Player.HasPermission(Permissions.summonboss)) if ((isKnownBoss || thingType == -16) && !args.Player.HasPermission(Permissions.summonboss))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawnBoss rejected boss {0} {1}", args.Player.Name, thingType); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawnBoss rejected boss {0} {1}", args.Player.Name, thingType));
args.Player.SendErrorMessage(GetString("You do not have permission to summon bosses.")); args.Player.SendErrorMessage(GetString("You do not have permission to summon bosses."));
return true; return true;
} }
if (invasions.Contains(thingType) && !args.Player.HasPermission(Permissions.startinvasion)) if (invasions.Contains(thingType) && !args.Player.HasPermission(Permissions.startinvasion))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawnBoss rejected invasion {0} {1}", args.Player.Name, thingType); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawnBoss rejected invasion {0} {1}", args.Player.Name, thingType));
args.Player.SendErrorMessage(GetString("You do not have permission to start invasions.")); args.Player.SendErrorMessage(GetString("You do not have permission to start invasions."));
return true; return true;
} }
if (pets.Contains(thingType) && !args.Player.HasPermission(Permissions.spawnpets)) if (pets.Contains(thingType) && !args.Player.HasPermission(Permissions.spawnpets))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSpawnBoss rejected pet {0} {1}", args.Player.Name, thingType); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSpawnBoss rejected pet {0} {1}", args.Player.Name, thingType));
args.Player.SendErrorMessage(GetString("You do not have permission to spawn pets.")); args.Player.SendErrorMessage(GetString("You do not have permission to spawn pets."));
return true; return true;
} }
@ -3619,7 +3619,7 @@ namespace TShockAPI
if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY || t > Main.numTileColors) if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY || t > Main.numTileColors)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintTile rejected range check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintTile rejected range check {0}", args.Player.Name));
return true; return true;
} }
if (OnPaintTile(args.Player, args.Data, x, y, t)) if (OnPaintTile(args.Player, args.Data, x, y, t))
@ -3637,7 +3637,7 @@ namespace TShockAPI
!args.Player.Accessories.Any(HasPaintSprayerAbilities) && !args.Player.Accessories.Any(HasPaintSprayerAbilities) &&
!args.Player.Inventory.Any(HasPaintSprayerAbilities)) !args.Player.Inventory.Any(HasPaintSprayerAbilities))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintTile rejected select consistency {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintTile rejected select consistency {0}", args.Player.Name));
args.Player.SendData(PacketTypes.PaintTile, "", x, y, Main.tile[x, y].color()); args.Player.SendData(PacketTypes.PaintTile, "", x, y, Main.tile[x, y].color());
return true; return true;
} }
@ -3646,7 +3646,7 @@ namespace TShockAPI
!args.Player.HasPaintPermission(x, y) || !args.Player.HasPaintPermission(x, y) ||
!args.Player.IsInRange(x, y)) !args.Player.IsInRange(x, y))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintTile rejected throttle/permission/range check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintTile rejected throttle/permission/range check {0}", args.Player.Name));
args.Player.SendData(PacketTypes.PaintTile, "", x, y, Main.tile[x, y].color()); args.Player.SendData(PacketTypes.PaintTile, "", x, y, Main.tile[x, y].color());
return true; return true;
} }
@ -3666,7 +3666,7 @@ namespace TShockAPI
if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY || t > Main.numTileColors) if (x < 0 || y < 0 || x >= Main.maxTilesX || y >= Main.maxTilesY || t > Main.numTileColors)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintWall rejected range check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintWall rejected range check {0}", args.Player.Name));
return true; return true;
} }
if (OnPaintWall(args.Player, args.Data, x, y, t)) if (OnPaintWall(args.Player, args.Data, x, y, t))
@ -3684,7 +3684,7 @@ namespace TShockAPI
!args.Player.Accessories.Any(HasPaintSprayerAbilities) && !args.Player.Accessories.Any(HasPaintSprayerAbilities) &&
!args.Player.Inventory.Any(HasPaintSprayerAbilities)) !args.Player.Inventory.Any(HasPaintSprayerAbilities))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintWall rejected selector consistency {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintWall rejected selector consistency {0}", args.Player.Name));
args.Player.SendData(PacketTypes.PaintWall, "", x, y, Main.tile[x, y].wallColor()); args.Player.SendData(PacketTypes.PaintWall, "", x, y, Main.tile[x, y].wallColor());
return true; return true;
} }
@ -3693,7 +3693,7 @@ namespace TShockAPI
!args.Player.HasPaintPermission(x, y) || !args.Player.HasPaintPermission(x, y) ||
!args.Player.IsInRange(x, y)) !args.Player.IsInRange(x, y))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePaintWall rejected throttle/permission/range {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePaintWall rejected throttle/permission/range {0}", args.Player.Name));
args.Player.SendData(PacketTypes.PaintWall, "", x, y, Main.tile[x, y].wallColor()); args.Player.SendData(PacketTypes.PaintWall, "", x, y, Main.tile[x, y].wallColor());
return true; return true;
} }
@ -3741,7 +3741,7 @@ namespace TShockAPI
//Rod of Discord teleport (usually (may be used by modded clients to teleport)) //Rod of Discord teleport (usually (may be used by modded clients to teleport))
if (type == 0 && !args.Player.HasPermission(Permissions.rod)) if (type == 0 && !args.Player.HasPermission(Permissions.rod))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleport rejected rod type {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleport rejected rod type {0} {1}", args.Player.Name, type));
args.Player.SendErrorMessage(GetString("You do not have permission to teleport using items.")); // Was going to write using RoD but Hook of Disonnance and Potion of Return both use the same teleport packet as RoD. args.Player.SendErrorMessage(GetString("You do not have permission to teleport using items.")); // Was going to write using RoD but Hook of Disonnance and Potion of Return both use the same teleport packet as RoD.
args.Player.Teleport(args.TPlayer.position.X, args.TPlayer.position.Y); // Suggest renaming rod permission unless someone plans to add separate perms for the other 2 tp items. args.Player.Teleport(args.TPlayer.position.X, args.TPlayer.position.Y); // Suggest renaming rod permission unless someone plans to add separate perms for the other 2 tp items.
return true; return true;
@ -3750,7 +3750,7 @@ namespace TShockAPI
//NPC teleport //NPC teleport
if (type == 1 && id >= Main.maxNPCs) if (type == 1 && id >= Main.maxNPCs)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleport rejected npc teleport {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleport rejected npc teleport {0} {1}", args.Player.Name, type));
return true; return true;
} }
@ -3759,13 +3759,13 @@ namespace TShockAPI
{ {
if (id >= Main.maxPlayers || Main.player[id] == null || TShock.Players[id] == null) if (id >= Main.maxPlayers || Main.player[id] == null || TShock.Players[id] == null)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleport rejected p2p extents {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleport rejected p2p extents {0} {1}", args.Player.Name, type));
return true; return true;
} }
if (!args.Player.HasPermission(Permissions.wormhole)) if (!args.Player.HasPermission(Permissions.wormhole))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleport rejected p2p wormhole permission {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleport rejected p2p wormhole permission {0} {1}", args.Player.Name, type));
args.Player.SendErrorMessage(GetString("You do not have permission to teleport using Wormhole Potions.")); args.Player.SendErrorMessage(GetString("You do not have permission to teleport using Wormhole Potions."));
args.Player.Teleport(args.TPlayer.position.X, args.TPlayer.position.Y); args.Player.Teleport(args.TPlayer.position.X, args.TPlayer.position.Y);
return true; return true;
@ -3793,7 +3793,7 @@ namespace TShockAPI
if (Main.npc[npcID]?.catchItem == 0) if (Main.npc[npcID]?.catchItem == 0)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleCatchNpc catch zero {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleCatchNpc catch zero {0}", args.Player.Name));
Main.npc[npcID].active = true; Main.npc[npcID].active = true;
NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcID); NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcID);
return true; return true;
@ -3801,7 +3801,7 @@ namespace TShockAPI
if (args.Player.IsBeingDisabled()) if (args.Player.IsBeingDisabled())
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleCatchNpc rejected catch npc {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleCatchNpc rejected catch npc {0}", args.Player.Name));
return true; return true;
} }
@ -3829,7 +3829,7 @@ namespace TShockAPI
void Fail(string tpItem) void Fail(string tpItem)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleportationPotion rejected permissions {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleportationPotion rejected permissions {0} {1}", args.Player.Name, type));
args.Player.SendErrorMessage(GetString("You do not have permission to teleport using {0}.", tpItem)); args.Player.SendErrorMessage(GetString("You do not have permission to teleport using {0}.", tpItem));
} }
@ -3839,7 +3839,7 @@ namespace TShockAPI
if (args.Player.ItemInHand.type != ItemID.TeleportationPotion && if (args.Player.ItemInHand.type != ItemID.TeleportationPotion &&
args.Player.SelectedItem.type != ItemID.TeleportationPotion) args.Player.SelectedItem.type != ItemID.TeleportationPotion)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type));
return true; return true;
} }
@ -3855,7 +3855,7 @@ namespace TShockAPI
args.Player.ItemInHand.type != ItemID.ShellphoneOcean && args.Player.ItemInHand.type != ItemID.ShellphoneOcean &&
args.Player.SelectedItem.type != ItemID.ShellphoneOcean) args.Player.SelectedItem.type != ItemID.ShellphoneOcean)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type));
return true; return true;
} }
@ -3878,7 +3878,7 @@ namespace TShockAPI
args.Player.ItemInHand.type != ItemID.ShellphoneHell && args.Player.ItemInHand.type != ItemID.ShellphoneHell &&
args.Player.SelectedItem.type != ItemID.ShellphoneHell) args.Player.SelectedItem.type != ItemID.ShellphoneHell)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type));
return true; return true;
} }
@ -3898,7 +3898,7 @@ namespace TShockAPI
case 3: // Shellphone (Spawn) case 3: // Shellphone (Spawn)
if (args.Player.ItemInHand.type != ItemID.ShellphoneSpawn && args.Player.SelectedItem.type != ItemID.ShellphoneSpawn) if (args.Player.ItemInHand.type != ItemID.ShellphoneSpawn && args.Player.SelectedItem.type != ItemID.ShellphoneSpawn)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleTeleportationPotion rejected not holding the correct item {0} {1}", args.Player.Name, type));
return true; return true;
} }
break; break;
@ -3917,7 +3917,7 @@ namespace TShockAPI
private static bool HandleNumberOfAnglerQuestsCompleted(GetDataHandlerArgs args) private static bool HandleNumberOfAnglerQuestsCompleted(GetDataHandlerArgs args)
{ {
// Never sent by vanilla client, ignore this // Never sent by vanilla client, ignore this
TShock.Log.ConsoleDebug("GetDataHandlers / HandleNumberOfAnglerQuestsCompleted surprise packet! Someone tell the TShock team! {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleNumberOfAnglerQuestsCompleted surprise packet! Someone tell the TShock team! {0}", args.Player.Name));
return true; return true;
} }
@ -3996,33 +3996,33 @@ namespace TShockAPI
if (position.X < 0 || position.X >= (Main.maxTilesX * 16.0f) || position.Y < 0 || position.Y >= (Main.maxTilesY * 16.0f)) if (position.X < 0 || position.X >= (Main.maxTilesX * 16.0f) || position.Y < 0 || position.Y >= (Main.maxTilesY * 16.0f))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncExtraValue rejected extents check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSyncExtraValue rejected extents check {0}", args.Player.Name));
return true; return true;
} }
if (!Main.expertMode && !Main.masterMode) if (!Main.expertMode && !Main.masterMode)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncExtraValue rejected expert/master mode check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSyncExtraValue rejected expert/master mode check {0}", args.Player.Name));
return true; return true;
} }
if (npcIndex < 0 || npcIndex >= Main.npc.Length) if (npcIndex < 0 || npcIndex >= Main.npc.Length)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncExtraValue rejected npc id out of bounds check - NPC ID: {0}", npcIndex); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSyncExtraValue rejected npc id out of bounds check - NPC ID: {0}", npcIndex));
return true; return true;
} }
var npc = Main.npc[npcIndex]; var npc = Main.npc[npcIndex];
if (npc == null) if (npc == null)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncExtraValue rejected npc is null - NPC ID: {0}", npcIndex); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSyncExtraValue rejected npc is null - NPC ID: {0}", npcIndex));
return true; return true;
} }
var distanceFromCoinPacketToNpc = Utils.Distance(position, npc.position); var distanceFromCoinPacketToNpc = Utils.Distance(position, npc.position);
if (distanceFromCoinPacketToNpc >= (5 * 16f)) //5 tile range if (distanceFromCoinPacketToNpc >= (5 * 16f)) //5 tile range
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleSyncExtraValue rejected range check {0},{1} vs {2},{3} which is {4}", npc.position.X, npc.position.Y, position.X, position.Y, distanceFromCoinPacketToNpc); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleSyncExtraValue rejected range check {0},{1} vs {2},{3} which is {4}", npc.position.X, npc.position.Y, position.X, position.Y, distanceFromCoinPacketToNpc));
return true; return true;
} }
@ -4039,7 +4039,7 @@ namespace TShockAPI
{ {
if (projectile.owner != args.TPlayer.whoAmI) if (projectile.owner != args.TPlayer.whoAmI)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleKillPortal rejected owner mismatch check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleKillPortal rejected owner mismatch check {0}", args.Player.Name));
return true; return true;
} }
} }
@ -4076,14 +4076,14 @@ namespace TShockAPI
if (projectile == null || !projectile.active) if (projectile == null || !projectile.active)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleNpcTeleportPortal rejected null check {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleNpcTeleportPortal rejected null check {0}", args.Player.Name));
NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex); NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex);
return true; return true;
} }
if (projectile.type != ProjectileID.PortalGunGate) if (projectile.type != ProjectileID.PortalGunGate)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleNpcTeleportPortal rejected not thinking with portals {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleNpcTeleportPortal rejected not thinking with portals {0}", args.Player.Name));
NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex); NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex);
return true; return true;
} }
@ -4123,7 +4123,7 @@ namespace TShockAPI
{ {
if (args.Player != null && !args.Player.HasPermission(Permissions.toggleparty)) if (args.Player != null && !args.Player.HasPermission(Permissions.toggleparty))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleToggleParty rejected no party {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleToggleParty rejected no party {0}", args.Player.Name));
args.Player.SendErrorMessage(GetString("You do not have permission to start a party.")); args.Player.SendErrorMessage(GetString("You do not have permission to start a party."));
return true; return true;
} }
@ -4135,13 +4135,13 @@ namespace TShockAPI
{ {
if (args.Player.IsBouncerThrottled()) if (args.Player.IsBouncerThrottled())
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleOldOnesArmy rejected throttled {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleOldOnesArmy rejected throttled {0}", args.Player.Name));
return true; return true;
} }
if (!args.Player.HasPermission(Permissions.startdd2)) if (!args.Player.HasPermission(Permissions.startdd2))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandleOldOnesArmy rejected permissions {0}", args.Player.Name); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandleOldOnesArmy rejected permissions {0}", args.Player.Name));
args.Player.SendErrorMessage(GetString("You do not have permission to start the Old One's Army.")); args.Player.SendErrorMessage(GetString("You do not have permission to start the Old One's Army."));
return true; return true;
} }
@ -4207,13 +4207,13 @@ namespace TShockAPI
{ {
if (!args.Player.Ban(banReason, "TShock")) if (!args.Player.Ban(banReason, "TShock"))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerKillMeV2 kicked with difficulty {0} {1}", args.Player.Name, args.TPlayer.difficulty); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerKillMeV2 kicked with difficulty {0} {1}", args.Player.Name, args.TPlayer.difficulty));
args.Player.Kick("You died! Normally, you'd be banned.", true, true); args.Player.Kick(GetString("You died! Normally, you'd be banned."), true, true);
} }
} }
else if (shouldKick) else if (shouldKick)
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerKillMeV2 kicked with difficulty {0} {1}", args.Player.Name, args.TPlayer.difficulty); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerKillMeV2 kicked with difficulty {0} {1}", args.Player.Name, args.TPlayer.difficulty));
args.Player.Kick(kickReason, true, true, null, false); args.Player.Kick(kickReason, true, true, null, false);
} }
} }
@ -4222,7 +4222,7 @@ namespace TShockAPI
{ {
if (TShock.CharacterDB.RemovePlayer(args.Player.Account.ID)) if (TShock.CharacterDB.RemovePlayer(args.Player.Account.ID))
{ {
TShock.Log.ConsoleDebug("GetDataHandlers / HandlePlayerKillMeV2 ssc delete {0} {1}", args.Player.Name, args.TPlayer.difficulty); TShock.Log.ConsoleDebug(GetString("GetDataHandlers / HandlePlayerKillMeV2 ssc delete {0} {1}", args.Player.Name, args.TPlayer.difficulty));
args.Player.SendErrorMessage(GetString("You have fallen in hardcore mode, and your items have been lost forever.")); args.Player.SendErrorMessage(GetString("You have fallen in hardcore mode, and your items have been lost forever."));
TShock.CharacterDB.SeedInitialData(args.Player.Account); TShock.CharacterDB.SeedInitialData(args.Player.Account);
} }
@ -4368,8 +4368,8 @@ namespace TShockAPI
private static bool HandleSyncCavernMonsterType(GetDataHandlerArgs args) private static bool HandleSyncCavernMonsterType(GetDataHandlerArgs args)
{ {
args.Player.Kick("Exploit attempt detected!"); args.Player.Kick(GetString("Exploit attempt detected!"));
TShock.Log.ConsoleDebug($"HandleSyncCavernMonsterType: Player is trying to modify NPC cavernMonsterType; this is a crafted packet! - From {args.Player.Name}"); TShock.Log.ConsoleDebug(GetString($"HandleSyncCavernMonsterType: Player is trying to modify NPC cavernMonsterType; this is a crafted packet! - From {args.Player.Name}"));
return true; return true;
} }

View file

@ -426,7 +426,7 @@ namespace TShockAPI.Handlers
WallID.Sets.Conversion.NewWall4[tile.wall] && WallID.Sets.Conversion.NewWall4[newTile.Wall] WallID.Sets.Conversion.NewWall4[tile.wall] && WallID.Sets.Conversion.NewWall4[newTile.Wall]
) )
{ {
TShock.Log.ConsoleDebug($"Bouncer / SendTileRect processing a wall conversion update - [{tile.wall}] -> [{newTile.Wall}]"); TShock.Log.ConsoleDebug(GetString($"Bouncer / SendTileRect processing a wall conversion update - [{tile.wall}] -> [{newTile.Wall}]"));
UpdateServerTileState(tile, newTile, TileDataType.Wall); UpdateServerTileState(tile, newTile, TileDataType.Wall);
} }
} }

View file

@ -91,7 +91,7 @@ namespace TShockAPI
if (DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(player.TPlayer.inventory[player.TPlayer.selectedItem].netID), player)) if (DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(player.TPlayer.inventory[player.TPlayer.selectedItem].netID), player))
{ {
string itemName = player.TPlayer.inventory[player.TPlayer.selectedItem].Name; string itemName = player.TPlayer.inventory[player.TPlayer.selectedItem].Name;
player.Disable($"holding banned item: {itemName}", disableFlags); player.Disable(GetString($"holding banned item: {itemName}"), disableFlags);
SendCorrectiveMessage(player, itemName); SendCorrectiveMessage(player, itemName);
} }
@ -160,7 +160,7 @@ namespace TShockAPI
if (DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(player.TPlayer.inventory[args.SelectedItem].netID), args.Player)) if (DataModel.ItemIsBanned(EnglishLanguage.GetItemNameById(player.TPlayer.inventory[args.SelectedItem].netID), args.Player))
{ {
player.TPlayer.controlUseItem = false; player.TPlayer.controlUseItem = false;
player.Disable($"holding banned item: {itemName}", disableFlags); player.Disable(GetString($"holding banned item: {itemName}"), disableFlags);
SendCorrectiveMessage(player, itemName); SendCorrectiveMessage(player, itemName);

View file

@ -527,7 +527,7 @@ namespace TShockAPI
var descattr = var descattr =
field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute; field.GetCustomAttributes(false).FirstOrDefault(o => o is DescriptionAttribute) as DescriptionAttribute;
var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : "None"; var desc = descattr != null && !string.IsNullOrWhiteSpace(descattr.Description) ? descattr.Description : GetString("No description available.");
var commands = GetCommands(name); var commands = GetCommands(name);
foreach (var c in commands) foreach (var c in commands)
@ -542,9 +542,9 @@ namespace TShockAPI
c => c =>
c.Name + (c.Names.Count > 1 ? " ({0})".SFormat(string.Join(" ", c.Names.ToArray(), 1, c.Names.Count - 1)) : "")); c.Name + (c.Names.Count > 1 ? " ({0})".SFormat(string.Join(" ", c.Names.ToArray(), 1, c.Names.Count - 1)) : ""));
sb.AppendLine("## {0}".SFormat(name)); sb.AppendLine($"## {name}");
sb.AppendLine("{0}".SFormat(desc)); sb.AppendLine($"{desc}");
sb.AppendLine("* **Commands**: `{0}`".SFormat(strs.Count() > 0 ? string.Join(", ", strs) : "None")); sb.AppendLine(GetString("* **Commands**: `{0}`", strs.Count() > 0 ? string.Join(", ", strs) : GetString("No associated commands.")));
sb.AppendLine(); sb.AppendLine();
} }

View file

@ -1217,34 +1217,40 @@ namespace TShockAPI
var permission = method.GetCustomAttributes(false).Where(o => o is Permission); var permission = method.GetCustomAttributes(false).Where(o => o is Permission);
if (permission.Count() > 0) if (permission.Count() > 0)
{ {
sb.AppendLine("* **Permissions**: `{0}`".SFormat(String.Join(", ", permission.Select(p => ((Permission)p).Name)))); sb.AppendLine(GetString("* **Permissions**: `{0}`", String.Join(", ", permission.Select(p => ((Permission)p).Name))));
} }
else else
{ {
sb.AppendLine("No special permissions are required for this route."); sb.AppendLine(GetString("No special permissions are required for this route."));
} }
sb.AppendLine(); sb.AppendLine();
var verbs = method.GetCustomAttributes(false).Where(o => o is Verb); var verbs = method.GetCustomAttributes(false).Where(o => o is Verb);
if (verbs.Count() > 0) if (verbs.Count() > 0)
{ {
sb.AppendLine("**Verbs**:"); sb.AppendLine(GetString("**Verbs**:"));
foreach (Verb verb in verbs) foreach (Verb verb in verbs)
{ {
sb.AppendLine("* `{0}` ({1}) `[{2}]` - {3}".SFormat(verb.Name, verb.Required ? "Required" : "Optional", verb.ArgumentType.Name, verb.Description)); if (verb.Required)
sb.AppendLine(GetString("* `{0}` (Required) `{1}` - {2}".SFormat(verb.Name, verb.ArgumentType.Name, verb.Description)));
else
sb.AppendLine(GetString("* `{0}` (Optional) `{1}` - {2}".SFormat(verb.Name, verb.ArgumentType.Name, verb.Description)));
} }
} }
sb.AppendLine(); sb.AppendLine();
var nouns = method.GetCustomAttributes(false).Where(o => o is Noun); var nouns = method.GetCustomAttributes(false).Where(o => o is Noun);
if (nouns.Count() > 0) if (nouns.Count() > 0)
{ {
sb.AppendLine("**Nouns**:"); sb.AppendLine(GetString("**Nouns**:"));
foreach (Noun noun in nouns) foreach (Noun noun in nouns)
{ {
sb.AppendLine("* `{0}` ({1}) `[{2}]` - {3}".SFormat(noun.Name, noun.Required ? "Required" : "Optional", noun.ArgumentType.Name, noun.Description)); if (noun.Required)
sb.AppendLine(GetString("* `{0}` (Required) `{1}` - {2}".SFormat(noun.Name, noun.ArgumentType.Name, noun.Description)));
else
sb.AppendLine(GetString("* `{0}` (Optional) `{1}` - {2}".SFormat(noun.Name, noun.ArgumentType.Name, noun.Description)));
} }
} }
sb.AppendLine(); sb.AppendLine();
sb.AppendLine("**Example Usage**: `{0}?{1}`".SFormat(routeattr.Route, sb.AppendLine(GetString("**Example Usage**: `{0}?{1}`", routeattr.Route,
string.Join("&", nouns.Select(n => String.Format("{0}={0}", ((Noun)n).Name))))); string.Join("&", nouns.Select(n => String.Format("{0}={0}", ((Noun)n).Name)))));
sb.AppendLine(); sb.AppendLine();
} }

View file

@ -1921,9 +1921,9 @@ namespace TShockAPI
if (!silent) if (!silent)
{ {
if (string.IsNullOrWhiteSpace(adminUserName)) if (string.IsNullOrWhiteSpace(adminUserName))
TShock.Utils.Broadcast(GetString("{0} was kicked for '{1}'", Name, reason.ToLower()), Color.Green); TShock.Utils.Broadcast(GetString("{0} was kicked for '{1}'", Name, reason), Color.Green);
else else
TShock.Utils.Broadcast(GetString("{0} kicked {1} for '{2}'", adminUserName, Name, reason.ToLower()), Color.Green); TShock.Utils.Broadcast(GetString("{0} kicked {1} for '{2}'", adminUserName, Name, reason), Color.Green);
} }
return true; return true;
} }

View file

@ -31,7 +31,7 @@ namespace TShockAPI
{ {
public class TSServerPlayer : TSPlayer public class TSServerPlayer : TSPlayer
{ {
public static string AccountName = "ServerConsole"; public static string AccountName = GetParticularString("The account name of server console.", "ServerConsole");
public TSServerPlayer() public TSServerPlayer()
: base("Server") : base("Server")
@ -197,17 +197,17 @@ namespace TShockAPI
private readonly Dictionary<Color, ConsoleColor> _consoleColorMap = new Dictionary<Color, ConsoleColor> private readonly Dictionary<Color, ConsoleColor> _consoleColorMap = new Dictionary<Color, ConsoleColor>
{ {
{ Color.Red, ConsoleColor.Red }, { Color.Red, ConsoleColor.Red },
{ Color.Green, ConsoleColor.Green }, { Color.Green, ConsoleColor.Green },
{ Color.Blue, ConsoleColor.Cyan }, { Color.Blue, ConsoleColor.Cyan },
{ new Color(255, 250, 170), ConsoleColor.Yellow }, { new Color(255, 250, 170), ConsoleColor.Yellow },
{ new Color(170, 170, 255), ConsoleColor.Cyan }, { new Color(170, 170, 255), ConsoleColor.Cyan },
{ new Color(255, 170, 255), ConsoleColor.Magenta }, { new Color(255, 170, 255), ConsoleColor.Magenta },
{ new Color(170, 255, 170), ConsoleColor.Green }, { new Color(170, 255, 170), ConsoleColor.Green },
{ new Color(255, 170, 170), ConsoleColor.Red }, { new Color(255, 170, 170), ConsoleColor.Red },
{ new Color(139, 0, 0), ConsoleColor.DarkRed }, // This is the console warning color { new Color(139, 0, 0), ConsoleColor.DarkRed }, // This is the console warning color
{ Color.PaleVioletRed, ConsoleColor.Magenta }, // This is the command logging color { Color.PaleVioletRed, ConsoleColor.Magenta }, // This is the command logging color
{ Color.White, ConsoleColor.White } { Color.White, ConsoleColor.White }
}; };
private ConsoleColor PickNearbyConsoleColor(Color color) private ConsoleColor PickNearbyConsoleColor(Color color)

View file

@ -205,7 +205,7 @@ namespace TShockAPI
if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX))
{ {
var osx = Path.Combine(Environment.CurrentDirectory, "runtimes", "osx-x64"); var osx = Path.Combine(Environment.CurrentDirectory, "runtimes", "osx-x64");
if(Directory.Exists(osx)) if (Directory.Exists(osx))
matches = Directory.GetFiles(osx, "*" + libraryName + "*", SearchOption.AllDirectories); matches = Directory.GetFiles(osx, "*" + libraryName + "*", SearchOption.AllDirectories);
} }
else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
@ -247,7 +247,6 @@ namespace TShockAPI
public override void Initialize() public override void Initialize()
{ {
string logFilename; string logFilename;
string logPathSetupWarning;
OTAPI.Hooks.Netplay.CreateTcpListener += (sender, args) => OTAPI.Hooks.Netplay.CreateTcpListener += (sender, args) =>
{ {
@ -294,10 +293,7 @@ namespace TShockAPI
} }
catch (Exception ex) catch (Exception ex)
{ {
logPathSetupWarning = ServerApi.LogWriter.PluginWriteLine(this, GetString("Could not apply the given log path / log format, defaults will be used. Exception details:\n{0}", ex), TraceLevel.Error);
"Could not apply the given log path / log format, defaults will be used. Exception details:\n" + ex;
ServerApi.LogWriter.PluginWriteLine(this, logPathSetupWarning, TraceLevel.Error);
// Problem with the log path or format use the default // Problem with the log path or format use the default
logFilename = Path.Combine(LogPathDefault, now.ToString(LogFormatDefault) + ".log"); logFilename = Path.Combine(LogPathDefault, now.ToString(LogFormatDefault) + ".log");
@ -353,8 +349,8 @@ namespace TShockAPI
if (File.Exists(Path.Combine(SavePath, "tshock.pid"))) if (File.Exists(Path.Combine(SavePath, "tshock.pid")))
{ {
Log.ConsoleInfo( Log.ConsoleInfo(GetString(
"TShock was improperly shut down. Please use the exit command in the future to prevent this."); "TShock was improperly shut down. Please use the exit command in the future to prevent this."));
File.Delete(Path.Combine(SavePath, "tshock.pid")); File.Delete(Path.Combine(SavePath, "tshock.pid"));
} }
File.WriteAllText(Path.Combine(SavePath, "tshock.pid"), File.WriteAllText(Path.Combine(SavePath, "tshock.pid"),
@ -387,7 +383,7 @@ namespace TShockAPI
if (Config.Settings.EnableGeoIP && File.Exists(geoippath)) if (Config.Settings.EnableGeoIP && File.Exists(geoippath))
Geo = new GeoIPCountry(geoippath); Geo = new GeoIPCountry(geoippath);
Log.ConsoleInfo("TShock {0} ({1}) now running.", Version, VersionCodename); Log.ConsoleInfo(GetString("TShock {0} ({1}) now running.", Version, VersionCodename));
ServerApi.Hooks.GamePostInitialize.Register(this, OnPostInit); ServerApi.Hooks.GamePostInitialize.Register(this, OnPostInit);
ServerApi.Hooks.GameUpdate.Register(this, OnUpdate); ServerApi.Hooks.GameUpdate.Register(this, OnUpdate);
@ -425,14 +421,20 @@ namespace TShockAPI
if (Config.Settings.RestApiEnabled) if (Config.Settings.RestApiEnabled)
RestApi.Start(); RestApi.Start();
Log.ConsoleInfo("AutoSave " + (Config.Settings.AutoSave ? "Enabled" : "Disabled")); if (Config.Settings.AutoSave)
Log.ConsoleInfo("Backups " + (Backups.Interval > 0 ? "Enabled" : "Disabled")); Log.ConsoleInfo(GetString("AutoSave Enabled"));
else
Log.ConsoleInfo(GetString("AutoSave Disabled"));
if (Backups.Interval > 0)
Log.ConsoleInfo(GetString("Backups Enabled"));
else
Log.ConsoleInfo(GetString("Backups Disabled"));
Initialized?.Invoke(); Initialized?.Invoke();
Log.ConsoleInfo("Welcome to TShock for Terraria!"); Log.ConsoleInfo(GetString("Welcome to TShock for Terraria!"));
Log.ConsoleInfo("TShock comes with no warranty & is free software."); Log.ConsoleInfo(GetString("TShock comes with no warranty & is free software."));
Log.ConsoleInfo("You can modify & distribute it under the terms of the GNU GPLv3."); Log.ConsoleInfo(GetString("You can modify & distribute it under the terms of the GNU GPLv3."));
} }
catch (Exception ex) catch (Exception ex)
@ -440,7 +442,7 @@ namespace TShockAPI
// handle if Log was not initialised // handle if Log was not initialised
void SafeError(string message) void SafeError(string message)
{ {
if(Log is not null) Log.ConsoleError(message); if (Log is not null) Log.ConsoleError(message);
else Console.WriteLine(message); else Console.WriteLine(message);
}; };
SafeError(GetString("TShock encountered a problem from which it cannot recover. The following message may help diagnose the problem.")); SafeError(GetString("TShock encountered a problem from which it cannot recover. The following message may help diagnose the problem."));
@ -581,7 +583,7 @@ namespace TShockAPI
{ {
if (player.IP == ip) if (player.IP == ip)
{ {
player.Kick("You logged in from the same IP.", true, true, null, true); player.Kick(GetString("You logged in from the same IP."), true, true, null, true);
args.Handled = true; args.Handled = true;
return; return;
} }
@ -590,7 +592,7 @@ namespace TShockAPI
var ips = JsonConvert.DeserializeObject<List<string>>(player.Account.KnownIps); var ips = JsonConvert.DeserializeObject<List<string>>(player.Account.KnownIps);
if (ips.Contains(ip)) if (ips.Contains(ip))
{ {
player.Kick("You logged in from another location.", true, true, null, true); player.Kick(GetString("You logged in from another location."), true, true, null, true);
args.Handled = true; args.Handled = true;
} }
} }
@ -717,10 +719,10 @@ namespace TShockAPI
tryingToShutdown = true; tryingToShutdown = true;
Log.ConsoleInfo("Shutting down safely. To force shutdown, send SIGINT (CTRL + C) again."); Log.ConsoleInfo(GetString("Shutting down safely. To force shutdown, send SIGINT (CTRL + C) again."));
// Perform a safe shutdown // Perform a safe shutdown
TShock.Utils.StopServer(true, "Server console interrupted!"); TShock.Utils.StopServer(true, GetString("Server console interrupted!"));
} }
/// <summary>HandleCommandLine - Handles the command line parameters passed to the server.</summary> /// <summary>HandleCommandLine - Handles the command line parameters passed to the server.</summary>
@ -747,7 +749,7 @@ namespace TShockAPI
SavePath = path ?? "tshock"; SavePath = path ?? "tshock";
if (path != null) if (path != null)
{ {
ServerApi.LogWriter.PluginWriteLine(this, "Config path has been set to " + path, TraceLevel.Info); ServerApi.LogWriter.PluginWriteLine(this, GetString("Config path has been set to {0}", path), TraceLevel.Info);
} }
}) })
@ -757,7 +759,7 @@ namespace TShockAPI
if (path != null) if (path != null)
{ {
Main.WorldPath = path; Main.WorldPath = path;
ServerApi.LogWriter.PluginWriteLine(this, "World path has been set to " + path, TraceLevel.Info); ServerApi.LogWriter.PluginWriteLine(this, GetString("World path has been set to {0}", path), TraceLevel.Info);
} }
}) })
@ -767,7 +769,7 @@ namespace TShockAPI
if (path != null) if (path != null)
{ {
LogPath = path; LogPath = path;
ServerApi.LogWriter.PluginWriteLine(this, "Log path has been set to " + path, TraceLevel.Info); ServerApi.LogWriter.PluginWriteLine(this, GetString("Log path has been set to {0}", path), TraceLevel.Info);
} }
}) })
@ -877,13 +879,13 @@ namespace TShockAPI
Netplay.ListenPort = port; Netplay.ListenPort = port;
Config.Settings.ServerPort = port; Config.Settings.ServerPort = port;
OverridePort = true; OverridePort = true;
Log.ConsoleInfo("Port overridden by startup argument. Set to " + port); Log.ConsoleInfo(GetString("Port overridden by startup argument. Set to {0}", port));
} }
}) })
.AddFlags(restTokenSet, (token) => .AddFlags(restTokenSet, (token) =>
{ {
RESTStartupTokens.Add(token, new SecureRest.TokenData { Username = "null", UserGroupName = "superadmin" }); RESTStartupTokens.Add(token, new SecureRest.TokenData { Username = "null", UserGroupName = "superadmin" });
Console.WriteLine("Startup parameter overrode REST token."); Console.WriteLine(GetString("Startup parameter overrode REST token."));
}) })
.AddFlags(restEnableSet, (e) => .AddFlags(restEnableSet, (e) =>
{ {
@ -891,7 +893,7 @@ namespace TShockAPI
if (bool.TryParse(e, out enabled)) if (bool.TryParse(e, out enabled))
{ {
Config.Settings.RestApiEnabled = enabled; Config.Settings.RestApiEnabled = enabled;
Console.WriteLine("Startup parameter overrode REST enable."); Console.WriteLine(GetString("Startup parameter overrode REST enable."));
} }
}) })
.AddFlags(restPortSet, (p) => .AddFlags(restPortSet, (p) =>
@ -900,7 +902,7 @@ namespace TShockAPI
if (int.TryParse(p, out restPort)) if (int.TryParse(p, out restPort))
{ {
Config.Settings.RestApiPort = restPort; Config.Settings.RestApiPort = restPort;
Console.WriteLine("Startup parameter overrode REST port."); Console.WriteLine(GetString("Startup parameter overrode REST port."));
} }
}) })
.AddFlags(playerSet, (p) => .AddFlags(playerSet, (p) =>
@ -909,7 +911,7 @@ namespace TShockAPI
if (int.TryParse(p, out slots)) if (int.TryParse(p, out slots))
{ {
Config.Settings.MaxSlots = slots; Config.Settings.MaxSlots = slots;
Console.WriteLine("Startup parameter overrode maximum player slot configuration value."); Console.WriteLine(GetString("Startup parameter overrode maximum player slot configuration value."));
} }
}); });
@ -933,19 +935,19 @@ namespace TShockAPI
//CLI defined password overrides a config password //CLI defined password overrides a config password
if (!string.IsNullOrEmpty(Config.Settings.ServerPassword)) if (!string.IsNullOrEmpty(Config.Settings.ServerPassword))
{ {
Log.ConsoleError("!!! The server password in config.json was overridden by the interactive prompt and will be ignored."); Log.ConsoleError(GetString("!!! The server password in config.json was overridden by the interactive prompt and will be ignored."));
} }
if (!Config.Settings.DisableUUIDLogin) if (!Config.Settings.DisableUUIDLogin)
{ {
Log.ConsoleError("!!! UUID login is enabled. If a user's UUID matches an account, the server password will be bypassed."); Log.ConsoleError(GetString("!!! UUID login is enabled. If a user's UUID matches an account, the server password will be bypassed."));
Log.ConsoleError("!!! > Set DisableUUIDLogin to true in the config file and /reload if this is a problem."); Log.ConsoleError(GetString("!!! > Set DisableUUIDLogin to true in the config file and /reload if this is a problem."));
} }
if (!Config.Settings.DisableLoginBeforeJoin) if (!Config.Settings.DisableLoginBeforeJoin)
{ {
Log.ConsoleError("!!! Login before join is enabled. Existing accounts can login & the server password will be bypassed."); Log.ConsoleError(GetString("!!! Login before join is enabled. Existing accounts can login & the server password will be bypassed."));
Log.ConsoleError("!!! > Set DisableLoginBeforeJoin to true in the config file and /reload if this is a problem."); Log.ConsoleError(GetString("!!! > Set DisableLoginBeforeJoin to true in the config file and /reload if this is a problem."));
} }
_cliPassword = Netplay.ServerPassword; _cliPassword = Netplay.ServerPassword;
@ -956,19 +958,19 @@ namespace TShockAPI
{ {
if (!string.IsNullOrEmpty(Config.Settings.ServerPassword)) if (!string.IsNullOrEmpty(Config.Settings.ServerPassword))
{ {
Log.ConsoleInfo("A password for this server was set in config.json and is being used."); Log.ConsoleInfo(GetString("A password for this server was set in config.json and is being used."));
} }
} }
if (!Config.Settings.DisableLoginBeforeJoin) if (!Config.Settings.DisableLoginBeforeJoin)
{ {
Log.ConsoleInfo("Login before join enabled. Users may be prompted for an account specific password instead of a server password on connect."); Log.ConsoleInfo(GetString("Login before join enabled. Users may be prompted for an account specific password instead of a server password on connect."));
} }
if (!Config.Settings.DisableUUIDLogin) if (!Config.Settings.DisableUUIDLogin)
{ {
Log.ConsoleInfo("Login using UUID enabled. Users automatically login via UUID."); Log.ConsoleInfo(GetString("Login using UUID enabled. Users automatically login via UUID."));
Log.ConsoleInfo("A malicious server can easily steal a user's UUID. You may consider turning this option off if you run a public server."); Log.ConsoleInfo(GetString("A malicious server can easily steal a user's UUID. You may consider turning this option off if you run a public server."));
} }
// Disable the auth system if "setup.lock" is present or a user account already exists // Disable the auth system if "setup.lock" is present or a user account already exists
@ -1090,7 +1092,7 @@ namespace TShockAPI
{ {
if (player.TileKillThreshold >= Config.Settings.TileKillThreshold) if (player.TileKillThreshold >= Config.Settings.TileKillThreshold)
{ {
player.Disable("Reached TileKill threshold.", flags); player.Disable(GetString("Reached TileKill threshold."), flags);
TSPlayer.Server.RevertTiles(player.TilesDestroyed); TSPlayer.Server.RevertTiles(player.TilesDestroyed);
player.TilesDestroyed.Clear(); player.TilesDestroyed.Clear();
} }
@ -1107,7 +1109,7 @@ namespace TShockAPI
{ {
if (player.TilePlaceThreshold >= Config.Settings.TilePlaceThreshold) if (player.TilePlaceThreshold >= Config.Settings.TilePlaceThreshold)
{ {
player.Disable("Reached TilePlace threshold", flags); player.Disable(GetString("Reached TilePlace threshold"), flags);
lock (player.TilesCreated) lock (player.TilesCreated)
{ {
TSPlayer.Server.RevertTiles(player.TilesCreated); TSPlayer.Server.RevertTiles(player.TilesCreated);
@ -1151,7 +1153,7 @@ namespace TShockAPI
if (player.TileLiquidThreshold >= Config.Settings.TileLiquidThreshold) if (player.TileLiquidThreshold >= Config.Settings.TileLiquidThreshold)
{ {
player.Disable("Reached TileLiquid threshold", flags); player.Disable(GetString("Reached TileLiquid threshold"), flags);
} }
if (player.TileLiquidThreshold > 0) if (player.TileLiquidThreshold > 0)
{ {
@ -1160,7 +1162,7 @@ namespace TShockAPI
if (player.ProjectileThreshold >= Config.Settings.ProjectileThreshold) if (player.ProjectileThreshold >= Config.Settings.ProjectileThreshold)
{ {
player.Disable("Reached projectile threshold", flags); player.Disable(GetString("Reached projectile threshold"), flags);
} }
if (player.ProjectileThreshold > 0) if (player.ProjectileThreshold > 0)
{ {
@ -1169,7 +1171,7 @@ namespace TShockAPI
if (player.PaintThreshold >= Config.Settings.TilePaintThreshold) if (player.PaintThreshold >= Config.Settings.TilePaintThreshold)
{ {
player.Disable("Reached paint threshold", flags); player.Disable(GetString("Reached paint threshold"), flags);
} }
if (player.PaintThreshold > 0) if (player.PaintThreshold > 0)
{ {
@ -1178,7 +1180,7 @@ namespace TShockAPI
if (player.HealOtherThreshold >= TShock.Config.Settings.HealOtherThreshold) if (player.HealOtherThreshold >= TShock.Config.Settings.HealOtherThreshold)
{ {
player.Disable("Reached HealOtherPlayer threshold", flags); player.Disable(GetString("Reached HealOtherPlayer threshold"), flags);
} }
if (player.HealOtherThreshold > 0) if (player.HealOtherThreshold > 0)
{ {
@ -1282,7 +1284,7 @@ namespace TShockAPI
{ {
if (ShuttingDown) if (ShuttingDown)
{ {
NetMessage.SendData((int)PacketTypes.Disconnect, args.Who, -1, NetworkText.FromLiteral("Server is shutting down...")); NetMessage.SendData((int)PacketTypes.Disconnect, args.Who, -1, NetworkText.FromLiteral(GetString("Server is shutting down...")));
args.Handled = true; args.Handled = true;
return; return;
} }
@ -1311,7 +1313,7 @@ namespace TShockAPI
{ {
if (Config.Settings.KickProxyUsers) if (Config.Settings.KickProxyUsers)
{ {
player.Kick("Connecting via a proxy is not allowed.", true, true, null, false); player.Kick(GetString("Connecting via a proxy is not allowed."), true, true, null, false);
args.Handled = true; args.Handled = true;
return; return;
} }
@ -1333,7 +1335,7 @@ namespace TShockAPI
if (Config.Settings.KickEmptyUUID && String.IsNullOrWhiteSpace(player.UUID)) if (Config.Settings.KickEmptyUUID && String.IsNullOrWhiteSpace(player.UUID))
{ {
player.Kick("Your client sent a blank UUID. Configure it to send one or use a different client.", true, true, null, false); player.Kick(GetString("Your client sent a blank UUID. Configure it to send one or use a different client."), true, true, null, false);
args.Handled = true; args.Handled = true;
return; return;
} }
@ -1379,8 +1381,8 @@ namespace TShockAPI
if (tsplr.ReceivedInfo) if (tsplr.ReceivedInfo)
{ {
if (!tsplr.SilentKickInProgress && tsplr.State >= 3) if (!tsplr.SilentKickInProgress && tsplr.State >= 3)
Utils.Broadcast(tsplr.Name + " has left.", Color.Yellow); Utils.Broadcast(GetString("{0} has left.", tsplr.Name), Color.Yellow);
Log.Info("{0} disconnected.", tsplr.Name); Log.Info(GetString("{0} disconnected."), tsplr.Name);
if (tsplr.IsLoggedIn && !tsplr.IsDisabledPendingTrashRemoval && Main.ServerSideCharacter && (!tsplr.Dead || tsplr.TPlayer.difficulty != 2)) if (tsplr.IsLoggedIn && !tsplr.IsDisabledPendingTrashRemoval && Main.ServerSideCharacter && (!tsplr.Dead || tsplr.TPlayer.difficulty != 2))
{ {
@ -1430,7 +1432,7 @@ namespace TShockAPI
if (args.Text.Length > 500) if (args.Text.Length > 500)
{ {
tsplr.Kick("Crash attempt via long chat packet.", true); tsplr.Kick(GetString("Crash attempt via long chat packet."), true);
args.Handled = true; args.Handled = true;
return; return;
} }
@ -1466,12 +1468,12 @@ namespace TShockAPI
{ {
// This is required in case anyone makes HandleCommand return false again // This is required in case anyone makes HandleCommand return false again
tsplr.SendErrorMessage(GetString("Unable to parse command. Please contact an administrator for assistance.")); tsplr.SendErrorMessage(GetString("Unable to parse command. Please contact an administrator for assistance."));
Log.ConsoleError("Unable to parse command '{0}' from player {1}.", text, tsplr.Name); Log.ConsoleError(GetString("Unable to parse command '{0}' from player {1}."), text, tsplr.Name);
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
Log.ConsoleError("An exception occurred executing a command."); Log.ConsoleError(GetString("An exception occurred executing a command."));
Log.Error(ex.ToString()); Log.Error(ex.ToString());
} }
} }
@ -1569,7 +1571,10 @@ namespace TShockAPI
if (args.Command == "autosave") if (args.Command == "autosave")
{ {
Main.autoSave = Config.Settings.AutoSave = !Config.Settings.AutoSave; Main.autoSave = Config.Settings.AutoSave = !Config.Settings.AutoSave;
Log.ConsoleInfo("AutoSave " + (Config.Settings.AutoSave ? "Enabled" : "Disabled")); if (Config.Settings.AutoSave)
Log.ConsoleInfo(GetString("AutoSave Enabled"));
else
Log.ConsoleInfo(GetString("AutoSave Disabled"));
} }
else if (args.Command.StartsWith(Commands.Specifier) || args.Command.StartsWith(Commands.SilentSpecifier)) else if (args.Command.StartsWith(Commands.Specifier) || args.Command.StartsWith(Commands.SilentSpecifier))
{ {

View file

@ -80,11 +80,11 @@ namespace TShockAPI
string msg = ex.BuildExceptionString(); string msg = ex.BuildExceptionString();
//Give the console a brief //Give the console a brief
Console.ForegroundColor = ConsoleColor.Yellow; Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine($"UpdateManager warning: {msg}"); Console.WriteLine(GetString($"UpdateManager warning: {msg}"));
Console.ForegroundColor = ConsoleColor.Gray; Console.ForegroundColor = ConsoleColor.Gray;
//And log the full exception //And log the full exception
TShock.Log.Warn($"UpdateManager warning: {ex.ToString()}"); TShock.Log.Warn(GetString($"UpdateManager warning: {ex.ToString()}"));
TShock.Log.ConsoleError("Retrying in 5 minutes."); TShock.Log.ConsoleError(GetString("Retrying in 5 minutes."));
CheckXMinutes = 5; CheckXMinutes = 5;
} }
} }
@ -117,8 +117,7 @@ namespace TShockAPI
{ {
reason = "none"; reason = "none";
} }
throw new WebException("Update server did not respond with an OK. " throw new WebException(GetString($"Update server did not respond with an OK. Server message: [error {resp.StatusCode}] {reason}"));
+ $"Server message: [error {resp.StatusCode}] {reason}");
} }
string json = await resp.Content.ReadAsStringAsync(); string json = await resp.Content.ReadAsStringAsync();