From 16c97d35a1dd846a6d39f2378bd168ac14211596 Mon Sep 17 00:00:00 2001 From: Ovah Date: Sat, 17 Mar 2018 19:41:20 +0000 Subject: [PATCH] Phasing --- src/server/game/DataStores/DBCStructure.h | 6 +++--- src/server/game/DataStores/DBCfmt.h | 2 +- src/server/game/Entities/Player/Player.cpp | 9 ++++++++- src/server/game/Entities/Unit/Unit.cpp | 2 +- .../game/Spells/Auras/SpellAuraEffects.cpp | 18 ++++++++++++------ 5 files changed, 25 insertions(+), 12 deletions(-) diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index 53e6203f9c..33288f6cc1 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -688,9 +688,9 @@ struct AreaTriggerEntry float x; // 2 m_x float y; // 3 m_y float z; // 4 m_z - //uint32 // 5 - //uint32 // 6 - //uint32 // 7 + uint32 PhaseUseFlags; // 5 PhaseUseFlags + uint32 PhaseID; // 6 PhaseID + uint32 PhaseGroupID; // 7 PhaseGroupID float radius; // 8 m_radius float box_x; // 9 m_box_length float box_y; // 10 m_box_width diff --git a/src/server/game/DataStores/DBCfmt.h b/src/server/game/DataStores/DBCfmt.h index b782b104b3..0c0a1a1e7c 100644 --- a/src/server/game/DataStores/DBCfmt.h +++ b/src/server/game/DataStores/DBCfmt.h @@ -30,7 +30,7 @@ char const AchievementCriteriafmt[] = "niiiliiiisiiiiixxiiiiii"; char const AreaTableEntryfmt[] = "niiiixxxxxisiiiiiffiixxxxx"; char const AreaGroupEntryfmt[] = "niiiiiii"; char const AreaPOIEntryfmt[] = "niiiiiiiiiiiffixixxixx"; -char const AreaTriggerEntryfmt[] = "nifffxxxfffff"; +char const AreaTriggerEntryfmt[] = "nifffiiifffff"; char const ArmorLocationfmt[] = "nfffff"; char const AuctionHouseEntryfmt[] = "niiix"; char const BankBagSlotPricesEntryfmt[] = "ni"; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9eb05b1471..3a95b677de 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -2584,9 +2584,16 @@ void Player::SetInWater(bool apply) bool Player::IsInAreaTriggerRadius(const AreaTriggerEntry* trigger) const { - if (!trigger || GetMapId() != trigger->mapid) + if (!trigger) return false; + if (int32(GetMapId()) != trigger->mapid && !GetPhaseShift().HasVisibleMapId(trigger->mapid)) + return false; + + if (trigger->PhaseID || trigger->PhaseGroupID || trigger->PhaseUseFlags) + if (!PhasingHandler::InDbPhaseShift(this, trigger->PhaseUseFlags, trigger->PhaseID, trigger->PhaseGroupID)) + return false; + if (trigger->radius > 0.f) { // if we have radius check it diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 757a219462..8669e13c45 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -3924,7 +3924,7 @@ void Unit::RemoveNotOwnSingleTargetAuras(bool onPhaseChange /*= false*/) for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();) { Aura* aura = *iter; - if (aura->GetUnitOwner() != this && !aura->GetUnitOwner()->IsInPhase(this)) + if (aura->GetUnitOwner() != this && (!onPhaseChange || !aura->GetUnitOwner()->IsInPhase(this))) { aura->Remove(); iter = scAuras.begin(); diff --git a/src/server/game/Spells/Auras/SpellAuraEffects.cpp b/src/server/game/Spells/Auras/SpellAuraEffects.cpp index 7f39a3992a..9c972139b4 100644 --- a/src/server/game/Spells/Auras/SpellAuraEffects.cpp +++ b/src/server/game/Spells/Auras/SpellAuraEffects.cpp @@ -1704,15 +1704,17 @@ void AuraEffect::HandlePhase(AuraApplication const* aurApp, uint8 mode, bool app Unit* target = aurApp->GetTarget(); - PhasingHandler::AddPhase(target, uint32(GetMiscValueB()), true); - - // call functions which may have additional effects after chainging state of unit - // phase auras normally not expected at BG but anyway better check if (apply) { + PhasingHandler::AddPhase(target, uint32(GetMiscValueB()), true); + + // call functions which may have additional effects after chainging state of unit + // phase auras normally not expected at BG but anyway better check // drop flag at invisibiliy in bg target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION); } + else + PhasingHandler::RemovePhase(target, uint32(GetMiscValueB()), true); } void AuraEffect::HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, bool apply) const @@ -1724,13 +1726,17 @@ void AuraEffect::HandlePhaseGroup(AuraApplication const* aurApp, uint8 mode, boo PhasingHandler::AddPhaseGroup(target, uint32(GetMiscValueB()), true); - // call functions which may have additional effects after chainging state of unit - // phase auras normally not expected at BG but anyway better check if (apply) { + PhasingHandler::AddPhaseGroup(target, uint32(GetMiscValueB()), true); + + // call functions which may have additional effects after chainging state of unit + // phase auras normally not expected at BG but anyway better check // drop flag at invisibiliy in bg target->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_IMMUNE_OR_LOST_SELECTION); } + else + PhasingHandler::RemovePhaseGroup(target, uint32(GetMiscValueB()), true); } /**********************/