aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xsrc/server/game/Entities/DynamicObject/DynamicObject.cpp88
-rwxr-xr-xsrc/server/game/Entities/DynamicObject/DynamicObject.h33
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp15
3 files changed, 71 insertions, 65 deletions
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
index 3fa901a237a..70e92bd06d7 100755
--- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp
@@ -27,7 +27,8 @@
#include "GridNotifiersImpl.h"
#include "ScriptMgr.h"
-DynamicObject::DynamicObject() : WorldObject()
+DynamicObject::DynamicObject() : WorldObject(),
+ _aura(NULL), _caster(NULL), _duration(0), _isViewpoint(false)
{
m_objectType |= TYPEMASK_DYNAMICOBJECT;
m_objectTypeId = TYPEID_DYNAMICOBJECT;
@@ -35,19 +36,14 @@ DynamicObject::DynamicObject() : WorldObject()
m_updateFlag = (UPDATEFLAG_HIGHGUID | UPDATEFLAG_HAS_POSITION | UPDATEFLAG_POSITION);
m_valuesCount = DYNAMICOBJECT_END;
-
- m_aura = NULL;
- m_duration = 0;
- m_caster = NULL;
- m_isViewpoint = false;
}
DynamicObject::~DynamicObject()
{
// make sure all references were properly removed
- ASSERT(!m_aura);
- ASSERT(!m_caster);
- ASSERT(!m_isViewpoint);
+ ASSERT(!_aura);
+ ASSERT(!_caster);
+ ASSERT(!_isViewpoint);
}
void DynamicObject::AddToWorld()
@@ -66,10 +62,10 @@ void DynamicObject::RemoveFromWorld()
///- Remove the dynamicObject from the accessor and from all lists of objects in world
if (IsInWorld())
{
- if (m_isViewpoint)
+ if (_isViewpoint)
RemoveCasterViewpoint();
- if (m_aura)
+ if (_aura)
RemoveAura();
// dynobj could get removed in Aura::RemoveAura
@@ -82,7 +78,7 @@ void DynamicObject::RemoveFromWorld()
}
}
-bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, const Position &pos, float radius, bool active)
+bool DynamicObject::Create(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type)
{
SetMap(caster->GetMap());
Relocate(pos);
@@ -103,7 +99,7 @@ bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, const P
// If any other value is used, the client will _always_ use the radius provided in DYNAMICOBJECT_RADIUS, but
// precompensation is necessary (eg radius *= 2) for many spells. Anyway, blizz sends 0x0001 for all the spells
// I saw sniffed...
- SetUInt32Value(DYNAMICOBJECT_BYTES, 0x00000001);
+ SetByteValue(DYNAMICOBJECT_BYTES, 0, type);
SetUInt32Value(DYNAMICOBJECT_SPELLID, spellId);
SetFloatValue(DYNAMICOBJECT_RADIUS, radius);
SetUInt32Value(DYNAMICOBJECT_CASTTIME, getMSTime());
@@ -115,24 +111,24 @@ bool DynamicObject::Create(uint32 guidlow, Unit *caster, uint32 spellId, const P
void DynamicObject::Update(uint32 p_time)
{
// caster has to be always avalible and in the same map
- ASSERT(m_caster);
- ASSERT(m_caster->GetMap() == GetMap());
+ ASSERT(_caster);
+ ASSERT(_caster->GetMap() == GetMap());
bool expired = false;
- if (m_aura)
+ if (_aura)
{
- if (!m_aura->IsRemoved())
- m_aura->UpdateOwner(p_time, this);
+ if (!_aura->IsRemoved())
+ _aura->UpdateOwner(p_time, this);
// m_aura may be set to null in Aura::UpdateOwner call
- if (m_aura && (m_aura->IsRemoved() || m_aura->IsExpired()))
+ if (_aura && (_aura->IsRemoved() || _aura->IsExpired()))
expired = true;
}
else
{
if (GetDuration() > int32(p_time))
- m_duration -= p_time;
+ _duration -= p_time;
else
expired = true;
}
@@ -155,18 +151,18 @@ void DynamicObject::Remove()
int32 DynamicObject::GetDuration() const
{
- if (!m_aura)
- return m_duration;
+ if (!_aura)
+ return _duration;
else
- return m_aura->GetDuration();
+ return _aura->GetDuration();
}
void DynamicObject::SetDuration(int32 newDuration)
{
- if (!m_aura)
- m_duration = newDuration;
+ if (!_aura)
+ _duration = newDuration;
else
- m_aura->SetDuration(newDuration);
+ _aura->SetDuration(newDuration);
}
void DynamicObject::Delay(int32 delaytime)
@@ -174,51 +170,51 @@ void DynamicObject::Delay(int32 delaytime)
SetDuration(GetDuration() - delaytime);
}
-void DynamicObject::SetAura(Aura * aura)
+void DynamicObject::SetAura(Aura* aura)
{
- ASSERT (!m_aura && aura);
- m_aura = aura;
+ ASSERT(!_aura && aura);
+ _aura = aura;
}
void DynamicObject::RemoveAura()
{
- ASSERT (m_aura);
- if (!m_aura->IsRemoved())
- m_aura->_Remove(AURA_REMOVE_BY_DEFAULT);
- delete m_aura;
- m_aura = NULL;
+ ASSERT(_aura);
+ if (!_aura->IsRemoved())
+ _aura->_Remove(AURA_REMOVE_BY_DEFAULT);
+ delete _aura;
+ _aura = NULL;
}
void DynamicObject::SetCasterViewpoint()
{
- if (Player * caster = m_caster->ToPlayer())
+ if (Player* caster = _caster->ToPlayer())
{
caster->SetViewpoint(this, true);
- m_isViewpoint = true;
+ _isViewpoint = true;
}
}
void DynamicObject::RemoveCasterViewpoint()
{
- if (Player * caster = m_caster->ToPlayer())
+ if (Player * caster = _caster->ToPlayer())
{
caster->SetViewpoint(this, false);
- m_isViewpoint = false;
+ _isViewpoint = false;
}
}
void DynamicObject::BindToCaster()
{
- ASSERT(!m_caster);
- m_caster = ObjectAccessor::GetUnit(*this, GetCasterGUID());
- ASSERT(m_caster);
- ASSERT(m_caster->GetMap() == GetMap());
- m_caster->_RegisterDynObject(this);
+ ASSERT(!_caster);
+ _caster = ObjectAccessor::GetUnit(*this, GetCasterGUID());
+ ASSERT(_caster);
+ ASSERT(_caster->GetMap() == GetMap());
+ _caster->_RegisterDynObject(this);
}
void DynamicObject::UnbindFromCaster()
{
- ASSERT(m_caster);
- m_caster->_UnregisterDynObject(this);
- m_caster = NULL;
+ ASSERT(_caster);
+ _caster->_UnregisterDynObject(this);
+ _caster = NULL;
}
diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.h b/src/server/game/Entities/DynamicObject/DynamicObject.h
index 7d42c1e4212..77479234ce3 100755
--- a/src/server/game/Entities/DynamicObject/DynamicObject.h
+++ b/src/server/game/Entities/DynamicObject/DynamicObject.h
@@ -25,42 +25,49 @@ class Unit;
class Aura;
struct SpellEntry;
+enum DynamicObjectType
+{
+ DYNAMIC_OBJECT_PORTAL = 0x0, // unused
+ DYNAMIC_OBJECT_AREA_SPELL = 0x1,
+ DYNAMIC_OBJECT_FARSIGHT_FOCUS = 0x2,
+};
+
class DynamicObject : public WorldObject, public GridObject<DynamicObject>
{
public:
- explicit DynamicObject();
+ DynamicObject();
~DynamicObject();
void AddToWorld();
void RemoveFromWorld();
- bool Create(uint32 guidlow, Unit *caster, uint32 spellId, const Position &pos, float radius, bool active);
+ bool Create(uint32 guidlow, Unit* caster, uint32 spellId, Position const& pos, float radius, bool active, DynamicObjectType type);
void Update(uint32 p_time);
void Remove();
void SetDuration(int32 newDuration);
int32 GetDuration() const;
void Delay(int32 delaytime);
- void SetAura(Aura * aura);
+ void SetAura(Aura* aura);
void RemoveAura();
void SetCasterViewpoint();
void RemoveCasterViewpoint();
- Unit * GetCaster() const { return m_caster; }
+ Unit* GetCaster() const { return _caster; }
void BindToCaster();
void UnbindFromCaster();
uint32 GetSpellId() const { return GetUInt32Value(DYNAMICOBJECT_SPELLID); }
uint64 GetCasterGUID() const { return GetUInt64Value(DYNAMICOBJECT_CASTER); }
float GetRadius() const { return GetFloatValue(DYNAMICOBJECT_RADIUS); }
- void Say(int32 textId, uint32 language, uint64 TargetGuid) { MonsterSay(textId,language,TargetGuid); }
- void Yell(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYell(textId,language,TargetGuid); }
- void TextEmote(int32 textId, uint64 TargetGuid) { MonsterTextEmote(textId,TargetGuid); }
- void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId,receiver); }
- void YellToZone(int32 textId, uint32 language, uint64 TargetGuid) { MonsterYellToZone(textId,language,TargetGuid); }
+ void Say(int32 textId, uint32 language, uint64 targetGuid) { MonsterSay(textId, language, targetGuid); }
+ void Yell(int32 textId, uint32 language, uint64 targetGuid) { MonsterYell(textId, language, targetGuid); }
+ void TextEmote(int32 textId, uint64 targetGuid) { MonsterTextEmote(textId, targetGuid); }
+ void Whisper(int32 textId,uint64 receiver) { MonsterWhisper(textId, receiver); }
+ void YellToZone(int32 textId, uint32 language, uint64 targetGuid) { MonsterYellToZone(textId, language, targetGuid); }
protected:
- int32 m_duration; // for non-aura dynobjects
- Aura * m_aura;
- Unit * m_caster;
- bool m_isViewpoint;
+ Aura* _aura;
+ Unit* _caster;
+ int32 _duration; // for non-aura dynobjects
+ bool _isViewpoint;
};
#endif
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 507f974e2c8..a5fac405021 100755
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2541,15 +2541,16 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
// Caster not in world, might be spell triggered from aura removal
if (!caster->IsInWorld())
return;
- DynamicObject* dynObj = new DynamicObject;
- if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, m_targets.m_dstPos, radius, false))
+ DynamicObject* dynObj = new DynamicObject();
+ if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), caster, m_spellInfo->Id, m_targets.m_dstPos, radius, false, DYNAMIC_OBJECT_AREA_SPELL))
{
delete dynObj;
return;
}
+
dynObj->GetMap()->Add(dynObj);
- if (Aura * aura = Aura::TryCreate(m_spellInfo, dynObj, caster, &m_spellValue->EffectBasePoints[0]))
+ if (Aura* aura = Aura::TryCreate(m_spellInfo, dynObj, caster, &m_spellValue->EffectBasePoints[0]))
{
m_spellAura = aura;
m_spellAura->_RegisterForTargets();
@@ -2557,6 +2558,7 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex)
else
return;
}
+
ASSERT(m_spellAura->GetDynobjOwner());
m_spellAura->_ApplyEffectForTargets(effIndex);
}
@@ -3382,14 +3384,15 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex)
// Caster not in world, might be spell triggered from aura removal
if (!m_caster->IsInWorld())
return;
- DynamicObject* dynObj = new DynamicObject;
- if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, m_targets.m_dstPos, radius, true))
+
+ DynamicObject* dynObj = new DynamicObject();
+ if (!dynObj->Create(sObjectMgr->GenerateLowGuid(HIGHGUID_DYNAMICOBJECT), m_caster, m_spellInfo->Id, m_targets.m_dstPos, radius, true, DYNAMIC_OBJECT_FARSIGHT_FOCUS))
{
delete dynObj;
return;
}
+
dynObj->SetDuration(duration);
- dynObj->SetUInt32Value(DYNAMICOBJECT_BYTES, 0x80000002);
dynObj->setActive(true); //must before add to map to be put in world container
dynObj->GetMap()->Add(dynObj); //grid will also be loaded