Core/DynamicObjects: Change the way how dynamic objects are bound to their owners, fixes some crashes in Aura::GetOwner.
This commit is contained in:
@@ -4468,24 +4468,40 @@ int32 Unit::GetMaxNegativeAuraModifierByAffectMask(AuraType auratype, SpellEntry
|
||||
return modifier;
|
||||
}
|
||||
|
||||
void Unit::AddDynObject(DynamicObject* dynObj)
|
||||
void Unit::_RegisterDynObject(DynamicObject* dynObj)
|
||||
{
|
||||
m_dynObjGUIDs.push_back(dynObj->GetGUID());
|
||||
m_dynObj.push_back(dynObj);
|
||||
}
|
||||
|
||||
void Unit::RemoveDynObject(uint32 spellid)
|
||||
void Unit::_UnregisterDynObject(DynamicObject* dynObj)
|
||||
{
|
||||
if (m_dynObjGUIDs.empty())
|
||||
return;
|
||||
for (DynObjectGUIDs::iterator i = m_dynObjGUIDs.begin(); i != m_dynObjGUIDs.end();)
|
||||
m_dynObj.remove(dynObj);
|
||||
}
|
||||
|
||||
DynamicObject * Unit::GetDynObject(uint32 spellId)
|
||||
{
|
||||
if (m_dynObj.empty())
|
||||
return NULL;
|
||||
for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end();++i)
|
||||
{
|
||||
DynamicObject* dynObj = GetMap()->GetDynamicObject(*i);
|
||||
if (!dynObj) // may happen if a dynobj is removed when grid unload
|
||||
i = m_dynObjGUIDs.erase(i);
|
||||
else if (spellid == 0 || dynObj->GetSpellId() == spellid)
|
||||
DynamicObject* dynObj = *i;
|
||||
if (dynObj->GetSpellId() == spellId)
|
||||
return dynObj;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Unit::RemoveDynObject(uint32 spellId)
|
||||
{
|
||||
if (m_dynObj.empty())
|
||||
return;
|
||||
for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
|
||||
{
|
||||
DynamicObject* dynObj = *i;
|
||||
if (dynObj->GetSpellId() == spellId)
|
||||
{
|
||||
dynObj->Delete();
|
||||
i = m_dynObjGUIDs.erase(i);
|
||||
dynObj->Remove();
|
||||
i = m_dynObj.begin();
|
||||
}
|
||||
else
|
||||
++i;
|
||||
@@ -4494,31 +4510,8 @@ void Unit::RemoveDynObject(uint32 spellid)
|
||||
|
||||
void Unit::RemoveAllDynObjects()
|
||||
{
|
||||
while (!m_dynObjGUIDs.empty())
|
||||
{
|
||||
DynamicObject* dynObj = GetMap()->GetDynamicObject(*m_dynObjGUIDs.begin());
|
||||
if (dynObj)
|
||||
dynObj->Delete();
|
||||
m_dynObjGUIDs.erase(m_dynObjGUIDs.begin());
|
||||
}
|
||||
}
|
||||
|
||||
DynamicObject * Unit::GetDynObject(uint32 spellId)
|
||||
{
|
||||
for (DynObjectGUIDs::iterator i = m_dynObjGUIDs.begin(); i != m_dynObjGUIDs.end();)
|
||||
{
|
||||
DynamicObject* dynObj = GetMap()->GetDynamicObject(*i);
|
||||
if (!dynObj)
|
||||
{
|
||||
i = m_dynObjGUIDs.erase(i);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (dynObj->GetSpellId() == spellId)
|
||||
return dynObj;
|
||||
++i;
|
||||
}
|
||||
return NULL;
|
||||
while (!m_dynObj.empty())
|
||||
m_dynObj.front()->Remove();
|
||||
}
|
||||
|
||||
GameObject* Unit::GetGameObject(uint32 spellId) const
|
||||
|
||||
Reference in New Issue
Block a user