aboutsummaryrefslogtreecommitdiff
path: root/src/server
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2018-03-10 20:25:50 -0300
committerShauren <shauren.trinity@gmail.com>2021-09-06 15:10:16 +0200
commit50fe2dc7e305fa32d30bac6ad0ced2e5647ac02b (patch)
treef6501b5eaa537198f0b2e6df1fcc8e3efc980577 /src/server
parente7ef1deb6d802c15e1340911662559657fc2158b (diff)
Core/Spell: fix LoS checks for GameObject spells
Closes #21580 (cherry picked from commit f7869ad38b3ee90384667e7d1b230561180454d7)
Diffstat (limited to 'src/server')
-rw-r--r--src/server/game/Entities/GameObject/GameObjectData.h16
-rw-r--r--src/server/game/Spells/Spell.cpp5
2 files changed, 21 insertions, 0 deletions
diff --git a/src/server/game/Entities/GameObject/GameObjectData.h b/src/server/game/Entities/GameObject/GameObjectData.h
index 89ee6f97307..97689f9d63e 100644
--- a/src/server/game/Entities/GameObject/GameObjectData.h
+++ b/src/server/game/Entities/GameObject/GameObjectData.h
@@ -835,6 +835,22 @@ struct GameObjectTemplate
}
}
+ uint32 GetRequireLOS() const
+ {
+ switch (type)
+ {
+ case GAMEOBJECT_TYPE_BUTTON: return button.requireLOS;
+ case GAMEOBJECT_TYPE_QUESTGIVER: return questgiver.requireLOS;
+ case GAMEOBJECT_TYPE_CHEST: return chest.requireLOS;
+ case GAMEOBJECT_TYPE_TRAP: return trap.requireLOS;
+ case GAMEOBJECT_TYPE_GOOBER: return goober.requireLOS;
+ case GAMEOBJECT_TYPE_FLAGSTAND: return flagStand.requireLOS;
+ case GAMEOBJECT_TYPE_NEW_FLAG: return newflag.requireLOS;
+ case GAMEOBJECT_TYPE_GATHERING_NODE: return gatheringNode.requireLOS;
+ default: return 0;
+ }
+ }
+
uint32 GetLockId() const
{
switch (type)
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 7fa43bfb3eb..bc5f090bb38 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -7300,6 +7300,11 @@ bool Spell::CheckEffectTarget(Unit const* target, SpellEffectInfo const& spellEf
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()->GetRequireLOS())
+ 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;