fix(core): Removes some uses of Linq (#421)

- [X] Removes some uses of linq
- [X] Creates struct based enumerator for Skills
- [X] Creates a struct based enumerator for TypeCache
- [X] Changes HarvestDefinition to an init array instead of List
- [X] Changes HeritageTokenGump Response from List to Array
This commit is contained in:
Kamron Batman 2021-01-18 21:05:11 -08:00 • committed by GitHub
parent 52356866ed
commit b921c38879
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
50 changed files with 1006 additions and 507 deletions

View file

@ -1,7 +1,6 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Server.Engines.PartySystem;
using Server.Factions;
using Server.Gumps;
@ -1295,9 +1294,26 @@ namespace Server.Engines.ConPVP
}
}
public static bool CheckCombat(Mobile m) =>
m.Aggressed.Any(info => info.Defender.Player && DateTime.UtcNow - info.LastCombatTime < CombatDelay) ||
m.Aggressors.Any(info => info.Attacker.Player && DateTime.UtcNow - info.LastCombatTime < CombatDelay);
public static bool CheckCombat(Mobile m)
{
foreach (var info in m.Aggressed)
{
if (info.Defender.Player && DateTime.UtcNow - info.LastCombatTime < CombatDelay)
{
return true;
}
}
foreach (var info in m.Aggressors)
{
if (info.Attacker.Player && DateTime.UtcNow - info.LastCombatTime < CombatDelay)
{
return true;
}
}
return false;
}
private static void EventSink_Login(Mobile m)
{

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Commands;
using Server.Factions;
using Server.Items;
@ -404,12 +403,13 @@ namespace Server.Engines.Craft
}
var eable = map.GetItemsInRange(from.Location, 2);
var found = eable.Any(item => item.Z + 16 > item.Z && item.Z + 16 > item.Z && Find(item.ItemID, itemIDs));
eable.Free();
if (found)
foreach (var item in eable)
{
return true;
if (item.Z + 16 > item.Z && item.Z + 16 > item.Z && Find(item.ItemID, itemIDs))
{
eable.Free();
return true;
}
}
for (var x = -2; x <= 2; ++x)
@ -449,8 +449,23 @@ namespace Server.Engines.Craft
return contains;
}
public bool IsQuantityType(Type[][] types) =>
types.Any(check => check.Any(t => typeof(IHasQuantity).IsAssignableFrom(t)));
public bool IsQuantityType(Type[][] types)
{
for (int i = 0; i < types.Length; ++i)
{
Type[] check = types[i];
for (int j = 0; j < check.Length; ++j)
{
if (typeof(IHasQuantity).IsAssignableFrom(check[j]))
{
return true;
}
}
}
return false;
}
public int ConsumeQuantity(Container cont, Type[][] types, int[] amounts)
{
@ -861,8 +876,7 @@ namespace Server.Engines.Craft
}
public bool CheckSkills(
Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality,
ref bool allRequiredSkills
Mobile from, Type typeRes, CraftSystem craftSystem, ref int quality, ref bool allRequiredSkills
) =>
CheckSkills(from, typeRes, craftSystem, ref quality, out allRequiredSkills, true);

View file

@ -17,7 +17,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044001;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefAlchemy());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefAlchemy();
public override double GetChanceAtMin(CraftItem item) => 0.0;

View file

@ -30,7 +30,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044002;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefBlacksmithy());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefBlacksmithy();
public override CraftECA ECA => CraftECA.ChanceMinusSixtyToFourtyFive;

View file

@ -15,7 +15,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044006;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefBowFletching());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefBowFletching();
public override CraftECA ECA => CraftECA.FiftyPercentChanceMinusTenPercent;

View file

@ -15,7 +15,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044004;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefCarpentry());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefCarpentry();
public override double GetChanceAtMin(CraftItem item) => 0.5;

View file

@ -15,7 +15,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044008;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefCartography());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefCartography();
public override double GetChanceAtMin(CraftItem item) => 0.0;

View file

@ -15,7 +15,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044003;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefCooking());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefCooking();
public override CraftECA ECA => CraftECA.ChanceMinusSixtyToFourtyFive;

View file

@ -16,7 +16,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044622;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefGlassblowing());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefGlassblowing();
public override double GetChanceAtMin(CraftItem item) => item.ItemType == typeof(HollowPrism) ? 0.5 : 0.0;

View file

@ -16,7 +16,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044500;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefMasonry());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefMasonry();
public override double GetChanceAtMin(CraftItem item) => 0.0;

View file

@ -23,7 +23,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044005;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefTailoring());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefTailoring();
public override CraftECA ECA => CraftECA.ChanceMinusSixtyToFourtyFive;

View file

@ -31,7 +31,7 @@ namespace Server.Engines.Craft
public override int GumpTitleNumber => 1044007;
public static CraftSystem CraftSystem => m_CraftSystem ?? (m_CraftSystem = new DefTinkering());
public static CraftSystem CraftSystem => m_CraftSystem ??= new DefTinkering();
public override double GetChanceAtMin(CraftItem item)
{

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Mobiles;
using Server.Network;
using Server.Spells;
@ -192,12 +191,20 @@ namespace Server.Engines.Doom
[Usage("GenLeverPuzzle"), Description("Generates lamp room and lever puzzle in doom.")]
public static void GenLampPuzzle_OnCommand(CommandEventArgs e)
{
if (Map.Malas.GetItemsInRange(lp_Center, 0).OfType<LeverPuzzleController>().Any())
var eable = Map.Malas.GetItemsInRange(lp_Center, 0);
foreach (var item in eable)
{
e.Mobile.SendMessage("Lamp room puzzle already exists: please delete the existing controller first ...");
return;
if (item is LeverPuzzleController)
{
eable.Free();
e.Mobile.SendMessage("Lamp room puzzle already exists: please delete the existing controller first ...");
return;
}
}
eable.Free();
e.Mobile.SendMessage("Generating Lamp Room puzzle...");
new LeverPuzzleController().MoveToWorld(lp_Center, Map.Malas);
@ -634,7 +641,10 @@ namespace Server.Engines.Doom
{
IEntity m_IEntity = new Entity(Serial.Zero, RandomPointIn(m_Player.Location, 10), m_Player.Map);
var mobiles = m_IEntity.Map.GetMobilesInRange(m_IEntity.Location, 2).ToList();
var eable = m_IEntity.Map.GetMobilesInRange(m_IEntity.Location, 2);
var mobiles = new List<Mobile>();
mobiles.AddRange(eable);
eable.Free();
for (var k = 0; k < mobiles.Count; k++)
{

View file

@ -1,4 +1,3 @@
using System.Linq;
using Server.Ethics.Evil;
using Server.Ethics.Hero;
using Server.Items;
@ -156,7 +155,21 @@ namespace Server.Ethics
continue;
}
if (!e.Mobile.GetItemsInRange(2).Any(item => item is AnkhNorth || item is AnkhWest))
var eable = e.Mobile.GetItemsInRange(2);
var found = false;
foreach (var item in eable)
{
if (item is AnkhNorth || item is AnkhWest)
{
found = true;
break;
}
}
eable.Free();
if (!found)
{
continue;
}

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Accounting;
using Server.Commands.Generic;
using Server.Engines.ConPVP;
@ -275,18 +274,37 @@ namespace Server.Factions
}
var eable = mob.Map.GetObjectsInRange(mob.Location, range, items, mobs);
var isInstance = eable.Any(type.IsInstanceOfType);
foreach (var obj in eable)
{
if (type.IsInstanceOfType(obj))
{
eable.Free();
return true;
}
}
eable.Free();
return isInstance;
return false;
}
public static bool IsNearType(Mobile mob, Type[] types, int range)
{
var eable = mob.GetObjectsInRange(range);
var found = eable.Any(obj => types.Any(t => t.IsInstanceOfType(obj)));
foreach (var obj in eable)
{
for (int i = 0; i < types.Length; i++)
{
if (types[i].IsInstanceOfType(obj))
{
eable.Free();
return true;
}
}
}
eable.Free();
return found;
return false;
}
public void RemovePlayerState(PlayerState pl)

View file

@ -1,5 +1,4 @@
using System;
using System.Linq;
namespace Server.Factions
{
@ -77,7 +76,20 @@ namespace Server.Factions
}
}
private static bool CheckExistence(Point3D loc, Map facet, Type type) =>
facet.GetItemsInRange(loc, 0).Any(type.IsInstanceOfType);
private static bool CheckExistence(Point3D loc, Map facet, Type type)
{
var eable = facet.GetItemsInRange(loc, 0);
foreach (var item in eable)
{
if (type.IsInstanceOfType(item))
{
eable.Free();
return true;
}
}
eable.Free();
return false;
}
}
}

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Utilities;
namespace Server.Factions
@ -60,7 +59,7 @@ namespace Server.Factions
{
var asm = asms[i];
var tc = AssemblyHandler.GetTypeCache(asm);
var types = tc.Types.ToArray();
var types = tc.Types;
for (var j = 0; j < types.Length; ++j)
{

View file

@ -1,5 +1,5 @@
using System;
using System.Linq;
using System.Collections.Generic;
using Server.Factions;
using Server.Spells;
using Server.Targeting;
@ -90,13 +90,19 @@ namespace Server
private static void OnHit(Mobile from, Point3D origin, Map facet)
{
var targets = facet.GetMobilesInRange(origin, 12)
.Where(
mob =>
from.CanBeHarmful(mob, false) && mob.InLOS(new Point3D(origin, origin.Z + 1)) &&
Faction.Find(mob) != null
)
.ToList();
var eable = facet.GetMobilesInRange(origin, 12);
var targets = new List<Mobile>();
foreach (var m in eable)
{
if (from.CanBeHarmful(m, false) &&
m.InLOS(new Point3D(origin, origin.Z + 1)) &&
Faction.Find(m) != null)
{
targets.Add(from);
}
}
eable.Free();
foreach (var mob in targets)
{

View file

@ -1,6 +1,5 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Random;
namespace Server.Engines.Harvest
@ -66,7 +65,13 @@ namespace Server.Engines.Harvest
set
{
m_Veins = value;
VeinWeights = m_Veins.Aggregate<HarvestVein, uint>(0, (current, t) => current + t.VeinChance);
var totalWeight = 0u;
for (var i = 0; i < m_Veins.Length; i++)
{
totalWeight += m_Veins[i].VeinChance;
}
VeinWeights = totalWeight;
}
}

View file

@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Server.Items;
using Server.Targeting;
using Server.Utilities;
@ -9,9 +7,7 @@ namespace Server.Engines.Harvest
{
public abstract class HarvestSystem
{
public HarvestSystem() => Definitions = new List<HarvestDefinition>();
public List<HarvestDefinition> Definitions { get; }
public HarvestDefinition[] Definitions { get; init; }
public virtual bool CheckTool(Mobile from, Item tool)
{
@ -311,11 +307,18 @@ namespace Server.Engines.Harvest
return false;
}
if (m.GetItemsInRange(0).Any(t => t.StackWith(m, item, false)))
var eable = m.GetItemsInRange(0);
foreach (var i in eable)
{
return true;
if (i.StackWith(m, i, false))
{
eable.Free();
return true;
}
}
eable.Free();
item.MoveToWorld(m.Location, map);
return true;
}
@ -418,10 +421,22 @@ namespace Server.Engines.Harvest
}
}
public virtual HarvestDefinition GetDefinition() => Definitions.First();
public virtual HarvestDefinition GetDefinition() => Definitions[0];
public virtual HarvestDefinition GetDefinition(int tileID) =>
Definitions.FirstOrDefault(check => check.Validate(tileID));
public virtual HarvestDefinition GetDefinition(int tileID)
{
for (var i = 0; i < Definitions.Length; i++)
{
var check = Definitions[i];
if (check.Validate(tileID))
{
return check;
}
}
return null;
}
public virtual void StartHarvesting(Mobile from, Item tool, object toHarvest)
{

View file

@ -93,7 +93,7 @@ namespace Server.Engines.Harvest
};
}
Definitions.Add(fish);
Definitions = new[] { fish };
}
public static Fishing System => m_System ?? (m_System = new Fishing());

View file

@ -117,10 +117,10 @@ namespace Server.Engines.Harvest
lumber.RaceBonus = Core.ML;
lumber.RandomizeVeins = Core.ML;
Definitions.Add(lumber);
Definitions = new[] { lumber };
}
public static Lumberjacking System => m_System ?? (m_System = new Lumberjacking());
public static Lumberjacking System => m_System ??= new Lumberjacking();
public override bool CheckHarvest(Mobile from, Item tool)
{

View file

@ -225,8 +225,6 @@ namespace Server.Engines.Harvest
OreAndStone.RaceBonus = Core.ML;
OreAndStone.RandomizeVeins = Core.ML;
Definitions.Add(OreAndStone);
Sand = new HarvestDefinition
{
BankWidth = 8,
@ -267,7 +265,7 @@ namespace Server.Engines.Harvest
Sand.Resources = res;
Sand.Veins = veins;
Definitions.Add(Sand);
Definitions = new[] { OreAndStone, Sand };
}
public static Mining System => m_System ?? (m_System = new Mining());

View file

@ -1,5 +1,4 @@
using System;
using System.Linq;
using Server.Engines.ConPVP;
using Server.Factions;
using Server.Gumps;
@ -294,9 +293,12 @@ namespace Server.Engines.Help
private static void EventSink_HelpRequest(Mobile m)
{
if (m.NetState.Gumps.OfType<HelpGump>().Any())
foreach (var gump in m.NetState.Gumps)
{
return;
if (gump is HelpGump)
{
return;
}
}
if (!PageQueue.CheckAllowedToPage(m))