18#ifndef TRINITYCORE_AREATRIGGER_H
19#define TRINITYCORE_AREATRIGGER_H
39 template<
typename length_type>
99 void operator()(
Player const* player)
const;
105 void AI_Initialize();
110 bool IsCustom()
const {
return _areaTriggerTemplate->Id.IsCustom; }
122 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);
134 uint32 GetTimeSinceCreated()
const;
142 float CalcCurrentScale()
const;
143 void SetOverrideScaleCurve(
float overrideScale);
145 void ClearOverrideScaleCurve();
147 void SetExtraScaleCurve(
float extraScale);
149 void ClearExtraScaleCurve();
151 void SetOverrideMoveCurve(
float x,
float y,
float z);
152 void SetOverrideMoveCurve(std::array<DBCPosition2D, 2>
const& xCurvePoints, std::array<DBCPosition2D, 2>
const& yCurvePoints, std::array<DBCPosition2D, 2>
const& zCurvePoints,
154 void ClearOverrideMoveCurve();
156 void SetOverrideShapeCurve(
float overrideShape);
158 void ClearOverrideShapeCurve();
177 void SetRollPitchYaw(
float roll,
float pitch,
float yaw,
184 void SetDuration(
int32 newDuration);
185 void Delay(
int32 delaytime) { SetDuration(GetDuration() - delaytime); }
191 uint32 GetScriptId()
const;
196 Unit* GetCaster()
const;
197 Unit* GetTarget()
const;
202 float GetMaxSearchRadius()
const;
204 void InitSplines(std::vector<G3D::Vector3>
const& splinePoints,
Optional<float> overrideSpeed = {},
Optional<bool> speedIsTimeInSeconds = {});
207 uint32 GetElapsedTimeForMovement()
const;
215 bool HasOverridePosition()
const;
219 void HandleUnitExit(
Unit* unit);
224 void _UpdateDuration(
int32 newDuration);
226 float GetScaleProgress()
const {
return GetOverrideCurveProgress(m_areaTriggerData->OverrideScaleCurve, m_areaTriggerData->TimeToTargetScale); }
227 float GetExtraScaleProgress()
const {
return GetOverrideCurveProgress(m_areaTriggerData->ExtraScaleCurve, m_areaTriggerData->TimeToTargetExtraScale); }
228 float GetOverridePosProgress()
const {
return GetOverrideCurveProgress(m_areaTriggerData->OverrideMoveCurveX, m_areaTriggerData->TimeToTargetPos); }
229 float GetShapeProgress()
const {
return GetOverrideCurveProgress(m_areaTriggerData->OverrideShapeCurve, m_areaTriggerData->TimeToTargetShape); }
236 using Points = std::array<DBCPosition2D, 2>;
241 float GetOverrideCurveValueAtProgress(
UF::OverrideCurve const& overrideCurve,
float x)
const;
248 void UpdateTargetList();
249 void SearchUnits(std::vector<Unit*>& targetList,
float radius,
bool check3D);
257 void HandleUnitEnter(
Unit* unit);
260 void DoActions(
Unit* unit);
261 void UndoActions(
Unit* unit);
263 void UpdatePositionAndRotation();
276 Position const& GetMovementOrigin()
const;
278 void UpdatePolygonVertices();
280 void UpdateDynamicShapeFlag();
281 void UpdateHasPlayersFlag();
283 void DebugVisualizePosition();
299 std::unique_ptr<::Movement::Spline<float>>
_spline;
307 std::unique_ptr<AreaTriggerAI>
_ai;
#define DEFINE_ENUM_FLAG(enumType)
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
bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
float GetShapeProgress() const
UF::AreaTriggerOrbit const & GetOrbit() const
EnumFlag< AreaTriggerFieldFlags > GetAreaTriggerFlags() const
ObjectGuid GetOwnerGUID() const override
void SetTimeToTargetPos(uint32 timeToTargetPos)
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
int32 GetTotalDuration() const
Position _stationaryPosition
float GetOverridePosProgress() const
Position const & GetStationaryPosition() const override
std::unique_ptr< AreaTriggerAI > _ai
uint32 GetTimeToTargetPos() const
bool IsServerSide() const
float GetExtraScaleProgress() const
uint32 GetSpellId() const
void SetTimeToTargetShape(uint32 timeToTargetShape)
void SetTimeToTarget(uint32 timeToTarget)
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
QuaternionData _verticesUpdatePreviousRotation
void SetAreaTriggerFlag(AreaTriggerFieldFlags flag)
uint32 GetTimeToTarget() const
GuidUnorderedSet _insideUnits
uint32 GetTimeToTargetScale() const
bool IsStaticSpawn() const
uint32 GetTimeToTargetShape() const
AreaTriggerTemplate const * _areaTriggerTemplate
void SetTimeToTargetScale(uint32 timeToTargetScale)
void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag)
float GetScaleProgress() const
AuraEffect const * _aurEff
AuraEffect const * GetAuraEffect() const
ObjectGuid GetCreatorGUID() const override
void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag)
void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale)
int32 GetDuration() const
AreaTriggerCreateProperties const * GetCreateProperties() const
void Delay(int32 delaytime)
std::unique_ptr<::Movement::Spline< float > > _spline
void SetPathTarget(ObjectGuid pathTarget)
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
void SetUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
void RemoveUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
virtual void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const =0
virtual void ClearValuesChangesMask()
void AddToWorld() override
void RemoveFromWorld() override
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects) const
virtual uint32 GetFaction() const =0
virtual void Update(uint32 diff)
std::conditional_t< std::is_base_of_v< HasChangesMaskTag, T >, MutableFieldReferenceWithChangesMask< T, PublicSet >, MutableFieldReferenceNoChangesMask< T, PublicSet > > MutableFieldReference
std::variant< float, Points > Curve
std::array< DBCPosition2D, 2 > Points
UF::ObjectData::Base ObjectMask
bool IgnoreNestedChangesMask
UF::AreaTriggerData::Base AreaTriggerMask
ValuesUpdateForPlayerWithMaskSender(AreaTrigger const *owner)
AreaTrigger const * Owner
UpdateField< ObjectGuid, 0, 20 > OrbitPathTarget
UpdateField< uint32, 0, 27 > Flags
UpdateField< uint32, 0, 12 > TimeToTargetPos
UpdateField< uint32, 0, 13 > TimeToTargetShape
UpdateField< uint32, 0, 11 > TimeToTargetExtraScale
UpdateField< uint32, 0, 10 > TimeToTargetScale
UpdateField< uint32, 0, 9 > TimeToTarget