36#include <boost/container/small_vector.hpp>
72 template<
typename Func>
88 for (
auto const& [_, seat] : vehicle->Seats)
101 AddPhase(
object, phaseId, object->
GetGUID(), updateVisibility, visitor);
106 bool changed =
object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
109 object->GetPhaseShift().PersonalGuid = personalGuid;
113 unit->OnPhaseChange();
116 AddPhase(controlled, phaseId, personalGuid, updateVisibility, visitor);
118 unit->RemoveNotOwnSingleTargetAuras(
true);
127 RemovePhase(
object, phaseId, updateVisibility, visitor);
132 bool changed =
object->GetPhaseShift().RemovePhase(phaseId).Erased;
136 unit->OnPhaseChange();
139 RemovePhase(controlled, phaseId, updateVisibility, visitor);
141 unit->RemoveNotOwnSingleTargetAuras(
true);
149 std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId);
159 bool changed =
false;
160 for (
uint32 phaseId : *phasesInGroup)
161 changed =
object->GetPhaseShift().AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
164 object->GetPhaseShift().PersonalGuid = personalGuid;
168 unit->OnPhaseChange();
171 AddPhaseGroup(controlled, phasesInGroup, personalGuid, updateVisibility, visitor);
173 unit->RemoveNotOwnSingleTargetAuras(
true);
181 std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId);
191 bool changed =
false;
192 for (
uint32 phaseId : *phasesInGroup)
193 changed =
object->GetPhaseShift().RemovePhase(phaseId).Erased || changed;
197 unit->OnPhaseChange();
202 unit->RemoveNotOwnSingleTargetAuras(
true);
217 bool changed =
object->GetPhaseShift().AddVisibleMapId(visibleMapId, terrainSwapInfo);
220 changed =
object->GetPhaseShift().AddUiMapPhaseId(uiMapPhaseId) || changed;
242 bool changed =
object->GetPhaseShift().RemoveVisibleMapId(visibleMapId).Erased;
245 changed =
object->GetPhaseShift().RemoveUiMapPhaseId(uiWorldMapAreaIDSwap).Erased || changed;
260 object->GetPhaseShift().Clear();
261 object->GetSuppressedPhaseShift().Clear();
272 PhaseShift& phaseShift =
object->GetPhaseShift();
273 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
276 object->GetPhaseShift().VisibleMapIds.clear();
277 object->GetPhaseShift().UiMapPhaseIds.clear();
278 object->GetSuppressedPhaseShift().VisibleMapIds.clear();
280 for (
auto const& visibleMapPair :
sObjectMgr->GetTerrainSwaps())
286 if (visibleMapPair.first == object->
GetMapId())
293 else if (visibleMapPair.first == object->
GetMapId())
303 PhaseShift& phaseShift =
object->GetPhaseShift();
304 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
308 object->GetPhaseShift().ClearPhases();
309 object->GetSuppressedPhaseShift().ClearPhases();
311 uint32 areaId =
object->GetAreaId();
315 if (std::vector<PhaseAreaInfo>
const* newAreaPhases =
sObjectMgr->GetPhasesForArea(areaEntry->
ID))
319 if (phaseArea.SubAreaExclusions.contains(areaId))
322 uint32 phaseId = phaseArea.PhaseInfo->Id;
326 if (
sConditionMgr->IsObjectMeetToConditions(srcInfo, phaseArea.Conditions))
327 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId), &phaseArea.Conditions);
329 suppressedPhaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId), &phaseArea.Conditions);
336 bool changed = phaseShift.
Phases != oldPhases;
342 changed = phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
346 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(
uint32(aurEff->GetMiscValueB())))
347 for (
uint32 phaseId : *phasesInGroup)
348 changed = phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr) || changed;
354 unit->OnPhaseChange();
363 unit->RemoveNotOwnSingleTargetAuras(
true);
376 PhaseShift& phaseShift =
object->GetPhaseShift();
377 PhaseShift& suppressedPhaseShift =
object->GetSuppressedPhaseShift();
380 bool changed =
false;
384 if (itr->AreaConditions && !
sConditionMgr->IsObjectMeetToConditions(srcInfo, *itr->AreaConditions))
386 newSuppressions.
AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References);
398 changed = phaseShift.
AddPhase(itr->Id, itr->Flags, itr->AreaConditions, itr->References) || changed;
410 newSuppressions.
AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References);
411 for (
uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
424 changed = phaseShift.
AddVisibleMapId(itr->first, itr->second.VisibleMapInfo, itr->second.References) || changed;
425 for (
uint32 uiMapPhaseId : itr->second.VisibleMapInfo->UiMapPhaseIDs)
440 auto eraseResult = newSuppressions.
RemovePhase(phaseId);
442 if (eraseResult.Iterator != newSuppressions.
Phases.
end() || eraseResult.Erased)
443 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
448 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(
uint32(aurEff->GetMiscValueB())))
450 for (
uint32 phaseId : *phasesInGroup)
452 auto eraseResult = newSuppressions.
RemovePhase(phaseId);
454 if (eraseResult.Iterator != newSuppressions.
Phases.
end() || eraseResult.Erased)
455 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
468 for (std::pair<uint32 const, PhaseShift::VisibleMapIdRef>
const& visibleMap : newSuppressions.
VisibleMapIds)
469 suppressedPhaseShift.
AddVisibleMapId(visibleMap.first, visibleMap.second.VisibleMapInfo, visibleMap.second.References);
499 [](
PhaseShift::PhaseRef const& phase) { return WorldPackets::Misc::PhaseShiftDataPhase{ .PhaseFlags = phase.Flags.AsUnderlyingType(), .Id = phase.Id }; });
501 phaseShiftChange.VisibleMapIDs.resize(phaseShift.VisibleMapIds.size());
504 phaseShiftChange.UiMapPhaseIDs.resize(phaseShift.UiMapPhaseIds.size());
507 player->SendDirectMessage(phaseShiftChange.Write());
520 std::ranges::transform(phaseShift.
Phases, partyMemberPhases->
List.begin(),
521 [](
PhaseShift::PhaseRef const& phase) { return WorldPackets::Party::PartyMemberPhase{ .Flags = phase.Flags.AsUnderlyingType(), .Id = phase.Id }; });
546 phaseShift.
AddPhase(phaseId, GetPhaseFlags(phaseId),
nullptr);
547 else if (phaseGroupId)
548 if (std::vector<uint32>
const* phasesInGroup =
sDB2Manager.GetPhasesForGroup(phaseGroupId))
549 for (
uint32 phaseInGroup : *phasesInGroup)
550 phaseShift.
AddPhase(phaseInGroup, GetPhaseFlags(phaseInGroup),
nullptr);
573 if (visibleMapId != -1)
581 return object->GetPhaseShift().CanSee(phaseShift);
596 for (std::pair<uint32 const, PhaseShift::VisibleMapIdRef>
const& visibleMap : phaseShift.
VisibleMapIds)
598 return visibleMap.first;
620 object->GetPhaseShift().UpdateUnphasedFlag();
629 std::string phaseOwnerName =
"N/A";
632 phaseOwnerName = personalGuid->GetName();
639 std::ostringstream phases;
645 phases <<
' ' <<
' ' <<
' ';
646 phases << phase.
Id <<
' ' <<
'(' <<
sObjectMgr->GetPhaseName(phase.
Id) <<
')';
648 phases <<
' ' <<
'(' << cosmetic <<
')';
650 phases <<
' ' <<
'(' << personal <<
')';
652 phases <<
" (Disabled)";
660 std::ostringstream visibleMapIds;
661 for (PhaseShift::VisibleMapIdContainer::value_type
const& visibleMapId : phaseShift.
VisibleMapIds)
662 visibleMapIds << visibleMapId.first <<
',' <<
' ';
669 std::ostringstream uiWorldMapAreaIdSwaps;
670 for (PhaseShift::UiMapPhaseIdContainer::value_type
const& uiWorldMapAreaIdSwap : phaseShift.
UiMapPhaseIds)
671 uiWorldMapAreaIdSwaps << uiWorldMapAreaIdSwap.first <<
',' <<
' ';
679 std::ostringstream phases;
681 phases << phase.
Id <<
',';
683 return std::move(phases).str();
701 if (updateVisibility)
704 player->GetMap()->SendUpdateTransportVisibility(player);
706 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(char const *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