27#include "G3DPosition.hpp"
49#include <G3D/CollisionDetection.h>
50#include <G3D/CoordinateFrame.h>
51#include <G3D/Cylinder.h>
77 _duration(0), _totalDuration(0), _verticesUpdatePreviousRotation(),
78 _isRemoved(false), _reachedDestination(true),
79 _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
119 caster->_UnregisterAreaTrigger(
this);
142bool 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 )
152 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid coordinates (X: {} Y: {})", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom),
GetPositionX(),
GetPositionY());
159 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid areatrigger create properties id", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom));
185 SpellInfo const* spellForVisuals = spellInfo;
210 if (caster && spellInfo)
214 float multiplier = 1.0f;
217 if (multiplier != 1.0f)
220 overrideScale.
Curve = multiplier;
268 if (target && aurEff)
290 std::visit([&]<
typename MovementType>(MovementType
const& movement)
292 if constexpr (std::is_same_v<MovementType, AreaTriggerOrbitInfo>)
302 else if constexpr (std::is_same_v<MovementType, AreaTriggerCreateProperties::SplineInfo>)
304 else if constexpr (std::is_same_v<MovementType, std::monostate>)
307 static_assert(Trinity::dependant_false_v<MovementType>,
"Unsupported movement type");
322 _rotation = { movedRot.
x, movedRot.y, movedRot.z, movedRot.w };
329 if (!
GetMap()->AddToMap(
this))
341 _ai->OnCreate(spell);
349 if (!at->
Create(areaTriggerCreatePropertiesId, caster->
GetMap(), pos, duration,
nullptr, caster, target, spellVisual, spellInfo, spell, aurEff))
372 if (!createProperties)
510 if (targetRoll && targetPitch && targetYaw)
511 targetRollPitchYaw.emplace(*targetRoll, *targetPitch, *targetYaw);
521 if (targetRollPitchYaw)
581 return advstd::bit_cast<float>(*overrideCurve.
ParameterCurve & ~1u);
583 std::array<DBCPosition2D, 2> points;
584 for (std::size_t i = 0; i < overrideCurve.
Points.
size(); ++i)
585 points[i] = { .X = overrideCurve.
Points[i].Pos.GetPositionX(), .Y = overrideCurve.
Points[i].Pos.GetPositionY() };
588 std::size_t pointCount = *overrideCurve.
ParameterCurve >> 24 & 0xFF;
590 return sDB2Manager.GetCurveValueAt(mode, std::span(points.begin(), pointCount), x);
601 curveTemplate.
Curve = constantValue;
610 curveTemplate.
Mode = interpolation;
611 curveTemplate.
Curve = points;
637 if (
float const* simpleFloat = std::get_if<float>(&curve->Curve))
639 uint32 packedCurve = advstd::bit_cast<uint32>(*simpleFloat);
645 for (std::size_t i = 0; i < UF::size<decltype(UF::OverrideCurve::Points)>(); ++i)
651 if ((*curvePoints)[1].X < (*curvePoints)[0].X)
674 uint32 packedCurve = (
uint32(mode) << 1) | (pointCount << 24);
677 for (std::size_t i = 0; i < curvePoints->size(); ++i)
679 point.
Pos.
Relocate((*curvePoints)[i].X, (*curvePoints)[i].Y);
687 std::vector<Unit*> targetList;
689 m_areaTriggerData->ShapeData.Visit([&]<
typename ShapeType>(ShapeType
const& shape)
691 if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerSphere>)
693 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBox>)
695 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerPolygon>)
697 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerCylinder>)
699 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerDisk>)
701 else if constexpr (std::is_same_v<ShapeType, UF::AreaTriggerBoundedPlane>)
712 if (HasActionSetFlag(AreaTriggerActionSetFlag::NotTriggeredbyCaster))
717 if (HasActionSetFlag(AreaTriggerActionSetFlag::OnlyTriggeredByCaster))
720 if (HasActionSetFlag(AreaTriggerActionSetFlag::CreatorsPartyOnly))
722 Unit* caster = GetCaster();
726 if (!caster->IsInRaidWith(target))
733 switch (player->getDeathState())
736 if (!HasActionSetFlag(AreaTriggerActionSetFlag::AllowWhileGhost))
740 if (!HasActionSetFlag(AreaTriggerActionSetFlag::AllowWhileDead))
752 return !
sConditionMgr->IsObjectMeetToConditions(target, *conditions);
758 HandleUnitEnterExit(targetList);
800 float extentsX = G3D::lerp(box.
Extents->Pos.GetPositionX(), box.
ExtentsTarget->Pos.GetPositionX(), progress) * scale;
801 float extentsY = G3D::lerp(box.
Extents->Pos.GetPositionY(), box.
ExtentsTarget->Pos.GetPositionY(), progress) * scale;
802 float extentsZ = G3D::lerp(box.
Extents->Pos.GetPositionZ(), box.
ExtentsTarget->Pos.GetPositionZ(), progress) * scale;
803 float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY + extentsZ * extentsZ);
807 if (targetList.empty())
811 .toWorldSpace(G3D::AABox({ -extentsX, -extentsY, -extentsZ }, { extentsX, extentsY, extentsZ }));
815 return !rotatedBox.contains(PositionToVector3(*unit));
821 for (
int32 corner = 0; corner < 8; ++corner)
838 if (targetList.empty())
854 G3D::Vector3 pos = PositionToVector3(
GetPosition()) + PositionToVector3(vertex);
876 SearchUnits(targetList, std::sqrt(radius * radius + height * height),
false);
878 if (targetList.empty())
882 .toWorldSpace(G3D::Cylinder(
883 { 0.0f, 0.0f, 0.0f + zOffset },
884 { 0.0f, 0.0f, 0.0f + zOffset + height },
889 return !rotatedCylinder.contains(PositionToVector3(*unit));
895 for (
int32 end = 0; end < 2; ++end)
915 SearchUnits(targetList, std::sqrt(outerRadius * outerRadius + height * height),
false);
917 if (targetList.empty())
921 .toWorldSpace(G3D::Cylinder(
922 { 0.0f, 0.0f, 0.0f + zOffset },
923 { 0.0f, 0.0f, 0.0f + zOffset + height },
926 G3D::Cylinder outerCylinder(innerCylinder.point(0), innerCylinder.point(1), outerRadius);
930 G3D::Vector3 position = PositionToVector3(*unit);
931 return innerCylinder.contains(position) || !outerCylinder.contains(position);
937 for (
int32 end = 0; end < 2; ++end)
951 float radius = std::sqrt(extentsY * extentsY + extentsZ * extentsZ);
955 if (targetList.empty())
960 G3D::Vector3 corners[4] =
962 coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, -extentsY, -extentsZ)),
963 coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, extentsY, -extentsZ)),
964 coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, -extentsY, extentsZ)),
965 coordinateFrame.pointToWorldSpace(G3D::Vector3(0.0f, extentsY, extentsZ))
970 G3D::Vector3 closestPoint = G3D::CollisionDetection::closestPointToRectangle(corners[0], corners[1], corners[2], corners[3], PositionToVector3(*unit));
977 for (G3D::Vector3
const& corner : corners)
986 std::vector<Unit*> enteringUnits;
988 for (
Unit* unit : newTargetList)
990 if (exitUnits.erase(unit->GetGUID()) == 0)
991 enteringUnits.push_back(unit);
997 for (
Unit* unit : enteringUnits)
1000 for (
ObjectGuid const& exitUnitGuid : exitUnits)
1014 if (player->isDebugAreaTriggers)
1025 _ai->OnUnitEnter(unit);
1043 if (player->isDebugAreaTriggers)
1046 if (canTriggerOnExit)
1060 if (canTriggerOnExit)
1061 _ai->OnUnitExit(unit, exitMode);
1079 if (spawn->scriptId)
1080 return spawn->scriptId;
1085 return createProperties->ScriptId;
1103 return caster->GetFaction();
1110 std::visit([
this]<
typename ShapeType>(ShapeType
const& shapeData)
1114 if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Sphere>)
1121 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Box>)
1128 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Polygon>)
1143 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Cylinder>)
1154 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::Disk>)
1167 else if constexpr (std::is_same_v<ShapeType, AreaTriggerShapeInfo::BoundedPlane>)
1177 static_assert(Trinity::dependant_false_v<ShapeType>,
"Unsupported shape type");
1219 G3D::Vector3 transformed = rotationMatrix * PositionToVector3(vertice);
1220 vertice.Relocate(transformed.x, transformed.y);
1281 switch (action.ActionType)
1288 caster->
AddAura(action.Param, unit);
1296 if (player->GetMapId() != safeLoc->Loc.GetMapId())
1298 if (
WorldSafeLocsEntry const* instanceEntrance = player->GetInstanceEntrance(safeLoc->Loc.GetMapId()))
1299 safeLoc = instanceEntrance;
1301 player->TeleportTo(safeLoc->Loc);
1327 switch (action.ActionType)
1336 player->GetRestMgr().SetInnTrigger(std::nullopt);
1354 QuaternionData oldRotation = std::exchange(
_rotation, { newRotation.
x, newRotation.y, newRotation.z, newRotation.w });
1356 if (newPosition != oldPosition)
1358 GetMap()->
AreaTriggerRelocation(
this, newPosition.GetPositionX(), newPosition.GetPositionY(), newPosition.GetPositionZ(), newPosition.GetOrientation());
1375 _ai->OnDestinationReached();
1386 .Position = Vector3ToPosition(localPosition),
1387 .Rotation = G3D::Quat::fromYPRAngles(localRotation.z, localRotation.y, localRotation.x)
1394 worldResult.Position = target->GetPositionWithOffset(worldResult.Position);
1397 worldResult.Rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), target->GetOrientation()) * worldResult.Rotation;
1405 worldResult.Position = transport->GetPositionWithOffset(worldResult.Position);
1408 worldResult.Rotation = G3D::Quat::fromAxisAngleRotation(G3D::Vector3::unitZ(), transport->GetTransportOrientation()) * worldResult.Rotation;
1413 worldResult.Rotation.toYPRAngles(localRotation.z, localRotation.y, localRotation.x);
1414 worldResult.
Position.SetOrientation(localRotation.z);
1467 std::vector<G3D::Vector3> rotatedPoints;
1468 rotatedPoints.resize(offsets.size());
1469 for (std::size_t i = 0; i < offsets.size(); ++i)
1471 Position const& offset = offsets[i];
1480 InitSplines(rotatedPoints, overrideSpeed, speedIsTimeInSeconds);
1485 if (splinePoints.size() < 2)
1488 _spline = std::make_unique<::Movement::Spline<float>>();
1491 std::vector<G3D::Vector3> offsets(splinePoints.size());
1492 for (std::size_t i = 0; i < splinePoints.size(); ++i)
1525 for (G3D::Vector3
const& point :
_spline->getPoints())
1530 for (G3D::Vector3
const& point :
_spline->getPoints())
1589 bool reachedDestination = currentTimePercent >= 1.0f;
1594 if (progress < 0.f || progress > 1.f)
1597 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})",
1601 currentTimePercent = progress;
1604 int32 lastPositionIndex = 0;
1605 float percentFromLastPoint = 0;
1606 _spline->computeIndex(currentTimePercent, lastPositionIndex, percentFromLastPoint);
1608 G3D::Vector3 currentPosition;
1609 _spline->evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition);
1611 float orientation = 0.0f;
1617 G3D::Vector3 derivative;
1618 _spline->evaluate_derivative(lastPositionIndex, percentFromLastPoint, derivative);
1619 if (derivative.x != 0.0f || derivative.y != 0.0f)
1620 orientation += std::atan2(derivative.y, derivative.x);
1625 .Position = currentPosition,
1626 .Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
1634 bool firstLoop =
true;
1638 if (movementTime > timeToTarget)
1646 float pathProgress = float(movementTime) / float(timeToTarget);
1652 pathProgress = std::min(1.f, pathProgress);
1654 float radius = orbit.
Radius;
1657 float blendCurve = std::clamp((orbit.
BlendFromRadius - radius) / radius, 1.0f, 4.0f);
1658 float blendProgress = std::clamp(std::abs(4.0f * pathProgress / blendCurve), 0.0f, 1.0f);
1662 float angle = 2.0f * float(
M_PI) * pathProgress;
1670 G3D::Vector3 position =
1672 radius * std::cos(angle),
1673 radius * std::sin(angle),
1677 float orientation = 0.0f;
1683 orientation += angle;
1689 .Position = position,
1690 .Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
1696 float orientation = 0.0f;
1705 .Position = G3D::Vector3::zero(),
1706 .Rotation = G3D::Vector3(0.0f, 0.0f, orientation)
1722 return orbit.
Center->Pos;
1765 if (player->isDebugAreaTriggers)
1773 _ai->OnInitialize();
1789 return !seerPlayer->isDebugAreaTriggers;
1819 if (requestedObjectMask.IsAnySet())
1822 if (requestedAreaTriggerMask.IsAnySet())
1826 std::size_t sizePos = buffer.
wpos();
1832 m_objectData->WriteUpdate(requestedObjectMask, buffer, target,
this, ignoreNestedChangesMask);
1835 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
#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.
EnumFlag< AreaTriggerCreatePropertiesFlag > Flags
AreaTriggerCreatePropertiesId Id
std::variant< std::monostate, SplineInfo, AreaTriggerOrbitInfo > Movement
AreaTriggerTemplate const * Template
std::vector< AreaTriggerAction > Actions
AreaTriggerTemplate const * GetTemplate() const
MovementUpdateLocalResult CalculateLocalSplinePositionAndRotation() const
MovementUpdateWorldResult CalculateWorldPositionAndRotation() const
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const
void UpdatePositionAndRotation()
void UndoActions(Unit *unit)
MovementUpdateLocalResult CalculateLocalPositionAndRotation() const
void SetOverrideCurve(UF::MutableFieldReference< UF::OverrideCurve, false > overrideCurveMutator, float constantValue)
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
void DebugVisualizePosition()
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
float GetShapeProgress() const
float GetOverrideCurveValueAtProgress(UF::OverrideCurve const &overrideCurve, float x) const
uint32 GetTimeSinceCreated() const
float GetOverrideCurveProgress(UF::OverrideCurve const &overrideCurve, uint32 timeTo) 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
float GetOverrideCurveValue(UF::OverrideCurve const &overrideCurve, uint32 timeTo) const
uint32 GetScriptId() const
Position const & GetMovementOrigin() const
void ClearOverrideScaleCurve()
uint32 GetFaction() const override
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
MovementUpdateLocalResult CalculateLocalOrbitPositionAndRotation(UF::AreaTriggerOrbit const &orbit) const
void HandleUnitEnterExit(std::vector< Unit * > const &targetList, AreaTriggerExitReason exitMode=AreaTriggerExitReason::NotInside)
void ClearValuesChangesMask() override
Position _stationaryPosition
void HandleUnitEnter(Unit *unit)
float GetMaxSearchRadius() const
float GetOverridePosProgress() const
void InitSplines(std::vector< G3D::Vector3 > const &splinePoints, Optional< float > overrideSpeed={}, Optional< bool > speedIsTimeInSeconds={})
Position const & GetStationaryPosition() const override
std::unique_ptr< AreaTriggerAI > _ai
void SearchUnitInSphere(UF::AreaTriggerSphere const &sphere, std::vector< Unit * > &targetList)
bool IsServerSide() const
void ClearOverrideMoveCurve()
void SearchUnits(std::vector< Unit * > &targetList, float radius, bool check3D)
void SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const &boundedPlane, std::vector< Unit * > &targetList)
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
QuaternionData _verticesUpdatePreviousRotation
void SetAreaTriggerFlag(AreaTriggerFieldFlags flag)
void ClearOverrideCurve(UF::MutableFieldReference< UF::OverrideCurve, false > overrideCurveMutator)
void SetShape(AreaTriggerShapeInfo const &shape)
MovementUpdateLocalResult CalculateLocalStationaryPositionAndRotation() const
uint32 GetTimeToTarget() const
void AddToWorld() override
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)
void SetOverrideShapeCurve(float overrideShape)
uint32 GetElapsedTimeForMovement() const
AreaTriggerTemplate const * _areaTriggerTemplate
void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag)
void SetOverrideMoveCurve(float x, float y, float z)
float GetScaleProgress() const
void SetOverrideScaleCurve(float overrideScale)
void HandleUnitExitInternal(Unit *unit, AreaTriggerExitReason exitMode=AreaTriggerExitReason::NotInside)
AuraEffect const * _aurEff
void SetDuration(int32 newDuration)
void _UpdateDuration(int32 newDuration)
void SetRollPitchYaw(float roll, float pitch, float yaw, Optional< float > targetRoll={}, Optional< float > targetPitch={}, Optional< float > targetYaw={})
void DoActions(Unit *unit)
void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag)
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={})
int32 GetDuration() const
AreaTriggerCreateProperties const * GetCreateProperties() const
bool HasOverridePosition() const
void UpdateHasPlayersFlag()
void UpdateDynamicShapeFlag()
std::unique_ptr<::Movement::Spline< float > > _spline
void ClearOverrideShapeCurve()
bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects) const override
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
void RemoveOptionalUpdateFieldValue(UF::OptionalUpdateFieldSetter< T > setter)
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
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)
float GetCombatReach() const override
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 bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects) const
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
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool incOwnRadius=true, bool incTargetRadius=true) 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
Position const & operator()(UF::AreaTriggerOrbit const &orbit) const
Position const & operator()(UF::AreaTriggerSplineCalculator const &) const
Position const & operator()(UF::AreaTriggerMovementScript const &script) const
Position const & operator()(std::monostate) const
int32 ExtraTimeForBlending
Optional< TaggedPosition< Position::XYZ > > Center
Optional< ObjectGuid > PathTarget
AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerOrbit const &orbit) const
AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerSplineCalculator const &) const
AreaTrigger::MovementUpdateLocalResult operator()(UF::AreaTriggerMovementScript const &) const
AreaTrigger::MovementUpdateLocalResult operator()(std::monostate) const
std::variant< Sphere, Box, Polygon, Cylinder, Disk, BoundedPlane > Data
AreaTriggerCreatePropertiesId Id
MovementUpdateResult Status
MovementUpdateResult Status
CurveInterpolationMode Mode
std::variant< float, Points > Curve
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 VisitWorldObjects(WorldObject const *obj, T &visitor, float radius)
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
struct MovementInfo::TransportInfo transport
constexpr void SetOrientation(float orientation)
constexpr float GetPositionX() const
constexpr float GetPositionY() const
Position GetPositionWithOffset(Position const &offset) const
Position GetPositionOffsetTo(Position const &endPos) 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
constexpr bool IsInDist(float x, float y, float z, float dist) const
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
uint32 SpellXSpellVisualID
bool Insert(ValueType< ObjectType > object)
bool Remove(ValueType< ObjectType > object)
UpdateField< float, 0, 2 > ExtentsZ
UpdateField< float, 0, 1 > ExtentsY
UpdateField< float, 0, 3 > ExtentsTargetY
UpdateField< float, 0, 4 > ExtentsTargetZ
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::OverrideCurve, 0, 5 > OverrideMoveCurveZ
VariantUpdateField< 32, 36, UF::AreaTriggerSplineCalculator, UF::AreaTriggerOrbit, UF::AreaTriggerMovementScript > PathData
UpdateField< uint32, 32, 33 > MoveCurveId
UpdateField< int32, 0, 22 > PositionalSoundKitID
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< UF::OverrideCurve, 0, 3 > OverrideMoveCurveX
UpdateField< float, 32, 34 > Facing
UpdateField< uint8, 32, 37 > ShapeType
UpdateField< UF::OverrideCurve, 0, 1 > OverrideScaleCurve
UpdateField< UF::OverrideCurve, 0, 6 > OverrideShapeCurve
UpdateField< uint32, 0, 12 > TimeToTargetPos
UpdateField< int32, 32, 36 > PathType
UpdateField< float, 0, 25 > ZOffset
UpdateField< UF::OverrideCurve, 0, 2 > ExtraScaleCurve
OptionalUpdateField< TaggedPosition< Position::XYZ >, 0, 26 > TargetRollPitchYaw
UpdateField< uint32, 0, 31 > MorphCurveId
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< uint32, 0, 18 > DecalPropertiesID
UpdateField< uint32, 0, 13 > TimeToTargetShape
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< UF::OverrideCurve, 0, 4 > OverrideMoveCurveY
UpdateField< ObjectGuid, 0, 7 > Caster
UpdateField< TaggedPosition< Position::XYZ >, 0, 21 > RollPitchYaw
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< TaggedPosition< Position::XYZ >, 0, 2 > Center
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 > Linear
DynamicUpdateField< TaggedPosition< Position::XYZ >, 0, 2 > Points
UpdateField< uint32, 0, 2 > StartTimeOffset
UpdateFieldArray< TaggedPosition< Position::XY >, 2, 4, 5 > Points
UpdateField< uint32, 0, 3 > ParameterCurve
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)