Core/Maps: Moved object respawn time storage from global to map level. This removes unneccessary locking since all objects run within its map's thread.
This commit is contained in:
@@ -0,0 +1,2 @@
|
||||
ALTER TABLE `creature_respawn` ADD `mapId` SMALLINT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `respawnTime`;
|
||||
ALTER TABLE `gameobject_respawn` ADD `mapId` SMALLINT(10) UNSIGNED NOT NULL DEFAULT 0 AFTER `respawnTime`;
|
||||
@@ -486,7 +486,7 @@ void Creature::Update(uint32 diff)
|
||||
break;
|
||||
|
||||
uint64 dbtableHighGuid = MAKE_NEW_GUID(m_DBTableGuid, GetEntry(), HIGHGUID_UNIT);
|
||||
time_t linkedRespawntime = sObjectMgr->GetLinkedRespawnTime(dbtableHighGuid, GetMap()->GetInstanceId());
|
||||
time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid);
|
||||
if (!linkedRespawntime) // Can respawn
|
||||
Respawn();
|
||||
else // the master is dead
|
||||
@@ -1303,7 +1303,7 @@ bool Creature::LoadCreatureFromDB(uint32 guid, Map* map, bool addToMap)
|
||||
m_respawnDelay = data->spawntimesecs;
|
||||
m_deathState = ALIVE;
|
||||
|
||||
m_respawnTime = sObjectMgr->GetCreatureRespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
m_respawnTime = GetMap()->GetCreatureRespawnTime(m_DBTableGuid);
|
||||
if (m_respawnTime) // respawn on Update
|
||||
{
|
||||
m_deathState = DEAD;
|
||||
@@ -1398,7 +1398,7 @@ void Creature::DeleteFromDB()
|
||||
return;
|
||||
}
|
||||
|
||||
sObjectMgr->RemoveCreatureRespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
GetMap()->RemoveCreatureRespawnTime(m_DBTableGuid);
|
||||
sObjectMgr->DeleteCreatureData(m_DBTableGuid);
|
||||
|
||||
SQLTransaction trans = WorldDatabase.BeginTransaction();
|
||||
@@ -1598,7 +1598,7 @@ void Creature::Respawn(bool force)
|
||||
if (getDeathState() == DEAD)
|
||||
{
|
||||
if (m_DBTableGuid)
|
||||
sObjectMgr->RemoveCreatureRespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
GetMap()->RemoveCreatureRespawnTime(m_DBTableGuid);
|
||||
|
||||
sLog->outStaticDebug("Respawning creature %s (GuidLow: %u, Full GUID: " UI64FMTD " Entry: %u)", GetName(), GetGUIDLow(), GetGUID(), GetEntry());
|
||||
m_respawnTime = 0;
|
||||
@@ -2013,7 +2013,7 @@ void Creature::SaveRespawnTime()
|
||||
if (isSummon() || !m_DBTableGuid || (m_creatureData && !m_creatureData->dbData))
|
||||
return;
|
||||
|
||||
sObjectMgr->SaveCreatureRespawnTime(m_DBTableGuid, GetInstanceId(), m_respawnTime);
|
||||
GetMap()->SaveCreatureRespawnTime(m_DBTableGuid, m_respawnTime);
|
||||
}
|
||||
|
||||
// this should not be called by petAI or
|
||||
|
||||
@@ -338,7 +338,7 @@ void GameObject::Update(uint32 diff)
|
||||
if (m_respawnTime <= now) // timer expired
|
||||
{
|
||||
uint64 dbtableHighGuid = MAKE_NEW_GUID(m_DBTableGuid, GetEntry(), HIGHGUID_GAMEOBJECT);
|
||||
time_t linkedRespawntime = sObjectMgr->GetLinkedRespawnTime(dbtableHighGuid, GetMap()->GetInstanceId());
|
||||
time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid);
|
||||
if (linkedRespawntime) // Can't respawn, the master is dead
|
||||
{
|
||||
uint64 targetGuid = sObjectMgr->GetLinkedRespawnGuid(dbtableHighGuid);
|
||||
@@ -761,13 +761,13 @@ bool GameObject::LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap)
|
||||
else
|
||||
{
|
||||
m_respawnDelayTime = data->spawntimesecs;
|
||||
m_respawnTime = sObjectMgr->GetGORespawnTime(m_DBTableGuid, map->GetInstanceId());
|
||||
m_respawnTime = GetMap()->GetGORespawnTime(m_DBTableGuid);
|
||||
|
||||
// ready to respawn
|
||||
if (m_respawnTime && m_respawnTime <= time(NULL))
|
||||
{
|
||||
m_respawnTime = 0;
|
||||
sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
GetMap()->RemoveGORespawnTime(m_DBTableGuid);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -788,7 +788,7 @@ bool GameObject::LoadGameObjectFromDB(uint32 guid, Map* map, bool addToMap)
|
||||
|
||||
void GameObject::DeleteFromDB()
|
||||
{
|
||||
sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
GetMap()->RemoveGORespawnTime(m_DBTableGuid);
|
||||
sObjectMgr->DeleteGOData(m_DBTableGuid);
|
||||
|
||||
PreparedStatement* stmt = WorldDatabase.GetPreparedStatement(WORLD_DEL_GAMEOBJECT);
|
||||
@@ -863,7 +863,7 @@ Unit* GameObject::GetOwner() const
|
||||
void GameObject::SaveRespawnTime()
|
||||
{
|
||||
if (m_goData && m_goData->dbData && m_respawnTime > time(NULL) && m_spawnedByDefault)
|
||||
sObjectMgr->SaveGORespawnTime(m_DBTableGuid, GetInstanceId(), m_respawnTime);
|
||||
GetMap()->SaveGORespawnTime(m_DBTableGuid, m_respawnTime);
|
||||
}
|
||||
|
||||
bool GameObject::IsAlwaysVisibleFor(WorldObject const* seer) const
|
||||
@@ -908,7 +908,7 @@ void GameObject::Respawn()
|
||||
if (m_spawnedByDefault && m_respawnTime > 0)
|
||||
{
|
||||
m_respawnTime = time(NULL);
|
||||
sObjectMgr->RemoveGORespawnTime(m_DBTableGuid, GetInstanceId());
|
||||
GetMap()->RemoveGORespawnTime(m_DBTableGuid);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1872,71 +1872,6 @@ void ObjectMgr::RemoveGameobjectFromGrid(uint32 guid, GameObjectData const* data
|
||||
}
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadCreatureRespawnTimes()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS));
|
||||
if (!result)
|
||||
{
|
||||
sLog->outString(">> Loaded 0 creature respawn time.");
|
||||
sLog->outString();
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 loguid = fields[0].GetUInt32();
|
||||
uint32 respawn_time = fields[1].GetUInt32();
|
||||
uint32 instance = fields[2].GetUInt32();
|
||||
|
||||
_creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = time_t(respawn_time);
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
sLog->outString(">> Loaded %lu creature respawn times in %u ms", (unsigned long)_creatureRespawnTimes.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
sLog->outString();
|
||||
}
|
||||
|
||||
void ObjectMgr::LoadGameobjectRespawnTimes()
|
||||
{
|
||||
uint32 oldMSTime = getMSTime();
|
||||
|
||||
// Remove outdated data
|
||||
CharacterDatabase.DirectExecute("DELETE FROM gameobject_respawn WHERE respawnTime <= UNIX_TIMESTAMP(NOW())");
|
||||
|
||||
uint32 count = 0;
|
||||
|
||||
PreparedQueryResult result = CharacterDatabase.Query(CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS));
|
||||
if (!result)
|
||||
{
|
||||
sLog->outString(">> Loaded 0 gameobject respawn times. DB table `gameobject_respawn` is empty!");
|
||||
sLog->outString();
|
||||
return;
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
|
||||
uint32 loguid = fields[0].GetUInt32();
|
||||
uint32 respawn_time = fields[1].GetUInt32();
|
||||
uint32 instance = fields[2].GetUInt32();
|
||||
|
||||
_goRespawnTimes[MAKE_PAIR64(loguid, instance)] = time_t(respawn_time);
|
||||
|
||||
++count;
|
||||
} while (result->NextRow());
|
||||
|
||||
sLog->outString();
|
||||
sLog->outString(">> Loaded %lu gameobject respawn times in %u ms", (unsigned long)_goRespawnTimes.size(), GetMSTimeDiffToNow(oldMSTime));
|
||||
}
|
||||
|
||||
Player* ObjectMgr::GetPlayerByLowGUID(uint32 lowguid) const
|
||||
{
|
||||
uint64 guid = MAKE_NEW_GUID(lowguid, 0, HIGHGUID_PLAYER);
|
||||
@@ -7172,44 +7107,6 @@ void ObjectMgr::LoadNPCSpellClickSpells()
|
||||
sLog->outString();
|
||||
}
|
||||
|
||||
void ObjectMgr::SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t)
|
||||
{
|
||||
if (!t)
|
||||
{
|
||||
// Delete only
|
||||
RemoveCreatureRespawnTime(loguid, instance);
|
||||
return;
|
||||
}
|
||||
|
||||
// This function can be called from various map threads concurrently
|
||||
{
|
||||
_creatureRespawnTimesMutex.acquire();
|
||||
_creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = t;
|
||||
_creatureRespawnTimesMutex.release();
|
||||
}
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN);
|
||||
stmt->setUInt32(0, loguid);
|
||||
stmt->setUInt32(1, uint32(t));
|
||||
stmt->setUInt32(2, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void ObjectMgr::RemoveCreatureRespawnTime(uint32 loguid, uint32 instance)
|
||||
{
|
||||
// This function can be called from various map threads concurrently
|
||||
{
|
||||
_creatureRespawnTimesMutex.acquire();
|
||||
_creatureRespawnTimes[MAKE_PAIR64(loguid, instance)] = 0;
|
||||
_creatureRespawnTimesMutex.release();
|
||||
}
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN);
|
||||
stmt->setUInt32(0, loguid);
|
||||
stmt->setUInt32(1, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void ObjectMgr::DeleteCreatureData(uint32 guid)
|
||||
{
|
||||
// remove mapid*cellid -> guid_set map
|
||||
@@ -7220,81 +7117,6 @@ void ObjectMgr::DeleteCreatureData(uint32 guid)
|
||||
_creatureDataStore.erase(guid);
|
||||
}
|
||||
|
||||
void ObjectMgr::SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t)
|
||||
{
|
||||
if (!t)
|
||||
{
|
||||
// Delete only
|
||||
RemoveGORespawnTime(loguid, instance);
|
||||
return;
|
||||
}
|
||||
|
||||
// This function can be called from different map threads concurrently
|
||||
{
|
||||
_goRespawnTimesMutex.acquire();
|
||||
_goRespawnTimes[MAKE_PAIR64(loguid, instance)] = t;
|
||||
_goRespawnTimesMutex.release();
|
||||
}
|
||||
|
||||
PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GO_RESPAWN);
|
||||
stmt->setUInt32(0, loguid);
|
||||
stmt->setUInt64(1, uint64(t));
|
||||
stmt->setUInt32(2, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void ObjectMgr::RemoveGORespawnTime(uint32 loguid, uint32 instance)
|
||||
{
|
||||
// This function can be called from different map threads concurrently
|
||||
{
|
||||
_goRespawnTimesMutex.acquire();
|
||||
_goRespawnTimes[MAKE_PAIR64(loguid, instance)] = 0;
|
||||
_goRespawnTimesMutex.release();
|
||||
}
|
||||
|
||||
PreparedStatement *stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN);
|
||||
stmt->setUInt32(0, loguid);
|
||||
stmt->setUInt32(1, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void ObjectMgr::DeleteRespawnTimeForInstance(uint32 instance)
|
||||
{
|
||||
// This function can be called from different map threads concurrently
|
||||
RespawnTimes::iterator next;
|
||||
|
||||
{
|
||||
_goRespawnTimesMutex.acquire();
|
||||
for (RespawnTimes::iterator itr = _goRespawnTimes.begin(); itr != _goRespawnTimes.end(); itr = next)
|
||||
{
|
||||
next = itr;
|
||||
++next;
|
||||
|
||||
if (GUID_HIPART(itr->first) == instance)
|
||||
_goRespawnTimes.erase(itr);
|
||||
}
|
||||
_goRespawnTimesMutex.release();
|
||||
}
|
||||
{
|
||||
_creatureRespawnTimesMutex.acquire();
|
||||
for (RespawnTimes::iterator itr = _creatureRespawnTimes.begin(); itr != _creatureRespawnTimes.end(); itr = next)
|
||||
{
|
||||
next = itr;
|
||||
++next;
|
||||
|
||||
if (GUID_HIPART(itr->first) == instance)
|
||||
_creatureRespawnTimes.erase(itr);
|
||||
}
|
||||
_creatureRespawnTimesMutex.release();
|
||||
}
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE);
|
||||
stmt->setUInt32(0, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE);
|
||||
stmt->setUInt32(0, instance);
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void ObjectMgr::DeleteGOData(uint32 guid)
|
||||
{
|
||||
// remove mapid*cellid -> guid_set map
|
||||
|
||||
@@ -367,8 +367,6 @@ struct CellObjectGuids
|
||||
typedef UNORDERED_MAP<uint32/*cell_id*/, CellObjectGuids> CellObjectGuidsMap;
|
||||
typedef UNORDERED_MAP<uint32/*(mapid, spawnMode) pair*/, CellObjectGuidsMap> MapObjectGuids;
|
||||
|
||||
typedef UNORDERED_MAP<uint64/*(instance, guid) pair*/, time_t> RespawnTimes;
|
||||
|
||||
// Trinity string ranges
|
||||
#define MIN_TRINITY_STRING_ID 1 // 'trinity_string'
|
||||
#define MAX_TRINITY_STRING_ID 2000000000
|
||||
@@ -854,13 +852,11 @@ class ObjectMgr
|
||||
void LoadCreatures();
|
||||
void LoadLinkedRespawn();
|
||||
bool SetCreatureLinkedRespawn(uint32 guid, uint32 linkedGuid);
|
||||
void LoadCreatureRespawnTimes();
|
||||
void LoadCreatureAddons();
|
||||
void LoadCreatureModelInfo();
|
||||
void LoadEquipmentTemplates();
|
||||
void LoadGameObjectLocales();
|
||||
void LoadGameobjects();
|
||||
void LoadGameobjectRespawnTimes();
|
||||
void LoadItemTemplates();
|
||||
void LoadItemLocales();
|
||||
void LoadItemSetNames();
|
||||
@@ -1048,36 +1044,6 @@ class ObjectMgr
|
||||
void AddCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid, uint32 instance);
|
||||
void DeleteCorpseCellData(uint32 mapid, uint32 cellid, uint32 player_guid);
|
||||
|
||||
time_t GetLinkedRespawnTime(uint64 guid, uint32 instance)
|
||||
{
|
||||
uint64 linkedGuid = GetLinkedRespawnGuid(guid);
|
||||
switch (GUID_HIPART(linkedGuid))
|
||||
{
|
||||
case HIGHGUID_UNIT:
|
||||
return GetCreatureRespawnTime(GUID_LOPART(linkedGuid), instance);
|
||||
case HIGHGUID_GAMEOBJECT:
|
||||
return GetGORespawnTime(GUID_LOPART(linkedGuid), instance);
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
time_t GetCreatureRespawnTime(uint32 loguid, uint32 instance)
|
||||
{
|
||||
TRINITY_GUARD(ACE_Thread_Mutex, _creatureRespawnTimesMutex);
|
||||
return _creatureRespawnTimes[MAKE_PAIR64(loguid, instance)];
|
||||
}
|
||||
void SaveCreatureRespawnTime(uint32 loguid, uint32 instance, time_t t);
|
||||
void RemoveCreatureRespawnTime(uint32 loguid, uint32 instance);
|
||||
time_t GetGORespawnTime(uint32 loguid, uint32 instance)
|
||||
{
|
||||
TRINITY_GUARD(ACE_Thread_Mutex, _goRespawnTimesMutex);
|
||||
return _goRespawnTimes[MAKE_PAIR64(loguid, instance)];
|
||||
}
|
||||
void SaveGORespawnTime(uint32 loguid, uint32 instance, time_t t);
|
||||
void RemoveGORespawnTime(uint32 loguid, uint32 instance);
|
||||
void DeleteRespawnTimeForInstance(uint32 instance);
|
||||
|
||||
// grid objects
|
||||
void AddCreatureToGrid(uint32 guid, CreatureData const* data);
|
||||
void RemoveCreatureFromGrid(uint32 guid, CreatureData const* data);
|
||||
@@ -1307,10 +1273,6 @@ class ObjectMgr
|
||||
TrinityStringLocaleContainer _trinityStringLocaleStore;
|
||||
GossipMenuItemsLocaleContainer _gossipMenuItemsLocaleStore;
|
||||
PointOfInterestLocaleContainer _pointOfInterestLocaleStore;
|
||||
RespawnTimes _creatureRespawnTimes;
|
||||
ACE_Thread_Mutex _creatureRespawnTimesMutex;
|
||||
RespawnTimes _goRespawnTimes;
|
||||
ACE_Thread_Mutex _goRespawnTimesMutex;
|
||||
|
||||
CacheVendorItemContainer _cacheVendorItemStore;
|
||||
CacheTrainerSpellContainer _cacheTrainerSpellStore;
|
||||
|
||||
@@ -543,7 +543,7 @@ void InstanceSaveManager::_ResetInstance(uint32 mapid, uint32 instanceId)
|
||||
if (iMap && iMap->IsDungeon())
|
||||
((InstanceMap*)iMap)->Reset(INSTANCE_RESET_RESPAWN_DELAY);
|
||||
|
||||
sObjectMgr->DeleteRespawnTimeForInstance(instanceId); // even if map is not loaded
|
||||
iMap->DeleteRespawnTimes();
|
||||
|
||||
// Free up the instance id and allow it to be reused
|
||||
sMapMgr->FreeInstanceId(instanceId);
|
||||
|
||||
@@ -2632,7 +2632,7 @@ void InstanceMap::UnloadAll()
|
||||
ASSERT(!HavePlayers());
|
||||
|
||||
if (m_resetAfterUnload == true)
|
||||
sObjectMgr->DeleteRespawnTimeForInstance(GetInstanceId());
|
||||
DeleteRespawnTimes();
|
||||
|
||||
Map::UnloadAll();
|
||||
}
|
||||
@@ -2781,3 +2781,128 @@ void Map::UpdateIteratorBack(Player* player)
|
||||
if (m_mapRefIter == player->GetMapRef())
|
||||
m_mapRefIter = m_mapRefIter->nocheck_prev();
|
||||
}
|
||||
|
||||
void Map::SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime)
|
||||
{
|
||||
if (!respawnTime)
|
||||
{
|
||||
// Delete only
|
||||
RemoveCreatureRespawnTime(dbGuid);
|
||||
return;
|
||||
}
|
||||
|
||||
_creatureRespawnTimes[dbGuid] = respawnTime;
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_CREATURE_RESPAWN);
|
||||
stmt->setUInt32(0, dbGuid);
|
||||
stmt->setUInt32(1, uint32(respawnTime));
|
||||
stmt->setUInt16(2, GetId());
|
||||
stmt->setUInt32(3, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void Map::RemoveCreatureRespawnTime(uint32 dbGuid)
|
||||
{
|
||||
_creatureRespawnTimes.erase(dbGuid);
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN);
|
||||
stmt->setUInt32(0, dbGuid);
|
||||
stmt->setUInt16(1, GetId());
|
||||
stmt->setUInt32(2, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void Map::SaveGORespawnTime(uint32 dbGuid, time_t respawnTime)
|
||||
{
|
||||
if (!respawnTime)
|
||||
{
|
||||
// Delete only
|
||||
RemoveGORespawnTime(dbGuid);
|
||||
return;
|
||||
}
|
||||
|
||||
_goRespawnTimes[dbGuid] = respawnTime;
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_GO_RESPAWN);
|
||||
stmt->setUInt32(0, dbGuid);
|
||||
stmt->setUInt32(1, uint32(respawnTime));
|
||||
stmt->setUInt16(2, GetId());
|
||||
stmt->setUInt32(3, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void Map::RemoveGORespawnTime(uint32 dbGuid)
|
||||
{
|
||||
_goRespawnTimes.erase(dbGuid);
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN);
|
||||
stmt->setUInt32(0, dbGuid);
|
||||
stmt->setUInt16(1, GetId());
|
||||
stmt->setUInt32(2, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
void Map::LoadRespawnTimes()
|
||||
{
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CREATURE_RESPAWNS);
|
||||
stmt->setUInt16(0, GetId());
|
||||
stmt->setUInt32(1, GetInstanceId());
|
||||
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
|
||||
{
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
uint32 loguid = fields[0].GetUInt32();
|
||||
uint32 respawnTime = fields[1].GetUInt32();
|
||||
|
||||
_creatureRespawnTimes[loguid] = time_t(respawnTime);
|
||||
} while (result->NextRow());
|
||||
}
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_GO_RESPAWNS);
|
||||
stmt->setUInt16(0, GetId());
|
||||
stmt->setUInt32(1, GetInstanceId());
|
||||
if (PreparedQueryResult result = CharacterDatabase.Query(stmt))
|
||||
{
|
||||
do
|
||||
{
|
||||
Field* fields = result->Fetch();
|
||||
uint32 loguid = fields[0].GetUInt32();
|
||||
uint32 respawnTime = fields[1].GetUInt32();
|
||||
|
||||
_goRespawnTimes[loguid] = time_t(respawnTime);
|
||||
} while (result->NextRow());
|
||||
}
|
||||
}
|
||||
|
||||
void Map::DeleteRespawnTimes()
|
||||
{
|
||||
_creatureRespawnTimes.clear();
|
||||
_goRespawnTimes.clear();
|
||||
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE);
|
||||
stmt->setUInt16(0, GetId());
|
||||
stmt->setUInt32(1, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_GO_RESPAWN_BY_INSTANCE);
|
||||
stmt->setUInt16(0, GetId());
|
||||
stmt->setUInt32(1, GetInstanceId());
|
||||
CharacterDatabase.Execute(stmt);
|
||||
}
|
||||
|
||||
time_t Map::GetLinkedRespawnTime(uint64 guid) const
|
||||
{
|
||||
uint64 linkedGuid = sObjectMgr->GetLinkedRespawnGuid(guid);
|
||||
switch (GUID_HIPART(linkedGuid))
|
||||
{
|
||||
case HIGHGUID_UNIT:
|
||||
return GetCreatureRespawnTime(GUID_LOPART(linkedGuid));
|
||||
case HIGHGUID_GAMEOBJECT:
|
||||
return GetGORespawnTime(GUID_LOPART(linkedGuid));
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return time_t(0);
|
||||
}
|
||||
|
||||
@@ -443,6 +443,36 @@ class Map : public GridRefManager<NGridType>
|
||||
void Insert(const GameObjectModel& mdl) { _dynamicTree.insert(mdl); }
|
||||
bool Contains(const GameObjectModel& mdl) const { return _dynamicTree.contains(mdl);}
|
||||
bool getObjectHitPos(uint32 phasemask, float x1, float y1, float z1, float x2, float y2, float z2, float& rx, float &ry, float& rz, float modifyDist);
|
||||
|
||||
/*
|
||||
RESPAWN TIMES
|
||||
*/
|
||||
time_t GetLinkedRespawnTime(uint64 guid) const;
|
||||
time_t GetCreatureRespawnTime(uint32 dbGuid) const
|
||||
{
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _creatureRespawnTimes.find(dbGuid);
|
||||
if (itr != _creatureRespawnTimes.end())
|
||||
return itr->second;
|
||||
|
||||
return time_t(0);
|
||||
}
|
||||
|
||||
time_t GetGORespawnTime(uint32 dbGuid) const
|
||||
{
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t>::const_iterator itr = _goRespawnTimes.find(dbGuid);
|
||||
if (itr != _goRespawnTimes.end())
|
||||
return itr->second;
|
||||
|
||||
return time_t(0);
|
||||
}
|
||||
|
||||
void SaveCreatureRespawnTime(uint32 dbGuid, time_t respawnTime);
|
||||
void RemoveCreatureRespawnTime(uint32 dbGuid);
|
||||
void SaveGORespawnTime(uint32 dbGuid, time_t respawnTime);
|
||||
void RemoveGORespawnTime(uint32 dbGuid);
|
||||
void LoadRespawnTimes();
|
||||
void DeleteRespawnTimes();
|
||||
|
||||
private:
|
||||
void LoadMapAndVMap(int gx, int gy);
|
||||
void LoadVMap(int gx, int gy);
|
||||
@@ -488,6 +518,7 @@ class Map : public GridRefManager<NGridType>
|
||||
void ScriptsProcess();
|
||||
|
||||
void UpdateActiveCells(const float &x, const float &y, const uint32 t_diff);
|
||||
|
||||
protected:
|
||||
void SetUnloadReferenceLock(const GridCoord &p, bool on) { getNGrid(p.x_coord, p.y_coord)->setUnloadReferenceLock(on); }
|
||||
|
||||
@@ -570,6 +601,9 @@ class Map : public GridRefManager<NGridType>
|
||||
else
|
||||
m_activeNonPlayers.erase(obj);
|
||||
}
|
||||
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _creatureRespawnTimes;
|
||||
UNORDERED_MAP<uint32 /*dbGUID*/, time_t> _goRespawnTimes;
|
||||
};
|
||||
|
||||
enum InstanceResetMethod
|
||||
|
||||
@@ -211,6 +211,8 @@ InstanceMap* MapInstanced::CreateInstance(uint32 InstanceId, InstanceSave* save,
|
||||
InstanceMap* map = new InstanceMap(GetId(), GetGridExpiry(), InstanceId, difficulty, this);
|
||||
ASSERT(map->IsDungeon());
|
||||
|
||||
map->LoadRespawnTimes();
|
||||
|
||||
bool load_data = save != NULL;
|
||||
map->CreateInstanceData(load_data);
|
||||
|
||||
|
||||
@@ -110,6 +110,7 @@ Map* MapManager::CreateBaseMap(uint32 id)
|
||||
else
|
||||
{
|
||||
map = new Map(id, i_gridCleanUpDelay, 0, REGULAR_DIFFICULTY);
|
||||
map->LoadRespawnTimes();
|
||||
}
|
||||
i_maps[id] = map;
|
||||
}
|
||||
|
||||
@@ -129,8 +129,7 @@ namespace Movement
|
||||
void MoveSplineInit::SetFacing(const Unit * target)
|
||||
{
|
||||
args.flags.EnableFacingTarget();
|
||||
//args.facing.target = target->GetObjectGuid().GetRawValue();
|
||||
args.facing.target = target->GetUInt64Value(OBJECT_FIELD_GUID);
|
||||
args.facing.target = target->GetGUID();
|
||||
}
|
||||
|
||||
void MoveSplineInit::SetFacing(float angle)
|
||||
|
||||
@@ -166,8 +166,10 @@ bool OPvPCapturePoint::DelCreature(uint32 type)
|
||||
//if (Map* map = sMapMgr->FindMap(cr->GetMapId()))
|
||||
// map->Remove(cr, false);
|
||||
// delete respawn time for this creature
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN_BY_GUID);
|
||||
PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CREATURE_RESPAWN);
|
||||
stmt->setUInt32(0, guid);
|
||||
stmt->setUInt16(1, cr->GetMapId());
|
||||
stmt->setUInt32(2, 0); // instance id, always 0 for world maps
|
||||
CharacterDatabase.Execute(stmt);
|
||||
|
||||
cr->AddObjectToRemoveList();
|
||||
|
||||
@@ -1410,15 +1410,9 @@ void World::SetInitialWorldSettings()
|
||||
sLog->outString("Loading Creature Addon Data...");
|
||||
sObjectMgr->LoadCreatureAddons(); // must be after LoadCreatureTemplates() and LoadCreatures()
|
||||
|
||||
sLog->outString("Loading Creature Respawn Data..."); // must be after PackInstances()
|
||||
sObjectMgr->LoadCreatureRespawnTimes();
|
||||
|
||||
sLog->outString("Loading Gameobject Data...");
|
||||
sObjectMgr->LoadGameobjects();
|
||||
|
||||
sLog->outString("Loading Gameobject Respawn Data..."); // must be after PackInstances()
|
||||
sObjectMgr->LoadGameobjectRespawnTimes();
|
||||
|
||||
sLog->outString("Loading Creature Linked Respawn...");
|
||||
sObjectMgr->LoadLinkedRespawn(); // must be after LoadCreatures(), LoadGameObjects()
|
||||
|
||||
|
||||
@@ -314,18 +314,17 @@ void CharacterDatabaseConnection::DoPrepareStatements()
|
||||
PREPARE_STATEMENT(CHAR_DEL_OLD_CORPSES, "DELETE FROM corpse WHERE corpseType = 0 OR time < (UNIX_TIMESTAMP(NOW()) - ?)", CONNECTION_ASYNC)
|
||||
|
||||
// Creature respawn
|
||||
PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM creature_respawn", CONNECTION_SYNCH)
|
||||
PREPARE_STATEMENT(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_GUID, "DELETE FROM creature_respawn WHERE guid = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_SEL_CREATURE_RESPAWNS, "SELECT guid, respawnTime FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH)
|
||||
PREPARE_STATEMENT(CHAR_REP_CREATURE_RESPAWN, "REPLACE INTO creature_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN, "DELETE FROM creature_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE, "DELETE FROM creature_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_SEL_MAX_CREATURE_RESPAWNS, "SELECT MAX(respawnTime), instanceId FROM creature_respawn WHERE instanceId > 0 GROUP BY instanceId", CONNECTION_SYNCH)
|
||||
|
||||
// Gameobject respawn
|
||||
PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime, instanceId FROM gameobject_respawn", CONNECTION_SYNCH)
|
||||
PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, instanceId) VALUES (?, ?, ?)", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_SEL_GO_RESPAWNS, "SELECT guid, respawnTime FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH)
|
||||
PREPARE_STATEMENT(CHAR_REP_GO_RESPAWN, "REPLACE INTO gameobject_respawn (guid, respawnTime, mapId, instanceId) VALUES (?, ?, ?, ?)", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN, "DELETE FROM gameobject_respawn WHERE guid = ? AND mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
PREPARE_STATEMENT(CHAR_DEL_GO_RESPAWN_BY_INSTANCE, "DELETE FROM gameobject_respawn WHERE mapId = ? AND instanceId = ?", CONNECTION_ASYNC)
|
||||
|
||||
// GM Tickets
|
||||
PREPARE_STATEMENT(CHAR_SEL_GM_TICKETS, "SELECT ticketId, guid, name, message, createTime, mapId, posX, posY, posZ, lastModifiedTime, closedBy, assignedTo, comment, completed, escalated, viewed FROM gm_tickets", CONNECTION_SYNCH)
|
||||
|
||||
@@ -296,7 +296,6 @@ enum CharacterDatabaseStatements
|
||||
CHAR_SEL_CREATURE_RESPAWNS,
|
||||
CHAR_REP_CREATURE_RESPAWN,
|
||||
CHAR_DEL_CREATURE_RESPAWN,
|
||||
CHAR_DEL_CREATURE_RESPAWN_BY_GUID,
|
||||
CHAR_DEL_CREATURE_RESPAWN_BY_INSTANCE,
|
||||
CHAR_SEL_MAX_CREATURE_RESPAWNS,
|
||||
|
||||
|
||||
Reference in New Issue
Block a user