From 430c634fd366cfafa3523828f2ef46b7ea653fe9 Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Tue, 27 Jan 2009 17:00:16 +0300 Subject: [PATCH] [7195] Implement SPELL_AURA_PHASE (261) and basics of phases system work (for player/creatures/pets only) --- src/game/Player.cpp | 28 ++++++++++++++++------------ src/game/SpellAuraDefines.h | 2 +- src/game/SpellAuras.cpp | 26 ++++++++++++++++++++++++-- src/game/SpellAuras.h | 1 + src/game/SpellMgr.cpp | 4 ++++ src/game/Unit.cpp | 30 ++++++++++++++++++++++++++++-- src/shared/revision_nr.h | 2 +- 7 files changed, 75 insertions(+), 18 deletions(-) diff --git a/src/game/Player.cpp b/src/game/Player.cpp index fae9c1e50..de939cb28 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -18880,20 +18880,24 @@ void Player::UpdateZoneDependentAuras( uint32 newZone ) } // Some spells applied at enter into zone (with subzones) - // Human Illusion - // NOTE: these are removed by RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CHANGE_MAP); - if ( newZone == 2367 ) // Old Hillsbrad Foothills + switch(newZone) { - uint32 spellid = 0; - // all horde races - if( GetTeam() == HORDE ) - spellid = getGender() == GENDER_FEMALE ? 35481 : 35480; - // and some alliance races - else if( getRace() == RACE_NIGHTELF || getRace() == RACE_DRAENEI ) - spellid = getGender() == GENDER_FEMALE ? 35483 : 35482; + case 2367: // Old Hillsbrad Foothills + { + // Human Illusion + // NOTE: these are removed by RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_CHANGE_MAP); + uint32 spellid = 0; + // all horde races + if( GetTeam() == HORDE ) + spellid = getGender() == GENDER_FEMALE ? 35481 : 35480; + // and some alliance races + else if( getRace() == RACE_NIGHTELF || getRace() == RACE_DRAENEI ) + spellid = getGender() == GENDER_FEMALE ? 35483 : 35482; - if(spellid && !HasAura(spellid,0) ) - CastSpell(this,spellid,true); + if(spellid && !HasAura(spellid,0) ) + CastSpell(this,spellid,true); + break; + } } } diff --git a/src/game/SpellAuraDefines.h b/src/game/SpellAuraDefines.h index 0e6dc12b0..cbfd8c3fd 100644 --- a/src/game/SpellAuraDefines.h +++ b/src/game/SpellAuraDefines.h @@ -303,7 +303,7 @@ enum AuraType SPELL_AURA_258 = 258, SPELL_AURA_259 = 259, SPELL_AURA_SCREEN_EFFECT = 260, - SPELL_AURA_261 = 261, + SPELL_AURA_PHASE = 261, SPELL_AURA_262 = 262, SPELL_AURA_ALLOW_ONLY_ABILITY = 263, SPELL_AURA_264 = 264, diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index ba6c10424..ae09a0a57 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -311,9 +311,9 @@ pAuraHandler AuraHandler[TOTAL_AURAS]= &Aura::HandleNULL, //258 SPELL_AURA_MOD_SPELL_VISUAL &Aura::HandleNULL, //259 corrupt healing over time spell &Aura::HandleNoImmediateEffect, //260 SPELL_AURA_SCREEN_EFFECT (miscvalue = id in ScreenEffect.dbc) not required any code - &Aura::HandleNULL, //261 out of phase? + &Aura::HandlePhase, //261 SPELL_AURA_PHASE undetactable invisibility? implemented in Unit::isVisibleForOrDetect &Aura::HandleNULL, //262 - &Aura::HandleNULL, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilites set in SpellClassMask + &Aura::HandleNULL, //263 SPELL_AURA_ALLOW_ONLY_ABILITY player can use only abilities set in SpellClassMask &Aura::HandleNULL, //264 unused &Aura::HandleNULL, //265 unused &Aura::HandleNULL, //266 unused @@ -6568,3 +6568,25 @@ void Aura::HandleAuraConvertRune(bool apply, bool Real) } } } + +void Aura::HandlePhase(bool apply, bool Real) +{ + // no-phase is also phase state so same code for apply and remove + + // phase auras normaly not expected at BG but anyway better check + if(Real && m_target->GetTypeId()==TYPEID_PLAYER) + { + // drop flag at invisible in bg + if(((Player*)m_target)->InBattleGround()) + if(BattleGround *bg = ((Player*)m_target)->GetBattleGround()) + bg->EventPlayerDroppedFlag((Player*)m_target); + } + + // apply/remove only if not in GM invisibility + if(m_target->GetVisibility()!=VISIBILITY_OFF) + { + // just need triggering visibility update base at aura presence + m_target->SetVisibility(m_target->GetVisibility()); + } +} + diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h index a1ba34f24..a9877d5d2 100644 --- a/src/game/SpellAuras.h +++ b/src/game/SpellAuras.h @@ -208,6 +208,7 @@ class MANGOS_DLL_SPEC Aura void HandleAuraConvertRune(bool apply, bool Real); void HandleAuraIncreaseBaseHealthPercent(bool Apply, bool Real); void HandleNoReagentUseAura(bool Apply, bool Real); + void HandlePhase(bool Apply, bool Real); virtual ~Aura(); diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp index b62a2c8b6..9e3137118 100644 --- a/src/game/SpellMgr.cpp +++ b/src/game/SpellMgr.cpp @@ -2383,6 +2383,10 @@ uint8 GetSpellAllowedInLocationError(SpellEntry const *spellInfo,uint32 map_id,u case 51721: // Dominion Over Acherus case 54055: // Dominion Over Acherus return area_id == 4281 || area_id == 4342 ? 0 : SPELL_FAILED_INCORRECT_AREA; + case 51852: // The Eye of Acherus + { + return map_id == 609 ? 0 : SPELL_FAILED_REQUIRES_AREA; + } case 54119: // Mist of the Kvaldir return area_id == 4028 || area_id == 4029 || area_id == 4106 || area_id == 4031 ? 0 : SPELL_FAILED_INCORRECT_AREA; } diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index ecc6d321f..d4db27891 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -9001,8 +9001,11 @@ bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList, return false; } - // Visible units, always are visible for all units, except for units under invisibility - if (m_Visibility == VISIBILITY_ON && u->m_invisibilityMask==0) + AuraList const& thisPhaseList = GetAurasByType (SPELL_AURA_PHASE); + AuraList const& uPhaseList = u->GetAurasByType (SPELL_AURA_PHASE); + + // Visible units, always are visible for all units, except for units under invisibility and phases + if (m_Visibility == VISIBILITY_ON && u->m_invisibilityMask==0 && thisPhaseList.empty() && uPhaseList.empty()) return true; // GMs see any players, not higher GMs and all units @@ -9018,6 +9021,29 @@ bool Unit::isVisibleForOrDetect(Unit const* u, bool detect, bool inVisibleList, if (m_Visibility == VISIBILITY_OFF) return false; + // phased visibility (both must phased or not phased) + if(thisPhaseList.empty() != uPhaseList.empty()) + return false; + + // phased visibility (in phased state work normal rules but both must have same phase) + if(!thisPhaseList.empty()) + { + bool samePhase = false; + for(AuraList::const_iterator thisItr = thisPhaseList.begin(); thisItr != thisPhaseList.end(); ++thisItr) + { + uint32 thisPhase = (*thisItr)->GetMiscValue(); + for(AuraList::const_iterator uItr = uPhaseList.begin(); uItr != uPhaseList.end(); ++uItr) + { + if((*uItr)->GetMiscValue()==thisPhase) + { + samePhase = true; + break; + } + } + } + if(!samePhase) + return false; + } // raw invisibility bool invisible = (m_invisibilityMask != 0 || u->m_invisibilityMask !=0); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index f2e3c0e71..3784904eb 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 "7194" + #define REVISION_NR "7195" #endif // __REVISION_NR_H__