diff options
author | Shauren <shauren.trinity@gmail.com> | 2024-12-04 20:00:43 +0100 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-12-06 21:19:48 +0100 |
commit | e14bc920371797149018d343d1640d9e832e351a (patch) | |
tree | 8d34c991e079c1208ffaaf361cd013f0bb5650a5 | |
parent | f9b564af3c601e5f2616708c2d6ce382034db558 (diff) |
Core/GameObjects: Fixed gameobject spell casts failing when triggered by SPELL_EFFECT_OPEN_LOCK
(cherry picked from commit 3177c410e488866ece2803ddcf9ea09ea4b2b4fb)
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/GameObject/GameObject.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 |
3 files changed, 11 insertions, 9 deletions
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index d3d2021ab1b..7e13e4f2f37 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -2563,12 +2563,14 @@ void GameObject::SwitchDoorOrButton(bool activate, bool alternative /* = false * SetGoState(GO_STATE_READY); } -void GameObject::Use(Unit* user) +void GameObject::Use(Unit* user, bool ignoreCastInProgress /*= false*/) { // by default spell caster is user Unit* spellCaster = user; uint32 spellId = 0; - bool triggered = false; + CastSpellExtraArgs spellArgs; + if (ignoreCastInProgress) + spellArgs.TriggerFlags |= TRIGGERED_IGNORE_CAST_IN_PROGRESS; if (Player* playerUser = user->ToPlayer()) { @@ -2960,7 +2962,7 @@ void GameObject::Use(Unit* user) if (fishingPool) { - fishingPool->Use(player); + fishingPool->Use(player, ignoreCastInProgress); SetLootState(GO_JUST_DEACTIVATED); } else @@ -3043,7 +3045,7 @@ void GameObject::Use(Unit* user) player->CastSpell(player, info->ritual.animSpell, true); // for this case, summoningRitual.spellId is always triggered - triggered = true; + spellArgs.TriggerFlags = TRIGGERED_FULL_MASK; } // full amount unique participants including original summoner @@ -3059,7 +3061,7 @@ void GameObject::Use(Unit* user) // spell have reagent and mana cost but it not expected use its // it triggered spell in fact cast at currently channeled GO spellId = 61993; - triggered = true; + spellArgs.TriggerFlags = TRIGGERED_FULL_MASK; } // Cast casterTargetSpell at a random GO user @@ -3439,10 +3441,10 @@ void GameObject::Use(Unit* user) sOutdoorPvPMgr->HandleCustomSpell(player, spellId, this); if (spellCaster) - spellCaster->CastSpell(user, spellId, triggered); + spellCaster->CastSpell(user, spellId, spellArgs); else { - SpellCastResult castResult = CastSpell(user, spellId); + SpellCastResult castResult = CastSpell(user, spellId, spellArgs); if (castResult == SPELL_FAILED_SUCCESS) { switch (GetGoType()) diff --git a/src/server/game/Entities/GameObject/GameObject.h b/src/server/game/Entities/GameObject/GameObject.h index 98c71a2a2f9..57bc2c5d72c 100644 --- a/src/server/game/Entities/GameObject/GameObject.h +++ b/src/server/game/Entities/GameObject/GameObject.h @@ -293,7 +293,7 @@ class TC_GAME_API GameObject : public WorldObject, public GridObject<GameObject> void EnableCollision(bool enable); - void Use(Unit* user); + void Use(Unit* user, bool ignoreCastInProgress = false); LootState getLootState() const { return m_lootState; } // Note: unit is only used when s = GO_ACTIVATED diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 1cf1a1dabc6..775cc515f76 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -1650,7 +1650,7 @@ void Spell::EffectOpenLock() } if (gameObjTarget) - gameObjTarget->Use(player); + gameObjTarget->Use(player, true); else if (itemTarget) { itemTarget->SetItemFlag(ITEM_FIELD_FLAG_UNLOCKED); |