[9575] Use ObjectGuid in Map object stores/world access/search.

This commit is contained in:
VladimirMangos 2010-03-12 13:09:21 +03:00
parent b01de55396
commit a12fecab0d
18 changed files with 131 additions and 126 deletions

View file

@ -201,7 +201,7 @@ template<class Do>
void BattleGround::BroadcastWorker(Do& _do) void BattleGround::BroadcastWorker(Do& _do)
{ {
for(BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr) for(BattleGroundPlayerMap::const_iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
if (Player *plr = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER))) if (Player *plr = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)))
_do(plr); _do(plr);
} }

View file

@ -594,7 +594,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id)
{ {
sObjectMgr.RemoveCreatureFromGrid(*itr, data); sObjectMgr.RemoveCreatureFromGrid(*itr, data);
if( Creature* pCreature = ObjectAccessor::GetCreatureInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_UNIT)) ) if (Creature* pCreature = ObjectAccessor::GetCreatureInWorld(ObjectGuid(HIGHGUID_UNIT, data->id, *itr)))
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
} }
@ -612,7 +612,7 @@ void GameEventMgr::GameEventUnspawn(int16 event_id)
{ {
sObjectMgr.RemoveGameobjectFromGrid(*itr, data); sObjectMgr.RemoveGameobjectFromGrid(*itr, data);
if( GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(MAKE_NEW_GUID(*itr, data->id, HIGHGUID_GAMEOBJECT)) ) if( GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(ObjectGuid(HIGHGUID_GAMEOBJECT, data->id, *itr)) )
pGameobject->AddObjectToRemoveList(); pGameobject->AddObjectToRemoveList();
} }
} }
@ -638,8 +638,7 @@ void GameEventMgr::ChangeEquipOrModel(int16 event_id, bool activate)
continue; continue;
// Update if spawned // Update if spawned
Creature* pCreature = ObjectAccessor::GetCreatureInWorld(MAKE_NEW_GUID(itr->first, data->id,HIGHGUID_UNIT)); if (Creature* pCreature = ObjectAccessor::GetCreatureInWorld(ObjectGuid(HIGHGUID_UNIT, data->id, itr->first)))
if (pCreature)
{ {
if (activate) if (activate)
{ {

View file

@ -551,7 +551,7 @@ void Guild::BroadcastToGuild(WorldSession *session, const std::string& msg, uint
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
Player *pl = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (pl && pl->GetSession() && HasRankRight(pl->GetRank(),GR_RIGHT_GCHATLISTEN) && !pl->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()) ) if (pl && pl->GetSession() && HasRankRight(pl->GetRank(),GR_RIGHT_GCHATLISTEN) && !pl->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()) )
pl->GetSession()->SendPacket(&data); pl->GetSession()->SendPacket(&data);
@ -568,7 +568,7 @@ void Guild::BroadcastToOfficers(WorldSession *session, const std::string& msg, u
WorldPacket data; WorldPacket data;
ChatHandler::FillMessageData(&data, session, CHAT_MSG_OFFICER, language, NULL, 0, msg.c_str(), NULL); ChatHandler::FillMessageData(&data, session, CHAT_MSG_OFFICER, language, NULL, 0, msg.c_str(), NULL);
Player *pl = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (pl && pl->GetSession() && HasRankRight(pl->GetRank(),GR_RIGHT_OFFCHATLISTEN) && !pl->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow())) if (pl && pl->GetSession() && HasRankRight(pl->GetRank(),GR_RIGHT_OFFCHATLISTEN) && !pl->GetSocial()->HasIgnore(session->GetPlayer()->GetGUIDLow()))
pl->GetSession()->SendPacket(&data); pl->GetSession()->SendPacket(&data);
@ -580,7 +580,7 @@ void Guild::BroadcastPacket(WorldPacket *packet)
{ {
for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for(MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (player) if (player)
player->GetSession()->SendPacket(packet); player->GetSession()->SendPacket(packet);
} }
@ -592,7 +592,7 @@ void Guild::BroadcastPacketToRank(WorldPacket *packet, uint32 rankId)
{ {
if (itr->second.RankId == rankId) if (itr->second.RankId == rankId)
{ {
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (player) if (player)
player->GetSession()->SendPacket(packet); player->GetSession()->SendPacket(packet);
} }
@ -731,7 +731,7 @@ void Guild::Roster(WorldSession *session /*= NULL*/)
} }
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
if (Player *pl = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER))) if (Player *pl = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)))
{ {
data << uint64(pl->GetGUID()); data << uint64(pl->GetGUID());
data << uint8(1); data << uint8(1);
@ -746,7 +746,7 @@ void Guild::Roster(WorldSession *session /*= NULL*/)
} }
else else
{ {
data << uint64(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); data << uint64(ObjectGuid(HIGHGUID_PLAYER, itr->first).GetRawValue());
data << uint8(0); data << uint8(0);
data << itr->second.Name; data << itr->second.Name;
data << uint32(itr->second.RankId); data << uint32(itr->second.RankId);
@ -976,7 +976,7 @@ void Guild::DisplayGuildBankContentUpdate(uint8 TabId, int32 slot1, int32 slot2)
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (!player) if (!player)
continue; continue;
@ -1011,7 +1011,7 @@ void Guild::DisplayGuildBankContentUpdate(uint8 TabId, GuildItemPosCountVec cons
for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr) for (MemberList::const_iterator itr = members.begin(); itr != members.end(); ++itr)
{ {
Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
if (!player) if (!player)
continue; continue;

View file

@ -343,7 +343,7 @@ class Guild
void BroadcastWorker(Do& _do, Player* except = NULL) void BroadcastWorker(Do& _do, Player* except = NULL)
{ {
for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr) for(MemberList::iterator itr = members.begin(); itr != members.end(); ++itr)
if(Player *player = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER))) if(Player *player = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first)))
if(player != except) if(player != except)
_do(player); _do(player);
} }

View file

@ -261,7 +261,7 @@ bool ChatHandler::HandleGPSCommand(const char* args)
{ {
uint64 guid = extractGuidFromLink((char*)args); uint64 guid = extractGuidFromLink((char*)args);
if(guid) if(guid)
obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); obj = (WorldObject*)m_session->GetPlayer()->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT);
if(!obj) if(!obj)
{ {

View file

@ -3407,7 +3407,7 @@ bool ChatHandler::HandleGetDistanceCommand(const char* args)
{ {
uint64 guid = extractGuidFromLink((char*)args); uint64 guid = extractGuidFromLink((char*)args);
if(guid) if(guid)
obj = (WorldObject*)ObjectAccessor::GetObjectByTypeMask(*m_session->GetPlayer(),guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); obj = (WorldObject*)m_session->GetPlayer()->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT);
if(!obj) if(!obj)
{ {

View file

@ -453,7 +453,7 @@ void WorldSession::HandleLootMasterGiveOpcode( WorldPacket & recv_data )
return; return;
} }
Player *target = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(target_playerguid, 0, HIGHGUID_PLAYER)); Player *target = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, target_playerguid));
if(!target) if(!target)
return; return;

View file

@ -3497,22 +3497,22 @@ void Map::ScriptsProcess()
return; return;
} }
Creature* Map::GetCreature(uint64 guid) Creature* Map::GetCreature(ObjectGuid guid)
{ {
return m_objectsStore.find<Creature>(guid, (Creature*)NULL); return m_objectsStore.find<Creature>(guid.GetRawValue(), (Creature*)NULL);
} }
Vehicle* Map::GetVehicle(uint64 guid) Vehicle* Map::GetVehicle(ObjectGuid guid)
{ {
return m_objectsStore.find<Vehicle>(guid, (Vehicle*)NULL); return m_objectsStore.find<Vehicle>(guid.GetRawValue(), (Vehicle*)NULL);
} }
Pet* Map::GetPet(uint64 guid) Pet* Map::GetPet(ObjectGuid guid)
{ {
return m_objectsStore.find<Pet>(guid, (Pet*)NULL); return m_objectsStore.find<Pet>(guid.GetRawValue(), (Pet*)NULL);
} }
Corpse* Map::GetCorpse(uint64 guid) Corpse* Map::GetCorpse(ObjectGuid guid)
{ {
Corpse * ret = ObjectAccessor::GetCorpseInMap(guid,GetId()); Corpse * ret = ObjectAccessor::GetCorpseInMap(guid,GetId());
if (!ret) if (!ret)
@ -3522,33 +3522,32 @@ Corpse* Map::GetCorpse(uint64 guid)
return ret; return ret;
} }
Creature* Map::GetCreatureOrPetOrVehicle(uint64 guid) Creature* Map::GetCreatureOrPetOrVehicle(ObjectGuid guid)
{ {
if (IS_PLAYER_GUID(guid)) switch(guid.GetHigh())
return NULL; {
case HIGHGUID_UNIT: return GetCreature(guid);
case HIGHGUID_PET: return GetPet(guid);
case HIGHGUID_VEHICLE: return GetVehicle(guid);
default: break;
}
if (IS_PET_GUID(guid)) return NULL;
return GetPet(guid);
if (IS_VEHICLE_GUID(guid))
return GetVehicle(guid);
return GetCreature(guid);
} }
GameObject* Map::GetGameObject(uint64 guid) GameObject* Map::GetGameObject(ObjectGuid guid)
{ {
return m_objectsStore.find<GameObject>(guid, (GameObject*)NULL); return m_objectsStore.find<GameObject>(guid.GetRawValue(), (GameObject*)NULL);
} }
DynamicObject* Map::GetDynamicObject(uint64 guid) DynamicObject* Map::GetDynamicObject(ObjectGuid guid)
{ {
return m_objectsStore.find<DynamicObject>(guid, (DynamicObject*)NULL); return m_objectsStore.find<DynamicObject>(guid.GetRawValue(), (DynamicObject*)NULL);
} }
WorldObject* Map::GetWorldObject(uint64 guid) WorldObject* Map::GetWorldObject(ObjectGuid guid)
{ {
switch(GUID_HIPART(guid)) switch(guid.GetHigh())
{ {
case HIGHGUID_PLAYER: return ObjectAccessor::FindPlayer(guid); case HIGHGUID_PLAYER: return ObjectAccessor::FindPlayer(guid);
case HIGHGUID_GAMEOBJECT: return GetGameObject(guid); case HIGHGUID_GAMEOBJECT: return GetGameObject(guid);

View file

@ -396,14 +396,14 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
void RemoveFromActive(Creature* obj); void RemoveFromActive(Creature* obj);
Creature* GetCreature(uint64 guid); Creature* GetCreature(ObjectGuid guid);
Vehicle* GetVehicle(uint64 guid); Vehicle* GetVehicle(ObjectGuid guid);
Pet* GetPet(uint64 guid); Pet* GetPet(ObjectGuid guid);
Creature* GetCreatureOrPetOrVehicle(uint64 guid); Creature* GetCreatureOrPetOrVehicle(ObjectGuid guid);
GameObject* GetGameObject(uint64 guid); GameObject* GetGameObject(ObjectGuid guid);
DynamicObject* GetDynamicObject(uint64 guid); DynamicObject* GetDynamicObject(ObjectGuid guid);
Corpse* GetCorpse(uint64 guid); Corpse* GetCorpse(ObjectGuid guid);
WorldObject* GetWorldObject(uint64 guid); WorldObject* GetWorldObject(ObjectGuid guid);
TypeUnorderedMapContainer<AllMapStoredObjectTypes>& GetObjectsStore() { return m_objectsStore; } TypeUnorderedMapContainer<AllMapStoredObjectTypes>& GetObjectsStore() { return m_objectsStore; }

View file

@ -54,12 +54,12 @@ ObjectAccessor::~ObjectAccessor()
} }
Unit* Unit*
ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid) ObjectAccessor::GetUnit(WorldObject const &u, ObjectGuid guid)
{ {
if(!guid) if(guid.IsEmpty())
return NULL; return NULL;
if(IS_PLAYER_GUID(guid)) if(guid.IsPlayer())
return FindPlayer(guid); return FindPlayer(guid);
if (!u.IsInWorld()) if (!u.IsInWorld())
@ -68,7 +68,7 @@ ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid)
return u.GetMap()->GetCreatureOrPetOrVehicle(guid); return u.GetMap()->GetCreatureOrPetOrVehicle(guid);
} }
Corpse* ObjectAccessor::GetCorpseInMap( uint64 guid, uint32 mapid ) Corpse* ObjectAccessor::GetCorpseInMap(ObjectGuid guid, uint32 mapid)
{ {
Corpse * ret = HashMapHolder<Corpse>::Find(guid); Corpse * ret = HashMapHolder<Corpse>::Find(guid);
if(!ret) if(!ret)
@ -79,49 +79,8 @@ Corpse* ObjectAccessor::GetCorpseInMap( uint64 guid, uint32 mapid )
return ret; return ret;
} }
Object* ObjectAccessor::GetObjectByTypeMask(WorldObject const &p, uint64 guid, uint32 typemask)
{
switch(GUID_HIPART(guid))
{
case HIGHGUID_ITEM:
if(typemask & TYPEMASK_ITEM && p.GetTypeId() == TYPEID_PLAYER)
return ((Player const &)p).GetItemByGuid( guid );
break;
case HIGHGUID_PLAYER:
if(typemask & TYPEMASK_PLAYER)
return FindPlayer(guid);
break;
case HIGHGUID_GAMEOBJECT:
if(typemask & TYPEMASK_GAMEOBJECT)
return p.GetMap()->GetGameObject(guid);
break;
case HIGHGUID_UNIT:
if(typemask & TYPEMASK_UNIT)
return p.GetMap()->GetCreature(guid);
break;
case HIGHGUID_PET:
if(typemask & TYPEMASK_UNIT)
return p.GetMap()->GetPet(guid);
break;
case HIGHGUID_VEHICLE:
if(typemask & TYPEMASK_UNIT)
return p.GetMap()->GetVehicle(guid);
break;
case HIGHGUID_DYNAMICOBJECT:
if(typemask & TYPEMASK_DYNAMICOBJECT)
return p.GetMap()->GetDynamicObject(guid);
break;
case HIGHGUID_TRANSPORT:
case HIGHGUID_CORPSE:
case HIGHGUID_MO_TRANSPORT:
break;
}
return NULL;
}
Player* Player*
ObjectAccessor::FindPlayer(uint64 guid) ObjectAccessor::FindPlayer(ObjectGuid guid)
{ {
Player * plr = HashMapHolder<Player>::Find(guid);; Player * plr = HashMapHolder<Player>::Find(guid);;
if(!plr || !plr->IsInWorld()) if(!plr || !plr->IsInWorld())
@ -163,11 +122,11 @@ void ObjectAccessor::KickPlayer(uint64 guid)
} }
Corpse* Corpse*
ObjectAccessor::GetCorpseForPlayerGUID(uint64 guid) ObjectAccessor::GetCorpseForPlayerGUID(ObjectGuid guid)
{ {
Guard guard(i_corpseGuard); Guard guard(i_corpseGuard);
Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid); Player2CorpsesMapType::iterator iter = i_player2corpse.find(guid.GetRawValue());
if( iter == i_player2corpse.end() ) return NULL; if( iter == i_player2corpse.end() ) return NULL;
assert(iter->second->GetType() != CORPSE_BONES); assert(iter->second->GetType() != CORPSE_BONES);
@ -234,7 +193,7 @@ ObjectAccessor::AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* ma
} }
Corpse* Corpse*
ObjectAccessor::ConvertCorpseForPlayer(uint64 player_guid, bool insignia) ObjectAccessor::ConvertCorpseForPlayer(ObjectGuid player_guid, bool insignia)
{ {
Corpse *corpse = GetCorpseForPlayerGUID(player_guid); Corpse *corpse = GetCorpseForPlayerGUID(player_guid);
if(!corpse) if(!corpse)

View file

@ -58,9 +58,9 @@ class HashMapHolder
m_objectMap.erase(o->GetGUID()); m_objectMap.erase(o->GetGUID());
} }
static T* Find(uint64 guid) static T* Find(ObjectGuid guid)
{ {
typename MapType::iterator itr = m_objectMap.find(guid); typename MapType::iterator itr = m_objectMap.find(guid.GetRawValue());
return (itr != m_objectMap.end()) ? itr->second : NULL; return (itr != m_objectMap.end()) ? itr->second : NULL;
} }
@ -89,18 +89,17 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor,
typedef UNORDERED_MAP<uint64, Corpse* > Player2CorpsesMapType; typedef UNORDERED_MAP<uint64, Corpse* > Player2CorpsesMapType;
// global (obj used for map only location local guid objects (pets currently) // global (obj used for map only location local guid objects (pets currently)
static Unit* GetUnitInWorld(WorldObject const& obj, uint64 guid); static Unit* GetUnitInWorld(WorldObject const& obj, ObjectGuid guid);
// FIXME: map local object with global search // FIXME: map local object with global search
static Creature* GetCreatureInWorld(uint64 guid) { return FindHelper<Creature>(guid); } static Creature* GetCreatureInWorld(ObjectGuid guid) { return FindHelper<Creature>(guid); }
static GameObject* GetGameObjectInWorld(uint64 guid) { return FindHelper<GameObject>(guid); } static GameObject* GetGameObjectInWorld(ObjectGuid guid) { return FindHelper<GameObject>(guid); }
// possible local search for specific object map // possible local search for specific object map
static Object* GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask); static Unit* GetUnit(WorldObject const &, ObjectGuid guid);
static Unit* GetUnit(WorldObject const &, uint64);
// Player access // Player access
static Player* FindPlayer(uint64 guid); static Player* FindPlayer(ObjectGuid guid);
static Player* FindPlayerByName(const char *name); static Player* FindPlayerByName(const char *name);
static void KickPlayer(uint64 guid); static void KickPlayer(uint64 guid);
@ -112,12 +111,12 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor,
void SaveAllPlayers(); void SaveAllPlayers();
// Corpse access // Corpse access
Corpse* GetCorpseForPlayerGUID(uint64 guid); Corpse* GetCorpseForPlayerGUID(ObjectGuid guid);
static Corpse* GetCorpseInMap(uint64 guid, uint32 mapid); static Corpse* GetCorpseInMap(ObjectGuid guid, uint32 mapid);
void RemoveCorpse(Corpse *corpse); void RemoveCorpse(Corpse *corpse);
void AddCorpse(Corpse* corpse); void AddCorpse(Corpse* corpse);
void AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* map); void AddCorpsesToGrid(GridPair const& gridpair,GridType& grid,Map* map);
Corpse* ConvertCorpseForPlayer(uint64 player_guid, bool insignia = false); Corpse* ConvertCorpseForPlayer(ObjectGuid player_guid, bool insignia = false);
// For call from Player/Corpse AddToWorld/RemoveFromWorld only // For call from Player/Corpse AddToWorld/RemoveFromWorld only
void AddObject(Corpse *object) { HashMapHolder<Corpse>::Insert(object); } void AddObject(Corpse *object) { HashMapHolder<Corpse>::Insert(object); }
@ -132,11 +131,11 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor,
// TODO: This methods will need lock in MT environment // TODO: This methods will need lock in MT environment
// Theoreticaly multiple threads can enter and search in this method but // Theoreticaly multiple threads can enter and search in this method but
// in that case linking/delinking other map should be guarded // in that case linking/delinking other map should be guarded
template <class OBJECT> static OBJECT* FindHelper(uint64 guid) template <class OBJECT> static OBJECT* FindHelper(ObjectGuid guid)
{ {
for (std::list<Map*>::const_iterator i = i_mapList.begin() ; i != i_mapList.end(); ++i) for (std::list<Map*>::const_iterator i = i_mapList.begin() ; i != i_mapList.end(); ++i)
{ {
if (OBJECT* ret = (*i)->GetObjectsStore().find(guid, (OBJECT*)NULL)) if (OBJECT* ret = (*i)->GetObjectsStore().find(guid.GetRawValue(), (OBJECT*)NULL))
return ret; return ret;
} }
@ -154,15 +153,15 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor,
LockType i_corpseGuard; LockType i_corpseGuard;
}; };
inline Unit* ObjectAccessor::GetUnitInWorld(WorldObject const& obj, uint64 guid) inline Unit* ObjectAccessor::GetUnitInWorld(WorldObject const& obj, ObjectGuid guid)
{ {
if(!guid) if(guid.IsEmpty())
return NULL; return NULL;
if (IS_PLAYER_GUID(guid)) if (guid.IsPlayer())
return FindPlayer(guid); return FindPlayer(guid);
if (IS_PET_GUID(guid)) if (guid.IsPet())
return obj.IsInWorld() ? obj.GetMap()->GetPet(guid) : NULL; return obj.IsInWorld() ? obj.GetMap()->GetPet(guid) : NULL;
return GetCreatureInWorld(guid); return GetCreatureInWorld(guid);

View file

@ -41,11 +41,16 @@ enum TypeMask
TYPEMASK_OBJECT = 0x0001, TYPEMASK_OBJECT = 0x0001,
TYPEMASK_ITEM = 0x0002, TYPEMASK_ITEM = 0x0002,
TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004 TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004
TYPEMASK_UNIT = 0x0008, TYPEMASK_UNIT = 0x0008, // players also have it
TYPEMASK_PLAYER = 0x0010, TYPEMASK_PLAYER = 0x0010,
TYPEMASK_GAMEOBJECT = 0x0020, TYPEMASK_GAMEOBJECT = 0x0020,
TYPEMASK_DYNAMICOBJECT = 0x0040, TYPEMASK_DYNAMICOBJECT = 0x0040,
TYPEMASK_CORPSE = 0x0080 TYPEMASK_CORPSE = 0x0080,
// used combinations in Player::GetObjectByTypeMask (TYPEMASK_UNIT case ignore players in call)
TYPEMASK_CREATURE_OR_GAMEOBJECT = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT,
TYPEMASK_CREATURE_GAMEOBJECT_OR_ITEM = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM,
TYPEMASK_CREATURE_GAMEOBJECT_PLAYER_OR_ITEM = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_ITEM | TYPEMASK_PLAYER,
}; };
enum HighGuid enum HighGuid
@ -128,6 +133,7 @@ class ObjectGuid
ObjectGuid() : m_guid(0) {} ObjectGuid() : m_guid(0) {}
ObjectGuid(uint64 const& guid) : m_guid(guid) {} // NOTE: must be explicit in future for more strict control type conversions ObjectGuid(uint64 const& guid) : m_guid(guid) {} // NOTE: must be explicit in future for more strict control type conversions
ObjectGuid(HighGuid hi, uint32 entry, uint32 counter) : m_guid(uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48)) {} ObjectGuid(HighGuid hi, uint32 entry, uint32 counter) : m_guid(uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48)) {}
ObjectGuid(HighGuid hi, uint32 counter) : m_guid(uint64(counter) | (uint64(hi) << 48)) {}
public: // modifiers public: // modifiers
PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); } PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); }

View file

@ -21674,4 +21674,45 @@ void Player::SetHomebindToLocation(WorldLocation const& loc, uint32 area_id)
m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ, GetGUIDLow()); m_homebindMapId, m_homebindAreaId, m_homebindX, m_homebindY, m_homebindZ, GetGUIDLow());
} }
Object* Player::GetObjectByTypeMask(ObjectGuid guid, TypeMask typemask)
{
switch(guid.GetHigh())
{
case HIGHGUID_ITEM:
if (typemask & TYPEMASK_ITEM)
return GetItemByGuid(guid.GetRawValue());
break;
case HIGHGUID_PLAYER:
if (GetGUID()==guid.GetRawValue())
return this;
if ((typemask & TYPEMASK_PLAYER) && IsInWorld())
return ObjectAccessor::FindPlayer(guid.GetRawValue());
break;
case HIGHGUID_GAMEOBJECT:
if ((typemask & TYPEMASK_GAMEOBJECT) && IsInWorld())
return GetMap()->GetGameObject(guid);
break;
case HIGHGUID_UNIT:
if ((typemask & TYPEMASK_UNIT) && IsInWorld())
return GetMap()->GetCreature(guid);
break;
case HIGHGUID_PET:
if ((typemask & TYPEMASK_UNIT) && IsInWorld())
return GetMap()->GetPet(guid);
break;
case HIGHGUID_VEHICLE:
if ((typemask & TYPEMASK_UNIT) && IsInWorld())
return GetMap()->GetVehicle(guid);
break;
case HIGHGUID_DYNAMICOBJECT:
if ((typemask & TYPEMASK_DYNAMICOBJECT) && IsInWorld())
return GetMap()->GetDynamicObject(guid);
break;
case HIGHGUID_TRANSPORT:
case HIGHGUID_CORPSE:
case HIGHGUID_MO_TRANSPORT:
break;
}
return NULL;
}

View file

@ -2175,6 +2175,8 @@ class MANGOS_DLL_SPEC Player : public Unit
void RelocateToHomebind() { SetLocationMapId(m_homebindMapId); Relocate(m_homebindX, m_homebindY, m_homebindZ); } void RelocateToHomebind() { SetLocationMapId(m_homebindMapId); Relocate(m_homebindX, m_homebindY, m_homebindZ); }
bool TeleportToHomebind(uint32 options = 0) { return TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation(), options); } bool TeleportToHomebind(uint32 options = 0) { return TeleportTo(m_homebindMapId, m_homebindX, m_homebindY, m_homebindZ, GetOrientation(), options); }
Object* GetObjectByTypeMask(ObjectGuid guid, TypeMask typemask);
// currently visible objects at player client // currently visible objects at player client
typedef std::set<uint64> ClientGUIDs; typedef std::set<uint64> ClientGUIDs;
ClientGUIDs m_clientGUIDs; ClientGUIDs m_clientGUIDs;

View file

@ -206,7 +206,7 @@ void PoolGroup<Creature>::Despawn1Object(uint32 guid)
{ {
sObjectMgr.RemoveCreatureFromGrid(guid, data); sObjectMgr.RemoveCreatureFromGrid(guid, data);
if (Creature* pCreature = ObjectAccessor::GetCreatureInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_UNIT))) if (Creature* pCreature = ObjectAccessor::GetCreatureInWorld(ObjectGuid(HIGHGUID_UNIT, data->id, guid)))
pCreature->AddObjectToRemoveList(); pCreature->AddObjectToRemoveList();
} }
} }
@ -219,7 +219,7 @@ void PoolGroup<GameObject>::Despawn1Object(uint32 guid)
{ {
sObjectMgr.RemoveGameobjectFromGrid(guid, data); sObjectMgr.RemoveGameobjectFromGrid(guid, data);
if (GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(MAKE_NEW_GUID(guid, data->id, HIGHGUID_GAMEOBJECT))) if (GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(ObjectGuid(HIGHGUID_GAMEOBJECT, data->id, guid)))
pGameobject->AddObjectToRemoveList(); pGameobject->AddObjectToRemoveList();
} }
} }
@ -403,7 +403,7 @@ template <>
void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* obj) void PoolGroup<GameObject>::ReSpawn1Object(PoolObject* obj)
{ {
if (GameObjectData const* data = sObjectMgr.GetGOData(obj->guid)) if (GameObjectData const* data = sObjectMgr.GetGOData(obj->guid))
if (GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(MAKE_NEW_GUID(obj->guid, data->id, HIGHGUID_GAMEOBJECT))) if (GameObject* pGameobject = ObjectAccessor::GetGameObjectInWorld(ObjectGuid(HIGHGUID_GAMEOBJECT, data->id, obj->guid)))
pGameobject->GetMap()->Add(pGameobject); pGameobject->GetMap()->Add(pGameobject);
} }

View file

@ -37,7 +37,7 @@ void WorldSession::HandleQuestgiverStatusQueryOpcode( WorldPacket & recv_data )
uint8 questStatus = DIALOG_STATUS_NONE; uint8 questStatus = DIALOG_STATUS_NONE;
uint8 defstatus = DIALOG_STATUS_NONE; uint8 defstatus = DIALOG_STATUS_NONE;
Object* questgiver = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); Object* questgiver = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT);
if(!questgiver) if(!questgiver)
{ {
sLog.outDetail("Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver (Typeid: %u GUID: %u)",GuidHigh2TypeId(GUID_HIPART(guid)),GUID_LOPART(guid)); sLog.outDetail("Error in CMSG_QUESTGIVER_STATUS_QUERY, called for not found questgiver (Typeid: %u GUID: %u)",GuidHigh2TypeId(GUID_HIPART(guid)),GUID_LOPART(guid));
@ -118,7 +118,7 @@ void WorldSession::HandleQuestgiverAcceptQuestOpcode( WorldPacket & recv_data )
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_ACCEPT_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM|TYPEMASK_PLAYER); Object* pObject = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_GAMEOBJECT_PLAYER_OR_ITEM);
// no or incorrect quest giver // no or incorrect quest giver
if(!pObject if(!pObject
@ -234,7 +234,7 @@ void WorldSession::HandleQuestgiverQueryQuestOpcode( WorldPacket & recv_data )
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_QUERY_QUEST npc = %u, quest = %u, unk1 = %u", uint32(GUID_LOPART(guid)), quest, unk1 );
// Verify that the guid is valid and is a questgiver or involved in the requested quest // Verify that the guid is valid and is a questgiver or involved in the requested quest
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT|TYPEMASK_ITEM); Object* pObject = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_GAMEOBJECT_OR_ITEM);
if(!pObject||!pObject->hasQuest(quest) && !pObject->hasInvolvedQuest(quest)) if(!pObject||!pObject->hasQuest(quest) && !pObject->hasInvolvedQuest(quest))
{ {
_player->PlayerTalkClass->CloseGossip(); _player->PlayerTalkClass->CloseGossip();
@ -278,7 +278,7 @@ void WorldSession::HandleQuestgiverChooseRewardOpcode( WorldPacket & recv_data )
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %u, quest = %u, reward = %u",uint32(GUID_LOPART(guid)),quest,reward ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_CHOOSE_REWARD npc = %u, quest = %u, reward = %u",uint32(GUID_LOPART(guid)),quest,reward );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); Object* pObject = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT);
if(!pObject) if(!pObject)
return; return;
@ -328,7 +328,7 @@ void WorldSession::HandleQuestgiverRequestRewardOpcode( WorldPacket & recv_data
sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_REQUEST_REWARD npc = %u, quest = %u",uint32(GUID_LOPART(guid)),quest ); sLog.outDebug( "WORLD: Received CMSG_QUESTGIVER_REQUEST_REWARD npc = %u, quest = %u",uint32(GUID_LOPART(guid)),quest );
Object* pObject = ObjectAccessor::GetObjectByTypeMask(*_player, guid,TYPEMASK_UNIT|TYPEMASK_GAMEOBJECT); Object* pObject = _player->GetObjectByTypeMask(guid, TYPEMASK_CREATURE_OR_GAMEOBJECT);
if(!pObject||!pObject->hasInvolvedQuest(quest)) if(!pObject||!pObject->hasInvolvedQuest(quest))
return; return;

View file

@ -281,7 +281,7 @@ void SocialMgr::BroadcastToFriendListers(Player *player, WorldPacket *packet)
PlayerSocialMap::const_iterator itr2 = itr->second.m_playerSocialMap.find(guid); PlayerSocialMap::const_iterator itr2 = itr->second.m_playerSocialMap.find(guid);
if(itr2 != itr->second.m_playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND)) if(itr2 != itr->second.m_playerSocialMap.end() && (itr2->second.Flags & SOCIAL_FLAG_FRIEND))
{ {
Player *pFriend = ObjectAccessor::FindPlayer(MAKE_NEW_GUID(itr->first, 0, HIGHGUID_PLAYER)); Player *pFriend = ObjectAccessor::FindPlayer(ObjectGuid(HIGHGUID_PLAYER, itr->first));
// PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters // PLAYER see his team only and PLAYER can't see MODERATOR, GAME MASTER, ADMINISTRATOR characters
// MODERATOR, GAME MASTER, ADMINISTRATOR can see all // MODERATOR, GAME MASTER, ADMINISTRATOR can see all

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__ #ifndef __REVISION_NR_H__
#define __REVISION_NR_H__ #define __REVISION_NR_H__
#define REVISION_NR "9574" #define REVISION_NR "9575"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__