TrinityCore
Loading...
Searching...
No Matches
AreaTrigger.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITYCORE_AREATRIGGER_H
19#define TRINITYCORE_AREATRIGGER_H
20
21#include "Object.h"
22#include "GridObject.h"
23#include "MapObject.h"
24#include "AreaTriggerTemplate.h"
25
26class AuraEffect;
27class AreaTriggerAI;
28class SpellInfo;
29class Unit;
30
31namespace G3D
32{
33 class Vector2;
34 class Vector3;
35}
36namespace Movement
37{
38 template<typename length_type>
39 class Spline;
40}
41
43{
44 None = 0x0000,
45 HeightIgnoresScale = 0x0001,
46 WowLabsCircle = 0x0002,
47 CanLoop = 0x0004,
48 AbsoluteOrientation = 0x0008,
49 DynamicShape = 0x0010,
50 Attached = 0x0020,
51 FaceMovementDir = 0x0040,
52 FollowsTerrain = 0x0080,
53 Unknown1025 = 0x0100,
54 AlwaysExterior = 0x0200,
55 HasPlayers = 0x0400,
56};
57
59
61{
62 Spline = 0,
63 Orbit = 1,
64 None = 2,
66};
67
69{
70 NotInside = 0, // Unit leave areatrigger
71 ByExpire = 1 // On areatrigger despawn
72};
73
74class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<AreaTrigger>, public MapObject
75{
76 public:
79
80 protected:
81 void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
82 void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer& data, Player const* target) const override;
83 void ClearValuesChangesMask() override;
84
85 public:
86 void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
87 UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target, bool ignoreNestedChangesMask) const;
88
89 struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
90 {
91 explicit ValuesUpdateForPlayerWithMaskSender(AreaTrigger const* owner) : Owner(owner), IgnoreNestedChangesMask(false) { }
92
97
98 void operator()(Player const* player) const;
99 };
100
101 void AddToWorld() override;
102 void RemoveFromWorld() override;
103
104 void AI_Initialize();
105 void AI_Destroy();
106
107 AreaTriggerAI* AI() { return _ai.get(); }
108
109 bool IsCustom() const { return _areaTriggerTemplate->Id.IsCustom; }
110 bool IsServerSide() const { return _areaTriggerTemplate->Flags.HasFlag(AreaTriggerFlag::IsServerSide); }
111 bool IsStaticSpawn() const { return _spawnId != 0; }
112 bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const { return _areaTriggerTemplate->ActionSetFlags.HasFlag(flag); }
113
114 bool IsNeverVisibleFor(WorldObject const* seer, bool allowServersideObjects = false) const override;
115
116 Position const& GetStationaryPosition() const override { return _stationaryPosition; }
117 void RelocateStationaryPosition(Position const& pos) { _stationaryPosition.Relocate(pos); }
118 void PlaySpellVisual(uint32 spellVisualId) const;
119
120 private:
121 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);
122
123 public:
124 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);
125 static ObjectGuid CreateNewMovementForceId(Map* map, uint32 areaTriggerId);
126 bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate);
127
128 void Update(uint32 diff) override;
129 void Remove();
130 bool IsRemoved() const { return _isRemoved; }
131 uint32 GetSpellId() const { return m_areaTriggerData->SpellID; }
132 AuraEffect const* GetAuraEffect() const { return _aurEff; }
133 uint32 GetTimeSinceCreated() const;
134
135 EnumFlag<AreaTriggerFieldFlags> GetAreaTriggerFlags() const { return static_cast<AreaTriggerFieldFlags>(*m_areaTriggerData->Flags); }
136 bool HasAreaTriggerFlag(AreaTriggerFieldFlags flag) const { return GetAreaTriggerFlags().HasFlag(flag); }
140
141 float CalcCurrentScale() const;
142 void SetOverrideScaleCurve(float overrideScale);
143 void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
144 void ClearOverrideScaleCurve();
145
146 void SetExtraScaleCurve(float extraScale);
147 void SetExtraScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
148 void ClearExtraScaleCurve();
149
150 void SetOverrideMoveCurve(float x, float y, float z);
151 void SetOverrideMoveCurve(std::array<DBCPosition2D, 2> const& xCurvePoints, std::array<DBCPosition2D, 2> const& yCurvePoints, std::array<DBCPosition2D, 2> const& zCurvePoints,
152 Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
153 void ClearOverrideMoveCurve();
154
155 uint32 GetTimeToTarget() const { return m_areaTriggerData->TimeToTarget; }
156 void SetTimeToTarget(uint32 timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); }
157
158 uint32 GetTimeToTargetScale() const { return m_areaTriggerData->TimeToTargetScale; }
159 void SetTimeToTargetScale(uint32 timeToTargetScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), timeToTargetScale); }
160
161 uint32 GetTimeToTargetExtraScale() const { return m_areaTriggerData->TimeToTargetExtraScale; }
162 void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetExtraScale), timeToTargetExtraScale); }
163
164 uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; }
165 void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); }
166
167 void SetSpellVisual(SpellCastVisual const& visual);
168
169 int32 GetDuration() const { return _duration; }
170 int32 GetTotalDuration() const { return _totalDuration; }
171 void SetDuration(int32 newDuration);
172 void Delay(int32 delaytime) { SetDuration(GetDuration() - delaytime); }
173
174 GuidUnorderedSet const& GetInsideUnits() const { return _insideUnits; }
175
176 AreaTriggerCreateProperties const* GetCreateProperties() const { return _areaTriggerCreateProperties; }
177 AreaTriggerTemplate const* GetTemplate() const { return _areaTriggerTemplate; }
178 uint32 GetScriptId() const;
179
180 ObjectGuid GetCreatorGUID() const override { return GetCasterGuid(); }
181 ObjectGuid GetOwnerGUID() const override { return GetCasterGuid(); }
182 ObjectGuid const& GetCasterGuid() const { return m_areaTriggerData->Caster; }
183 Unit* GetCaster() const;
184 Unit* GetTarget() const;
185
186 uint32 GetFaction() const override;
187
188 void SetShape(AreaTriggerShapeInfo const& shape);
189 float GetMaxSearchRadius() const;
190 void InitSplineOffsets(std::vector<Position> const& offsets, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
191 void InitSplines(std::vector<G3D::Vector3> const& splinePoints, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
192 bool HasSplines() const { return _spline != nullptr; }
193 ::Movement::Spline<float> const& GetSpline() const { return *_spline; }
194 uint32 GetElapsedTimeForMovement() const;
195
196 void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {}, Optional<bool> speedIsTimeInSeconds = {});
197 bool HasOrbit() const { return m_areaTriggerData->PathData.Is<UF::AreaTriggerOrbit>(); }
198 UF::AreaTriggerOrbit const& GetOrbit() const { return *m_areaTriggerData->PathData.Get<UF::AreaTriggerOrbit>(); }
199
200 void SetPathTarget(ObjectGuid pathTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::OrbitPathTarget), pathTarget); }
201
202 bool HasOverridePosition() const;
203
204 void UpdateShape();
205
206 void HandleUnitExit(Unit* unit);
207
209
210 protected:
211 void _UpdateDuration(int32 newDuration);
212
213 float GetProgress() const;
214
216 {
217 uint32 StartTimeOffset = 0;
219
220 using Points = std::array<DBCPosition2D, 2>;
221 std::variant<float, Points> Curve;
222 };
223
224 float GetScaleCurveProgress(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
225 float GetScaleCurveValueAtProgress(UF::ScaleCurve const& scaleCurve, float x) const;
226 float GetScaleCurveValue(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
227 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, float constantValue);
228 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation);
229 void ClearScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator);
230 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<ScaleCurveData> const& curve);
231
232 void UpdateTargetList();
233 void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D);
234 void SearchUnitInSphere(UF::AreaTriggerSphere const& sphere, std::vector<Unit*>& targetList);
235 void SearchUnitInBox(UF::AreaTriggerBox const& box, std::vector<Unit*>& targetList);
236 void SearchUnitInPolygon(UF::AreaTriggerPolygon const& polygon, std::vector<Unit*>& targetList);
237 void SearchUnitInCylinder(UF::AreaTriggerCylinder const& cylinder, std::vector<Unit*>& targetList);
238 void SearchUnitInDisk(UF::AreaTriggerDisk const& disk, std::vector<Unit*>& targetList);
239 void SearchUnitInBoundedPlane(UF::AreaTriggerBoundedPlane const& boundedPlane, std::vector<Unit*>& targetList);
240 void HandleUnitEnterExit(std::vector<Unit*> const& targetList, AreaTriggerExitReason exitMode = AreaTriggerExitReason::NotInside);
241 void HandleUnitEnter(Unit* unit);
242 void HandleUnitExitInternal(Unit* unit, AreaTriggerExitReason exitMode = AreaTriggerExitReason::NotInside);
243
244 void DoActions(Unit* unit);
245 void UndoActions(Unit* unit);
246
247 void UpdatePolygonVertices();
248 void UpdateOrbitPosition();
249 void UpdateSplinePosition(Movement::Spline<float>& spline);
250 void UpdateOverridePosition();
251
252 Position const* GetOrbitCenterPosition() const;
253 Position CalculateOrbitPosition() const;
254
255 void UpdateHasPlayersFlag();
256
257 void DebugVisualizePosition(); // Debug purpose only
258
260
262
264
270
271 std::vector<Position> _polygonVertices;
272 std::unique_ptr<::Movement::Spline<float>> _spline;
273
276
280
281 std::unique_ptr<AreaTriggerAI> _ai;
282};
283
284#endif
AreaTriggerFieldFlags
Definition AreaTrigger.h:43
AreaTriggerPathType
Definition AreaTrigger.h:61
AreaTriggerExitReason
Definition AreaTrigger.h:69
CurveInterpolationMode
Definition DBCEnums.h:921
AreaTriggerActionSetFlag
Definition DBCEnums.h:175
#define TC_GAME_API
Definition Define.h:129
uint8_t uint8
Definition Define.h:156
int32_t int32
Definition Define.h:150
uint32_t uint32
Definition Define.h:154
uint16 flags
#define DEFINE_ENUM_FLAG(enumType)
Definition EnumFlag.h:26
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition ObjectGuid.h:435
@ TYPEID_AREATRIGGER
Definition ObjectGuid.h:49
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition Optional.h:25
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
bool HasSplines() const
std::vector< Position > _polygonVertices
ObjectGuid::LowType _spawnId
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
int32 _duration
UF::AreaTriggerOrbit const & GetOrbit() const
EnumFlag< AreaTriggerFieldFlags > GetAreaTriggerFlags() const
AreaTriggerAI * AI()
ObjectGuid GetOwnerGUID() const override
void SetTimeToTargetPos(uint32 timeToTargetPos)
ObjectGuid const & GetCasterGuid() const
void RelocateStationaryPosition(Position const &pos)
bool _reachedDestination
int32 GetTotalDuration() const
Position _stationaryPosition
Position const & GetStationaryPosition() const override
std::unique_ptr< AreaTriggerAI > _ai
uint32 GetTimeToTargetPos() const
ObjectGuid _targetGuid
bool IsServerSide() const
uint32 GetSpellId() const
bool IsRemoved() const
void SetTimeToTarget(uint32 timeToTarget)
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
void SetAreaTriggerFlag(AreaTriggerFieldFlags flag)
uint32 GetTimeToTarget() const
int32 _lastSplineIndex
GuidUnorderedSet _insideUnits
uint32 GetTimeToTargetScale() const
bool IsStaticSpawn() const
AreaTriggerTemplate const * _areaTriggerTemplate
void SetTimeToTargetScale(uint32 timeToTargetScale)
void RemoveAreaTriggerFlag(AreaTriggerFieldFlags flag)
bool IsCustom() const
AuraEffect const * _aurEff
AuraEffect const * GetAuraEffect() const
ObjectGuid GetCreatorGUID() const override
void ReplaceAllAreaTriggerFlags(AreaTriggerFieldFlags flag)
void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale)
int32 GetDuration() const
bool HasOrbit() const
AreaTriggerCreateProperties const * GetCreateProperties() const
int32 _totalDuration
void Delay(int32 delaytime)
std::unique_ptr<::Movement::Spline< float > > _spline
void SetPathTarget(ObjectGuid pathTarget)
float _verticesUpdatePreviousOrientation
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
Definition BaseEntity.h:221
void SetUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
Definition BaseEntity.h:228
void RemoveUpdateFieldFlagValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type flag)
Definition BaseEntity.h:235
Definition Map.h:225
uint64 LowType
Definition ObjectGuid.h:321
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()
Definition Object.cpp:130
Definition Spell.h:277
Definition Unit.h:635
void AddToWorld() override
Definition Object.cpp:365
void RemoveFromWorld() override
Definition Object.cpp:371
virtual uint32 GetFaction() const =0
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const
Definition Object.h:605
virtual void Update(uint32 diff)
Definition Object.cpp:245
UpdateFieldFlag
Definition UpdateField.h:37
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
ValuesUpdateForPlayerWithMaskSender(AreaTrigger const *owner)
Definition AreaTrigger.h:91
UpdateField< ObjectGuid, 0, 20 > OrbitPathTarget
UpdateField< uint32, 0, 27 > Flags
UpdateField< uint32, 0, 12 > TimeToTargetPos
UpdateField< uint32, 0, 11 > TimeToTargetExtraScale
UpdateField< uint32, 0, 10 > TimeToTargetScale
UpdateField< uint32, 0, 9 > TimeToTarget