From bf40479db676c03ee0795a415c3f9cb6ed479351 Mon Sep 17 00:00:00 2001 From: Andrew <47818697+Nyeriah@users.noreply.github.com> Date: Sun, 19 Nov 2023 08:38:47 -0300 Subject: [PATCH] =?UTF-8?q?fix(Scripts/SSC):=20Fix=20being=20able=20to=20d?= =?UTF-8?q?amage=20Leo's=20minions=20if=20you=20are=20n=E2=80=A6=20(#17786?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Scripts/SSC): Fix being able to damage Leo's minions if you are not the target player * implement helper * Update Creature.cpp * Update Creature.h --- .../game/Entities/Creature/Creature.cpp | 9 +++++ src/server/game/Entities/Creature/Creature.h | 6 +++ .../boss_leotheras_the_blind.cpp | 38 ++++++++++++------- 3 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 44334b830..ed0b8f2de 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -3736,6 +3736,15 @@ bool Creature::CanCastSpell(uint32 spellID) const return true; } +ObjectGuid Creature::GetSummonerGUID() const +{ + if (TempSummon const* temp = ToTempSummon()) + return temp->GetSummonerGUID(); + + LOG_DEBUG("entities.unit", "Creature::GetSummonerGUID() called by creature that is not a summon. Creature: {} ({})", GetEntry(), GetName()); + return ObjectGuid::Empty; +} + std::string Creature::GetDebugInfo() const { std::stringstream sstr; diff --git a/src/server/game/Entities/Creature/Creature.h b/src/server/game/Entities/Creature/Creature.h index ede229ff7..d52dc2fd8 100644 --- a/src/server/game/Entities/Creature/Creature.h +++ b/src/server/game/Entities/Creature/Creature.h @@ -407,6 +407,12 @@ public: * */ bool CanCastSpell(uint32 spellID) const; + /** + * @brief Helper to get the creature's summoner GUID, if it is a summon + * + * */ + [[nodiscard]] ObjectGuid GetSummonerGUID() const; + std::string GetDebugInfo() const override; protected: diff --git a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp index d8d14c556..f47db3a1a 100644 --- a/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp +++ b/src/server/scripts/Outland/CoilfangReservoir/SerpentShrine/boss_leotheras_the_blind.cpp @@ -238,13 +238,6 @@ struct npc_inner_demon : public ScriptedAI if (!summoner) return; - //summoner is always the affected player - _affectedPlayerGUID = summoner->GetGUID(); - if (Unit* affectedPlayer = summoner->ToUnit()) - { - me->Attack(affectedPlayer, true); - } - scheduler.CancelAll(); scheduler.Schedule(4s, [this](TaskContext context) { @@ -255,15 +248,36 @@ struct npc_inner_demon : public ScriptedAI void JustDied(Unit* /*killer*/) override { - if (Unit* affectedPlayer = ObjectAccessor::GetUnit(*me, _affectedPlayerGUID)) + if (Unit* affectedPlayer = ObjectAccessor::GetUnit(*me, me->GetSummonerGUID())) { affectedPlayer->RemoveAurasDueToSpell(SPELL_INSIDIOUS_WHISPER); } } - void DamageTaken(Unit* who, uint32& damage, DamageEffectType, SpellSchoolMask) override + bool CanReceiveDamage(Unit* attacker) { - if (!who || who->GetGUID() != _affectedPlayerGUID) + return attacker && attacker->GetGUID() == me->GetSummonerGUID(); + } + + void OnCalculateMeleeDamageReceived(uint32& damage, Unit* attacker) override + { + if (!CanReceiveDamage(attacker)) + { + damage = 0; + } + } + + void OnCalculateSpellDamageReceived(int32& damage, Unit* attacker) override + { + if (!CanReceiveDamage(attacker)) + { + damage = 0; + } + } + + void OnCalculatePeriodicTickReceived(uint32& damage, Unit* attacker) override + { + if (!CanReceiveDamage(attacker)) { damage = 0; } @@ -271,7 +285,7 @@ struct npc_inner_demon : public ScriptedAI bool CanAIAttack(Unit const* who) const override { - return who->GetGUID() == _affectedPlayerGUID; + return who->GetGUID() == me->GetSummonerGUID(); } void UpdateAI(uint32 diff) override @@ -285,8 +299,6 @@ struct npc_inner_demon : public ScriptedAI DoMeleeAttackIfReady(); } -private: - ObjectGuid _affectedPlayerGUID; }; class spell_leotheras_whirlwind : public SpellScript