18#ifndef TRINITYCORE_AREATRIGGER_H
19#define TRINITYCORE_AREATRIGGER_H
38 template<
typename length_type>
65 void operator()(
Player const* player)
const;
76 bool IsCustom()
const {
return _areaTriggerTemplate->Id.IsCustom; }
88 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);
104 void SetOverrideScaleCurve(
float overrideScale);
106 void ClearOverrideScaleCurve();
108 void SetExtraScaleCurve(
float extraScale);
110 void ClearExtraScaleCurve();
112 void SetOverrideMoveCurve(
float x,
float y,
float z);
113 void SetOverrideMoveCurve(std::array<DBCPosition2D, 2>
const& xCurvePoints, std::array<DBCPosition2D, 2>
const& yCurvePoints, std::array<DBCPosition2D, 2>
const& zCurvePoints,
115 void ClearOverrideMoveCurve();
133 void SetDuration(
int32 newDuration);
134 void Delay(
int32 delaytime) { SetDuration(GetDuration() - delaytime); }
140 uint32 GetScriptId()
const;
145 Unit* GetCaster()
const;
146 Unit* GetTarget()
const;
151 float GetMaxSearchRadius()
const;
154 void InitSplineOffsets(std::vector<Position>
const& offsets,
Optional<float> overrideSpeed = {});
155 void InitSplines(std::vector<G3D::Vector3>
const& splinePoints,
Optional<float> overrideSpeed = {});
156 bool HasSplines()
const {
return std::holds_alternative<std::unique_ptr<::Movement::Spline<float>>>(_movement); }
161 bool HasOrbit()
const {
return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); }
164 bool HasOverridePosition()
const;
171 void _UpdateDuration(
int32 newDuration);
173 float CalcCurrentScale()
const;
175 float GetProgress()
const;
178 float GetScaleCurveValueAtProgress(
UF::ScaleCurve const& scaleCurve,
float x)
const;
185 void UpdateTargetList();
186 void SearchUnits(std::vector<Unit*>& targetList,
float radius,
bool check3D);
187 void SearchUnitInSphere(std::vector<Unit*>& targetList);
188 void SearchUnitInBox(std::vector<Unit*>& targetList);
189 void SearchUnitInPolygon(std::vector<Unit*>& targetList);
190 void SearchUnitInCylinder(std::vector<Unit*>& targetList);
191 void SearchUnitInDisk(std::vector<Unit*>& targetList);
192 void SearchUnitInBoundedPlane(std::vector<Unit*>& targetList);
193 void HandleUnitEnterExit(std::vector<Unit*>
const& targetList);
195 void DoActions(
Unit* unit);
196 void UndoActions(
Unit* unit);
198 void UpdatePolygonVertices();
201 void UpdateOverridePosition();
203 Position const* GetOrbitCenterPosition()
const;
204 Position CalculateOrbitPosition()
const;
206 void DebugVisualizePosition();
225 std::variant<std::monostate, std::unique_ptr<::Movement::Spline<float>>, std::unique_ptr<AreaTriggerOrbitInfo>>
_movement;
235 std::unique_ptr<AreaTriggerAI>
_ai;
std::unordered_set< ObjectGuid > GuidUnorderedSet
std::optional< T > Optional
Optional helper class to wrap optional values within.
AreaTriggerTemplate const * GetTemplate() const
::Movement::Spline< float > const & GetSpline() const
GuidUnorderedSet const & GetInsideUnits() const
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
uint32 GetTimeToTargetExtraScale() const
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
AreaTriggerOrbitInfo const & GetOrbit() const
void SetHeightIgnoresScale(bool heightIgnoresScale)
ObjectGuid GetOwnerGUID() const override
uint32 GetTimeSinceCreated() const
void SetTimeToTargetPos(uint32 timeToTargetPos)
AreaTriggerShapeInfo const & GetShape() const
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
int32 GetTotalDuration() const
Position _stationaryPosition
Position const & GetStationaryPosition() const override
std::unique_ptr< AreaTriggerAI > _ai
uint32 GetTimeToTargetPos() const
bool IsServerSide() const
uint32 GetSpellId() const
void SetTimeToTarget(uint32 timeToTarget)
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
uint32 GetTimeToTarget() const
GuidUnorderedSet _insideUnits
uint32 GetTimeToTargetScale() const
bool IsStaticSpawn() const
std::variant< std::monostate, std::unique_ptr<::Movement::Spline< float > >, std::unique_ptr< AreaTriggerOrbitInfo > > _movement
uint32 GetElapsedTimeForMovement() const
AreaTriggerTemplate const * _areaTriggerTemplate
void SetTimeToTargetScale(uint32 timeToTargetScale)
Position _targetRollPitchYaw
AuraEffect const * _aurEff
AuraEffect const * GetAuraEffect() const
ObjectGuid GetCreatorGUID() const override
Position const & GetTargetRollPitchYaw() const
Position const & GetRollPitchYaw() const
void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale)
int32 GetDuration() const
AreaTriggerCreateProperties const * GetCreateProperties() const
void Delay(int32 delaytime)
float _verticesUpdatePreviousOrientation
AreaTriggerShapeInfo _shape
virtual void BuildValuesCreate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
virtual void ClearUpdateMask(bool remove)
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
virtual void BuildValuesUpdate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
void AddToWorld() override
void RemoveFromWorld() override
virtual uint32 GetFaction() const =0
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const
virtual void Update(uint32 diff)
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
void Remove(VignetteData &vignette, WorldObject const *owner)
UF::ObjectData::Base ObjectMask
UF::AreaTriggerData::Base AreaTriggerMask
ValuesUpdateForPlayerWithMaskSender(AreaTrigger const *owner)
AreaTrigger const * Owner
UpdateField< uint32, 0, 12 > TimeToTargetExtraScale
UpdateField< bool, 0, 1 > HeightIgnoresScale
UpdateField< uint32, 0, 13 > TimeToTargetPos
UpdateField< uint32, 0, 11 > TimeToTargetScale
UpdateField< uint32, 0, 10 > TimeToTarget