diff options
author | NoName <322016+Faq@users.noreply.github.com> | 2020-01-17 17:50:50 +0200 |
---|---|---|
committer | Giacomo Pozzoni <giacomopoz@gmail.com> | 2020-01-17 16:50:50 +0100 |
commit | b3b7f0761d5605d57f9d62ca8e22a8cd9a4df24b (patch) | |
tree | 6ce8c9decabdc7762602bd87df56232a706b45a0 /src | |
parent | 89421422865b0d7743db22bb165bba0a3d8f2cfc (diff) |
Core/Spells: SPELL_AURA_48 implementation (#24054)
by xvwyh
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 | 27 | ||||
-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 | 2 |
8 files changed, 42 insertions, 12 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 6a00eeef85e..694b675256e 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4503,6 +4503,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->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell) + return true; + return false; +} + bool Unit::HasNegativeAuraWithInterruptFlag(uint32 flag, ObjectGuid guid) const { if (!(m_interruptMask & flag)) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index 24894fd6e5f..e1bad058282 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1289,6 +1289,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; bool HasNegativeAuraWithInterruptFlag(uint32 flag, ObjectGuid guid = ObjectGuid::Empty) const; bool HasAuraWithMechanic(uint32 mechanicMask) const; bool HasStrongerAuraWithDR(SpellInfo const* auraSpellInfo, Unit* caster, bool triggered) const; diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index 71aec844957..c8257c34f30 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -787,15 +787,32 @@ void WorldSession::HandlePetCastSpellOpcode(WorldPacket& recvPacket) return; } - // do not cast not learned spells - if (!caster->HasSpell(spellId) || spellInfo->IsPassive()) - return; - SpellCastTargets targets; targets.Read(recvPacket, caster); HandleClientCastFlags(recvPacket, castFlags, targets); - Spell* spell = new Spell(caster, spellInfo, TRIGGERED_NONE); + TriggerCastFlags triggerCastFlags = TRIGGERED_NONE; + + if (spellInfo->IsPassive()) + return; + + // cast only learned spells + if (!caster->HasSpell(spellId)) + { + bool allow = false; + + // allow casting of spells triggered by clientside periodic trigger auras + if (caster->HasAuraTypeWithTriggerSpell(SPELL_AURA_PERIODIC_TRIGGER_SPELL_FROM_CLIENT, spellId)) + { + allow = true; + triggerCastFlags = TRIGGERED_FULL_MASK; + } + + if (!allow) + return; + } + + Spell* spell = new Spell(caster, spellInfo, triggerCastFlags); spell->m_cast_count = castCount; // probably pending spell cast spell->m_targets = targets; diff --git a/src/server/game/Handlers/SpellHandler.cpp b/src/server/game/Handlers/SpellHandler.cpp index 74066894266..b9e64598bed 100644 --- a/src/server/game/Handlers/SpellHandler.cpp +++ b/src/server/game/Handlers/SpellHandler.cpp @@ -385,15 +385,12 @@ void WorldSession::HandleCastSpellOpcode(WorldPacket& recvPacket) 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, spellId)) { 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 4c8a9b39cbc..7646aee0361 100644 --- a/src/server/game/Spells/Auras/SpellAuraDefines.h +++ b/src/server/game/Spells/Auras/SpellAuraDefines.h @@ -125,7 +125,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 4d5a247eb5a..2c4c381229d 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -107,7 +107,7 @@ pAuraEffectHandler AuraEffectHandler[TOTAL_AURAS]= &AuraEffect::HandleAuraTrackResources, // 45 SPELL_AURA_TRACK_RESOURCES &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 @@ -571,6 +571,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: @@ -874,6 +875,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 1d2c958b3bd..3a0e858cd2b 100644 --- a/src/server/game/Spells/SpellInfo.cpp +++ b/src/server/game/Spells/SpellInfo.cpp @@ -3117,7 +3117,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: @@ -3658,6 +3658,7 @@ bool _isPositiveEffectImpl(SpellInfo const* spellInfo, uint8 effIndex, std::unor 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(spellInfo, effIndex)) { diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 399e0b0e14a..ae1b5bf712f 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2889,6 +2889,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() switch (spellInfo->Effects[j].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(spellInfo->Effects[j].TriggerSpell)) { @@ -2924,6 +2925,7 @@ void SpellMgr::LoadSpellInfoCustomAttributes() switch (spellInfo->Effects[j].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* triggerSpell = const_cast<SpellInfo*>(sSpellMgr->GetSpellInfo(spellInfo->Effects[j].TriggerSpell))) if (triggerSpell->HasAttribute(SPELL_ATTR0_CU_CAN_CRIT)) |