Capture current mission, AI, map and administration development

Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
This commit is contained in:
2026-10-13 22:52:53 +02:00
parent a951a96edc
commit 6a667d8deb
8104 changed files with 2124945 additions and 2061 deletions
@@ -0,0 +1,22 @@
18:16:17.476 SCRIPT : ERR BODY DIAG: faction=USSR configured=1 limit=-1 current=0 canAdd=1
18:16:17.477 SCRIPT : ERR BODY DIAG: faction=RHS_AFRF configured=1 limit=-1 current=0 canAdd=1
18:16:17.477 SCRIPT : ERR BODY DIAG: age=0 faction=USSR agents=0 expanded=0 nav=1 loaded=0 requested=0
18:16:17.477 SCRIPT : ERR BODY DIAG: age=0 faction=RHS_AFRF agents=0 expanded=0 nav=1 loaded=0 requested=0
18:16:27.496 SCRIPT : ERR BODY DIAG: age=10011.7 faction=USSR agents=1 expanded=1 nav=1 loaded=1 requested=0
18:16:27.496 SCRIPT : ERR BODY DIAG: age=10011.7 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:16:37.662 SCRIPT : ERR BODY DIAG: age=20036.2 faction=USSR agents=1 expanded=1 nav=1 loaded=1 requested=0
18:16:37.662 SCRIPT : ERR BODY DIAG: age=20036.2 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:16:47.762 SCRIPT : ERR BODY DIAG: age=30069.5 faction=USSR agents=1 expanded=1 nav=1 loaded=1 requested=0
18:16:47.762 SCRIPT : ERR BODY DIAG: age=30069.5 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:16:57.895 SCRIPT : ERR BODY DIAG: age=40100.5 faction=USSR agents=1 expanded=1 nav=1 loaded=1 requested=0
18:16:57.895 SCRIPT : ERR BODY DIAG: age=40100.5 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:17:07.929 SCRIPT (E): Virtual Machine Exception
18:17:07.930 SCRIPT : ERR BODY DIAG: age=50133.5 faction= agents=0 expanded=1 nav=0 loaded=0 requested=0
18:17:07.930 SCRIPT : ERR BODY DIAG: age=50133.5 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:17:17.929 SCRIPT (E): Virtual Machine Exception
18:17:17.929 SCRIPT : ERR BODY DIAG: age=60134 faction= agents=0 expanded=1 nav=0 loaded=0 requested=0
18:17:17.929 SCRIPT : ERR BODY DIAG: age=60134 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:17:27.962 SCRIPT (E): Virtual Machine Exception
18:17:27.962 SCRIPT : ERR BODY DIAG: age=70166.5 faction= agents=0 expanded=1 nav=0 loaded=0 requested=0
18:17:27.962 SCRIPT : ERR BODY DIAG: age=70166.5 faction=RHS_AFRF agents=4 expanded=1 nav=1 loaded=1 requested=0
18:17:27.962 SCRIPT : ERR BODY COMPLETE
@@ -0,0 +1,34 @@
#1681 t=299s M0 BODY RECOVERY REQUEST job=1 source=everon-prison-1 slot=2 message=397 reported body=<2974.83,119.944,5336.57>; awaiting physical search [session=1791034661-2]
#1684 t=299s M0 BODY RECOVERY TEAM job=1 wave=1/8 base=everon-radio-1 team=<0x0000000017938D10> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=3; native spawn requested, not yet ready [session=1791034661-2]
#1686 t=300s M0 BODY RECOVERY STATUS job=1 stage=0; waiting for native roster expansion; queued=1.00869s teamAge=1.00869s agents=0 living=0 expanded=0 faction=RHS_AFRF team=<5672.33,87.0247,5633.84> reportedBody=<2974.83,119.944,5336.57> spawnAttempts=1 [session=1791034661-2]
#1792 t=330.1s M0 BODY RECOVERY STATUS job=1 stage=0; waiting for native roster expansion; queued=31.1285s teamAge=31.1285s agents=0 living=0 expanded=0 faction=RHS_AFRF team=<5672.33,87.0247,5633.84> reportedBody=<2974.83,119.944,5336.57> spawnAttempts=3 [session=1791034661-2]
#1968 t=359.1s M0 BODY RECOVERY END job=1 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#2013 t=391.1s M0 BODY RECOVERY REQUEST job=2 source=everon-prison-1 slot=1 message=604 reported body=<3019.83,120.504,5336.64>; awaiting physical search [session=1791034661-2]
#2016 t=391.1s M0 BODY RECOVERY TEAM job=2 wave=2/8 base=everon-radio-1 team=<0x000000005DCC8690> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=5; native spawn requested, not yet ready [session=1791034661-2]
#2111 t=446.2s M0 BODY RECOVERY REQUEST job=3 source=everon-prison-1 slot=0 message=722 reported body=<3014.26,120.293,5324.49>; awaiting physical search [session=1791034661-2]
#2114 t=446.2s M0 BODY RECOVERY TEAM job=3 wave=3/8 base=everon-radio-1 team=<0x0000000049AECBB0> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=3; native spawn requested, not yet ready [session=1791034661-2]
#2137 t=451.2s M0 BODY RECOVERY END job=2 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#2353 t=507.2s M0 BODY RECOVERY END job=3 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#4711 t=1268.5s M0 BODY RECOVERY REQUEST job=4 source=town-0 slot=7 message=2518 reported body=<2982.41,110.588,5163.48>; awaiting physical search [session=1791034661-2]
#4714 t=1268.5s M0 BODY RECOVERY TEAM job=4 wave=4/8 base=everon-radio-1 team=<0x000000005E5BCB00> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=3; native spawn requested, not yet ready [session=1791034661-2]
#4830 t=1316.6s M0 BODY RECOVERY REQUEST job=5 source=town-0 slot=1 message=2641 reported body=<2975.66,118.78,5260.94>; awaiting physical search [session=1791034661-2]
#4834 t=1316.6s M0 BODY RECOVERY TEAM job=5 wave=5/8 base=everon-radio-1 team=<0x00000000562ACDC0> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=5; native spawn requested, not yet ready [session=1791034661-2]
#4870 t=1328.6s M0 BODY RECOVERY END job=4 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#5151 t=1376.9s M0 BODY RECOVERY END job=5 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#5718 t=1521.3s M0 BODY RECOVERY REQUEST job=6 source=town-0 slot=4 message=3135 reported body=<3185.61,116.778,5190.69>; awaiting physical search [session=1791034661-2]
#5721 t=1521.3s M0 BODY RECOVERY TEAM job=6 wave=6/8 base=everon-radio-1 team=<0x0000000044183D20> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=5; native spawn requested, not yet ready [session=1791034661-2]
#5992 t=1558.3s M0 BODY RECOVERY REQUEST job=7 source=town-0 slot=9 message=3238 reported body=<3211.25,116.599,5186.4>; awaiting physical search [session=1791034661-2]
#5996 t=1558.3s M0 BODY RECOVERY TEAM job=7 wave=7/8 base=everon-radio-1 team=<0x000000003CCC9270> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=5; native spawn requested, not yet ready [session=1791034661-2]
#6103 t=1583.3s M0 BODY RECOVERY END job=6 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#6387 t=1619.2s M0 BODY RECOVERY END job=7 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#6724 t=1725.1s M0 BODY RECOVERY REQUEST job=8 source=everon-outpost-1-responders slot=0 message=3640 reported body=<3148.92,119.518,5239.79>; awaiting physical search [session=1791034661-2]
#6736 t=1726.1s M0 BODY RECOVERY TEAM job=8 wave=8/8 base=everon-radio-1 team=<0x0000000052D348B0> SCR_AIGroup position=<5672.33,87.0247,5633.84> slots=5; native spawn requested, not yet ready [session=1791034661-2]
#7196 t=1786.3s M0 BODY RECOVERY END job=8 stage=0 delivered=0 missingSites=0; 60-second preparation deadline [session=1791034661-2]
#8206 t=2163.1s M0 BODY RECOVERY REQUEST job=9 source=everon-prison-1 slot=3 message=4589 reported body=<2972.67,119.4,5313.98>; awaiting physical search [session=1791034661-2]
#8912 t=2397.2s M0 BODY RECOVERY REQUEST job=10 source=supply-convoy-1-vehicle-2 slot=0 message=5116 reported body=<3320.4,118.192,5117.46>; awaiting physical search [session=1791034661-2]
#9032 t=2436.2s M0 BODY RECOVERY REQUEST job=11 source=town-0 slot=2 message=5196 reported body=<3215.48,116.748,5185.25>; awaiting physical search [session=1791034661-2]
#10454 t=2828.4s M0 BODY RECOVERY REQUEST job=12 source=town-3 slot=1 message=6113 reported body=<1253.74,35.9753,6004.85>; awaiting physical search [session=1791034661-2]
#17707 t=5279.6s M0 BODY RECOVERY END job=9 stage=0 delivered=0 missingSites=0; mission recovery service stopped [session=1791034661-2]
#17708 t=5279.6s M0 BODY RECOVERY END job=10 stage=0 delivered=0 missingSites=0; mission recovery service stopped [session=1791034661-2]
#17709 t=5279.6s M0 BODY RECOVERY END job=11 stage=0 delivered=0 missingSites=0; mission recovery service stopped [session=1791034661-2]
#17710 t=5279.6s M0 BODY RECOVERY END job=12 stage=0 delivered=0 missingSites=0; mission recovery service stopped [session=1791034661-2]
@@ -0,0 +1,32 @@
18:23:51.108 SCRIPT (E): @"Scripts/Game/ERR/00_Core/ERR_ZProfileProbe.c,29": Undefined function 'ERR_HQ#6484#153.ReleaseRecovery'
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,489": Error in parameters
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,497": Can't find variable 'widgetEffectEventMasks'
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,497": Syntax error
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,514": Can't find variable 'widgetEffectEventMasks'
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,514": Syntax error
18:23:51.158 SCRIPT (E): @"Scripts/Game/UI/Components/ButtonComponents/ModularButton/SCR_ModularButtonComponent.c,527": Can't find variable 'widgetEffectEventMasks'
18:23:51.178 SCRIPT (E): @"Scripts/Game/UI/Inventory/SCR_InventoryStorageBaseUI.c,989": Error in parameters
18:23:51.178 SCRIPT (E): @"Scripts/Game/UI/Inventory/SCR_InventoryStorageBaseUI.c,995": Can't find variable 'changeMap'
18:23:51.178 SCRIPT (E): @"Scripts/Game/UI/Inventory/SCR_InventoryStorageBaseUI.c,1007": Can't find variable 'changeMap'
18:23:51.178 SCRIPT (E): @"Scripts/Game/UI/Inventory/SCR_InventoryStorageBaseUI.c,1016": Can't find variable 'changeMap'
18:23:51.178 SCRIPT (E): @"Scripts/Game/UI/Inventory/SCR_InventoryStorageBaseUI.c,1016": Syntax error
18:23:51.286 SCRIPT (E): @"Scripts/Game/GameMode/Loadout/SCR_PlayerArsenalLoadout.c,324": Error in parameters
18:23:51.286 SCRIPT (E): @"Scripts/Game/GameMode/Loadout/SCR_PlayerArsenalLoadout.c,333": Can't find variable 'sortSlots'
18:23:51.286 SCRIPT (E): @"Scripts/Game/GameMode/Loadout/SCR_PlayerArsenalLoadout.c,335": Can't find variable 'sortSlots'
18:23:51.286 SCRIPT (E): @"Scripts/Game/GameMode/Loadout/SCR_PlayerArsenalLoadout.c,337": Can't find variable 'sortSlots'
18:23:51.286 SCRIPT (E): @"Scripts/Game/GameMode/Loadout/SCR_PlayerArsenalLoadout.c,337": Syntax error
18:23:51.289 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,26": Error in parameters
18:23:51.290 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,29": Can't find variable 'friendlyDefaultMapping'
18:23:51.290 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,42": Can't find variable 'friendlyDefaultMapping'
18:23:51.290 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,52": Can't find variable 'friendlyDefaultMapping'
18:23:51.290 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,77": Can't find variable 'friendlyDefaultMapping'
18:23:51.290 SCRIPT (E): @"Scripts/Game/Plugins/Persistence/System/Serializers/Entities/SCR_FactionManagerSerializer.c,77": Syntax error
18:23:51.339 SCRIPT (E): @"Scripts/Game/Respawn/Logic/SCR_SpawnLogic.c,298": Can't find class Tuple1
18:23:51.351 SCRIPT (E): @"Scripts/Game/Map/ComponentsUI/SCR_MapUIElementContainer.c,443": Incompatible parameter 'on delete'
18:23:51.663 SCRIPT (E): @"Scripts/Game/ScenarioFramework/Actions/ActionGetters/SCR_ScenarioFrameworkGetCountEntitiesInTrigger.c,10": Can't find class SCR_ScenarioFrameworkParam
18:23:51.675 SCRIPT (E): @"Scripts/Game/ScenarioFramework/Actions/ActionGetters/SCR_ScenarioFrameworkGetLastFinishedTaskLayer.c,11": Can't find class SCR_ScenarioFrameworkParam
18:23:51.699 SCRIPT (E): @"Scripts/Game/UI/Components/SCR_SpinningWidgetComponent.c,25": Can't find class SCR_SpinningWidgetAnimation
18:23:51.699 SCRIPT (E): @"Scripts/Game/UI/Components/SCR_SpinningWidgetComponent.c,27": Can't find class SCR_SpinningWidgetAnimation
18:23:51.802 SCRIPT (E): @"Scripts/Game/UI/Menu/ContentBrowser/Common/SCR_ScenarioUICommon.c,452": Can't find class Tuple2
18:23:51.802 SCRIPT (E): @"Scripts/Game/UI/Menu/ContentBrowser/Common/SCR_ScenarioUICommon.c,517": Can't find class Tuple2
18:23:51.811 SCRIPT (E): Can't compile "Game" script module!
@@ -0,0 +1 @@
18:25:56.907 SCRIPT : ERR FIX PASS: existing native idle infantry selected for body search without new spawn
@@ -0,0 +1 @@
18:29:41.301 SCRIPT : ERR FIX PASS: existing native idle infantry selected for body search without new spawn
@@ -0,0 +1,3 @@
18:32:36.718 SCRIPT : ERR FIX PASS: existing native idle infantry selected for body search without new spawn
18:35:56.931 SCRIPT (E): ERR FIX FAIL: fixture deadline
18:35:56.931 SCRIPT : ERR FIX COMPLETE
@@ -0,0 +1,21 @@
18:37:57.266 SCRIPT : ERR FIX PASS: existing native idle infantry selected for body search without new spawn
18:37:57.417 SCRIPT : ERR FIX MINE: stage=0 stopped=0 owned=1 quiet=1 actor=<2942.78,90.4937,4826.93> mine=<2942.78,90.4937,4826.93> site=<2914.98,90.2048,4816.71>
18:38:07.555 SCRIPT : ERR FIX MINE: stage=0 stopped=0 owned=1 quiet=1 actor=<2918.93,90.0788,4817.93> mine=<2918.99,90.0801,4817.96> site=<2914.98,90.2048,4816.71>
18:38:17.622 SCRIPT : ERR FIX MINE: stage=1 stopped=0 owned=1 quiet=1 actor=<2915.66,90.1036,4816.72> mine=<2915.66,90.1036,4816.72> site=<2914.98,90.2048,4816.71>
18:38:27.722 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2935.86,90.2765,4828.54> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:38:37.755 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2942.61,90.4963,4817.02> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:38:47.789 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2941.47,90.5068,4804.16> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:38:57.788 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2940.35,90.3601,4789.88> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:07.821 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2939.04,90.2705,4776.2> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:17.854 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.1606,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:27.855 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.1601,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:37.888 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.1593,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:47.921 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.1605,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:39:57.954 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.159,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:07.988 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.87,90.1596,4772.24> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:18.021 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2938.46,90.1582,4772.58> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:28.021 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2926.74,89.8229,4780.3> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:38.054 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2919.77,89.6263,4784.82> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:48.087 SCRIPT : ERR FIX MINE: stage=3 stopped=0 owned=1 quiet=1 actor=<2919.77,89.6265,4784.82> mine=<2914.98,90.2048,4816.71> site=<2914.98,90.2048,4816.71>
18:40:57.687 SCRIPT (E): ERR FIX FAIL: physical mine job stopped before arming
18:40:57.687 SCRIPT : ERR FIX COMPLETE
@@ -0,0 +1,6 @@
18:43:10.694 SCRIPT : ERR FIX PASS: existing native idle infantry selected for body search without new spawn
18:43:10.855 SCRIPT : ERR FIX MINE: stage=0 stopped=0 owned=1 quiet=1 actor=<5191.91,28.0338,9978.21> mine=<5191.91,28.0338,9978.21> site=<5189.13,27.9886,10016> placed=0 friendNear=0
18:43:21.020 SCRIPT : ERR FIX MINE: stage=0 stopped=0 owned=1 quiet=1 actor=<5187.93,27.9715,10010.9> mine=<5187.92,27.9715,10010.8> site=<5189.13,27.9886,10016> placed=0 friendNear=0
18:43:31.087 SCRIPT : ERR FIX MINE: stage=1 stopped=0 owned=1 quiet=1 actor=<5189.06,27.891,10015.9> mine=<5189.06,27.891,10015.9> site=<5189.13,27.9886,10016> placed=0 friendNear=0
18:43:40.554 SCRIPT : ERR FIX PASS: native soldier walked, removed carried mine, withdrew and armed it
18:43:40.554 SCRIPT : ERR FIX COMPLETE
@@ -0,0 +1,4 @@
#124 t=59.9s M0 BODY RECOVERY TEAM job=999 assigned existing idle infantry=<0x000000003C4C33F0> SCR_AIGroup; reported body=<4889.96,53.5491,5821.85> [session=1791045726-1]
#153 t=60s M0 ENGINEER MINE original carried PMN4 assigned; one approach and finite 180s deadline [session=1791045726-1]
#154 t=87.3s M0 ENGINEER MINE arming delayed: friendly or unknown-affiliation unit within 20m [session=1791045726-1]
#155 t=89.4s M0 ENGINEER MINE original PMN4 armed after engineer withdrawal and physical friendly clearance [session=1791045726-1]
@@ -0,0 +1,143 @@
modded class ERR_BodyRecovery
{
bool ERR_TestBorrow(vector position, SCR_AIGroup expected, float now)
{
int waves = m_Waves;
ERR_BodyRecoveryJob job = new ERR_BodyRecoveryJob(); job.Id = 999; job.Position = position;
bool result = SpawnTeam(job, now);
return result && job.Team == expected && job.Prepared && job.State == 1 && m_Waves == waves;
}
}
modded class ERR_EngineerMine
{
protected bool m_ERRCleared;
protected bool ERR_MoveTestFriend(IEntity entity)
{
ChimeraCharacter character=ChimeraCharacter.Cast(entity);
if(!character || entity==m_Actor || ERR_Actors.Player(entity))return true;
vector transform[4];character.GetWorldTransform(transform);transform[3]=ERR_Actors.Ground(m_Rally+Vector(0,0,100));character.Teleport(transform);
return true;
}
void ERR_ClearTestFriends()
{
if(m_State!=3 || m_ERRCleared)return;
m_ERRCleared=true;
GetGame().GetWorld().QueryEntitiesBySphere(m_Position,25,ERR_MoveTestFriend,queryFlags:EQueryEntitiesFlags.ALL);
}
bool ERR_TestArmed() { return m_Trigger && m_Trigger.IsActivated(); }
string ERR_TestProgress() { return string.Format("stage=%1 stopped=%2 owned=%3 quiet=%4 actor=%5 mine=%6 site=%7",m_State,m_Stopped,Owned(),Quiet(),m_Actor.GetOrigin(),m_Mine.GetOrigin(),m_Position)+string.Format(" placed=%1 friendNear=%2",Placed(),m_FriendlyNear); }
}
modded class ERR_HQ
{
bool ERR_TestRecovery(float now)
{
IndexRadios();
foreach (ERR_HQUnit unit : m_Units)
{
if (!unit.Eligible(m_Mode) || !unit.StatusSampler.Bound() || !unit.Radio || unit.Assignment || unit.PendingOrder || unit.Downlink || Fighting(unit)) continue;
if (!m_Network.Route(unit.Radio, true)) continue;
ERR_HQStatusReport status = new ERR_HQStatusReport(); status.SourceId = unit.ForceSourceId;status.MessageId=m_Journal.Message();status.Position=unit.Group.GetOrigin();status.Strength=unit.StatusSampler.InitialStrength();status.Count=m_Mode.ForceLiving(unit.Group);status.Fit=status.Count;status.ObservedAt=now;
if (!m_Watch.Ingest(status,now)) continue;
bool guard=unit.HomeGuard;unit.HomeGuard=false;
bool result=m_Recovery.ERR_TestBorrow(status.Position,unit.Group,now);
unit.ReservedForSupport=false;unit.HomeGuard=guard;
return result;
}
return false;
}
ERR_EngineerMine ERR_TestMine(float now)
{
m_Equipment.Tick(now); m_Journal.Flush();
foreach (ERR_HQUnit original : m_Units)
{
if (original.ForceSourceId.Contains("prison")) continue;
if (!original.Eligible(m_Mode) || !original.StatusSampler.Bound() || Fighting(original)) continue;
vector rally=original.Group.GetOrigin();
bool carried;
array<AIAgent> agents={};original.Group.GetAgents(agents);
foreach (AIAgent agent:agents)
{
IEntity actor=agent.GetControlledEntity(); if(!actor) continue;
SCR_InventoryStorageManagerComponent inventory=SCR_InventoryStorageManagerComponent.Cast(actor.FindComponent(SCR_InventoryStorageManagerComponent));
if(!inventory) continue;
array<IEntity> items={};ERR_Inventory.Items(inventory,items);
foreach(IEntity item:items) if(item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName()==ERR_EnemyLoadoutCatalog.MINE) carried=true;
}
if(!carried) continue;
vector site;
if(!ERR_EngineerMineSite.Select(rally,site))
{
bool clear;
for(int direction=0;direction<8;direction++)
{
float angle=direction*Math.PI2/8;
site=ERR_Actors.Ground(rally+Vector(Math.Cos(angle)*35,0,Math.Sin(angle)*35));
if(!ERR_HQRoadIntercept.Standable(site))continue;
bool nearFriend;
foreach(AIAgent neighbour:agents) if(neighbour.GetControlledEntity() && vector.DistanceXZ(neighbour.GetControlledEntity().GetOrigin(),site)<25)nearFriend=true;
if(nearFriend)continue;
clear=true;break;
}
if(!clear)continue;
}
if (!m_ERRFixtureRoadGroups.Contains(original.Group))
{
AIWaypoint post = AIWaypoint.Cast(ERR_Actors.Spawn(ERR_Resources.DefendWaypoint(),rally));
if(!post)continue;
post.SetCompletionRadius(70); original.Group.AddWaypointAt(post,0);
m_ERRFixtureRoadGroups.Insert(original.Group);
original.Group.SetPermanentLOD(0);
foreach(AIAgent heldBefore:agents){heldBefore.SetPermanentLOD(0);heldBefore.ActivateAI();}
continue;
}
ERR_HQUnit unit=new ERR_HQUnit();unit.Group=original.Group;unit.Utility=original.Utility;unit.StatusSampler=original.StatusSampler;unit.ForceSourceId=original.ForceSourceId;
unit.Task=new ERR_HQTask();unit.Task.RoadIntercept=true;unit.Task.Role=ERR_HQPursuitRole.INTERCEPT;unit.Task.Destination=rally;unit.Task.QueuedAt=now;unit.Task.ExpiresAt=now+180000;
unit.Assignment=new ERR_HQReport();unit.Assignment.MessageId=777;unit.Assignment.ObservedAt=now;unit.Assignment.Position=rally;
array<IEntity> attempted={};ERR_EngineerMine mine=new ERR_EngineerMine(attempted);
if(!mine.Begin(m_Mode,unit,unit.Task,site,now)) continue;
// Keep this arranged unit alive; production owns the actual movement/item.
m_ERRFixtureUnit=unit; m_ERRFixtureAttempts=attempted;
original.ReservedForSupport=true;
original.Group.SetPermanentLOD(0);
foreach(AIAgent held:agents) {held.SetPermanentLOD(0);held.ActivateAI();}
return mine;
}
return null;
}
protected ref array<SCR_AIGroup> m_ERRFixtureRoadGroups = {};
protected ref ERR_HQUnit m_ERRFixtureUnit;
protected ref array<IEntity> m_ERRFixtureAttempts;
}
modded class ArmaReforgerScripted
{
protected float m_ERRFixStart=-1,m_ERRFixNext;
protected bool m_ERRFixBorrowed,m_ERRFixDone;
protected ref ERR_EngineerMine m_ERRFixMine;
override void OnUpdate(BaseWorld world,float timeslice)
{
super.OnUpdate(world,timeslice);
ERR_GameMode mode=ERR_GameMode.Get();
if(m_ERRFixDone || !world || !Replication.IsServer() || !mode || !mode.Active())return;
float now=world.GetWorldTime();
if(m_ERRFixStart<0) m_ERRFixStart=now;
if(!m_ERRFixBorrowed && now-m_ERRFixStart>10000)
{
m_ERRFixBorrowed=ERR_HQ.Get().ERR_TestRecovery(now);
if(m_ERRFixBorrowed)Print("ERR FIX PASS: existing native idle infantry selected for body search without new spawn");
}
if(!m_ERRFixMine && m_ERRFixBorrowed)m_ERRFixMine=ERR_HQ.Get().ERR_TestMine(now);
if(m_ERRFixMine)
{
m_ERRFixMine.ERR_ClearTestFriends();
m_ERRFixMine.Tick(now); ERR_HQ.Get().Journal().Flush();
if(now>=m_ERRFixNext){m_ERRFixNext=now+10000;Print("ERR FIX MINE: "+m_ERRFixMine.ERR_TestProgress());}
if(m_ERRFixMine.Finished())
{
if(m_ERRFixMine.ERR_TestArmed())Print("ERR FIX PASS: native soldier walked, removed carried mine, withdrew and armed it");
else Print("ERR FIX FAIL: physical mine job stopped before arming",LogLevel.ERROR);
m_ERRFixDone=true;Print("ERR FIX COMPLETE");
}
}
if(now-m_ERRFixStart>210000){Print("ERR FIX FAIL: fixture deadline",LogLevel.ERROR);m_ERRFixDone=true;Print("ERR FIX COMPLETE");}
}
}
@@ -0,0 +1,36 @@
from pathlib import Path
import os,sys,json,shutil,subprocess,time,signal
ROOT=Path('/home/jakub/devel/escapistsrereintroduced');sys.path.insert(0,str(ROOT/'tools'))
from external_addons import policy,prepare_profile
from source_manifest import addon_manifest
from dedicated_native import PROBE
base=Path('/tmp/erri-roadbody-native');base.mkdir(exist_ok=True)
run=base/sys.argv[1];run.mkdir();source=run/'source';source.mkdir()
for rel in addon_manifest(ROOT):
dest=source/Path(rel).relative_to('addons/core');dest.parent.mkdir(parents=True,exist_ok=True);shutil.copy2(ROOT/rel,dest)
shutil.copy2('/tmp/erri-takeover-pair-source32/resourceDatabase.rdb',source/'resourceDatabase.rdb')
shutil.copy2('/tmp/erri-roadbody-fixed-probe.c',source/'Scripts/Game/ERR/00_Core/ERR_ZProfileProbe.c')
addons=run/'addons';addons.mkdir();steam=Path.home()/'.local/share/Steam'
prepare_profile(addons,steam/'steamapps/compatdata/1874880/pfx/drive_c/users/steamuser/Documents/My Games/ArmaReforger/addons',policy(ROOT),run/'external-cache.json');(addons/'ERR_Core').symlink_to(source,target_is_directory=True)
profile=run/'profile/profile';profile.mkdir(parents=True)
(run/'network.py').write_text(PROBE)
runtime=Path('/tmp/erri-takeover-dedicated-runtime')
engine=['/tmp/runtime/ArmaReforgerServer','-server','{C1E20667DCE324ED}Missions/ERR_Everon.conf','-addonsDir',str(addons),'-addons','2528466DE220D91C','-profile',str(run/'profile'),'-noBackend','-noSound','-bindIP','127.0.0.1','-bindPort','2001','-maxFPS','30','-logconsole','-noSplash','-noThrow','-disableCrashReporter']
cmd=['bwrap','--unshare-net','--unshare-pid','--unshare-ipc','--unshare-uts','--die-with-parent','--cap-drop','ALL','--ro-bind','/','/','--tmpfs','/tmp','--ro-bind',str(runtime),'/tmp/runtime','--bind',str(run),str(run),'--proc','/proc','--dev','/dev','--chdir','/tmp/runtime','python',str(run/'network.py'),os.readlink('/proc/self/ns/net')]+engine
with (run/'stdout.log').open('w') as log:
p=subprocess.Popen(cmd,stdout=log,stderr=subprocess.STDOUT,start_new_session=True)
reason='timeout';start=time.monotonic()
try:
while time.monotonic()-start<340:
files=sorted((run/'profile/logs').glob('logs_*/console.log'));text=files[-1].read_text(errors='replace') if files else ''
if 'ERR FIX COMPLETE' in text:reason='complete';break
if "Can't compile" in text:reason='compile-failed';break
if p.poll() is not None:reason='exit';break
time.sleep(.3)
finally:
if p.poll() is None:
os.killpg(p.pid,signal.SIGTERM)
try:p.wait(timeout=8)
except subprocess.TimeoutExpired:os.killpg(p.pid,signal.SIGKILL);p.wait()
(run/'result.json').write_text(json.dumps({'reason':reason,'exit':p.returncode}));print(reason)
print('\n'.join(line for line in text.splitlines() if 'ERR FIX' in line or 'SCRIPT (E)' in line))
@@ -0,0 +1,79 @@
{
"read_utc": "2026-10-03T16:08:44Z",
"server": "RKS #2",
"log_directory": "logs_2026-10-03_13-15-48",
"completed_round": "1791034661-2",
"body_recovery": {
"BODY RECOVERY REQUEST": 12,
"BODY RECOVERY TEAM": 8,
"BODY RECOVERY READY": 0,
"BODY RECOVERY END": 12,
"BODY SEARCH START": 0,
"BODY SEARCH COMPLETE": 0
},
"findings": [
"Eight recovery groups requested, all remained empty through repeated requests and hit 60-second preparation deadlines.",
"Eight attempt allowance exhausted; jobs 9-12 waited for capacity until round ended.",
"No physical inspection started or completed in that round.",
"Earlier round 1791033395-1 did prepare one US recovery team; inspection repeatedly paused due to perceived combat targets; no completion.",
"Production has temporary road interception, not barricade-prop roadblocks.",
"No temporary infantry road interception event found in either round.",
"Road eligibility rejects the vehicle travel label despite observation producing both vehicle and in vehicle; this can exclude valid vehicle sightings."
],
"limitations": [
"Exact cause of live-server empty recovery groups remains unproven; native isolated RHS spawning at that location succeeded.",
"No full barricade-construction implementation.",
"No Workshop publication, live server change or multiplayer acceptance test in this task."
],
"fixes": [
"Allow vehicle-entity sightings as well as occupied-character sightings in road interception.",
"Road post lifetime includes walking time and 180-second hold, capped at 900 seconds.",
"Road defend waypoint radius 70m allows 25\u201360m engineer sites; individual engineer work still limited to 60m.",
"Recovery can reserve existing idle infantry with fresh reported position and a radio route.",
"Never-populated recovery groups may retry twice with 60s backoff, cancel old spawn intent and refund unused wave allowance; any spawned member prevents refund/refill.",
"At most 32 recovery group creation attempts and 8 real/pending waves; existing 2-active-job limit retained.",
"Diagnostics report native navigation/faction spawn state and mine-placement refusal/cancellation stages."
],
"policy_tests_passed": [
"test_hq_pursuit.py",
"test_hq_road_intercept.py",
"test_hq_delivered_task.py",
"test_hq_assignment_lifecycle.py",
"test_hq_task_reservations.py",
"test_hq_planner_budget.py",
"test_body_recovery_lifecycle.py",
"test_body_recovery_selection.py",
"test_engineer_mine.py",
"test_engineer_mine_hq.py",
"test_engineer_mine_posts.py",
"test_engineer_mine_site.py",
"test_hq_mine_sampler.py"
],
"exploratory_runs": {
"baseline": "RHS group spawned at original reported position; later diagnostic fixture dereferenced a removed USSR group. Not a clean validation run.",
"fixed1": "Fixture compile error calling a method from a later modded class; fixed in fixture.",
"fixed2": "Idle-team selection passed; stopped fixture lacking playerless equipment ticking.",
"fixed3": "Idle-team selection passed; stopped scene setup without a road post.",
"fixed4": "Idle-team selection passed; mine admission timed out; confirmed native defend radius excluded sites.",
"fixed5": "Native soldier walked, prepared, removed its real carried mine and withdrew. Arming did not finish; added rate-limited waiting diagnostics and arranged friendly clearance in the next fixture."
},
"production_source_sha256": {
"addons/core/Scripts/Game/ERR/10_AI/ERR_BodyRecovery.c": "2c3135a1457677028d91abee41b68c40a3a2d64a7588ced3ace47cc8e2cfd950",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQRoadIntercept.c": "f87727aa1c722a180c7b71fa2d896601b6250978a21bd2d1e973501fee81373b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQPursuit.c": "5a364f0349fa59e9a76aaa6bea42fff9b6592e36462fce9fd67d7962a3cdca6f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "2837755fcb5fc8a174192b4d881e3c623a3bf03a90d55c0d8e4be6ab2f1fd3c3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": "69382b9f3a7cc50798ec5d7ae646145f9e7b80ce89370e9d7fb184e1272d569a"
},
"deployment": "Local source only; not published or deployed. Live server unchanged.",
"native_validation": {
"result": {
"reason": "complete",
"exit": -15
},
"passed": 2,
"failed": 0,
"script_errors": 0,
"complete": true,
"scope": "Controlled native existing-infantry recovery assignment and real carried mine movement, inventory removal, withdrawal and activation. Fixture supplies a delivered-post context and clears other nearby fixture soldiers; production clearance remains unchanged. No pressure-detonation or organic multiplayer qualification."
}
}