diff options
Diffstat (limited to 'src/game/DynamicObject.cpp')
-rw-r--r-- | src/game/DynamicObject.cpp | 24 |
1 files changed, 24 insertions, 0 deletions
diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index fcc3922a987..30147732b08 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -17,6 +17,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ + #include "Common.h" #include "UpdateMask.h" #include "Opcodes.h" @@ -26,13 +27,17 @@ #include "GridNotifiers.h" #include "CellImpl.h" #include "GridNotifiersImpl.h" + DynamicObject::DynamicObject() : WorldObject() { m_objectType |= TYPEMASK_DYNAMICOBJECT; m_objectTypeId = TYPEID_DYNAMICOBJECT; + m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION); + m_valuesCount = DYNAMICOBJECT_END; } + void DynamicObject::AddToWorld() { ///- Register the dynamicObject for guid lookup @@ -42,6 +47,7 @@ void DynamicObject::AddToWorld() WorldObject::AddToWorld(); } } + void DynamicObject::RemoveFromWorld() { ///- Remove the dynamicObject from the accessor @@ -63,6 +69,7 @@ void DynamicObject::RemoveFromWorld() ObjectAccessor::Instance().RemoveObject(this); } } + bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 effMask, const Position &pos, int32 duration, float radius, bool active) { SetMap(caster->GetMap()); @@ -72,7 +79,9 @@ bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 sLog.outError("DynamicObject (spell %u eff %u) not created. Suggested coordinates isn't valid (X: %f Y: %f)",spellId,effMask,GetPositionX(),GetPositionY()); return false; } + WorldObject::_Create(guidlow, HIGHGUID_DYNAMICOBJECT, caster->GetPhaseMask()); + SetEntry(spellId); SetFloatValue( OBJECT_FIELD_SCALE_X, 1 ); SetUInt64Value( DYNAMICOBJECT_CASTER, caster->GetGUID() ); @@ -83,19 +92,23 @@ bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, uint32 SetFloatValue( DYNAMICOBJECT_POS_Y, pos.m_positionY ); SetFloatValue( DYNAMICOBJECT_POS_Z, pos.m_positionZ ); SetUInt32Value( DYNAMICOBJECT_CASTTIME, getMSTime() ); // new 2.4.0 + m_aliveDuration = duration; m_radius = radius; m_effMask = effMask; m_spellId = spellId; m_updateTimer = 0; + m_isWorldObject = active; return true; } + Unit* DynamicObject::GetCaster() const { // can be not found in some cases return ObjectAccessor::GetUnit(*this, GetCasterGUID()); } + void DynamicObject::Update(uint32 p_time) { // caster can be not in world at time dynamic object update, but dynamic object not yet deleted in Unit destructor @@ -105,11 +118,14 @@ void DynamicObject::Update(uint32 p_time) Delete(); return; } + bool deleteThis = false; + if(m_aliveDuration > int32(p_time)) m_aliveDuration -= p_time; else deleteThis = true; + /* // have radius and work as persistent effect if(m_radius) @@ -119,14 +135,18 @@ void DynamicObject::Update(uint32 p_time) Cell cell(p); cell.data.Part.reserved = ALL_DISTRICT; cell.SetNoCreate(); + MaNGOS::DynamicObjectUpdater notifier(*this, caster); + TypeContainerVisitor<MaNGOS::DynamicObjectUpdater, WorldTypeMapContainer > world_object_notifier(notifier); TypeContainerVisitor<MaNGOS::DynamicObjectUpdater, GridTypeMapContainer > grid_object_notifier(notifier); + CellLock<GridReadGuard> cell_lock(cell, p); cell_lock->Visit(cell_lock, world_object_notifier, *GetMap(), *this, m_radius); cell_lock->Visit(cell_lock, grid_object_notifier, *GetMap(), *this, m_radius); } */ + if (m_effMask) { if (m_updateTimer < p_time) @@ -136,18 +156,21 @@ void DynamicObject::Update(uint32 p_time) m_updateTimer = 500; // is this official-like? } else m_updateTimer -= p_time; } + if (deleteThis) { caster->RemoveDynObjectWithGUID(GetGUID()); Delete(); } } + void DynamicObject::Delete() { SendObjectDeSpawnAnim(GetGUID()); RemoveFromWorld(); AddObjectToRemoveList(); } + void DynamicObject::Delay(int32 delaytime) { m_aliveDuration -= delaytime; @@ -155,6 +178,7 @@ void DynamicObject::Delay(int32 delaytime) if (*iunit) (*iunit)->DelayAura(m_spellId, GetCaster()->GetGUID(), delaytime); } + bool DynamicObject::isVisibleForInState(Player const* u, bool inVisibleList) const { return IsInWorld() && u->IsInWorld() |