TrinityCore
Loading...
Searching...
No Matches
DynamicObject.cpp
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#include "DynamicObject.h"
19#include "Common.h"
20#include "GameTime.h"
21#include "Log.h"
22#include "Map.h"
23#include "ObjectAccessor.h"
24#include "Player.h"
25#include "SpellAuras.h"
26#include "SpellMgr.h"
27#include "ScriptMgr.h"
28#include "Transport.h"
29#include "Unit.h"
30#include "UpdateData.h"
31
32DynamicObject::DynamicObject(bool isWorldObject) : WorldObject(isWorldObject),
33 _aura(nullptr), _removedAura(nullptr), _caster(nullptr), _duration(0), _isViewpoint(false)
34{
37
39
41}
42
44{
45 // make sure all references were properly removed
46 ASSERT(!_aura);
49 delete _removedAura;
50}
51
62
64{
66 if (IsInWorld())
67 {
68 if (_isViewpoint)
70
71 if (_aura)
72 RemoveAura();
73
74 // dynobj could get removed in Aura::RemoveAura
75 if (!IsInWorld())
76 return;
77
81
82 }
83}
84
85bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type)
86{
87 SetMap(caster->GetMap());
88 Relocate(pos);
89 if (!IsPositionValid())
90 {
91 TC_LOG_ERROR("misc", "DynamicObject (spell {}) not created. Suggested coordinates isn't valid (X: {} Y: {})", spell->Id, GetPositionX(), GetPositionY());
92 return false;
93 }
94
95 WorldObject::_Create(ObjectGuid::Create<HighGuid::DynamicObject>(guidlow));
96 SetPhaseMask(caster->GetPhaseMask(), false);
97
98 SetEntry(spell->Id);
99 SetObjectScale(1.0f);
105
107 setActive(true); //must before add to map to be put in world container
108
109 Transport* transport = caster->GetTransport();
110 if (transport)
111 {
112 float x, y, z, o;
113 pos.GetPosition(x, y, z, o);
114 transport->CalculatePassengerOffset(x, y, z, &o);
116
117 // This object must be added to transport before adding to map for the client to properly display it
118 transport->AddPassenger(this);
119 }
120
121 if (!GetMap()->AddToMap(this))
122 {
123 // Returning false will cause the object to be deleted - remove from transport
124 if (transport)
125 transport->RemovePassenger(this);
126 return false;
127 }
128
129 return true;
130}
131
133{
134 // caster has to be always available and in the same map
136 ASSERT(_caster->GetMap() == GetMap());
137
138 bool expired = false;
139
140 if (_aura)
141 {
142 if (!_aura->IsRemoved())
143 _aura->UpdateOwner(p_time, this);
144
145 // _aura may be set to null in Aura::UpdateOwner call
146 if (_aura && (_aura->IsRemoved() || _aura->IsExpired()))
147 expired = true;
148 }
149 else
150 {
151 if (GetDuration() > int32(p_time))
152 _duration -= p_time;
153 else
154 expired = true;
155 }
156
157 if (expired)
158 Remove();
159 else
160 sScriptMgr->OnDynamicObjectUpdate(this, p_time);
161}
162
164{
165 if (IsInWorld())
166 {
170 }
171}
172
174{
175 if (!_aura)
176 return _duration;
177 else
178 return _aura->GetDuration();
179}
180
182{
183 if (!_aura)
184 _duration = newDuration;
185 else
186 _aura->SetDuration(newDuration);
187}
188
190{
191 SetDuration(GetDuration() - delaytime);
192}
193
195{
196 ASSERT(!_aura && aura);
197 _aura = aura;
198}
199
208
210{
211 if (Player* caster = _caster->ToPlayer())
212 {
213 caster->SetViewpoint(this, true);
214 _isViewpoint = true;
215 }
216}
217
219{
220 if (Player* caster = _caster->ToPlayer())
221 {
222 caster->SetViewpoint(this, false);
223 _isViewpoint = false;
224 }
225}
226
228{
230 return _caster->GetFaction();
231}
232
241
243{
246 _caster = nullptr;
247}
248
250{
251 return sSpellMgr->GetSpellInfo(GetSpellId());
252}
int32_t int32
Definition Define.h:129
uint32_t uint32
Definition Define.h:133
DynamicObjectType
#define ASSERT
Definition Errors.h:68
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
@ TYPEID_DYNAMICOBJECT
Definition ObjectGuid.h:41
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:55
#define sScriptMgr
Definition ScriptMgr.h:1168
@ AURA_REMOVE_BY_DEFAULT
#define sSpellMgr
Definition SpellMgr.h:738
@ UPDATEFLAG_POSITION
Definition UpdateData.h:49
@ UPDATEFLAG_LOWGUID
Definition UpdateData.h:45
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:47
@ DYNAMICOBJECT_RADIUS
@ DYNAMICOBJECT_CASTTIME
@ DYNAMICOBJECT_CASTER
@ DYNAMICOBJECT_SPELLID
@ DYNAMICOBJECT_BYTES
@ DYNAMICOBJECT_END
bool IsRemoved() const
Definition SpellAuras.h:184
int32 GetDuration() const
Definition SpellAuras.h:148
void UpdateOwner(uint32 diff, WorldObject *owner)
void SetDuration(int32 duration, bool withMods=false)
bool IsExpired() const
Definition SpellAuras.h:152
void _Remove(AuraRemoveMode removeMode)
void SetAura(Aura *aura)
void SetCasterViewpoint()
void Update(uint32 p_time) override
void AddToWorld() override
DynamicObject(bool isWorldObject)
SpellInfo const * GetSpellInfo() const
void SetDuration(int32 newDuration)
void RemoveCasterViewpoint()
uint32 GetSpellId() const
bool CreateDynamicObject(ObjectGuid::LowType guidlow, Unit *caster, SpellInfo const *spell, Position const &pos, float radius, DynamicObjectType type)
ObjectGuid GetCasterGUID() const
uint32 GetFaction() const override
Aura * _removedAura
void Delay(int32 delaytime)
int32 GetDuration() const
void RemoveFromWorld() override
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:489
uint32 LowType
Definition ObjectGuid.h:142
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:668
uint16 m_objectType
Definition Object.h:232
bool IsInWorld() const
Definition Object.h:73
uint16 m_valuesCount
Definition Object.h:246
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:699
void _Create(ObjectGuid const &guid)
Definition Object.cpp:109
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:655
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
void SetEntry(uint32 entry)
Definition Object.h:82
virtual void SetObjectScale(float scale)
Definition Object.h:85
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:585
uint16 m_updateFlag
Definition Object.h:235
ObjectGuid GetGUID() const
Definition Object.h:79
TypeID m_objectTypeId
Definition Object.h:234
static Player * ToPlayer(Object *o)
Definition Object.h:180
uint32 Id
Definition SpellInfo.h:289
void CalculatePassengerOffset(float &x, float &y, float &z, float *o=nullptr) const override
This method transforms supplied global coordinates into local offsets.
Definition Transport.h:77
void RemovePassenger(WorldObject *passenger)
void AddPassenger(WorldObject *passenger)
bool Remove(KEY_TYPE const &handle)
bool Insert(KEY_TYPE const &handle, SPECIFIC_TYPE *obj)
Definition Unit.h:769
void _UnregisterDynObject(DynamicObject *dynObj)
Definition Unit.cpp:5033
void _RegisterDynObject(DynamicObject *dynObj)
Definition Unit.cpp:5028
uint32 GetFaction() const override
Definition Unit.h:973
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:3417
uint32 GetPhaseMask() const
Definition Object.h:368
Map * GetMap() const
Definition Object.h:449
void AddToWorld() override
Definition Object.cpp:1060
void RemoveFromWorld() override
Definition Object.cpp:1066
void setActive(bool isActiveObject)
Definition Object.cpp:991
virtual void SetMap(Map *map)
Definition Object.cpp:1808
void AddObjectToRemoveList()
Definition Object.cpp:1838
Transport * GetTransport() const
Definition Object.h:564
bool IsStoredInWorldObjectGridContainer() const
Definition Object.cpp:980
void SendObjectDeSpawnAnim(ObjectGuid guid)
Definition Object.cpp:1801
MovementInfo m_movementInfo
Definition Object.h:575
uint32 GetGameTimeMS()
Definition GameTime.cpp:47
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
struct MovementInfo::TransportInfo transport
bool IsPositionValid() const
Definition Position.cpp:44
float GetPositionX() const
Definition Position.h:79
void GetPosition(float &x, float &y) const
Definition Position.h:84
float GetPositionY() const
Definition Position.h:80
void Relocate(float x, float y)
Definition Position.h:66