47 _duration(0), _totalDuration(0), _timeSinceCreated(0), _verticesUpdatePreviousOrientation(
std::numeric_limits<float>::infinity()),
48 _isRemoved(false), _reachedDestination(true), _lastSplineIndex(0), _movementTime(0),
49 _areaTriggerCreateProperties(nullptr), _areaTriggerTemplate(nullptr)
89 caster->_UnregisterAreaTrigger(
this);
104bool 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 )
114 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid coordinates (X: {} Y: {})", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom),
GetPositionX(),
GetPositionY());
121 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) not created. Invalid areatrigger create properties id", areaTriggerCreatePropertiesId.
Id,
uint32(areaTriggerCreatePropertiesId.
IsCustom));
164 float multiplier = 1.0f;
167 if (multiplier != 1.0f)
170 overrideScale.
Curve = multiplier;
239 if (!
GetMap()->AddToMap(
this))
251 _ai->OnCreate(spell ? spell :
nullptr);
259 if (!at->
Create(areaTriggerCreatePropertiesId, caster->
GetMap(), pos, duration,
nullptr, caster, target, spellVisual, spellInfo, spell, aurEff))
282 if (!createProperties)
295 return Create(spawnData->
Id, map, spawnData->
spawnPoint, -1, spawnData,
nullptr,
nullptr, spellVisual, spellInfo);
318 float orientation = 0.0f;
320 if (createProperties->FacingCurveId)
324 orientation += target->GetOrientation();
337 if (createProperties->FacingCurveId)
454 if (createProperties->ScaleCurveId)
486 std::array<DBCPosition2D, 2> points;
487 for (std::size_t i = 0; i < scaleCurve.
Points.
size(); ++i)
488 points[i] = { .X = scaleCurve.
Points[i].Pos.GetPositionX(), .Y = scaleCurve.
Points[i].Pos.GetPositionY() };
493 return sDB2Manager.GetCurveValueAt(mode, std::span(points.begin(), pointCount), x);
504 curveTemplate.
Curve = constantValue;
512 curve.
Mode = interpolation;
517 curveTemplate.
Curve = curve;
543 if (
float const* simpleFloat = std::get_if<float>(&curve->Curve))
545 uint32 packedCurve = advstd::bit_cast<uint32>(*simpleFloat);
551 for (std::size_t i = 0; i < UF::size<decltype(UF::ScaleCurve::Points)>(); ++i)
557 if (curvePoints->Points[1].X < curvePoints->Points[0].X)
580 uint32 packedCurve = (
uint32(mode) << 1) | (pointCount << 24);
583 for (std::size_t i = 0; i < curvePoints->Points.size(); ++i)
585 point.
Relocate(curvePoints->Points[i].X, curvePoints->Points[i].Y);
593 std::vector<Unit*> targetList;
625 return !
sConditionMgr->IsObjectMeetToConditions(target, *conditions);
652 if (createProperties->MorphCurveId)
653 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
665 if (createProperties->MorphCurveId)
666 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
672 float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY);
679 return !unit->
IsWithinBox(boxCenter, extentsX, extentsY, extentsZ / 2);
687 if (createProperties->MorphCurveId)
688 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
708 if (createProperties->MorphCurveId)
709 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
733 if (createProperties->MorphCurveId)
734 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
758 if (createProperties->MorphCurveId)
759 progress =
sDB2Manager.GetCurveValueAt(createProperties->MorphCurveId, progress);
764 float radius = std::sqrt(extentsX * extentsX + extentsY * extentsY);
779 std::vector<Unit*> enteringUnits;
781 for (
Unit* unit : newTargetList)
783 if (exitUnits.erase(unit->GetGUID()) == 0)
784 enteringUnits.push_back(unit);
790 for (
Unit* unit : enteringUnits)
794 if (player->isDebugAreaTriggers)
802 _ai->OnUnitEnter(unit);
805 for (
ObjectGuid const& exitUnitGuid : exitUnits)
811 if (player->isDebugAreaTriggers)
819 _ai->OnUnitExit(leavingUnit);
840 return spawn->scriptId;
845 return createProperties->ScriptId;
863 return caster->GetFaction();
900 float angleSin = std::sin(newOrientation);
901 float angleCos = std::cos(newOrientation);
906 float x = vertice.GetPositionX() * angleCos - vertice.GetPositionY() * angleSin;
907 float y = vertice.GetPositionY() * angleCos + vertice.GetPositionX() * angleSin;
908 vertice.Relocate(x, y);
920 bool locatedInPolygon =
false;
924 std::size_t nextVertex;
935 nextVertex = vertex + 1;
944 bool belowLowY = vertY_i > testY;
946 bool belowHighY = vertY_j > testY;
959 bool withinYsEdges = belowLowY != belowHighY;
964 float slopeOfLine = (vertX_j - vertX_i) / (vertY_j - vertY_i);
967 float pointOnLine = (slopeOfLine* (testY - vertY_i)) + vertX_i;
970 bool isLeftToLine = testX < pointOnLine;
975 locatedInPolygon = !locatedInPolygon;
980 return locatedInPolygon;
1038 switch (action.ActionType)
1045 caster->
AddAura(action.Param, unit);
1053 if (player->GetMapId() != safeLoc->Loc.GetMapId())
1055 if (
WorldSafeLocsEntry const* instanceEntrance = player->GetInstanceEntrance(safeLoc->Loc.GetMapId()))
1056 safeLoc = instanceEntrance;
1058 player->TeleportTo(safeLoc->Loc);
1085 std::vector<G3D::Vector3> rotatedPoints;
1086 rotatedPoints.reserve(offsets.size());
1087 for (
Position const& offset : offsets)
1089 float x =
GetPositionX() + (offset.GetPositionX() * angleCos - offset.GetPositionY() * angleSin);
1090 float y =
GetPositionY() + (offset.GetPositionY() * angleCos + offset.GetPositionX() * angleSin);
1094 z += offset.GetPositionZ();
1096 rotatedPoints.emplace_back(x, y, z);
1099 InitSplines(std::move(rotatedPoints), timeToTarget);
1104 if (splinePoints.size() < 2)
1109 _spline = std::make_unique<::Movement::Spline<int32>>();
1134 for (G3D::Vector3
const& vec : splinePoints)
1208 if (createProperties && createProperties->
MoveCurveId)
1213 pathProgress = std::min(1.f, pathProgress);
1215 float radius = cmi.
Radius;
1221 float blendProgress = std::min(1.f, pathProgress / blendCurve);
1234 float orientation = 0.0f;
1240 orientation += angle;
1244 return { x, y, z, orientation };
1281 _ai->OnDestinationReached();
1287 if (currentTimePercent <= 0.f)
1291 if (createProperties && createProperties->
MoveCurveId)
1294 if (progress < 0.f || progress > 1.f)
1296 TC_LOG_ERROR(
"entities.areatrigger",
"AreaTrigger (Id: {}, AreaTriggerCreatePropertiesId: (Id: {}, IsCustom: {})) has wrong progress ({}) caused by curve calculation (MoveCurveId: {})",
1300 currentTimePercent = progress;
1303 int lastPositionIndex = 0;
1304 float percentFromLastPoint = 0;
1305 _spline->computeIndex(currentTimePercent, lastPositionIndex, percentFromLastPoint);
1307 G3D::Vector3 currentPosition;
1308 _spline->evaluate_percent(lastPositionIndex, percentFromLastPoint, currentPosition);
1316 G3D::Vector3 derivative;
1317 _spline->evaluate_derivative(lastPositionIndex, percentFromLastPoint, derivative);
1318 if (derivative.x != 0.0f || derivative.y != 0.0f)
1319 orientation += std::atan2(derivative.y, derivative.x);
1345 if (createProperties->FacingCurveId)
1360 if (player->isDebugAreaTriggers)
1368 _ai->OnInitialize();
1384 return !seerPlayer->isDebugAreaTriggers;
1395 std::size_t sizePos = data->
wpos();
1406 std::size_t sizePos = data->
wpos();
1423 if (requestedObjectMask.IsAnySet())
1426 if (requestedAreaTriggerMask.IsAnySet())
1430 std::size_t sizePos = buffer.
wpos();
1435 m_objectData->WriteUpdate(buffer, requestedObjectMask,
true,
this, target);
1438 m_areaTriggerData->WriteUpdate(buffer, requestedAreaTriggerMask,
true,
this, target);
#define sAreaTriggerDataStore
@ AREATRIGGER_ACTION_ADDAURA
@ AREATRIGGER_ACTION_TELEPORT
@ 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
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__,...)
@ 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
Optional< AreaTriggerOrbitInfo > OrbitInfo
AreaTriggerTemplate const * Template
AreaTriggerShapeInfo Shape
Optional< AreaTriggerScaleCurveTemplate > ExtraScale
AreaTriggerTemplate const * GetTemplate() const
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const override
void ClearUpdateMask(bool remove) override
void UndoActions(Unit *unit)
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
void DebugVisualizePosition()
void InitSplineOffsets(std::vector< Position > const &offsets, uint32 timeToTarget)
uint32 GetTimeSinceCreated() const
float CalcCurrentScale() const
void InitOrbit(AreaTriggerOrbitInfo const &orbit, uint32 timeToTarget)
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()
uint32 GetScriptId() const
float GetStationaryO() const override
void ClearOverrideScaleCurve()
float GetScaleCurveValue(UF::ScaleCurve const &scaleCurve, uint32 timeTo) const
AreaTriggerShapeInfo const & GetShape() const
uint32 GetFaction() const override
void HandleUnitEnterExit(std::vector< Unit * > const &targetList)
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
int32 GetTotalDuration() const
float GetMaxSearchRadius() const
void UpdateOverridePosition()
void SearchUnitInBoundedPlane(std::vector< Unit * > &targetList)
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
UF::UpdateField< UF::AreaTriggerData, 0, TYPEID_AREATRIGGER > m_areaTriggerData
std::unique_ptr< AreaTriggerAI > _ai
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)
float GetScaleCurveProgress(UF::ScaleCurve const &scaleCurve, uint32 timeTo) const
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::AreaTriggerData::Mask const &requestedAreaTriggerMask, Player const *target) const
uint32 GetTimeToTarget() const
void AddToWorld() override
float GetProgress() const
void InitSplines(std::vector< G3D::Vector3 > splinePoints, uint32 timeToTarget)
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
bool CheckIsInPolygon2D(Position const *pos) const
void UpdateSplinePosition(uint32 diff)
void SearchUnitInCylinder(std::vector< Unit * > &targetList)
void ClearExtraScaleCurve()
void SearchUnitInDisk(std::vector< Unit * > &targetList)
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)
std::unique_ptr<::Movement::Spline< int32 > > _spline
void SearchUnitInPolygon(std::vector< Unit * > &targetList)
uint32 GetElapsedTimeForMovement() const
AreaTriggerTemplate const * _areaTriggerTemplate
void SetOverrideMoveCurve(float x, float y, float z)
void SearchUnitInSphere(std::vector< Unit * > &targetList)
void SetOverrideScaleCurve(float overrideScale)
Optional< AreaTriggerOrbitInfo > _orbitInfo
AuraEffect const * _aurEff
void UpdateOrbitPosition(uint32 diff)
void SetScaleCurve(UF::MutableFieldReference< UF::ScaleCurve, false > scaleCurveMutator, float constantValue)
void SetDuration(int32 newDuration)
void _UpdateDuration(int32 newDuration)
void DoActions(Unit *unit)
float GetScaleCurveValueAtProgress(UF::ScaleCurve const &scaleCurve, float x) const
void SetExtraScaleCurve(float extraScale)
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
void RemoveFromWorld() override
Position CalculateOrbitPosition() const
int32 GetDuration() const
AreaTriggerCreateProperties const * GetCreateProperties() const
bool HasOverridePosition() const
void SearchUnitInBox(std::vector< Unit * > &targetList)
float _verticesUpdatePreviousOrientation
AreaTriggerShapeInfo _shape
void put(std::size_t pos, T value)
void PSendSysMessage(const char *fmt, Args &&... args)
constexpr bool HasFlag(T flag) const
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
ObjectGuid const & GetGUID() const
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
CreateObjectBits m_updateFlag
virtual void ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
UF::UpdateFieldHolder m_values
void _Create(ObjectGuid const &guid)
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
void DoWithSuppressingObjectUpdates(Action &&action)
static ObjectGuid GetGUID(Object const *o)
void SetEntry(uint32 entry)
virtual void SetObjectScale(float scale)
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
static Player * ToPlayer(Object *o)
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 TransportBase * RemovePassenger(WorldObject *passenger)=0
virtual void CalculatePassengerOffset(float &x, float &y, float &z, float *o=nullptr) const =0
This method transforms supplied global coordinates into local offsets.
virtual void AddPassenger(WorldObject *passenger)=0
bool Remove(KEY_TYPE const &handle)
bool Insert(KEY_TYPE const &handle, SPECIFIC_TYPE *obj)
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
void _RegisterAreaTrigger(AreaTrigger *areaTrigger)
Aura * AddAura(uint32 spellId, Unit *target)
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)
uint32 GetBlock(uint32 index) const
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
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
virtual void Update(uint32 diff)
Optional< AreaTriggerSplineInfo > AreaTriggerSpline
Optional< AreaTriggerOrbitInfo > AreaTriggerOrbit
WorldPacket const * Write() override
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)
void MultimapErasePair(M< K, V, Rest... > &multimap, K const &key, V const &value)
void EraseIf(Container &c, Predicate p)
AreaTriggerActionUserTypes TargetType
int32 ElapsedTimeForMovement
Optional< TaggedPosition< Position::XYZ > > Center
Optional< ObjectGuid > PathTarget
std::array< DBCPosition2D, 2 > Points
CurveInterpolationMode Mode
std::variant< float, AreaTriggerScaleCurvePointsTemplate > Curve
struct AreaTriggerShapeInfo::@199::@203 BoxDatas
struct AreaTriggerShapeInfo::@199::@207 BoundedPlaneDatas
std::vector< TaggedPosition< Position::XY > > PolygonVertices
AreaTriggerShapeType Type
struct AreaTriggerShapeInfo::@199::@202 SphereDatas
std::vector< TaggedPosition< Position::XY > > PolygonVerticesTarget
struct AreaTriggerShapeInfo::@199::@205 CylinderDatas
struct AreaTriggerShapeInfo::@199::@204 PolygonDatas
struct AreaTriggerShapeInfo::@199::@206 DiskDatas
Optional< int32 > SpellForVisuals
AreaTriggerCreatePropertiesId Id
UF::ObjectData::Base ObjectMask
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
constexpr void GetPosition(float &x, float &y) const
bool IsPositionValid() const
bool IsWithinBox(Position const ¢er, float xradius, float yradius, float zradius) const
constexpr void Relocate(float x, float y)
constexpr Position GetPosition() const
constexpr float GetOrientation() const
constexpr float GetPositionZ() const
uint32 SpellXSpellVisualID
UpdateField< UF::ScaleCurve, 0, 3 > OverrideScaleCurve
UpdateField< UF::ScaleCurve, 0, 7 > OverrideMoveCurveZ
UpdateField< UF::VisualAnim, 0, 25 > VisualAnim
UpdateField< ObjectGuid, 0, 22 > OrbitPathTarget
UpdateField< ObjectGuid, 0, 8 > Caster
UpdateField< UF::SpellCastVisual, 0, 16 > SpellVisual
UpdateField< float, 0, 17 > BoundsRadius2D
UpdateField< uint32, 0, 11 > TimeToTargetScale
UpdateField< UF::ScaleCurve, 0, 6 > OverrideMoveCurveY
UpdateField< int32, 0, 15 > SpellForVisuals
UpdateField< uint32, 0, 18 > DecalPropertiesID
UpdateField< uint32, 0, 21 > NumPlayersInside
UpdateField< UF::ScaleCurve, 0, 5 > OverrideMoveCurveX
UpdateField< int32, 0, 14 > SpellID
UpdateField< uint32, 0, 10 > TimeToTarget
UpdateField< ObjectGuid, 0, 19 > CreatingEffectGUID
UpdateField< uint32, 0, 9 > Duration
UpdateField< uint32, 0, 20 > NumUnitsInside
UpdateField< UF::ScaleCurve, 0, 4 > ExtraScaleCurve
std::enable_if_t< std::is_base_of_v< HasChangesMaskTag, U >, std::conditional_t< std::is_base_of_v< IsUpdateFieldStructureTag, V >, MutableFieldReference< V, PublicSet >, std::conditional_t< std::is_base_of_v< IsUpdateFieldHolderTag, V >, MutableNestedFieldReference< V, PublicSet >, std::conditional_t< PublicSet, UpdateFieldPublicSetter< V >, UpdateFieldSetter< V > > > > > ModifyValue(UpdateField< V, BlockBit, Bit >(T::*field))
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
UpdateField< bool, 0, 1 > Field_C
UpdateField< uint32, 0, 2 > AnimationDataID