From dcd017bbad0de9f17ee96b6b6d6b03aa2fa63868 Mon Sep 17 00:00:00 2001 From: ariel- Date: Sat, 10 Mar 2018 20:25:50 -0300 Subject: [PATCH] Core/Spell: fix LoS checks for GameObject spells Closes #21580 --- .../game/Entities/GameObject/GameObjectData.h | 13 +++++++++++++ src/server/game/Spells/Spell.cpp | 5 +++++ 2 files changed, 18 insertions(+) diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h index 499643cc47c..3d66f9f5758 100644 --- a/src/server/game/Entities/GameObject/GameObjectData.h +++ b/src/server/game/Entities/GameObject/GameObjectData.h @@ -456,6 +456,19 @@ struct GameObjectTemplate } } + bool IsIgnoringLOSChecks() const + { + switch (type) + { + case GAMEOBJECT_TYPE_BUTTON: return button.losOK == 0; + case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.losOK == 0; + case GAMEOBJECT_TYPE_CHEST: return chest.losOK == 0; + case GAMEOBJECT_TYPE_GOOBER: return goober.losOK == 0; + case GAMEOBJECT_TYPE_FLAGSTAND: return flagstand.losOK == 0; + default: return false; + } + } + uint32 GetLockId() const { switch (type) diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index c0e9a0c7d35..2766201e8b4 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -7398,6 +7398,11 @@ bool Spell::CheckEffectTarget(Unit const* target, uint32 eff, Position const* lo if (m_spellInfo->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_spellInfo->Id, nullptr, SPELL_DISABLE_LOS)) return true; + // check if gameobject ignores LOS + if (GameObject const* gobCaster = m_caster->ToGameObject()) + if (gobCaster->GetGOInfo()->IsIgnoringLOSChecks()) + return true; + // if spell is triggered, need to check for LOS disable on the aura triggering it and inherit that behaviour if (IsTriggered() && m_triggeredByAuraSpell && (m_triggeredByAuraSpell->HasAttribute(SPELL_ATTR2_CAN_TARGET_NOT_IN_LOS) || DisableMgr::IsDisabledFor(DISABLE_TYPE_SPELL, m_triggeredByAuraSpell->Id, nullptr, SPELL_DISABLE_LOS))) return true;