Well if you take a careful look into Group::ResetInstance you'll surely notice this part:
bool isEmpty = true;
// if the map is loaded, reset it
Map *map = sMapMgr.FindMap(p->GetMapId(), p->GetInstanceId());
if(map && map->IsDungeon() && !(method == INSTANCE_RESET_GROUP_DISBAND && !p->CanReset()))
isEmpty = ((InstanceMap*)map)->Reset(method);
Which is supposed to check wether we can reset or not. The bool there wasn't accidently named 'isEmpty' and equals to the return of InstanceMap::Reset.
if(HavePlayers())
{
if(method == INSTANCE_RESET_ALL)
{
// notify the players to leave the instance so it can be reset
for(MapRefManager::iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)
itr->getSource()->SendResetFailedNotify(GetId());
}
elseInstanceMap::Reset you'll see a part that checks that if we have players there or not, but then comes a tiny problem, it checks what reset method did we send and if it isn't INSTANCE_RESET_ALL it will invalidate the instance. So as a possible solution i would recommend this:
diff --git a/src/game/Map.cpp b/src/game/Map.cpp
index 7c00f9d..77a459d 100644
--- a/src/game/Map.cpp
+++ b/src/game/Map.cpp
@@ -2582,7 +2582,7 @@ bool InstanceMap::Reset(uint8 method)
if(HavePlayers())
{
- if(method == INSTANCE_RESET_ALL)
+ if(method == INSTANCE_RESET_ALL || method == INSTANCE_RESET_CHANGE_DIFFICULTY)
{
// notify the players to leave the instance so it can be reset
for(MapRefManager::iterator itr = m_mapRefManager.begin(); itr != m_mapRefManager.end(); ++itr)