aboutsummaryrefslogtreecommitdiff
path: root/src/server/game
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-01-07 19:47:13 +0100
committerTreeston <treeston.mmoc@gmail.com>2018-01-07 19:53:39 +0100
commit3bb33e3108c65ba8a1c35b934526562aa542b63b (patch)
treeb67a8438e1947701c131dd6734e2b90eca80c310 /src/server/game
parent38d0c1e940bd8679e42e5336118c5b9fc65a3cdf (diff)
Core/Map: New Map::ForceRespawn to override objections and force a respawn (equivalent to force = true). Use this to fix various GM commands.
Scripts/Valithria: Fix an issue that could get the encounter stuck in an unloaded state.
Diffstat (limited to 'src/server/game')
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp13
-rw-r--r--src/server/game/Maps/Map.cpp8
-rw-r--r--src/server/game/Maps/Map.h18
3 files changed, 23 insertions, 16 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
index badf41abde8..504226a2c2a 100644
--- a/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
+++ b/src/server/game/AI/ScriptedAI/ScriptedEscortAI.cpp
@@ -219,7 +219,7 @@ void EscortAI::UpdateAI(uint32 diff)
}
// Check if player or any member of his group is within range
- if (_despawnAtFar && HasEscortState(STATE_ESCORT_ESCORTING) && _playerGUID && !me->GetVictim() && !HasEscortState(STATE_ESCORT_RETURNING))
+ if (_despawnAtFar && HasEscortState(STATE_ESCORT_ESCORTING) && _playerGUID && !me->IsEngaged() && !HasEscortState(STATE_ESCORT_RETURNING))
{
if (_playerCheckTimer <= diff)
{
@@ -231,10 +231,13 @@ void EscortAI::UpdateAI(uint32 diff)
if (CreatureData const* creatureData = me->GetCreatureData())
isEscort = (sWorld->getBoolConfig(CONFIG_RESPAWN_DYNAMIC_ESCORTNPC) && (creatureData->spawnGroupData->flags & SPAWNGROUP_FLAG_ESCORTQUESTNPC));
- if (_instantRespawn && !isEscort)
- me->DespawnOrUnsummon(0, Seconds(1));
- else if (_instantRespawn && isEscort)
- me->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, me->GetSpawnId(), true);
+ if (_instantRespawn)
+ {
+ if (!isEscort)
+ me->DespawnOrUnsummon(0, 1s);
+ else
+ me->GetMap()->RemoveRespawnTime(SPAWN_TYPE_CREATURE, me->GetSpawnId(), true);
+ }
else
me->DespawnOrUnsummon();
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index f8d122f99f5..9e55fbddb7c 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -3050,7 +3050,7 @@ void Map::Respawn(RespawnInfo* info, bool force, SQLTransaction dbTrans)
DoRespawn(type, spawnId, gridId);
}
-void Map::Respawn(RespawnVector& respawnData, bool force, SQLTransaction dbTrans)
+void Map::Respawn(std::vector<RespawnInfo*>& respawnData, bool force, SQLTransaction dbTrans)
{
SQLTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction();
for (RespawnInfo* info : respawnData)
@@ -3086,13 +3086,13 @@ void Map::AddRespawnInfo(RespawnInfo& info, bool replace)
ASSERT(success, "Insertion of respawn info with id (%u,%u) into spawn id map failed - state desync.", uint32(ri->type), ri->spawnId);
}
-static void PushRespawnInfoFrom(RespawnVector& data, RespawnInfoMap const& map, uint32 zoneId)
+static void PushRespawnInfoFrom(std::vector<RespawnInfo*>& data, RespawnInfoMap const& map, uint32 zoneId)
{
for (auto const& pair : map)
if (!zoneId || pair.second->zoneId == zoneId)
data.push_back(pair.second);
}
-void Map::GetRespawnInfo(RespawnVector& respawnData, SpawnObjectTypeMask types, uint32 zoneId) const
+void Map::GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types, uint32 zoneId) const
{
if (types & SPAWN_TYPEMASK_CREATURE)
PushRespawnInfoFrom(respawnData, _creatureRespawnTimesBySpawnId, zoneId);
@@ -3160,7 +3160,7 @@ void Map::RemoveRespawnTime(RespawnInfo* info, bool doRespawn, SQLTransaction db
DeleteRespawnInfo(info);
}
-void Map::RemoveRespawnTime(RespawnVector& respawnData, bool doRespawn, SQLTransaction dbTrans)
+void Map::RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn, SQLTransaction dbTrans)
{
SQLTransaction trans = dbTrans ? dbTrans : CharacterDatabase.BeginTransaction();
for (RespawnInfo* info : respawnData)
diff --git a/src/server/game/Maps/Map.h b/src/server/game/Maps/Map.h
index b4b78399457..c800a069d55 100644
--- a/src/server/game/Maps/Map.h
+++ b/src/server/game/Maps/Map.h
@@ -283,7 +283,6 @@ typedef std::unordered_map<uint32 /*zoneId*/, ZoneDynamicInfo> ZoneDynamicInfoMa
typedef boost::heap::fibonacci_heap<RespawnInfo*, boost::heap::compare<CompareRespawnInfo>> RespawnListContainer;
typedef RespawnListContainer::handle_type RespawnListHandle;
typedef std::unordered_map<uint32, RespawnInfo*> RespawnInfoMap;
-typedef std::vector<RespawnInfo*> RespawnVector;
struct RespawnInfo
{
SpawnObjectType type;
@@ -751,11 +750,11 @@ 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, bool force = false, SQLTransaction dbTrans = nullptr);
- void Respawn(RespawnVector& respawnData, bool force = false, SQLTransaction dbTrans = nullptr);
+ void Respawn(std::vector<RespawnInfo*>& respawnData, bool force = false, SQLTransaction dbTrans = nullptr);
void AddRespawnInfo(RespawnInfo& info, bool replace = false);
void DeleteRespawnInfo();
void DeleteRespawnInfo(RespawnInfo* info);
- void DeleteRespawnInfo(RespawnVector& toDelete)
+ void DeleteRespawnInfo(std::vector<RespawnInfo*>& toDelete)
{
for (RespawnInfo* info : toDelete)
DeleteRespawnInfo(info);
@@ -763,7 +762,7 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
}
void DeleteRespawnInfo(SpawnObjectTypeMask types, uint32 zoneId = 0)
{
- RespawnVector v;
+ std::vector<RespawnInfo*> v;
GetRespawnInfo(v, types, zoneId);
if (!v.empty())
DeleteRespawnInfo(v);
@@ -775,13 +774,18 @@ class TC_GAME_API Map : public GridRefManager<NGridType>
}
public:
- void GetRespawnInfo(RespawnVector& respawnData, SpawnObjectTypeMask types, uint32 zoneId = 0) const;
+ void GetRespawnInfo(std::vector<RespawnInfo*>& respawnData, SpawnObjectTypeMask types, uint32 zoneId = 0) const;
RespawnInfo* GetRespawnInfo(SpawnObjectType type, ObjectGuid::LowType spawnId) const;
+ void ForceRespawn(SpawnObjectType type, ObjectGuid::LowType spawnId)
+ {
+ if (RespawnInfo* info = GetRespawnInfo(type, spawnId))
+ Respawn(info, true);
+ }
void RemoveRespawnTime(RespawnInfo* info, bool doRespawn = false, SQLTransaction dbTrans = nullptr);
- void RemoveRespawnTime(RespawnVector& respawnData, bool doRespawn = false, SQLTransaction dbTrans = nullptr);
+ void RemoveRespawnTime(std::vector<RespawnInfo*>& respawnData, bool doRespawn = false, SQLTransaction dbTrans = nullptr);
void RemoveRespawnTime(SpawnObjectTypeMask types = SPAWN_TYPEMASK_ALL, uint32 zoneId = 0, bool doRespawn = false, SQLTransaction dbTrans = nullptr)
{
- RespawnVector v;
+ std::vector<RespawnInfo*> v;
GetRespawnInfo(v, types, zoneId);
if (!v.empty())
RemoveRespawnTime(v, doRespawn, dbTrans);