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();
}