fix(Core/Spells): Delayed Damage system (#16183)

This commit is contained in:
Angelo Venturini
2023-05-07 08:58:38 -03:00
committed by GitHub
parent 444793346d
commit d282cce4af
8 changed files with 35 additions and 9 deletions

View File

@@ -20,7 +20,7 @@
class Unit;
class IWorld;
void IWorld::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss)
void IWorld::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId)
{
DelayedDamage delayedDamage;
delayedDamage.attacker = attacker;
@@ -31,5 +31,7 @@ void IWorld::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, Clean
delayedDamage.damageSchoolMask = damageSchoolMask;
delayedDamage.spellProto = spellProto;
delayedDamage.durabilityLoss = durabilityLoss;
delayedDamage.mapId = mapId;
delayedDamage.instanceId = instanceId;
_delayedDamages.push_back(delayedDamage);
}

View File

@@ -524,7 +524,7 @@ public:
[[nodiscard]] virtual WorldSession* FindSession(uint32 id) const = 0;
[[nodiscard]] virtual WorldSession* FindOfflineSession(uint32 id) const = 0;
[[nodiscard]] virtual WorldSession* FindOfflineSessionForCharacterGUID(ObjectGuid::LowType guidLow) const = 0;
virtual void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss);
virtual void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId);
virtual void AddSession(WorldSession* s) = 0;
virtual bool KickSession(uint32 id) = 0;
virtual void UpdateMaxSessionCounters() = 0;

View File

@@ -3340,7 +3340,7 @@ CliCommandHolder::~CliCommandHolder()
free(m_command);
}
void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss)
void World::AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId)
{
DelayedDamage delayedDamage;
delayedDamage.attacker = attacker;
@@ -3351,6 +3351,8 @@ void World::AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanD
delayedDamage.damageSchoolMask = damageSchoolMask;
delayedDamage.spellProto = spellProto;
delayedDamage.durabilityLoss = durabilityLoss;
delayedDamage.mapId = mapId;
delayedDamage.instanceId = instanceId;
_delayedDamages.push_back(delayedDamage);
}
@@ -3358,10 +3360,18 @@ void World::ProcessDelayedDamages()
{
for (auto& damage : _delayedDamages)
{
if (!damage.victim)
// Get map first
Map* map = sMapMgr->FindMap(damage.mapId, damage.instanceId);
if (!map)
continue;
Unit::DealDamage(damage.attacker, damage.victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss);
// Now we get both, attacker and victim, but attacker can be null (although attacker is always a player).
Unit* attacker = ObjectAccessor::GetUnit(map, damage.attacker);
Unit* victim = ObjectAccessor::GetUnit(map, damage.victim);
if (!victim)
continue;
Unit::DealDamage(attacker, victim, damage.damage, damage.cleanDamage, damage.damagetype, damage.damageSchoolMask, damage.spellProto, damage.durabilityLoss);
}
_delayedDamages.clear();
}

View File

@@ -355,7 +355,7 @@ public:
void RemoveOldCorpses() override;
void AddDelayedDamage(Unit* attacker, Unit* victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss) override;
void AddDelayedDamage(ObjectGuid attacker, ObjectGuid victim, uint32 damage, CleanDamage const* cleanDamage, DamageEffectType damagetype, SpellSchoolMask damageSchoolMask, SpellInfo const* spellProto, bool durabilityLoss, uint32 mapId, uint32 instanceId) override;
void ProcessDelayedDamages();