Hondacrx
2025-08-31 13:23:49 -04:00
parent 59c983d3ff
commit c5cccdec10
31 changed files with 1045 additions and 1807 deletions
@@ -210,8 +210,5 @@ namespace System.Collections.Generic
bool Invoke(T obj);
}
public interface IDoWork<in T>
{
void Invoke(T obj);
}
public delegate void IDoWork<in T>(T obj);
}
+1 -1
View File
@@ -49,7 +49,7 @@ namespace Game.AI
var u_check = new NearestAttackableUnitInObjectRangeCheck(me, me.GetCharmerOrOwnerOrSelf(), max_range);
var checker = new UnitLastSearcher(me, u_check);
Cell.VisitAllObjects(me, checker, max_range + extraSearchRadius);
victim = checker.GetTarget();
victim = checker.GetResult();
}
// If have target
+2 -2
View File
@@ -372,7 +372,7 @@ namespace Game.AI
var searcher = new UnitLastSearcher(me, u_check);
Cell.VisitAllObjects(me, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
//Returns a list of friendly CC'd units within range
@@ -404,7 +404,7 @@ namespace Game.AI
var searcher = new PlayerSearcher(me, check);
Cell.VisitWorldObjects(me, searcher, minimumRange);
return searcher.GetTarget();
return searcher.GetResult();
}
public void SetEquipmentSlots(bool loadDefault, int mainHand = -1, int offHand = -1, int ranged = -1)
+4 -4
View File
@@ -4257,7 +4257,7 @@ namespace Game.AI
var u_check = new MostHPMissingInRange<Unit>(_me, range, MinHPDiff);
var searcher = new UnitLastSearcher(_me, u_check);
Cell.VisitGridObjects(_me, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public Unit DoSelectBelowHpPctFriendlyWithEntry(uint entry, float range, byte minHPDiff = 1, bool excludeSelf = true)
@@ -4266,7 +4266,7 @@ namespace Game.AI
UnitLastSearcher searcher = new(_me, u_check);
Cell.VisitAllObjects(_me, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
Unit DoSelectLowestHpPercentFriendly(float range, uint minHpPct, uint maxHpPct)
@@ -4277,7 +4277,7 @@ namespace Game.AI
MostHPPercentMissingInRange u_check = new(_me, range, minHpPct, maxHpPct);
UnitLastSearcher searcher = new(_me, u_check);
Cell.VisitGridObjects(_me, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
void DoFindFriendlyCC(List<Creature> creatures, float range)
@@ -4308,7 +4308,7 @@ namespace Game.AI
var u_check = new AnyFriendlyUnitInObjectRangeCheck(_me, _me, range);
var searcher = new UnitLastSearcher(_me, u_check);
Cell.VisitAllObjects(_me, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public void SetTimedActionList(SmartScriptHolder e, uint entry, Unit invoker, uint startFromEventId = 0)
+1 -1
View File
@@ -558,7 +558,7 @@ namespace Game
void SendCalendarEventInviteAlert(CalendarEvent calendarEvent, CalendarInvite invite)
{
var packetBuilder = (Player receiver) =>
IDoWork<Player> packetBuilder = (Player receiver) =>
{
CalendarInviteAlert packet = new();
packet.Date.SetUtcTimeFromUnixTime(calendarEvent.Date);
+1 -1
View File
@@ -400,7 +400,7 @@ namespace Game.Chat
NearestGameObjectCheck check = new(pl);
GameObjectLastSearcher searcher = new(pl, check);
Cell.VisitGridObjects(pl, searcher, MapConst.SizeofGrids);
return searcher.GetTarget();
return searcher.GetResult();
}
public string PlayerLink(string name)
+1 -1
View File
@@ -142,7 +142,7 @@ namespace Game.Chat
var check = new AllCreaturesOfEntryInRange(handler.GetPlayer(), entry, 20.0f);
var searcher = new CreatureSearcher(handler.GetPlayer(), check);
Cell.VisitAllObjects(handler.GetPlayer(), searcher, 30.0f);
var passenger = searcher.GetTarget();
var passenger = searcher.GetResult();
if (passenger == null || passenger == target)
return false;
passenger.EnterVehicle(target, seatId);
+2 -1
View File
@@ -1571,7 +1571,8 @@ namespace Game.Chat
}
// First handle any creatures that still have a corpse around
var worker = new WorldObjectWorker(player, new RespawnDo());
RespawnDo u_do = new();
WorldObjectWorker<Creature> worker = new(player, u_do);
Cell.VisitGridObjects(player, worker, player.GetGridActivationRange());
// Now handle any that had despawned, but had respawn time logged.
@@ -1589,7 +1589,7 @@ namespace Game.Entities
AreaTriggerAI _ai;
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
AreaTrigger Owner;
ObjectFieldData ObjectMask = new();
@@ -1609,6 +1609,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject updateObject);
player.SendPacket(updateObject);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
+3 -1
View File
@@ -386,7 +386,7 @@ namespace Game.Entities
ConversationAI _ai;
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Conversation Owner;
ObjectFieldData ObjectMask = new();
@@ -406,6 +406,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
+3 -1
View File
@@ -320,7 +320,7 @@ namespace Game.Entities
long m_time;
CellCoord _cellCoord; // gride for corpse position for fast search
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Corpse Owner;
ObjectFieldData ObjectMask = new();
@@ -340,6 +340,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
+7 -5
View File
@@ -747,7 +747,7 @@ namespace Game.Entities
var searcher = new CreatureLastSearcher(this, u_check);
Cell.VisitGridObjects(this, searcher, radius);
var creature = searcher.GetTarget();
var creature = searcher.GetResult();
SetNoSearchAssistance(true);
@@ -2323,7 +2323,7 @@ namespace Game.Entities
var searcher = new UnitLastSearcher(this, u_check);
Cell.VisitAllObjects(this, searcher, dist);
return searcher.GetTarget();
return searcher.GetResult();
}
// select nearest hostile unit within the given attack distance (i.e. distance is ignored if > than ATTACK_DISTANCE), regardless of threat list.
@@ -2340,7 +2340,7 @@ namespace Game.Entities
Cell.VisitAllObjects(this, searcher, Math.Max(dist, SharedConst.AttackDistance));
return searcher.GetTarget();
return searcher.GetResult();
}
public void SendAIReaction(AiReaction reactionType)
@@ -3327,7 +3327,7 @@ namespace Game.Entities
var u_check = new NearestHostileUnitInAggroRangeCheck(this, useLOS, ignoreCivilians);
var searcher = new UnitSearcher(this, u_check);
Cell.VisitGridObjects(this, searcher, SharedConst.MaxAggroRadius);
return searcher.GetTarget();
return searcher.GetResult();
}
public override float GetNativeObjectScale()
@@ -3880,7 +3880,7 @@ namespace Game.Entities
base.ClearUpdateMask(remove);
}
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Creature Owner;
ObjectFieldData ObjectMask = new();
@@ -3900,6 +3900,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
+3 -1
View File
@@ -307,7 +307,7 @@ namespace Game.Entities
int _duration; // for non-aura dynobjects
bool _isViewpoint;
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
DynamicObject Owner;
ObjectFieldData ObjectMask = new();
@@ -327,6 +327,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
@@ -633,7 +633,7 @@ namespace Game.Entities
var checker = new NearestAttackableNoTotemUnitInObjectRangeCheck(this, radius);
var searcher = new UnitLastSearcher(this, checker);
Cell.VisitAllObjects(this, searcher, radius);
target = searcher.GetTarget();
target = searcher.GetResult();
}
else
{
@@ -641,7 +641,7 @@ namespace Game.Entities
var check = new AnyUnitInObjectRangeCheck(this, radius);
var searcher = new PlayerSearcher(this, check);
Cell.VisitWorldObjects(this, searcher, radius);
target = searcher.GetTarget();
target = searcher.GetResult();
}
if (target != null)
@@ -1465,7 +1465,7 @@ namespace Game.Entities
var checker = new GameObjectSearcher(this, u_check);
Cell.VisitGridObjects(this, checker, range);
return checker.GetTarget();
return checker.GetResult();
}
public void ResetDoorOrButton()
@@ -3975,7 +3975,7 @@ namespace Game.Entities
ObjectGuid m_linkedTrap;
#endregion
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
public GameObject Owner;
public ObjectFieldData ObjectMask = new();
@@ -3995,6 +3995,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
@@ -224,7 +224,7 @@ namespace Game.Entities
return (uint)m_azeriteEmpoweredItemData.Selections[tier];
}
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
AzeriteEmpoweredItem Owner;
ObjectFieldData ObjectMask = new();
@@ -245,6 +245,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
+3 -1
View File
@@ -510,7 +510,7 @@ namespace Game.Entities
}
}
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
AzeriteItem Owner;
ObjectFieldData ObjectMask = new();
@@ -531,6 +531,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
+3 -1
View File
@@ -259,7 +259,7 @@ namespace Game.Entities
ContainerData m_containerData;
Item[] m_bagslot = new Item[98];
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Bag Owner;
ObjectFieldData ObjectMask = new();
@@ -280,6 +280,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
+3 -1
View File
@@ -2838,7 +2838,7 @@ namespace Game.Entities
Array<uint> m_gemScalingLevels = new(ItemConst.MaxGemSockets);
#endregion
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Item Owner;
ObjectFieldData ObjectMask = new();
@@ -2858,6 +2858,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
+13 -9
View File
@@ -1642,7 +1642,7 @@ namespace Game.Entities
var searcher = new CreatureLastSearcher(this, checker);
Cell.VisitAllObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public Creature FindNearestCreatureWithOptions(float range, FindCreatureOptions options)
@@ -1654,7 +1654,7 @@ namespace Game.Entities
searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift();
Cell.VisitAllObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public GameObject FindNearestGameObject(uint entry, float range, bool spawnedOnly = true)
@@ -1663,7 +1663,7 @@ namespace Game.Entities
var searcher = new GameObjectLastSearcher(this, checker);
Cell.VisitGridObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public GameObject FindNearestGameObjectWithOptions(float range, FindGameObjectOptions options)
@@ -1675,7 +1675,7 @@ namespace Game.Entities
searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift();
Cell.VisitGridObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public GameObject FindNearestUnspawnedGameObject(uint entry, float range)
@@ -1684,7 +1684,7 @@ namespace Game.Entities
GameObjectLastSearcher searcher = new(this, checker);
Cell.VisitGridObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public GameObject FindNearestGameObjectOfType(GameObjectTypes type, float range)
@@ -1693,7 +1693,7 @@ namespace Game.Entities
var searcher = new GameObjectLastSearcher(this, checker);
Cell.VisitGridObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public Player SelectNearestPlayer(float range)
@@ -1701,7 +1701,7 @@ namespace Game.Entities
var checker = new NearestPlayerInObjectRangeCheck(this, range);
var searcher = new PlayerLastSearcher(this, checker);
Cell.VisitWorldObjects(this, searcher, range);
return searcher.GetTarget();
return searcher.GetResult();
}
public ObjectGuid GetCharmerOrOwnerOrOwnGUID()
@@ -4059,7 +4059,7 @@ namespace Game.Entities
}
}
class CombatLogSender : IDoWork<Player>
class CombatLogSender
{
CombatLogServerPacket i_message;
@@ -4075,6 +4075,8 @@ namespace Game.Entities
player.SendPacket(i_message);
}
public static implicit operator IDoWork<Player>(CombatLogSender obj) => obj.Invoke;
}
public struct FindCreatureOptions
@@ -4257,7 +4259,7 @@ namespace Game.Entities
}
}
struct WorldObjectClientDestroyWork : IDoWork<Player>
struct WorldObjectClientDestroyWork
{
public WorldObject obj;
@@ -4276,5 +4278,7 @@ namespace Game.Entities
obj.DestroyForPlayer(player);
player.m_clientGUIDs.Remove(obj.GetGUID());
}
public static implicit operator IDoWork<Player>(WorldObjectClientDestroyWork obj) => obj.Invoke;
}
}
+3 -1
View File
@@ -255,7 +255,7 @@ namespace Game.Entities
List<uint> _playerDataElementsNeedSave = new();
List<uint> _playerDataFlagsNeedSave = new();
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
Player Owner;
ObjectFieldData ObjectMask = new();
@@ -277,6 +277,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
+3 -1
View File
@@ -183,7 +183,7 @@ namespace Game.Entities
public void SetCreatedBySpellCast(ObjectGuid castId) { _createdBySpellCast = castId; }
class ValuesUpdateForPlayerWithMaskSender : IDoWork<Player>
class ValuesUpdateForPlayerWithMaskSender
{
SceneObject Owner;
ObjectFieldData ObjectMask = new();
@@ -203,6 +203,8 @@ namespace Game.Entities
udata.BuildPacket(out UpdateObject packet);
player.SendPacket(packet);
}
public static implicit operator IDoWork<Player>(ValuesUpdateForPlayerWithMaskSender obj) => obj.Invoke;
}
}
}
-11
View File
@@ -2473,17 +2473,6 @@ namespace Game.Guilds
}
}
public void BroadcastWorker(Action<Player> _do, Player except = null)
{
foreach (var member in m_members.Values)
{
Player player = member.FindPlayer();
if (player != null)
if (player != except)
_do.Invoke(player);
}
}
public int GetMembersCount() { return m_members.Count; }
public GuildAchievementMgr GetAchievementMgr() { return m_achievementSys; }
File diff suppressed because it is too large Load Diff
+1 -1
View File
@@ -601,7 +601,7 @@ namespace Game.Maps
// update active cells around players and active objects
ResetMarkedCells();
var update = new UpdaterNotifier(diff);
var update = new ObjectUpdater(diff);
var grid_object_update = new Visitor(update, GridMapTypeMask.AllGrid);
var world_object_update = new Visitor(update, GridMapTypeMask.AllWorld);
+1 -2
View File
@@ -2860,8 +2860,7 @@ namespace Game.Spells
if (containerTypeMask != 0)
{
WorldObjectSpellAreaTargetCheck check = new(radius, unitOwner, refe, unitOwner, GetSpellInfo(), selectionType, condList, SpellTargetObjectTypes.Unit);
UnitListSearcher searcher = new(unitOwner, units, check);
searcher.i_phaseShift = PhasingHandler.GetAlwaysVisiblePhaseShift();
UnitListSearcher searcher = new(PhasingHandler.GetAlwaysVisiblePhaseShift(), units, check);
Spell.SearchTargets(searcher, containerTypeMask, unitOwner, unitOwner, radius + extraSearchRadius);
// by design WorldObjectSpellAreaTargetCheck allows not-in-world units (for spells) but for auras it is not acceptable
+4 -4
View File
@@ -1747,9 +1747,9 @@ namespace Game.Spells
return null;
var check = new WorldObjectSpellNearbyTargetCheck(range, m_caster, m_spellInfo, selectionType, condList, objectType);
var searcher = new WorldObjectLastSearcher(m_caster, check, containerTypeMask);
var searcher = new WorldObjectLastSearcher(PhasingHandler.GetAlwaysVisiblePhaseShift(), check, containerTypeMask);
SearchTargets(searcher, containerTypeMask, m_caster, m_caster.GetPosition(), range);
return searcher.GetTarget();
return searcher.GetResult();
}
void SearchAreaTargets(List<WorldObject> targets, SpellEffectInfo spellEffectInfo, float range, Position position, WorldObject referer,
@@ -1761,7 +1761,7 @@ namespace Game.Spells
float extraSearchRadius = range > 0.0f ? SharedConst.ExtraCellSearchRadius : 0.0f;
var check = new WorldObjectSpellAreaTargetCheck(range, position, m_caster, referer, m_spellInfo, selectionType, condList, objectType, searchReason);
var searcher = new WorldObjectListSearcher(m_caster, targets, check, containerTypeMask);
var searcher = new WorldObjectListSearcher(PhasingHandler.GetAlwaysVisiblePhaseShift(), targets, check, containerTypeMask);
SearchTargets(searcher, containerTypeMask, m_caster, position, range + extraSearchRadius);
}
@@ -1870,7 +1870,7 @@ namespace Game.Spells
var check = new GameObjectFocusCheck(m_caster, m_spellInfo.RequiresSpellFocus);
var searcher = new GameObjectSearcher(m_caster, check);
SearchTargets(searcher, GridMapTypeMask.GameObject, m_caster, m_caster, m_caster.GetVisibilityRange());
return searcher.GetTarget();
return searcher.GetResult();
}
void PrepareDataForTriggerSystem()
+8 -10
View File
@@ -5239,17 +5239,15 @@ namespace Game.Spells
if (unitTarget == null)
return;
List<WorldObject> objs = new();
ObjectEntryAndPrivateOwnerIfExistsCheck check = new(unitTarget.GetGUID(), (uint)effectInfo.MiscValue);
WorldObjectListSearcher checker = new(unitTarget, objs, check, GridMapTypeMask.Conversation);
Cell.VisitGridObjects(unitTarget, checker, 100.0f);
foreach (WorldObject obj in objs)
var check = new ObjectEntryAndPrivateOwnerIfExistsCheck(unitTarget.GetGUID(), (uint)effectInfo.MiscValue);
IDoWork<Conversation> work = conversation =>
{
Conversation convo = obj.ToConversation();
if (convo != null)
convo.Remove();
}
if (check.Invoke(conversation))
conversation.Remove();
};
ConversationWorker worker = new(unitTarget, work);
Cell.VisitGridObjects(unitTarget, worker, 100.0f);
}
[SpellEffectHandler(SpellEffectName.AddGarrisonFollower)]
+4 -1
View File
@@ -7,6 +7,7 @@ using Game.DataStorage;
using Game.Entities;
using Game.Networking;
using Game.Networking.Packets;
using System;
using System.Collections.Generic;
namespace Game.Chat
@@ -16,7 +17,7 @@ namespace Game.Chat
public virtual dynamic Invoke(Locale locale = Locale.enUS) { return default; }
}
public class ChatPacketSender : IDoWork<Player>
public class ChatPacketSender
{
ChatMsg Type;
Language Language;
@@ -72,6 +73,8 @@ namespace Game.Chat
}
}
public static implicit operator IDoWork<Player>(ChatPacketSender obj) => obj.Invoke;
public void Invoke(Player player)
{
if (!player.MeetPlayerCondition(PlayerConditionID))
+6 -4
View File
@@ -447,8 +447,12 @@ namespace Game
Max = 2,
}
public class CreatureTextLocalizer : IDoWork<Player>
public class CreatureTextLocalizer
{
Dictionary<Locale, ChatPacketSender> _packetCache = new();
MessageBuilder _builder;
ChatMsg _msgType;
public CreatureTextLocalizer(MessageBuilder builder, ChatMsg msgType)
{
_builder = builder;
@@ -484,9 +488,7 @@ namespace Game
sender.Invoke(player);
}
Dictionary<Locale, ChatPacketSender> _packetCache = new();
MessageBuilder _builder;
ChatMsg _msgType;
public static implicit operator IDoWork<Player>(CreatureTextLocalizer obj) => obj.Invoke;
}
public class CreatureTextBuilder : MessageBuilder
+4 -2
View File
@@ -2728,15 +2728,17 @@ namespace Game
uint i_textId;
object[] i_args;
public class MultiplePacketSender : IDoWork<Player>
public class MultiplePacketSender
{
public List<ServerPacket> Packets = new();
public void Invoke(Player receiver)
{
foreach (var packet in Packets)
receiver.SendPacket(packet);
}
public List<ServerPacket> Packets = new();
public static implicit operator IDoWork<Player>(MultiplePacketSender obj) => obj.Invoke;
}
}
+2 -2
View File
@@ -678,9 +678,9 @@ namespace Scripts.Spells.Generic
AnyDeadUnitSpellTargetInRangeCheck<WorldObject> check = new(caster, max_range, GetSpellInfo(), SpellTargetCheckTypes.Enemy, SpellTargetObjectTypes.CorpseEnemy);
WorldObjectSearcher searcher = new(caster, check);
Cell.VisitWorldObjects(caster, searcher, max_range);
if (searcher.GetTarget() == null)
if (searcher.GetResult() == null)
Cell.VisitGridObjects(caster, searcher, max_range);
if (searcher.GetTarget() == null)
if (searcher.GetResult() == null)
return SpellCastResult.NoEdibleCorpses;
return SpellCastResult.SpellCastOk;
}