diff options
author | Ovahlord <dreadkiller@gmx.de> | 2024-07-11 17:30:56 +0200 |
---|---|---|
committer | Ovahlord <dreadkiller@gmx.de> | 2024-07-11 17:30:56 +0200 |
commit | dbf2a4288ec48aba441107f9b0342458f6f6ac40 (patch) | |
tree | c18d7c8071a97566e3510e175a02d097dd296267 | |
parent | fe97a864153c1fcf1bc60299aadd40c8db45ce6a (diff) |
Core/Spells: implemented SPELL_EFFECT_ACTIVATE_RUNE
-rw-r--r-- | src/server/game/Spells/Spell.h | 1 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 38 |
2 files changed, 38 insertions, 1 deletions
diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index cf27e5a1ff2..aea53ad3a1f 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -426,6 +426,7 @@ class TC_GAME_API Spell void EffectCreateTraitTreeConfig(); void EffectChangeActiveCombatTraitConfig(); void EffectTeleportGraveyard(); + void EffectActivateRune(); typedef std::unordered_set<Aura*> UsedSpellMods; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 568b6c2d3d6..94be6998143 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -415,7 +415,7 @@ NonDefaultConstructible<SpellEffectHandlerFn> SpellEffectHandlers[TOTAL_SPELL_EF &Spell::EffectNULL, //327 SPELL_EFFECT_PULL &Spell::EffectNULL, //328 SPELL_EFFECT_ADD_COMBO_POINTS &Spell::EffectResurrectNew, //329 SPELL_EFFECT_RESURRECT_NEW - &Spell::EffectNULL, //330 SPELL_EFFECT_ACTIVATE_RUNE + &Spell::EffectActivateRune, //330 SPELL_EFFECT_ACTIVATE_RUNE }; void Spell::EffectNULL() @@ -5950,3 +5950,39 @@ void Spell::EffectTeleportGraveyard() target->RepopAtGraveyard(); } + +void Spell::EffectActivateRune() +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER || !damage) + return; + + Player* player = m_caster->ToPlayer(); + if (player->GetClass() != CLASS_DEATH_KNIGHT) + return; + + // needed later + m_runesState = player->GetRunesState(); + + uint32 count = damage; + int32 miscValue = (1 << effectInfo->MiscValue); + + // Death Runes may also activate Blood Runes (Blood Tap) + if (miscValue & (1 << AsUnderlyingType(RuneType::Death))) + miscValue |= (1 << AsUnderlyingType(RuneType::Blood)); + + for (uint32 i = 0; i < MAX_RUNES && count > 0; ++i) + { + if ((1 << AsUnderlyingType(player->GetCurrentRune(i))) & miscValue && player->GetRuneCooldown(i)) + { + player->SetRuneCooldown(i, 0); + --count; + } + } + + // Send rune state diff + uint8 runesState = player->GetRunesState() & ~m_runesState; + player->AddRunePower(runesState); +} |