diff --git a/Projects/Server/AssemblyHandler.cs b/Projects/Server/AssemblyHandler.cs index f21d05f60..30730f4e2 100644 --- a/Projects/Server/AssemblyHandler.cs +++ b/Projects/Server/AssemblyHandler.cs @@ -90,35 +90,32 @@ namespace Server return m_TypeCaches[asm] = new TypeCache(asm); } - private static bool IgnoreCaseTypeComparer(string name, Type type) => - type.FullName.InsensitiveEquals(name) || type.Name.InsensitiveEquals(name); - - private static bool CaseTypeComparer(string name, Type type) => - type.FullName.EqualsOrdinal(name) || type.Name.EqualsOrdinal(name); - - public static Type FindFirstTypeForName(string name, bool ignoreCase = false, Func predicate = null) + public static Type FindTypeByFullName(string name, bool ignoreCase = true) { if (string.IsNullOrWhiteSpace(name)) { return null; } - var types = FindTypesByName(name, ignoreCase); - - if (types.Count == 0) + if (ignoreCase) { - return null; + name = name.ToLower(); } - // Try to find the closest match if there is no predicate. - // Check for exact match of the FullName or Name - // Then check for case-insensitive match of FullName or Name - // Otherwise just return the first entry - predicate ??= ignoreCase ? IgnoreCaseTypeComparer : CaseTypeComparer; - - foreach (var type in types) + for (var i = 0; i < Assemblies.Length; i++) { - if (predicate(name, type)) + foreach (var type in GetTypeCache(Assemblies[i]).GetEnumerator(name, ignoreCase)) + { + if (type.FullName.EqualsOrdinal(name)) + { + return type; + } + } + } + + foreach(var type in GetTypeCache(Core.Assembly).GetEnumerator(name, ignoreCase)) + { + if (type.FullName.EqualsOrdinal(name)) { return type; } @@ -127,7 +124,36 @@ namespace Server return null; } - public static List FindTypesByName(string name, bool ignoreCase = false) + public static Type FindTypeByName(string name, bool ignoreCase = true) + { + if (string.IsNullOrWhiteSpace(name)) + { + return null; + } + + if (ignoreCase) + { + name = name.ToLower(); + } + + for (var i = 0; i < Assemblies.Length; i++) + { + foreach (var type in GetTypeCache(Assemblies[i]).GetEnumerator(name, ignoreCase)) + { + return type; + } + } + + foreach(var type in GetTypeCache(Core.Assembly).GetEnumerator(name, ignoreCase)) + { + return type; + } + + return null; + } + + // TODO: Change to IEnumerable using another custom enumerator + public static List FindTypesByFullName(string name, bool ignoreCase = true) { var types = new List(); @@ -138,20 +164,49 @@ namespace Server for (var i = 0; i < Assemblies.Length; i++) { - foreach (var type in GetTypeCache(Assemblies[i])[name]) + foreach (var type in GetTypeCache(Assemblies[i]).GetEnumerator(name, ignoreCase)) + { + if (type.FullName.EqualsOrdinal(name)) + { + types.Add(type); + } + } + } + + foreach(var type in GetTypeCache(Core.Assembly).GetEnumerator(name, ignoreCase)) + { + if (type.FullName.EqualsOrdinal(name)) { types.Add(type); } } - if (types.Count == 0) + return types; + } + + // TODO: Change to IEnumerable using another custom enumerator + public static List FindTypesByName(string name, bool ignoreCase = true) + { + var types = new List(); + + if (ignoreCase) { - foreach(var type in GetTypeCache(Core.Assembly)[name]) + name = name.ToLower(); + } + + for (var i = 0; i < Assemblies.Length; i++) + { + foreach (var type in GetTypeCache(Assemblies[i]).GetEnumerator(name, ignoreCase)) { types.Add(type); } } + foreach(var type in GetTypeCache(Core.Assembly).GetEnumerator(name, ignoreCase)) + { + types.Add(type); + } + return types; } @@ -166,52 +221,64 @@ namespace Server public class TypeCache { - private readonly Dictionary m_NameMap = new(); + private readonly Dictionary _nameMap = new(); + private readonly Dictionary _nameMapInsensitive = new(); public TypeCache(Assembly asm) { Types = asm?.GetTypes() ?? Type.EmptyTypes; var nameMap = new Dictionary>(); - HashSet refs; - Action addToRefs = (index, key) => + var nameMapInsensitive = new Dictionary>(); + + void addToRefs(int index, string key, Dictionary> map) { - if (nameMap.TryGetValue(key, out refs)) + if (key == null) + { + return; + } + + if (map.TryGetValue(key, out var refs)) { refs.Add(index); } else { refs = new HashSet { index }; - nameMap.Add(key, refs); + map.Add(key, refs); } - }; + } var aliasType = typeof(TypeAliasAttribute); for (var i = 0; i < Types.Length; i++) { var current = Types[i]; - addToRefs(i, current.Name); - addToRefs(i, current.Name.ToLower()); - addToRefs(i, current.FullName); - addToRefs(i, current.FullName?.ToLower()); + addToRefs(i, current.Name, nameMap); + addToRefs(i, current.Name.ToLower(), nameMapInsensitive); + addToRefs(i, current.FullName, nameMap); + addToRefs(i, current.FullName?.ToLower(), nameMapInsensitive); if (current.GetCustomAttribute(aliasType, false) is TypeAliasAttribute alias) { for (var j = 0; j < alias.Aliases.Length; j++) { - addToRefs(i, alias.Aliases[j]); - addToRefs(i, alias.Aliases[j].ToLower()); + addToRefs(i, alias.Aliases[j], nameMap); + addToRefs(i, alias.Aliases[j], nameMapInsensitive); } } } foreach (var (key, value) in nameMap) { - m_NameMap[key] = value.ToArray(); + _nameMap[key] = value.ToArray(); + } + + foreach (var (key, value) in nameMapInsensitive) + { + _nameMapInsensitive[key] = value.ToArray(); } } - public Enumerator this[string name] => new(name, this); + public Enumerator GetEnumerator(string name, bool ignoreCase) => new(name, this, ignoreCase); public Type[] Types { get; } @@ -222,10 +289,12 @@ namespace Server private int _index; private Type _current; - internal Enumerator(string name, TypeCache cache) + internal Enumerator(string name, TypeCache cache, bool ignoreCase) { _cache = cache; - _values = !cache.m_NameMap.TryGetValue(name, out var values) ? Array.Empty() : values; + + var map = ignoreCase ? _cache._nameMap : _cache._nameMapInsensitive; + _values = map.TryGetValue(name, out var values) ? values : Array.Empty(); _index = 0; _current = default; } @@ -274,7 +343,7 @@ namespace Server public IEnumerator GetEnumerator() => this; - IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => this; } } } diff --git a/Projects/Server/ClientVersion.cs b/Projects/Server/ClientVersion.cs index 31d7a025a..af257456f 100644 --- a/Projects/Server/ClientVersion.cs +++ b/Projects/Server/ClientVersion.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Runtime.CompilerServices; using Server.Buffers; namespace Server @@ -163,7 +164,8 @@ namespace Server public static bool operator <(ClientVersion l, ClientVersion r) => Compare(l, r) < 0; - public override int GetHashCode() => Major ^ Minor ^ Revision ^ Patch ^ (int)Type; + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int GetHashCode() => HashCode.Combine(Major, Minor, Revision, Patch, Type); public override bool Equals(object obj) { diff --git a/Projects/Server/Collections/ArrayEnumerator.cs b/Projects/Server/Collections/ArrayEnumerator.cs new file mode 100644 index 000000000..d3feb7ddf --- /dev/null +++ b/Projects/Server/Collections/ArrayEnumerator.cs @@ -0,0 +1,79 @@ +/************************************************************************* + * ModernUO * + * Copyright (C) 2019-2021 - ModernUO Development Team * + * Email: hi@modernuo.com * + * File: ArrayEnumerator.cs * + * * + * This program is free software: you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation, either version 3 of the License, or * + * (at your option) any later version. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see . * + *************************************************************************/ + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Server.Collections +{ + /// + /// Non-thread safe, non-guarded enumerator for classes that have internal arrays. + /// Recommended to copy this and use it as a nested struct. + /// Recommend adding version checking to properly guard against modification during enumeration. + /// + /// + public struct ArrayEnumerator : IEnumerator + { + private readonly T[] _array; + private int _index; + private T? _current; + + public ArrayEnumerator(T[] array) + { + _array = array; + _index = 0; + _current = default; + } + + public void Dispose() + { + } + + public bool MoveNext() + { + T[] localList = _array; + + if ((uint)_index < (uint)localList.Length) + { + _current = _array[_index++]; + return true; + } + + return false; + } + + public T? Current => _current!; + + object IEnumerator.Current + { + get + { + if (_index == 0 || _index == _array.Length + 1) + { + throw new InvalidOperationException(nameof(_index)); + } + + return _current; + } + } + + void IEnumerator.Reset() + { + _index = 0; + _current = default; + } + } +} diff --git a/Projects/Server/Collections/OrderedHashSet.cs b/Projects/Server/Collections/OrderedHashSet.cs index d738b8035..9781688c9 100644 --- a/Projects/Server/Collections/OrderedHashSet.cs +++ b/Projects/Server/Collections/OrderedHashSet.cs @@ -609,7 +609,7 @@ namespace Server.Collections public struct Enumerator : IEnumerator { - private readonly OrderedHashSet _OrderedHashSet; + private readonly OrderedHashSet _orderedHashSet; private readonly int _version; private int _index; private TValue _current; @@ -618,10 +618,10 @@ namespace Server.Collections object IEnumerator.Current => _current; - internal Enumerator(OrderedHashSet OrderedHashSet) + internal Enumerator(OrderedHashSet orderedHashSet) { - _OrderedHashSet = OrderedHashSet; - _version = OrderedHashSet._version; + _orderedHashSet = orderedHashSet; + _version = orderedHashSet._version; _index = 0; _current = default; } @@ -632,14 +632,14 @@ namespace Server.Collections public bool MoveNext() { - if (_version != _OrderedHashSet._version) + if (_version != _orderedHashSet._version) { throw new InvalidOperationException(InvalidOperation_EnumFailedVersion); } - if (_index < _OrderedHashSet.Count) + if (_index < _orderedHashSet.Count) { - Entry entry = _OrderedHashSet._entries[_index]; + Entry entry = _orderedHashSet._entries[_index]; _current = entry.Value; ++_index; return true; @@ -650,7 +650,7 @@ namespace Server.Collections void IEnumerator.Reset() { - if (_version != _OrderedHashSet._version) + if (_version != _orderedHashSet._version) { throw new InvalidOperationException(InvalidOperation_EnumFailedVersion); } diff --git a/Projects/Server/Json/Converters/TypeConverter.cs b/Projects/Server/Json/Converters/TypeConverter.cs index 02f4fb397..13189aaf5 100644 --- a/Projects/Server/Json/Converters/TypeConverter.cs +++ b/Projects/Server/Json/Converters/TypeConverter.cs @@ -28,7 +28,7 @@ namespace Server.Json throw new JsonException("The JSON value could not be converted to System.Type"); } - return AssemblyHandler.FindFirstTypeForName(reader.GetString()); + return AssemblyHandler.FindTypeByName(reader.GetString()); } public override void Write(Utf8JsonWriter writer, Type value, JsonSerializerOptions options) => diff --git a/Projects/Server/Mobiles/Body.cs b/Projects/Server/Mobiles/Body.cs index 7fee53a41..53bb24f79 100644 --- a/Projects/Server/Mobiles/Body.cs +++ b/Projects/Server/Mobiles/Body.cs @@ -1,5 +1,6 @@ using System; using System.IO; +using System.Runtime.CompilerServices; namespace Server { @@ -130,6 +131,7 @@ namespace Server public override string ToString() => $"0x{BodyID:X}"; + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() => BodyID.GetHashCode(); public override bool Equals(object o) => o is Body b && b.BodyID == BodyID; diff --git a/Projects/Server/Regions/RegionLoader.cs b/Projects/Server/Regions/RegionLoader.cs index 74345b746..da55b5f64 100644 --- a/Projects/Server/Regions/RegionLoader.cs +++ b/Projects/Server/Regions/RegionLoader.cs @@ -38,7 +38,7 @@ namespace Server foreach (var json in regions) { - var type = AssemblyHandler.FindFirstTypeForName(json.Type); + var type = AssemblyHandler.FindTypeByName(json.Type); if (type == null || !typeof(Region).IsAssignableFrom(type)) { diff --git a/Projects/Server/Serial.cs b/Projects/Server/Serial.cs index 484cd71cd..94ae0f2cb 100644 --- a/Projects/Server/Serial.cs +++ b/Projects/Server/Serial.cs @@ -1,4 +1,5 @@ using System; +using System.Runtime.CompilerServices; namespace Server { @@ -17,6 +18,7 @@ namespace Server public bool IsValid => Value > 0; + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() => Value.GetHashCode(); public int CompareTo(Serial other) => Value.CompareTo(other.Value); diff --git a/Projects/Server/Skills.cs b/Projects/Server/Skills.cs index 650146859..4de41edc4 100644 --- a/Projects/Server/Skills.cs +++ b/Projects/Server/Skills.cs @@ -805,9 +805,9 @@ namespace Server [CommandProperty(AccessLevel.Counselor)] public Skill Throwing => this[SkillName.Throwing]; - public Enumerator GetEnumerator() => new(this); - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); - IEnumerator IEnumerable.GetEnumerator() => new Enumerator(this); + public Enumerator GetEnumerator() => new(m_Skills); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); public override string ToString() => "..."; @@ -898,11 +898,11 @@ namespace Server public struct Enumerator : IEnumerator { - private readonly Skills _skills; + private readonly Skill[] _skills; private int _index; private Skill _current; - internal Enumerator(Skills skills) + internal Enumerator(Skill[] skills) { _skills = skills; _index = 0; @@ -915,11 +915,11 @@ namespace Server public bool MoveNext() { - Skills localList = _skills; + Skill[] localList = _skills; while ((uint)_index < (uint)localList.Length) { - _current = localList.m_Skills[_index++]; + _current = _skills[_index++]; if (_current != null) { return true; diff --git a/Projects/Server/World/World.cs b/Projects/Server/World/World.cs index 1f4c7b76c..e30306bcc 100644 --- a/Projects/Server/World/World.cs +++ b/Projects/Server/World/World.cs @@ -191,7 +191,7 @@ namespace Server { var typeName = tdbReader.ReadString(); - var t = AssemblyHandler.FindFirstTypeForName(typeName); + var t = AssemblyHandler.FindTypeByFullName(typeName, false); if (t?.IsAbstract != false) { diff --git a/Projects/UOContent/Accounting/Firewall.cs b/Projects/UOContent/Accounting/Firewall.cs index 3b79c333e..b00b74cf5 100644 --- a/Projects/UOContent/Accounting/Firewall.cs +++ b/Projects/UOContent/Accounting/Firewall.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.IO; using System.Net; +using System.Runtime.CompilerServices; using Microsoft.Toolkit.HighPerformance.Extensions; namespace Server @@ -155,6 +156,7 @@ namespace Server }; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() => m_Address.GetHashCode(); } @@ -198,7 +200,8 @@ namespace Server return false; } - public override int GetHashCode() => m_CIDRPrefix.GetHashCode() ^ m_CIDRLength.GetHashCode(); + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override int GetHashCode() => HashCode.Combine(m_CIDRPrefix, m_CIDRLength); } public class WildcardIPFirewallEntry : IFirewallEntry @@ -223,6 +226,7 @@ namespace Server return obj is WildcardIPFirewallEntry entry && m_Entry == entry.m_Entry; } + [MethodImpl(MethodImplOptions.AggressiveInlining)] public override int GetHashCode() => m_Entry.GetHashCode(StringComparison.Ordinal); } } diff --git a/Projects/UOContent/Commands/Generic/Commands/Commands.cs b/Projects/UOContent/Commands/Generic/Commands/Commands.cs index c0fac740c..6f7ecbf27 100644 --- a/Projects/UOContent/Commands/Generic/Commands/Commands.cs +++ b/Projects/UOContent/Commands/Generic/Commands/Commands.cs @@ -523,7 +523,7 @@ namespace Server.Commands.Generic { if (e.Length >= 1) { - var t = AssemblyHandler.FindFirstTypeForName(e.GetString(0)); + var t = AssemblyHandler.FindTypeByName(e.GetString(0)); if (t == null) { diff --git a/Projects/UOContent/Commands/Generic/Extensions/Compilers/DistinctCompiler.cs b/Projects/UOContent/Commands/Generic/Extensions/Compilers/DistinctCompiler.cs index 63c403d01..f64d1e62a 100644 --- a/Projects/UOContent/Commands/Generic/Extensions/Compilers/DistinctCompiler.cs +++ b/Projects/UOContent/Commands/Generic/Extensions/Compilers/DistinctCompiler.cs @@ -188,9 +188,8 @@ namespace Server.Commands.Generic var active = emitter.Active; - var getHashCode = active.GetMethod("GetHashCode", Type.EmptyTypes); - - getHashCode ??= typeof(T).GetMethod("GetHashCode", Type.EmptyTypes); + var getHashCode = active.GetMethod("GetHashCode", Type.EmptyTypes) + ?? typeof(T).GetMethod("GetHashCode", Type.EmptyTypes); if (active != typeof(int)) { diff --git a/Projects/UOContent/Commands/Generic/Implementors/ObjectConditional.cs b/Projects/UOContent/Commands/Generic/Implementors/ObjectConditional.cs index 474fe66d4..9778da75b 100644 --- a/Projects/UOContent/Commands/Generic/Implementors/ObjectConditional.cs +++ b/Projects/UOContent/Commands/Generic/Implementors/ObjectConditional.cs @@ -103,7 +103,7 @@ namespace Server.Commands.Generic return Empty; } - var objectType = AssemblyHandler.FindFirstTypeForName(args[offset], true); + var objectType = AssemblyHandler.FindTypeByName(args[offset]); if (objectType == null) { diff --git a/Projects/UOContent/Commands/Object Creation/Add.cs b/Projects/UOContent/Commands/Object Creation/Add.cs index 5c2eddb9b..5a9491c1b 100644 --- a/Projects/UOContent/Commands/Object Creation/Add.cs +++ b/Projects/UOContent/Commands/Object Creation/Add.cs @@ -111,7 +111,7 @@ namespace Server.Commands } } - var type = AssemblyHandler.FindFirstTypeForName(name); + var type = AssemblyHandler.FindTypeByName(name); if (!IsEntity(type)) { @@ -296,7 +296,7 @@ namespace Server.Commands if (IsType(type)) { - return AssemblyHandler.FindFirstTypeForName(value); + return AssemblyHandler.FindTypeByName(value); } if (IsParsable(type)) diff --git a/Projects/UOContent/Commands/Object Creation/Categorization.cs b/Projects/UOContent/Commands/Object Creation/Categorization.cs index 6481b5557..e916ee39a 100644 --- a/Projects/UOContent/Commands/Object Creation/Categorization.cs +++ b/Projects/UOContent/Commands/Object Creation/Categorization.cs @@ -330,7 +330,7 @@ namespace Server.Commands for (var i = 0; i < split.Length; ++i) { - var type = AssemblyHandler.FindFirstTypeForName(split[i].Trim()); + var type = AssemblyHandler.FindTypeByName(split[i].Trim()); if (type == null) { diff --git a/Projects/UOContent/Commands/Object Creation/Decorate.cs b/Projects/UOContent/Commands/Object Creation/Decorate.cs index 58ccc5d7c..ece83ef5f 100644 --- a/Projects/UOContent/Commands/Object Creation/Decorate.cs +++ b/Projects/UOContent/Commands/Object Creation/Decorate.cs @@ -1265,7 +1265,7 @@ namespace Server.Commands var indexOf = line.IndexOfOrdinal(' '); - list.m_Type = AssemblyHandler.FindFirstTypeForName(line.Substring(0, indexOf++), true); + list.m_Type = AssemblyHandler.FindTypeByName(line.Substring(0, indexOf++)); if (list.m_Type == null) { diff --git a/Projects/UOContent/Commands/Object Creation/DecorateMag.cs b/Projects/UOContent/Commands/Object Creation/DecorateMag.cs index 2c25319b4..41bd5ef75 100644 --- a/Projects/UOContent/Commands/Object Creation/DecorateMag.cs +++ b/Projects/UOContent/Commands/Object Creation/DecorateMag.cs @@ -1252,7 +1252,7 @@ namespace Server.Commands var indexOf = line.IndexOfOrdinal(' '); - list.m_Type = AssemblyHandler.FindFirstTypeForName(line.Substring(0, indexOf++), true); + list.m_Type = AssemblyHandler.FindTypeByName(line.Substring(0, indexOf++)); if (list.m_Type == null) { diff --git a/Projects/UOContent/Commands/Profiling.cs b/Projects/UOContent/Commands/Profiling.cs index f6ff93610..fe32c4f93 100644 --- a/Projects/UOContent/Commands/Profiling.cs +++ b/Projects/UOContent/Commands/Profiling.cs @@ -320,7 +320,7 @@ namespace Server.Commands for (var i = 0; i < count; ++i) { - types.Add(AssemblyHandler.FindFirstTypeForName(bin.ReadString())); + types.Add(AssemblyHandler.FindTypeByFullName(bin.ReadString())); } } diff --git a/Projects/UOContent/Commands/Properties.cs b/Projects/UOContent/Commands/Properties.cs index 7d2ce7715..b889d8422 100644 --- a/Projects/UOContent/Commands/Properties.cs +++ b/Projects/UOContent/Commands/Properties.cs @@ -456,7 +456,7 @@ namespace Server.Commands { try { - toSet = AssemblyHandler.FindFirstTypeForName(value); + toSet = AssemblyHandler.FindTypeByName(value); if (toSet == null) { diff --git a/Projects/UOContent/Engines/Bulk Orders/Books/BOBLargeSubEntry.cs b/Projects/UOContent/Engines/Bulk Orders/Books/BOBLargeSubEntry.cs index f6e7f6cef..c818c5f2a 100644 --- a/Projects/UOContent/Engines/Bulk Orders/Books/BOBLargeSubEntry.cs +++ b/Projects/UOContent/Engines/Bulk Orders/Books/BOBLargeSubEntry.cs @@ -24,7 +24,7 @@ namespace Server.Engines.BulkOrders if (type != null) { - ItemType = AssemblyHandler.FindFirstTypeForName(type); + ItemType = AssemblyHandler.FindTypeByFullName(type); } AmountCur = reader.ReadEncodedInt(); diff --git a/Projects/UOContent/Engines/Bulk Orders/Books/BOBSmallEntry.cs b/Projects/UOContent/Engines/Bulk Orders/Books/BOBSmallEntry.cs index 85b6dcffa..919cd72a6 100644 --- a/Projects/UOContent/Engines/Bulk Orders/Books/BOBSmallEntry.cs +++ b/Projects/UOContent/Engines/Bulk Orders/Books/BOBSmallEntry.cs @@ -37,7 +37,7 @@ namespace Server.Engines.BulkOrders if (type != null) { - ItemType = AssemblyHandler.FindFirstTypeForName(type); + ItemType = AssemblyHandler.FindTypeByFullName(type); } RequireExceptional = reader.ReadBool(); diff --git a/Projects/UOContent/Engines/Bulk Orders/LargeBulkEntry.cs b/Projects/UOContent/Engines/Bulk Orders/LargeBulkEntry.cs index c1823d68b..a639c1427 100644 --- a/Projects/UOContent/Engines/Bulk Orders/LargeBulkEntry.cs +++ b/Projects/UOContent/Engines/Bulk Orders/LargeBulkEntry.cs @@ -25,7 +25,7 @@ namespace Server.Engines.BulkOrders if (type != null) { - realType = AssemblyHandler.FindFirstTypeForName(type); + realType = AssemblyHandler.FindTypeByFullName(type); } Details = new SmallBulkEntry(realType, reader.ReadInt(), reader.ReadInt()); diff --git a/Projects/UOContent/Engines/Bulk Orders/SmallBOD.cs b/Projects/UOContent/Engines/Bulk Orders/SmallBOD.cs index ad43797a0..15cb5d622 100644 --- a/Projects/UOContent/Engines/Bulk Orders/SmallBOD.cs +++ b/Projects/UOContent/Engines/Bulk Orders/SmallBOD.cs @@ -219,7 +219,7 @@ namespace Server.Engines.BulkOrders if (type != null) { - Type = AssemblyHandler.FindFirstTypeForName(type); + Type = AssemblyHandler.FindTypeByFullName(type); } m_Number = reader.ReadInt(); diff --git a/Projects/UOContent/Engines/Bulk Orders/SmallBulkEntry.cs b/Projects/UOContent/Engines/Bulk Orders/SmallBulkEntry.cs index 3d76aa1c7..61be20293 100644 --- a/Projects/UOContent/Engines/Bulk Orders/SmallBulkEntry.cs +++ b/Projects/UOContent/Engines/Bulk Orders/SmallBulkEntry.cs @@ -76,7 +76,7 @@ namespace Server.Engines.BulkOrders if (split.Length >= 2) { - var type = AssemblyHandler.FindFirstTypeForName(split[0]); + var type = AssemblyHandler.FindTypeByName(split[0]); var graphic = Utility.ToInt32(split[^1]); if (type != null && graphic > 0) diff --git a/Projects/UOContent/Engines/Doom/GauntletSpawner.cs b/Projects/UOContent/Engines/Doom/GauntletSpawner.cs index 68f83efdd..2400f6641 100644 --- a/Projects/UOContent/Engines/Doom/GauntletSpawner.cs +++ b/Projects/UOContent/Engines/Doom/GauntletSpawner.cs @@ -321,7 +321,7 @@ namespace Server.Engines.Doom return; } - var type = AssemblyHandler.FindFirstTypeForName(TypeName, true); + var type = AssemblyHandler.FindTypeByName(TypeName); if (type == null) { diff --git a/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs b/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs index 6402b040e..c4bc27740 100644 --- a/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs +++ b/Projects/UOContent/Engines/ML Quests/Items/Teleporters.cs @@ -101,7 +101,7 @@ namespace Server.Engines.MLQuests.Items if (typeName != null) { - m_QuestType = AssemblyHandler.FindFirstTypeForName(typeName); + m_QuestType = AssemblyHandler.FindTypeByFullName(typeName); } Message = TextDefinition.Deserialize(reader); @@ -195,7 +195,7 @@ namespace Server.Engines.MLQuests.Items writer.Write(0); // version - writer.Write(m_TicketType != null ? m_TicketType.FullName : null); + writer.Write( m_TicketType?.FullName); TextDefinition.Serialize(writer, Message); } @@ -209,7 +209,7 @@ namespace Server.Engines.MLQuests.Items if (typeName != null) { - m_TicketType = AssemblyHandler.FindFirstTypeForName(typeName); + m_TicketType = AssemblyHandler.FindTypeByFullName(typeName); } Message = TextDefinition.Deserialize(reader); diff --git a/Projects/UOContent/Engines/ML Quests/MLQuestSystem.cs b/Projects/UOContent/Engines/ML Quests/MLQuestSystem.cs index ca9a6968c..658ac3a58 100644 --- a/Projects/UOContent/Engines/ML Quests/MLQuestSystem.cs +++ b/Projects/UOContent/Engines/ML Quests/MLQuestSystem.cs @@ -51,7 +51,7 @@ namespace Server.Engines.MLQuests var split = line.Split('\t'); - var type = AssemblyHandler.FindFirstTypeForName(split[0]); + var type = AssemblyHandler.FindTypeByName(split[0]); if (type == null || !baseQuestType.IsAssignableFrom(type)) { @@ -87,7 +87,7 @@ namespace Server.Engines.MLQuests for (var i = 1; i < split.Length; ++i) { - var questerType = AssemblyHandler.FindFirstTypeForName(split[i]); + var questerType = AssemblyHandler.FindTypeByName(split[i]); if (questerType == null || !baseQuesterType.IsAssignableFrom(questerType)) { @@ -190,7 +190,7 @@ namespace Server.Engines.MLQuests return; } - var index = AssemblyHandler.FindFirstTypeForName(e.GetString(0)); + var index = AssemblyHandler.FindTypeByName(e.GetString(0)); if (index == null || !Quests.TryGetValue(index, out var quest)) { @@ -216,7 +216,7 @@ namespace Server.Engines.MLQuests return; } - var index = AssemblyHandler.FindFirstTypeForName(e.GetString(0)); + var index = AssemblyHandler.FindTypeByName(e.GetString(0)); if (index == null || !Quests.TryGetValue(index, out var quest)) { @@ -773,7 +773,7 @@ namespace Server.Engines.MLQuests return null; // not serialized } - var questType = AssemblyHandler.FindFirstTypeForName(typeName); + var questType = AssemblyHandler.FindTypeByFullName(typeName); if (questType == null) { diff --git a/Projects/UOContent/Engines/Quests/Core/QuestSerializer.cs b/Projects/UOContent/Engines/Quests/Core/QuestSerializer.cs index 03b9a1862..a5c01dfb4 100644 --- a/Projects/UOContent/Engines/Quests/Core/QuestSerializer.cs +++ b/Projects/UOContent/Engines/Quests/Core/QuestSerializer.cs @@ -70,7 +70,7 @@ namespace Server.Engines.Quests return null; } - return AssemblyHandler.FindFirstTypeForName(fullName); + return AssemblyHandler.FindTypeByFullName(fullName); } } } diff --git a/Projects/UOContent/Engines/Spawners/BaseSpawner.cs b/Projects/UOContent/Engines/Spawners/BaseSpawner.cs index 4a4ce4c7f..bce623678 100644 --- a/Projects/UOContent/Engines/Spawners/BaseSpawner.cs +++ b/Projects/UOContent/Engines/Spawners/BaseSpawner.cs @@ -567,7 +567,7 @@ namespace Server.Engines.Spawners // Defrag taken care of in Spawn(), beforehand // Count check taken care of in Spawn(), beforehand - var type = AssemblyHandler.FindFirstTypeForName(entry.SpawnedName); + var type = AssemblyHandler.FindTypeByName(entry.SpawnedName); if (type == null) { @@ -1027,7 +1027,7 @@ namespace Server.Engines.Spawners Entries[i].SpawnedName = typeName; } - if (AssemblyHandler.FindFirstTypeForName(typeName) == null) + if (AssemblyHandler.FindTypeByName(typeName) == null) { m_WarnTimer ??= new WarnTimer(); @@ -1055,7 +1055,7 @@ namespace Server.Engines.Spawners for (var j = 0; j < Entries.Count; j++) { - if (AssemblyHandler.FindFirstTypeForName(Entries[j].SpawnedName) == e.GetType()) + if (AssemblyHandler.FindTypeByName(Entries[j].SpawnedName) == e.GetType()) { Entries[j].Spawned.Add(e); Spawned.Add(e, Entries[j]); diff --git a/Projects/UOContent/Engines/Spawners/GenerateSpawners.cs b/Projects/UOContent/Engines/Spawners/GenerateSpawners.cs index 5e57de968..69de6c662 100644 --- a/Projects/UOContent/Engines/Spawners/GenerateSpawners.cs +++ b/Projects/UOContent/Engines/Spawners/GenerateSpawners.cs @@ -67,7 +67,7 @@ namespace Server.Engines.Spawners for (var i = 0; i < spawners.Count; i++) { var json = spawners[i]; - var type = AssemblyHandler.FindFirstTypeForName(json.Type); + var type = AssemblyHandler.FindTypeByName(json.Type); if (type == null || !typeof(BaseSpawner).IsAssignableFrom(type)) { diff --git a/Projects/UOContent/Engines/Spawners/SpawnerGump.cs b/Projects/UOContent/Engines/Spawners/SpawnerGump.cs index 4cddc8a0b..c1d075037 100644 --- a/Projects/UOContent/Engines/Spawners/SpawnerGump.cs +++ b/Projects/UOContent/Engines/Spawners/SpawnerGump.cs @@ -194,7 +194,7 @@ namespace Server.Engines.Spawners if (str.Length > 0) { - var type = AssemblyHandler.FindFirstTypeForName(str); + var type = AssemblyHandler.FindTypeByName(str); if (type == null) { diff --git a/Projects/UOContent/Items/Talismans/TalismanAttribute.cs b/Projects/UOContent/Items/Talismans/TalismanAttribute.cs index 8bbe2f8d0..cfcc0f9c4 100644 --- a/Projects/UOContent/Items/Talismans/TalismanAttribute.cs +++ b/Projects/UOContent/Items/Talismans/TalismanAttribute.cs @@ -34,7 +34,7 @@ namespace Server.Items if (GetSaveFlag(flags, SaveFlag.Type)) { - Type = AssemblyHandler.FindFirstTypeForName(reader.ReadString()); + Type = AssemblyHandler.FindTypeByFullName(reader.ReadString()); } if (GetSaveFlag(flags, SaveFlag.Name)) diff --git a/Projects/UOContent/Regions/GuardedRegion.cs b/Projects/UOContent/Regions/GuardedRegion.cs index b00e940e3..c1f4c0115 100644 --- a/Projects/UOContent/Regions/GuardedRegion.cs +++ b/Projects/UOContent/Regions/GuardedRegion.cs @@ -27,7 +27,7 @@ namespace Server.Regions { if (json.GetProperty("guardsType", options, out string guardType)) { - m_GuardType = AssemblyHandler.FindFirstTypeForName(guardType); + m_GuardType = AssemblyHandler.FindTypeByName(guardType); if (!typeof(BaseGuard).IsAssignableFrom(m_GuardType)) { diff --git a/Projects/UOContent/Spells/Base/SpellRegistry.cs b/Projects/UOContent/Spells/Base/SpellRegistry.cs index 4433bf7ac..5c26b2579 100644 --- a/Projects/UOContent/Spells/Base/SpellRegistry.cs +++ b/Projects/UOContent/Spells/Base/SpellRegistry.cs @@ -157,8 +157,8 @@ namespace Server.Spells for (var i = 0; i < m_CircleNames.Length; ++i) { var t = - AssemblyHandler.FindFirstTypeForName($"Server.Spells.{m_CircleNames[i]}.{name}", true) ?? - AssemblyHandler.FindFirstTypeForName($"Server.Spells.{m_CircleNames[i]}.{name}Spell", true); + AssemblyHandler.FindTypeByName($"Server.Spells.{m_CircleNames[i]}.{name}") ?? + AssemblyHandler.FindTypeByName($"Server.Spells.{m_CircleNames[i]}.{name}Spell"); if (t?.IsSubclassOf(typeof(SpecialMove)) == false) {