diff options
| author | ForesterDev <11771800+ForesterDev@users.noreply.github.com> | 2020-06-07 11:22:13 +0300 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-06 20:46:25 +0100 |
| commit | 3171cd3fa9dbcec43f5d70b74ab2f54a2aa44173 (patch) | |
| tree | 838c54078c04b1fdae4ec1aac6fdc70ebdae45b2 /src/server/scripts/EasternKingdoms/SunwellPlateau | |
| parent | f0242d4ec7857a18145dd0a9965fcb8526e981c8 (diff) | |
Core/AI: refactor SpellHit and SpellHitTarget. (#24691)
* Core/AI: refactor SpellHit and SpellHitTarget.
- now caster/target is WorldObject instead of Unit
- remove SpellHitByGameObject / SpellHitTargetGameObject (handled by SpellHit / SpellHitTarget)
- rename parameters in scripts according parent methods
* Restore logic in Algalon script
* Changed check for REMORSELESS_WINTER hit to avoid dublicate call, because it has TARGET_UNIT_CASTER for effects 0/1 and TARGET_GAMEOBJECT_SRC_AREA for effect 2
* Fix build after merge
(cherry picked from commit e3b232fe0e5c21a87d3fe71813e9d750259823f1)
Diffstat (limited to 'src/server/scripts/EasternKingdoms/SunwellPlateau')
4 files changed, 49 insertions, 27 deletions
diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp index 21824b23ced..c47024e7f7d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_eredar_twins.cpp @@ -161,18 +161,22 @@ public: me->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override { - switch (spell->Id) + Unit* unitTarget = target->ToUnit(); + if (!unitTarget) + return; + + switch (spellInfo->Id) { case SPELL_SHADOW_BLADES: case SPELL_SHADOW_NOVA: case SPELL_CONFOUNDING_BLOW: case SPELL_SHADOW_FURY: - HandleTouchedSpells(target, SPELL_DARK_TOUCHED); + HandleTouchedSpells(unitTarget, SPELL_DARK_TOUCHED); break; case SPELL_CONFLAGRATION: - HandleTouchedSpells(target, SPELL_FLAME_TOUCHED); + HandleTouchedSpells(unitTarget, SPELL_FLAME_TOUCHED); break; } } @@ -437,19 +441,23 @@ public: me->RemoveDynamicFlag(UNIT_DYNFLAG_LOOTABLE); } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override { - switch (spell->Id) + Unit* unitTarget = target->ToUnit(); + if (!unitTarget) + return; + + switch (spellInfo->Id) { case SPELL_BLAZE: - target->CastSpell(target, SPELL_BLAZE_SUMMON, true); + target->CastSpell(unitTarget, SPELL_BLAZE_SUMMON, true); break; case SPELL_CONFLAGRATION: case SPELL_FLAME_SEAR: - HandleTouchedSpells(target, SPELL_FLAME_TOUCHED); + HandleTouchedSpells(unitTarget, SPELL_FLAME_TOUCHED); break; case SPELL_SHADOW_NOVA: - HandleTouchedSpells(target, SPELL_DARK_TOUCHED); + HandleTouchedSpells(unitTarget, SPELL_DARK_TOUCHED); break; } } @@ -674,19 +682,25 @@ public: void JustEngagedWith(Unit* /*who*/) override { } - void SpellHitTarget(Unit* target, SpellInfo const* spell) override + void SpellHitTarget(WorldObject* target, SpellInfo const* spellInfo) override { - switch (spell->Id) + Unit* unitTarget = target->ToUnit(); + if (!unitTarget) + return; + + switch (spellInfo->Id) { case SPELL_SHADOW_FURY: case SPELL_DARK_STRIKE: - if (!target->HasAura(SPELL_DARK_FLAME)) + if (!unitTarget->HasAura(SPELL_DARK_FLAME)) { - if (target->HasAura(SPELL_FLAME_TOUCHED)) + if (unitTarget->HasAura(SPELL_FLAME_TOUCHED)) { - target->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED); - target->CastSpell(target, SPELL_DARK_FLAME, true); - } else target->CastSpell(target, SPELL_DARK_TOUCHED, true); + unitTarget->RemoveAurasDueToSpell(SPELL_FLAME_TOUCHED); + unitTarget->CastSpell(unitTarget, SPELL_DARK_FLAME, true); + } + else + unitTarget->CastSpell(unitTarget, SPELL_DARK_TOUCHED, true); } break; } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp index 06daddd4086..22bbe3f3a16 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_felmyst.cpp @@ -198,26 +198,30 @@ public: instance->SetBossState(DATA_FELMYST, DONE); } - void SpellHit(Unit* caster, SpellInfo const* spell) override + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override { + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; + // workaround for linked aura /*if (spell->Id == SPELL_VAPOR_FORCE) { caster->CastSpell(caster, SPELL_VAPOR_TRIGGER, true); }*/ // workaround for mind control - if (spell->Id == SPELL_FOG_INFORM) + if (spellInfo->Id == SPELL_FOG_INFORM) { float x, y, z; - caster->GetPosition(x, y, z); + unitCaster->GetPosition(x, y, z); if (Unit* summon = me->SummonCreature(NPC_DEAD, x, y, z, 0, TEMPSUMMON_TIMED_DESPAWN_OUT_OF_COMBAT, 5000)) { - summon->SetMaxHealth(caster->GetMaxHealth()); - summon->SetHealth(caster->GetMaxHealth()); + summon->SetMaxHealth(unitCaster->GetMaxHealth()); + summon->SetHealth(unitCaster->GetMaxHealth()); summon->CastSpell(summon, SPELL_FOG_CHARM, true); summon->CastSpell(summon, SPELL_FOG_CHARM2, true); } - Unit::DealDamage(me, caster, caster->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); + Unit::DealDamage(me, unitCaster, unitCaster->GetHealth(), nullptr, DIRECT_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, nullptr, false); } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp index b68a4e1b85e..d5d97000f8d 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_kalecgos.cpp @@ -473,12 +473,16 @@ struct boss_sathrovarr : public BossAI kalecgos->AI()->EnterEvadeMode(why); } - void SpellHit(Unit* caster, SpellInfo const* spell) override + void SpellHit(WorldObject* caster, SpellInfo const* spellInfo) override { - if (spell->Id == SPELL_TAP_CHECK_DAMAGE) + Unit* unitCaster = caster->ToUnit(); + if (!unitCaster) + return; + + if (spellInfo->Id == SPELL_TAP_CHECK_DAMAGE) { DoCastSelf(SPELL_TELEPORT_BACK, true); - Unit::Kill(caster, me); + Unit::Kill(unitCaster, me); } } diff --git a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp index d209fdac0bd..7bd73347679 100644 --- a/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp +++ b/src/server/scripts/EasternKingdoms/SunwellPlateau/boss_muru.cpp @@ -353,9 +353,9 @@ public: summon->m_Events.AddEvent(new VoidSpawnSummon(summon), summon->m_Events.CalculateTime(1500)); } - void SpellHit(Unit* /*caster*/, SpellInfo const* spell) override + void SpellHit(WorldObject* /*caster*/, SpellInfo const* spellInfo) override { - switch (spell->Id) + switch (spellInfo->Id) { case SPELL_OPEN_ALL_PORTALS: DoCastAOE(SPELL_OPEN_PORTAL, true); |
