This is a patch to add OnPlayerLeave for instances, which can be used just like OnPlayerEnter
this calls OnPlayerLeave before removing him from the map and world, so we can perform actions on him before he leaves.
diff --git a/src/server/game/Instances/InstanceScript.h b/src/server/game/Instances/InstanceScript.h
index 71f1572..b1dfa3d 100755
-- a/src/server/game/Instances/InstanceScript.h
++ b/src/server/game/Instances/InstanceScript.h
@@ -158,6 +158,9 @@ class InstanceScript : public ZoneScript
//Called when a player successfully enters the instance.
virtual void OnPlayerEnter(Player* /*player*/) {}
+ // Called before a player is removed from the instance.
+ virtual void OnPlayerLeave(Player* /*player*/) {} //Handle open / close objects
//use HandleGameObject(0, boolen, GO); in OnObjectCreate in instance scripts
//use HandleGameObject(GUID, boolen, NULL); in any other script
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index 162dd12..97e9417 100755
-- a/src/server/game/Maps/Map.cpp
++ b/src/server/game/Maps/Map.cpp
@@ -2509,6 +2509,10 @@ void InstanceMap::RemovePlayerFromMap(Player* player, bool remove)
+if (i_data)
+ i_data->OnPlayerLeave(player);
if (!m_unloadTimer && m_mapRefManager.getSize() == 1)
m_unloadTimer = m_unloadWhenEmpty ? MIN_UNLOAD_DELAY : std::max(sWorld->getIntConfig(CONFIG_INSTANCE_UNLOAD_DELAY), (uint32)MIN_UNLOAD_DELAY);
Map::RemovePlayerFromMap(player, remove);
SetResetSchedule(true);
}