193 lines
4.6 KiB
C++
193 lines
4.6 KiB
C++
#include "common.h"
|
|
#include "log.h"
|
|
#include "PseuWoW.h"
|
|
#include "ObjMgr.h"
|
|
#include "GUI/PseuGUI.h"
|
|
|
|
ObjMgr::ObjMgr()
|
|
{
|
|
DEBUG(logdebug("DEBUG: ObjMgr created"));
|
|
}
|
|
|
|
ObjMgr::~ObjMgr()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
|
|
void ObjMgr::SetInstance(PseuInstance *i)
|
|
{
|
|
_instance = i;
|
|
DEBUG(logdebug("DEBUG: ObjMgr instance set to 0x%X",i));
|
|
}
|
|
|
|
void ObjMgr::RemoveAll(void)
|
|
{
|
|
for(ItemProtoMap::iterator i = _iproto.begin(); i!=_iproto.end(); i++)
|
|
{
|
|
delete i->second;
|
|
}
|
|
for(CreatureTemplateMap::iterator i = _creature_templ.begin(); i!=_creature_templ.end(); i++)
|
|
{
|
|
delete i->second;
|
|
}
|
|
while(_obj.size())
|
|
{
|
|
Remove(_obj.begin()->first, true);
|
|
}
|
|
if(PseuGUI *gui = _instance->GetGUI())
|
|
{
|
|
// necessary that the pending-to-delete GUIDs just stored by deleting the objects above will be cleared
|
|
// so that newly added DrawObjects with uncleared pending-to-delete GUIDs will not get deleted again immediately.
|
|
gui->NotifyAllObjectsDeletion();
|
|
}
|
|
}
|
|
|
|
void ObjMgr::Remove(uint64 guid, bool del)
|
|
{
|
|
Object *o = GetObj(guid, true); // here get also depleted objs and delete if necessary
|
|
if(o)
|
|
{
|
|
o->_SetDepleted();
|
|
if(!del)
|
|
logdebug("ObjMgr: "I64FMT" '%s' -> depleted.",guid,o->GetName().c_str());
|
|
PseuGUI *gui = _instance->GetGUI();
|
|
if(gui)
|
|
gui->NotifyObjectDeletion(guid); // we have a gui, which must delete linked DrawObject
|
|
if(del)
|
|
{
|
|
_obj.erase(guid); // now delete the obj from the mgr
|
|
delete o; // and delete the obj itself
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_obj.erase(guid); // we can safely erase an object that does not exist
|
|
// - if we reach this point there was a bug anyway
|
|
logcustom(2,LRED,"ObjMgr::Remove("I64FMT") - not existing",guid);
|
|
}
|
|
}
|
|
|
|
// -- Object part --
|
|
|
|
void ObjMgr::Add(Object *o)
|
|
{
|
|
Object *ox = GetObj(o->GetGUID(),true); // if an object already exists in the mgr, store old ptr...
|
|
if(o == ox)
|
|
return; // if both pointers are the same, do nothing (already added and happy)
|
|
_obj[o->GetGUID()] = o; // ...assign new one...
|
|
if(ox) // and if != NULL, delete the old object (completely, from memory)
|
|
{
|
|
delete ox; // only delete pointer, everything else is already reserved for the just added new obj
|
|
}
|
|
|
|
if(PseuGUI *gui = _instance->GetGUI())
|
|
gui->NotifyObjectCreation(o);
|
|
}
|
|
|
|
Object *ObjMgr::GetObj(uint64 guid, bool also_depleted)
|
|
{
|
|
if(!guid)
|
|
return NULL;
|
|
for(ObjectMap::iterator i = _obj.begin(); i!=_obj.end(); i++)
|
|
if(i->second->GetGUID() == guid)
|
|
{
|
|
if(i->second->_IsDepleted() && !also_depleted)
|
|
return NULL;
|
|
return i->second;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
// iterate over all objects and assign a name to all matching the entry and typeid
|
|
uint32 ObjMgr::AssignNameToObj(uint32 entry, uint8 type, std::string name)
|
|
{
|
|
uint32 changed = 0;
|
|
for(ObjectMap::iterator it = _obj.begin(); it != _obj.end(); it++)
|
|
{
|
|
if(it->second->GetEntry() == entry && (it->second->GetTypeId() == type))
|
|
{
|
|
it->second->SetName(name);
|
|
changed++;
|
|
}
|
|
}
|
|
return changed;
|
|
}
|
|
|
|
void ObjMgr::ReNotifyGUI(void)
|
|
{
|
|
PseuGUI *gui = _instance->GetGUI();
|
|
if(!gui)
|
|
return;
|
|
for(ObjectMap::iterator it = _obj.begin(); it != _obj.end(); it++)
|
|
{
|
|
Object *o = it->second;
|
|
if(o->_IsDepleted())
|
|
continue;
|
|
gui->NotifyObjectCreation(o);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// -- Item part --
|
|
|
|
void ObjMgr::Add(ItemProto *proto)
|
|
{
|
|
_iproto[proto->Id] = proto;
|
|
}
|
|
|
|
ItemProto *ObjMgr::GetItemProto(uint32 entry)
|
|
{
|
|
ItemProtoMap::iterator it = _iproto.find(entry);
|
|
if(it != _iproto.end())
|
|
return it->second;
|
|
return NULL;
|
|
}
|
|
|
|
void ObjMgr::AddNonexistentItem(uint32 id)
|
|
{
|
|
_noitem.insert(id);
|
|
}
|
|
|
|
bool ObjMgr::ItemNonExistent(uint32 id)
|
|
{
|
|
return _noitem.find(id) != _noitem.end();
|
|
}
|
|
|
|
// -- Creature part --
|
|
|
|
void ObjMgr::Add(CreatureTemplate *cr)
|
|
{
|
|
_creature_templ[cr->entry] = cr;
|
|
}
|
|
|
|
CreatureTemplate *ObjMgr::GetCreatureTemplate(uint32 entry)
|
|
{
|
|
CreatureTemplateMap::iterator it = _creature_templ.find(entry);
|
|
if(it != _creature_templ.end())
|
|
return it->second;
|
|
return NULL;
|
|
}
|
|
|
|
void ObjMgr::AddNonexistentCreature(uint32 id)
|
|
{
|
|
_nocreature.insert(id);
|
|
}
|
|
|
|
bool ObjMgr::CreatureNonExistent(uint32 id)
|
|
{
|
|
return _nocreature.find(id) != _nocreature.end();
|
|
}
|
|
|
|
// -- misc part --
|
|
|
|
void ObjMgr::AddRequestedPlayerGUID(uint32 loguid)
|
|
{
|
|
_reqpnames.insert(loguid);
|
|
}
|
|
|
|
bool ObjMgr::IsRequestedPlayerGUID(uint32 loguid)
|
|
{
|
|
return _reqpnames.find(loguid) != _reqpnames.end();
|
|
}
|