Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
DynamicObject.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "CellImpl.h"
7#include "Common.h"
8#include "DatabaseEnv.h"
9#include "GridNotifiers.h"
10#include "GridNotifiersImpl.h"
11#include "ObjectAccessor.h"
12#include "Opcodes.h"
13#include "ScriptMgr.h"
14#include "UpdateMask.h"
15#include "World.h"
16
27
29{
30 // make sure all references were properly removed
31 ASSERT(!_aura);
34 delete _removedAura;
35}
36
38{
40 if (!IsInWorld())
41 {
42 sObjectAccessor->AddObject(this);
45 }
46}
47
49{
51 if (IsInWorld())
52 {
53 if (_isViewpoint)
55
56 if (_aura)
57 RemoveAura();
58
59 // dynobj could get removed in Aura::RemoveAura
60 if (!IsInWorld())
61 return;
62
65 sObjectAccessor->RemoveObject(this);
66 }
67}
68
69bool DynamicObject::CreateDynamicObject(uint32 guidlow, Unit* caster, SpellInfo const* spell, Position const& pos, float radius, DynamicObjectType type)
70{
71 SetMap(caster->GetMap());
72 Relocate(pos);
73 if (!IsPositionValid())
74 {
75 SF_LOG_ERROR("misc", "DynamicObject (spell %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)", spell->Id, GetPositionX(), GetPositionY());
76 return false;
77 }
78
80 SetEntry(spell->Id);
87
88 SetDuration(spell->GetDuration());
89
90 if (IsWorldObject())
91 setActive(true); //must before add to map to be put in world container
92
93 if (!GetMap()->AddToMap(this))
94 return false;
95
96 return true;
97}
98
100{
101 // caster has to be always available and in the same map
103 ASSERT(_caster->GetMap() == GetMap());
104
105 bool expired = false;
106
107 if (_aura)
108 {
109 if (!_aura->IsRemoved())
110 _aura->UpdateOwner(p_time, this);
111
112 // _aura may be set to null in Aura::UpdateOwner call
113 if (_aura && (_aura->IsRemoved() || _aura->IsExpired()))
114 expired = true;
115 }
116 else
117 {
118 if (GetDuration() > int32(p_time))
119 _duration -= p_time;
120 else
121 expired = true;
122 }
123
124 if (expired)
125 Remove();
126 else
127 sScriptMgr->OnDynamicObjectUpdate(this, p_time);
128}
129
131{
132 if (IsInWorld())
133 {
137 }
138}
139
141{
142 if (!_aura)
143 return _duration;
144 else
145 return _aura->GetDuration();
146}
147
149{
150 if (!_aura)
151 _duration = newDuration;
152 else
153 _aura->SetDuration(newDuration);
154}
155
157{
158 SetDuration(GetDuration() - delaytime);
159}
160
162{
163 ASSERT(!_aura && aura);
164 _aura = aura;
165}
166
168{
171 _aura = NULL;
172 if (!_removedAura->IsRemoved())
174}
175
177{
178 if (Player* caster = _caster->ToPlayer())
179 {
180 caster->SetViewpoint(this, true);
181 _isViewpoint = true;
182 }
183}
184
186{
187 if (Player* caster = _caster->ToPlayer())
188 {
189 caster->SetViewpoint(this, false);
190 _isViewpoint = false;
191 }
192}
193
195{
196 ASSERT(!_caster);
199 ASSERT(_caster->GetMap() == GetMap());
200 _caster->_RegisterDynObject(this);
201}
202
204{
206 _caster->_UnregisterDynObject(this);
207 _caster = NULL;
208}
std::int32_t int32
Definition Define.h:73
std::uint32_t uint32
Definition Define.h:77
DynamicObjectType
#define ASSERT
Definition Errors.h:29
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEID_DYNAMICOBJECT
Definition Object.h:57
@ TYPEMASK_DYNAMICOBJECT
Definition Object.h:43
#define sObjectAccessor
@ HIGHGUID_DYNAMICOBJECT
#define sScriptMgr
Definition ScriptMgr.h:764
uint32 getMSTime()
Definition Timer.h:12
@ AURA_REMOVE_BY_DEFAULT
Definition Unit.h:407
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:31
@ DYNAMICOBJECT_FIELD_RADIUS
@ DYNAMICOBJECT_FIELD_CASTER
@ DYNAMICOBJECT_FIELD_SPELL_ID
@ DYNAMICOBJECT_FIELD_TYPE_AND_VISUAL_ID
@ DYNAMICOBJECT_FIELD_CAST_TIME
@ DYNAMICOBJECT_END
bool CreateDynamicObject(uint32 guidlow, Unit *caster, SpellInfo const *spell, Position const &pos, float radius, DynamicObjectType type)
void SetAura(Aura *aura)
void SetCasterViewpoint()
void AddToWorld() OVERRIDE
DynamicObject(bool isWorldObject)
void SetDuration(int32 newDuration)
void RemoveCasterViewpoint()
uint64 GetCasterGUID() const
Aura * _removedAura
void Delay(int32 delaytime)
void Update(uint32 p_time) OVERRIDE
int32 GetDuration() const
void RemoveFromWorld() OVERRIDE
static Unit * GetUnit(WorldObject const &, uint64 guid)
uint16 m_objectType
Definition Object.h:242
uint64 GetGUID() const
Definition Object.h:119
bool IsInWorld() const
Definition Object.h:114
uint16 m_valuesCount
Definition Object.h:256
void SetFloatValue(uint16 index, float value)
Definition Object.cpp:1141
virtual void AddToWorld()
Definition Object.cpp:148
void SetEntry(uint32 entry)
Definition Object.h:126
virtual void SetObjectScale(float scale)
Definition Object.h:129
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:1038
uint16 m_updateFlag
Definition Object.h:245
TypeID m_objectTypeId
Definition Object.h:244
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:1079
uint32 SpellVisual[2]
Definition SpellInfo.h:219
uint32 Id
Definition SpellInfo.h:160
int32 GetDuration() const
Definition Unit.h:1367
void _Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
Definition Object.cpp:1581
uint32 GetPhaseMask() const
Definition Object.h:643
Map * GetMap() const
Definition Object.h:740
virtual void RemoveFromWorld()
Definition Object.cpp:1587
bool IsWorldObject() const
Definition Object.cpp:1531
void SendObjectDeSpawnAnim(uint64 guid)
Definition Object.cpp:2503
void setActive(bool isActiveObject)
Definition Object.cpp:1542
virtual void SetMap(Map *map)
Definition Object.cpp:2514
void AddObjectToRemoveList()
Definition Object.cpp:2550
WorldObject(bool isWorldObject)
Definition Object.cpp:1514
bool IsPositionValid() const
Definition Object.cpp:2049
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
void Relocate(float x, float y)
Definition Object.h:302