fix(core): Optimizes strings / .NET 5 compatibility changes (#354)

- [X] Removes some string allocations (e.g. split)
- [X] Optimizes some collections
- [X] Converts insensitive to extension methods of built-ins.
- [X] Adds ordinal (case sensitive) string helpers
- [X] Fixes conditionals for in-game commands so they use Ordinal comparisons.
- [X] Replaces ToLower.Contains with InsensitiveContains
- [X] Adds ValueStringBuilder
- [X] Implements ValueStringBuilder in a few places where it makes sense
- [X] Removes the redundant Wrap function and replaces it with an optimized version
- [X] Fixes list conversions in Utility

Closes #351

Bumps release version
This commit is contained in:
Kamron Batman 2020-12-20 23:21:55 -08:00 • committed by GitHub
parent 92aae8d482
commit 77ce2e1980
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
117 changed files with 2000 additions and 1226 deletions

View file

@ -65,7 +65,7 @@ namespace Server.Engines.BulkOrders
while ((line = ip.ReadLine()) != null)
{
if (line.Length == 0 || line.StartsWith("#", StringComparison.Ordinal))
if (line.Length == 0 || line.StartsWithOrdinal("#"))
{
continue;
}

View file

@ -76,7 +76,7 @@ namespace Server.Engines.Chat
public bool IsVoiced(ChatUser user) => m_Voices.Contains(user);
public bool ValidatePassword(string password) => m_Password == null || Insensitive.Equals(m_Password, password);
public bool ValidatePassword(string password) => m_Password == null || m_Password.InsensitiveEquals(password);
public bool ValidateModerator(ChatUser user)
{

View file

@ -86,7 +86,7 @@ namespace Server.Engines.Chat
public static void PrivateMessage(ChatUser from, Channel channel, string param)
{
var indexOf = param.IndexOf(' ', StringComparison.Ordinal);
var indexOf = param.IndexOfOrdinal(' ');
var name = param.Substring(0, indexOf);
var text = param.Substring(indexOf + 1);
@ -173,7 +173,7 @@ namespace Server.Engines.Chat
string name;
string password = null;
var start = param.IndexOf('\"', StringComparison.Ordinal);
var start = param.IndexOfOrdinal('\"');
if (start >= 0)
{
@ -191,7 +191,7 @@ namespace Server.Engines.Chat
}
else
{
var indexOf = param.IndexOf(' ', StringComparison.Ordinal);
var indexOf = param.IndexOfOrdinal(' ');
if (indexOf >= 0)
{
@ -228,7 +228,7 @@ namespace Server.Engines.Chat
string name;
string password = null;
var start = param.IndexOf('{', StringComparison.Ordinal);
var start = param.IndexOfOrdinal('{');
if (start >= 0)
{

View file

@ -1396,7 +1396,7 @@ namespace Server.Engines.ConPVP
return;
}
if (Insensitive.Contains(e.Speech, "i wish to duel"))
if (e.Speech.InsensitiveContains("i wish to duel"))
{
if (!pm.CheckAlive())
{
@ -1432,7 +1432,7 @@ namespace Server.Engines.ConPVP
e.Handled = true;
}
}
else if (Insensitive.Equals(e.Speech, "change arena preferences"))
else if (e.Speech.InsensitiveEquals("change arena preferences"))
{
if (!pm.CheckAlive())
{
@ -1448,7 +1448,7 @@ namespace Server.Engines.ConPVP
}
}
}
else if (Insensitive.Equals(e.Speech, "showladder"))
else if (e.Speech.InsensitiveEquals("showladder"))
{
e.Blocked = true;
if (!pm.CheckAlive())
@ -1487,7 +1487,7 @@ namespace Server.Engines.ConPVP
}
}
}
else if (Insensitive.Equals(e.Speech, "viewladder"))
else if (e.Speech.InsensitiveEquals("viewladder"))
{
e.Blocked = true;
@ -1509,7 +1509,7 @@ namespace Server.Engines.ConPVP
}
}
}
else if (Insensitive.Contains(e.Speech, "i yield"))
else if (e.Speech.InsensitiveContains("i yield"))
{
if (!pm.CheckAlive())
{

View file

@ -122,7 +122,10 @@ namespace Server.Engines.ConPVP
{
for (var i = 0; i < entries.Count; ++i)
{
var teamInfo = entries[i] as DDTeamInfo;
if (entries[i] is not DDTeamInfo teamInfo)
{
continue;
}
AddImage(30, 70 + i * 75, 10152);
AddImage(30, 85 + i * 75, 10151);
@ -884,7 +887,7 @@ namespace Server.Engines.ConPVP
}
}
if (i == winner.TeamID)
if (i == winner?.TeamID)
{
continue;
}
@ -898,7 +901,10 @@ namespace Server.Engines.ConPVP
}
}
m_Context.Finish(m_Context.Participants[winner.TeamID]);
if (winner != null)
{
m_Context.Finish(m_Context.Participants[winner.TeamID]);
}
}
public override void OnStop()

View file

@ -279,7 +279,7 @@ namespace Server.Engines.ConPVP
AddPage(0);
AddBackground(0, 0, 300, 300, 9380);
var pList = m_List?.CastListCovariant<object, TourneyParticipant>()
var pList = m_List?.SafeConvertList<object, TourneyParticipant>()
?? new List<TourneyParticipant>(tourney.Participants);
AddLeftArrow(25, 11, ToButtonID(0, 0));
@ -412,10 +412,6 @@ namespace Server.Engines.ConPVP
AddLeftArrow(25, 11, ToButtonID(0, 0));
AddHtml(25, 35, 250, 20, Center("Rounds"));
// List<PyramidLevel> levelsList = m_List != null
// ? Utility.CastListCovariant<object, PyramidLevel>(m_List)
// : new List<PyramidLevel>(tourney.Pyramid.Levels);
StartPage(out var index, out var count, out var y, 12);
for (var i = 0; i < count; ++i, y += 18)
@ -439,7 +435,7 @@ namespace Server.Engines.ConPVP
}
var matchesList = m_List != null
? m_List.CastListCovariant<object, TourneyMatch>()
? m_List.SafeConvertList<object, TourneyMatch>()
: new List<TourneyMatch>(level.Matches);
AddRightArrow(

View file

@ -151,7 +151,7 @@ namespace Server.Ethics
continue;
}
if (!Insensitive.Equals(ethic.Definition.JoinPhrase.String, e.Speech))
if (!ethic.Definition.JoinPhrase.String.InsensitiveEquals(e.Speech))
{
continue;
}
@ -185,7 +185,7 @@ namespace Server.Ethics
{
var power = ethic.Definition.Powers[i];
if (!Insensitive.Equals(power.Definition.Phrase.String, e.Speech))
if (!power.Definition.Phrase.String.InsensitiveEquals(e.Speech))
{
continue;
}

View file

@ -1277,7 +1277,7 @@ namespace Server.Factions
{
var faction = factions[i];
if (Insensitive.Equals(faction.Definition.FriendlyName, name))
if (faction.Definition.FriendlyName.InsensitiveEquals(name))
{
return faction;
}

View file

@ -536,7 +536,7 @@ namespace Server.Factions
{
var town = towns[i];
if (Insensitive.Equals(town.Definition.FriendlyName, name))
if (town.Definition.FriendlyName.InsensitiveEquals(name))
{
return town;
}

View file

@ -205,7 +205,7 @@ namespace Server.Factions
{
var name = Name;
return name != null && Insensitive.StartsWith(speech, name);
return name != null && speech.InsensitiveStartsWith(name);
}
public override void OnSpeech(SpeechEventArgs e)
@ -216,7 +216,7 @@ namespace Server.Factions
if (!e.Handled && InRange(from, ListenRange) && from.Alive)
{
if (e.HasKeyword(0xE6) && (Insensitive.Equals(e.Speech, "orders") || WasNamed(e.Speech))) // *orders*
if (e.HasKeyword(0xE6) && (e.Speech.InsensitiveEquals("orders") || WasNamed(e.Speech))) // *orders*
{
if (m_Town?.IsSheriff(from) != true)
{
@ -240,15 +240,15 @@ namespace Server.Factions
var understood = true;
ReactionType newType = 0;
if (Insensitive.Contains(e.Speech, "attack"))
if (e.Speech.InsensitiveContains("attack"))
{
newType = ReactionType.Attack;
}
else if (Insensitive.Contains(e.Speech, "warn"))
else if (e.Speech.InsensitiveContains("warn"))
{
newType = ReactionType.Warn;
}
else if (Insensitive.Contains(e.Speech, "ignore"))
else if (e.Speech.InsensitiveContains("ignore"))
{
newType = ReactionType.Ignore;
}
@ -261,7 +261,7 @@ namespace Server.Factions
{
understood = false;
if (Insensitive.Contains(e.Speech, "civil"))
if (e.Speech.InsensitiveContains("civil"))
{
ChangeReaction(null, newType);
understood = true;
@ -273,14 +273,14 @@ namespace Server.Factions
{
var faction = factions[i];
if (faction != m_Faction && Insensitive.Contains(e.Speech, faction.Definition.Keyword))
if (faction != m_Faction && e.Speech.InsensitiveContains(faction.Definition.Keyword))
{
ChangeReaction(faction, newType);
understood = true;
}
}
}
else if (Insensitive.Contains(e.Speech, "patrol"))
else if (e.Speech.InsensitiveContains("patrol"))
{
Home = Location;
RangeHome = 6;
@ -289,7 +289,7 @@ namespace Server.Factions
Say(1005146); // This spot looks like it needs protection! I shall guard it with my life.
understood = true;
}
else if (Insensitive.Contains(e.Speech, "follow"))
else if (e.Speech.InsensitiveContains("follow"))
{
Home = Location;
RangeHome = 6;

View file

@ -188,7 +188,7 @@ namespace Server.Engines.Help
while ((line = ip.ReadLine()?.Trim()) != null)
{
if (line.Length == 0 || line.StartsWith("#", StringComparison.Ordinal))
if (line.Length == 0 || line.StartsWithOrdinal("#"))
{
continue;
}

View file

@ -44,7 +44,7 @@ namespace Server.Engines.MLQuests
{
line = line.Trim();
if (line.Length == 0 || line.StartsWith("#", StringComparison.Ordinal))
if (line.Length == 0 || line.StartsWithOrdinal("#"))
{
continue;
}

View file

@ -245,7 +245,7 @@ namespace Server.Movement
{
itemData = TileData.ItemTable[tile.ID & TileData.MaxItemValue];
if (m.Flying && Insensitive.Equals(itemData.Name, "hover over"))
if (m.Flying && itemData.Name.InsensitiveEquals("hover over"))
{
newZ = tile.Z;
return true;
@ -350,7 +350,7 @@ namespace Server.Movement
itemData = item.ItemData;
flags = itemData.Flags;
if (m.Flying && Insensitive.Equals(itemData.Name, "hover over"))
if (m.Flying && itemData.Name.InsensitiveEquals("hover over"))
{
newZ = item.Z;
return true;

View file

@ -519,7 +519,7 @@ namespace Server.Engines.Spawners
for (var j = 0; thisProp == null && j < allProps.Length; ++j)
{
if (Insensitive.Equals(propName, allProps[j].Name))
if (propName.InsensitiveEquals(allProps[j].Name))
{
thisProp = allProps[j];
}