fix: Cleans up LINQ calls. (#965)
- [X] Removes several `ToList()` uses with `PooledRefQueue` - [X] Adds a `PeekRandom` to PooledRefQueue - [X] Updates EV/BS so they dispel each other in a more efficient manner. - [X] Fixes Firebomb so it works like a normal firefield. - [X] Fixes field spells so they aren't unnecessarily using a Point3D ref more than necessary. - [X] Removes extra allocation in campfire by using reverse loop. - [X] Removes other LINQ calls that aren't needed.
This commit is contained in:
parent
daf89686d1
commit
23532db603
40 changed files with 585 additions and 447 deletions
|
|
@ -1,6 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Server.Mobiles;
|
||||
|
||||
namespace Server.Items
|
||||
|
|
@ -58,20 +57,26 @@ namespace Server.Items
|
|||
switch (value)
|
||||
{
|
||||
case CampfireStatus.Burning:
|
||||
ItemID = 0xDE3;
|
||||
Light = LightType.Circle300;
|
||||
break;
|
||||
{
|
||||
ItemID = 0xDE3;
|
||||
Light = LightType.Circle300;
|
||||
break;
|
||||
}
|
||||
|
||||
case CampfireStatus.Extinguishing:
|
||||
ItemID = 0xDE9;
|
||||
Light = LightType.Circle150;
|
||||
break;
|
||||
{
|
||||
ItemID = 0xDE9;
|
||||
Light = LightType.Circle150;
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
ItemID = 0xDEA;
|
||||
Light = LightType.ArchedWindowEast;
|
||||
ClearEntries();
|
||||
break;
|
||||
{
|
||||
ItemID = 0xDEA;
|
||||
Light = LightType.ArchedWindowEast;
|
||||
ClearEntries();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -111,8 +116,10 @@ namespace Server.Items
|
|||
return;
|
||||
}
|
||||
|
||||
foreach (var entry in m_Entries.ToList())
|
||||
for (var i = m_Entries.Count - 1; i >= 0; i--)
|
||||
{
|
||||
var entry = m_Entries[i];
|
||||
|
||||
if (!entry.Valid || entry.Player.NetState == null)
|
||||
{
|
||||
RemoveEntry(entry);
|
||||
|
|
@ -149,10 +156,13 @@ namespace Server.Items
|
|||
return;
|
||||
}
|
||||
|
||||
foreach (var entry in m_Entries.ToList())
|
||||
foreach (var entry in m_Entries)
|
||||
{
|
||||
RemoveEntry(entry);
|
||||
m_Table.Remove(entry.Player);
|
||||
}
|
||||
|
||||
m_Entries.Clear();
|
||||
m_Entries.TrimExcess();
|
||||
}
|
||||
|
||||
public override void OnAfterDelete()
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
using System;
|
||||
using System.Linq;
|
||||
using Server.Collections;
|
||||
using Server.Network;
|
||||
using Server.Spells;
|
||||
using Server.Targeting;
|
||||
|
|
@ -100,27 +100,23 @@ namespace Server.Items
|
|||
true
|
||||
);
|
||||
|
||||
var eable = from.Map.GetMobilesInRange(new Point3D(loc), 2);
|
||||
|
||||
var playerVsPlayer = false;
|
||||
var targets = eable.Where(
|
||||
m =>
|
||||
var eable = from.Map.GetMobilesInRange(loc, 2);
|
||||
|
||||
using var targets = PooledRefQueue<Mobile>.Create();
|
||||
foreach (var m in eable)
|
||||
{
|
||||
if (from != m && SpellHelper.ValidIndirectTarget(from, m) && from.CanBeHarmful(m, false) &&
|
||||
(!Core.AOS || from.InLOS(m)))
|
||||
{
|
||||
targets.Enqueue(m);
|
||||
|
||||
if (m.Player)
|
||||
{
|
||||
if (from == m || !SpellHelper.ValidIndirectTarget(from, m) || !from.CanBeHarmful(m, false)
|
||||
|| Core.AOS && !from.InLOS(m))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m.Player)
|
||||
{
|
||||
playerVsPlayer = true;
|
||||
}
|
||||
|
||||
return true;
|
||||
playerVsPlayer = true;
|
||||
}
|
||||
)
|
||||
.ToList();
|
||||
}
|
||||
}
|
||||
|
||||
eable.Free();
|
||||
|
||||
|
|
@ -178,9 +174,9 @@ namespace Server.Items
|
|||
damage /= targets.Count;
|
||||
}
|
||||
|
||||
for (var i = 0; i < targets.Count; ++i)
|
||||
while (targets.Count > 0)
|
||||
{
|
||||
var m = targets[i];
|
||||
var m = targets.Dequeue();
|
||||
|
||||
var toDeal = damage;
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue