Files
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

78 lines
3.2 KiB
Diff

--- 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();
+ }
+}