diff --git a/src/game/CalendarHandler.cpp b/src/game/CalendarHandler.cpp index 9c82b96c6..a3bbda146 100644 --- a/src/game/CalendarHandler.cpp +++ b/src/game/CalendarHandler.cpp @@ -54,7 +54,7 @@ void WorldSession::HandleCalendarGetCalendar(WorldPacket &/*recv_data*/) data << uint32(save->GetMapId()); data << uint32(save->GetDifficulty()); data << uint32(save->GetResetTime() - cur_time); - data << uint64(save->GetInstanceId()); // instance save id as unique instance copy id + data << ObjectGuid(save->GetInstanceGuid()); ++counter; } } diff --git a/src/game/InstanceSaveMgr.h b/src/game/InstanceSaveMgr.h index f4c683891..734aafa57 100644 --- a/src/game/InstanceSaveMgr.h +++ b/src/game/InstanceSaveMgr.h @@ -63,6 +63,7 @@ class InstanceSave InstanceSave objects may be created on player logon but the maps are created and loaded only when a player actually enters the instance. */ uint32 GetInstanceId() const { return m_instanceid; } + ObjectGuid GetInstanceGuid() const { return ObjectGuid(HIGHGUID_INSTANCE, GetInstanceId()); } uint32 GetMapId() const { return m_mapid; } /* Saved when the instance is generated for the first time */ diff --git a/src/game/MapInstanced.cpp b/src/game/MapInstanced.cpp index 6265bc47d..9780d8ede 100644 --- a/src/game/MapInstanced.cpp +++ b/src/game/MapInstanced.cpp @@ -120,7 +120,7 @@ Map* MapInstanced::CreateInstance(Player * player) { // if no instanceId via group members or instance saves is found // the instance will be created for the first time - NewInstanceId = sMapMgr.GenerateInstanceId(); + NewInstanceId = sObjectMgr.GenerateLowGuid(HIGHGUID_INSTANCE); Difficulty diff = player->GetGroup() ? player->GetGroup()->GetDifficulty(IsRaid()) : player->GetDifficulty(IsRaid()); map = CreateInstanceMap(NewInstanceId, diff); diff --git a/src/game/MapManager.cpp b/src/game/MapManager.cpp index 9e301f983..9b12a063a 100644 --- a/src/game/MapManager.cpp +++ b/src/game/MapManager.cpp @@ -55,7 +55,6 @@ void MapManager::Initialize() { InitStateMachine(); - InitMaxInstanceId(); } void MapManager::InitStateMachine() @@ -129,7 +128,7 @@ Map* MapManager::CreateMap(uint32 id, const WorldObject* obj) Map* MapManager::CreateBgMap(uint32 mapid, BattleGround* bg) { Map *m = _createBaseMap(mapid); - ((MapInstanced*)m)->CreateBattleGroundMap(sMapMgr.GenerateInstanceId(), bg); + ((MapInstanced*)m)->CreateBattleGroundMap(sObjectMgr.GenerateLowGuid(HIGHGUID_INSTANCE), bg); return m; } @@ -290,18 +289,6 @@ void MapManager::UnloadAll() } } -void MapManager::InitMaxInstanceId() -{ - i_MaxInstanceId = 0; - - QueryResult *result = CharacterDatabase.Query( "SELECT MAX(id) FROM instance" ); - if( result ) - { - i_MaxInstanceId = result->Fetch()[0].GetUInt32(); - delete result; - } -} - uint32 MapManager::GetNumInstances() { uint32 ret = 0; diff --git a/src/game/MapManager.h b/src/game/MapManager.h index 11100fd7a..a578c2f4b 100644 --- a/src/game/MapManager.h +++ b/src/game/MapManager.h @@ -138,8 +138,6 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton"; } @@ -105,3 +106,4 @@ template uint32 ObjectGuidGenerator::Generate(); template uint32 ObjectGuidGenerator::Generate(); template uint32 ObjectGuidGenerator::Generate(); template uint32 ObjectGuidGenerator::Generate(); +template uint32 ObjectGuidGenerator::Generate(); diff --git a/src/game/ObjectGuid.h b/src/game/ObjectGuid.h index 4fc9bb07c..fb53d3ead 100644 --- a/src/game/ObjectGuid.h +++ b/src/game/ObjectGuid.h @@ -72,6 +72,7 @@ enum HighGuid HIGHGUID_DYNAMICOBJECT = 0xF100, // blizz F100/F500 HIGHGUID_CORPSE = 0xF500, // blizz F100/F500 used second variant to resolve conflict with HIGHGUID_DYNAMICOBJECT HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) + HIGHGUID_INSTANCE = 0x1F42, // blizz 1F42/1F44/1F44/1F47 }; //*** Must be replaced by ObjectGuid use *** @@ -92,6 +93,7 @@ inline bool IsGuidHaveEnPart(uint64 const& guid) case HIGHGUID_DYNAMICOBJECT: case HIGHGUID_CORPSE: case HIGHGUID_MO_TRANSPORT: + case HIGHGUID_INSTANCE: return false; case HIGHGUID_GAMEOBJECT: case HIGHGUID_TRANSPORT: @@ -170,6 +172,7 @@ class MANGOS_DLL_SPEC ObjectGuid bool IsCorpse() const { return GetHigh() == HIGHGUID_CORPSE; } bool IsTransport() const { return GetHigh() == HIGHGUID_TRANSPORT; } bool IsMOTransport() const { return GetHigh() == HIGHGUID_MO_TRANSPORT; } + bool IsInstance() const { return GetHigh() == HIGHGUID_INSTANCE; } static TypeID GetTypeId(HighGuid high) { @@ -186,6 +189,7 @@ class MANGOS_DLL_SPEC ObjectGuid case HIGHGUID_MO_TRANSPORT: return TYPEID_GAMEOBJECT; case HIGHGUID_VEHICLE: return TYPEID_UNIT; // unknown + case HIGHGUID_INSTANCE: default: return TYPEID_OBJECT; } } @@ -211,6 +215,7 @@ class MANGOS_DLL_SPEC ObjectGuid case HIGHGUID_DYNAMICOBJECT: case HIGHGUID_CORPSE: case HIGHGUID_MO_TRANSPORT: + case HIGHGUID_INSTANCE: return false; case HIGHGUID_GAMEOBJECT: case HIGHGUID_TRANSPORT: diff --git a/src/game/ObjectMgr.cpp b/src/game/ObjectMgr.cpp index a49314f22..3b08f0a00 100644 --- a/src/game/ObjectMgr.cpp +++ b/src/game/ObjectMgr.cpp @@ -6166,6 +6166,13 @@ void ObjectMgr::SetHighestGuids() delete result; } + result = CharacterDatabase.Query( "SELECT MAX(id) FROM instance" ); + if( result ) + { + m_InstanceGuids.Set((*result)[0].GetUInt32()+1); + delete result; + } + // Cleanup other tables from nonexistent guids (>=m_hiItemGuid) CharacterDatabase.PExecute("DELETE FROM character_inventory WHERE item >= '%u'", m_ItemGuids.GetNextAfterMaxUsed()); CharacterDatabase.PExecute("DELETE FROM mail_items WHERE item_guid >= '%u'", m_ItemGuids.GetNextAfterMaxUsed()); @@ -6243,6 +6250,8 @@ uint32 ObjectMgr::GenerateLowGuid(HighGuid guidhigh) return m_GameobjectGuids.Generate(); case HIGHGUID_CORPSE: return m_CorpseGuids.Generate(); + case HIGHGUID_INSTANCE: + return m_InstanceGuids.Generate(); default: MANGOS_ASSERT(0); } diff --git a/src/game/ObjectMgr.h b/src/game/ObjectMgr.h index 19285d946..579a618ef 100644 --- a/src/game/ObjectMgr.h +++ b/src/game/ObjectMgr.h @@ -1299,6 +1299,7 @@ class ObjectMgr ObjectGuidGenerator m_ItemGuids; ObjectGuidGenerator m_GameobjectGuids; ObjectGuidGenerator m_CorpseGuids; + ObjectGuidGenerator m_InstanceGuids; QuestMap mQuestTemplates; diff --git a/src/game/Player.cpp b/src/game/Player.cpp index df01f78da..85cea3d76 100644 --- a/src/game/Player.cpp +++ b/src/game/Player.cpp @@ -16583,7 +16583,7 @@ void Player::SendRaidInfo() InstanceSave *save = itr->second.save; data << uint32(save->GetMapId()); // map id data << uint32(save->GetDifficulty()); // difficulty - data << uint64(save->GetInstanceId()); // instance id + data << ObjectGuid(save->GetInstanceGuid());// instance guid data << uint8(1); // expired = 0 data << uint8(0); // extended = 1 data << uint32(save->GetResetTime() - now); // reset time diff --git a/src/game/World.cpp b/src/game/World.cpp index cb92a8d6b..d1a07cdaf 100644 --- a/src/game/World.cpp +++ b/src/game/World.cpp @@ -882,9 +882,6 @@ void World::SetInitialWorldSettings() ///- Initialize config settings LoadConfigSettings(); - ///- Init highest guids before any table loading to prevent using not initialized guids in some code. - sObjectMgr.SetHighestGuids(); - ///- Check the existence of the map files for all races' startup areas. if( !MapManager::ExistMapAndVMap(0,-6240.32f, 331.033f) ||!MapManager::ExistMapAndVMap(0,-8949.95f,-132.493f) @@ -937,13 +934,16 @@ void World::SetInitialWorldSettings() ///- Clean up and pack instances sLog.outString( "Cleaning up instances..." ); - sInstanceSaveMgr.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables + sInstanceSaveMgr.CleanupInstances(); // must be called before `creature_respawn`/`gameobject_respawn` tables sLog.outString( "Packing instances..." ); sInstanceSaveMgr.PackInstances(); sLog.outString( "Packing groups..." ); - sObjectMgr.PackGroupIds(); + sObjectMgr.PackGroupIds(); // must be after CleanupInstances + + ///- Init highest guids before any guid using table loading to prevent using not initialized guids in some code. + sObjectMgr.SetHighestGuids(); // must be after packing instances sLog.outString(); sLog.outString( "Loading Localization strings..." ); diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index 7efc07d83..4bb1bae6c 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 "10639" + #define REVISION_NR "10640" #endif // __REVISION_NR_H__