Merge pull request #1426 from mistzzt/t-1.3.5

Add Localization support
This commit is contained in:
Lucas Nicodemus 2017-04-22 10:01:34 -06:00 committed by GitHub
commit 36538caa43
6 changed files with 159 additions and 33 deletions

View file

@ -34,6 +34,7 @@ using TShockAPI.Hooks;
using Terraria.GameContent.Events;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
using TShockAPI.Localization;
namespace TShockAPI
{
@ -2534,12 +2535,16 @@ namespace TShockAPI
var matches = new List<NPC>();
foreach (var npc in Main.npc.Where(npc => npc.active))
{
if (string.Equals(npc.FullName, 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> { npc };
break;
}
if (npc.FullName.ToLower().StartsWith(npcStr.ToLower()))
if (npc.FullName.ToLowerInvariant().StartsWith(npcStr.ToLowerInvariant()) ||
englishName?.StartsWith(npcStr, StringComparison.InvariantCultureIgnoreCase) == true)
matches.Add(npc);
}
@ -3207,7 +3212,7 @@ namespace TShockAPI
}
else
{
TShock.Itembans.AddNewBan(items[0].Name);
TShock.Itembans.AddNewBan(EnglishLanguage.GetItemNameById(items[0].type));
args.Player.SendSuccessMessage("Banned " + items[0].Name + ".");
}
}
@ -3239,7 +3244,7 @@ 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);
@ -3247,7 +3252,7 @@ namespace TShockAPI
}
if (!ban.AllowedGroups.Contains(args.Parameters[2]))
{
TShock.Itembans.AllowGroup(items[0].Name, args.Parameters[2]);
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
@ -3278,7 +3283,7 @@ namespace TShockAPI
}
else
{
TShock.Itembans.RemoveBan(items[0].Name);
TShock.Itembans.RemoveBan(EnglishLanguage.GetItemNameById(items[0].type));
args.Player.SendSuccessMessage("Unbanned " + items[0].Name + ".");
}
}
@ -3310,7 +3315,7 @@ 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);
@ -3318,7 +3323,7 @@ namespace TShockAPI
}
if (ban.AllowedGroups.Contains(args.Parameters[2]))
{
TShock.Itembans.RemoveGroup(items[0].Name, args.Parameters[2]);
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
@ -5292,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());
@ -5431,7 +5436,7 @@ 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));

View file

@ -35,6 +35,7 @@ using Terraria.GameContent.Tile_Entities;
using Terraria.Localization;
using Microsoft.Xna.Framework;
using OTAPI.Tile;
using TShockAPI.Localization;
namespace TShockAPI
{
@ -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;
}
@ -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;
@ -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.");

View file

@ -0,0 +1,100 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Terraria;
using Terraria.Localization;
namespace TShockAPI.Localization
{
/// <summary>
/// Provides a series of methods that give English texts
/// </summary>
public static class EnglishLanguage
{
private static readonly Dictionary<int, string> ItemNames = new Dictionary<int, string>();
private static readonly Dictionary<int, string> NpcNames = new Dictionary<int, string>();
private static readonly Dictionary<int, string> Prefixs = new Dictionary<int, string>();
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);
}
}
}
/// <summary>
/// Get the english name of an item
/// </summary>
/// <param name="id">Id of the item</param>
/// <returns>Item name in English</returns>
public static string GetItemNameById(int id)
{
string itemName;
if (ItemNames.TryGetValue(id, out itemName))
return itemName;
return null;
}
/// <summary>
/// Get the english name of a npc
/// </summary>
/// <param name="id">Id of the npc</param>
/// <returns>Npc name in English</returns>
public static string GetNpcNameById(int id)
{
string npcName;
if (NpcNames.TryGetValue(id, out npcName))
return npcName;
return null;
}
/// <summary>
/// Get prefix in English
/// </summary>
/// <param name="id">Prefix Id</param>
/// <returns>Prefix in English</returns>
public static string GetPrefixById(int id)
{
string prefix;
if (Prefixs.TryGetValue(id, out prefix))
return prefix;
return null;
}
}
}

View file

@ -43,6 +43,7 @@ using Terraria.Utilities;
using Microsoft.Xna.Framework;
using TShockAPI.Sockets;
using TShockAPI.CLI;
using TShockAPI.Localization;
namespace TShockAPI
{
@ -356,6 +357,8 @@ namespace TShockAPI
GetDataHandlers.InitGetDataHandler();
Commands.InitCommands();
EnglishLanguage.Initialize();
if (Config.RestApiEnabled)
RestApi.Start();
@ -620,7 +623,7 @@ namespace TShockAPI
string path = null;
//Generic method for doing a path sanity check
Action<string> pathChecker = (p) =>
Action<string> pathChecker = (p) =>
{
if (!string.IsNullOrWhiteSpace(p) && p.IndexOfAny(Path.GetInvalidPathChars()) == -1)
{
@ -733,7 +736,7 @@ namespace TShockAPI
.AddFlag("--no-restart", () => NoRestart = true);
CliParser.ParseFromSource(parms);
/*"-connperip": Todo - Requires an OTAPI modification
{
int limit;
@ -1111,7 +1114,7 @@ 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);
@ -1124,7 +1127,7 @@ 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);
@ -1137,7 +1140,7 @@ 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);
@ -1150,7 +1153,7 @@ 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);

View file

@ -94,6 +94,7 @@
<Compile Include="Hooks\PlayerHooks.cs" />
<Compile Include="Hooks\RegionHooks.cs" />
<Compile Include="ILog.cs" />
<Compile Include="Localization\EnglishLanguage.cs" />
<Compile Include="NetItem.cs" />
<Compile Include="PlayerData.cs" />
<Compile Include="Sockets\LinuxTcpSocket.cs" />

View file

@ -32,6 +32,7 @@ using Terraria.Utilities;
using TShockAPI.DB;
using BCrypt.Net;
using Microsoft.Xna.Framework;
using TShockAPI.Localization;
namespace TShockAPI
{
@ -344,16 +345,26 @@ namespace TShockAPI
{
var found = new List<Item>();
Item item = new Item();
string nameLower = name.ToLower();
string nameLower = name.ToLowerInvariant();
for (int i = -48; i < Main.maxItemTypes; i++)
{
item.netDefaults(i);
if (String.IsNullOrWhiteSpace(item.Name))
continue;
if (item.Name.ToLower() == nameLower)
return new List<Item> { item };
if (item.Name.ToLower().StartsWith(nameLower))
found.Add(item.Clone());
if (!String.IsNullOrWhiteSpace(item.Name))
{
if (item.Name.ToLowerInvariant() == nameLower)
return new List<Item> { item };
if (item.Name.ToLowerInvariant().StartsWith(nameLower))
found.Add(item.Clone());
}
string englishName = EnglishLanguage.GetItemNameById(i).ToLowerInvariant();
if (!String.IsNullOrEmpty(englishName))
{
if (englishName == nameLower)
return new List<Item> { item };
if (englishName.StartsWith(nameLower))
found.Add(item.Clone());
}
}
return found;
}
@ -416,13 +427,17 @@ namespace TShockAPI
{
var found = new List<NPC>();
NPC npc = new NPC();
string nameLower = name.ToLower();
string nameLower = name.ToLowerInvariant();
for (int i = -17; i < Main.maxNPCTypes; i++)
{
string englishName = EnglishLanguage.GetNpcNameById(i).ToLowerInvariant();
npc.SetDefaults(i);
if (npc.FullName.ToLower() == nameLower || npc.TypeName.ToLower() == nameLower)
if (npc.FullName.ToLowerInvariant() == nameLower || npc.TypeName.ToLowerInvariant() == nameLower
|| nameLower == englishName)
return new List<NPC> { npc };
if (npc.FullName.ToLower().StartsWith(nameLower) || npc.TypeName.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;
@ -492,15 +507,16 @@ namespace TShockAPI
{
Item item = new Item();
item.SetDefaults(0);
string lowerName = name.ToLower();
string lowerName = name.ToLowerInvariant();
var found = new List<int>();
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<int>() { i };
else if (prefixName.StartsWith(lowerName)) // Partial match
else if (prefixName.StartsWith(lowerName) || englishName?.StartsWith(lowerName) == true) // Partial match
found.Add(i);
}
return found;