From 0a77e07705b3be843a265af81b01dcc5bde1fafd Mon Sep 17 00:00:00 2001 From: Hondacrx Date: Tue, 19 Aug 2025 21:35:28 -0400 Subject: [PATCH] Core/Scenarios: Allow scripts to set instance scenario by id Port From (https://github.com/TrinityCore/TrinityCore/commit/c7f5696479bb85c8fc7ee0d9fdaeb92e2b32213f) --- Source/Game/Maps/Map.cs | 16 ++++++++++++++-- Source/Game/Maps/MapManager.cs | 2 +- Source/Game/Scenarios/InstanceScenario.cs | 11 ++--------- Source/Game/Scenarios/ScenarioManager.cs | 10 +++++++--- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 3ad846b58..80b6288b0 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -5197,6 +5197,20 @@ namespace Game.Maps } } + public void SetInstanceScenario(InstanceScenario scenario) + { + i_scenario.Reset(); // sends exit packets to all players + + if (scenario != null) + { + i_scenario = scenario; + + scenario.LoadInstanceData(); + + DoOnPlayers(scenario.OnPlayerEnter); + } + } + public void UpdateInstanceLock(UpdateAdditionalSaveDataEvent updateSaveDataEvent) { if (i_instanceLock != null) @@ -5302,8 +5316,6 @@ namespace Game.Maps public InstanceScenario GetInstanceScenario() { return i_scenario; } - public void SetInstanceScenario(InstanceScenario scenario) { i_scenario = scenario; } - public InstanceLock GetInstanceLock() { return i_instanceLock; } InstanceScript i_data; diff --git a/Source/Game/Maps/MapManager.cs b/Source/Game/Maps/MapManager.cs index d61a2f315..e325c90a8 100644 --- a/Source/Game/Maps/MapManager.cs +++ b/Source/Game/Maps/MapManager.cs @@ -82,7 +82,7 @@ namespace Game.Entities map.TrySetOwningGroup(group); map.CreateInstanceData(); - map.SetInstanceScenario(Global.ScenarioMgr.CreateInstanceScenario(map, team)); + map.SetInstanceScenario(Global.ScenarioMgr.CreateInstanceScenarioForTeam(map, team)); map.InitSpawnGroupState(); if (WorldConfig.GetBoolValue(WorldCfg.InstancemapLoadGrids)) diff --git a/Source/Game/Scenarios/InstanceScenario.cs b/Source/Game/Scenarios/InstanceScenario.cs index f330af02e..65b6370bc 100644 --- a/Source/Game/Scenarios/InstanceScenario.cs +++ b/Source/Game/Scenarios/InstanceScenario.cs @@ -14,16 +14,9 @@ namespace Game.Scenarios { public class InstanceScenario : Scenario { - public InstanceScenario(InstanceMap map, ScenarioData scenarioData) : base(map, scenarioData) - { - LoadInstanceData(); + public InstanceScenario(InstanceMap map, ScenarioData scenarioData) : base(map, scenarioData) { } - var players = map.GetPlayers(); - foreach (var player in players) - SendScenarioState(player); - } - - void LoadInstanceData() + public void LoadInstanceData() { InstanceScript instanceScript = _map.ToInstanceMap().GetInstanceScript(); if (instanceScript == null) diff --git a/Source/Game/Scenarios/ScenarioManager.cs b/Source/Game/Scenarios/ScenarioManager.cs index 85faf7acc..56bd14090 100644 --- a/Source/Game/Scenarios/ScenarioManager.cs +++ b/Source/Game/Scenarios/ScenarioManager.cs @@ -14,7 +14,7 @@ namespace Game.Scenarios { ScenarioManager() { } - public InstanceScenario CreateInstanceScenario(InstanceMap map, int team) + public InstanceScenario CreateInstanceScenarioForTeam(InstanceMap map, int team) { var dbData = _scenarioDBData.LookupByKey(Tuple.Create(map.GetId(), (byte)map.GetDifficultyID())); // No scenario registered for this map and difficulty in the database @@ -34,11 +34,15 @@ namespace Game.Scenarios break; } + return CreateInstanceScenario(map, scenarioID); + } + + InstanceScenario CreateInstanceScenario(InstanceMap map, uint scenarioID) + { var scenarioData = _scenarioData.LookupByKey(scenarioID); if (scenarioData == null) { - Log.outError(LogFilter.Scenario, "Table `scenarios` contained data linking scenario (Id: {0}) to map (Id: {1}), difficulty (Id: {2}) but no scenario data was found related to that scenario Id.", - scenarioID, map.GetId(), map.GetDifficultyID()); + Log.outError(LogFilter.Scenario, $"No scenario data was found related to scenario(Id: {scenarioID}) for map(Id: {map.GetId()}), difficulty(Id: {map.GetDifficultyID()})."); return null; }