diff --git a/Projects/Server/Client/ClientVersion.cs b/Projects/Server/Client/ClientVersion.cs index 09e68d582..3c4eafe00 100644 --- a/Projects/Server/Client/ClientVersion.cs +++ b/Projects/Server/Client/ClientVersion.cs @@ -75,8 +75,8 @@ public class ClientVersion : IComparable, IComparer, IComparer, IComparer 5 || Minor > 0 || Revision > 6) { - if (Patch > 0) - { - builder.Append((char)('a' + (Patch - 1))); - } + builder.Append($"{Major}.{Minor}.{Revision}.{Patch}"); + } + else if (Patch > 0) + { + builder.Append($"{Major}.{Minor}.{Revision}{(char)('a' + (Patch - 1))}"); } else { - builder.Append('.'); - builder.Append(Patch.ToString()); + builder.Append($"{Major}.{Minor}.{Revision}"); } - if (Type != ClientType.Regular) + if (Type == ClientType.UOTD) { - builder.Append(' '); - builder.Append(Type.ToString().ToLower()); + builder.Append(" uotd"); } return builder.ToString(); diff --git a/Projects/Server/Geometry/Point2D.cs b/Projects/Server/Geometry/Point2D.cs index 0f1dba7d2..efee210dd 100644 --- a/Projects/Server/Geometry/Point2D.cs +++ b/Projects/Server/Geometry/Point2D.cs @@ -58,12 +58,12 @@ namespace Server var start = value.IndexOfOrdinal('('); var end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var x); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var x); start = end; end = value.IndexOf(')', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var y); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var y); return new Point2D(x, y); } diff --git a/Projects/Server/Geometry/Point3D.cs b/Projects/Server/Geometry/Point3D.cs index 6a65b7c26..96ce2f94e 100644 --- a/Projects/Server/Geometry/Point3D.cs +++ b/Projects/Server/Geometry/Point3D.cs @@ -86,17 +86,17 @@ namespace Server var start = value.IndexOfOrdinal('('); var end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var x); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var x); start = end; end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var y); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var y); start = end; end = value.IndexOf(')', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var z); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var z); return new Point3D(x, y, z); } diff --git a/Projects/Server/Geometry/Rectangle2D.cs b/Projects/Server/Geometry/Rectangle2D.cs index 901cea1c2..3eaefc70a 100644 --- a/Projects/Server/Geometry/Rectangle2D.cs +++ b/Projects/Server/Geometry/Rectangle2D.cs @@ -13,6 +13,8 @@ * along with this program. If not, see . * *************************************************************************/ +using System; + namespace Server { [NoSort] @@ -46,22 +48,22 @@ namespace Server var start = value.IndexOfOrdinal('('); var end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var x); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var x); start = end; end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var y); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var y); start = end; end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var w); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var w); start = end; end = value.IndexOf(')', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var h); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var h); return new Rectangle2D(x, y, w, h); } diff --git a/Projects/Server/Geometry/WorldLocation.cs b/Projects/Server/Geometry/WorldLocation.cs index 466f8ef82..f2e28eaac 100644 --- a/Projects/Server/Geometry/WorldLocation.cs +++ b/Projects/Server/Geometry/WorldLocation.cs @@ -145,22 +145,22 @@ namespace Server var start = value.IndexOfOrdinal('('); var end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var x); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var x); start = end; end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var y); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var y); start = end; end = value.IndexOf(',', start + 1); - Utility.ToInt32(value.Substring(start + 1, end - (start + 1)).Trim(), out var z); + Utility.ToInt32(value.AsSpan(start + 1, end - (start + 1)).Trim(), out var z); start = end; end = value.IndexOf(')', start + 1); - var map = Map.Parse(value.Substring(start + 1, end - (start + 1)).Trim()); + var map = Map.Parse(value.AsSpan(start + 1, end - (start + 1)).Trim()); return new WorldLocation(x, y, z, map); } diff --git a/Projects/Server/Json/Converters/ClientVersionConverter.cs b/Projects/Server/Json/Converters/ClientVersionConverter.cs index c1dc8ecb9..f5f4b41ee 100644 --- a/Projects/Server/Json/Converters/ClientVersionConverter.cs +++ b/Projects/Server/Json/Converters/ClientVersionConverter.cs @@ -28,7 +28,7 @@ namespace Server.Json return new ClientVersion(reader.GetString()); } - throw new JsonException($"Value must be a string"); + throw new JsonException("Value must be a string"); } public override void Write(Utf8JsonWriter writer, ClientVersion value, JsonSerializerOptions options) => diff --git a/Projects/Server/Json/Converters/MapConverter.cs b/Projects/Server/Json/Converters/MapConverter.cs index 71109ef88..832c366ab 100644 --- a/Projects/Server/Json/Converters/MapConverter.cs +++ b/Projects/Server/Json/Converters/MapConverter.cs @@ -26,7 +26,7 @@ namespace Server.Json { JsonTokenType.String => Map.Parse(reader.GetString()), JsonTokenType.Number => Map.Maps[reader.GetInt32()], - _ => throw new JsonException($"Value must be a number or string") + _ => throw new JsonException("Value must be a number or string") }; public override void Write(Utf8JsonWriter writer, Map value, JsonSerializerOptions options) => diff --git a/Projects/Server/Maps/Map.cs b/Projects/Server/Maps/Map.cs index e11ae4bd1..8f5239248 100644 --- a/Projects/Server/Maps/Map.cs +++ b/Projects/Server/Maps/Map.cs @@ -484,9 +484,14 @@ public sealed class Map : IComparable return mapValues; } - public static Map Parse(string value) + // Handles null checks + public static Map Parse(string value) => Parse(value ?? ReadOnlySpan.Empty); + + public static Map Parse(ReadOnlySpan value) { - if (string.IsNullOrWhiteSpace(value)) + value = value.Trim(); + + if (value.Length == 0) { return null; } @@ -513,7 +518,7 @@ public sealed class Map : IComparable continue; } - if (index >= 0 && map.MapIndex == index || map.Name.InsensitiveEquals(value)) + if (index >= 0 && map.MapIndex == index || value.InsensitiveEquals(map.Name)) { return map; } diff --git a/Projects/UOContent/Misc/LootPack.cs b/Projects/UOContent/Misc/LootPack.cs index 4e71aa7d9..6939c4d4c 100644 --- a/Projects/UOContent/Misc/LootPack.cs +++ b/Projects/UOContent/Misc/LootPack.cs @@ -1092,7 +1092,7 @@ namespace Server return; } - Count = Utility.ToInt32(str.Substring(start, index)); + Count = Utility.ToInt32(str.AsSpan(start, index)); start = index + 1; index = str.IndexOf('+', start); @@ -1109,7 +1109,7 @@ namespace Server index = str.Length; } - Sides = Utility.ToInt32(str.Substring(start, index - start)); + Sides = Utility.ToInt32(str.AsSpan(start, index - start)); if (index == str.Length) { @@ -1119,7 +1119,7 @@ namespace Server start = index + 1; index = str.Length; - Bonus = Utility.ToInt32(str.Substring(start, index - start)); + Bonus = Utility.ToInt32(str.AsSpan(start, index - start)); if (negative) {