[10640] Implement instance guids with proper HIGHGUID_INSTANCE use.

Signed-off-by: VladimirMangos <vladimir@getmangos.com>
This commit is contained in:
Tasssadar 2010-10-24 14:39:26 +04:00 committed by VladimirMangos
parent 365c4a19e0
commit d53fe93e9d
12 changed files with 28 additions and 27 deletions

View file

@ -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;
}
}

View file

@ -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 */

View file

@ -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);

View file

@ -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;

View file

@ -138,8 +138,6 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
TransportMap m_TransportsByMap;
bool CanPlayerEnter(uint32 mapid, Player* player);
uint32 GenerateInstanceId() { return ++i_MaxInstanceId; }
void InitMaxInstanceId();
void InitializeVisibilityDistanceInfo();
/* statistics */
@ -174,8 +172,6 @@ class MANGOS_DLL_DECL MapManager : public MaNGOS::Singleton<MapManager, MaNGOS::
uint32 i_gridCleanUpDelay;
MapMapType i_maps;
IntervalTimer i_timer;
uint32 i_MaxInstanceId;
};
#define sMapMgr MapManager::Instance()

View file

@ -37,6 +37,7 @@ char const* ObjectGuid::GetTypeName(HighGuid high)
case HIGHGUID_DYNAMICOBJECT:return "DynObject";
case HIGHGUID_CORPSE: return "Corpse";
case HIGHGUID_MO_TRANSPORT: return "MoTransport";
case HIGHGUID_INSTANCE: return "InstanceID";
default:
return "<unknown>";
}
@ -105,3 +106,4 @@ template uint32 ObjectGuidGenerator<HIGHGUID_PET>::Generate();
template uint32 ObjectGuidGenerator<HIGHGUID_VEHICLE>::Generate();
template uint32 ObjectGuidGenerator<HIGHGUID_DYNAMICOBJECT>::Generate();
template uint32 ObjectGuidGenerator<HIGHGUID_CORPSE>::Generate();
template uint32 ObjectGuidGenerator<HIGHGUID_INSTANCE>::Generate();

View file

@ -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:

View file

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

View file

@ -1299,6 +1299,7 @@ class ObjectMgr
ObjectGuidGenerator<HIGHGUID_ITEM> m_ItemGuids;
ObjectGuidGenerator<HIGHGUID_GAMEOBJECT> m_GameobjectGuids;
ObjectGuidGenerator<HIGHGUID_CORPSE> m_CorpseGuids;
ObjectGuidGenerator<HIGHGUID_INSTANCE> m_InstanceGuids;
QuestMap mQuestTemplates;

View file

@ -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

View file

@ -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)
@ -943,7 +940,10 @@ void World::SetInitialWorldSettings()
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..." );

View file

@ -1,4 +1,4 @@
#ifndef __REVISION_NR_H__
#define __REVISION_NR_H__
#define REVISION_NR "10639"
#define REVISION_NR "10640"
#endif // __REVISION_NR_H__