From 9a00d620177f4552e35851ac7d8b64ec6ff08eb7 Mon Sep 17 00:00:00 2001 From: Yaki Khadafi Date: Mon, 20 Aug 2012 11:34:49 +0300 Subject: [PATCH] [142] Implement worgen transformations Signed-off-by: Yaki Khadafi --- src/game/Spell.cpp | 15 +++++++++++++++ src/game/SpellAuraDefines.h | 2 +- src/game/SpellAuras.cpp | 2 +- src/game/Unit.cpp | 14 +++++++++++++- src/game/Unit.h | 2 ++ src/game/UnitAuraProcHandler.cpp | 2 +- src/shared/revision_nr.h | 2 +- 7 files changed, 34 insertions(+), 5 deletions(-) diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 3ad6717ea..7d85ddcbd 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -3390,7 +3390,17 @@ void Spell::cast(bool skipCheck) else if (m_spellInfo->Id == 20594) AddTriggeredSpell(65116); // Stoneskin - armor 10% for 8 sec else if (m_spellInfo->Id == 68992) // Darkflight + { AddPrecastSpell(96223); // Run Speed Marker + AddPrecastSpell(97709); // Altered Form + } + else if (m_spellInfo->Id == 68996) // Two Forms + { + if (m_caster->IsInWorgenForm()) + m_caster->RemoveSpellsCausingAura(SPELL_AURA_WORGEN_TRANSFORM); + else + AddPrecastSpell(97709); // Altered Form + } // Chaos Bane strength buff else if (m_spellInfo->Id == 71904) AddTriggeredSpell(73422); @@ -5665,6 +5675,11 @@ SpellCastResult Spell::CheckCast(bool strict) if (m_caster->IsInWater()) return SPELL_FAILED_ONLY_ABOVEWATER; } + else if (m_spellInfo->Id == 68996) // Two forms + { + if (m_caster->isInCombat()) + return SPELL_FAILED_AFFECTING_COMBAT; + } else if (m_spellInfo->SpellIconID == 156) // Holy Shock { // spell different for friends and enemies diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h index 990855490..2fdf213dd 100644 --- a/src/game/SpellAuraDefines.h +++ b/src/game/SpellAuraDefines.h @@ -393,7 +393,7 @@ enum AuraType SPELL_AURA_355 = 355, SPELL_AURA_MOD_DAMAGE_DONE_FROM_PCT_POWER = 356, SPELL_AURA_357 = 357, - SPELL_AURA_358 = 358, + SPELL_AURA_WORGEN_TRANSFORM = 358, SPELL_AURA_359 = 359, SPELL_AURA_PROC_DUPLICATE_SPELLS = 360, SPELL_AURA_361 = 361, diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 331676ab9..f7f6a4f99 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -411,7 +411,7 @@ pAuraHandler AuraHandler[TOTAL_AURAS] = &Aura::HandleUnused, //355 0 spells in 4.3.4 &Aura::HandleNULL, //356 SPELL_AURA_MOD_DAMAGE_DONE_FROM_PCT_POWER 2 spells in 4.3.4 &Aura::HandleNULL, //357 1 spells in 4.3.4 Enable Tower Assault Unit Frame - &Aura::HandleNULL, //358 5 spells in 4.3.4 forces client-side transformation to worgen form + &Aura::HandleNoImmediateEffect, //358 SPELL_AURA_WORGEN_TRANSFORM 5 spells in 4.3.4 forces client-side transformation to worgen form &Aura::HandleNULL, //359 1 spells in 4.3.4 healing done vs aurastate? &Aura::HandleNULL, //360 SPELL_AURA_PROC_DUPLICATE_SPELLS 2 spells in 4.3.4 &Aura::HandleNULL, //361 4 spells in 4.3.4 some damage spells diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 8435b62f8..fc39e4d4b 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -8171,6 +8171,9 @@ void Unit::SetInCombatState(bool PvP, Unit* enemy) if (IsNonCombatSpell(spell->m_spellInfo)) InterruptSpell(CurrentSpellTypes(i), false); + if (getRace() == RACE_WORGEN && !IsInWorgenForm(true)) + CastSpell(this, 97709, true); // cast Altered Form + if (creatureNotInCombat) { // should probably be removed for the attacked (+ it's party/group) only, not global @@ -11626,6 +11629,16 @@ bool Unit::IsSplineEnabled() const return movespline->Initialized(); } +bool Unit::IsInWorgenForm(bool inPermanent) const +{ + AuraList const& vTransformAuras = GetAurasByType(SPELL_AURA_WORGEN_TRANSFORM); + for (AuraList::const_iterator itr = vTransformAuras.begin(); itr != vTransformAuras.end(); ++itr) + if (!inPermanent || (*itr)->GetHolder()->IsPermanent()) + return true; + + return false; +} + void Unit::BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value) { if (apply) @@ -11677,7 +11690,6 @@ void Unit::BuildSendPlayVisualPacket(WorldPacket* data, uint32 value, bool impac data->WriteGuidBytes<0, 4, 1, 6, 7, 2, 3, 5>(GetObjectGuid()); } - void Unit::BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value) { if (apply) diff --git a/src/game/Unit.h b/src/game/Unit.h index e32dc378c..a269e97a7 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -1961,6 +1961,8 @@ class MANGOS_DLL_SPEC Unit : public WorldObject bool IsSplineEnabled() const; + bool IsInWorgenForm(bool inPermanent = false) const; + // Packet builders void BuildForceMoveRootPacket(WorldPacket* data, bool apply, uint32 value); void BuildMoveWaterWalkPacket(WorldPacket* data, bool apply, uint32 value); diff --git a/src/game/UnitAuraProcHandler.cpp b/src/game/UnitAuraProcHandler.cpp index ea52665e5..3380957c6 100644 --- a/src/game/UnitAuraProcHandler.cpp +++ b/src/game/UnitAuraProcHandler.cpp @@ -390,7 +390,7 @@ pAuraProcHandler AuraProcHandler[TOTAL_AURAS] = &Unit::HandleNULLProc, //355 0 spells in 4.3.4 &Unit::HandleNULLProc, //356 SPELL_AURA_MOD_DAMAGE_DONE_FROM_PCT_POWER 2 spells in 4.3.4 &Unit::HandleNULLProc, //357 1 spells in 4.3.4 Enable Tower Assault Unit Frame - &Unit::HandleNULLProc, //358 5 spells in 4.3.4 worgen form/mount related + &Unit::HandleNULLProc, //358 SPELL_AURA_WORGEN_TRANSFORM 5 spells in 4.3.4 forces client-side transformation to worgen form &Unit::HandleNULLProc, //359 1 spells in 4.3.4 healing done vs aurastate? &Unit::HandleNULLProc, //360 SPELL_AURA_PROC_DUPLICATE_SPELLS 2 spells in 4.3.4 &Unit::HandleNULLProc, //361 4 spells in 4.3.4 some damage spells diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 5047cdba8..64ba61313 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "0141" + #define REVISION_NR "0142" #endif // __REVISION_NR_H__