Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
78 lines
3.2 KiB
Diff
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();
|
|
+ }
|
|
+}
|