diff --git a/.gitignore b/.gitignore
index 5a43ff85..c7755a6d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,6 @@
# Sublime Text #
*.sublime-*
-
+releases/
# Compiled source #
###################
*.com
@@ -67,4 +67,4 @@ _ReSharper.*
packages/*
# Private key files #
-scripts/ssh_private_key
\ No newline at end of file
+scripts/ssh_private_key
diff --git a/.travis.yml b/.travis.yml
index e7d8daa7..5e74512c 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -6,4 +6,6 @@ install:
script: python ./scripts/create_release.py
notifications:
slack:
- secure: O4Nibe2fdaUa2ZxuETUg6WEoQKvNM2CotnfaIVgm3fjfe61dfE1P+EgTpbwDG8646jSmpTqMDw8Z6I/WJwGTlXV/ZQsbwu63Cps4MgOTvPHZ0Lsye5azySlJZs1iI4ItYSj2czXfcnJ+qAl1SOOkXJrjB5uyTMWtDpCrSCFB3MA=
\ No newline at end of file
+ secure: O4Nibe2fdaUa2ZxuETUg6WEoQKvNM2CotnfaIVgm3fjfe61dfE1P+EgTpbwDG8646jSmpTqMDw8Z6I/WJwGTlXV/ZQsbwu63Cps4MgOTvPHZ0Lsye5azySlJZs1iI4ItYSj2czXfcnJ+qAl1SOOkXJrjB5uyTMWtDpCrSCFB3MA=
+ webhooks:
+ secure: dbTvcMtts5hSgV3DvlHPh36LTOvSPzQbVRUrgN9j0M/MlCm1QlBVt1vDLzN8VbkSYXiJYVWGMDpSHApL6SBu7sEQaXeC4zZyTMX76PeKw5a5xh0mIdDyg8Ls9WVA+QDVGes5DA1CZWbVRBDto3U0c+Ob8iza3o01sEFWpm7wQg4=
\ No newline at end of file
diff --git a/CHANGELOG.md b/CHANGELOG.md
index fd540a7d..15f32ab5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,11 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin
## Upcoming Changes
+* Updated OpenTerraria API to 1.3.5.3 (@DeathCradle)
+* Updated Terraria Server API to 1.3.5.3 (@WhiteXZ, @hakusaro)
+* Updated TShock core components to 1.3.5.3 (@hakusaro)
+* Terraria Server API version tick: 2.2
+* Added OnNpcKilled hook to Server API: 2.2 (@tylerjwatson)
## TShock 4.3.23
* Added evil type option during world creation (@mistzzt)
diff --git a/README.md b/README.md
index b379295e..4548076a 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,6 @@
-
+
@@ -30,6 +30,12 @@ Feeling like helping out? Want to find an awesome server? Some awesome plugins?
* [Contribute to our docs on readme.io](https://tshock.readme.io/)
* [Join our Discord chat (supports Android, iOS, Web, Mac, and Windows)](https://discord.gg/XUJdH58)
+### Code of Conduct
+
+> By participating in the TShock for Terraria community, all members will adhere to maintaining decorum with respect to all humans, in and out of the community. Members will not engage in discussion that inappropriately disparages or marginalizes any group of people or any individual. Members will not attempt to further or advance an agenda to the point of being overbearing or close minded (such as through spreading FUD). Members will not abuse services provided to them and will follow the guidance of community leaders on a situational basis about what abuse consists of. Members will adhere to United States and international law. If members notice a violation of this code of conduct, they will not engage but will instead contact the leadership team on either the forums or Discord.
+
+> Do not attempt to circumvent or bypass the code of conduct by using clever logic or reasoning (e.g. insulting Facepunch members, because they weren't directly mentioned here).
+
Please see the contributing file before sending pull requests.
## Download
diff --git a/TShockAPI/Commands.cs b/TShockAPI/Commands.cs
index 04d19f70..cd90f8e6 100644
--- a/TShockAPI/Commands.cs
+++ b/TShockAPI/Commands.cs
@@ -27,12 +27,14 @@ using System.Text;
using System.Threading;
using Terraria;
using Terraria.ID;
+using Terraria.Localization;
using TShockAPI.DB;
using TerrariaApi.Server;
using TShockAPI.Hooks;
using Terraria.GameContent.Events;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
+using TShockAPI.Localization;
namespace TShockAPI
{
@@ -2156,83 +2158,83 @@ namespace TShockAPI
foreach (int i in npcIds)
{
npc.SetDefaults(i);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
}
TSPlayer.All.SendSuccessMessage("{0} has spawned all bosses {1} time(s).", args.Player.Name, amount);
return;
case "brain":
case "brain of cthulhu":
npc.SetDefaults(266);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Brain of Cthulhu {1} time(s).", args.Player.Name, amount);
return;
case "destroyer":
npc.SetDefaults(134);
TSPlayer.Server.SetTime(false, 0.0);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Destroyer {1} time(s).", args.Player.Name, amount);
return;
case "duke":
case "duke fishron":
case "fishron":
npc.SetDefaults(370);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Duke Fishron {1} time(s).", args.Player.Name, amount);
return;
case "eater":
case "eater of worlds":
npc.SetDefaults(13);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Eater of Worlds {1} time(s).", args.Player.Name, amount);
return;
case "eye":
case "eye of cthulhu":
npc.SetDefaults(4);
TSPlayer.Server.SetTime(false, 0.0);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Eye of Cthulhu {1} time(s).", args.Player.Name, amount);
return;
case "golem":
npc.SetDefaults(245);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Golem {1} time(s).", args.Player.Name, amount);
return;
case "king":
case "king slime":
npc.SetDefaults(50);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned King Slime {1} time(s).", args.Player.Name, amount);
return;
case "plantera":
npc.SetDefaults(262);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Plantera {1} time(s).", args.Player.Name, amount);
return;
case "prime":
case "skeletron prime":
npc.SetDefaults(127);
TSPlayer.Server.SetTime(false, 0.0);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Skeletron Prime {1} time(s).", args.Player.Name, amount);
return;
case "queen":
case "queen bee":
npc.SetDefaults(222);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Queen Bee {1} time(s).", args.Player.Name, amount);
return;
case "skeletron":
npc.SetDefaults(35);
TSPlayer.Server.SetTime(false, 0.0);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned Skeletron {1} time(s).", args.Player.Name, amount);
return;
case "twins":
TSPlayer.Server.SetTime(false, 0.0);
npc.SetDefaults(125);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
npc.SetDefaults(126);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Twins {1} time(s).", args.Player.Name, amount);
return;
case "wof":
@@ -2253,7 +2255,7 @@ namespace TShockAPI
case "moon":
case "moon lord":
npc.SetDefaults(398);
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY);
TSPlayer.All.SendSuccessMessage("{0} has spawned the Moon Lord {1} time(s).", args.Player.Name, amount);
return;
default:
@@ -2291,21 +2293,21 @@ namespace TShockAPI
}
else if (npcs.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => n.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => $"{n.FullName}({n.type})"));
}
else
{
var npc = npcs[0];
if (npc.type >= 1 && npc.type < Main.maxNPCTypes && npc.type != 113)
{
- TSPlayer.Server.SpawnNPC(npc.type, npc.name, amount, args.Player.TileX, args.Player.TileY, 50, 20);
+ TSPlayer.Server.SpawnNPC(npc.type, npc.FullName, amount, args.Player.TileX, args.Player.TileY, 50, 20);
if (args.Silent)
{
- args.Player.SendSuccessMessage("Spawned {0} {1} time(s).", npc.name, amount);
+ args.Player.SendSuccessMessage("Spawned {0} {1} time(s).", npc.FullName, amount);
}
else
{
- TSPlayer.All.SendSuccessMessage("{0} has spawned {1} {2} time(s).", args.Player.Name, npc.name, amount);
+ TSPlayer.All.SendSuccessMessage("{0} has spawned {1} {2} time(s).", args.Player.Name, npc.FullName, amount);
}
}
else if (npc.type == 113)
@@ -2533,18 +2535,22 @@ namespace TShockAPI
var matches = new List();
foreach (var npc in Main.npc.Where(npc => npc.active))
{
- if (string.Equals(npc.name, npcStr, StringComparison.CurrentCultureIgnoreCase))
+ var englishName = EnglishLanguage.GetNpcNameById(npc.netID);
+
+ if (string.Equals(npc.FullName, npcStr, StringComparison.InvariantCultureIgnoreCase) ||
+ string.Equals(englishName, npcStr, StringComparison.InvariantCultureIgnoreCase))
{
matches = new List { npc };
break;
}
- if (npc.name.ToLower().StartsWith(npcStr.ToLower()))
+ if (npc.FullName.ToLowerInvariant().StartsWith(npcStr.ToLowerInvariant()) ||
+ englishName?.StartsWith(npcStr, StringComparison.InvariantCultureIgnoreCase) == true)
matches.Add(npc);
}
if (matches.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, matches.Select(n => n.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, matches.Select(n => $"{n.FullName}({n.whoAmI})"));
return;
}
if (matches.Count == 0)
@@ -2555,7 +2561,7 @@ namespace TShockAPI
var target = matches[0];
args.Player.Teleport(target.position.X, target.position.Y);
- args.Player.SendSuccessMessage("Teleported to the '{0}'.", target.name);
+ args.Player.SendSuccessMessage("Teleported to the '{0}'.", target.FullName);
}
private static void GetPos(CommandArgs args)
@@ -3202,12 +3208,12 @@ namespace TShockAPI
}
else if (items.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => $"{i.Name}({i.netID})"));
}
else
{
- TShock.Itembans.AddNewBan(items[0].name);
- args.Player.SendSuccessMessage("Banned " + items[0].name + ".");
+ TShock.Itembans.AddNewBan(EnglishLanguage.GetItemNameById(items[0].type));
+ args.Player.SendSuccessMessage("Banned " + items[0].Name + ".");
}
}
#endregion
@@ -3228,7 +3234,7 @@ namespace TShockAPI
}
else if (items.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => $"{i.Name}({i.netID})"));
}
else
{
@@ -3238,20 +3244,20 @@ namespace TShockAPI
return;
}
- ItemBan ban = TShock.Itembans.GetItemBanByName(items[0].name);
+ ItemBan ban = TShock.Itembans.GetItemBanByName(EnglishLanguage.GetItemNameById(items[0].type));
if (ban == null)
{
- args.Player.SendErrorMessage("{0} is not banned.", items[0].name);
+ args.Player.SendErrorMessage("{0} is not banned.", items[0].Name);
return;
}
if (!ban.AllowedGroups.Contains(args.Parameters[2]))
{
- TShock.Itembans.AllowGroup(items[0].name, args.Parameters[2]);
- args.Player.SendSuccessMessage("{0} has been allowed to use {1}.", args.Parameters[2], items[0].name);
+ TShock.Itembans.AllowGroup(EnglishLanguage.GetItemNameById(items[0].type), args.Parameters[2]);
+ args.Player.SendSuccessMessage("{0} has been allowed to use {1}.", args.Parameters[2], items[0].Name);
}
else
{
- args.Player.SendWarningMessage("{0} is already allowed to use {1}.", args.Parameters[2], items[0].name);
+ args.Player.SendWarningMessage("{0} is already allowed to use {1}.", args.Parameters[2], items[0].Name);
}
}
}
@@ -3273,12 +3279,12 @@ namespace TShockAPI
}
else if (items.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => $"{i.Name}({i.netID})"));
}
else
{
- TShock.Itembans.RemoveBan(items[0].name);
- args.Player.SendSuccessMessage("Unbanned " + items[0].name + ".");
+ TShock.Itembans.RemoveBan(EnglishLanguage.GetItemNameById(items[0].type));
+ args.Player.SendSuccessMessage("Unbanned " + items[0].Name + ".");
}
}
#endregion
@@ -3299,7 +3305,7 @@ namespace TShockAPI
}
else if (items.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => $"{i.Name}({i.netID})"));
}
else
{
@@ -3309,20 +3315,20 @@ namespace TShockAPI
return;
}
- ItemBan ban = TShock.Itembans.GetItemBanByName(items[0].name);
+ ItemBan ban = TShock.Itembans.GetItemBanByName(EnglishLanguage.GetItemNameById(items[0].type));
if (ban == null)
{
- args.Player.SendErrorMessage("{0} is not banned.", items[0].name);
+ args.Player.SendErrorMessage("{0} is not banned.", items[0].Name);
return;
}
if (ban.AllowedGroups.Contains(args.Parameters[2]))
{
- TShock.Itembans.RemoveGroup(items[0].name, args.Parameters[2]);
- args.Player.SendSuccessMessage("{0} has been disallowed to use {1}.", args.Parameters[2], items[0].name);
+ TShock.Itembans.RemoveGroup(EnglishLanguage.GetItemNameById(items[0].type), args.Parameters[2]);
+ args.Player.SendSuccessMessage("{0} has been disallowed to use {1}.", args.Parameters[2], items[0].Name);
}
else
{
- args.Player.SendWarningMessage("{0} is already disallowed to use {1}.", args.Parameters[2], items[0].name);
+ args.Player.SendWarningMessage("{0} is already disallowed to use {1}.", args.Parameters[2], items[0].Name);
}
}
}
@@ -5187,7 +5193,7 @@ namespace TShockAPI
}
else if (npcs.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => n.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => $"{n.FullName}({n.type})"));
return;
}
else
@@ -5242,7 +5248,7 @@ namespace TShockAPI
}
else if (matchedItems.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, matchedItems.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, matchedItems.Select(i => $"{i.Name}({i.netID})"));
return;
}
else
@@ -5261,14 +5267,14 @@ namespace TShockAPI
string prefixidOrName = args.Parameters[amountParamIndex + 1];
var prefixIds = TShock.Utils.GetPrefixByIdOrName(prefixidOrName);
- if (item.accessory && prefixIds.Contains(42))
+ if (item.accessory && prefixIds.Contains(PrefixID.Quick))
{
- prefixIds.Remove(42);
- prefixIds.Remove(76);
- prefixIds.Add(76);
+ prefixIds.Remove(PrefixID.Quick);
+ prefixIds.Remove(PrefixID.Quick2);
+ prefixIds.Add(PrefixID.Quick2);
}
- else if (!item.accessory && prefixIds.Contains(42))
- prefixIds.Remove(76);
+ else if (!item.accessory && prefixIds.Contains(PrefixID.Quick))
+ prefixIds.Remove(PrefixID.Quick2);
if (prefixIds.Count > 1)
{
@@ -5291,7 +5297,7 @@ namespace TShockAPI
if (itemAmount == 0 || itemAmount > item.maxStack)
itemAmount = item.maxStack;
- if (args.Player.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefixId))
+ if (args.Player.GiveItemCheck(item.type, EnglishLanguage.GetItemNameById(item.type), item.width, item.height, itemAmount, prefixId))
{
item.prefix = (byte)prefixId;
args.Player.SendSuccessMessage("Gave {0} {1}(s).", itemAmount, item.AffixName());
@@ -5325,7 +5331,7 @@ namespace TShockAPI
}
else if (npcs.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => n.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, npcs.Select(n => $"{n.FullName}({n.type})"));
return;
}
else if (args.Parameters[1].Length > 200)
@@ -5343,8 +5349,8 @@ namespace TShockAPI
{
if (Main.npc[i].active && ((npcId == 0 && !Main.npc[i].townNPC) || (Main.npc[i].netID == npcId && Main.npc[i].townNPC)))
{
- Main.npc[i].displayName = args.Parameters[1];
- NetMessage.SendData(56, -1, -1, args.Parameters[1], i, 0f, 0f, 0f, 0);
+ Main.npc[i].GivenName = args.Parameters[1];
+ NetMessage.SendData(56, -1, -1, NetworkText.FromLiteral(args.Parameters[1]), i, 0f, 0f, 0f, 0);
done++;
}
}
@@ -5390,7 +5396,7 @@ namespace TShockAPI
}
else if (items.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => i.name));
+ TShock.Utils.SendMultipleMatchError(args.Player, items.Select(i => $"{i.Name}({i.netID})"));
}
else
{
@@ -5400,14 +5406,14 @@ namespace TShockAPI
{
int.TryParse(args.Parameters[0], out itemAmount);
var prefixIds = TShock.Utils.GetPrefixByIdOrName(args.Parameters[1]);
- if (item.accessory && prefixIds.Contains(42))
+ if (item.accessory && prefixIds.Contains(PrefixID.Quick))
{
- prefixIds.Remove(42);
- prefixIds.Remove(76);
- prefixIds.Add(76);
+ prefixIds.Remove(PrefixID.Quick);
+ prefixIds.Remove(PrefixID.Quick2);
+ prefixIds.Add(PrefixID.Quick2);
}
- else if (!item.accessory && prefixIds.Contains(42))
- prefixIds.Remove(76);
+ else if (!item.accessory && prefixIds.Contains(PrefixID.Quick))
+ prefixIds.Remove(PrefixID.Quick2);
if (prefixIds.Count == 1)
prefix = prefixIds[0];
}
@@ -5430,10 +5436,10 @@ namespace TShockAPI
{
if (itemAmount == 0 || itemAmount > item.maxStack)
itemAmount = item.maxStack;
- if (plr.GiveItemCheck(item.type, item.name, item.width, item.height, itemAmount, prefix))
+ if (plr.GiveItemCheck(item.type, EnglishLanguage.GetItemNameById(item.type), item.width, item.height, itemAmount, prefix))
{
- args.Player.SendSuccessMessage(string.Format("Gave {0} {1} {2}(s).", plr.Name, itemAmount, item.name));
- plr.SendSuccessMessage(string.Format("{0} gave you {1} {2}(s).", args.Player.Name, itemAmount, item.name));
+ args.Player.SendSuccessMessage(string.Format("Gave {0} {1} {2}(s).", plr.Name, itemAmount, item.Name));
+ plr.SendSuccessMessage(string.Format("{0} gave you {1} {2}(s).", args.Player.Name, itemAmount, item.Name));
}
else
{
@@ -5517,7 +5523,7 @@ namespace TShockAPI
}
else if (found.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, found.Select(f => Main.buffName[f]));
+ TShock.Utils.SendMultipleMatchError(args.Player, found.Select(f => Lang.GetBuffName(f)));
return;
}
id = found[0];
@@ -5568,7 +5574,7 @@ namespace TShockAPI
}
else if (found.Count > 1)
{
- TShock.Utils.SendMultipleMatchError(args.Player, found.Select(b => Main.buffName[b]));
+ TShock.Utils.SendMultipleMatchError(args.Player, found.Select(b => Lang.GetBuffName(b)));
return;
}
id = found[0];
diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs
index 75a6028f..4ce43066 100644
--- a/TShockAPI/DB/ItemManager.cs
+++ b/TShockAPI/DB/ItemManager.cs
@@ -65,7 +65,7 @@ namespace TShockAPI.DB
try
{
database.Query("INSERT INTO ItemBans (ItemName, AllowedGroups) VALUES (@0, @1);",
- TShock.Utils.GetItemByName(itemname)[0].name, "");
+ itemname, "");
if (!ItemIsBanned(itemname, null))
ItemBans.Add(new ItemBan(itemname));
}
@@ -81,7 +81,7 @@ namespace TShockAPI.DB
return;
try
{
- database.Query("DELETE FROM ItemBans WHERE ItemName=@0;", TShock.Utils.GetItemByName(itemname)[0].name);
+ database.Query("DELETE FROM ItemBans WHERE ItemName=@0;", itemname);
ItemBans.Remove(new ItemBan(itemname));
}
catch (Exception ex)
diff --git a/TShockAPI/GetDataHandlers.cs b/TShockAPI/GetDataHandlers.cs
index a1677ae3..fb5bea27 100644
--- a/TShockAPI/GetDataHandlers.cs
+++ b/TShockAPI/GetDataHandlers.cs
@@ -32,8 +32,10 @@ using Terraria;
using Terraria.ObjectData;
using Terraria.DataStructures;
using Terraria.GameContent.Tile_Entities;
+using Terraria.Localization;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
+using TShockAPI.Localization;
namespace TShockAPI
{
@@ -1494,7 +1496,7 @@ namespace TShockAPI
args.Player.TPlayer.hideVisual[i] = hideVisual2[i];
args.Player.TPlayer.hideMisc = hideMisc;
args.Player.TPlayer.extraAccessory = extraSlot;
- NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, args.Player.Index, args.Player.Name, args.Player.Index);
+ NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, args.Player.Index, NetworkText.FromLiteral(args.Player.Name), args.Player.Index);
return true;
}
if (TShock.Config.MediumcoreOnly && difficulty < 1)
@@ -1678,7 +1680,7 @@ namespace TShockAPI
return true;
}
- NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, "", Main.dayTime ? 1 : 0, (int)Main.time, Main.sunModY, Main.moonModY);
+ NetMessage.SendData((int)PacketTypes.TimeSet, -1, -1, NetworkText.Empty, Main.dayTime ? 1 : 0, (int)Main.time, Main.sunModY, Main.moonModY);
return false;
}
@@ -2149,7 +2151,7 @@ namespace TShockAPI
args.Player.SendErrorMessage("You do not have permission to place actuators.");
return true;
}
- if (TShock.Itembans.ItemIsBanned(selectedItem.name, args.Player) || editData >= (action == EditAction.PlaceTile ? Main.maxTileSets : Main.maxWallTypes))
+ if (TShock.Itembans.ItemIsBanned(selectedItem.Name, args.Player) || editData >= (action == EditAction.PlaceTile ? Main.maxTileSets : Main.maxWallTypes))
{
args.Player.SendTileSquare(tileX, tileY, 4);
return true;
@@ -2160,7 +2162,7 @@ namespace TShockAPI
args.Player.SendTileSquare(tileX, tileY, 3);
return true;
}
- if (action == EditAction.PlaceTile && editData == TileID.Containers)
+ if (action == EditAction.PlaceTile && (editData == TileID.Containers || editData == TileID.Containers2))
{
if (TShock.Utils.MaxChests())
{
@@ -2608,7 +2610,7 @@ namespace TShockAPI
if (control[5])
{
- string itemName = args.TPlayer.inventory[item].name;
+ string itemName = args.TPlayer.inventory[item].Name;
if (TShock.Itembans.ItemIsBanned(itemName, args.Player))
{
control[5] = false;
@@ -2616,19 +2618,19 @@ namespace TShockAPI
args.Player.SendErrorMessage("You cannot use {0} on this server. Your actions are being ignored.", itemName);
}
- if (args.TPlayer.inventory[item].name == "Mana Crystal" && args.Player.TPlayer.statManaMax <= 180)
+ if (args.TPlayer.inventory[item].Name == "Mana Crystal" && args.Player.TPlayer.statManaMax <= 180)
{
args.Player.TPlayer.statMana += 20;
args.Player.TPlayer.statManaMax += 20;
args.Player.PlayerData.maxMana += 20;
}
- else if (args.TPlayer.inventory[item].name == "Life Crystal" && args.Player.TPlayer.statLifeMax <= 380)
+ else if (args.TPlayer.inventory[item].Name == "Life Crystal" && args.Player.TPlayer.statLifeMax <= 380)
{
args.TPlayer.statLife += 20;
args.TPlayer.statLifeMax += 20;
args.Player.PlayerData.maxHealth += 20;
}
- else if (args.TPlayer.inventory[item].name == "Life Fruit" && args.Player.TPlayer.statLifeMax >= 400 && args.Player.TPlayer.statLifeMax <= 495)
+ else if (args.TPlayer.inventory[item].Name == "Life Fruit" && args.Player.TPlayer.statLifeMax >= 400 && args.Player.TPlayer.statLifeMax <= 495)
{
args.TPlayer.statLife += 5;
args.TPlayer.statLifeMax += 5;
@@ -2719,13 +2721,11 @@ namespace TShockAPI
args.TPlayer.Update(args.TPlayer.whoAmI);
- NetMessage.SendData((int)PacketTypes.PlayerUpdate, -1, -1, "", args.Player.Index);
+ NetMessage.SendData((int)PacketTypes.PlayerUpdate, -1, -1, NetworkText.Empty, args.Player.Index);
return true;
}
-
-
- NetMessage.SendData((int)PacketTypes.PlayerUpdate, -1, args.Player.Index, "", args.Player.Index);
+ NetMessage.SendData((int)PacketTypes.PlayerUpdate, -1, args.Player.Index, NetworkText.Empty, args.Player.Index);
return true;
}
@@ -2981,7 +2981,7 @@ namespace TShockAPI
if (OnKillMe(id, direction, dmg, pvp))
return true;
- if (playerDeathReason.GetDeathText().Length > 500)
+ if (playerDeathReason.GetDeathText(TShock.Players[id].Name).ToString().Length > 500)
{
TShock.Utils.Kick(TShock.Players[id], "Crash attempt", true);
return true;
@@ -3167,9 +3167,10 @@ namespace TShockAPI
return true;
}
- if (flag != 0
+ if (flag != 0 && flag != 4 // if no container or container2 placement
&& Main.tile[tileX, tileY].type != TileID.Containers
&& Main.tile[tileX, tileY].type != TileID.Dressers
+ && Main.tile[tileX, tileY].type != TileID.Containers2
&& (!TShock.Utils.MaxChests() && Main.tile[tileX, tileY].type != TileID.Dirt)) //Chest
{
args.Player.SendTileSquare(tileX, tileY, 3);
@@ -3330,7 +3331,7 @@ namespace TShockAPI
Item item = new Item();
item.netDefaults(type);
- if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(item.name, args.Player))
+ if (stacks > item.maxStack || TShock.Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), args.Player))
{
return false;
}
@@ -3478,7 +3479,7 @@ namespace TShockAPI
return true;
}
- if (prefix > Item.maxPrefixes) //make sure the prefix is a legit value
+ if (prefix > PrefixID.Count) //make sure the prefix is a legit value
{
args.Player.SendData(PacketTypes.ItemDrop, "", id);
return true;
@@ -3510,7 +3511,7 @@ namespace TShockAPI
Item item = new Item();
item.netDefaults(type);
- if ((stacks > item.maxStack || stacks <= 0) || (TShock.Itembans.ItemIsBanned(item.name, args.Player) && !args.Player.HasPermission(Permissions.allowdroppingbanneditems)))
+ if ((stacks > item.maxStack || stacks <= 0) || (TShock.Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), args.Player) && !args.Player.HasPermission(Permissions.allowdroppingbanneditems)))
{
args.Player.SendData(PacketTypes.ItemDrop, "", id);
return true;
@@ -3518,7 +3519,7 @@ namespace TShockAPI
if ((Main.ServerSideCharacter) && (DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond - args.Player.LoginMS < TShock.ServerSideCharacterConfig.LogonDiscardThreshold))
{
//Player is probably trying to sneak items onto the server in their hands!!!
- TShock.Log.ConsoleInfo("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.name);
+ TShock.Log.ConsoleInfo("Player {0} tried to sneak {1} onto the server!", args.Player.Name, item.Name);
args.Player.SendData(PacketTypes.ItemDrop, "", id);
return true;
@@ -3830,7 +3831,7 @@ namespace TShockAPI
}
- NetMessage.SendData((int)PacketTypes.PlayerBuff, -1, args.Player.Index, "", args.Player.Index);
+ NetMessage.SendData((int)PacketTypes.PlayerBuff, -1, args.Player.Index, NetworkText.Empty, args.Player.Index);
return true;
}
@@ -3932,7 +3933,7 @@ namespace TShockAPI
boss = "a Goblin Invasion";
break;
default:
- boss = String.Format("the {0}", npc.name);
+ boss = String.Format("the {0}", npc.FullName);
break;
}
if (TShock.Config.AnonymousBossInvasions)
@@ -4259,7 +4260,7 @@ namespace TShockAPI
if (Main.npc[npcID]?.catchItem == 0)
{
Main.npc[npcID].active = true;
- NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, "", npcID);
+ NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcID);
return true;
}
@@ -4276,13 +4277,13 @@ namespace TShockAPI
if (projectile == null || !projectile.active)
{
- NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, "", npcIndex);
+ NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex);
return true;
}
if (projectile.type != ProjectileID.PortalGunGate)
{
- NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, "", npcIndex);
+ NetMessage.SendData((int)PacketTypes.NpcUpdate, -1, -1, NetworkText.Empty, npcIndex);
return true;
}
@@ -4347,25 +4348,25 @@ namespace TShockAPI
if (TShock.CheckIgnores(args.Player))
{
- NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, "", itemFrame.ID, 0, 1);
+ NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, itemFrame.ID, 0, 1);
return true;
}
if (TShock.CheckTilePermission(args.Player, x, y))
{
- NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, "", itemFrame.ID, 0, 1);
+ NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, itemFrame.ID, 0, 1);
return true;
}
if (TShock.CheckRangePermission(args.Player, x, y))
{
- NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, "", itemFrame.ID, 0, 1);
+ NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, itemFrame.ID, 0, 1);
return true;
}
if (itemFrame.item?.netID == args.TPlayer.inventory[args.TPlayer.selectedItem]?.netID)
{
- NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, "", itemFrame.ID, 0, 1);
+ NetMessage.SendData((int)PacketTypes.UpdateTileEntity, -1, -1, NetworkText.Empty, itemFrame.ID, 0, 1);
return true;
}
@@ -4419,7 +4420,7 @@ namespace TShockAPI
{
return true;
}
-
+
if (!args.Player.HasPermission(Permissions.startdd2))
{
args.Player.SendErrorMessage("You don't have permission to start the Old One's Army event.");
diff --git a/TShockAPI/Localization/EnglishLanguage.cs b/TShockAPI/Localization/EnglishLanguage.cs
new file mode 100644
index 00000000..11852e36
--- /dev/null
+++ b/TShockAPI/Localization/EnglishLanguage.cs
@@ -0,0 +1,100 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using Terraria;
+using Terraria.Localization;
+
+namespace TShockAPI.Localization
+{
+ ///
+ /// Provides a series of methods that give English texts
+ ///
+ public static class EnglishLanguage
+ {
+ private static readonly Dictionary ItemNames = new Dictionary();
+
+ private static readonly Dictionary NpcNames = new Dictionary();
+
+ private static readonly Dictionary Prefixs = new Dictionary();
+
+ internal static void Initialize()
+ {
+ var culture = Language.ActiveCulture;
+
+ var skip = culture == GameCulture.English;
+
+ try
+ {
+ if (!skip)
+ {
+ LanguageManager.Instance.SetLanguage(GameCulture.English);
+ }
+
+ for (var i = -48; i < Main.maxItemTypes; i++)
+ {
+ ItemNames.Add(i, Lang.GetItemNameValue(i));
+ }
+
+ for (var i = -17; i < Main.maxNPCTypes; i++)
+ {
+ NpcNames.Add(i, Lang.GetNPCNameValue(i));
+ }
+
+ foreach (var field in typeof(Main).Assembly.GetType("Terraria.ID.PrefixID")
+ .GetFields().Where(f => !f.Name.Equals("Count", StringComparison.Ordinal)))
+ {
+ Prefixs.Add((int) field.GetValue(null), field.Name);
+ }
+ }
+ finally
+ {
+ if (!skip)
+ {
+ LanguageManager.Instance.SetLanguage(culture);
+ }
+ }
+ }
+
+ ///
+ /// Get the english name of an item
+ ///
+ /// Id of the item
+ /// Item name in English
+ public static string GetItemNameById(int id)
+ {
+ string itemName;
+ if (ItemNames.TryGetValue(id, out itemName))
+ return itemName;
+
+ return null;
+ }
+
+ ///
+ /// Get the english name of a npc
+ ///
+ /// Id of the npc
+ /// Npc name in English
+ public static string GetNpcNameById(int id)
+ {
+ string npcName;
+ if (NpcNames.TryGetValue(id, out npcName))
+ return npcName;
+
+ return null;
+ }
+
+ ///
+ /// Get prefix in English
+ ///
+ /// Prefix Id
+ /// Prefix in English
+ public static string GetPrefixById(int id)
+ {
+ string prefix;
+ if (Prefixs.TryGetValue(id, out prefix))
+ return prefix;
+
+ return null;
+ }
+ }
+}
diff --git a/TShockAPI/PlayerData.cs b/TShockAPI/PlayerData.cs
index 0b6c1ae0..01be0f14 100644
--- a/TShockAPI/PlayerData.cs
+++ b/TShockAPI/PlayerData.cs
@@ -19,6 +19,7 @@ along with this program. If not, see .
using Microsoft.Xna.Framework;
using Terraria;
using TShockAPI;
+using Terraria.Localization;
namespace TShockAPI
{
@@ -340,99 +341,99 @@ namespace TShockAPI
float slot = 0f;
for (int k = 0; k < NetItem.InventorySlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.ArmorSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.DyeSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.MiscEquipSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.MiscDyeSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.PiggySlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.SafeSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
slot++;
}
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].trashItem.name, player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
for (int k = 0; k < NetItem.ForgeSlots; k++)
{
- NetMessage.SendData(5, -1, -1, Main.player[player.Index].bank3.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
+ NetMessage.SendData(5, -1, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
slot++;
}
- NetMessage.SendData(4, -1, -1, player.Name, player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(42, -1, -1, "", player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(16, -1, -1, "", player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(4, -1, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(42, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(16, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
slot = 0f;
for (int k = 0; k < NetItem.InventorySlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].inventory[k].name, player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].inventory[k].Name), player.Index, slot, (float)Main.player[player.Index].inventory[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.ArmorSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].armor[k].name, player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].armor[k].Name), player.Index, slot, (float)Main.player[player.Index].armor[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.DyeSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].dye[k].name, player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].dye[k].Name), player.Index, slot, (float)Main.player[player.Index].dye[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.MiscEquipSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscEquips[k].name, player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscEquips[k].Name), player.Index, slot, (float)Main.player[player.Index].miscEquips[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.MiscDyeSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].miscDyes[k].name, player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].miscDyes[k].Name), player.Index, slot, (float)Main.player[player.Index].miscDyes[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.PiggySlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank.item[k].prefix);
slot++;
}
for (int k = 0; k < NetItem.SafeSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank2.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank2.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank2.item[k].prefix);
slot++;
}
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].trashItem.name, player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].trashItem.Name), player.Index, slot++, (float)Main.player[player.Index].trashItem.prefix);
for (int k = 0; k < NetItem.ForgeSlots; k++)
{
- NetMessage.SendData(5, player.Index, -1, Main.player[player.Index].bank3.item[k].name, player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
+ NetMessage.SendData(5, player.Index, -1, NetworkText.FromLiteral(Main.player[player.Index].bank3.item[k].Name), player.Index, slot, (float)Main.player[player.Index].bank3.item[k].prefix);
slot++;
}
- NetMessage.SendData(4, player.Index, -1, player.Name, player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(42, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(16, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(4, player.Index, -1, NetworkText.FromLiteral(player.Name), player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(42, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(16, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
for (int k = 0; k < 22; k++)
{
@@ -445,13 +446,13 @@ namespace TShockAPI
* This is for when players login via uuid or serverpassword instead of via
* the login command.
*/
- NetMessage.SendData(50, -1, -1, "", player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(50, player.Index, -1, "", player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(50, -1, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
+ NetMessage.SendData(50, player.Index, -1, NetworkText.Empty, player.Index, 0f, 0f, 0f, 0);
- NetMessage.SendData(76, player.Index, -1, "", player.Index);
- NetMessage.SendData(76, -1, -1, "", player.Index);
+ NetMessage.SendData(76, player.Index, -1, NetworkText.Empty, player.Index);
+ NetMessage.SendData(76, -1, -1, NetworkText.Empty, player.Index);
- NetMessage.SendData(39, player.Index, -1, "", 400);
+ NetMessage.SendData(39, player.Index, -1, NetworkText.Empty, 400);
}
}
}
diff --git a/TShockAPI/Rest/RestManager.cs b/TShockAPI/Rest/RestManager.cs
index dfae9256..eace08ee 100644
--- a/TShockAPI/Rest/RestManager.cs
+++ b/TShockAPI/Rest/RestManager.cs
@@ -28,6 +28,7 @@ using HttpServer;
using Rests;
using Terraria;
using TShockAPI.DB;
+using Newtonsoft.Json;
namespace TShockAPI
{
@@ -196,6 +197,7 @@ namespace TShockAPI
}
Rest.RegisterRedirect("/status", "/v2/server/status");
+ Rest.RegisterRedirect("/token/create", "/v2/token/create");
//server commands
Rest.RegisterRedirect("/server/motd", "/v3/server/motd");
@@ -227,7 +229,7 @@ namespace TShockAPI
//player commands
Rest.RegisterRedirect("/lists/players", "/lists/players", "/v2/players/list");
Rest.RegisterRedirect("/players/list", "/v2/players/list");
- Rest.RegisterRedirect("/players/read", "/v3/players/read");
+ Rest.RegisterRedirect("/players/read", "/v3/players/read", "v4/players/read");
Rest.RegisterRedirect("/players/kick", "/v2/players/kick");
Rest.RegisterRedirect("/players/ban", "/v2/players/ban");
Rest.RegisterRedirect("/players/kill", "/v2/players/kill");
@@ -277,6 +279,7 @@ namespace TShockAPI
Rest.Register(new SecureRestCommand("/lists/players", PlayerList));
Rest.Register(new SecureRestCommand("/v2/players/list", PlayerListV2));
Rest.Register(new SecureRestCommand("/v3/players/read", PlayerReadV3, RestPermissions.restuserinfo));
+ Rest.Register(new SecureRestCommand("/v4/players/read", PlayerReadV4, RestPermissions.restuserinfo));
Rest.Register(new SecureRestCommand("/v2/players/kick", PlayerKickV2, RestPermissions.restkick));
Rest.Register(new SecureRestCommand("/v2/players/ban", PlayerBanV2, RestPermissions.restban, RestPermissions.restmanagebans));
Rest.Register(new SecureRestCommand("/v2/players/kill", PlayerKill, RestPermissions.restkill));
@@ -940,9 +943,48 @@ namespace TShockAPI
{"registered", player.User?.Registered},
{"muted", player.mute },
{"position", player.TileX + "," + player.TileY},
- {"inventory", string.Join(", ", inventory.Select(p => (p.name + ":" + p.stack)))},
+ {"inventory", string.Join(", ", inventory.Select(p => (p.Name + ":" + p.stack)))},
{"armor", string.Join(", ", equipment.Select(p => (p.netID + ":" + p.prefix)))},
- {"dyes", string.Join(", ", dyes.Select(p => (p.name)))},
+ {"dyes", string.Join(", ", dyes.Select(p => (p.Name)))},
+ {"buffs", string.Join(", ", player.TPlayer.buffType)}
+ };
+ }
+
+ [Description("Get information for a user.")]
+ [Route("/v4/players/read")]
+ [Permission(RestPermissions.restuserinfo)]
+ [Noun("player", true, "The player to lookup", typeof(String))]
+ [Token]
+ private object PlayerReadV4(RestRequestArgs args)
+ {
+ var ret = PlayerFind(args.Parameters);
+ if (ret is RestObject)
+ {
+ return ret;
+ }
+
+ TSPlayer player = (TSPlayer)ret;
+
+ object items = new
+ {
+ inventory = player.TPlayer.inventory.Where(i => i.active).Select(item => (NetItem)item),
+ equipment = player.TPlayer.armor.Where(i => i.active).Select(item => (NetItem)item),
+ dyes = player.TPlayer.dye.Where(i => i.active).Select(item => (NetItem)item),
+ piggy = player.TPlayer.bank.item.Where(i => i.active).Select(item => (NetItem)item),
+ safe = player.TPlayer.bank2.item.Where(i => i.active).Select(item => (NetItem)item),
+ forge = player.TPlayer.bank3.item.Where(i => i.active).Select(item => (NetItem)item)
+ };
+
+ return new RestObject
+ {
+ {"nickname", player.Name},
+ {"username", player.User?.Name},
+ {"ip", player.IP},
+ {"group", player.Group.Name},
+ {"registered", player.User?.Registered},
+ {"muted", player.mute },
+ {"position", player.TileX + "," + player.TileY},
+ {"items", items},
{"buffs", string.Join(", ", player.TPlayer.buffType)}
};
}
diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs
index 01d7ca54..43f7fe18 100644
--- a/TShockAPI/TSPlayer.cs
+++ b/TShockAPI/TSPlayer.cs
@@ -29,6 +29,7 @@ using OTAPI.Tile;
using Terraria;
using Terraria.DataStructures;
using Terraria.ID;
+using Terraria.Localization;
using TShockAPI.DB;
using TShockAPI.Hooks;
using TShockAPI.Net;
@@ -565,7 +566,7 @@ namespace TShockAPI
{
for (int i = 0; i < 50; i++) //51 is trash can, 52-55 is coins, 56-59 is ammo
{
- if (TPlayer.inventory[i] == null || !TPlayer.inventory[i].active || TPlayer.inventory[i].name == "")
+ if (TPlayer.inventory[i] == null || !TPlayer.inventory[i].active || TPlayer.inventory[i].Name == "")
{
flag = true;
break;
@@ -745,7 +746,7 @@ namespace TShockAPI
SendTileSquare((int) (x/16), (int) (y/16), 15);
TPlayer.Teleport(new Vector2(x, y), style);
- NetMessage.SendData((int)PacketTypes.Teleport, -1, -1, "", 0, TPlayer.whoAmI, x, y, style);
+ NetMessage.SendData((int)PacketTypes.Teleport, -1, -1, NetworkText.Empty, 0, TPlayer.whoAmI, x, y, style);
return true;
}
@@ -755,7 +756,7 @@ namespace TShockAPI
/// Heal health amount.
public void Heal(int health = 600)
{
- NetMessage.SendData((int)PacketTypes.PlayerHealOther, -1, -1, "", this.TPlayer.whoAmI, health);
+ NetMessage.SendData((int)PacketTypes.PlayerHealOther, -1, -1, NetworkText.Empty, this.TPlayer.whoAmI, health);
}
///
@@ -878,7 +879,7 @@ namespace TShockAPI
(TShock.Itembans.ItemIsBanned(name, this) || !TShock.Config.AllowAllowedGroupsToSpawnBannedItems))
return false;
- GiveItem(type,name,width,height,stack,prefix);
+ GiveItem(type, name, width, height, stack, prefix);
return true;
}
@@ -905,8 +906,8 @@ namespace TShockAPI
Main.item[itemid].prefix = (byte) prefix;
Main.item[itemid].noGrabDelay = 1;
Main.item[itemid].velocity = Main.player[this.Index].velocity;
- NetMessage.SendData((int)PacketTypes.ItemDrop, -1, -1, "", itemid, 0f, 0f, 0f);
- NetMessage.SendData((int)PacketTypes.ItemOwner, -1, -1, "", itemid, 0f, 0f, 0f);
+ NetMessage.SendData((int)PacketTypes.ItemDrop, -1, -1, NetworkText.Empty, itemid, 0f, 0f, 0f);
+ NetMessage.SendData((int)PacketTypes.ItemOwner, -1, -1, NetworkText.Empty, itemid, 0f, 0f, 0f);
}
///
@@ -1066,8 +1067,8 @@ namespace TShockAPI
public virtual void SetTeam(int team)
{
Main.player[Index].team = team;
- NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, -1, "", Index);
- NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, Index, "", Index);
+ NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, -1, NetworkText.Empty, Index);
+ NetMessage.SendData((int)PacketTypes.PlayerTeam, -1, Index, NetworkText.Empty, Index);
}
private DateTime LastDisableNotification = DateTime.UtcNow;
@@ -1185,7 +1186,7 @@ namespace TShockAPI
if (RealPlayer && !ConnectionAlive)
return;
- NetMessage.SendData((int) msgType, Index, -1, text, number, number2, number3, number4, number5);
+ NetMessage.SendData((int) msgType, Index, -1, NetworkText.FromLiteral(text), number, number2, number3, number4, number5);
}
///
@@ -1204,7 +1205,7 @@ namespace TShockAPI
if (RealPlayer && !ConnectionAlive)
return;
- NetMessage.SendData((int) msgType, Index, -1, text, ply, number2, number3, number4, number5);
+ NetMessage.SendData((int) msgType, Index, -1, NetworkText.FromFormattable(text), ply, number2, number3, number4, number5);
}
///
diff --git a/TShockAPI/TSServerPlayer.cs b/TShockAPI/TSServerPlayer.cs
index 8c6eac3b..a1084d61 100644
--- a/TShockAPI/TSServerPlayer.cs
+++ b/TShockAPI/TSServerPlayer.cs
@@ -24,6 +24,7 @@ using Terraria;
using Terraria.Utilities;
using TShockAPI;
using TShockAPI.DB;
+using Terraria.Localization;
namespace TShockAPI
{
@@ -152,15 +153,11 @@ namespace TShockAPI
TShock.Utils.GetRandomClearTileWithInRange(startTileX, startTileY, tileXRange, tileYRange, out spawnTileX,
out spawnTileY);
int npcid = NPC.NewNPC(spawnTileX * 16, spawnTileY * 16, type, 0);
- // This is for special slimes
- if (type == 1)
- {
- Main.npc[npcid].SetDefaults(name);
- }
- else
- {
- Main.npc[npcid].netDefaults(type);
- }
+
+ // TODO: If special slimes break look at the git blame for this spot
+ // It's probably because I removed something that didn't work
+ Main.npc[npcid].SetDefaults(type);
+
}
}
@@ -171,7 +168,7 @@ namespace TShockAPI
Main.rand = new UnifiedRandom();
Main.npc[npcid].StrikeNPC(damage, knockBack, hitDirection);
- NetMessage.SendData((int)PacketTypes.NpcStrike, -1, -1, "", npcid, damage, knockBack, hitDirection);
+ NetMessage.SendData((int)PacketTypes.NpcStrike, -1, -1, NetworkText.Empty, npcid, damage, knockBack, hitDirection);
}
public void RevertTiles(Dictionary tiles)
diff --git a/TShockAPI/TShock.cs b/TShockAPI/TShock.cs
index f4d051e1..45aa012e 100644
--- a/TShockAPI/TShock.cs
+++ b/TShockAPI/TShock.cs
@@ -34,6 +34,7 @@ using Newtonsoft.Json;
using Rests;
using Terraria;
using Terraria.ID;
+using Terraria.Localization;
using TerrariaApi.Server;
using TShockAPI.DB;
using TShockAPI.Hooks;
@@ -42,6 +43,7 @@ using Terraria.Utilities;
using Microsoft.Xna.Framework;
using TShockAPI.Sockets;
using TShockAPI.CLI;
+using TShockAPI.Localization;
namespace TShockAPI
{
@@ -49,7 +51,7 @@ namespace TShockAPI
/// This is the TShock main class. TShock is a plugin on the TerrariaServerAPI, so it extends the base TerrariaPlugin.
/// TShock also complies with the API versioning system, and defines its required API version here.
///
- [ApiVersion(2, 0)]
+ [ApiVersion(2, 1)]
public class TShock : TerrariaPlugin
{
/// VersionNum - The version number the TerrariaAPI will return back to the API. We just use the Assembly info.
@@ -355,6 +357,8 @@ namespace TShockAPI
GetDataHandlers.InitGetDataHandler();
Commands.InitCommands();
+ EnglishLanguage.Initialize();
+
if (Config.RestApiEnabled)
RestApi.Start();
@@ -619,7 +623,7 @@ namespace TShockAPI
string path = null;
//Generic method for doing a path sanity check
- Action pathChecker = (p) =>
+ Action pathChecker = (p) =>
{
if (!string.IsNullOrWhiteSpace(p) && p.IndexOfAny(Path.GetInvalidPathChars()) == -1)
{
@@ -708,20 +712,6 @@ namespace TShockAPI
}
})
- .AddFlag("-lang", (l) =>
- {
- int lang;
- if (int.TryParse(l, out lang))
- {
- Lang.lang = lang;
- ServerApi.LogWriter.PluginWriteLine(this, string.Format("Language index set to {0}.", lang), TraceLevel.Verbose);
- }
- else
- {
- ServerApi.LogWriter.PluginWriteLine(this, "Invalid value given for command line argument \"-lang\".", TraceLevel.Warning);
- }
- })
-
.AddFlag("-autocreate", (size) =>
{
if (!string.IsNullOrWhiteSpace(size))
@@ -740,7 +730,7 @@ namespace TShockAPI
.AddFlag("--no-restart", () => NoRestart = true);
CliParser.ParseFromSource(parms);
-
+
/*"-connperip": Todo - Requires an OTAPI modification
{
int limit;
@@ -1094,10 +1084,10 @@ namespace TShockAPI
{
player.Disable(flags: flags);
}
- else if (Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player))
+ else if (Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].Name, player))
{
- player.Disable($"holding banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].name}", flags);
- player.SendErrorMessage($"You are holding a banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].name}");
+ player.Disable($"holding banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].Name}", flags);
+ player.SendErrorMessage($"You are holding a banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].Name}");
}
}
else if (!Main.ServerSideCharacter || (Main.ServerSideCharacter && player.IsLoggedIn))
@@ -1108,7 +1098,7 @@ namespace TShockAPI
if (!player.HasPermission(Permissions.ignorestackhackdetection) && (item.stack > item.maxStack || item.stack < 0) &&
item.type != 0)
{
- check = "Remove item " + item.name + " (" + item.stack + ") exceeds max stack of " + item.maxStack;
+ check = "Remove item " + item.Name + " (" + item.stack + ") exceeds max stack of " + item.maxStack;
player.SendErrorMessage(check);
break;
}
@@ -1118,12 +1108,12 @@ namespace TShockAPI
// Please don't remove this for the time being; without it, players wearing banned equipment will only get debuffed once
foreach (Item item in player.TPlayer.armor)
{
- if (Itembans.ItemIsBanned(item.name, player))
+ if (Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), player))
{
player.SetBuff(BuffID.Frozen, 330, true);
player.SetBuff(BuffID.Stoned, 330, true);
player.SetBuff(BuffID.Webbed, 330, true);
- check = "Remove armor/accessory " + item.name;
+ check = "Remove armor/accessory " + item.Name;
player.SendErrorMessage("You are wearing banned equipment. {0}", check);
break;
@@ -1131,12 +1121,12 @@ namespace TShockAPI
}
foreach (Item item in player.TPlayer.dye)
{
- if (Itembans.ItemIsBanned(item.name, player))
+ if (Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), player))
{
player.SetBuff(BuffID.Frozen, 330, true);
player.SetBuff(BuffID.Stoned, 330, true);
player.SetBuff(BuffID.Webbed, 330, true);
- check = "Remove dye " + item.name;
+ check = "Remove dye " + item.Name;
player.SendErrorMessage("You are wearing banned equipment. {0}", check);
break;
@@ -1144,12 +1134,12 @@ namespace TShockAPI
}
foreach (Item item in player.TPlayer.miscEquips)
{
- if (Itembans.ItemIsBanned(item.name, player))
+ if (Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), player))
{
player.SetBuff(BuffID.Frozen, 330, true);
player.SetBuff(BuffID.Stoned, 330, true);
player.SetBuff(BuffID.Webbed, 330, true);
- check = "Remove misc equip " + item.name;
+ check = "Remove misc equip " + item.Name;
player.SendErrorMessage("You are wearing banned equipment. {0}", check);
break;
@@ -1157,12 +1147,12 @@ namespace TShockAPI
}
foreach (Item item in player.TPlayer.miscDyes)
{
- if (Itembans.ItemIsBanned(item.name, player))
+ if (Itembans.ItemIsBanned(EnglishLanguage.GetItemNameById(item.type), player))
{
player.SetBuff(BuffID.Frozen, 330, true);
player.SetBuff(BuffID.Stoned, 330, true);
player.SetBuff(BuffID.Webbed, 330, true);
- check = "Remove misc dye " + item.name;
+ check = "Remove misc dye " + item.Name;
player.SendErrorMessage("You are wearing banned equipment. {0}", check);
break;
@@ -1174,10 +1164,10 @@ namespace TShockAPI
{
player.Disable(flags: flags);
}
- else if (Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].name, player))
+ else if (Itembans.ItemIsBanned(player.TPlayer.inventory[player.TPlayer.selectedItem].Name, player))
{
- player.Disable($"holding banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].name}", flags);
- player.SendErrorMessage($"You are holding a banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].name}");
+ player.Disable($"holding banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].Name}", flags);
+ player.SendErrorMessage($"You are holding a banned item: {player.TPlayer.inventory[player.TPlayer.selectedItem].Name}");
}
}
@@ -1258,7 +1248,7 @@ namespace TShockAPI
{
if (ShuttingDown)
{
- NetMessage.SendData((int)PacketTypes.Disconnect, args.Who, -1, "Server is shutting down...");
+ NetMessage.SendData((int)PacketTypes.Disconnect, args.Who, -1, NetworkText.FromLiteral("Server is shutting down..."));
args.Handled = true;
return;
}
@@ -1448,17 +1438,38 @@ namespace TShockAPI
return;
}
- if ((args.Text.StartsWith(Config.CommandSpecifier) || args.Text.StartsWith(Config.CommandSilentSpecifier))
- && !string.IsNullOrWhiteSpace(args.Text.Substring(1)))
+ string text = args.Text;
+
+ // Terraria now has chat commands on the client side.
+ // These commands remove the commands prefix (e.g. /me /playing) and send the command id instead
+ // In order for us to keep legacy code we must reverse this and get the prefix using the command id
+ foreach (var item in Terraria.UI.Chat.ChatManager.Commands._localizedCommands)
+ {
+ if (item.Value._name == args.CommandId._name)
+ {
+ if (!String.IsNullOrEmpty(text))
+ {
+ text = item.Key.Value + ' ' + text;
+ }
+ else
+ {
+ text = item.Key.Value;
+ }
+ break;
+ }
+ }
+
+ if ((text.StartsWith(Config.CommandSpecifier) || text.StartsWith(Config.CommandSilentSpecifier))
+ && !string.IsNullOrWhiteSpace(text.Substring(1)))
{
try
{
args.Handled = true;
- if (!Commands.HandleCommand(tsplr, args.Text))
+ if (!Commands.HandleCommand(tsplr, text))
{
// This is required in case anyone makes HandleCommand return false again
tsplr.SendErrorMessage("Unable to parse command. Please contact an administrator for assistance.");
- Log.ConsoleError("Unable to parse command '{0}' from player {1}.", args.Text, tsplr.Name);
+ Log.ConsoleError("Unable to parse command '{0}' from player {1}.", text, tsplr.Name);
}
}
catch (Exception ex)
@@ -1480,7 +1491,7 @@ namespace TShockAPI
}
else if (!TShock.Config.EnableChatAboveHeads)
{
- var text = String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix,
+ text = String.Format(Config.ChatFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix,
args.Text);
Hooks.PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text);
Utils.Broadcast(text, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B);
@@ -1491,18 +1502,22 @@ namespace TShockAPI
Player ply = Main.player[args.Who];
string name = ply.name;
ply.name = String.Format(Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix);
- NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, ply.name, args.Who, 0, 0, 0, 0);
+ NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(ply.name), args.Who, 0, 0, 0, 0);
ply.name = name;
- var text = args.Text;
Hooks.PlayerHooks.OnPlayerChat(tsplr, args.Text, ref text);
- NetMessage.SendData((int)PacketTypes.ChatText, -1, args.Who, text, args.Who, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B);
- NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, name, args.Who, 0, 0, 0, 0);
+
+ Terraria.Net.NetPacket packet = Terraria.GameContent.NetModules.NetTextModule.SerializeServerMessage(
+ NetworkText.FromLiteral(text), new Color(tsplr.Group.R, tsplr.Group.G, tsplr.Group.B), (byte)args.Who
+ );
+ Terraria.Net.NetManager.Instance.Broadcast(packet);
+
+ NetMessage.SendData((int)PacketTypes.PlayerInfo, -1, -1, NetworkText.FromLiteral(name), args.Who, 0, 0, 0, 0);
string msg = String.Format("<{0}> {1}",
String.Format(Config.ChatAboveHeadsFormat, tsplr.Group.Name, tsplr.Group.Prefix, tsplr.Name, tsplr.Group.Suffix),
text);
- tsplr.SendMessage(msg, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B);
+ //tsplr.SendMessage(msg, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B);
TSPlayer.Server.SendMessage(msg, tsplr.Group.R, tsplr.Group.G, tsplr.Group.B);
Log.Info("Broadcast: {0}", msg);
@@ -1989,7 +2004,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, inventory[i].stack),
+ String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.Name, inventory[i].stack),
Color.Cyan);
}
}
@@ -2008,7 +2023,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.name, armor[index].stack),
+ String.Format("Stack cheat detected. Remove armor {0} ({1}) and then rejoin", item.Name, armor[index].stack),
Color.Cyan);
}
}
@@ -2027,7 +2042,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove dye {0} ({1}) and then rejoin", item.name, dye[index].stack),
+ String.Format("Stack cheat detected. Remove dye {0} ({1}) and then rejoin", item.Name, dye[index].stack),
Color.Cyan);
}
}
@@ -2046,7 +2061,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.name, miscEquips[index].stack),
+ String.Format("Stack cheat detected. Remove item {0} ({1}) and then rejoin", item.Name, miscEquips[index].stack),
Color.Cyan);
}
}
@@ -2065,7 +2080,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove item dye {0} ({1}) and then rejoin", item.name, miscDyes[index].stack),
+ String.Format("Stack cheat detected. Remove item dye {0} ({1}) and then rejoin", item.Name, miscDyes[index].stack),
Color.Cyan);
}
}
@@ -2085,7 +2100,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove Piggy-bank item {0} ({1}) and then rejoin", item.name, piggy[index].stack),
+ String.Format("Stack cheat detected. Remove Piggy-bank item {0} ({1}) and then rejoin", item.Name, piggy[index].stack),
Color.Cyan);
}
}
@@ -2105,7 +2120,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove Safe item {0} ({1}) and then rejoin", item.name, safe[index].stack),
+ String.Format("Stack cheat detected. Remove Safe item {0} ({1}) and then rejoin", item.Name, safe[index].stack),
Color.Cyan);
}
}
@@ -2124,7 +2139,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove trash item {0} ({1}) and then rejoin", item.name, trash.stack),
+ String.Format("Stack cheat detected. Remove trash item {0} ({1}) and then rejoin", item.Name, trash.stack),
Color.Cyan);
}
}
@@ -2144,7 +2159,7 @@ namespace TShockAPI
{
check = true;
player.SendMessage(
- String.Format("Stack cheat detected. Remove Defender's Forge item {0} ({1}) and then rejoin", item.name, forge[index].stack),
+ String.Format("Stack cheat detected. Remove Defender's Forge item {0} ({1}) and then rejoin", item.Name, forge[index].stack),
Color.Cyan);
}
}
diff --git a/TShockAPI/TShockAPI.csproj b/TShockAPI/TShockAPI.csproj
index 9f610078..9bf2ebd9 100644
--- a/TShockAPI/TShockAPI.csproj
+++ b/TShockAPI/TShockAPI.csproj
@@ -94,6 +94,7 @@
+
diff --git a/TShockAPI/Utils.cs b/TShockAPI/Utils.cs
index df0c8a72..520bed9c 100644
--- a/TShockAPI/Utils.cs
+++ b/TShockAPI/Utils.cs
@@ -17,21 +17,20 @@ along with this program. If not, see .
*/
using System;
-using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Sockets;
-using System.Security.Cryptography;
using System.Text;
using System.Text.RegularExpressions;
using Terraria;
using Terraria.ID;
using Terraria.Utilities;
using TShockAPI.DB;
-using BCrypt.Net;
using Microsoft.Xna.Framework;
+using Terraria.Localization;
+using TShockAPI.Localization;
namespace TShockAPI
{
@@ -344,16 +343,33 @@ namespace TShockAPI
{
var found = new List();
Item item = new Item();
- string nameLower = name.ToLower();
- for (int i = -48; i < Main.maxItemTypes; i++)
+ string nameLower = name.ToLowerInvariant();
+ var checkEnglish = Language.ActiveCulture != GameCulture.English;
+
+ for (int i = 1; i < Main.maxItemTypes; i++)
{
item.netDefaults(i);
- if (String.IsNullOrWhiteSpace(item.name))
+ if (!String.IsNullOrWhiteSpace(item.Name))
+ {
+ if (item.Name.ToLowerInvariant() == nameLower)
+ return new List { item };
+ if (item.Name.ToLowerInvariant().StartsWith(nameLower))
+ found.Add(item.Clone());
+ }
+
+ if (!checkEnglish)
+ {
continue;
- if (item.name.ToLower() == nameLower)
- return new List { item };
- if (item.name.ToLower().StartsWith(nameLower))
- found.Add(item.Clone());
+ }
+
+ string englishName = EnglishLanguage.GetItemNameById(i).ToLowerInvariant();
+ if (!String.IsNullOrEmpty(englishName))
+ {
+ if (englishName == nameLower)
+ return new List { item };
+ if (englishName.StartsWith(nameLower))
+ found.Add(item.Clone());
+ }
}
return found;
}
@@ -403,7 +419,7 @@ namespace TShockAPI
public NPC GetNPCById(int id)
{
NPC npc = new NPC();
- npc.netDefaults(id);
+ npc.SetDefaults(id);
return npc;
}
@@ -416,13 +432,17 @@ namespace TShockAPI
{
var found = new List();
NPC npc = new NPC();
- string nameLower = name.ToLower();
+ string nameLower = name.ToLowerInvariant();
for (int i = -17; i < Main.maxNPCTypes; i++)
{
- npc.netDefaults(i);
- if (npc.name.ToLower() == nameLower || npc.displayName.ToLower() == nameLower)
+ string englishName = EnglishLanguage.GetNpcNameById(i).ToLowerInvariant();
+
+ npc.SetDefaults(i);
+ if (npc.FullName.ToLowerInvariant() == nameLower || npc.TypeName.ToLowerInvariant() == nameLower
+ || nameLower == englishName)
return new List { npc };
- if (npc.name.ToLower().StartsWith(nameLower) || npc.displayName.ToLower().StartsWith(nameLower))
+ if (npc.FullName.ToLowerInvariant().StartsWith(nameLower) || npc.TypeName.ToLowerInvariant().StartsWith(nameLower)
+ || englishName?.StartsWith(nameLower) == true)
found.Add((NPC)npc.Clone());
}
return found;
@@ -435,7 +455,7 @@ namespace TShockAPI
/// name
public string GetBuffName(int id)
{
- return (id > 0 && id < Main.maxBuffTypes) ? Main.buffName[id] : "null";
+ return (id > 0 && id < Main.maxBuffTypes) ? Lang.GetBuffName(id) : "null";
}
///
@@ -445,7 +465,7 @@ namespace TShockAPI
/// description
public string GetBuffDescription(int id)
{
- return (id > 0 && id < Main.maxBuffTypes) ? Main.buffTip[id] : "null";
+ return (id > 0 && id < Main.maxBuffTypes) ? Lang.GetBuffName(id) : "null";
}
///
@@ -459,14 +479,14 @@ namespace TShockAPI
string buffname;
for (int i = 1; i < Main.maxBuffTypes; i++)
{
- buffname = Main.buffName[i];
+ buffname = Lang.GetBuffName(i);
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower() == nameLower)
return new List {i};
}
var found = new List();
for (int i = 1; i < Main.maxBuffTypes; i++)
{
- buffname = Main.buffName[i];
+ buffname = Lang.GetBuffName(i);
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower().StartsWith(nameLower))
found.Add(i);
}
@@ -480,7 +500,7 @@ namespace TShockAPI
/// Prefix name
public string GetPrefixById(int id)
{
- return id < FirstItemPrefix || id > LastItemPrefix ? "" : Lang.prefix[id] ?? "";
+ return id < FirstItemPrefix || id > LastItemPrefix ? "" : Lang.prefix[id].ToString() ?? "";
}
///
@@ -492,15 +512,16 @@ namespace TShockAPI
{
Item item = new Item();
item.SetDefaults(0);
- string lowerName = name.ToLower();
+ string lowerName = name.ToLowerInvariant();
var found = new List();
for (int i = FirstItemPrefix; i <= LastItemPrefix; i++)
{
item.prefix = (byte)i;
- string prefixName = item.AffixName().Trim().ToLower();
- if (prefixName == lowerName)
+ string prefixName = item.AffixName().Trim().ToLowerInvariant();
+ string englishName = EnglishLanguage.GetPrefixById(i).ToLowerInvariant();
+ if (prefixName == lowerName || englishName == lowerName)
return new List() { i };
- else if (prefixName.StartsWith(lowerName)) // Partial match
+ else if (prefixName.StartsWith(lowerName) || englishName?.StartsWith(lowerName) == true) // Partial match
found.Add(i);
}
return found;
@@ -848,8 +869,13 @@ namespace TShockAPI
/// An enumerable list with the matches
public void SendMultipleMatchError(TSPlayer ply, IEnumerable