aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorjackpoz <giacomopoz@gmail.com>2014-01-03 18:09:52 +0100
committerjackpoz <giacomopoz@gmail.com>2014-01-03 18:56:11 +0100
commit1f170c99efec6c89b9a454a3aa17511341f61659 (patch)
tree3fa4dd1ce0f93848572573244d8fe385fa646f13
parent9d6904f03d67e6feddcbd77f9d74cd4f3b9c38ad (diff)
Core/Instances: Fix Instance binding
Fix players not being bound to instance if the group was disbanded before killing any boss. Fixes #437
-rw-r--r--src/server/game/Groups/Group.cpp2
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.cpp11
-rw-r--r--src/server/game/Instances/InstanceSaveMgr.h1
-rw-r--r--src/server/game/Maps/Map.cpp1
4 files changed, 14 insertions, 1 deletions
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index c6907d125c0..354f00a9e91 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1960,7 +1960,7 @@ void Group::ResetInstances(uint8 method, bool isRaid, Player* SendMsgTo)
if (isEmpty || method == INSTANCE_RESET_GROUP_DISBAND || method == INSTANCE_RESET_CHANGE_DIFFICULTY)
{
// do not reset the instance, just unbind if others are permanently bound to it
- if (instanceSave->CanReset())
+ if (isEmpty && instanceSave->CanReset())
instanceSave->DeleteFromDB();
else
{
diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp
index a6690a7e0b3..e37e6847bdd 100644
--- a/src/server/game/Instances/InstanceSaveMgr.cpp
+++ b/src/server/game/Instances/InstanceSaveMgr.cpp
@@ -161,6 +161,12 @@ void InstanceSaveManager::RemoveInstanceSave(uint32 InstanceId)
}
}
+void InstanceSaveManager::UnloadInstanceSave(uint32 InstanceId)
+{
+ if (InstanceSave* save = GetInstanceSave(InstanceId))
+ save->UnloadIfEmpty();
+}
+
InstanceSave::InstanceSave(uint16 MapId, uint32 InstanceId, Difficulty difficulty, time_t resetTime, bool canReset)
: m_resetTime(resetTime), m_instanceid(InstanceId), m_mapid(MapId),
m_difficulty(difficulty), m_canReset(canReset), m_toDelete(false) { }
@@ -232,6 +238,11 @@ bool InstanceSave::UnloadIfEmpty()
{
if (m_playerList.empty() && m_groupList.empty())
{
+ // don't remove the save if there are still players inside the map
+ if (Map* map = sMapMgr->FindMap(GetMapId(), GetInstanceId()))
+ if (map->HavePlayers())
+ return true;
+
if (!sInstanceSaveMgr->lock_instLists)
sInstanceSaveMgr->RemoveInstanceSave(GetInstanceId());
diff --git a/src/server/game/Instances/InstanceSaveMgr.h b/src/server/game/Instances/InstanceSaveMgr.h
index 85c9e081db5..7a89e6488f0 100644
--- a/src/server/game/Instances/InstanceSaveMgr.h
+++ b/src/server/game/Instances/InstanceSaveMgr.h
@@ -195,6 +195,7 @@ class InstanceSaveManager
InstanceSave* AddInstanceSave(uint32 mapId, uint32 instanceId, Difficulty difficulty, time_t resetTime,
bool canReset, bool load = false);
void RemoveInstanceSave(uint32 InstanceId);
+ void UnloadInstanceSave(uint32 InstanceId);
static void DeleteInstanceFromDB(uint32 instanceid);
InstanceSave* GetInstanceSave(uint32 InstanceId);
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 39d989ef9bc..21e282cfcf4 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -2863,6 +2863,7 @@ void InstanceMap::RemovePlayerFromMap(Player* player, bool remove)
Map::RemovePlayerFromMap(player, remove);
// for normal instances schedule the reset after all players have left
SetResetSchedule(true);
+ sInstanceSaveMgr->UnloadInstanceSave(GetInstanceId());
}
void InstanceMap::CreateInstanceData(bool load)