[8710] Make vehicle guid counter per-map local.

Also update/drop/move to Map some dependent functions.
This commit is contained in:
VladimirMangos 2009-10-22 17:23:13 +04:00
parent 53b6d28a24
commit b942616ded
15 changed files with 46 additions and 69 deletions

View file

@ -1778,7 +1778,7 @@ Creature* ChatHandler::getSelectedCreature()
if(!m_session) if(!m_session)
return NULL; return NULL;
return ObjectAccessor::GetCreatureOrPetOrVehicle(*m_session->GetPlayer(),m_session->GetPlayer()->GetSelection()); return m_session->GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(m_session->GetPlayer()->GetSelection());
} }
char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1) char* ChatHandler::extractKeyFromLink(char* text, char const* linkType, char** something1)

View file

@ -79,7 +79,7 @@ void GameObject::RemoveFromWorld()
// Remove GO from owner // Remove GO from owner
if(uint64 owner_guid = GetOwnerGUID()) if(uint64 owner_guid = GetOwnerGUID())
{ {
if (Unit* owner = IS_PLAYER_GUID(owner_guid) ? ObjectAccessor::FindPlayer(owner_guid) : GetMap()->GetCreatureOrPet(owner_guid)) if (Unit* owner = ObjectAccessor::GetUnit(*this,owner_guid))
owner->RemoveGameObject(this,false); owner->RemoveGameObject(this,false);
else else
{ {

View file

@ -203,7 +203,7 @@ Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode, Map* _par
m_activeNonPlayersIter(m_activeNonPlayers.end()), m_activeNonPlayersIter(m_activeNonPlayers.end()),
i_gridExpiry(expiry), m_parentMap(_parent ? _parent : this), i_gridExpiry(expiry), m_parentMap(_parent ? _parent : this),
m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE), m_VisibleDistance(DEFAULT_VISIBILITY_DISTANCE),
m_hiDynObjectGuid(1) m_hiDynObjectGuid(1), m_hiVehicleGuid(1)
{ {
for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx) for(unsigned int idx=0; idx < MAX_NUMBER_OF_GRIDS; ++idx)
{ {
@ -3425,12 +3425,18 @@ Pet* Map::GetPet(uint64 guid)
return m_objectsStore.find<Pet>(guid, (Pet*)NULL); return m_objectsStore.find<Pet>(guid, (Pet*)NULL);
} }
Unit* Map::GetCreatureOrPet(uint64 guid) Creature* Map::GetCreatureOrPetOrVehicle(uint64 guid)
{ {
if (Unit* ret = GetCreature(guid)) if (IS_PLAYER_GUID(guid))
return ret; return NULL;
return GetPet(guid); if (IS_PET_GUID(guid))
return GetPet(guid);
if (IS_VEHICLE_GUID(guid))
return GetVehicle(guid);
return GetCreature(guid);
} }
GameObject* Map::GetGameObject(uint64 guid) GameObject* Map::GetGameObject(uint64 guid)
@ -3477,6 +3483,13 @@ uint32 Map::GenerateLocalLowGuid(HighGuid guidhigh)
World::StopNow(ERROR_EXIT_CODE); World::StopNow(ERROR_EXIT_CODE);
} }
return m_hiDynObjectGuid++; return m_hiDynObjectGuid++;
case HIGHGUID_VEHICLE:
if(m_hiVehicleGuid>=0x00FFFFFF)
{
sLog.outError("Vehicle guid overflow!! Can't continue, shutting down server. ");
World::StopNow(ERROR_EXIT_CODE);
}
return m_hiVehicleGuid++;
default: default:
ASSERT(0); ASSERT(0);
} }

View file

@ -37,6 +37,7 @@
#include <bitset> #include <bitset>
#include <list> #include <list>
class Creature;
class Unit; class Unit;
class WorldPacket; class WorldPacket;
class InstanceData; class InstanceData;
@ -429,7 +430,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
Creature* GetCreature(uint64 guid); Creature* GetCreature(uint64 guid);
Vehicle* GetVehicle(uint64 guid); Vehicle* GetVehicle(uint64 guid);
Pet* GetPet(uint64 guid); Pet* GetPet(uint64 guid);
Unit* GetCreatureOrPet(uint64 guid); Creature* GetCreatureOrPetOrVehicle(uint64 guid);
GameObject* GetGameObject(uint64 guid); GameObject* GetGameObject(uint64 guid);
DynamicObject* GetDynamicObject(uint64 guid); DynamicObject* GetDynamicObject(uint64 guid);
@ -529,7 +530,9 @@ class MANGOS_DLL_SPEC Map : public GridRefManager<NGridType>, public MaNGOS::Obj
std::set<WorldObject *> i_objectsToRemove; std::set<WorldObject *> i_objectsToRemove;
std::multimap<time_t, ScriptAction> m_scriptSchedule; std::multimap<time_t, ScriptAction> m_scriptSchedule;
uint32 m_hiDynObjectGuid; // Map local dynobject low guid counter // Map local low guid counters
uint32 m_hiDynObjectGuid;
uint32 m_hiVehicleGuid;
// Type specific code for add/remove to/from grid // Type specific code for add/remove to/from grid
template<class T> template<class T>

View file

@ -505,7 +505,7 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data)
_player->m_movementInfo = mi; _player->m_movementInfo = mi;
// using charm guid, because we don't have vehicle guid... // using charm guid, because we don't have vehicle guid...
if(Vehicle *vehicle = ObjectAccessor::GetVehicle(vehicleGUID)) if(Vehicle *vehicle = _player->GetMap()->GetVehicle(vehicleGUID))
{ {
// Aura::HandleAuraControlVehicle will call Player::ExitVehicle // Aura::HandleAuraControlVehicle will call Player::ExitVehicle
vehicle->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); vehicle->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE);

View file

@ -50,21 +50,6 @@ ObjectAccessor::~ObjectAccessor()
delete itr->second; delete itr->second;
} }
Creature*
ObjectAccessor::GetCreatureOrPetOrVehicle(WorldObject const &u, uint64 guid)
{
if(IS_PLAYER_GUID(guid) || !u.IsInWorld())
return NULL;
if(IS_PET_GUID(guid))
return u.GetMap()->GetPet(guid);
if(IS_VEHICLE_GUID(guid))
return u.GetMap()->GetVehicle(guid);
return u.GetMap()->GetCreature(guid);
}
Unit* Unit*
ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid) ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid)
{ {
@ -74,7 +59,10 @@ ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid)
if(IS_PLAYER_GUID(guid)) if(IS_PLAYER_GUID(guid))
return FindPlayer(guid); return FindPlayer(guid);
return GetCreatureOrPetOrVehicle(u, guid); if (!u.IsInWorld())
return NULL;
return u.GetMap()->GetCreatureOrPetOrVehicle(guid);
} }
Corpse* Corpse*

View file

@ -38,7 +38,6 @@
class Creature; class Creature;
class Unit; class Unit;
class GameObject; class GameObject;
class Vehicle;
class WorldObject; class WorldObject;
class Map; class Map;
@ -98,16 +97,14 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton<ObjectAccessor,
static Creature* GetObjectInWorld(uint64 guid, Creature* /*fake*/) { return FindHelper<Creature>(guid); } static Creature* GetObjectInWorld(uint64 guid, Creature* /*fake*/) { return FindHelper<Creature>(guid); }
static GameObject* GetObjectInWorld(uint64 guid, GameObject* /*fake*/) { return FindHelper<GameObject>(guid); } static GameObject* GetObjectInWorld(uint64 guid, GameObject* /*fake*/) { return FindHelper<GameObject>(guid); }
static Pet* GetObjectInWorld(uint64 guid, Pet* /*fake*/) { return FindHelper<Pet>(guid); } static Pet* GetObjectInWorld(uint64 guid, Pet* /*fake*/) { return FindHelper<Pet>(guid); }
static Vehicle* GetObjectInWorld(uint64 guid, Vehicle* /*fake*/) { return FindHelper<Vehicle>(guid); } static Vehicle* GetObjectInWorld(uint64 guid, Vehicle* /*fake*/); // no implementation, link error trap until creature move to Map
static WorldObject* GetWorldObject(WorldObject const &, uint64); static WorldObject* GetWorldObject(WorldObject const &, uint64);
static Object* GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask); static Object* GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask);
static Creature* GetCreatureOrPetOrVehicle(WorldObject const &, uint64);
static Unit* GetUnit(WorldObject const &, uint64); static Unit* GetUnit(WorldObject const &, uint64);
static Player* GetPlayer(Unit const &, uint64 guid) { return FindPlayer(guid); } static Player* GetPlayer(Unit const &, uint64 guid) { return FindPlayer(guid); }
static Corpse* GetCorpse(WorldObject const &u, uint64 guid); static Corpse* GetCorpse(WorldObject const &u, uint64 guid);
static Pet* GetPet(uint64 guid) { return GetObjectInWorld(guid, (Pet*)NULL); } static Pet* GetPet(uint64 guid) { return GetObjectInWorld(guid, (Pet*)NULL); }
static Vehicle* GetVehicle(uint64 guid) { return GetObjectInWorld(guid, (Vehicle*)NULL); }
static Player* FindPlayer(uint64); static Player* FindPlayer(uint64);
Player* FindPlayerByName(const char *name) ; Player* FindPlayerByName(const char *name) ;

View file

@ -130,7 +130,6 @@ ObjectMgr::ObjectMgr()
m_hiCharGuid = 1; m_hiCharGuid = 1;
m_hiCreatureGuid = 1; m_hiCreatureGuid = 1;
m_hiPetGuid = 1; m_hiPetGuid = 1;
m_hiVehicleGuid = 1;
m_hiItemGuid = 1; m_hiItemGuid = 1;
m_hiGoGuid = 1; m_hiGoGuid = 1;
m_hiCorpseGuid = 1; m_hiCorpseGuid = 1;
@ -5685,13 +5684,6 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh)
World::StopNow(ERROR_EXIT_CODE); World::StopNow(ERROR_EXIT_CODE);
} }
return m_hiPetGuid++; return m_hiPetGuid++;
case HIGHGUID_VEHICLE:
if(m_hiVehicleGuid>=0x00FFFFFF)
{
sLog.outError("Vehicle guid overflow!! Can't continue, shutting down server. ");
World::StopNow(ERROR_EXIT_CODE);
}
return m_hiVehicleGuid++;
case HIGHGUID_PLAYER: case HIGHGUID_PLAYER:
if(m_hiCharGuid>=0xFFFFFFFE) if(m_hiCharGuid>=0xFFFFFFFE)
{ {

View file

@ -788,7 +788,6 @@ class ObjectMgr
uint32 m_hiCharGuid; uint32 m_hiCharGuid;
uint32 m_hiCreatureGuid; uint32 m_hiCreatureGuid;
uint32 m_hiPetGuid; uint32 m_hiPetGuid;
uint32 m_hiVehicleGuid;
uint32 m_hiItemGuid; uint32 m_hiItemGuid;
uint32 m_hiGoGuid; uint32 m_hiGoGuid;
uint32 m_hiCorpseGuid; uint32 m_hiCorpseGuid;

View file

@ -276,7 +276,7 @@ void WorldSession::HandlePetNameQuery( WorldPacket & recv_data )
void WorldSession::SendPetNameQuery( uint64 petguid, uint32 petnumber) void WorldSession::SendPetNameQuery( uint64 petguid, uint32 petnumber)
{ {
Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid); Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(petguid);
if(!pet || !pet->GetCharmInfo() || pet->GetCharmInfo()->GetPetNumber() != petnumber) if(!pet || !pet->GetCharmInfo() || pet->GetCharmInfo()->GetPetNumber() != petnumber)
return; return;
@ -308,12 +308,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data )
recv_data >> petguid; recv_data >> petguid;
// FIXME: charmed case Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(petguid);
//Pet* pet = ObjectAccessor::Instance().GetPet(petguid);
if(ObjectAccessor::FindPlayer(petguid))
return;
Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid);
if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm())) if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm()))
{ {
@ -456,8 +451,7 @@ void WorldSession::HandlePetAbandon( WorldPacket & recv_data )
return; return;
// pet/charmed // pet/charmed
Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); if (Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid))
if(pet)
{ {
if(pet->isPet()) if(pet->isPet())
{ {
@ -514,10 +508,7 @@ void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket )
if(!_player->GetPet() && !_player->GetCharm()) if(!_player->GetPet() && !_player->GetCharm())
return; return;
if(ObjectAccessor::FindPlayer(guid)) Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid);
return;
Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid);
if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm())) if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm()))
{ {
@ -561,10 +552,7 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket )
if (!_player->GetPet() && !_player->GetCharm()) if (!_player->GetPet() && !_player->GetCharm())
return; return;
if (GUID_HIPART(guid) == HIGHGUID_PLAYER) Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid);
return;
Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid);
if (!pet || (pet != _player->GetPet() && pet!= _player->GetCharm())) if (!pet || (pet != _player->GetPet() && pet!= _player->GetCharm()))
{ {

View file

@ -2079,7 +2079,7 @@ Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask)
return NULL; return NULL;
// exist (we need look pets also for some interaction (quest/etc) // exist (we need look pets also for some interaction (quest/etc)
Creature *unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); Creature *unit = GetMap()->GetCreatureOrPetOrVehicle(guid);
if (!unit) if (!unit)
return NULL; return NULL;
@ -12159,8 +12159,7 @@ void Player::PrepareQuestMenu( uint64 guid )
QuestRelations* pObjectQIR; QuestRelations* pObjectQIR;
// pets also can have quests // pets also can have quests
Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid))
if( pCreature )
{ {
pObject = (Object*)pCreature; pObject = (Object*)pCreature;
pObjectQR = &objmgr.mCreatureQuestRelations; pObjectQR = &objmgr.mCreatureQuestRelations;
@ -12254,8 +12253,7 @@ void Player::SendPreparedQuest(uint64 guid)
std::string title = ""; std::string title = "";
// need pet case for some quests // need pet case for some quests
Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid))
if (pCreature)
{ {
uint32 textid = pCreature->GetNpcTextId(); uint32 textid = pCreature->GetNpcTextId();
GossipText const* gossiptext = objmgr.GetGossipText(textid); GossipText const* gossiptext = objmgr.GetGossipText(textid);
@ -12318,8 +12316,7 @@ Quest const * Player::GetNextQuest( uint64 guid, Quest const *pQuest )
QuestRelations* pObjectQR; QuestRelations* pObjectQR;
QuestRelations* pObjectQIR; QuestRelations* pObjectQIR;
Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid))
if( pCreature )
{ {
pObject = (Object*)pCreature; pObject = (Object*)pCreature;
pObjectQR = &objmgr.mCreatureQuestRelations; pObjectQR = &objmgr.mCreatureQuestRelations;
@ -18830,7 +18827,7 @@ void Player::UpdateForQuestWorldObjects()
} }
else if(IS_CREATURE_GUID(*itr) || IS_VEHICLE_GUID(*itr)) else if(IS_CREATURE_GUID(*itr) || IS_VEHICLE_GUID(*itr))
{ {
Creature *obj = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr); Creature *obj = GetMap()->GetCreatureOrPetOrVehicle(*itr);
if(!obj) if(!obj)
continue; continue;

View file

@ -645,7 +645,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket
if (IS_CREATURE_OR_PET_GUID(*itr)) if (IS_CREATURE_OR_PET_GUID(*itr))
{ {
// need also pet quests case support // need also pet quests case support
Creature *questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(),*itr); Creature *questgiver = GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(*itr);
if(!questgiver || questgiver->IsHostileTo(_player)) if(!questgiver || questgiver->IsHostileTo(_player))
continue; continue;
if(!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) if(!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER))

View file

@ -458,7 +458,7 @@ void WorldSession::HandlePetCancelAuraOpcode( WorldPacket& recvPacket)
return; return;
} }
Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid); Creature* pet = GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(guid);
if(!pet) if(!pet)
{ {
@ -550,7 +550,7 @@ void WorldSession::HandleSpellClick( WorldPacket & recv_data )
if (_player->isInCombat()) // client prevent click and set different icon at combat state if (_player->isInCombat()) // client prevent click and set different icon at combat state
return; return;
Creature *unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); Creature *unit = _player->GetMap()->GetCreatureOrPetOrVehicle(guid);
if (!unit || unit->isInCombat()) // client prevent click and set different icon at combat state if (!unit || unit->isInCombat()) // client prevent click and set different icon at combat state
return; return;

View file

@ -626,7 +626,7 @@ bool ChatHandler::HandleDebugSpawnVehicle(const char* args)
Vehicle *v = new Vehicle; Vehicle *v = new Vehicle;
Map *map = m_session->GetPlayer()->GetMap(); Map *map = m_session->GetPlayer()->GetMap();
if (!v->Create(objmgr.GenerateLowGuid(HIGHGUID_VEHICLE), map, entry, id, m_session->GetPlayer()->GetTeam())) if (!v->Create(map->GenerateLocalLowGuid(HIGHGUID_VEHICLE), map, entry, id, m_session->GetPlayer()->GetTeam()))
{ {
delete v; delete v;
return false; return false;

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 "8709" #define REVISION_NR "8710"
#endif // __REVISION_NR_H__ #endif // __REVISION_NR_H__