diff options
-rwxr-xr-x | src/server/game/Entities/Player/Player.cpp | 12 | ||||
-rwxr-xr-x | src/server/game/Spells/Auras/SpellAuraEffects.cpp | 44 |
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()) |