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, UF::UpdateFieldFlag flags, Player const* target) const override;
50 void BuildValuesUpdate(ByteBuffer* data, UF::UpdateFieldFlag flags, 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 bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const { return _areaTriggerTemplate->ActionSetFlags.HasFlag(flag); }
80
81 bool IsNeverVisibleFor(WorldObject const* seer, bool allowServersideObjects = false) const override;
82
83 Position const& GetStationaryPosition() const override { return _stationaryPosition; }
84 void RelocateStationaryPosition(Position const& pos) { _stationaryPosition.Relocate(pos); }
85 void PlaySpellVisual(uint32 spellVisualId) const;
86
87 private:
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);
89
90 public:
91 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);
92 static ObjectGuid CreateNewMovementForceId(Map* map, uint32 areaTriggerId);
93 bool LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap, bool allowDuplicate);
94
95 void Update(uint32 diff) override;
96 void Remove();
97 bool IsRemoved() const { return _isRemoved; }
98 uint32 GetSpellId() const { return m_areaTriggerData->SpellID; }
99 AuraEffect const* GetAuraEffect() const { return _aurEff; }
100 uint32 GetTimeSinceCreated() const { return _timeSinceCreated; }
101
102 void SetHeightIgnoresScale(bool heightIgnoresScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::HeightIgnoresScale), heightIgnoresScale); }
103
104 void SetOverrideScaleCurve(float overrideScale);
105 void SetOverrideScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
106 void ClearOverrideScaleCurve();
107
108 void SetExtraScaleCurve(float extraScale);
109 void SetExtraScaleCurve(std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
110 void ClearExtraScaleCurve();
111
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,
114 Optional<uint32> startTimeOffset = {}, CurveInterpolationMode interpolation = CurveInterpolationMode::Linear);
115 void ClearOverrideMoveCurve();
116
117 uint32 GetTimeToTarget() const { return m_areaTriggerData->TimeToTarget; }
118 void SetTimeToTarget(uint32 timeToTarget) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTarget), timeToTarget); }
119
120 uint32 GetTimeToTargetScale() const { return m_areaTriggerData->TimeToTargetScale; }
121 void SetTimeToTargetScale(uint32 timeToTargetScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetScale), timeToTargetScale); }
122
123 uint32 GetTimeToTargetExtraScale() const { return m_areaTriggerData->TimeToTargetExtraScale; }
124 void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetExtraScale), timeToTargetExtraScale); }
125
126 uint32 GetTimeToTargetPos() const { return m_areaTriggerData->TimeToTargetPos; }
127 void SetTimeToTargetPos(uint32 timeToTargetPos) { SetUpdateFieldValue(m_values.ModifyValue(&AreaTrigger::m_areaTriggerData).ModifyValue(&UF::AreaTriggerData::TimeToTargetPos), timeToTargetPos); }
128
129 void SetSpellVisual(SpellCastVisual const& visual);
130
131 int32 GetDuration() const { return _duration; }
132 int32 GetTotalDuration() const { return _totalDuration; }
133 void SetDuration(int32 newDuration);
134 void Delay(int32 delaytime) { SetDuration(GetDuration() - delaytime); }
135
136 GuidUnorderedSet const& GetInsideUnits() const { return _insideUnits; }
137
138 AreaTriggerCreateProperties const* GetCreateProperties() const { return _areaTriggerCreateProperties; }
139 AreaTriggerTemplate const* GetTemplate() const { return _areaTriggerTemplate; }
140 uint32 GetScriptId() const;
141
142 ObjectGuid GetCreatorGUID() const override { return GetCasterGuid(); }
143 ObjectGuid GetOwnerGUID() const override { return GetCasterGuid(); }
144 ObjectGuid const& GetCasterGuid() const { return m_areaTriggerData->Caster; }
145 Unit* GetCaster() const;
146 Unit* GetTarget() const;
147
148 uint32 GetFaction() const override;
149
150 AreaTriggerShapeInfo const& GetShape() const { return _shape; }
151 float GetMaxSearchRadius() const;
152 Position const& GetRollPitchYaw() const { return _rollPitchYaw; }
153 Position const& GetTargetRollPitchYaw() const { return _targetRollPitchYaw; }
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); }
157 ::Movement::Spline<float> const& GetSpline() const { return *std::get<std::unique_ptr<::Movement::Spline<float>>>(_movement); }
158 uint32 GetElapsedTimeForMovement() const { return GetTimeSinceCreated(); }
159
160 void InitOrbit(AreaTriggerOrbitInfo const& orbit, Optional<float> overrideSpeed = {});
161 bool HasOrbit() const { return std::holds_alternative<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); }
162 AreaTriggerOrbitInfo const& GetOrbit() const { return *std::get<std::unique_ptr<AreaTriggerOrbitInfo>>(_movement); }
163
164 bool HasOverridePosition() const;
165
166 void UpdateShape();
167
169
170 protected:
171 void _UpdateDuration(int32 newDuration);
172
173 float CalcCurrentScale() const;
174
175 float GetProgress() const;
176
177 float GetScaleCurveProgress(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
178 float GetScaleCurveValueAtProgress(UF::ScaleCurve const& scaleCurve, float x) const;
179 float GetScaleCurveValue(UF::ScaleCurve const& scaleCurve, uint32 timeTo) const;
180 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, float constantValue);
181 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, std::array<DBCPosition2D, 2> const& points, Optional<uint32> startTimeOffset, CurveInterpolationMode interpolation);
182 void ClearScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator);
183 void SetScaleCurve(UF::MutableFieldReference<UF::ScaleCurve, false> scaleCurveMutator, Optional<AreaTriggerScaleCurveTemplate> const& curve);
184
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);
194
195 void DoActions(Unit* unit);
196 void UndoActions(Unit* unit);
197
198 void UpdatePolygonVertices();
199 void UpdateOrbitPosition(AreaTriggerOrbitInfo& orbit, uint32 diff);
200 void UpdateSplinePosition(Movement::Spline<float>& spline, 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::variant<std::monostate, std::unique_ptr<::Movement::Spline<float>>, std::unique_ptr<AreaTriggerOrbitInfo>> _movement;
226
230
234
235 std::unique_ptr<AreaTriggerAI> _ai;
236};
237
238#endif
CurveInterpolationMode
Definition: DBCEnums.h:914
AreaTriggerActionSetFlag
Definition: DBCEnums.h:181
#define TC_GAME_API
Definition: Define.h:129
int32_t int32
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:148
uint16 flags
Definition: DisableMgr.cpp:49
std::unordered_set< ObjectGuid > GuidUnorderedSet
Definition: ObjectGuid.h:395
@ TYPEID_AREATRIGGER
Definition: ObjectGuid.h:48
std::optional< T > Optional
Optional helper class to wrap optional values within.
Definition: Optional.h:25
AreaTriggerTemplate const * GetTemplate() const
Definition: AreaTrigger.h:139
::Movement::Spline< float > const & GetSpline() const
Definition: AreaTrigger.h:157
GuidUnorderedSet const & GetInsideUnits() const
Definition: AreaTrigger.h:136
AreaTriggerCreateProperties const * _areaTriggerCreateProperties
Definition: AreaTrigger.h:231
uint32 GetTimeToTargetExtraScale() const
Definition: AreaTrigger.h:123
bool HasSplines() const
Definition: AreaTrigger.h:156
bool _isRemoved
Definition: AreaTrigger.h:220
std::vector< Position > _polygonVertices
Definition: AreaTrigger.h:224
ObjectGuid::LowType _spawnId
Definition: AreaTrigger.h:208
bool HasActionSetFlag(AreaTriggerActionSetFlag flag) const
Definition: AreaTrigger.h:79
AreaTriggerOrbitInfo const & GetOrbit() const
Definition: AreaTrigger.h:162
int32 _duration
Definition: AreaTrigger.h:216
AreaTriggerAI * AI()
Definition: AreaTrigger.h:74
void SetHeightIgnoresScale(bool heightIgnoresScale)
Definition: AreaTrigger.h:102
Position _rollPitchYaw
Definition: AreaTrigger.h:222
ObjectGuid GetOwnerGUID() const override
Definition: AreaTrigger.h:143
uint32 GetTimeSinceCreated() const
Definition: AreaTrigger.h:100
void SetTimeToTargetPos(uint32 timeToTargetPos)
Definition: AreaTrigger.h:127
uint32 _timeSinceCreated
Definition: AreaTrigger.h:218
AreaTriggerShapeInfo const & GetShape() const
Definition: AreaTrigger.h:150
ObjectGuid const & GetCasterGuid() const
Definition: AreaTrigger.h:144
void RelocateStationaryPosition(Position const &pos)
Definition: AreaTrigger.h:84
bool _reachedDestination
Definition: AreaTrigger.h:227
int32 GetTotalDuration() const
Definition: AreaTrigger.h:132
Position _stationaryPosition
Definition: AreaTrigger.h:214
Position const & GetStationaryPosition() const override
Definition: AreaTrigger.h:83
std::unique_ptr< AreaTriggerAI > _ai
Definition: AreaTrigger.h:235
uint32 _movementTime
Definition: AreaTrigger.h:229
uint32 GetTimeToTargetPos() const
Definition: AreaTrigger.h:126
ObjectGuid _targetGuid
Definition: AreaTrigger.h:210
bool IsServerSide() const
Definition: AreaTrigger.h:77
uint32 GetSpellId() const
Definition: AreaTrigger.h:98
bool IsRemoved() const
Definition: AreaTrigger.h:97
void SetTimeToTarget(uint32 timeToTarget)
Definition: AreaTrigger.h:118
UF::UpdateField< UF::AreaTriggerData, int32(WowCS::EntityFragment::CGObject), TYPEID_AREATRIGGER > m_areaTriggerData
Definition: AreaTrigger.h:168
uint32 GetTimeToTarget() const
Definition: AreaTrigger.h:117
int32 _lastSplineIndex
Definition: AreaTrigger.h:228
GuidUnorderedSet _insideUnits
Definition: AreaTrigger.h:233
uint32 GetTimeToTargetScale() const
Definition: AreaTrigger.h:120
bool IsStaticSpawn() const
Definition: AreaTrigger.h:78
std::variant< std::monostate, std::unique_ptr<::Movement::Spline< float > >, std::unique_ptr< AreaTriggerOrbitInfo > > _movement
Definition: AreaTrigger.h:225
uint32 GetElapsedTimeForMovement() const
Definition: AreaTrigger.h:158
AreaTriggerTemplate const * _areaTriggerTemplate
Definition: AreaTrigger.h:232
void SetTimeToTargetScale(uint32 timeToTargetScale)
Definition: AreaTrigger.h:121
Position _targetRollPitchYaw
Definition: AreaTrigger.h:223
bool IsCustom() const
Definition: AreaTrigger.h:76
AuraEffect const * _aurEff
Definition: AreaTrigger.h:212
AuraEffect const * GetAuraEffect() const
Definition: AreaTrigger.h:99
ObjectGuid GetCreatorGUID() const override
Definition: AreaTrigger.h:142
Position const & GetTargetRollPitchYaw() const
Definition: AreaTrigger.h:153
Position const & GetRollPitchYaw() const
Definition: AreaTrigger.h:152
void SetTimeToTargetExtraScale(uint32 timeToTargetExtraScale)
Definition: AreaTrigger.h:124
int32 GetDuration() const
Definition: AreaTrigger.h:131
bool HasOrbit() const
Definition: AreaTrigger.h:161
AreaTriggerCreateProperties const * GetCreateProperties() const
Definition: AreaTrigger.h:138
int32 _totalDuration
Definition: AreaTrigger.h:217
void Delay(int32 delaytime)
Definition: AreaTrigger.h:134
float _verticesUpdatePreviousOrientation
Definition: AreaTrigger.h:219
AreaTriggerShapeInfo _shape
Definition: AreaTrigger.h:215
Definition: Map.h:223
uint64 LowType
Definition: ObjectGuid.h:281
virtual void BuildValuesCreate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
virtual void ClearUpdateMask(bool remove)
Definition: Object.cpp:850
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:326
virtual void BuildValuesUpdate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const =0
Definition: Spell.h:262
Definition: Unit.h:632
void AddToWorld() override
Definition: Object.cpp:1072
void RemoveFromWorld() override
Definition: Object.cpp:1078
virtual uint32 GetFaction() const =0
virtual bool IsNeverVisibleFor(WorldObject const *seer, bool allowServersideObjects=false) const
Definition: Object.h:969
virtual void Update(uint32 diff)
Definition: Object.cpp:952
Definition: wmo.h:168
UpdateFieldFlag
Definition: UpdateField.h:34
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Definition: Vignette.cpp:81
void Remove(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:113
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