fix: Changes Map.Sector.Mobiles to link list & Fixes various related crash bugs (#1553)
### Summary
Eliminates `IPooledEnumerable<T>` and `eable.Free()` from `Map` for mobiles. This drastically simplifies code that iterates in range, for example:
```cs
foreach (var m in m.GetMobilesInRange(5))
{
}
```
The code above no longer requires an eable and calling `Free()`.
- [X] Fixed several locations where an NPC that was damaged would cause a server crash.
- [X] Removed an unnecessary allocation in guard fake calls (NPCs calling guards on you)
- [X] Fixes damage precision loss in Poison Strike Spell
- [X] BogThing no longer attempts to "search" for boglings to eat when it is at full health
This commit is contained in:
parent
27f0cec1fa
commit
28c06c1cc0
71 changed files with 796 additions and 591 deletions
|
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using Server.Collections;
|
||||
using Server.Engines.CannedEvil;
|
||||
using Server.Engines.PartySystem;
|
||||
using Server.Factions;
|
||||
|
|
@ -94,14 +95,23 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
if (map != null)
|
||||
{
|
||||
// Surprisingly, no sparkle type effects
|
||||
// Cannot move a mobile while iterating mobiles in range, so use a queue
|
||||
using var queue = PooledRefQueue<Mobile>.Create();
|
||||
foreach (var m in r.Spawn.GetMobilesInRange(Range))
|
||||
{
|
||||
if (IsValidTarget(m))
|
||||
{
|
||||
m.Location = GetNearestShrine(m);
|
||||
queue.Enqueue(m);
|
||||
}
|
||||
}
|
||||
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var m = queue.Dequeue();
|
||||
|
||||
// Surprisingly, no sparkle type effects
|
||||
m.Location = GetNearestShrine(m);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -80,8 +80,7 @@ namespace Server.Spells.Necromancy
|
|||
var cbc = Caster as BaseCreature;
|
||||
var isMonster = cbc?.Controlled == false && (cbc.IsAnimatedDead || !cbc.Summoned);
|
||||
|
||||
var eable = m.GetMobilesInRange(2);
|
||||
foreach (Mobile targ in eable)
|
||||
foreach (Mobile targ in m.GetMobilesInRange(2))
|
||||
{
|
||||
if (targ == Caster || m == targ || !SpellHelper.ValidIndirectTarget(Caster, targ)
|
||||
|| !Caster.CanBeHarmful(targ, false))
|
||||
|
|
|
|||
|
|
@ -51,8 +51,7 @@ namespace Server.Spells.Necromancy
|
|||
var cbc = Caster as BaseCreature;
|
||||
var isMonster = cbc?.Controlled == false && (cbc.IsAnimatedDead || !cbc.Summoned);
|
||||
|
||||
var eable = Caster.GetMobilesInRange(Core.ML ? 4 : 5);
|
||||
foreach (var targ in eable)
|
||||
foreach (var targ in Caster.GetMobilesInRange(Core.ML ? 4 : 5))
|
||||
{
|
||||
if (targ == Caster
|
||||
|| !Caster.InLOS(targ)
|
||||
|
|
@ -106,7 +105,7 @@ namespace Server.Spells.Necromancy
|
|||
|
||||
double damage = Utility.RandomMinMax(30, 35);
|
||||
|
||||
damage *= 300 + m.Karma / 100 + GetDamageSkill(Caster) * 10;
|
||||
damage *= 300 + m.Karma / 100.0 + GetDamageSkill(Caster) * 10;
|
||||
damage /= 1000;
|
||||
|
||||
var sdiBonus = AosAttributes.GetValue(Caster, AosAttribute.SpellDamage);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue