Skip to content

Commit

Permalink
Merge pull request #2791 from sgkoishi/patch-buffnpc-i18nconsistency
Browse files Browse the repository at this point in the history
Use same logic for all GetByNameOrId
  • Loading branch information
hakusaro authored Nov 27, 2022
2 parents 6421c76 + e498d66 commit 106f735
Show file tree
Hide file tree
Showing 3 changed files with 137 additions and 77 deletions.
26 changes: 24 additions & 2 deletions TShockAPI/Localization/EnglishLanguage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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/>.
*/

using System;
using System;
using System.Collections.Generic;
using System.Linq;
using Terraria;
Expand All @@ -35,6 +35,8 @@ public static class EnglishLanguage

private static readonly Dictionary<int, string> Prefixs = new Dictionary<int, string>();

private static readonly Dictionary<int, string> Buffs = new Dictionary<int, string>();

internal static void Initialize()
{
var culture = Language.ActiveCulture;
Expand All @@ -58,10 +60,16 @@ internal static void Initialize()
NpcNames.Add(i, Lang.GetNPCNameValue(i));
}

for (var i = 0; i < Terraria.ID.BuffID.Count; i++)
{
Buffs.Add(i, Lang.GetBuffName(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);
var i = (int)field.GetValue(null);
Prefixs.Add(i, Lang.prefix[i].Value);
}
}
finally
Expand Down Expand Up @@ -114,5 +122,19 @@ public static string GetPrefixById(int id)

return null;
}

/// <summary>
/// Get buff name in English
/// </summary>
/// <param name="id">Buff Id</param>
/// <returns>Buff name in English</returns>
public static string GetBuffNameById(int id)
{
string buff;
if (Buffs.TryGetValue(id, out buff))
return buff;

return null;
}
}
}
186 changes: 112 additions & 74 deletions TShockAPI/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public class Utils
private static readonly Utils instance = new Utils();

/// <summary>Utils - Creates a utilities object.</summary>
private Utils() {}
private Utils() { }

/// <summary>Instance - An instance of the utils class.</summary>
/// <value>value - the Utils instance</value>
Expand Down Expand Up @@ -210,8 +210,8 @@ public void GetRandomClearTileWithInRange(int startTileX, int startTileY, int ti
tileY = startTileY;
break;
}
tileX = startTileX + r.Next(tileXRange*-1, tileXRange);
tileY = startTileY + r.Next(tileYRange*-1, tileYRange);
tileX = startTileX + r.Next(tileXRange * -1, tileXRange);
tileY = startTileY + r.Next(tileYRange * -1, tileYRange);
j++;
} while (TilePlacementValid(tileX, tileY) && TileSolid(tileX, tileY));
}
Expand Down Expand Up @@ -253,7 +253,7 @@ public List<Item> GetItemByIdOrName(string text)
{
if (type >= Terraria.ID.ItemID.Count)
return new List<Item>();
return new List<Item> {GetItemById(type)};
return new List<Item> { GetItemById(type) };
}
Item item = GetItemFromTag(text);
if (item != null)
Expand All @@ -280,37 +280,35 @@ public Item GetItemById(int id)
/// <returns>List of Items</returns>
public List<Item> GetItemByName(string name)
{
var found = new List<Item>();
Item item = new Item();
string nameLower = name.ToLowerInvariant();
var checkEnglish = Language.ActiveCulture != GameCulture.FromCultureName(GameCulture.CultureName.English);

for (int i = 1; i < Terraria.ID.ItemID.Count; i++)
var startswith = new List<int>();
var contains = new List<int>();
for (int i = 1; i < ItemID.Count; i++)
{
item.netDefaults(i);
if (!String.IsNullOrWhiteSpace(item.Name))
var currentName = Lang.GetItemNameValue(i);
if (!string.IsNullOrEmpty(currentName))
{
if (item.Name.ToLowerInvariant() == nameLower)
return new List<Item> { item };
if (item.Name.ToLowerInvariant().StartsWith(nameLower))
found.Add(item.Clone());
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<Item> { GetItemById(i) };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}

if (!checkEnglish)
{
continue;
}

string englishName = EnglishLanguage.GetItemNameById(i).ToLowerInvariant();
if (!String.IsNullOrEmpty(englishName))
currentName = EnglishLanguage.GetItemNameById(i);
if (!string.IsNullOrEmpty(currentName))
{
if (englishName == nameLower)
return new List<Item> { item };
if (englishName.StartsWith(nameLower))
found.Add(item.Clone());
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<Item> { GetItemById(i) };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
}
return found;

if (startswith.Count != 1)
startswith.AddRange(contains);
return startswith.Select(GetItemById).ToList();
}

/// <summary>
Expand Down Expand Up @@ -369,22 +367,35 @@ public NPC GetNPCById(int id)
/// <returns>List of matching NPCs</returns>
public List<NPC> GetNPCByName(string name)
{
var found = new List<NPC>();
NPC npc = new NPC();
string nameLower = name.ToLowerInvariant();
for (int i = -17; i < Terraria.ID.NPCID.Count; i++)
var startswith = new List<int>();
var contains = new List<int>();
for (int i = -17; i < NPCID.Count; i++)
{
string englishName = EnglishLanguage.GetNpcNameById(i).ToLowerInvariant();

npc.SetDefaults(i);
if (npc.FullName.ToLowerInvariant() == nameLower || npc.TypeName.ToLowerInvariant() == nameLower
|| nameLower == englishName)
return new List<NPC> { npc };
if (npc.FullName.ToLowerInvariant().StartsWith(nameLower) || npc.TypeName.ToLowerInvariant().StartsWith(nameLower)
|| englishName?.StartsWith(nameLower) == true)
found.Add((NPC)npc.Clone());
var currentName = Lang.GetNPCNameValue(i);
if (!string.IsNullOrEmpty(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<NPC> { GetNPCById(i) };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
currentName = EnglishLanguage.GetNpcNameById(i);
if (!string.IsNullOrEmpty(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<NPC> { GetNPCById(i) };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
}
return found;

if (startswith.Count != 1)
startswith.AddRange(contains);
return startswith.Select(GetNPCById).ToList();
}

/// <summary>
Expand Down Expand Up @@ -414,22 +425,35 @@ public string GetBuffDescription(int id)
/// <returns>Matching list of buff ids</returns>
public List<int> GetBuffByName(string name)
{
string nameLower = name.ToLower();
string buffname;
for (int i = 1; i < Terraria.ID.BuffID.Count; i++)
var startswith = new List<int>();
var contains = new List<int>();
for (int i = 1; i < BuffID.Count; i++)
{
buffname = Lang.GetBuffName(i);
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower() == nameLower)
return new List<int> {i};
}
var found = new List<int>();
for (int i = 1; i < Terraria.ID.BuffID.Count; i++)
{
buffname = Lang.GetBuffName(i);
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower().StartsWith(nameLower))
found.Add(i);
var currentName = Lang.GetBuffName(i);
if (!string.IsNullOrWhiteSpace(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<int> { i };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
currentName = EnglishLanguage.GetBuffNameById(i);
if (!string.IsNullOrWhiteSpace(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<int> { i };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
}
return found;

if (startswith.Count != 1)
startswith.AddRange(contains);
return startswith;
}

/// <summary>
Expand All @@ -449,24 +473,38 @@ public string GetPrefixById(int id)
/// <returns>List of prefix IDs</returns>
public List<int> GetPrefixByName(string name)
{
Item item = new Item();
item.SetDefaults(0);
string lowerName = name.ToLowerInvariant();
var found = new List<int>();
var startswith = new List<int>();
var contains = new List<int>();
for (int i = FirstItemPrefix; i <= LastItemPrefix; i++)
{
item.prefix = (byte)i;
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) || englishName?.StartsWith(lowerName) == true) // Partial match
found.Add(i);
var currentName = Lang.prefix[i].ToString();
if (!string.IsNullOrWhiteSpace(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<int> { i };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
currentName = EnglishLanguage.GetPrefixById(i);
if (!string.IsNullOrWhiteSpace(currentName))
{
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<int> { i };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
}
}
return found;

if (startswith.Count != 1)
startswith.AddRange(contains);
return startswith;
}

/// <summary>
/// <summary>
/// Gets a prefix by ID or name
/// </summary>
/// <param name="idOrName">ID or name</param>
Expand All @@ -476,7 +514,7 @@ public List<int> GetPrefixByIdOrName(string idOrName)
int type = -1;
if (int.TryParse(idOrName, out type) && type >= FirstItemPrefix && type <= LastItemPrefix)
{
return new List<int> {type};
return new List<int> { type };
}
return GetPrefixByName(idOrName);
}
Expand Down Expand Up @@ -961,7 +999,7 @@ public void Dump(bool exit = true)

internal void PrepareLangForDump()
{
for(int i = 0; i < Main.recipe.Length; i++)
for (int i = 0; i < Main.recipe.Length; i++)
Main.recipe[i] = new Recipe();
}

Expand Down Expand Up @@ -993,12 +1031,12 @@ internal void DumpPermissionMatrix(string path)
foreach (var field in typeof(Permissions).GetFields().OrderBy(f => f.Name))
{
output.Append("|[[");
output.Append((string) field.GetValue(null));
output.Append((string)field.GetValue(null));
output.Append("]]|");

foreach (Group g in TShock.Groups.groups)
{
if (g.HasPermission((string) field.GetValue(null)))
if (g.HasPermission((string)field.GetValue(null)))
{
output.Append("✔|");
}
Expand Down
2 changes: 1 addition & 1 deletion docs/changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Use past tense when adding new entries; sign your name off when you add or chang
* If there is no section called "Upcoming changes" below this line, please add one with `## Upcoming changes` as the first line, and then a bulleted item directly after with the first change. -->

## Upcoming changes
* Your changes could be here!
* Updated the Utils.FindByIdOrName to follow same logic. Now fuzzy match fallback to `StartsWith` and then `Contains`. (@sgkoishi)

## TShock 5.1.3
* Added support for Terraria 1.4.4.9 via OTAPI 3.1.20. (@SignatureBeef)
Expand Down

0 comments on commit 106f735

Please sign in to comment.