diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Handlers/SpellHandler.cpp | 5 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraDefines.h | 2 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/SpellInfo.cpp | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 1 |
8 files changed, 40 insertions, 11 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 1f0168b560c..1f16f9789b1 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4431,6 +4431,14 @@ bool Unit::HasAuraTypeWithValue(AuraType auraType, int32 value) const return false; } +bool Unit::HasAuraTypeWithTriggerSpell(AuraType auratype, uint32 triggerSpell) const +{ + for (AuraEffect const* aura : GetAuraEffectsByType(auratype)) + if (aura->GetSpellEffectInfo().TriggerSpell == triggerSpell) + return true; + return false; +} + template <typename InterruptFlags> bool Unit::HasNegativeAuraWithInterruptFlag(InterruptFlags flag, ObjectGuid guid) const { diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 180398e74d8..1708a6b8a6d 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1409,6 +1409,7 @@ class TC_GAME_API Unit : public WorldObject bool HasAuraTypeWithMiscvalue(AuraType auraType, int32 miscValue) const; bool HasAuraTypeWithAffectMask(AuraType auraType, SpellInfo const* affectedSpell) const; bool HasAuraTypeWithValue(AuraType auraType, int32 value) const; + bool HasAuraTypeWithTriggerSpell(AuraType auratype, uint32 triggerSpell) const; template <typename InterruptFlags> bool HasNegativeAuraWithInterruptFlag(InterruptFlags flag, ObjectGuid guid = ObjectGuid::Empty) const; bool HasAuraWithMechanic(uint32 mechanicMask) const; diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index bd1e1def02e..da0e46c5a1d 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -686,13 +686,30 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPackets::Spells::PetCastSpell& return; } - // do not cast not learned spells - if (!caster->HasSpell(spellInfo->Id) || spellInfo->IsPassive()) + SpellCastTargets targets(caster, petCastSpell.Cast); + + TriggerCastFlags triggerCastFlags = TRIGGERED_NONE; + + if (spellInfo->IsPassive()) return; - SpellCastTargets targets(caster, petCastSpell.Cast); + // cast only learned spells + if (!caster->HasSpell(spellInfo->Id)) + { + bool allow = false; + + // allow casting of spells triggered by clientside periodic trigger auras + if (caster->HasAuraTypeWithTriggerSpell(SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT, spellInfo->Id)) + { + allow = true; + triggerCastFlags = TRIGGERED_FULL_MASK; + } + + if (!allow) + return; + } - Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); + Spell* spell = new Spell(caster, spellInfo, triggerCastFlags); spell->m_fromClient = true; spell->m_misc.Raw.Data[0] = petCastSpell.Cast.Misc[0]; spell->m_misc.Raw.Data[1] = petCastSpell.Cast.Misc[1]; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 4f38b11d328..8d62c27d64a 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -315,15 +315,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPackets::Spells::CastSpell& cast) if (go->GetSpellForLock(caster->ToPlayer()) == spellInfo) allow = true; - // TODO: Preparation for #23204 // allow casting of spells triggered by clientside periodic trigger auras - /* - if (caster->HasAuraTypeWithTriggerSpell(SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT, spellId)) + if (caster->HasAuraTypeWithTriggerSpell(SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT, spellInfo->Id)) { allow = true; triggerFlag = TRIGGERED_FULL_MASK; } - */ if (!allow) return; diff --git a/src/server/game/Spells/Auras/SpellAuraDefines.h b/src/server/game/Spells/Auras/SpellAuraDefines.h index cd1211a9946..a56048669cc 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -133,7 +133,7 @@ enum AuraType : uint32 SPELL_AURA_TRACK_RESOURCES = 45, SPELL_AURA_46 = 46, // Ignore all Gear test spells SPELL_AURA_MOD_PARRY_PERCENT = 47, - SPELL_AURA_48 = 48, // One periodic spell + SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT = 48, // One periodic spell SPELL_AURA_MOD_DODGE_PERCENT = 49, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT = 50, SPELL_AURA_MOD_BLOCK_PERCENT = 51, diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 9014af528bc..89ac2d948a6 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -116,7 +116,7 @@ NonDefaultConstructible<pAuraEffectHandler> AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleNULL, // 45 SPELL_AURA_TRACK_RESOURCES implemented clientside &AuraEffect::HandleNULL, // 46 SPELL_AURA_46 (used in test spells 54054 and 54058, and spell 48050) (3.0.8a) &AuraEffect::HandleAuraModParryPercent, // 47 SPELL_AURA_MOD_PARRY_PERCENT - &AuraEffect::HandleNULL, // 48 SPELL_AURA_48 spell Napalm (area damage spell with additional delayed damage effect) + &AuraEffect::HandleNoImmediateEffect, // 48 SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT &AuraEffect::HandleAuraModDodgePercent, // 49 SPELL_AURA_MOD_DODGE_PERCENT &AuraEffect::HandleNoImmediateEffect, // 50 SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT implemented in Unit::SpellCriticalHealingBonus &AuraEffect::HandleAuraModBlockPercent, // 51 SPELL_AURA_MOD_BLOCK_PERCENT @@ -738,6 +738,7 @@ void AuraEffect::CalculatePeriodic(Unit* caster, bool resetPeriodicTimer /*= tru case SPELL_AURA_PERIODIC_HEAL: case SPELL_AURA_OBS_MOD_HEALTH: case SPELL_AURA_PERIODIC_TRIGGER_SPELL: + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: case SPELL_AURA_PERIODIC_ENERGIZE: case SPELL_AURA_PERIODIC_LEECH: case SPELL_AURA_PERIODIC_HEALTH_FUNNEL: @@ -1072,6 +1073,9 @@ void AuraEffect::PeriodicTick(AuraApplication* aurApp, Unit* caster) const case SPELL_AURA_PERIODIC_TRIGGER_SPELL: HandlePeriodicTriggerSpellAuraTick(target, caster); break; + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: + // Don't actually do anything - client will trigger casts of these spells by itself + break; case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: HandlePeriodicTriggerSpellWithValueAuraTick(target, caster); break; diff --git a/src/server/game/Spells/SpellInfo.cpp b/src/server/game/Spells/SpellInfo.cpp index eec5f387cbd..5052f31f7d9 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3759,7 +3759,7 @@ uint32 SpellInfo::GetMaxTicks() const case SPELL_AURA_PERIODIC_HEAL: case SPELL_AURA_OBS_MOD_HEALTH: case SPELL_AURA_OBS_MOD_POWER: - case SPELL_AURA_48: + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: case SPELL_AURA_POWER_BURN: case SPELL_AURA_PERIODIC_LEECH: case SPELL_AURA_PERIODIC_MANA_LEECH: @@ -4591,6 +4591,7 @@ bool _isPositiveEffectImpl(SpellInfo const* spellInfo, SpellEffectInfo const& ef case SPELL_AURA_ADD_TARGET_TRIGGER: return true; case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: case SPELL_AURA_PERIODIC_TRIGGER_SPELL: if (!_isPositiveTarget(effect)) { diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index ed2b8d77e94..9c5ba3d087d 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -3262,6 +3262,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() switch (spellEffectInfo.ApplyAuraName) { case SPELL_AURA_PERIODIC_TRIGGER_SPELL: + case SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT: case SPELL_AURA_PERIODIC_TRIGGER_SPELL_WITH_VALUE: if (SpellInfo const* triggerSpell = sSpellMgr->GetSpellInfo(spellEffectInfo.TriggerSpell, DIFFICULTY_NONE)) { |