35#include <boost/container/small_vector.hpp>
71 template<
typename Func>
87 for (
auto seat = vehicle->Seats.begin(); seat != vehicle->Seats.end(); ++seat)
100 AddPhase(
object, phaseId, object->
GetGUID(), updateVisibility, visitor);
105 bool changed =
object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
108 object->GetPhaseShift().PersonalGuid = personalGuid;
112 unit->OnPhaseChange();
115 AddPhase(controlled, phaseId, personalGuid, updateVisibility, visitor);
117 unit->RemoveNotOwnSingleTargetAuras(
true);
126 RemovePhase(
object, phaseId, updateVisibility, visitor);
131 bool changed =
object->GetPhaseShift().RemovePhase(phaseId).Erased;
135 unit->OnPhaseChange();
138 RemovePhase(controlled, phaseId, updateVisibility, visitor);
140 unit->RemoveNotOwnSingleTargetAuras(
true);
148 std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId);
158 bool changed =
false;
159 for (
uint32 phaseId : *phasesInGroup)
160 changed =
object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
163 object->GetPhaseShift().PersonalGuid = personalGuid;
167 unit->OnPhaseChange();
170 AddPhaseGroup(controlled, phasesInGroup, personalGuid, updateVisibility, visitor);
172 unit->RemoveNotOwnSingleTargetAuras(
true);
180 std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId);
190 bool changed =
false;
191 for (
uint32 phaseId : *phasesInGroup)
192 changed =
object->GetPhaseShift().RemovePhase(phaseId).Erased || changed;
196 unit->OnPhaseChange();
201 unit->RemoveNotOwnSingleTargetAuras(
true);
216 bool changed =
object->GetPhaseShift().AddVisibleMapId(visibleMapId, terrainSwapInfo);
219 changed =
object->GetPhaseShift().AddUiMapPhaseId(uiMapPhaseId) || changed;
241 bool changed =
object->GetPhaseShift().RemoveVisibleMapId(visibleMapId).Erased;
244 changed =
object->GetPhaseShift().RemoveUiMapPhaseId(uiWorldMapAreaIDSwap).Erased || changed;
259 object->GetPhaseShift().Clear();
260 object->GetSuppressedPhaseShift().Clear();
271 PhaseShift& phaseShift =
object->GetPhaseShift();
272 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
275 object->GetPhaseShift().VisibleMapIds.clear();
276 object->GetPhaseShift().UiMapPhaseIds.clear();
277 object->GetSuppressedPhaseShift().VisibleMapIds.clear();
279 for (
auto const& visibleMapPair :
sObjectMgr->GetTerrainSwaps())
285 if (visibleMapPair.first == object->
GetMapId())
292 else if (visibleMapPair.first == object->
GetMapId())
302 PhaseShift& phaseShift =
object->GetPhaseShift();
303 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
307 object->GetPhaseShift().ClearPhases();
308 object->GetSuppressedPhaseShift().ClearPhases();
310 uint32 areaId =
object->GetAreaId();
314 if (std::vector<PhaseAreaInfo>
const* newAreaPhases =
sObjectMgr->GetPhasesForArea(areaEntry->
ID))
318 if (phaseArea.SubAreaExclusions.find(areaId) != phaseArea.SubAreaExclusions.end())
321 uint32 phaseId = phaseArea.PhaseInfo->Id;
325 if (
sConditionMgr->IsObjectMeetToConditions(srcInfo, phaseArea.Conditions))
326 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId), &phaseArea.Conditions);
328 suppressedPhaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId), &phaseArea.Conditions);
335 bool changed = phaseShift.
Phases != oldPhases;
341 changed = phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
345 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(
uint32(aurEff->GetMiscValueB())))
346 for (
uint32 phaseId : *phasesInGroup)
347 changed = phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
353 unit->OnPhaseChange();
362 unit->RemoveNotOwnSingleTargetAuras(
true);
375 PhaseShift& phaseShift =
object->GetPhaseShift();
376 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
379 bool changed =
false;
383 if (itr->AreaConditions && !
sConditionMgr->IsObjectMeetToConditions(srcInfo, *itr->AreaConditions))
385 newSuppressions.
AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References);
397 changed = phaseShift.
AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References) || changed;
409 newSuppressions.
AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References);
410 for (
uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
423 changed = phaseShift.
AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References) || changed;
424 for (
uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
439 auto eraseResult = newSuppressions.
RemovePhase(phaseId);
441 if (eraseResult.Iterator != newSuppressions.
Phases.
end() || eraseResult.Erased)
442 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
447 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(
uint32(aurEff->GetMiscValueB())))
449 for (
uint32 phaseId : *phasesInGroup)
451 auto eraseResult = newSuppressions.
RemovePhase(phaseId);
453 if (eraseResult.Iterator != newSuppressions.
Phases.
end() || eraseResult.Erased)
454 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
467 for (std::pair<uint32 const, PhaseShift::VisibleMapIdRef>
const& visibleMap : newSuppressions.
VisibleMapIds)
468 suppressedPhaseShift.
AddVisibleMapId(visibleMap.first, visibleMap.second.VisibleMapInfo, visibleMap.second.References);
498 phaseShiftChange.VisibleMapIDs.reserve(phaseShift.VisibleMapIds.size());
499 std::transform(phaseShift.VisibleMapIds.begin(), phaseShift.VisibleMapIds.end(), std::back_inserter(phaseShiftChange.VisibleMapIDs),
500 [](PhaseShift::VisibleMapIdContainer::value_type
const& visibleMapId) { return visibleMapId.first; });
501 phaseShiftChange.UiMapPhaseIDs.reserve(phaseShift.UiMapPhaseIds.size());
502 std::transform(phaseShift.UiMapPhaseIds.begin(), phaseShift.UiMapPhaseIds.end(), std::back_inserter(phaseShiftChange.UiMapPhaseIDs),
503 [](PhaseShift::UiMapPhaseIdContainer::value_type
const& uiWorldMapAreaIdSwap) { return uiWorldMapAreaIdSwap.first; });
505 player->SendDirectMessage(phaseShiftChange.Write());
544 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
545 else if (phaseGroupId)
546 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId))
547 for (
uint32 phaseInGroup : *phasesInGroup)
548 phaseShift.
AddPhase(phaseInGroup, GetPhaseFlags(phaseInGroup),
nullptr);
571 if (visibleMapId != -1)
579 return object->GetPhaseShift().CanSee(phaseShift);
594 for (std::pair<uint32 const, PhaseShift::VisibleMapIdRef>
const& visibleMap : phaseShift.
VisibleMapIds)
596 return visibleMap.first;
618 object->GetPhaseShift().UpdateUnphasedFlag();
627 std::string phaseOwnerName =
"N/A";
630 phaseOwnerName = personalGuid->GetName();
637 std::ostringstream phases;
643 phases <<
' ' <<
' ' <<
' ';
644 phases << phase.
Id <<
' ' <<
'(' <<
sObjectMgr->GetPhaseName(phase.
Id) <<
')';
646 phases <<
' ' <<
'(' << cosmetic <<
')';
648 phases <<
' ' <<
'(' << personal <<
')';
650 phases <<
" (Disabled)";
658 std::ostringstream visibleMapIds;
659 for (PhaseShift::VisibleMapIdContainer::value_type
const& visibleMapId : phaseShift.
VisibleMapIds)
660 visibleMapIds << visibleMapId.first <<
',' <<
' ';
667 std::ostringstream uiWorldMapAreaIdSwaps;
668 for (PhaseShift::UiMapPhaseIdContainer::value_type
const& uiWorldMapAreaIdSwap : phaseShift.
UiMapPhaseIds)
669 uiWorldMapAreaIdSwaps << uiWorldMapAreaIdSwap.first <<
',' <<
' ';
677 std::ostringstream phases;
679 phases << phase.
Id <<
',';
699 if (updateVisibility)
702 player->GetMap()->SendUpdateTransportVisibility(player);
704 object->UpdateObjectVisibility();
@ CONDITION_SOURCE_TYPE_TERRAIN_SWAP
DB2Storage< PhaseEntry > sPhaseStore("Phase.db2", &PhaseLoadInfo::Instance)
DB2Storage< AreaTableEntry > sAreaTableStore("AreaTable.db2", &AreaTableLoadInfo::Instance)
@ PHASE_USE_FLAGS_ALWAYS_VISIBLE
@ PHASE_USE_FLAGS_INVERSE
@ DISABLE_TYPE_PHASE_AREA
#define ASSERT_NOTNULL(pointer)
#define MAX_NUMBER_OF_GRIDS
@ LANG_PHASE_FLAG_PERSONAL
@ LANG_PHASESHIFT_UI_WORLD_MAP_AREA_SWAPS
@ LANG_PHASESHIFT_VISIBLE_MAP_IDS
@ LANG_PHASE_FLAG_COSMETIC
virtual LocaleConstant GetSessionDbLocaleIndex() const
void PSendSysMessage(const char *fmt, Args &&... args)
constexpr bool HasFlag(T flag) const
constexpr std::underlying_type_t< T > AsUnderlyingType() const
std::string ToString() const
static Unit * ToUnit(Object *o)
static ObjectGuid GetGUID(Object const *o)
static Player * ToPlayer(Object *o)
EnumFlag< PhaseShiftFlags > Flags
bool HasPhase(uint32 phaseId) const
void ModifyPhasesReferences(PhaseContainer::iterator itr, int32 references)
bool HasPersonalPhase() const
EraseResult< PhaseContainer > RemovePhase(uint32 phaseId)
UiMapPhaseIdContainer UiMapPhaseIds
bool AddVisibleMapId(uint32 visibleMapId, TerrainSwapInfo const *visibleMapInfo, int32 references=1)
EraseResult< UiMapPhaseIdContainer > RemoveUiMapPhaseId(uint32 uiMapPhaseId)
bool AddUiMapPhaseId(uint32 uiMapPhaseId, int32 references=1)
bool AddPhase(uint32 phaseId, PhaseFlags flags, std::vector< Condition > const *areaConditions, int32 references=1)
VisibleMapIdContainer VisibleMapIds
void VisitControlledOf(Unit *unit, Func &&func)
ControlledUnitVisitor(WorldObject *owner)
Trinity::Containers::FlatSet< WorldObject *, std::less< WorldObject * >, boost::container::small_vector< WorldObject *, 8 > > _visited
static void SetInversed(WorldObject *object, bool apply, bool updateVisibility)
static void OnAreaChange(WorldObject *object)
static void UpdateVisibilityIfNeeded(WorldObject *object, bool updateVisibility, bool changed)
static void PrintToChat(ChatHandler *chat, WorldObject const *target)
static void AddVisibleMapId(WorldObject *object, uint32 visibleMapId)
static uint32 GetTerrainMapId(PhaseShift const &phaseShift, uint32 mapId, TerrainInfo const *terrain, float x, float y)
static bool IsPersonalPhase(uint32 phaseId)
static void AddPhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static std::string FormatPhases(PhaseShift const &phaseShift)
static void AddPhaseGroup(WorldObject *object, uint32 phaseGroupId, bool updateVisibility)
static void RemoveVisibleMapId(WorldObject *object, uint32 visibleMapId)
static void FillPartyMemberPhase(WorldPackets::Party::PartyMemberPhaseStates *partyMemberPhases, PhaseShift const &phaseShift)
static void RemovePhaseGroup(WorldObject *object, uint32 phaseGroupId, bool updateVisibility)
static bool InDbPhaseShift(WorldObject const *object, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId)
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static PhaseShift const & GetAlwaysVisiblePhaseShift()
static void ResetPhaseShift(WorldObject *object)
static void RemovePhase(WorldObject *object, uint32 phaseId, bool updateVisibility)
static void OnMapChange(WorldObject *object)
static void SendToPlayer(Player const *player, PhaseShift const &phaseShift)
static void InitDbPersonalOwnership(PhaseShift &phaseShift, ObjectGuid const &personalGuid)
static bool OnConditionChange(WorldObject *object, bool updateVisibility=true)
static PhaseShift const & GetEmptyPhaseShift()
static void InitDbVisibleMapId(PhaseShift &phaseShift, int32 visibleMapId)
static void SetAlwaysVisible(WorldObject *object, bool apply, bool updateVisibility)
static void InitDbPhaseShift(PhaseShift &phaseShift, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId)
bool HasChildTerrainGridFile(uint32 mapId, int32 gx, int32 gy) const
std::pair< iterator, bool > insert(Key const &key)
std::size_t erase(Key const &key)
Vehicle * GetVehicle() const
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
virtual void OnPhaseChange()
std::array< ObjectGuid, MAX_SUMMON_SLOT > m_SummonSlot
Vehicle * GetVehicleKit() const
void RemoveNotOwnSingleTargetAuras(bool onPhaseChange=false)
constexpr uint32 GetMapId() const
PhaseShift & GetPhaseShift()
PhaseShift & GetSuppressedPhaseShift()
PhaseShiftData Phaseshift
bool IsDisabledFor(DisableType type, uint32 entry, WorldObject const *ref, uint8 flags)
TC_GAME_API WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
TC_GAME_API Creature * GetCreature(WorldObject const &u, ObjectGuid const &guid)
GridCoord ComputeGridCoord(float x, float y)
std::vector< Condition > const * AreaConditions
EnumFlag< PhaseFlags > Flags
std::vector< uint32 > UiMapPhaseIDs
std::vector< PhaseShiftDataPhase > Phases
std::vector< PartyMemberPhase > List