From b942616deda1691919fdff953b1610469f9494bc Mon Sep 17 00:00:00 2001 From: VladimirMangos Date: Thu, 22 Oct 2009 17:23:13 +0400 Subject: [PATCH] [8710] Make vehicle guid counter per-map local. Also update/drop/move to Map some dependent functions. --- src/game/Chat.cpp | 2 +- src/game/GameObject.cpp | 2 +- src/game/Map.cpp | 23 ++++++++++++++++++----- src/game/Map.h | 7 +++++-- src/game/MovementHandler.cpp | 2 +- src/game/ObjectAccessor.cpp | 20 ++++---------------- src/game/ObjectAccessor.h | 5 +---- src/game/ObjectMgr.cpp | 8 -------- src/game/ObjectMgr.h | 1 - src/game/PetHandler.cpp | 22 +++++----------------- src/game/Player.cpp | 13 +++++-------- src/game/QuestHandler.cpp | 2 +- src/game/SpellHandler.cpp | 4 ++-- src/game/debugcmds.cpp | 2 +- src/shared/revision_nr.h | 2 +- 15 files changed, 46 insertions(+), 69 deletions(-) diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index a66c65ca4..5c8afa6c5 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -1778,7 +1778,7 @@ Creature* ChatHandler::getSelectedCreature() if(!m_session) 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) diff --git a/src/game/GameObject.cpp b/src/game/GameObject.cpp index e5253fae5..78d9f3dbe 100644 --- a/src/game/GameObject.cpp +++ b/src/game/GameObject.cpp @@ -79,7 +79,7 @@ void GameObject::RemoveFromWorld() // Remove GO from owner 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); else { diff --git a/src/game/Map.cpp b/src/game/Map.cpp index 594f151ef..83c3143e2 100644 --- a/src/game/Map.cpp +++ b/src/game/Map.cpp @@ -203,7 +203,7 @@ Map::Map(uint32 id, time_t expiry, uint32 InstanceId, uint8 SpawnMode, Map* _par m_activeNonPlayersIter(m_activeNonPlayers.end()), i_gridExpiry(expiry), m_parentMap(_parent ? _parent : this), 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) { @@ -3425,12 +3425,18 @@ Pet* Map::GetPet(uint64 guid) return m_objectsStore.find(guid, (Pet*)NULL); } -Unit* Map::GetCreatureOrPet(uint64 guid) +Creature* Map::GetCreatureOrPetOrVehicle(uint64 guid) { - if (Unit* ret = GetCreature(guid)) - return ret; + if (IS_PLAYER_GUID(guid)) + 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) @@ -3477,6 +3483,13 @@ uint32 Map::GenerateLocalLowGuid(HighGuid guidhigh) World::StopNow(ERROR_EXIT_CODE); } 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: ASSERT(0); } diff --git a/src/game/Map.h b/src/game/Map.h index 88122ba31..d6fb2d5a8 100644 --- a/src/game/Map.h +++ b/src/game/Map.h @@ -37,6 +37,7 @@ #include #include +class Creature; class Unit; class WorldPacket; class InstanceData; @@ -429,7 +430,7 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj Creature* GetCreature(uint64 guid); Vehicle* GetVehicle(uint64 guid); Pet* GetPet(uint64 guid); - Unit* GetCreatureOrPet(uint64 guid); + Creature* GetCreatureOrPetOrVehicle(uint64 guid); GameObject* GetGameObject(uint64 guid); DynamicObject* GetDynamicObject(uint64 guid); @@ -529,7 +530,9 @@ class MANGOS_DLL_SPEC Map : public GridRefManager, public MaNGOS::Obj std::set i_objectsToRemove; std::multimap 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 template diff --git a/src/game/MovementHandler.cpp b/src/game/MovementHandler.cpp index b1e578893..664c11d66 100644 --- a/src/game/MovementHandler.cpp +++ b/src/game/MovementHandler.cpp @@ -505,7 +505,7 @@ void WorldSession::HandleDismissControlledVehicle(WorldPacket &recv_data) _player->m_movementInfo = mi; // 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 vehicle->RemoveSpellsCausingAura(SPELL_AURA_CONTROL_VEHICLE); diff --git a/src/game/ObjectAccessor.cpp b/src/game/ObjectAccessor.cpp index 1001ae9d2..3959d4afb 100644 --- a/src/game/ObjectAccessor.cpp +++ b/src/game/ObjectAccessor.cpp @@ -50,21 +50,6 @@ ObjectAccessor::~ObjectAccessor() 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* ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid) { @@ -74,7 +59,10 @@ ObjectAccessor::GetUnit(WorldObject const &u, uint64 guid) if(IS_PLAYER_GUID(guid)) return FindPlayer(guid); - return GetCreatureOrPetOrVehicle(u, guid); + if (!u.IsInWorld()) + return NULL; + + return u.GetMap()->GetCreatureOrPetOrVehicle(guid); } Corpse* diff --git a/src/game/ObjectAccessor.h b/src/game/ObjectAccessor.h index eb81fed68..931610226 100644 --- a/src/game/ObjectAccessor.h +++ b/src/game/ObjectAccessor.h @@ -38,7 +38,6 @@ class Creature; class Unit; class GameObject; -class Vehicle; class WorldObject; class Map; @@ -98,16 +97,14 @@ class MANGOS_DLL_DECL ObjectAccessor : public MaNGOS::Singleton(guid); } static GameObject* GetObjectInWorld(uint64 guid, GameObject* /*fake*/) { return FindHelper(guid); } static Pet* GetObjectInWorld(uint64 guid, Pet* /*fake*/) { return FindHelper(guid); } - static Vehicle* GetObjectInWorld(uint64 guid, Vehicle* /*fake*/) { return FindHelper(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 Object* GetObjectByTypeMask(WorldObject const &, uint64, uint32 typemask); - static Creature* GetCreatureOrPetOrVehicle(WorldObject const &, uint64); static Unit* GetUnit(WorldObject const &, uint64); static Player* GetPlayer(Unit const &, uint64 guid) { return FindPlayer(guid); } static Corpse* GetCorpse(WorldObject const &u, uint64 guid); static Pet* GetPet(uint64 guid) { return GetObjectInWorld(guid, (Pet*)NULL); } - static Vehicle* GetVehicle(uint64 guid) { return GetObjectInWorld(guid, (Vehicle*)NULL); } static Player* FindPlayer(uint64); Player* FindPlayerByName(const char *name) ; diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index d13b2146c..f21cfdbd1 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -130,7 +130,6 @@ ObjectMgr::ObjectMgr() m_hiCharGuid = 1; m_hiCreatureGuid = 1; m_hiPetGuid = 1; - m_hiVehicleGuid = 1; m_hiItemGuid = 1; m_hiGoGuid = 1; m_hiCorpseGuid = 1; @@ -5685,13 +5684,6 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh) World::StopNow(ERROR_EXIT_CODE); } 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: if(m_hiCharGuid>=0xFFFFFFFE) { diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index f34479ca6..f1c69b261 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -788,7 +788,6 @@ class ObjectMgr uint32 m_hiCharGuid; uint32 m_hiCreatureGuid; uint32 m_hiPetGuid; - uint32 m_hiVehicleGuid; uint32 m_hiItemGuid; uint32 m_hiGoGuid; uint32 m_hiCorpseGuid; diff --git a/src/game/PetHandler.cpp b/src/game/PetHandler.cpp index 9e95dfc78..83741cfec 100644 --- a/src/game/PetHandler.cpp +++ b/src/game/PetHandler.cpp @@ -276,7 +276,7 @@ void WorldSession::HandlePetNameQuery( WorldPacket & recv_data ) 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) return; @@ -308,12 +308,7 @@ void WorldSession::HandlePetSetAction( WorldPacket & recv_data ) recv_data >> petguid; - // FIXME: charmed case - //Pet* pet = ObjectAccessor::Instance().GetPet(petguid); - if(ObjectAccessor::FindPlayer(petguid)) - return; - - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid); + Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(petguid); if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm())) { @@ -456,8 +451,7 @@ void WorldSession::HandlePetAbandon( WorldPacket & recv_data ) return; // pet/charmed - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid); - if(pet) + if (Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid)) { if(pet->isPet()) { @@ -514,10 +508,7 @@ void WorldSession::HandlePetSpellAutocastOpcode( WorldPacket& recvPacket ) if(!_player->GetPet() && !_player->GetCharm()) return; - if(ObjectAccessor::FindPlayer(guid)) - return; - - Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid); + Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid); if(!pet || (pet != _player->GetPet() && pet != _player->GetCharm())) { @@ -561,10 +552,7 @@ void WorldSession::HandlePetCastSpellOpcode( WorldPacket& recvPacket ) if (!_player->GetPet() && !_player->GetCharm()) return; - if (GUID_HIPART(guid) == HIGHGUID_PLAYER) - return; - - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid); + Creature* pet = _player->GetMap()->GetCreatureOrPetOrVehicle(guid); if (!pet || (pet != _player->GetPet() && pet!= _player->GetCharm())) { diff --git a/src/game/Player.cpp b/src/game/Player.cpp index 7d7069ed1..0d6bd4b76 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -2079,7 +2079,7 @@ Creature* Player::GetNPCIfCanInteractWith(uint64 guid, uint32 npcflagmask) return NULL; // exist (we need look pets also for some interaction (quest/etc) - Creature *unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); + Creature *unit = GetMap()->GetCreatureOrPetOrVehicle(guid); if (!unit) return NULL; @@ -12159,8 +12159,7 @@ void Player::PrepareQuestMenu( uint64 guid ) QuestRelations* pObjectQIR; // pets also can have quests - Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, guid); - if( pCreature ) + if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid)) { pObject = (Object*)pCreature; pObjectQR = &objmgr.mCreatureQuestRelations; @@ -12254,8 +12253,7 @@ void Player::SendPreparedQuest(uint64 guid) std::string title = ""; // need pet case for some quests - Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); - if (pCreature) + if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid)) { uint32 textid = pCreature->GetNpcTextId(); GossipText const* gossiptext = objmgr.GetGossipText(textid); @@ -12318,8 +12316,7 @@ Quest const * Player::GetNextQuest( uint64 guid, Quest const *pQuest ) QuestRelations* pObjectQR; QuestRelations* pObjectQIR; - Creature *pCreature = ObjectAccessor::GetCreatureOrPetOrVehicle(*this,guid); - if( pCreature ) + if (Creature *pCreature = GetMap()->GetCreatureOrPetOrVehicle(guid)) { pObject = (Object*)pCreature; pObjectQR = &objmgr.mCreatureQuestRelations; @@ -18830,7 +18827,7 @@ void Player::UpdateForQuestWorldObjects() } else if(IS_CREATURE_GUID(*itr) || IS_VEHICLE_GUID(*itr)) { - Creature *obj = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, *itr); + Creature *obj = GetMap()->GetCreatureOrPetOrVehicle(*itr); if(!obj) continue; diff --git a/src/game/QuestHandler.cpp b/src/game/QuestHandler.cpp index 5f105b411..ad42c75b7 100644 --- a/src/game/QuestHandler.cpp +++ b/src/game/QuestHandler.cpp @@ -645,7 +645,7 @@ void WorldSession::HandleQuestgiverStatusMultipleQuery(WorldPacket& /*recvPacket if (IS_CREATURE_OR_PET_GUID(*itr)) { // need also pet quests case support - Creature *questgiver = ObjectAccessor::GetCreatureOrPetOrVehicle(*GetPlayer(),*itr); + Creature *questgiver = GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(*itr); if(!questgiver || questgiver->IsHostileTo(_player)) continue; if(!questgiver->HasFlag(UNIT_NPC_FLAGS, UNIT_NPC_FLAG_QUESTGIVER)) diff --git a/src/game/SpellHandler.cpp b/src/game/SpellHandler.cpp index 85d600e7b..f6b9e5efc 100644 --- a/src/game/SpellHandler.cpp +++ b/src/game/SpellHandler.cpp @@ -458,7 +458,7 @@ void WorldSession::HandlePetCancelAuraOpcode( WorldPacket& recvPacket) return; } - Creature* pet=ObjectAccessor::GetCreatureOrPetOrVehicle(*_player,guid); + Creature* pet = GetPlayer()->GetMap()->GetCreatureOrPetOrVehicle(guid); 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 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 return; diff --git a/src/game/debugcmds.cpp b/src/game/debugcmds.cpp index d0f186f89..75aa9c37f 100644 --- a/src/game/debugcmds.cpp +++ b/src/game/debugcmds.cpp @@ -626,7 +626,7 @@ bool ChatHandler::HandleDebugSpawnVehicle(const char* args) Vehicle *v = new Vehicle; 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; return false; diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index b20b38f25..51b1be8ca 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "8709" + #define REVISION_NR "8710" #endif // __REVISION_NR_H__