aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Entities/Player/Player.cpp12
-rwxr-xr-xsrc/server/game/Spells/Auras/SpellAuraEffects.cpp44
2 files changed, 35 insertions, 21 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 78417213e8d..e750c185f69 100755
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2496,18 +2496,22 @@ void Player::SetGameMaster(bool on)
getHostileRefManager().setOnlineOfflineState(false);
CombatStopWithPets();
- SetPhaseMask(PHASEMASK_ANYWHERE,false); // see and visible in all phases
+ SetPhaseMask(PHASEMASK_ANYWHERE, false); // see and visible in all phases
m_serverSideVisibilityDetect.SetValue(SERVERSIDE_VISIBILITY_GM, GetSession()->GetSecurity());
}
else
{
// restore phase
+ uint32 newPhase = 0;
AuraEffectList const& phases = GetAuraEffectsByType(SPELL_AURA_PHASE);
if (!phases.empty())
- SetPhaseMask(phases.front()->GetMiscValue(), false);
- else
- SetPhaseMask(PHASEMASK_NORMAL, false);
+ for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
+ newPhase |= (*itr)->GetMiscValue();
+
+ if (!newPhase)
+ newPhase = PHASEMASK_NORMAL;
+ SetPhaseMask(newPhase, false);
m_ExtraFlags &= ~ PLAYER_EXTRA_GM_ON;
setFactionForRace(getRace());
diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
index 7f971a3f46e..a877d7ea5e3 100755
--- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp
+++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp
@@ -2901,33 +2901,43 @@ void AuraEffect::HandlePhase(AuraApplication const * aurApp, uint8 mode, bool ap
Unit * target = aurApp->GetTarget();
// no-phase is also phase state so same code for apply and remove
+ uint32 newPhase = 0;
+ Unit::AuraEffectList const& phases = target->GetAuraEffectsByType(SPELL_AURA_PHASE);
+ if (!phases.empty())
+ for (Unit::AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
+ newPhase |= (*itr)->GetMiscValue();
+
// phase auras normally not expected at BG but anyway better check
- if (target->GetTypeId() == TYPEID_PLAYER)
+ if (Player* player = target->ToPlayer())
{
+ if (!newPhase)
+ newPhase = PHASEMASK_NORMAL;
+
// drop flag at invisible in bg
- if (target->ToPlayer()->InBattleground())
- if (Battleground *bg = target->ToPlayer()->GetBattleground())
- bg->EventPlayerDroppedFlag(target->ToPlayer());
+ if (player->InBattleground())
+ if (Battleground *bg = player->GetBattleground())
+ bg->EventPlayerDroppedFlag(player);
// GM-mode have mask 0xFFFFFFFF
- if (!target->ToPlayer()->isGameMaster())
+ if (player->isGameMaster())
+ newPhase = 0xFFFFFFFF;
+
+ player->SetPhaseMask(newPhase, false);
+ player->GetSession()->SendSetPhaseShift(newPhase);
+ }
+ else
+ {
+ if (!newPhase)
{
- if (apply)
- target->SetPhaseMask(GetMiscValue(), false);
- else
- target->SetPhaseMask(PHASEMASK_NORMAL, false);
+ newPhase = PHASEMASK_NORMAL;
+ if (Creature* creature = target->ToCreature())
+ if (CreatureData const* data = sObjectMgr.GetCreatureData(creature->GetDBTableGUIDLow()))
+ newPhase = data->phaseMask;
}
- if (apply)
- target->ToPlayer()->GetSession()->SendSetPhaseShift(GetMiscValue());
- else
- target->ToPlayer()->GetSession()->SendSetPhaseShift(PHASEMASK_NORMAL);
+ target->SetPhaseMask(newPhase, false);
}
- else if (apply)
- target->SetPhaseMask(GetMiscValue(), false);
- else
- target->SetPhaseMask(PHASEMASK_NORMAL, false);
// need triggering visibility update base at phase update of not GM invisible (other GMs anyway see in any phases)
if (!target->IsVisible())