--- before/ERR_TerrainTakeover.c +++ after/ERR_TerrainTakeover.c @@ -277,6 +277,7 @@ if (!ERR_TerrainTakeoverReplication.Link(mode)) { ERR_FailTerrainTakeover("Escape replication hierarchy could not register; restart the scenario."); return; } m_ERRTerrainStage = ERR_TerrainTakeoverStage.RUNNING; mode.ERR_StartTerrainTakeover(GetWorld()); + GetGame().ERR_PresentTerrainTakeover(); foreach (ERR_TerrainTakeoverAdmission admission : m_ERRTerrainAdmissions) { int connection = admission.Connection; --- before/ERR_TerrainTakeoverClient.c +++ after/ERR_TerrainTakeoverClient.c @@ -8,6 +8,7 @@ { if (!GetGame() || Replication.IsServer()) return; GetGame().ERR_BeginClientTerrainTakeover(this); + GetGame().ERR_PresentTerrainTakeover(); } } modded class ArmaReforgerScripted --- before/ERR_TerrainTakeoverPresentation.c +++ after/ERR_TerrainTakeoverPresentation.c @@ -0,0 +1,54 @@ +// Scenario selection still loads the terrain's header. Advertise the configured +// Escape mode through the native DS name callback, then update local metadata +// only when the authority actually starts Escape or its bootstrap reaches a client. +modded class ArmaReforgerScripted +{ + protected ref SCR_MissionHeader m_ERRPresentedTerrainHeader; + protected string m_ERROriginalTerrainTitle; + protected string m_ERROriginalTerrainGameMode; + + static string ERR_TerrainMissionTitle() { return "Co10 Escape Reintroduced"; } + + override string GetMissionName() + { + SCR_MissionHeader header = SCR_MissionHeader.Cast(GetMissionHeader()); + // The engine requests this before the dedicated world has loaded. Preserve + // authored Escape names and explicit opt-outs; do not change the scenario ID. + if (Replication.IsServer() && header && header.m_sGameMode != "Escape" && m_ERRTerrainStage != ERR_TerrainTakeoverStage.FAILED && ERR_TerrainTakeoverSettings.Enabled()) + return ERR_TerrainMissionTitle(); + return super.GetMissionName(); + } + + void ERR_PresentTerrainTakeover() + { + SCR_MissionHeader header = SCR_MissionHeader.Cast(GetMissionHeader()); + if (!header || SCR_Global.IsEditMode()) return; + if (m_ERRPresentedTerrainHeader == header) return; + ERR_RestoreTerrainPresentation(); + m_ERRPresentedTerrainHeader = header; + m_ERROriginalTerrainTitle = header.m_sName; + m_ERROriginalTerrainGameMode = header.m_sGameMode; + header.m_sName = ERR_TerrainMissionTitle(); + header.m_sGameMode = "Escape"; + PrintFormat("Reintroduced [terrain presentation]: mission=%1; source scenario=%2", header.m_sName, header.GetHeaderResourceName()); + } + + protected void ERR_RestoreTerrainPresentation() + { + if (m_ERRPresentedTerrainHeader) + { + // A later change by another system belongs to that system. + if (m_ERRPresentedTerrainHeader.m_sName == ERR_TerrainMissionTitle()) m_ERRPresentedTerrainHeader.m_sName = m_ERROriginalTerrainTitle; + if (m_ERRPresentedTerrainHeader.m_sGameMode == "Escape") m_ERRPresentedTerrainHeader.m_sGameMode = m_ERROriginalTerrainGameMode; + } + m_ERRPresentedTerrainHeader = null; + m_ERROriginalTerrainTitle = ""; + m_ERROriginalTerrainGameMode = ""; + } + + override protected void OnBeforeWorldCleanup() + { + ERR_RestoreTerrainPresentation(); + super.OnBeforeWorldCleanup(); + } +}