27#include "G3DPosition.hpp"
51 _duration(0), _totalDuration(0), _verticesUpdatePreviousOrientation(
std::numeric_limits<float>::infinity()),
52 _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0),
53 _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
93 caster->_UnregisterAreaTrigger(
this);
116bool AreaTrigger::Create(
AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId,
Map* map,
Position const& pos,
int32 duration,
AreaTriggerSpawn const* spawnData ,
Unit* caster ,
Unit* target ,
SpellCastVisual spellVisual ,
SpellInfo const* spellInfo ,
Spell* spell ,
AuraEffect const* aurEff )
126 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid coordinates (X: {} Y: {})", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom),
GetPositionX(),
GetPositionY());
133 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid areatrigger create properties id", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom));
159 SpellInfo const* spellForVisuals = spellInfo;
183 if (caster && spellInfo)
187 float multiplier = 1.0f;
190 if (multiplier != 1.0f)
193 overrideScale.
Curve = multiplier;
238 if (target && aurEff)
250 std::visit([&]<
typename MovementType>(MovementType
const& movement)
252 if constexpr (std::is_same_v<MovementType, AreaTriggerOrbitInfo>)
262 else if constexpr (std::is_same_v<MovementType, AreaTriggerCreateProperties::SplineInfo>)
264 else if constexpr (std::is_same_v<MovementType, std::monostate>)
267 static_assert(Trinity::dependant_false_v<MovementType>,
"Unsupported movement type");
292 if (!
GetMap()->AddToMap(
this))
304 _ai->OnCreate(spell);
312 if (!at->
Create(areaTriggerCreatePropertiesId, caster->
GetMap(), pos, duration,
nullptr, caster, target, spellVisual, spellInfo, spell, aurEff))
335 if (!createProperties)
360 float orientation = 0.0f;
365 orientation += target->GetOrientation();
539 std::array<DBCPosition2D, 2> points;
540 for (std::size_t i = 0; i < scaleCurve.
Points.
size(); ++i)
541 points[i] = { .X = scaleCurve.
Points[i].Pos.GetPositionX(), .Y = scaleCurve.
Points[i].Pos.GetPositionY() };
546 return sDB2Manager.GetCurveValueAt(mode, std::span(points.begin(), pointCount), x);
557 curveTemplate.
Curve = constantValue;
566 curveTemplate.
Mode = interpolation;
567 curveTemplate.
Curve = points;
593 if (
float const* simpleFloat = std::get_if<float>(&curve->Curve))
595 uint32 packedCurve = advstd::bit_cast<uint32>(*simpleFloat);
601 for (std::size_t i = 0; i < UF::size<decltype(UF::ScaleCurve::Points)>(); ++i)
607 if ((*curvePoints)[1].X < (*curvePoints)[0].X)
630 uint32 packedCurve = (
uint32(mode) << 1) | (pointCount << 24);
633 for (std::size_t i = 0; i < curvePoints->size(); ++i)
635 point.
Relocate((*curvePoints)[i].X, (*curvePoints)[i].Y);
643 std::vector<Unit*> targetList;
645 m_areaTriggerData->ShapeData.Visit([&]<
typename ShapeType>(ShapeType
const& shape)
647 if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerSphere>)
649 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBox>)
651 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerPolygon>)
653 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerCylinder>)
655 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerDisk>)
657 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBoundedPlane>)
668 if (HasActionSetFlag(AreaTriggerActionSetFlag::NotTriggeredbyCaster))
673 if (HasActionSetFlag(AreaTriggerActionSetFlag::OnlyTriggeredByCaster))
676 if (HasActionSetFlag(AreaTriggerActionSetFlag::CreatorsPartyOnly))
678 Unit* caster = GetCaster();
682 if (!caster->IsInRaidWith(target))
689 switch (player->getDeathState())
692 if (!HasActionSetFlag(AreaTriggerActionSetFlag::AllowWhileGhost))
696 if (!HasActionSetFlag(AreaTriggerActionSetFlag::AllowWhileDead))
708 return !
sConditionMgr->IsObjectMeetToConditions(target, *conditions);
714 HandleUnitEnterExit(targetList);
751 float extentsX = G3D::lerp(box.
Extents->Pos.GetPositionX(), box.
ExtentsTarget->Pos.GetPositionX(), progress) * scale;
752 float extentsY = G3D::lerp(box.
Extents->Pos.GetPositionY(), box.
ExtentsTarget->Pos.GetPositionY(), progress) * scale;
753 float extentsZ = G3D::lerp(box.
Extents->Pos.GetPositionZ(), box.
ExtentsTarget->Pos.GetPositionZ(), progress) * scale;
754 float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY);
761 return !unit->
IsWithinBox(boxCenter, extentsX, extentsY, extentsZ / 2);
840 float extentsX = G3D::lerp(boundedPlane.
Extents->Pos.GetPositionX(), boundedPlane.
ExtentsTarget->Pos.GetPositionX(), progress) * scale;
841 float extentsY = G3D::lerp(boundedPlane.
Extents->Pos.GetPositionY(), boundedPlane.
ExtentsTarget->Pos.GetPositionY(), progress) * scale;
842 float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY);
857 std::vector<Unit*> enteringUnits;
859 for (
Unit* unit : newTargetList)
861 if (exitUnits.erase(unit->GetGUID()) == 0)
862 enteringUnits.push_back(unit);
868 for (
Unit* unit : enteringUnits)
871 for (
ObjectGuid const& exitUnitGuid : exitUnits)
885 if (player->isDebugAreaTriggers)
896 _ai->OnUnitEnter(unit);
914 if (player->isDebugAreaTriggers)
917 if (canTriggerOnExit)
931 if (canTriggerOnExit)
932 _ai->OnUnitExit(unit, exitMode);
951 return spawn->scriptId;
956 return createProperties->ScriptId;
974 return caster->GetFaction();
981 std::visit([
this]<
typename ShapeType>(ShapeType
const& shapeData)
985 if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Sphere>)
992 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Box>)
999 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Polygon>)
1014 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Cylinder>)
1025 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Disk>)
1038 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::BoundedPlane>)
1046 static_assert(Trinity::dependant_false_v<ShapeType>,
"Unsupported shape type");
1081 float angleSin = std::sin(newOrientation);
1082 float angleCos = std::cos(newOrientation);
1087 float x = vertice.GetPositionX() * angleCos - vertice.GetPositionY() * angleSin;
1088 float y = vertice.GetPositionY() * angleCos + vertice.GetPositionX() * angleSin;
1089 vertice.Relocate(x, y);
1150 switch (action.ActionType)
1157 caster->
AddAura(action.Param, unit);
1165 if (player->GetMapId() != safeLoc->Loc.GetMapId())
1167 if (
WorldSafeLocsEntry const* instanceEntrance = player->GetInstanceEntrance(safeLoc->Loc.GetMapId()))
1168 safeLoc = instanceEntrance;
1170 player->TeleportTo(safeLoc->Loc);
1196 switch (action.ActionType)
1205 player->GetRestMgr().SetInnTrigger(std::nullopt);
1220 std::vector<G3D::Vector3> rotatedPoints;
1221 rotatedPoints.resize(offsets.size());
1222 for (std::size_t i = 0; i < offsets.size(); ++i)
1224 Position const& offset = offsets[i];
1233 InitSplines(rotatedPoints, overrideSpeed, speedIsTimeInSeconds);
1238 if (splinePoints.size() < 2)
1241 std::unique_ptr<Movement::Spline<float>> spline = std::make_unique<::Movement::Spline<float>>();
1243 spline->initLengths();
1262 for (G3D::Vector3
const& point : spline->getPoints())
1320 return &orbit->
Center->Pos;
1338 pathProgress = std::min(1.f, pathProgress);
1340 float radius = cmi.
Radius;
1341 if (pathProgress <= 1.0f && G3D::fuzzyNe(cmi.
BlendFromRadius, radius))
1345 float blendProgress = std::min(1.f, pathProgress / blendCurve * 0.63661975f);
1358 float orientation = 0.0f;
1364 orientation += angle;
1368 return { x, y, z, orientation };
1392 if (progress < 0.f || progress > 1.f)
1395 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})",
1399 currentTimePercent = progress;
1402 int32 lastPositionIndex = 0;
1403 float percentFromLastPoint = 0;
1404 spline.
computeIndex(currentTimePercent, lastPositionIndex, percentFromLastPoint);
1406 G3D::Vector3 currentPosition;
1407 spline.
evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition);
1415 G3D::Vector3 derivative;
1417 if (derivative.x != 0.0f || derivative.y != 0.0f)
1418 orientation += std::atan2(derivative.y, derivative.x);
1432 _ai->OnDestinationReached();
1470 if (player->isDebugAreaTriggers)
1478 _ai->OnInitialize();
1494 return !seerPlayer->isDebugAreaTriggers;
1524 if (requestedObjectMask.IsAnySet())
1527 if (requestedAreaTriggerMask.IsAnySet())
1531 std::size_t sizePos = buffer.
wpos();
1537 m_objectData->WriteUpdate(requestedObjectMask, buffer, target,
this, ignoreNestedChangesMask);
1540 m_areaTriggerData->WriteUpdate(requestedAreaTriggerMask, buffer, target,
this, ignoreNestedChangesMask);
#define sAreaTriggerDataStore
@ AREATRIGGER_ACTION_ADDAURA
@ AREATRIGGER_ACTION_TELEPORT
@ AREATRIGGER_ACTION_TAVERN
@ AREATRIGGER_ACTION_CAST
@ AREATRIGGER_ACTION_USER_ENEMY
@ AREATRIGGER_ACTION_USER_ANY
@ AREATRIGGER_ACTION_USER_FRIEND
@ AREATRIGGER_ACTION_USER_CASTER
@ AREATRIGGER_ACTION_USER_RAID
@ AREATRIGGER_ACTION_USER_PARTY
bool UnitFitToActionRequirement(Unit *unit, Unit *caster, AreaTriggerAction const &action)
std::vector< Condition > ConditionContainer
@ DontRunOnLeaveWhenExpiring
@ CanAffectUninteractible
@ LeaveAreaTriggerWithActionSet
@ EnterAreaTriggerWithActionSet
std::chrono::milliseconds Milliseconds
Milliseconds shorthand typedef.
#define ASSERT_NOTNULL(pointer)
@ LANG_DEBUG_AREATRIGGER_ENTITY_LEFT
@ LANG_DEBUG_AREATRIGGER_ENTITY_ENTERED
#define TC_LOG_ERROR(filterType__, message__,...)
@ TEMPSUMMON_TIMED_DESPAWN
std::unordered_set< ObjectGuid > GuidUnorderedSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
@ QUEST_OBJECTIVE_AREA_TRIGGER_EXIT
@ QUEST_OBJECTIVE_AREA_TRIGGER_ENTER
@ TRIGGERED_FULL_MASK
Used when doing CastSpell with triggered == true.
T RoundToInterval(T &num, T floor, T ceil)
EnumFlag< AreaTriggerCreatePropertiesFlag > Flags
AreaTriggerCreatePropertiesId Id
std::variant< std::monostate, SplineInfo, AreaTriggerOrbitInfo > Movement
AreaTriggerTemplate const * Template
std::vector< AreaTriggerAction > Actions
AreaTriggerTemplate const * GetTemplate() const
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const
bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const override
void UndoActions(Unit *unit)
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
void DebugVisualizePosition()
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
uint32 GetTimeSinceCreated() const
float CalcCurrentScale() const
bool Create(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Map *map, Position const &pos, int32 duration, AreaTriggerSpawn const *spawnData=nullptr, Unit *caster=nullptr, Unit *target=nullptr, SpellCastVisual spellVisual={ 0, 0 }, SpellInfo const *spellInfo=nullptr, Spell *spell=nullptr, AuraEffect const *aurEff=nullptr)
void UpdatePolygonVertices()
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::AreaTriggerData::Mask const &requestedAreaTriggerMask, Player const *target, bool ignoreNestedChangesMask) const
uint32 GetScriptId() const
void ClearOverrideScaleCurve()
float GetScaleCurveValue(UF::ScaleCurve const &scaleCurve, uint32 timeTo) const
uint32 GetFaction() const override
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
void HandleUnitEnterExit(std::vector< Unit * > const &targetList, AreaTriggerExitReason exitMode=AreaTriggerExitReason::NotInside)
void ClearValuesChangesMask() override
int32 GetTotalDuration() const
void UpdateSplinePosition(Movement::Spline< float > &spline)
Position _stationaryPosition
void HandleUnitEnter(Unit *unit)
float GetMaxSearchRadius() const
void UpdateOverridePosition()
void InitSplines(std::vector< G3D::Vector3 > const &splinePoints, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
std::unique_ptr< AreaTriggerAI > _ai
void SearchUnitInSphere(UF::AreaTriggerSphere const &sphere, std::vector< Unit * > &targetList)
bool IsServerSide() const
void ClearScaleCurve(UF::MutableFieldReference< UF::ScaleCurve, false > scaleCurveMutator)
void ClearOverrideMoveCurve()
Position const * GetOrbitCenterPosition() const
void SearchUnits(std::vector< Unit * > &targetList, float radius, bool check3D)
void SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const &boundedPlane, std::vector< Unit * > &targetList)
float GetScaleCurveProgress(UF::ScaleCurve const &scaleCurve, uint32 timeTo) const
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
void SetAreaTriggerFlag(AreaTriggerFieldFlags flag)
void UpdateOrbitPosition()
void SetShape(AreaTriggerShapeInfo const &shape)
uint32 GetTimeToTarget() const
void AddToWorld() override
float GetProgress() const
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
void Update(uint32 diff) override
bool LoadFromDB(ObjectGuid::LowType spawnId, Map *map, bool addToMap, bool allowDuplicate)
GuidUnorderedSet _insideUnits
static ObjectGuid CreateNewMovementForceId(Map *map, uint32 areaTriggerId)
bool IsStaticSpawn() const
void SearchUnitInBox(UF::AreaTriggerBox const &box, std::vector< Unit * > &targetList)
void PlaySpellVisual(uint32 spellVisualId) const
void SearchUnitInDisk(UF::AreaTriggerDisk const &disk, std::vector< Unit * > &targetList)
void InitOrbit(AreaTriggerOrbitInfo const &orbit, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
void ClearExtraScaleCurve()
static AreaTrigger * CreateAreaTrigger(AreaTriggerCreatePropertiesId areaTriggerCreatePropertiesId, Position const &pos, int32 duration, Unit *caster, Unit *target, SpellCastVisual spellVisual={ 0, 0 }, SpellInfo const *spellInfo=nullptr, Spell *spell=nullptr, AuraEffect const *aurEff=nullptr)
uint32 GetElapsedTimeForMovement() const
AreaTriggerTemplate const * _areaTriggerTemplate
void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag)
void SetOverrideMoveCurve(float x, float y, float z)
void SetOverrideScaleCurve(float overrideScale)
void HandleUnitExitInternal(Unit *unit, AreaTriggerExitReason exitMode=AreaTriggerExitReason::NotInside)
AuraEffect const * _aurEff
void SetScaleCurve(UF::MutableFieldReference< UF::ScaleCurve, false > scaleCurveMutator, float constantValue)
void SetDuration(int32 newDuration)
void _UpdateDuration(int32 newDuration)
void DoActions(Unit *unit)
void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag)
float GetScaleCurveValueAtProgress(UF::ScaleCurve const &scaleCurve, float x) const
void SetSpellVisual(SpellCastVisual const &visual)
void HandleUnitExit(Unit *unit)
void SetExtraScaleCurve(float extraScale)
void SearchUnitInPolygon(UF::AreaTriggerPolygon const &polygon, std::vector< Unit * > &targetList)
void RemoveFromWorld() override
void InitSplineOffsets(std::vector< Position > const &offsets, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
Position CalculateOrbitPosition() const
int32 GetDuration() const
AreaTriggerCreateProperties const * GetCreateProperties() const
bool HasOverridePosition() const
void UpdateHasPlayersFlag()
std::unique_ptr<::Movement::Spline< float > > _spline
float _verticesUpdatePreviousOrientation
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
void SearchUnitInCylinder(UF::AreaTriggerCylinder const &cylinder, std::vector< Unit * > &targetList)
ObjectGuid const & GetGUID() const
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
WowCS::EntityFragmentsHolder m_entityFragments
UF::UpdateFieldHolder m_values
void _Create(ObjectGuid const &guid)
CreateObjectBits m_updateFlag
void ClearDynamicUpdateFieldValues(UF::DynamicUpdateFieldSetter< T > setter)
UF::DynamicUpdateFieldSetter< T >::insert_result AddDynamicUpdateFieldValue(UF::DynamicUpdateFieldSetter< T > setter)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void DoWithSuppressingObjectUpdates(Action &&action)
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
void put(std::size_t pos, T value)
void PSendSysMessage(char const *fmt, Args &&... args)
MapStoredObjectTypesContainer & GetObjectsStore()
AreaTriggerBySpawnIdContainer & GetAreaTriggerBySpawnIdStore()
ObjectGuid::LowType GenerateLowGuid()
void AreaTriggerRelocation(AreaTrigger *at, float x, float y, float z, float orientation)
Difficulty GetDifficultyID() const
void computeIndex(float t, index_type &out_idx, float &out_u) const
void evaluate_derivative(float t, Vector3 &hermite) const
void evaluate_percent(float t, Vector3 &c) const
static ObjectGuid const Empty
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
void SetEntry(uint32 entry)
virtual void ClearValuesChangesMask()
virtual void SetObjectScale(float scale)
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
static void InitDbPhaseShift(PhaseShift &phaseShift, uint8 phaseUseFlags, uint16 phaseId, uint32 phaseGroupId)
void SendDirectMessage(WorldPacket const *data) const
uint32 GetSpellXSpellVisualId(WorldObject const *caster=nullptr, WorldObject const *viewer=nullptr) const
virtual Position GetPositionOffsetTo(Position const &endPos) const =0
This method transforms supplied global coordinates into local offsets.
virtual void AddPassenger(WorldObject *passenger, Position const &offset)=0
virtual TransportBase * RemovePassenger(WorldObject *passenger)=0
std::vector< T >::const_iterator begin() const
std::vector< T >::const_iterator end() const
void ClearChanged(UpdateField< T, BlockBit, Bit >(Derived::*))
Mask const & GetChangesMask() const
static constexpr std::size_t size()
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
uint32 GetChangedObjectTypeMask() const
uint32 GetCastSpellXSpellVisualId(SpellInfo const *spellInfo) const override
void _RegisterAreaTrigger(AreaTrigger *areaTrigger)
void EnterAreaTrigger(AreaTrigger *areaTrigger)
Aura * AddAura(uint32 spellId, Unit *target)
void ExitAreaTrigger(AreaTrigger *areaTrigger)
bool IsInRaidWith(Unit const *unit) const
bool IsInPartyWith(Unit const *unit) const
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint32 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
bool BuildPacket(WorldPacket *packet)
constexpr uint32 GetBlock(uint32 index) const
constexpr void Set(uint32 index)
constexpr uint32 GetMapId() const
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
void AddToWorld() override
void RemoveFromWorld() override
SpellCastResult CastSpell(CastSpellTargetArg const &targets, uint32 spellId, CastSpellExtraArgs const &args={ })
bool IsValidAttackTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
PhaseShift & GetPhaseShift()
TransportBase * GetTransport() const
void setActive(bool isActiveObject)
ZoneScript * m_zoneScript
virtual void SetMap(Map *map)
void AddObjectToRemoveList()
void UpdatePositionData()
Player * GetSpellModOwner() const
bool IsValidAssistTarget(WorldObject const *target, SpellInfo const *bySpell=nullptr) const
MovementInfo m_movementInfo
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const
bool IsInMap(WorldObject const *obj) const
virtual void Update(uint32 diff)
WorldPacket const * Write() override
ObjectGuid AreaTriggerGUID
virtual void OnAreaTriggerRemove(AreaTrigger *areaTrigger)
virtual void OnAreaTriggerCreate(AreaTrigger *areaTrigger)
AreaTriggerAI * SelectAreaTriggerAI(AreaTrigger *at)
TC_GAME_API WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const &)
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
constexpr void EraseIf(Container &c, Predicate p)
void MultimapErasePair(M &multimap, typename M::key_type const &key, typename M::mapped_type const &value)
std::conditional_t< std::is_base_of_v< HasChangesMaskTag, T >, MutableFieldReferenceWithChangesMask< T, PublicSet >, MutableFieldReferenceNoChangesMask< T, PublicSet > > MutableFieldReference
AreaTriggerActionUserTypes TargetType
int32 ExtraTimeForBlending
Optional< TaggedPosition< Position::XYZ > > Center
Optional< ObjectGuid > PathTarget
std::variant< Sphere, Box, Polygon, Cylinder, Disk, BoundedPlane > Data
AreaTriggerCreatePropertiesId Id
std::variant< float, Points > Curve
CurveInterpolationMode Mode
std::array< DBCPosition2D, 2 > Points
UF::ObjectData::Base ObjectMask
bool IgnoreNestedChangesMask
UF::AreaTriggerData::Base AreaTriggerMask
void operator()(Player const *player) const
AreaTrigger const * Owner
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
struct MovementInfo::TransportInfo transport
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
constexpr bool IsInDist2d(float x, float y, float dist) const
bool IsInPolygon2D(Position const &polygonOrigin, std::span< Position const > vertices) const
bool IsPositionValid() const
constexpr void Relocate(float x, float y)
constexpr Position GetPosition() const
bool IsWithinBox(Position const &boxOrigin, float length, float width, float height) const
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
uint32 SpellXSpellVisualID
bool Insert(ValueType< ObjectType > object)
bool Remove(ValueType< ObjectType > object)
UpdateField< TaggedPosition< Position::XY >, 0, 1 > Extents
UpdateField< TaggedPosition< Position::XY >, 0, 2 > ExtentsTarget
UpdateField< TaggedPosition< Position::XYZ >, 0, 1 > Extents
UpdateField< TaggedPosition< Position::XYZ >, 0, 2 > ExtentsTarget
UpdateField< float, 0, 5 > LocationZOffset
UpdateField< float, 0, 6 > LocationZOffsetTarget
UpdateField< float, 0, 4 > HeightTarget
UpdateField< float, 0, 2 > RadiusTarget
UpdateField< float, 0, 3 > Height
UpdateField< float, 0, 1 > Radius
UpdateField< UF::ScaleCurve, 0, 4 > OverrideMoveCurveY
VariantUpdateField< 32, 36, UF::AreaTriggerSplineCalculator, UF::AreaTriggerOrbit, UF::AreaTriggerMovementScript > PathData
UpdateField< uint32, 32, 33 > MoveCurveId
UpdateField< UF::VisualAnim, 0, 28 > VisualAnim
UpdateField< ObjectGuid, 0, 20 > OrbitPathTarget
UpdateField< uint32, 0, 30 > FacingCurveId
UpdateField< UF::SpellCastVisual, 0, 16 > SpellVisual
UpdateField< float, 0, 17 > BoundsRadius2D
UpdateField< float, 32, 34 > Facing
UpdateField< UF::ScaleCurve, 0, 5 > OverrideMoveCurveZ
UpdateField< uint8, 32, 37 > ShapeType
UpdateField< uint32, 0, 12 > TimeToTargetPos
UpdateField< int32, 32, 36 > PathType
UpdateField< float, 0, 25 > ZOffset
UpdateField< uint32, 0, 31 > MorphCurveId
UpdateField< UF::ScaleCurve, 0, 1 > OverrideScaleCurve
UpdateField< int32, 0, 15 > SpellForVisuals
UpdateField< uint32, 0, 8 > Duration
UpdateField< uint32, 0, 29 > ScaleCurveId
VariantUpdateField< 32, 37, UF::AreaTriggerSphere, UF::AreaTriggerBox, UF::AreaTriggerPolygon, UF::AreaTriggerCylinder, UF::AreaTriggerDisk, UF::AreaTriggerBoundedPlane > ShapeData
UpdateField< UF::ScaleCurve, 0, 3 > OverrideMoveCurveX
UpdateField< uint32, 0, 18 > DecalPropertiesID
UpdateField< UF::ScaleCurve, 0, 2 > ExtraScaleCurve
UpdateField< uint32, 0, 10 > TimeToTargetScale
UpdateField< uint32, 0, 9 > TimeToTarget
UpdateField< uint32, 0, 24 > CreationTime
UpdateField< int32, 0, 14 > SpellID
UpdateField< uint32, 0, 23 > MovementStartTime
UpdateField< ObjectGuid, 0, 19 > CreatingEffectGUID
UpdateField< ObjectGuid, 0, 7 > Caster
UpdateField< float, 0, 4 > OuterRadiusTarget
UpdateField< float, 0, 7 > LocationZOffset
UpdateField< float, 0, 5 > Height
UpdateField< float, 0, 1 > InnerRadius
UpdateField< float, 0, 8 > LocationZOffsetTarget
UpdateField< float, 0, 2 > InnerRadiusTarget
UpdateField< float, 0, 6 > HeightTarget
UpdateField< float, 0, 3 > OuterRadius
UpdateField< float, 0, 5 > BlendFromRadius
UpdateField< bool, 0, 1 > CounterClockwise
UpdateField< float, 0, 3 > Radius
UpdateField< float, 0, 4 > InitialAngle
UpdateField< int32, 0, 6 > ExtraTimeForBlending
UpdateField< TaggedPosition< Position::XYZ >, 0, 2 > Center
DynamicUpdateField< TaggedPosition< Position::XY >, 0, 2 > VerticesTarget
UpdateField< float, 0, 3 > Height
UpdateField< float, 0, 4 > HeightTarget
DynamicUpdateField< TaggedPosition< Position::XY >, 0, 1 > Vertices
UpdateField< float, 0, 2 > RadiusTarget
UpdateField< float, 0, 1 > Radius
UpdateField< bool, 0, 1 > Catmullrom
DynamicUpdateField< TaggedPosition< Position::XYZ >, 0, 2 > Points
UpdateFieldArray< TaggedPosition< Position::XY >, 2, 4, 5 > Points
UpdateField< uint32, 0, 3 > ParameterCurve
UpdateField< uint32, 0, 2 > StartTimeOffset
UpdateField< bool, 0, 1 > OverrideActive
int32 SpellXSpellVisualID
UpdateField< uint32, 0, 3 > AnimKitID
OptionalUpdateField< int16, 0, 2 > AnimationDataID
UpdateField< bool, 0, 1 > IsDecay
void Add(EntityFragment fragment, bool update, void const *data=nullptr)