Use same logic for all GetByNameOrId
NPC, Item, Prefix, Buff
This commit is contained in:
parent
d38046d74b
commit
1ee8058776
2 changed files with 132 additions and 73 deletions
|
|
@ -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,6 +60,11 @@ 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)))
|
||||||
{
|
{
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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 (!string.IsNullOrEmpty(currentName))
|
||||||
|
{
|
||||||
|
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)
|
if (startswith.Count != 1)
|
||||||
{
|
startswith.AddRange(contains);
|
||||||
continue;
|
return startswith.Select(GetItemById).ToList();
|
||||||
}
|
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <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);
|
||||||
}
|
}
|
||||||
return found;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
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))
|
||||||
|
{
|
||||||
|
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
|
||||||
return new List<int> { i };
|
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>();
|
currentName = EnglishLanguage.GetBuffNameById(i);
|
||||||
for (int i = 1; i < Main.maxBuffTypes; i++)
|
if (!string.IsNullOrWhiteSpace(currentName))
|
||||||
{
|
{
|
||||||
buffname = Lang.GetBuffName(i);
|
if (currentName.Equals(name, StringComparison.InvariantCultureIgnoreCase))
|
||||||
if (!String.IsNullOrWhiteSpace(buffname) && buffname.ToLower().StartsWith(nameLower))
|
return new List<int> { i };
|
||||||
found.Add(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>
|
||||||
|
|
@ -449,21 +473,35 @@ 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);
|
||||||
}
|
}
|
||||||
return found;
|
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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (startswith.Count != 1)
|
||||||
|
startswith.AddRange(contains);
|
||||||
|
return startswith;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue