aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2019-07-15 17:14:58 +0200
committerShauren <shauren.trinity@gmail.com>2021-12-16 01:33:09 +0100
commiteee950cdd7bcbe9443a53ea5c4cce35444a503f7 (patch)
treeeba357353a54d8a6dc308e0a4c732f6459eb1bee /src
parentd5e58cef694d3db65f0a27b93099ae4e517685a4 (diff)
Core/Misc: Various dynspawn cleanup and refactors split off from pooling rewrite:
- Map::RemoveRespawnTime(SpawnObjectType, LowType, doRespawn) split into Map::Respawn and Map::RemoveRespawnTime, without the extra boolean - Map::RemoveRespawnTime(RespawnInfo*) merged into Map::DeleteRespawnInfo(RespawnInfo*) and is now private - Map::DeleteRespawnInfo(void) renamed to Map::UnloadAllRespawnInfos to properly describe what it does - Map::ProcessRespawns now actually saves the delayed respawn time to DB if the respawn was delayed - Map::AddRespawnInfo now takes const reference, and returns success as a boolean - Map::AddRespawnInfo no longer offers an unused "replace" parameter - Map::DeleteRespawnInfo no longer offers a variety of unused private overloads - Map::SaveRespawnTime no longer offers a tantalizing writeDB parameter. Parameter is now called "startup" to properly describe what it does. - Map::SaveRespawnInfoDB now takes RespawnInfo reference instead of all the various fields. Still public because compatibility mode. QQ. - Map::GetWorldObjectBySpawnId sanitized - Map::GetXRespawnTime methods sanitized to all go through Map::GetRespawnTime (cherry picked from commit d60082ae866d77a12a9e6d09dfce27fc1cb5df90)
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp13
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp10
-rw-r--r--src/server/game/Maps/Map.cpp106
-rw-r--r--src/server/game/Maps/Map.h101
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp2
-rw-r--r--src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp4
8 files changed, 120 insertions, 120 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index b8d7dd4c347..91efe5d5312 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -226,7 +226,7 @@ void EscortAI::UpdateAI(uint32 diff)
if (!isEscort)
me->DespawnOrUnsummon(0, 1s);
else
- me->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, me->GetSpawnId(), true);
+ me->GetMap()->Respawn(SPAWN_TYPE_CREATURE, me->GetSpawnId());
}
else
me->DespawnOrUnsummon();
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 12b7b73beb0..39319151a6f 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -2381,7 +2381,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
map = targets.front()->GetMap();
if (map)
- map->RemoveRespawnTime(SpawnObjectType(e.action.respawnData.spawnType), e.action.respawnData.spawnId, true);
+ map->Respawn(SpawnObjectType(e.action.respawnData.spawnType), e.action.respawnData.spawnId);
else
TC_LOG_ERROR("sql.sql", "SmartScript::ProcessAction: Entry " SI64FMTD " SourceType %u, Event %u - tries to respawn by spawnId but does not provide a map", e.entryOrGuid, e.GetScriptType(), e.event_id);
break;
diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp
index 70297006b11..8b62cd89d1d 100644
--- a/src/server/game/Entities/Creature/Creature.cpp
+++ b/src/server/game/Entities/Creature/Creature.cpp
@@ -1906,7 +1906,7 @@ bool Creature::hasInvolvedQuest(uint32 quest_id) const
toUnload.push_back(pair.second);
for (Creature* creature : toUnload)
map->AddObjectToRemoveList(creature);
- map->RemoveRespawnTime(SPAWN_TYPE_CREATURE, spawnId, false, charTrans);
+ map->RemoveRespawnTime(SPAWN_TYPE_CREATURE, spawnId, charTrans);
}
);
@@ -2203,9 +2203,6 @@ void Creature::Respawn(bool force)
if (getDeathState() == DEAD)
{
- if (m_spawnId)
- GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, m_spawnId);
-
TC_LOG_DEBUG("entities.unit", "Respawning creature %s (%s)", GetName().c_str(), GetGUID().ToString().c_str());
m_respawnTime = 0;
ResetPickPocketRefillTimer();
@@ -2244,7 +2241,7 @@ void Creature::Respawn(bool force)
else
{
if (m_spawnId)
- GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, m_spawnId, true);
+ GetMap()->Respawn(SPAWN_TYPE_CREATURE, m_spawnId);
}
TC_LOG_DEBUG("entities.unit", "Respawning creature %s (%s)",
@@ -2575,7 +2572,11 @@ void Creature::SaveRespawnTime(uint32 forceDelay)
if (m_respawnCompatibilityMode)
{
- GetMap()->SaveRespawnTimeDB(SPAWN_TYPE_CREATURE, m_spawnId, m_respawnTime);
+ RespawnInfo ri;
+ ri.type = SPAWN_TYPE_CREATURE;
+ ri.spawnId = m_spawnId;
+ ri.respawnTime = m_respawnTime;
+ GetMap()->SaveRespawnInfoDB(ri);
return;
}
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 394a668a9fa..50ed73a832d 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -1271,7 +1271,7 @@ bool GameObject::LoadFromDB(ObjectGuid::LowType spawnId, Map* map, bool addToMap
toUnload.push_back(pair.second);
for (GameObject* obj : toUnload)
map->AddObjectToRemoveList(obj);
- map->RemoveRespawnTime(SPAWN_TYPE_GAMEOBJECT, spawnId, false, charTrans);
+ map->RemoveRespawnTime(SPAWN_TYPE_GAMEOBJECT, spawnId, charTrans);
}
);
@@ -1386,7 +1386,11 @@ void GameObject::SaveRespawnTime(uint32 forceDelay)
{
if (m_respawnCompatibilityMode)
{
- GetMap()->SaveRespawnTimeDB(SPAWN_TYPE_GAMEOBJECT, m_spawnId, m_respawnTime);
+ RespawnInfo ri;
+ ri.type = SPAWN_TYPE_GAMEOBJECT;
+ ri.spawnId = m_spawnId;
+ ri.respawnTime = m_respawnTime;
+ GetMap()->SaveRespawnInfoDB(ri);
return;
}
@@ -1477,7 +1481,7 @@ void GameObject::Respawn()
if (m_spawnedByDefault && m_respawnTime > 0)
{
m_respawnTime = GameTime::GetGameTime();
- GetMap()->RemoveRespawnTime(SPAWN_TYPE_GAMEOBJECT, m_spawnId, true);
+ GetMap()->Respawn(SPAWN_TYPE_GAMEOBJECT, m_spawnId);
}
}
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index e38256f5bab..fce264a21ea 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -76,7 +76,7 @@ Map::~Map()
// Delete all waiting spawns, else there will be a memory leak
// This doesn't delete from database.
- DeleteRespawnInfo();
+ UnloadAllRespawnInfos();
while (!i_worldObjects.empty())
{
@@ -3214,9 +3214,12 @@ void Map::Respawn(RespawnInfo* info, CharacterDatabaseTransaction dbTrans)
if (!CheckRespawn(info))
{
if (info->respawnTime)
- SaveRespawnTime(info->type, info->spawnId, info->entry, info->respawnTime, info->zoneId, info->gridId, true, true, dbTrans);
+ {
+ _respawnTimes.decrease(info->handle);
+ SaveRespawnInfoDB(*info, dbTrans);
+ }
else
- RemoveRespawnTime(info);
+ DeleteRespawnInfo(info, dbTrans);
return;
}
@@ -3224,23 +3227,13 @@ void Map::Respawn(RespawnInfo* info, CharacterDatabaseTransaction dbTrans)
SpawnObjectType const type = info->type;
uint32 const gridId = info->gridId;
ObjectGuid::LowType const spawnId = info->spawnId;
- RemoveRespawnTime(info);
+ DeleteRespawnInfo(info, dbTrans);
DoRespawn(type, spawnId, gridId);
}
-void Map::Respawn(std::vector<RespawnInfo*>& respawnData, CharacterDatabaseTransaction dbTrans)
+bool Map::AddRespawnInfo(RespawnInfo const& info)
{
- CharacterDatabaseTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction();
- for (RespawnInfo* info : respawnData)
- Respawn(info, trans);
- if (!dbTrans)
- CharacterDatabase.CommitTransaction(trans);
-}
-
-void Map::AddRespawnInfo(RespawnInfo& info, bool replace)
-{
- if (!info.spawnId)
- return;
+ ASSERT(info.spawnId, "Attempt to schedule respawn with zero spawnid (type %u)", uint32(info.type));
RespawnInfoMap& bySpawnIdMap = GetRespawnMapForType(info.type);
@@ -3248,13 +3241,10 @@ void Map::AddRespawnInfo(RespawnInfo& info, bool replace)
if (it != bySpawnIdMap.end()) // spawnid already has a respawn scheduled
{
RespawnInfo* const existing = it->second;
- if (replace || info.respawnTime < existing->respawnTime) // delete existing in this case
+ if (info.respawnTime < existing->respawnTime) // delete existing in this case
DeleteRespawnInfo(existing);
- else // don't delete existing, instead replace respawn time so caller saves the correct time
- {
- info.respawnTime = existing->respawnTime;
- return;
- }
+ else
+ return false;
}
// if we get to this point, we should insert the respawninfo (there either was no prior entry, or it was deleted already)
@@ -3262,6 +3252,7 @@ void Map::AddRespawnInfo(RespawnInfo& info, bool replace)
ri->handle = _respawnTimes.push(ri);
bool success = bySpawnIdMap.emplace(ri->spawnId, ri).second;
ASSERT(success, "Insertion of respawn info with id (%u," UI64FMTD ") into spawn id map failed - state desync.", uint32(ri->type), ri->spawnId);
+ return true;
}
static void PushRespawnInfoFrom(std::vector<RespawnInfo*>& data, RespawnInfoMap const& map, uint32 zoneId)
@@ -3287,7 +3278,7 @@ RespawnInfo* Map::GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawn
return it->second;
}
-void Map::DeleteRespawnInfo() // delete everything
+void Map::UnloadAllRespawnInfos() // delete everything from memory
{
for (RespawnInfo* info : _respawnTimes)
delete info;
@@ -3296,7 +3287,7 @@ void Map::DeleteRespawnInfo() // delete everything
_gameObjectRespawnTimesBySpawnId.clear();
}
-void Map::DeleteRespawnInfo(RespawnInfo* info)
+void Map::DeleteRespawnInfo(RespawnInfo* info, CharacterDatabaseTransaction dbTrans)
{
// Delete from all relevant containers to ensure consistency
ASSERT(info);
@@ -3305,15 +3296,10 @@ void Map::DeleteRespawnInfo(RespawnInfo* info)
size_t const n = GetRespawnMapForType(info->type).erase(info->spawnId);
ASSERT(n == 1, "Respawn stores inconsistent for map %u, spawnid " UI64FMTD " (type %u)", GetId(), info->spawnId, uint32(info->type));
- //respawn heap
+ // respawn heap
_respawnTimes.erase(info->handle);
- // then cleanup the object
- delete info;
-}
-
-void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, CharacterDatabaseTransaction dbTrans)
-{
+ // database
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_RESPAWN);
stmt->setUInt16(0, info->type);
stmt->setUInt64(1, info->spawnId);
@@ -3321,19 +3307,8 @@ void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, CharacterDatabase
stmt->setUInt32(3, GetInstanceId());
CharacterDatabase.ExecuteOrAppend(dbTrans, stmt);
- if (doRespawn)
- Respawn(info);
- else
- DeleteRespawnInfo(info);
-}
-
-void Map::RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn, CharacterDatabaseTransaction dbTrans)
-{
- CharacterDatabaseTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction();
- for (RespawnInfo* info : respawnData)
- RemoveRespawnTime(info, doRespawn, trans);
- if (!dbTrans)
- CharacterDatabase.CommitTransaction(trans);
+ // then cleanup the object
+ delete info;
}
void Map::ProcessRespawns()
@@ -3362,6 +3337,7 @@ void Map::ProcessRespawns()
{
ASSERT(now < next->respawnTime); // infinite loop guard
_respawnTimes.decrease(next->handle);
+ SaveRespawnInfoDB(*next);
}
}
}
@@ -3442,7 +3418,7 @@ bool Map::SpawnGroupSpawn(uint32 groupId, bool ignoreRespawn, bool force, std::v
continue;
// we need to remove the respawn time, otherwise we'd end up double spawning
- RemoveRespawnTime(data->type, data->spawnId, false);
+ RemoveRespawnTime(data->type, data->spawnId);
}
// don't spawn if the grid isn't loaded (will be handled in grid loader)
@@ -4511,12 +4487,15 @@ void Map::UpdateIteratorBack(Player* player)
m_mapRefIter = m_mapRefIter->nocheck_prev();
}
-void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 entry, time_t respawnTime, uint32 zoneId, uint32 gridId, bool writeDB, bool replace, CharacterDatabaseTransaction dbTrans)
+void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 entry, time_t respawnTime, uint32 zoneId, uint32 gridId, CharacterDatabaseTransaction dbTrans, bool startup)
{
+ if (!spawnId)
+ return;
+
if (!respawnTime)
{
// Delete only
- RemoveRespawnTime(type, spawnId, false, dbTrans);
+ RemoveRespawnTime(type, spawnId, dbTrans);
return;
}
@@ -4527,19 +4506,23 @@ void Map::SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uin
ri.respawnTime = respawnTime;
ri.gridId = gridId;
ri.zoneId = zoneId;
- AddRespawnInfo(ri, replace);
+ bool success = AddRespawnInfo(ri);
- if (writeDB)
- SaveRespawnTimeDB(type, spawnId, ri.respawnTime, dbTrans); // might be different from original respawn time if we didn't replace
+ if (startup)
+ {
+ if (!success)
+ TC_LOG_ERROR("maps", "Attempt to load saved respawn %" PRIu64 " for (%u," UI64FMTD ") failed - duplicate respawn? Skipped.", respawnTime, uint32(type), spawnId);
+ }
+ else if (success)
+ SaveRespawnInfoDB(ri, dbTrans);
}
-void Map::SaveRespawnTimeDB(SpawnObjectType type, ObjectGuid::LowType spawnId, time_t respawnTime, CharacterDatabaseTransaction dbTrans)
+void Map::SaveRespawnInfoDB(RespawnInfo const& info, CharacterDatabaseTransaction dbTrans)
{
- // Just here for support of compatibility mode
CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_REP_RESPAWN);
- stmt->setUInt16(0, type);
- stmt->setUInt64(1, spawnId);
- stmt->setInt64(2, respawnTime);
+ stmt->setUInt16(0, info.type);
+ stmt->setUInt64(1, info.spawnId);
+ stmt->setInt64(2, info.respawnTime);
stmt->setUInt16(3, GetId());
stmt->setUInt32(4, GetInstanceId());
CharacterDatabase.ExecuteOrAppend(dbTrans, stmt);
@@ -4559,10 +4542,17 @@ void Map::LoadRespawnTimes()
ObjectGuid::LowType spawnId = fields[1].GetUInt64();
time_t respawnTime = fields[2].GetInt64();
- if (SpawnData const* data = sObjectMgr->GetSpawnData(type, spawnId))
- SaveRespawnTime(type, spawnId, data->id, time_t(respawnTime), GetZoneId(PhasingHandler::GetEmptyPhaseShift(), data->spawnPoint), Trinity::ComputeGridCoord(data->spawnPoint.GetPositionX(), data->spawnPoint.GetPositionY()).GetId(), false);
+ if (type < SPAWN_TYPE_MAX)
+ {
+ if (SpawnData const* data = sObjectMgr->GetSpawnData(type, spawnId))
+ SaveRespawnTime(type, spawnId, data->id, time_t(respawnTime), GetZoneId(PhasingHandler::GetEmptyPhaseShift(), data->spawnPoint), Trinity::ComputeGridCoord(data->spawnPoint.GetPositionX(), data->spawnPoint.GetPositionY()).GetId(), nullptr, true);
+ else
+ TC_LOG_ERROR("maps", "Loading saved respawn time of %" PRIu64 " for spawnid (%u," UI64FMTD ") - spawn does not exist, ignoring", respawnTime, uint32(type), spawnId);
+ }
else
- TC_LOG_ERROR("maps", "Loading saved respawn time of %" PRIu64 " for spawnid (%u," UI64FMTD ") - spawn does not exist, ignoring", respawnTime, uint32(type), spawnId);
+ {
+ TC_LOG_ERROR("maps", "Loading saved respawn time of %" PRIu64 " for spawnid (%u," UI64FMTD ") - invalid spawn type, ignoring", respawnTime, uint32(type), spawnId);
+ }
} while (result->NextRow());
}
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index 8e579b9c1c4..fe85ecf3724 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -454,7 +454,18 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
Transport* GetTransport(ObjectGuid const& guid);
Creature* GetCreatureBySpawnId(ObjectGuid::LowType spawnId) const;
GameObject* GetGameObjectBySpawnId(ObjectGuid::LowType spawnId) const;
- WorldObject* GetWorldObjectBySpawnId(SpawnObjectType type, ObjectGuid::LowType spawnId) const { return (type == SPAWN_TYPE_GAMEOBJECT) ? reinterpret_cast<WorldObject*>(GetGameObjectBySpawnId(spawnId)) : reinterpret_cast<WorldObject*>(GetCreatureBySpawnId(spawnId)); }
+ WorldObject* GetWorldObjectBySpawnId(SpawnObjectType type, ObjectGuid::LowType spawnId) const
+ {
+ switch (type)
+ {
+ case SPAWN_TYPE_CREATURE:
+ return reinterpret_cast<WorldObject*>(GetCreatureBySpawnId(spawnId));
+ case SPAWN_TYPE_GAMEOBJECT:
+ return reinterpret_cast<WorldObject*>(GetGameObjectBySpawnId(spawnId));
+ default:
+ return nullptr;
+ }
+ }
MapStoredObjectTypesContainer& GetObjectsStore() { return _objectsStore; }
@@ -516,26 +527,21 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
RESPAWN TIMES
*/
time_t GetLinkedRespawnTime(ObjectGuid guid) const;
- time_t GetCreatureRespawnTime(ObjectGuid::LowType dbGuid) const
- {
- RespawnInfoMap::const_iterator itr = _creatureRespawnTimesBySpawnId.find(dbGuid);
- return itr != _creatureRespawnTimesBySpawnId.end() ? itr->second->respawnTime : 0;
- }
-
- time_t GetGORespawnTime(ObjectGuid::LowType dbGuid) const
+ time_t GetRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId) const
{
- RespawnInfoMap::const_iterator itr = _gameObjectRespawnTimesBySpawnId.find(dbGuid);
- return itr != _gameObjectRespawnTimesBySpawnId.end() ? itr->second->respawnTime : 0;
+ auto const& map = GetRespawnMapForType(type);
+ auto it = map.find(spawnId);
+ return (it == map.end()) ? 0 : it->second->respawnTime;
}
-
- time_t GetRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId) const { return (type == SPAWN_TYPE_GAMEOBJECT) ? GetGORespawnTime(spawnId) : GetCreatureRespawnTime(spawnId); }
+ time_t GetCreatureRespawnTime(ObjectGuid::LowType spawnId) const { return GetRespawnTime(SPAWN_TYPE_CREATURE, spawnId); }
+ time_t GetGORespawnTime(ObjectGuid::LowType spawnId) const { return GetRespawnTime(SPAWN_TYPE_GAMEOBJECT, spawnId); }
void UpdatePlayerZoneStats(uint32 oldZone, uint32 newZone);
- void SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 entry, time_t respawnTime, uint32 zoneId, uint32 gridId = 0, bool writeDB = true, bool replace = false, CharacterDatabaseTransaction dbTrans = nullptr);
- void SaveRespawnTimeDB(SpawnObjectType type, ObjectGuid::LowType spawnId, time_t respawnTime, CharacterDatabaseTransaction dbTrans = nullptr);
+ void SaveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 entry, time_t respawnTime, uint32 zoneId, uint32 gridId, CharacterDatabaseTransaction dbTrans = nullptr, bool startup = false);
+ void SaveRespawnInfoDB(RespawnInfo const& info, CharacterDatabaseTransaction dbTrans = nullptr);
void LoadRespawnTimes();
- void DeleteRespawnTimes() { DeleteRespawnInfo(); DeleteRespawnTimesInDB(GetId(), GetInstanceId()); }
+ void DeleteRespawnTimes() { UnloadAllRespawnInfos(); DeleteRespawnTimesInDB(GetId(), GetInstanceId()); }
void LoadCorpseData();
void DeleteCorpseData();
@@ -728,45 +734,22 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
bool CheckRespawn(RespawnInfo* info);
void DoRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId, uint32 gridId);
void Respawn(RespawnInfo* info, CharacterDatabaseTransaction dbTrans = nullptr);
- void Respawn(std::vector<RespawnInfo*>& respawnData, CharacterDatabaseTransaction dbTrans = nullptr);
- void AddRespawnInfo(RespawnInfo& info, bool replace = false);
- void DeleteRespawnInfo();
- void DeleteRespawnInfo(RespawnInfo* info);
- void DeleteRespawnInfo(std::vector<RespawnInfo*>& toDelete)
- {
- for (RespawnInfo* info : toDelete)
- DeleteRespawnInfo(info);
- toDelete.clear();
- }
- void DeleteRespawnInfo(SpawnObjectTypeMask types, uint32 zoneId = 0)
- {
- std::vector<RespawnInfo*> v;
- GetRespawnInfo(v, types, zoneId);
- if (!v.empty())
- DeleteRespawnInfo(v);
- }
- void DeleteRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId)
- {
- if (RespawnInfo* info = GetRespawnInfo(type, spawnId))
- DeleteRespawnInfo(info);
- }
+ bool AddRespawnInfo(RespawnInfo const& info);
+ void UnloadAllRespawnInfos();
+ void DeleteRespawnInfo(RespawnInfo* info, CharacterDatabaseTransaction dbTrans = nullptr);
public:
void GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types, uint32 zoneId = 0) const;
RespawnInfo* GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId) const;
- void RemoveRespawnTime(RespawnInfo* info, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr);
- void RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr);
- void RemoveRespawnTime(SpawnObjectTypeMask types = SPAWN_TYPEMASK_ALL, uint32 zoneId = 0, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr)
+ void Respawn(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans = nullptr)
{
- std::vector<RespawnInfo*> v;
- GetRespawnInfo(v, types, zoneId);
- if (!v.empty())
- RemoveRespawnTime(v, doRespawn, dbTrans);
+ if (RespawnInfo* info = GetRespawnInfo(type, spawnId))
+ Respawn(info, dbTrans);
}
- void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, bool doRespawn = false, CharacterDatabaseTransaction dbTrans = nullptr)
+ void RemoveRespawnTime(SpawnObjectType type, ObjectGuid::LowType spawnId, CharacterDatabaseTransaction dbTrans = nullptr)
{
if (RespawnInfo* info = GetRespawnInfo(type, spawnId))
- RemoveRespawnTime(info, doRespawn, dbTrans);
+ DeleteRespawnInfo(info, dbTrans);
}
SpawnGroupTemplateData const* GetSpawnGroupData(uint32 groupId) const;
@@ -819,8 +802,30 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
RespawnListContainer _respawnTimes;
RespawnInfoMap _creatureRespawnTimesBySpawnId;
RespawnInfoMap _gameObjectRespawnTimesBySpawnId;
- RespawnInfoMap& GetRespawnMapForType(SpawnObjectType type) { return (type == SPAWN_TYPE_GAMEOBJECT) ? _gameObjectRespawnTimesBySpawnId : _creatureRespawnTimesBySpawnId; }
- RespawnInfoMap const& GetRespawnMapForType(SpawnObjectType type) const { return (type == SPAWN_TYPE_GAMEOBJECT) ? _gameObjectRespawnTimesBySpawnId : _creatureRespawnTimesBySpawnId; }
+ RespawnInfoMap& GetRespawnMapForType(SpawnObjectType type)
+ {
+ switch (type)
+ {
+ default:
+ ASSERT(false);
+ case SPAWN_TYPE_CREATURE:
+ return _creatureRespawnTimesBySpawnId;
+ case SPAWN_TYPE_GAMEOBJECT:
+ return _gameObjectRespawnTimesBySpawnId;
+ }
+ }
+ RespawnInfoMap const& GetRespawnMapForType(SpawnObjectType type) const
+ {
+ switch (type)
+ {
+ default:
+ ASSERT(false);
+ case SPAWN_TYPE_CREATURE:
+ return _creatureRespawnTimesBySpawnId;
+ case SPAWN_TYPE_GAMEOBJECT:
+ return _gameObjectRespawnTimesBySpawnId;
+ }
+ }
void SetSpawnGroupActive(uint32 groupId, bool state);
std::unordered_set<uint32> _toggledSpawnGroupIds;
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index 793b4f02838..bfb45069900 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -1983,7 +1983,7 @@ public:
uint32 const gridId = Trinity::ComputeGridCoord(player->GetPositionX(), player->GetPositionY()).GetId();
for (RespawnInfo* info : data)
if (info->gridId == gridId)
- player->GetMap()->RemoveRespawnTime(info, true);
+ player->GetMap()->Respawn(info->type, info->spawnId);
}
return true;
diff --git a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
index a5878777142..19a71ccf656 100644
--- a/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
+++ b/src/server/scripts/Northrend/Naxxramas/boss_thaddius.cpp
@@ -337,8 +337,8 @@ struct boss_thaddius : public BossAI
me->SetReactState(REACT_PASSIVE);
// @todo these guys should really be moved to a summon group - this is merely a hack to make them work in dynamic_spawning
- instance->instance->RemoveRespawnTime(SPAWN_TYPE_CREATURE, 130958, true); // Stalagg
- instance->instance->RemoveRespawnTime(SPAWN_TYPE_CREATURE, 130959, true); // Feugen
+ instance->instance->Respawn(SPAWN_TYPE_CREATURE, 130958); // Stalagg
+ instance->instance->Respawn(SPAWN_TYPE_CREATURE, 130959); // Feugen
}
void UpdateAI(uint32 diff) override