TrinityCore
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
42class TC_GAME_API AreaTrigger final : public WorldObject, public GridObject<AreaTrigger>, public MapObject
43{
44 public:
47
48 protected:
49 void BuildValuesCreate(ByteBuffer* data, Player const* target) const override;
50 void BuildValuesUpdate(ByteBuffer* data, Player const* target) const override;
51 void ClearUpdateMask(bool remove) override;
52
53 public:
54 void BuildValuesUpdateForPlayerWithMask(UpdateData* data, UF::ObjectData::Mask const& requestedObjectMask,
55 UF::AreaTriggerData::Mask const& requestedAreaTriggerMask, Player const* target) const;
56
57 struct ValuesUpdateForPlayerWithMaskSender // sender compatible with MessageDistDeliverer
58 {
59 explicit ValuesUpdateForPlayerWithMaskSender(AreaTrigger const* owner) : Owner(owner) { }
60
64
65 void operator()(Player const* player) const;
66 };
67
68 void AddToWorld() override;
69 void RemoveFromWorld() override;
70
71 void AI_Initialize();
72 void AI_Destroy();
73
74 AreaTriggerAI* AI() { return _ai.get(); }
75
76 bool IsCustom() const { return _areaTriggerTemplate->Id.IsCustom; }
77 bool IsServerSide() const { return _areaTriggerTemplate->Flags.HasFlag(AreaTriggerFlag::IsServerSide); }
78 bool IsStaticSpawn() const { return _spawnId != 0; }
79
80 bool IsNeverVisibleFor(WorldObject const* seer, bool allowServersideObjects = false) const override;
81
82 float GetStationaryX() const override { return _stationaryPosition.GetPositionX(); }
83 float GetStationaryY() const override { return _stationaryPosition.GetPositionY(); }
84 float GetStationaryZ() const override { return _stationaryPosition.GetPositionZ(); }
85 float GetStationaryO() const override { return _stationaryPosition.GetOrientation(); }
86 void RelocateStationaryPosition(Position const& pos) { _stationaryPosition.Relocate(pos); }
87
88 private:
89 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);
90
91 public:
92 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);
93 static ObjectGuid CreateNewMovementForceId(Map* map, uint32 areaTriggerId);
94 bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate);
95
96 void Update(uint32 diff) override;
97 void Remove();
98 bool IsRemoved() const { return _isRemoved; }
99 uint32 GetSpellId() const { return m_areaTriggerData->SpellID; }
100 AuraEffect const* GetAuraEffect() const { return _aurEff; }
101 uint32 GetTimeSinceCreated() const { return _timeSinceCreated; }
102
103 void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::HeightIgnoresScale), heightIgnoresScale); }
104
105 void SetOverrideScaleCurve(float overrideScale);
106 void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
107 void ClearOverrideScaleCurve();
108
109 void SetExtraScaleCurve(float extraScale);
110 void SetExtraScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
111 void ClearExtraScaleCurve();
112
113 void SetOverrideMoveCurve(float x, float y, float z);
114 void SetOverrideMoveCurve(std::array<DBCPosition2D, 2> const& xCurvePoints, std::array<DBCPosition2D, 2> const& yCurvePoints, std::array<DBCPosition2D, 2> const& zCurvePoints,
115 Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
116 void ClearOverrideMoveCurve();
117
118 uint32 GetTimeToTarget() const { return m_areaTriggerData->TimeToTarget; }
119 void SetTimeToTarget(uint32 timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); }
120
121 uint32 GetTimeToTargetScale() const { return m_areaTriggerData->TimeToTargetScale; }
122 void SetTimeToTargetScale(uint32 timeToTargetScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), timeToTargetScale); }
123
124 uint32 GetTimeToTargetExtraScale() const { return m_areaTriggerData->TimeToTargetExtraScale; }
125 void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetExtraScale), timeToTargetExtraScale); }
126
127 uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; }
128 void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); }
129
130 int32 GetDuration() const { return _duration; }
131 int32 GetTotalDuration() const { return _totalDuration; }
132 void SetDuration(int32 newDuration);
133 void Delay(int32 delaytime) { SetDuration(GetDuration() - delaytime); }
134
135 GuidUnorderedSet const& GetInsideUnits() const { return _insideUnits; }
136
137 AreaTriggerCreateProperties const* GetCreateProperties() const { return _areaTriggerCreateProperties; }
138 AreaTriggerTemplate const* GetTemplate() const;
139 uint32 GetScriptId() const;
140
141 ObjectGuid GetCreatorGUID() const override { return GetCasterGuid(); }
142 ObjectGuid GetOwnerGUID() const override { return GetCasterGuid(); }
143 ObjectGuid const& GetCasterGuid() const { return m_areaTriggerData->Caster; }
144 Unit* GetCaster() const;
145 Unit* GetTarget() const;
146
147 uint32 GetFaction() const override;
148
149 AreaTriggerShapeInfo const& GetShape() const { return _shape; }
150 float GetMaxSearchRadius() const;
151 Position const& GetRollPitchYaw() const { return _rollPitchYaw; }
152 Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }
153 void InitSplineOffsets(std::vector<Position> const& offsets, uint32 timeToTarget);
154 void InitSplines(std::vector<G3D::Vector3> splinePoints, uint32 timeToTarget);
155 bool HasSplines() const;
156 ::Movement::Spline<int32> const& GetSpline() const { return *_spline; }
157 uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); }
158
159 void InitOrbit(AreaTriggerOrbitInfo const& orbit, uint32 timeToTarget);
160 bool HasOrbit() const;
161 Optional<AreaTriggerOrbitInfo> const& GetOrbit() const { return _orbitInfo; }
162
163 bool HasOverridePosition() const;
164
165 void UpdateShape();
166
168
169 protected:
170 void _UpdateDuration(int32 newDuration);
171
172 float CalcCurrentScale() const;
173
174 float GetProgress() const;
175
176 float GetScaleCurveProgress(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
177 float GetScaleCurveValueAtProgress(UF::ScaleCurve const& scaleCurve, float x) const;
178 float GetScaleCurveValue(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
179 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, float constantValue);
180 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation);
181 void ClearScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator);
182 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<AreaTriggerScaleCurveTemplate> const& curve);
183
184 void UpdateTargetList();
185 void SearchUnits(std::vector<Unit*>& targetList, float radius, bool check3D);
186 void SearchUnitInSphere(std::vector<Unit*>& targetList);
187 void SearchUnitInBox(std::vector<Unit*>& targetList);
188 void SearchUnitInPolygon(std::vector<Unit*>& targetList);
189 void SearchUnitInCylinder(std::vector<Unit*>& targetList);
190 void SearchUnitInDisk(std::vector<Unit*>& targetList);
191 void SearchUnitInBoundedPlane(std::vector<Unit*>& targetList);
192 bool CheckIsInPolygon2D(Position const* pos) const;
193 void HandleUnitEnterExit(std::vector<Unit*> const& targetList);
194
195 void DoActions(Unit* unit);
196 void UndoActions(Unit* unit);
197
198 void UpdatePolygonVertices();
199 void UpdateOrbitPosition(uint32 diff);
200 void UpdateSplinePosition(uint32 diff);
201 void UpdateOverridePosition();
202
203 Position const* GetOrbitCenterPosition() const;
204 Position CalculateOrbitPosition() const;
205
206 void DebugVisualizePosition(); // Debug purpose only
207
209
211
213
221
224 std::vector<Position> _polygonVertices;
225 std::unique_ptr<::Movement::Spline<int32>> _spline;
226
230
232
236
237 std::unique_ptr<AreaTriggerAI> _ai;
238};
239
240#endif
CurveInterpolationMode
Definition: DBCEnums.h:862
#define TC_GAME_API
Definition: Define.h:123
int32_t int32
Definition: Define.h:138
uint32_t uint32
Definition: Define.h:142
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition: ObjectGuid.h:396
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
float GetStationaryY() const override
Definition: AreaTrigger.h:83
GuidUnorderedSet const & GetInsideUnits() const
Definition: AreaTrigger.h:135
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
Definition: AreaTrigger.h:233
uint32 GetTimeToTargetExtraScale() const
Definition: AreaTrigger.h:124
bool _isRemoved
Definition: AreaTrigger.h:220
std::vector< Position > _polygonVertices
Definition: AreaTrigger.h:224
ObjectGuid::LowType _spawnId
Definition: AreaTrigger.h:208
int32 _duration
Definition: AreaTrigger.h:216
AreaTriggerAI * AI()
Definition: AreaTrigger.h:74
void SetHeightIgnoresScale(bool heightIgnoresScale)
Definition: AreaTrigger.h:103
Position _rollPitchYaw
Definition: AreaTrigger.h:222
ObjectGuid GetOwnerGUID() const override
Definition: AreaTrigger.h:142
uint32 GetTimeSinceCreated() const
Definition: AreaTrigger.h:101
void SetTimeToTargetPos(uint32 timeToTargetPos)
Definition: AreaTrigger.h:128
uint32 _timeSinceCreated
Definition: AreaTrigger.h:218
float GetStationaryZ() const override
Definition: AreaTrigger.h:84
float GetStationaryO() const override
Definition: AreaTrigger.h:85
AreaTriggerShapeInfo const & GetShape() const
Definition: AreaTrigger.h:149
ObjectGuid const & GetCasterGuid() const
Definition: AreaTrigger.h:143
void RelocateStationaryPosition(Position const &pos)
Definition: AreaTrigger.h:86
bool _reachedDestination
Definition: AreaTrigger.h:227
int32 GetTotalDuration() const
Definition: AreaTrigger.h:131
Position _stationaryPosition
Definition: AreaTrigger.h:214
UF::UpdateField< UF::AreaTriggerData, 0, TYPEID_AREATRIGGER > m_areaTriggerData
Definition: AreaTrigger.h:167
std::unique_ptr< AreaTriggerAI > _ai
Definition: AreaTrigger.h:237
uint32 _movementTime
Definition: AreaTrigger.h:229
uint32 GetTimeToTargetPos() const
Definition: AreaTrigger.h:127
ObjectGuid _targetGuid
Definition: AreaTrigger.h:210
bool IsServerSide() const
Definition: AreaTrigger.h:77
uint32 GetSpellId() const
Definition: AreaTrigger.h:99
bool IsRemoved() const
Definition: AreaTrigger.h:98
void SetTimeToTarget(uint32 timeToTarget)
Definition: AreaTrigger.h:119
uint32 GetTimeToTarget() const
Definition: AreaTrigger.h:118
int32 _lastSplineIndex
Definition: AreaTrigger.h:228
GuidUnorderedSet _insideUnits
Definition: AreaTrigger.h:235
uint32 GetTimeToTargetScale() const
Definition: AreaTrigger.h:121
bool IsStaticSpawn() const
Definition: AreaTrigger.h:78
Optional< AreaTriggerOrbitInfo > const & GetOrbit() const
Definition: AreaTrigger.h:161
std::unique_ptr<::Movement::Spline< int32 > > _spline
Definition: AreaTrigger.h:225
uint32 GetElapsedTimeForMovement() const
Definition: AreaTrigger.h:157
AreaTriggerTemplate const * _areaTriggerTemplate
Definition: AreaTrigger.h:234
void SetTimeToTargetScale(uint32 timeToTargetScale)
Definition: AreaTrigger.h:122
Position _targetRollPitchYaw
Definition: AreaTrigger.h:223
Optional< AreaTriggerOrbitInfo > _orbitInfo
Definition: AreaTrigger.h:231
bool IsCustom() const
Definition: AreaTrigger.h:76
AuraEffect const * _aurEff
Definition: AreaTrigger.h:212
AuraEffect const * GetAuraEffect() const
Definition: AreaTrigger.h:100
::Movement::Spline< int32 > const & GetSpline() const
Definition: AreaTrigger.h:156
ObjectGuid GetCreatorGUID() const override
Definition: AreaTrigger.h:141
Position const & GetTargetRollPitchYaw() const
Definition: AreaTrigger.h:152
Position const & GetRollPitchYaw() const
Definition: AreaTrigger.h:151
void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale)
Definition: AreaTrigger.h:125
int32 GetDuration() const
Definition: AreaTrigger.h:130
AreaTriggerCreateProperties const * GetCreateProperties() const
Definition: AreaTrigger.h:137
int32 _totalDuration
Definition: AreaTrigger.h:217
void Delay(int32 delaytime)
Definition: AreaTrigger.h:133
float _verticesUpdatePreviousOrientation
Definition: AreaTrigger.h:219
float GetStationaryX() const override
Definition: AreaTrigger.h:82
AreaTriggerShapeInfo _shape
Definition: AreaTrigger.h:215
Definition: Map.h:189
uint64 LowType
Definition: ObjectGuid.h:278
virtual void BuildValuesCreate(ByteBuffer *data, Player const *target) const =0
virtual void ClearUpdateMask(bool remove)
Definition: Object.cpp:790
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:287
virtual void BuildValuesUpdate(ByteBuffer *data, Player const *target) const =0
Definition: Spell.h:255
Definition: Unit.h:627
void AddToWorld() override
Definition: Object.cpp:1011
void RemoveFromWorld() override
Definition: Object.cpp:1017
virtual uint32 GetFaction() const =0
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const
Definition: Object.h:821
virtual void Update(uint32 diff)
Definition: Object.cpp:898
Definition: wmo.h:163
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Definition: Vignette.cpp:72
void Remove(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:100
ValuesUpdateForPlayerWithMaskSender(AreaTrigger const *owner)
Definition: AreaTrigger.h:59
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