diff --git a/src/server/game/Instances/InstanceSaveMgr.cpp b/src/server/game/Instances/InstanceSaveMgr.cpp index a8f3bc15b..5cb7d3f59 100644 --- a/src/server/game/Instances/InstanceSaveMgr.cpp +++ b/src/server/game/Instances/InstanceSaveMgr.cpp @@ -137,6 +137,8 @@ bool InstanceSaveMgr::DeleteInstanceSaveIfNeeded(InstanceSave* save, bool skipMa // clear respawn times (if map is loaded do it just to be sure, if already unloaded it won't do it by itself) Map::DeleteRespawnTimesInDB(save->GetMapId(), save->GetInstanceId()); + sScriptMgr->OnInstanceIdRemoved(save->GetInstanceId()); + if (deleteSave) { delete save; @@ -529,6 +531,8 @@ void InstanceSaveMgr::_ResetSave(InstanceSaveHashMap::iterator& itr) if (!sMapMgr->FindMap(itr->second->GetMapId(), itr->second->GetInstanceId())) Map::DeleteRespawnTimesInDB(itr->second->GetMapId(), itr->second->GetInstanceId()); + sScriptMgr->OnInstanceIdRemoved(itr->second->GetInstanceId()); + delete itr->second; m_instanceSaveById.erase(itr); } diff --git a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp index ed9214a30..f20e9515c 100644 --- a/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp +++ b/src/server/game/Scripting/ScriptDefines/GlobalScript.cpp @@ -176,3 +176,16 @@ bool ScriptMgr::OnAllowedForPlayerLootCheck(Player const* player, ObjectGuid sou return true; } + +/** + * @brief Called when an instance Id is deleted, usually because it expired or no players are bound to it anymore. + * + * @param instanceId The unique id of the instance + */ +void ScriptMgr::OnInstanceIdRemoved(uint32 instanceId) +{ + ExecuteScript([&](GlobalScript* script) + { + script->OnInstanceIdRemoved(instanceId); + }); +} diff --git a/src/server/game/Scripting/ScriptMgr.h b/src/server/game/Scripting/ScriptMgr.h index 8c30b28d8..450ecc630 100644 --- a/src/server/game/Scripting/ScriptMgr.h +++ b/src/server/game/Scripting/ScriptMgr.h @@ -1594,6 +1594,9 @@ public: // Called when checking if a player can see the creature loot virtual bool OnAllowedForPlayerLootCheck(Player const* /*player*/, ObjectGuid /*source*/) { return false; }; + + // Called when instance id is removed from database (e.g. instance reset) + virtual void OnInstanceIdRemoved(uint32 /*instanceId*/) { } }; class BGScript : public ScriptObject @@ -2427,6 +2430,7 @@ public: /* GlobalScript */ bool OnSpellHealingBonusTakenNegativeModifiers(Unit const* target, Unit const* caster, SpellInfo const* spellInfo, float& val); void OnLoadSpellCustomAttr(SpellInfo* spell); bool OnAllowedForPlayerLootCheck(Player const* player, ObjectGuid source); + void OnInstanceIdRemoved(uint32 instanceId); public: /* Scheduled scripts */ uint32 IncreaseScheduledScriptsCount() { return ++_scheduledScripts; }