Use same logic for all GetByNameOrId

NPC, Item, Prefix, Buff
This commit is contained in:
SGKoishi 2022-11-02 14:31:00 -07:00
parent d38046d74b
commit 1ee8058776
No known key found for this signature in database
GPG key ID: 8FFC399070653828
2 changed files with 132 additions and 73 deletions

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.Linq; using System.Linq;
using Terraria; using Terraria;
@ -35,6 +35,8 @@ namespace TShockAPI.Localization
private static readonly Dictionary<int, string> Prefixs = new Dictionary<int, string>(); 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() internal static void Initialize()
{ {
var culture = Language.ActiveCulture; var culture = Language.ActiveCulture;
@ -58,10 +60,15 @@ namespace TShockAPI.Localization
NpcNames.Add(i, Lang.GetNPCNameValue(i)); NpcNames.Add(i, Lang.GetNPCNameValue(i));
} }
for (var i = -17; i < Main.maxBuffTypes; i++)
{
Buffs.Add(i, Lang.GetBuffName(i));
}
foreach (var field in typeof(Main).Assembly.GetType("Terraria.ID.PrefixID") foreach (var field in typeof(Main).Assembly.GetType("Terraria.ID.PrefixID")
.GetFields().Where(f => !f.Name.Equals("Count", StringComparison.Ordinal))) .GetFields().Where(f => !f.Name.Equals("Count", StringComparison.Ordinal)))
{ {
Prefixs.Add((int) field.GetValue(null), field.Name); Prefixs.Add((int)field.GetValue(null), field.Name);
} }
} }
finally finally
@ -114,5 +121,19 @@ namespace TShockAPI.Localization
return null; 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;
}
} }
} }

View file

@ -81,7 +81,7 @@ namespace TShockAPI
private static readonly Utils instance = new Utils(); private static readonly Utils instance = new Utils();
/// <summary>Utils - Creates a utilities object.</summary> /// <summary>Utils - Creates a utilities object.</summary>
private Utils() {} private Utils() { }
/// <summary>Instance - An instance of the utils class.</summary> /// <summary>Instance - An instance of the utils class.</summary>
/// <value>value - the Utils instance</value> /// <value>value - the Utils instance</value>
@ -210,8 +210,8 @@ namespace TShockAPI
tileY = startTileY; tileY = startTileY;
break; break;
} }
tileX = startTileX + r.Next(tileXRange*-1, tileXRange); tileX = startTileX + r.Next(tileXRange * -1, tileXRange);
tileY = startTileY + r.Next(tileYRange*-1, tileYRange); tileY = startTileY + r.Next(tileYRange * -1, tileYRange);
j++; j++;
} while (TilePlacementValid(tileX, tileY) && TileSolid(tileX, tileY)); } while (TilePlacementValid(tileX, tileY) && TileSolid(tileX, tileY));
} }
@ -253,7 +253,7 @@ namespace TShockAPI
{ {
if (type >= Main.maxItemTypes) if (type >= Main.maxItemTypes)
return new List<Item>(); return new List<Item>();
return new List<Item> {GetItemById(type)}; return new List<Item> { GetItemById(type) };
} }
Item item = GetItemFromTag(text); Item item = GetItemFromTag(text);
if (item != null) if (item != null)
@ -280,37 +280,35 @@ namespace TShockAPI
/// <returns>List of Items</returns> /// <returns>List of Items</returns>
public List<Item> GetItemByName(string name) public List<Item> GetItemByName(string name)
{ {
var found = new List<Item>(); var startswith = new List<int>();
Item item = new Item(); var contains = new List<int>();
string nameLower = name.ToLowerInvariant();
var checkEnglish = Language.ActiveCulture != GameCulture.FromCultureName(GameCulture.CultureName.English);
for (int i = 1; i < Main.maxItemTypes; i++) for (int i = 1; i < Main.maxItemTypes; i++)
{ {
item.netDefaults(i); var currentName = Lang.GetItemNameValue(i);
if (!String.IsNullOrWhiteSpace(item.Name)) if (!string.IsNullOrEmpty(currentName))
{ {
if (item.Name.ToLowerInvariant() == nameLower) if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<Item> { item }; return new List<Item> { GetItemById(i) };
if (item.Name.ToLowerInvariant().StartsWith(nameLower)) if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
found.Add(item.Clone()); startswith.Add(i);
else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
contains.Add(i);
} }
currentName = EnglishLanguage.GetItemNameById(i);
if (!checkEnglish) if (!string.IsNullOrEmpty(currentName))
{ {
continue; if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
} return new List<Item> { GetItemById(i) };
if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
string englishName = EnglishLanguage.GetItemNameById(i).ToLowerInvariant(); startswith.Add(i);
if (!String.IsNullOrEmpty(englishName)) else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
{ contains.Add(i);
if (englishName == nameLower)
return new List<Item> { item };
if (englishName.StartsWith(nameLower))
found.Add(item.Clone());
} }
} }
return found;
if (startswith.Count != 1)
startswith.AddRange(contains);
return startswith.Select(GetItemById).ToList();
} }
/// <summary> /// <summary>
@ -369,22 +367,35 @@ namespace TShockAPI
/// <returns>List of matching NPCs</returns> /// <returns>List of matching NPCs</returns>
public List<NPC> GetNPCByName(string name) public List<NPC> GetNPCByName(string name)
{ {
var found = new List<NPC>(); var startswith = new List<int>();
NPC npc = new NPC(); var contains = new List<int>();
string nameLower = name.ToLowerInvariant();
for (int i = -17; i < Main.maxNPCTypes; i++) for (int i = -17; i < Main.maxNPCTypes; i++)
{ {
string englishName = EnglishLanguage.GetNpcNameById(i).ToLowerInvariant(); var currentName = Lang.GetNPCNameValue(i);
if (!string.IsNullOrEmpty(currentName))
npc.SetDefaults(i); {
if (npc.FullName.ToLowerInvariant() == nameLower || npc.TypeName.ToLowerInvariant() == nameLower if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
|| nameLower == englishName) return new List<NPC> { GetNPCById(i) };
return new List<NPC> { npc }; if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
if (npc.FullName.ToLowerInvariant().StartsWith(nameLower) || npc.TypeName.ToLowerInvariant().StartsWith(nameLower) startswith.Add(i);
|| englishName?.StartsWith(nameLower) == true) else if (currentName.Contains(name, StringComparison.InvariantCultureIgnoreCase))
found.Add((NPC)npc.Clone()); 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> /// <summary>
@ -414,22 +425,35 @@ namespace TShockAPI
/// <returns>Matching list of buff ids</returns> /// <returns>Matching list of buff ids</returns>
public List<int> GetBuffByName(string name) public List<int> GetBuffByName(string name)
{ {
string nameLower = name.ToLower(); var startswith = new List<int>();
string buffname; var contains = new List<int>();
for (int i = 1; i < Main.maxBuffTypes; i++) for (int i = 1; i < Main.maxBuffTypes; i++)
{ {
buffname = Lang.GetBuffName(i); var currentName = Lang.GetBuffName(i);
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower() == nameLower) if (!string.IsNullOrWhiteSpace(currentName))
return new List<int> {i}; {
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);
}
} }
var found = new List<int>();
for (int i = 1; i < Main.maxBuffTypes; i++) if (startswith.Count != 1)
{ startswith.AddRange(contains);
buffname = Lang.GetBuffName(i); return startswith;
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower().StartsWith(nameLower))
found.Add(i);
}
return found;
} }
/// <summary> /// <summary>
@ -449,24 +473,38 @@ namespace TShockAPI
/// <returns>List of prefix IDs</returns> /// <returns>List of prefix IDs</returns>
public List<int> GetPrefixByName(string name) public List<int> GetPrefixByName(string name)
{ {
Item item = new Item(); var startswith = new List<int>();
item.SetDefaults(0); var contains = new List<int>();
string lowerName = name.ToLowerInvariant();
var found = new List<int>();
for (int i = FirstItemPrefix; i <= LastItemPrefix; i++) for (int i = FirstItemPrefix; i <= LastItemPrefix; i++)
{ {
item.prefix = (byte)i; var currentName = Lang.prefix[i].ToString();
string prefixName = item.AffixName().Trim().ToLowerInvariant(); if (!string.IsNullOrWhiteSpace(currentName))
string englishName = EnglishLanguage.GetPrefixById(i).ToLowerInvariant(); {
if (prefixName == lowerName || englishName == lowerName) if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
return new List<int>() { i }; return new List<int> { i };
else if (prefixName.StartsWith(lowerName) || englishName?.StartsWith(lowerName) == true) // Partial match if (currentName.StartsWith(name, StringComparison.InvariantCultureIgnoreCase))
found.Add(i); 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 /// Gets a prefix by ID or name
/// </summary> /// </summary>
/// <param name="idOrName">ID or name</param> /// <param name="idOrName">ID or name</param>
@ -476,7 +514,7 @@ namespace TShockAPI
int type = -1; int type = -1;
if (int.TryParse(idOrName, out type) && type >= FirstItemPrefix && type <= LastItemPrefix) if (int.TryParse(idOrName, out type) && type >= FirstItemPrefix && type <= LastItemPrefix)
{ {
return new List<int> {type}; return new List<int> { type };
} }
return GetPrefixByName(idOrName); return GetPrefixByName(idOrName);
} }
@ -961,7 +999,7 @@ namespace TShockAPI
internal void PrepareLangForDump() 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(); Main.recipe[i] = new Recipe();
} }
@ -993,12 +1031,12 @@ namespace TShockAPI
foreach (var field in typeof(Permissions).GetFields().OrderBy(f => f.Name)) foreach (var field in typeof(Permissions).GetFields().OrderBy(f => f.Name))
{ {
output.Append("|[["); output.Append("|[[");
output.Append((string) field.GetValue(null)); output.Append((string)field.GetValue(null));
output.Append("]]|"); output.Append("]]|");
foreach (Group g in TShock.Groups.groups) foreach (Group g in TShock.Groups.groups)
{ {
if (g.HasPermission((string) field.GetValue(null))) if (g.HasPermission((string)field.GetValue(null)))
{ {
output.Append("✔|"); output.Append("✔|");
} }