Integrate finite physical mortar assets and archive inventory regression

This commit is contained in:
2026-09-19 01:48:16 +02:00
parent 2550bc0423
commit 7a507a7371
28 changed files with 2484 additions and 16 deletions
+8
View File
@@ -0,0 +1,8 @@
SCR_AIGroup : "{8DE0C0830FE0C33D}Prefabs/Groups/OPFOR/Group_USSR_Base.et" {
m_aUnitPrefabSlots {
"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et"
"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et"
"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et"
"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et"
}
}
+7
View File
@@ -0,0 +1,7 @@
MetaFileClass {
Name "{B84C05941C4C81B8}Prefabs/ERR/MortarCrew.et"
Configurations {
EntityTemplateResourceClass PC {}
EntityTemplateResourceClass HEADLESS {}
}
}
+83 -4
View File
@@ -11,10 +11,11 @@ class ERR_HQUnit
ref ERR_HQReport PendingOrder;
ref ERR_HQReport Assignment;
AIWaypoint Waypoint;
bool ReservedForSupport;
bool Eligible(ERR_GameMode mode)
{
if (!Group || !Utility || Group.GetPlayerCount(true) > 0 || Group.IsSlave() || Group.GetFaction() != mode.EnemyFaction()) return false;
if (ReservedForSupport || !Group || !Utility || Group.GetPlayerCount(true) > 0 || Group.IsSlave() || Group.GetFaction() != mode.EnemyFaction()) return false;
array<AIAgent> agents = {};
Group.GetAgents(agents);
bool survivor;
@@ -44,6 +45,7 @@ class ERR_HQUnit
class ERR_HQ : ERR_CommandService
{
protected ERR_GameMode m_Mode;
protected ref ERR_MortarSystem m_Mortars;
protected ref array<ref ERR_HQUnit> m_Units = {};
protected ref array<ref ERR_HQReport> m_Contacts = {};
protected ref ERR_HQNetwork m_Network = new ERR_HQNetwork();
@@ -52,11 +54,84 @@ class ERR_HQ : ERR_CommandService
protected float m_NextNetwork;
protected float m_NextAssignment;
void ERR_HQ(ERR_GameMode mode) { m_Mode = mode; }
void ERR_HQ(ERR_GameMode mode) { m_Mode = mode; m_Mortars = new ERR_MortarSystem(this); }
static ERR_HQ Get()
{
ERR_GameMode mode = ERR_GameMode.Get();
if (!mode) return null;
return ERR_HQ.Cast(mode.Command());
}
static bool MissionActive()
{
ERR_GameMode mode = ERR_GameMode.Get();
return mode && mode.Active();
}
static void Event(string kind, string message, int messageId = 0)
{
ERR_HQ hq = Get();
if (hq) hq.Journal().Write(kind, message, messageId);
}
ERR_MortarSystem Mortars() { return m_Mortars; }
bool PrepareSupport() { return m_Mortars.Prepare(); }
void ReserveGroup(SCR_AIGroup group)
{
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.Group != group) continue;
unit.Release();
unit.ReservedForSupport = true;
}
}
void PhysicalForces(out array<IEntity> entities)
{
entities.Clear();
foreach (ERR_HQUnit unit : m_Units)
{
if (!unit.Group) continue;
array<AIAgent> agents = {};
unit.Group.GetAgents(agents);
foreach (AIAgent agent : agents)
{
if (!agent || !agent.GetControlledEntity()) continue;
IEntity actor = agent.GetControlledEntity();
if (!entities.Contains(actor)) entities.Insert(actor);
IEntity vehicle = CompartmentAccessComponent.GetVehicleIn(actor);
if (vehicle && !entities.Contains(vehicle)) entities.Insert(vehicle);
}
}
m_Mortars.AppendGuns(entities);
}
bool MortarConnected(SCR_AIGroup group)
{
foreach (ERR_HQUnit unit : m_Units)
if (unit.Group == group && unit.Radio) return m_Network.Route(unit.Radio) != null;
return false;
}
ERR_HQRoute Downlink(SCR_AIGroup group, string kind, string detail, int sourceId)
{
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.Group != group || !unit.Radio) continue;
ERR_HQRoute route = m_Network.Route(unit.Radio, true);
if (!route) return null;
route.MessageId = m_Journal.Message();
route.Payload = string.Format("%1 from report M%2; %3", kind, sourceId, detail);
m_Journal.Write("ORDER QUEUED", route.Payload, route.MessageId);
return route;
}
return null;
}
void SupportContacts(out array<ref ERR_HQReport> contacts, float now)
{
contacts.Clear();
foreach (ERR_HQReport contact : m_Contacts)
if (ERR_MortarPrediction.Fresh(contact, now)) contacts.Insert(contact.Snapshot());
}
ERR_HQJournal Journal() { return m_Journal; }
string Status()
{
return string.Format("HQ: %1 groups, %2 delivered contacts, %3 assignments", m_Units.Count(), m_Contacts.Count(), Assigned());
return string.Format("HQ: %1 groups, %2 delivered contacts, %3 assignments", m_Units.Count(), m_Contacts.Count(), Assigned()) + "; " + m_Mortars.Status();
}
override void RegisterGroup(SCR_AIGroup group)
@@ -167,6 +242,8 @@ class ERR_HQ : ERR_CommandService
if (!order || !ERR_MissionRules.ContactFresh(order.ObservedAt, now) || !unit.Eligible(m_Mode)) { unit.Release(); return; }
SCR_AIGroupPerception perception = unit.Utility.m_Perception;
if (perception && !perception.m_aTargets.IsEmpty()) { unit.Release(); return; }
int deliveryId;
if (unit.Downlink) deliveryId = unit.Downlink.MessageId;
unit.Release();
vector position = order.Position;
if (order.HasVelocity) position = ERR_HQReport.Predict(position, order.Velocity, (now - order.ObservedAt) / 1000);
@@ -175,7 +252,7 @@ class ERR_HQ : ERR_CommandService
unit.Waypoint = waypoint;
unit.Assignment = order;
unit.Group.AddWaypointAt(waypoint, 0);
m_Journal.Write("ORDER DELIVERED", string.Format("group %1: %2", unit.Id, order.Description(now)), order.MessageId);
m_Journal.Write("ORDER DELIVERED", string.Format("group %1 from report M%2: %3", unit.Id, order.MessageId, order.Description(now)), deliveryId);
}
protected void Assign(float now)
@@ -240,11 +317,13 @@ class ERR_HQ : ERR_CommandService
Observe(unit, now);
}
if (now >= m_NextAssignment) { Assign(now); m_NextAssignment = now + 5000; }
m_Mortars.Tick(now);
m_Journal.Flush();
}
override void Stop()
{
m_Mortars.Stop();
foreach (ERR_HQUnit unit : m_Units) unit.Release();
m_Units.Clear();
m_Contacts.Clear();
@@ -0,0 +1,460 @@
// Migrated from the independently authored AI extension; successor-owned physical groups.
// Each site/phase has its own repeat limiter. Changed reasons and lifecycle
// events are immediate; only identical polling results are summarized.
class ERR_MortarTraceState
{
string LastReason;
float NextLog;
int Suppressed;
bool Due(string reason, float now)
{
if (reason != LastReason || now >= NextLog)
{
LastReason = reason;
NextLog = now + 30000;
return true;
}
Suppressed++;
return false;
}
}
class ERR_MortarBattery
{
static const ResourceName GUN = "{D1FFE458E8AC4BDB}Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et";
static const ResourceName SHELL = "{98EC9C526AFBA282}Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et";
static const ResourceName CREW = "{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et";
static const ResourceName RADIO_OPERATOR = "{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et";
IEntity RadioOperator;
IEntity Gun;
SCR_AIGroup Group;
ref SCR_AIStaticArtilleryActivity Activity;
ref ERR_HQReport Report;
ref ERR_HQRoute RadioOrder;
ref ERR_HQReport PendingRadioReport;
vector Position;
vector Impact;
vector AimOffset;
int AimedShot = -1;
float FlightTime;
float AimedAt = -1;
float AirspaceUntil;
vector AirspaceImpact;
float AirspaceRadius = 600;
float OrderedAt;
float NextOrder;
float SpawnedAt;
bool StartupActivated;
bool Released;
bool Rejected;
bool Claimed; // keeps the world slot occupied after the battery is destroyed
int SiteId;
int OrderId;
int RadioId;
int SourceId;
int OrderShots;
int TotalShots;
bool CommandOpen;
string LastFailure;
string SpawnFailure;
vector LastCandidate;
ref map<string, int> SearchCounts = new map<string, int>();
ref map<string, ref ERR_MortarTraceState> Traces = new map<string, ref ERR_MortarTraceState>();
void Audit(string kind, string detail)
{
ERR_HQ.Event("MORTAR " + kind, string.Format("site=%1 order=%2 radio=M%3 source=M%4 position=%5; %6", SiteId, OrderId, RadioId, SourceId, Position, detail), RadioId);
}
void Trace(string phase, string reason, string detail)
{
ERR_MortarTraceState state;
if (!Traces.Find(phase, state))
{
state = new ERR_MortarTraceState();
Traces.Insert(phase, state);
}
string previous = state.LastReason;
if (!state.Due(reason, GetGame().GetWorld().GetWorldTime()))
return;
Audit(phase, string.Format("reason=%1; %2; previous=%3 repeated polls omitted=%4", reason, detail, previous, state.Suppressed));
state.Suppressed = 0;
}
void FlushTraces()
{
foreach (string phase, ERR_MortarTraceState state : Traces)
{
if (state.Suppressed > 0)
Audit("REPEATS", string.Format("phase=%1 reason=%2 repeated polls omitted=%3", phase, state.LastReason, state.Suppressed));
}
Traces.Clear();
}
string OperationalReason()
{
if (!Gun) return "gun missing";
if (!SpawnFailure.IsEmpty()) return SpawnFailure;
if (!Group || !Group.GetGroupUtilityComponent()) return "crew group missing";
if (Group.GetFaction() != ERR_GameMode.Get().EnemyFaction()) return "crew changed faction";
if (Group.GetPlayerCount(true) > 0) return "player in crew group";
if (Group.GetAgentsCount() == 0) return "crew group empty";
DamageManagerComponent damage = DamageManagerComponent.Cast(Gun.FindComponent(DamageManagerComponent));
if (damage && damage.IsDestroyed()) return "gun destroyed";
return "";
}
void BeginRequest(ERR_HQReport report, float now)
{
Cancel("superseded by new HQ order");
FlushTraces();
OrderId++;
RadioId = 0;
SourceId = report.MessageId;
OrderShots = 0;
Released = false;
CommandOpen = true;
OrderedAt = now;
LastFailure = "";
Audit("COMMAND", string.Format("requested rounds=%1 HE radius=%2m; %3", ERR_MortarSalvo.ROUNDS, ERR_MortarSalvo.RADIUS_METRES, report.Description(now)));
}
void ObserveProjectile(IEntity projectileEntity, IEntity firingCharacter, bool playerGunner)
{
if (!projectileEntity)
{
Audit("FIRE CALLBACK", "native OnWeaponFired had no projectile; no confirmed shot counted");
return;
}
TotalShots++;
if (CommandOpen && Released && !playerGunner)
{
OrderShots++;
// Only a physical projectile unlocks the next load. It must be aimed again.
Released = false;
AimedAt = -1;
Audit("FIRED", string.Format("physical projectile=%1 origin=%2 order shots=%3 total shots=%4 predicted impact=%5 predicted flight=%6s gunner=%7 (impact not observed)", projectileEntity, projectileEntity.GetOrigin(), OrderShots, TotalShots, Impact, FlightTime, firingCharacter));
}
else
Audit("FIRED UNASSIGNED", string.Format("physical projectile=%1 origin=%2 player gunner=%3 order open=%4 committed=%5 total shots=%6; no active HQ order attribution", projectileEntity, projectileEntity.GetOrigin(), playerGunner, CommandOpen, Released, TotalShots));
}
void ReserveShellAirspace(float now)
{
// Enclose every still-airborne shell, including an earlier, longer flight.
// A later round must not move/shrink the existing exclusion or deadline.
if (now >= AirspaceUntil)
{
AirspaceImpact = Impact;
AirspaceRadius = 600;
}
AirspaceRadius = Math.Max(AirspaceRadius, vector.DistanceXZ(AirspaceImpact, Impact) + 600);
AirspaceUntil = Math.Max(AirspaceUntil, now + (FlightTime + 10) * 1000);
}
bool SpawnFailed(string reason)
{
SpawnFailure = reason;
Audit("DEPLOY FAILED", string.Format("reason=%1 claimed=%2 gun=%3 group=%4", reason, Claimed, Gun, Group));
return false;
}
void SearchResult(vector candidate, string reason)
{
LastCandidate = candidate;
int count;
SearchCounts.Find(reason, count);
SearchCounts.Set(reason, count + 1);
}
void SiteStatus(float now)
{
if (!SearchCounts.IsEmpty())
{
string counts;
foreach (string reason, int count : SearchCounts) counts += string.Format("%1=%2; ", reason, count);
Audit("SITE SEARCH", string.Format("candidate counts since last summary: %1 last candidate=%2", counts, LastCandidate));
SearchCounts.Clear();
}
int agents, living;
int actionState = -1;
if (Group)
{
array<AIAgent> crew = {};
Group.GetAgents(crew);
agents = crew.Count();
foreach (AIAgent agent : crew)
{
if (agent && ERR_Actors.CanFight(agent.GetControlledEntity())) living++;
}
}
if (Activity) actionState = Activity.GetActionState();
bool connected;
ERR_HQ hq = ERR_HQ.Get();
if (hq && Group) connected = hq.MortarConnected(Group);
Audit("SITE STATUS", string.Format("claimed=%1 startup=%2 operational=%3 crew agents=%4 fighting=%5 inventory HE=%6 radio connected=%7 cooldown remaining=%8s", Claimed, StartupActivated, Operational(), agents, living, CountShells(), connected, Math.Max(0, NextOrder - now) / 1000));
Audit("ORDER STATUS", string.Format("open=%1 route pending=%2 native action=%3 shell committed=%4 order shots=%5 total shots=%6 age=%7s last failure=%8", CommandOpen, RadioOrder != null, actionState, Released, OrderShots, TotalShots, Math.Max(0, now - OrderedAt) / 1000, LastFailure));
if (!SpawnFailure.IsEmpty()) Audit("PARTIAL DEPLOYMENT", SpawnFailure);
if (!Operational()) Trace("SITE BLOCK", OperationalReason(), "spawn failure=" + SpawnFailure);
}
bool Operational()
{
return OperationalReason().IsEmpty();
}
int CountShells()
{
if (!Group)
return 0;
int count;
array<AIAgent> agents = {};
Group.GetAgents(agents);
foreach (AIAgent agent : agents)
{
if (!agent || !ERR_Actors.CanFight(agent.GetControlledEntity()))
continue;
InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(agent.GetControlledEntity().FindComponent(InventoryStorageManagerComponent));
if (!inventory)
continue;
array<IEntity> items = {};
inventory.GetItems(items);
foreach (IEntity item : items)
{
if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == SHELL)
count++;
}
}
return count;
}
void Bind(int siteId, SCR_AIGroup group, IEntity gun, float now)
{
SiteId = siteId;
Group = group;
Gun = gun;
Position = gun.GetOrigin();
SpawnedAt = now;
Claimed = true;
}
protected int InventoryShells(InventoryStorageManagerComponent inventory)
{
if (!inventory)
return 0;
int count;
array<IEntity> items = {};
inventory.GetItems(items);
foreach (IEntity item : items)
{
if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == SHELL)
count++;
}
return count;
}
protected void Equip(IEntity soldier)
{
InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(soldier.FindComponent(InventoryStorageManagerComponent));
if (!inventory)
{
Audit("EQUIP FAILED", string.Format("crew=%1 inventory missing", soldier));
return;
}
if (soldier == RadioOperator)
{
int capability = ERR_HQRadio.Capability(soldier);
Audit("RADIO EQUIP", string.Format("operator=%1 capability=%2 (2=physical manpack); next HQ radio index verifies route", soldier, capability));
return;
}
if (ERR_HQRadio.Capability(soldier) == 0 && !inventory.TrySpawnPrefabToStorage("{E1A5D4B878AA8980}Prefabs/Items/Equipment/Radios/Radio_R148.et"))
Print("Rereintroduced AI [mortar]: crew radio did not fit; HQ handoff required", LogLevel.WARNING);
// Native mortar-crew backpacks carry three EMPTY three-round boxes.
// Fill them once. No infinite ammunition or replacement after casualties.
for (int i = InventoryShells(inventory); i < 9; i++)
{
if (!inventory.TrySpawnPrefabToStorage(SHELL, purpose: EStoragePurpose.PURPOSE_DEPOSIT))
break;
}
Audit("EQUIP", string.Format("crew=%1 inventory HE=%2 requested=9 radio capability=%3 (0=none)", soldier, InventoryShells(inventory), ERR_HQRadio.Capability(soldier)));
}
bool SupplyGunner()
{
if (!Operational())
return SupplyFailed(OperationalReason());
SCR_AIVehicleUsageComponent usage = SCR_AIVehicleUsageComponent.Cast(Gun.FindComponent(SCR_AIVehicleUsageComponent));
IEntity gunner;
if (usage && usage.GetTurretCompartmentSlot())
gunner = usage.GetTurretCompartmentSlot().GetOccupant();
array<AIAgent> agents = {};
Group.GetAgents(agents);
float nearest = float.MAX;
if (!gunner)
{
foreach (AIAgent candidate : agents)
{
if (!candidate || candidate.GetControlledEntity() == RadioOperator || !ERR_Actors.CanFight(candidate.GetControlledEntity()))
continue;
float distance = vector.DistanceXZ(Gun.GetOrigin(), candidate.GetControlledEntity().GetOrigin());
if (distance < nearest)
{
nearest = distance;
gunner = candidate.GetControlledEntity();
}
}
}
if (!gunner) return SupplyFailed("no fighting gunner found");
if (ERR_Actors.Group(gunner) != Group) return SupplyFailed("turret occupant belongs to another group");
if (!ERR_Actors.CanFight(gunner)) return SupplyFailed("gunner cannot fight");
InventoryStorageManagerComponent destination = InventoryStorageManagerComponent.Cast(gunner.FindComponent(InventoryStorageManagerComponent));
if (!destination)
return SupplyFailed("gunner inventory missing");
if (InventoryShells(destination) > 0)
return true;
int nearbyDonors, donorShells, storageRejected, moveRejected;
foreach (AIAgent bearer : agents)
{
if (!bearer || !ERR_Actors.CanFight(bearer.GetControlledEntity()))
continue;
IEntity donor = bearer.GetControlledEntity();
if (donor == gunner || vector.DistanceXZ(donor.GetOrigin(), gunner.GetOrigin()) > 12)
continue;
InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(donor.FindComponent(InventoryStorageManagerComponent));
if (!inventory)
continue;
nearbyDonors++;
array<IEntity> items = {};
inventory.GetItems(items);
foreach (IEntity item : items)
{
if (!item || !item.GetPrefabData() || item.GetPrefabData().GetPrefabName() != SHELL)
continue;
donorShells++;
BaseInventoryStorageComponent storage = destination.FindStorageForItem(item, EStoragePurpose.PURPOSE_DEPOSIT);
if (!storage) { storageRejected++; continue; }
if (inventory.TryMoveItemToStorage(item, storage))
{
Audit("AMMO TRANSFER", string.Format("request accepted donor=%1 gunner=%2 shell=%3; inventory move is not a fired shot", donor, gunner, item));
return true;
}
moveRejected++;
}
}
return SupplyFailed(string.Format("gunner empty; fighting donors with inventory within 12m=%1 donor HE=%2 destination storage rejected=%3 native move rejected=%4", nearbyDonors, donorShells, storageRejected, moveRejected));
}
bool SupplyFailed(string reason)
{
LastFailure = reason;
Audit("AMMO FAILED", reason);
return false;
}
void Cancel(string reason = "cancel requested")
{
if (CommandOpen)
{
FlushTraces();
Audit("ORDER END", string.Format("reason=%1 observed shots=%2 shell committed=%3 elapsed=%4s last failure=%5", reason, OrderShots, Released, (GetGame().GetWorld().GetWorldTime() - OrderedAt) / 1000, LastFailure));
}
CommandOpen = false;
RadioOrder = null;
PendingRadioReport = null;
Report = null;
AimedAt = -1;
if (Activity)
Activity.Complete();
Activity = null;
}
// Idle distant batteries still report through HQ's scheduler. Their native
// AI needs full detail while firing or when players can interact with them.
protected void UpdateCrewDetail(float now, bool firing = false)
{
if (!Group || Group.GetPlayerCount(true) > 0)
return;
bool active = firing || Activity != null || ERR_MortarSystem.NearPlayer(Position);
int lod = -1;
if (active)
lod = 0;
if (Group.GetPermanentLOD() != lod)
Group.SetPermanentLOD(lod);
if (active && !Group.IsAIActivated())
Group.ActivateAI();
array<AIAgent> agents = {};
Group.GetAgents(agents);
foreach (AIAgent agent : agents)
{
if (!agent || EntityUtils.IsPlayer(agent.GetControlledEntity()))
continue;
if (agent.GetPermanentLOD() != lod)
agent.SetPermanentLOD(lod);
if (active && !agent.IsAIActivated() && ERR_Actors.CanFight(agent.GetControlledEntity()))
agent.ActivateAI();
}
}
void Update(float now)
{
if (!Operational())
{
Cancel(OperationalReason());
return;
}
if (!StartupActivated && now - SpawnedAt >= 10000)
{
SCR_AIVehicleUsageComponent usage = SCR_AIVehicleUsageComponent.Cast(Gun.FindComponent(SCR_AIVehicleUsageComponent));
if (!usage || !Group.GetGroupUtilityComponent().m_VehicleMgr || !Group.GetGroupUtilityComponent().m_VehicleMgr.TryAddVehicle(usage))
{
SpawnFailure = "native gun registration failed";
Cancel(SpawnFailure);
return;
}
array<AIAgent> initialCrew = {};
Group.GetAgents(initialCrew);
foreach (AIAgent initialAgent : initialCrew)
{
IEntity initialActor = initialAgent.GetControlledEntity();
if (initialActor && initialActor.GetPrefabData() && initialActor.GetPrefabData().GetPrefabName() == RADIO_OPERATOR) RadioOperator = initialActor;
}
StartupActivated = true;
Audit("CREW ACTIVATE", "startup delay elapsed; activating and equipping crew");
Group.ActivateAI();
array<AIAgent> agents = {};
Group.GetAgents(agents);
foreach (AIAgent agent : agents)
{
if (agent && ERR_Actors.CanFight(agent.GetControlledEntity()))
{
agent.SetPermanentLOD(0);
agent.ActivateAI();
Equip(agent.GetControlledEntity());
}
}
}
if (Activity)
{
Trace("ACTIVITY", string.Format("native state=%1", Activity.GetActionState()), string.Format("age=%1s aim age=%2s committed=%3 shots=%4", (now - OrderedAt) / 1000, (now - AimedAt) / 1000, Released, OrderShots));
if (Activity.GetActionState() == EAIActionState.FAILED) Cancel("native artillery activity FAILED");
else if (Activity.GetActionState() == EAIActionState.COMPLETED) Cancel("native artillery activity COMPLETED (shot count is separate)");
else if (now - OrderedAt > ERR_MortarSalvo.TIMEOUT_MS) Cancel("120s artillery salvo timeout");
}
if (StartupActivated)
UpdateCrewDetail(now);
}
void Order(ERR_HQReport report, float now)
{
Report = report.Snapshot();
OrderedAt = now;
NextOrder = now + 30000;
Released = false;
UpdateCrewDetail(now, true);
Activity = new SCR_AIStaticArtilleryActivity(Group.GetGroupUtilityComponent(), null, report.Position, SCR_EAIArtilleryAmmoType.HIGH_EXPLOSIVE, ERR_MortarSalvo.ROUNDS);
Group.GetGroupUtilityComponent().AddAction(Activity);
Audit("AIM", string.Format("native activity created; latest source=M%1 observed=%2", report.MessageId, report.Description(now)));
}
}
@@ -0,0 +1,221 @@
// The dedicated manpack operator has no mortar-shell backpack. Preserve the
// native chooser and its caller's original index for every eligible gunner.
modded class SCR_AIStaticArtilleryActivity
{
protected override AIAgent FindBestAgentForArtillery(notnull array<AIAgent> agents, notnull IEntity artilleryEntity, out int outIndex)
{
ERR_MortarSystem system = ERR_MortarSystem.Get();
ERR_MortarBattery battery;
if (system) battery = system.FindGun(artilleryEntity);
if (!battery) return super.FindBestAgentForArtillery(agents, artilleryEntity, outIndex);
array<AIAgent> gunners = {};
foreach (AIAgent agent : agents)
{
if (agent && agent.GetControlledEntity() != battery.RadioOperator && ERR_Actors.CanFight(agent.GetControlledEntity()))
gunners.Insert(agent);
}
int filteredIndex;
AIAgent selected = super.FindBestAgentForArtillery(gunners, artilleryEntity, filteredIndex);
outIndex = -1;
if (selected) outIndex = agents.Find(selected);
return selected;
}
}
// Leave all other artillery (including player-operated captured guns) native.
modded class SCR_AIGetArtilleryAimDistanceCompensation
{
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
{
IEntity gun;
GetVariableIn(PORT_ARTILLERY_ENTITY, gun);
ERR_MortarSystem system = ERR_MortarSystem.Get();
ERR_MortarBattery battery;
if (system)
battery = system.FindGun(gun);
if (!battery)
return super.EOnTaskSimulate(owner, dt);
battery.AimedAt = -1;
float now = GetGame().GetWorld().GetWorldTime();
ERR_HQReport report = system.Latest(battery, now);
if (!ERR_HQ.MissionActive()) { system.Withhold(battery, "aim: mission inactive"); return ENodeResult.FAIL; }
if (!battery.CommandOpen || battery.OrderShots >= ERR_MortarSalvo.ROUNDS) { system.Withhold(battery, "aim: salvo complete or order closed"); return ENodeResult.FAIL; }
if (battery.Released) { system.Withhold(battery, "aim: waiting for committed projectile"); return ENodeResult.FAIL; }
if (!report) { system.Withhold(battery, "aim: " + system.ContactFailure(battery)); return ENodeResult.FAIL; }
battery.Trace("AIM START", "solving moving intercept", string.Format("latest source=M%1; %2", report.MessageId, report.Description(now)));
ResourceName ammo;
GetVariableIn(PORT_AMMO_PREFAB, ammo);
if (ammo != ERR_MortarBattery.SHELL) { system.Withhold(battery, "unsupported ammunition prefab", ammo); return ENodeResult.FAIL; }
Resource resource = Resource.Load(ammo);
if (!resource || !resource.IsValid() || !resource.GetResource()) { system.Withhold(battery, "shell resource load failed", ammo); return ENodeResult.FAIL; }
IEntitySource source = resource.GetResource().ToEntitySource();
if (!source) { system.Withhold(battery, "shell resource has no entity source", ammo); return ENodeResult.FAIL; }
array<float> coefficients = {};
GetAmmoInitialSpeedCoefficients(ammo, coefficients);
if (coefficients.IsEmpty())
coefficients.Insert(1.0);
float minimum, maximum;
GetVerticalAimLimits(gun, minimum, maximum);
float flight = 30;
float offset;
int charge;
vector impact;
vector salvoOffset = ERR_MortarSalvo.Offset(battery.SiteId, battery.OrderId, battery.OrderShots);
bool converged;
// Iterate the moving intercept using the native shell's flight time.
// Reject non-convergence rather than fire with an arbitrary lead time.
for (int iteration = 0; iteration < 4; iteration++)
{
if (!ERR_MortarPrediction.Predict(report, now, flight + 2, impact)) { system.Withhold(battery, "aim prediction: " + ERR_MortarPrediction.FailureReason, string.Format("flight lead=%1s; %2", flight + 2, report.Description(now))); return ENodeResult.FAIL; }
if (!system.OutsideSettlements(impact)) { system.Withhold(battery, "aim target inside settlement exclusion", system.SettlementReason); return ENodeResult.FAIL; }
impact += salvoOffset;
impact[1] = SCR_TerrainHelper.GetTerrainY(impact);
float distance = vector.DistanceXZ(gun.GetOrigin(), impact);
float altitude = impact[1] - gun.GetOrigin()[1];
if (distance < 350 || distance > 4000) { system.Withhold(battery, "predicted impact out of range", string.Format("iteration=%1 distance=%2m impact=%3 allowed=350..4000m", iteration, distance, impact)); return ENodeResult.FAIL; }
bool reachable;
float calculated;
for (int i = 0; i < coefficients.Count(); i++)
{
if (!BallisticTable.GetAimHeightOfProjectileAltitudeFromSource(distance, offset, calculated, source, altitude, coefficients[i]))
continue;
float tangent = (offset + altitude) / distance;
if (calculated <= 0 || calculated > 75 || tangent < Math.Tan(minimum) || tangent > Math.Tan(maximum))
continue;
charge = i;
reachable = true;
break;
}
if (!reachable) { system.Withhold(battery, "no native ballistic solution within elevation/flight-time limits", string.Format("iteration=%1 distance=%2 altitude=%3 charges=%4 elevation radians=%5..%6 flight limit=75s", iteration, distance, altitude, coefficients.Count(), minimum, maximum)); return ENodeResult.FAIL; }
converged = Math.AbsFloat(calculated - flight) < 1;
flight = calculated;
if (converged)
break;
}
if (!converged) { system.Withhold(battery, "moving intercept did not converge in four iterations"); return ENodeResult.FAIL; }
if (!system.Safe(battery, impact, flight + 2)) { system.Withhold(battery, "aim impact safety rejected", system.SafetyReason); return ENodeResult.FAIL; }
battery.Impact = impact;
battery.AimOffset = salvoOffset;
battery.AimedShot = battery.OrderShots;
battery.FlightTime = flight;
battery.AimedAt = now;
battery.LastFailure = "";
battery.Trace("AIM SOLUTION", "ready", string.Format("predicted impact=%1 flight=%2s charge index=%3 aim height offset=%4m latest source=M%5", impact, flight, charge, offset, report.MessageId));
vector aim = impact + Vector(0, offset, 0);
SetVariableOut(PORT_AIM_POS, aim);
SetVariableOut(PORT_INIT_SPEED_ID, charge);
return ENodeResult.SUCCESS;
}
}
modded class SCR_AIShootStaticArtillery
{
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
{
IEntity gun;
GetVariableIn(PORT_ARTILLERY_ENTITY, gun);
ERR_MortarSystem system = ERR_MortarSystem.Get();
ERR_MortarBattery battery;
if (system)
battery = system.FindGun(gun);
if (battery && !system.AllowShot(battery))
{
battery.Trace("SHOOT NODE", "authorization rejected", battery.LastFailure);
return ENodeResult.FAIL;
}
ENodeResult result = super.EOnTaskSimulate(owner, dt);
if (battery)
battery.Trace("SHOOT NODE", string.Format("native result=%1", result), "authorization passed; node result does not confirm a physical shot");
return result;
}
}
modded class SCR_MortarMuzzleComponent
{
protected override void TransferShellToMortar()
{
ERR_MortarSystem system = ERR_MortarSystem.Get();
ERR_MortarBattery battery;
if (system && m_CharController && !EntityUtils.IsPlayer(m_CharController.GetOwner()))
battery = system.FindGun(GetOwner());
if (battery)
{
// The loading animation takes time. Recheck at the actual transfer,
// before native inventory insertion triggers the physical projectile.
if (!system.AllowShot(battery))
{
if (m_ShellComponent)
{
m_ShellComponent.GetOnShellUsed().Remove(TransferShellToMortar);
m_ShellComponent.SetLoadedState(false);
}
CharacterAnimationComponent animation = m_CharController.GetAnimationComponent();
if (animation && animation.GetCommandHandler())
animation.GetCommandHandler().FinishItemUse(false);
battery.Audit("ABORT", "final shell transfer rejected; " + battery.LastFailure);
return;
}
battery.Released = true;
battery.ReserveShellAirspace(GetGame().GetWorld().GetWorldTime());
battery.Audit("SHELL COMMIT", string.Format("final safety passed; gunner=%1 predicted impact=%2 flight=%3s; invoking native transfer, awaiting projectile event", m_CharController.GetOwner(), battery.Impact, battery.FlightTime));
}
super.TransferShellToMortar();
}
override void OnWeaponFired(IEntity effectEntity, BaseMuzzleComponent muzzle, IEntity projectileEntity)
{
IEntity firingCharacter;
if (m_CharController) firingCharacter = m_CharController.GetOwner();
super.OnWeaponFired(effectEntity, muzzle, projectileEntity);
ERR_MortarSystem system = ERR_MortarSystem.Get();
ERR_MortarBattery battery;
if (system)
battery = system.FindGun(GetOwner());
if (!battery)
return;
bool playerGunner;
if (firingCharacter) playerGunner = EntityUtils.IsPlayer(firingCharacter);
battery.ObserveProjectile(projectileEntity, firingCharacter, playerGunner);
}
}
// The native tree normally re-aims only every five shots (and skips the first
// re-aim). Each salvo shell needs its own spread point and fresh authorization.
modded class SCR_AIStaticArtilleryBehavior
{
ERR_MortarBattery ERR_GetMortarBattery()
{
ERR_MortarSystem system = ERR_MortarSystem.Get();
if (!system) return null;
return system.FindGun(m_ArtilleryEntity.m_Value);
}
}
modded class SCR_AIStaticArtilleryBehavior_ShootingLogic
{
override ENodeResult EOnTaskSimulate(AIAgent owner, float dt)
{
ERR_MortarBattery battery;
SCR_AIStaticArtilleryBehavior behavior;
if (m_Utility)
{
behavior = SCR_AIStaticArtilleryBehavior.Cast(m_Utility.GetExecutedAction());
if (behavior) battery = behavior.ERR_GetMortarBattery();
}
if (battery)
{
if (!battery.CommandOpen) return ENodeResult.FAIL;
// Loading can outlast the native pause. Count confirmed shells only.
if (battery.OrderShots <= behavior.GetShotCount()) return ENodeResult.RUNNING;
}
ENodeResult result = super.EOnTaskSimulate(owner, dt);
if (battery && result == ENodeResult.SUCCESS)
{
SetVariableOut(PORT_AIMING_NEEDED, true);
// Transfer existing nearby crew ammunition before the next native load.
if (battery.CommandOpen && battery.OrderShots < ERR_MortarSalvo.ROUNDS)
battery.SupplyGunner();
}
return result;
}
}
@@ -0,0 +1,216 @@
// Owned and ticked by HQ. Initial assets are authored once; losses are never replaced.
class ERR_MortarSystem
{
protected ERR_HQ m_HQ;
protected ref array<ref ERR_MortarBattery> m_Batteries = {};
protected ref ERR_SettlementSafety m_Settlements = new ERR_SettlementSafety();
protected bool m_Prepared;
protected bool m_Stopped;
protected float m_NextDecision;
string SafetyReason;
string SettlementReason;
void ERR_MortarSystem(ERR_HQ hq) { m_HQ = hq; }
static ERR_MortarSystem Get()
{
ERR_HQ hq = ERR_HQ.Get();
if (!hq || !Replication.IsServer()) return null;
return hq.Mortars();
}
static bool NearPlayer(vector position)
{
array<IEntity> players = {};
ERR_Actors.Players(players);
foreach (IEntity player : players)
if (vector.DistanceXZ(player.GetOrigin(), position) <= 1200) return true;
return false;
}
bool Prepare()
{
if (!Replication.IsServer() || m_Prepared || m_Stopped) return false;
m_Prepared = true;
vector position = ERR_Actors.Ground("6000 0 7000");
if (position[1] < 1) return false;
IEntity gun = ERR_Actors.Spawn(ERR_MortarBattery.GUN, position);
SCR_AIGroup group = SCR_AIGroup.Cast(ERR_Actors.Spawn(MortarGroup(), ERR_Actors.Ground(position + "0 0 4")));
if (!gun || !group)
{
ERR_Actors.DeleteSpawned(gun);
ERR_Actors.DeleteSpawned(group);
return false;
}
group.InitFactionKey("USSR");
FactionAffiliationComponent affiliation = FactionAffiliationComponent.Cast(gun.FindComponent(FactionAffiliationComponent));
if (affiliation) affiliation.SetAffiliatedFaction(ERR_GameMode.Get().EnemyFaction());
ERR_MortarBattery battery = new ERR_MortarBattery();
battery.Bind(1, group, gun, GetGame().GetWorld().GetWorldTime());
m_Batteries.Insert(battery);
ERR_GameMode mode = ERR_GameMode.Get();
mode.Own(gun);
mode.RegisterGroup(group);
m_HQ.ReserveGroup(group);
battery.Audit("DEPLOY", "authored gun and four-person crew; finite ammunition initialization pending");
return true;
}
static ResourceName MortarGroup() { return "{B84C05941C4C81B8}Prefabs/ERR/MortarCrew.et"; }
ERR_MortarBattery FindGun(IEntity gun)
{
foreach (ERR_MortarBattery battery : m_Batteries)
if (gun && battery.Gun == gun) return battery;
return null;
}
ERR_MortarBattery FindGroup(SCR_AIGroup group)
{
foreach (ERR_MortarBattery battery : m_Batteries)
if (group && battery.Group == group) return battery;
return null;
}
ERR_HQReport Latest(ERR_MortarBattery battery, float now)
{
// Only the coordinates actually delivered to this battery are available.
// A newer HQ contact cannot update a gun's knowledge without another downlink.
if (!battery || !ERR_MortarPrediction.Fresh(battery.Report, now)) return null;
return battery.Report;
}
string ContactFailure(ERR_MortarBattery battery)
{
if (!battery.Report) return "no delivered target report";
return "delivered target report expired or invalid";
}
bool OutsideSettlements(vector impact)
{
bool clear = m_Settlements.OutsideSettlements(impact);
SettlementReason = m_Settlements.SettlementReason;
return clear;
}
bool Safe(ERR_MortarBattery battery, vector impact, float flight)
{
SafetyReason = "clear";
if (!battery.Operational()) { SafetyReason = battery.OperationalReason(); return false; }
if (!OutsideSettlements(impact)) { SafetyReason = SettlementReason; return false; }
if (SCR_TerrainHelper.GetTerrainY(impact) < 0) { SafetyReason = "impact below Everon sea level"; return false; }
Faction faction = battery.Group.GetFaction();
if (!faction) { SafetyReason = "battery faction missing"; return false; }
array<IEntity> friendlies = {};
m_HQ.PhysicalForces(friendlies);
foreach (IEntity entity : friendlies)
{
Faction friendly = SCR_FactionManager.SGetFaction(entity);
if (!friendly || faction.IsFactionEnemy(friendly) || !ERR_Actors.Alive(entity)) continue;
vector velocity;
IEntity moving = CompartmentAccessComponent.GetVehicleIn(entity);
if (!moving) moving = entity;
if (moving.GetPhysics()) velocity = moving.GetPhysics().GetVelocity();
if (ERR_MortarPrediction.ThreatensFriendly(impact, entity.GetOrigin(), velocity, flight))
{
SafetyReason = "friendly physical force can enter the impact area";
return false;
}
}
return true;
}
bool Withhold(ERR_MortarBattery battery, string reason, string detail = "")
{
battery.LastFailure = reason + "; " + detail;
battery.Trace("WITHHELD", reason, detail);
// Finish the activity from the next HQ tick, never from inside its own node.
battery.Rejected = true;
return false;
}
bool AllowShot(ERR_MortarBattery battery)
{
float now = GetGame().GetWorld().GetWorldTime();
if (!ERR_HQ.MissionActive()) return Withhold(battery, "mission inactive");
if (!battery.Operational()) return Withhold(battery, battery.OperationalReason());
if (!battery.CommandOpen || battery.OrderShots >= ERR_MortarSalvo.ROUNDS) return Withhold(battery, "salvo complete or order closed");
if (battery.Released) return Withhold(battery, "waiting for committed projectile");
if (battery.AimedShot != battery.OrderShots || battery.AimedAt < 0 || now - battery.AimedAt > 10000) return Withhold(battery, "fresh aim solution required");
ERR_HQReport report = Latest(battery, now);
if (!report) return Withhold(battery, ContactFailure(battery));
vector updated;
if (!ERR_MortarPrediction.Predict(report, now, battery.FlightTime, updated)) return Withhold(battery, ERR_MortarPrediction.FailureReason);
updated += battery.AimOffset;
if (vector.DistanceXZ(updated, battery.Impact) > 60) return Withhold(battery, "predicted target left aimed impact area");
if (!OutsideSettlements(updated)) return Withhold(battery, SettlementReason);
if (!Safe(battery, battery.Impact, battery.FlightTime)) return Withhold(battery, SafetyReason);
return true;
}
protected void AdvanceOrder(ERR_MortarBattery battery, float now)
{
if (!battery.RadioOrder) return;
int state = battery.RadioOrder.Advance(now, m_HQ.Journal());
if (state == 0) return;
ERR_HQReport delivered = battery.PendingRadioReport;
battery.RadioOrder = null;
battery.PendingRadioReport = null;
if (state < 0 || !ERR_MortarPrediction.Fresh(delivered, now) || !battery.Operational() || battery.Activity || !battery.SupplyGunner())
{
battery.Cancel("radio delivery, report freshness or gunner availability failed");
battery.NextOrder = now + 10000;
return;
}
battery.Order(delivered, now);
}
void Tick(float now)
{
if (m_Stopped || !Replication.IsServer()) return;
foreach (ERR_MortarBattery battery : m_Batteries)
{
if (battery.Rejected && !battery.Released)
{
battery.Cancel("native aim or firing authorization rejected");
battery.NextOrder = now + 10000;
}
battery.Rejected = false;
battery.Update(now);
AdvanceOrder(battery, now);
}
if (now < m_NextDecision) return;
m_NextDecision = now + 10000;
array<ref ERR_HQReport> reports = {};
m_HQ.SupportContacts(reports, now);
ERR_MortarBattery selected;
ERR_HQReport target;
float distance = float.MAX;
foreach (ERR_MortarBattery battery : m_Batteries)
{
if (!battery.StartupActivated || !battery.Operational() || battery.Activity || battery.RadioOrder || now < battery.NextOrder || battery.CountShells() == 0) continue;
foreach (ERR_HQReport report : reports)
{
float candidate = vector.DistanceXZ(battery.Position, report.Position);
if (candidate < 350 || candidate > 4000 || candidate >= distance || !OutsideSettlements(report.Position)) continue;
selected = battery;
target = report;
distance = candidate;
}
}
if (!selected || !target) return;
ERR_HQRoute route = m_HQ.Downlink(selected.Group, "MORTAR ORDER", target.Description(now), target.MessageId);
if (!route) return;
selected.BeginRequest(target, now);
selected.RadioId = route.MessageId;
selected.RadioOrder = route;
selected.PendingRadioReport = target.Snapshot();
m_NextDecision = now + 20000;
}
void AppendGuns(array<IEntity> entities)
{
foreach (ERR_MortarBattery battery : m_Batteries)
if (battery.Gun && !entities.Contains(battery.Gun)) entities.Insert(battery.Gun);
}
string Status()
{
int ready, shells;
foreach (ERR_MortarBattery battery : m_Batteries)
{
if (battery.StartupActivated && battery.Operational()) ready++;
shells += battery.CountShells();
}
return string.Format("mortars %1/%2; HE shells %3", ready, m_Batteries.Count(), shells);
}
void Stop()
{
m_Stopped = true;
foreach (ERR_MortarBattery battery : m_Batteries) battery.Cancel("HQ stopped");
}
}
@@ -0,0 +1,63 @@
// Vanilla named settlements supply exclusion areas; no original mission location system.
// Shared town/village exclusion for mortar impacts, roadblocks and mine sites.
// Fixed distance from mapped settlement centres, independent of mission
// activation radii. Scattered buildings and props are not settlements.
class ERR_SettlementSafety
{
static const float RADIUS = 200;
string SettlementReason;
protected vector m_SafeImpact;
protected bool m_SettlementNear;
protected vector m_LastSettlementImpact;
protected float m_LastSettlementCheck = -1;
protected bool m_LastSettlementClear;
bool OutsideSettlements(vector impact)
{
float now = GetGame().GetWorld().GetWorldTime();
if (m_LastSettlementCheck >= 0 && now >= m_LastSettlementCheck && now - m_LastSettlementCheck < 1000 && vector.DistanceXZ(impact, m_LastSettlementImpact) == 0)
return m_LastSettlementClear;
m_LastSettlementCheck = now;
m_LastSettlementImpact = impact;
m_LastSettlementClear = false;
m_SafeImpact = impact;
m_SettlementNear = false;
SettlementReason = "clear";
// Also cover named native map settlements, independent of whether the
// mission placed a garrison marker there. Generic building entities also
// include deer stands, bridge pillars, rubble and electrical cabinets.
// Broad vertical bounds keep the 200m distance horizontal on hills.
GetGame().GetWorld().QueryEntitiesByAABB(impact - Vector(RADIUS, 5000, RADIUS), impact + Vector(RADIUS, 5000, RADIUS), CheckSettlement, FilterSettlement, EQueryEntitiesFlags.ALL);
m_LastSettlementClear = !m_SettlementNear;
return m_LastSettlementClear;
}
protected bool FilterSettlement(IEntity entity)
{
return entity && entity.FindComponent(MapDescriptorComponent);
}
protected bool CheckSettlement(IEntity entity)
{
float radius;
MapDescriptorComponent descriptor = MapDescriptorComponent.Cast(entity.FindComponent(MapDescriptorComponent));
if (descriptor)
{
int type = descriptor.GetBaseType();
if (type == EMapDescriptorType.MDT_NAME_CITY)
radius = RADIUS;
else if (type == EMapDescriptorType.MDT_NAME_TOWN)
radius = RADIUS;
else if (type == EMapDescriptorType.MDT_NAME_VILLAGE || type == EMapDescriptorType.MDT_NAME_SETTLEMENT)
radius = RADIUS;
}
if (radius > 0 && vector.DistanceXZ(m_SafeImpact, entity.GetOrigin()) <= radius)
{
m_SettlementNear = true;
SettlementReason = string.Format("named map settlement entity=%1 position=%2 distance=%3m exclusion=%4m", entity, entity.GetOrigin(), vector.DistanceXZ(m_SafeImpact, entity.GetOrigin()), radius);
return false;
}
return true;
}
}
@@ -0,0 +1,9 @@
modded class ERR_ScenarioComponent
{
protected override bool PrepareAdditionalForces()
{
if (!super.PrepareAdditionalForces()) return false;
ERR_HQ hq = ERR_HQ.Get();
return hq && hq.PrepareSupport();
}
}
@@ -0,0 +1,10 @@
#ifdef WORKBENCH
modded class ERR_MortarSystem
{
ERR_MortarBattery ERR_ProbeBattery()
{
if (m_Batteries.Count() != 1) return null;
return m_Batteries[0];
}
}
#endif
@@ -4,8 +4,9 @@ modded class ERR_HQ
{
vector ERR_ProbeResponseOrigin()
{
if (m_Units.IsEmpty() || !m_Units[0].Group) return vector.Zero;
return m_Units[0].Group.GetOrigin() + "0 0 20";
foreach (ERR_HQUnit unit : m_Units)
if (!unit.ReservedForSupport && unit.Group) return unit.Group.GetOrigin() + "0 0 20";
return vector.Zero;
}
bool ERR_ProbeDeliveredResponse()
{
@@ -22,7 +23,7 @@ modded class ERR_HQ
if (!unit.Assignment || waypoints.Contains(unit.Waypoint)) return false;
waypoints.Insert(unit.Waypoint);
}
return m_Units.Count() == 3 && waypoints.Count() > 0 && Assigned() <= m_Mode.Settings().Get("supportSquadLimit");
return waypoints.Count() > 0 && Assigned() <= m_Mode.Settings().Get("supportSquadLimit");
}
string ERR_ProbePerception()
{
@@ -47,15 +48,17 @@ modded class ERR_HQ
}
bool ERR_ProbeSquadsReady()
{
if (m_Units.Count() != 3) return false;
int infantry;
foreach (ERR_HQUnit unit : m_Units)
{
if (unit.ReservedForSupport) continue;
infantry++;
if (!unit.Group || ERR_HQRadio.Capability(unit.Radio) != 2) return false;
array<AIAgent> agents = {};
unit.Group.GetAgents(agents);
if (agents.Count() != 6) return false;
}
return true;
return infantry == 3;
}
}
+48 -1
View File
@@ -13,6 +13,7 @@ modded class ERR_GameMode
protected bool m_ERRTestPlayerDeath;
protected bool m_ERRTestRadioNetwork;
protected bool m_ERRTestHQResponse;
protected bool m_ERRTestMortar;
protected float m_ERRNextProbeLog;
protected ref ERR_NativeRadioProbe m_ERRRadioProbe;
protected ref array<IEntity> m_ERRCacheFolders = {};
@@ -26,7 +27,8 @@ modded class ERR_GameMode
m_ERRTestLostHelicopter = System.GetCLIParam("errSmokeOutcome", outcome) && outcome == "lost-helicopter";
m_ERRTestRadioNetwork = outcome == "radio-network";
m_ERRTestHQResponse = outcome == "hq-response";
m_ERRTestPlayerDeath = outcome == "player-death" || m_ERRTestRadioNetwork || m_ERRTestHQResponse;
m_ERRTestMortar = outcome == "mortar-inventory";
m_ERRTestPlayerDeath = outcome == "player-death" || m_ERRTestRadioNetwork || m_ERRTestHQResponse || m_ERRTestMortar;
m_ERRSmokeDeadline = GetWorld().GetWorldTime() + 150000;
OnPhaseChanged().Insert(ERR_SmokePhase);
GetGame().GetCallqueue().CallLater(ERR_SmokeTick, 500, true);
@@ -117,6 +119,12 @@ modded class ERR_GameMode
if (players.Count() != 1 || Phase() != ERR_Phase.PRISON) return;
m_ERRSmokePlayer = players[0];
if (!ERR_CheckRoster()) return;
if (m_ERRTestMortar)
{
DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false);
m_ERRSmokeStep = 120;
return;
}
if (m_ERRTestHQResponse)
{
DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false);
@@ -227,6 +235,45 @@ modded class ERR_GameMode
m_ERRSmokeStep = 7;
m_ERRSmokeWait = now + 3000;
}
else if (m_ERRSmokeStep == 120)
{
ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery();
if (!battery || !battery.StartupActivated) return;
if (!ERR_Check(battery.Operational() && battery.Group.GetAgentsCount() == 4, "authored physical mortar and four-person crew initialize")) return;
if (!ERR_Check(ERR_HQRadio.Capability(battery.RadioOperator) == 2, "mortar has a dedicated physical manpack operator")) return;
if (!ERR_Check(battery.CountShells() == 27, "mortar starts with exactly 27 physical HE shells")) return;
array<AIAgent> agents = {};
battery.Group.GetAgents(agents);
foreach (AIAgent agent : agents)
{
InventoryStorageManagerComponent inventory = InventoryStorageManagerComponent.Cast(agent.GetControlledEntity().FindComponent(InventoryStorageManagerComponent));
array<IEntity> items = {};
inventory.GetItems(items);
foreach (IEntity item : items)
if (item && item.GetPrefabData() && item.GetPrefabData().GetPrefabName() == ERR_MortarBattery.SHELL) SCR_EntityHelper.DeleteEntityAndChildren(item);
}
m_ERRSmokeStep = 121;
m_ERRSmokeWait = now + 15000;
}
else if (m_ERRSmokeStep == 121)
{
ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery();
if (!ERR_Check(battery.CountShells() == 0 && battery.TotalShots == 0, "depleted mortar inventory stays empty without fabricated ammunition")) return;
ERR_Actors.DeleteSpawned(battery.Gun);
ERR_Actors.DeleteSpawned(battery.Group);
m_ERRSmokeStep = 122;
m_ERRSmokeWait = now + 12000;
}
else if (m_ERRSmokeStep == 122)
{
ERR_MortarBattery battery = ERR_MortarSystem.Get().ERR_ProbeBattery();
if (!ERR_Check(battery && !battery.Gun && !battery.Group && !battery.Operational(), "lost mortar and crew remain lost without replacement spawning")) return;
m_ERRSmokeStep = 9;
SCR_CharacterDamageManagerComponent damage = SCR_CharacterDamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(SCR_CharacterDamageManagerComponent));
damage.EnableDamageHandling(true);
damage.Kill(Instigator.CreateInstigator(m_ERRSmokePlayer));
m_ERRSmokeWait = now + 4000;
}
else if (m_ERRSmokeStep == 110)
{
ERR_HQ hq = ERR_HQ.Cast(Command());
@@ -62,10 +62,13 @@ class ERR_ScenarioComponent : ScriptComponent
group.AddWaypoint(defend);
GetGame().GetCallqueue().CallLater(RegisterGroup, 2000, false, group);
}
if (!PrepareAdditionalForces()) { Rollback(); return false; }
foreach (IEntity entity : m_Spawned) mode.Own(entity);
return true;
}
protected bool PrepareAdditionalForces() { return true; }
protected vector TablePoint(vector lower, vector upper, float along, float across)
{
float x = along;
+8
View File
@@ -133,6 +133,14 @@
"docs/evidence/native-2026-09-19-013224/runner.json.txt",
"docs/evidence/native-2026-09-19-013224/source-sha256.json"
]
},
"scripted_mortar_inventory_losses": {
"status": "passed",
"scope": "Two headless muted local Workbench rounds; 30 assertions. One authored gun, four physical crew, manpack, 27 inventory shells; removed ammunition and destroyed assets stay depleted/lost. Actual mortar firing remains unverified. Seven inherited vehicle schema errors remain.",
"evidence": [
"docs/evidence/native-2026-09-19-014052/report.json",
"docs/evidence/native-2026-09-19-014052/source-sha256.json"
]
}
}
}
+1 -1
View File
@@ -14,7 +14,7 @@ Physical group members observe through vanilla AI perception. `ERR_HQObservation
The coordinator is the sole source of strategic response orders. Individual units retain vanilla tactical combat. It does not spawn reinforcements when alerted. Initial physical forces are authored by the scenario. No distant-unit virtual simulation is implemented.
The current coordinator is a reduced implementation. Full contact scheduling, supporting aircraft, mortar firing and physical logistics are not operational yet. The migrated availability/prediction/salvo helpers must not be mistaken for those controllers.
The current coordinator is a reduced implementation. Full contact scheduling, supporting aircraft and physical logistics remain incomplete. A finite physical mortar controller now compiles; its initialization, ammunition depletion and permanent asset loss pass local tests. Actual firing has not been validated. Aircraft availability helpers must not be mistaken for an operational controller.
## Bounded work and ownership
@@ -0,0 +1,630 @@
---------------------------------------------
Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\console.log started at 2026-09-19 01:40:52 (2026-09-18 23:40:52 UTC)
01:40:52.637 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52' to filesystem under name logs
01:40:52.637 ENGINE : FileSystem: Adding relative directory 'Z:\tmp\erri-workbench-profile\profile' to filesystem under name profile
01:40:52.637 ENGINE : FileSystem: Current working directory: 'Z:\home\jakub\.local\share\Steam\steamapps\common\Arma Reforger Tools\Workbench\'
01:40:52.639 PROFILING : Workbench Create Engine took: 12.101900 ms
01:40:53.674 INIT : INIT : Workbench Init Engine
01:40:53.674 ENGINE : Initializing engine, version 192142
01:40:53.674 ENGINE : CLI Params: -gproj Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj -addonsDir Z:/home/jakub/devel/escapistsrereintroduced/addons -profile Z:/tmp/erri-workbench-profile -logconsole -wbModule WorldEditor -load Worlds/ERR_Everon.ent -plugin ERR_ValidateWorldPlugin -errPlay 1 -errSmoke 1 -errSmokeOutcome mortar-inventory -noThrow
01:40:53.682 ENGINE : Addon dirs:
01:40:53.682 ENGINE : dir: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/'
01:40:53.682 ENGINE : dir: 'Z:/home/jakub/devel/escapistsrereintroduced/addons'
01:40:53.682 ENGINE : dir: './addons'
01:40:53.682 ENGINE : dir: 'Z:/tmp/erri-workbench-profile/addons'
01:40:53.682 ENGINE : Available addons:
01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj' guid: 'FA804F411BDDF2C6'
01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/ai/addon.gproj' guid: '5192138CB9D5B911'
01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/core/addon.gproj' guid: '2528466DE220D91C'
01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/intel/addon.gproj' guid: 'D31039C7C53E348A'
01:40:53.682 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/map/addon.gproj' guid: '9AAEE9041D79809E'
01:40:53.682 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C' (packed)
01:40:53.682 ENGINE : gproj: 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859' (packed)
01:40:53.683 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\chat' to filesystem under name ERR_Chat
01:40:53.683 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\map' to filesystem under name ERR_Map
01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\intel' to filesystem under name ERR_Intel
01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\ai' to filesystem under name ERR_Ai
01:40:53.684 ENGINE : FileSystem: Adding relative directory 'Z:\home\jakub\devel\escapistsrereintroduced\addons\core' to filesystem under name ERR_Core
01:40:53.800 ENGINE : FileSystem: Adding package 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/' (pak count: 14) to filesystem under name ArmaReforger
01:40:53.803 ENGINE : FileSystem: Adding package './addons/core/' (pak count: 2) to filesystem under name core
01:40:53.803 ENGINE : CPU vendor : AuthenticAMD
01:40:53.803 ENGINE : CPU type : 2
01:40:53.803 ENGINE : CPU name : AMD Ryzen 7 3800XT 8-Core Processor
01:40:53.803 ENGINE : CPU cache info : L1 [Inst 32KB, Data 32KB], L2 [Unif 512KB], L3 [Unif 16384KB]
01:40:53.803 ENGINE : CPU count logical : 16
01:40:53.803 ENGINE : CPU count physical : 8
01:40:53.803 ENGINE : CPU features : mmx sse sse2 sse3 ssse3 sse4_1 sse4_2 popcnt aesni pclmulqdq osxsave avx sha avx2
01:40:53.803 RESOURCES : ResourceDB: loading cache (id=0 name=ERR_Chat path=Z:\home\jakub\devel\escapistsrereintroduced\addons\chat/resourceDatabase.rdb)
01:40:53.804 RESOURCES : ResourceDB: loading cache (id=1 name=ERR_Map path=Z:\home\jakub\devel\escapistsrereintroduced\addons\map/resourceDatabase.rdb)
01:40:53.804 RESOURCES : ResourceDB: loading cache (id=2 name=ERR_Intel path=Z:\home\jakub\devel\escapistsrereintroduced\addons\intel/resourceDatabase.rdb)
01:40:53.805 RESOURCES : ResourceDB: loading cache (id=3 name=ERR_Ai path=Z:\home\jakub\devel\escapistsrereintroduced\addons\ai/resourceDatabase.rdb)
01:40:53.805 RESOURCES : ResourceDB: loading cache (id=4 name=ERR_Core path=Z:\home\jakub\devel\escapistsrereintroduced\addons\core/resourceDatabase.rdb)
01:40:53.805 RESOURCES : ResourceDB: loading cache (id=5 name=ArmaReforger path=Z:/tmp/erri-workbench-profile/addons/ArmaReforger/resourceDatabase.rdb)
01:40:53.938 RESOURCES : ResourceDB: loading cache (id=6 name=core path=./addons/core/resourceDatabase.rdb)
01:40:53.940 RESOURCES : ResourceDB: loading cache (id=7 name=profile path=Z:\tmp\erri-workbench-profile\profile/resourceDatabase.rdb)
01:40:53.940 RESOURCES : ResourceDB: loading cache (id=8 name=logs path=Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52/resourceDatabase.rdb)
01:40:54.084 RESOURCES : RESOURCES : ResourceDB: full scan
01:40:54.089 RESOURCES : RESOURCES : scanning...
01:40:54.089 RESOURCES : RESOURCES : scanning @"ERR_Chat"
01:40:54.091 RESOURCES : RESOURCES : scanning @"ERR_Map"
01:40:54.092 RESOURCES : RESOURCES : scanning @"ERR_Intel"
01:40:54.093 RESOURCES : RESOURCES : scanning @"ERR_Ai"
01:40:54.094 RESOURCES : RESOURCES : scanning @"ERR_Core"
01:40:54.096 RESOURCES : RESOURCES : scanning @"ArmaReforger"
01:40:54.231 RESOURCES : RESOURCES : scanning @"core"
01:40:54.235 RESOURCES : RESOURCES : scanning @"profile"
01:40:54.235 RESOURCES : RESOURCES : scanning @"logs"
01:40:54.235 RESOURCES : RESOURCES : processing meta-files...
01:40:54.299 RESOURCES : RESOURCES : processing files...
01:40:54.310 INIT : Workbench startup
01:40:54.310 INIT : Workbench Init Engine
01:40:54.310 RESOURCES : ResourceDB: full scan
01:40:54.310 RESOURCES : processing files...
01:40:54.310 RESOURCES (W): resource not registered: @"$profile:rereintroduced.json". Setting null GUID
01:40:54.310 RESOURCES : RESOURCES : processing folders...
01:40:54.317 RESOURCES : RESOURCES : creating GUID-item mapping...
01:40:54.332 RESOURCES : RESOURCES : building tree...
01:40:54.384 PROFILING : ResourceDB: full scan took: 299.172000 ms
01:40:54.385 RESOURCES : ResourceDB: saving cache (id=0 name=ERR_Chat path=Z:\home\jakub\devel\escapistsrereintroduced\addons\chat/resourceDatabase.rdb)
01:40:54.386 RESOURCES : ResourceDB: written 630/630 bytes
01:40:54.386 RESOURCES : ResourceDB: cache successfully saved
01:40:54.386 RESOURCES : ResourceDB: saving cache (id=1 name=ERR_Map path=Z:\home\jakub\devel\escapistsrereintroduced\addons\map/resourceDatabase.rdb)
01:40:54.387 RESOURCES : ResourceDB: written 804/804 bytes
01:40:54.387 RESOURCES : ResourceDB: cache successfully saved
01:40:54.388 RESOURCES : ResourceDB: saving cache (id=2 name=ERR_Intel path=Z:\home\jakub\devel\escapistsrereintroduced\addons\intel/resourceDatabase.rdb)
01:40:54.389 RESOURCES : ResourceDB: written 227/227 bytes
01:40:54.389 RESOURCES : ResourceDB: cache successfully saved
01:40:54.389 RESOURCES : ResourceDB: saving cache (id=3 name=ERR_Ai path=Z:\home\jakub\devel\escapistsrereintroduced\addons\ai/resourceDatabase.rdb)
01:40:54.391 RESOURCES : ResourceDB: written 985/985 bytes
01:40:54.391 RESOURCES : ResourceDB: cache successfully saved
01:40:54.391 RESOURCES : ResourceDB: saving cache (id=4 name=ERR_Core path=Z:\home\jakub\devel\escapistsrereintroduced\addons\core/resourceDatabase.rdb)
01:40:54.393 RESOURCES : ResourceDB: written 1664/1664 bytes
01:40:54.393 RESOURCES : ResourceDB: cache successfully saved
01:40:54.393 RESOURCES : ResourceDB: saving cache (id=7 name=profile path=Z:\tmp\erri-workbench-profile\profile/resourceDatabase.rdb)
01:40:54.394 RESOURCES : ResourceDB: written 206/206 bytes
01:40:54.394 RESOURCES : ResourceDB: cache successfully saved
01:40:54.394 RESOURCES : ResourceDB: saving cache (id=8 name=logs path=Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52/resourceDatabase.rdb)
01:40:54.396 RESOURCES : ResourceDB: written 81/81 bytes
01:40:54.396 RESOURCES : ResourceDB: cache successfully saved
01:40:54.396 ENGINE : GameProject load
01:40:54.396 ENGINE : Loaded addons:
01:40:54.396 ENGINE : gproj: './addons/core/core.gproj' guid: '5614BBCCBB55ED1C'
01:40:54.396 ENGINE : gproj: 'Z:/tmp/erri-workbench-profile/addons/ArmaReforger/ArmaReforger.gproj' guid: '58D0FB3206B6F859'
01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/core/addon.gproj' guid: '2528466DE220D91C'
01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/ai/addon.gproj' guid: '5192138CB9D5B911'
01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/intel/addon.gproj' guid: 'D31039C7C53E348A'
01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/map/addon.gproj' guid: '9AAEE9041D79809E'
01:40:54.396 ENGINE : gproj: 'Z:/home/jakub/devel/escapistsrereintroduced/addons/chat/addon.gproj' guid: 'FA804F411BDDF2C6'
01:40:54.399 ENGINE : Loading custom engine user config '$profile:.save/app1874910_user76561198020202999/settings/ReforgerEngineSettings.conf'
01:40:54.400 INIT : GameProject engine user settings load @"$profile:.save/app1874910_user76561198020202999/settings/ReforgerEngineSettings.conf"
01:40:54.400 ENGINE : Engine user settings config loaded
01:40:54.400 PROFILING : Settings changed took: 0.002000 ms
01:40:54.503 RENDER : (OK) Adapter 'AMD Radeon RX 6950 XT (RADV NAVI21)' supports feature level 12_0
01:40:54.504 RENDER : Basic screen setup:
01:40:54.504 RENDER : Back buffer format : TEXFMT_R8G8B8A8_SRGB (29)
01:40:54.504 RENDER : MSAA : none
01:40:54.515 RENDER : AMD AGS library initialized, version 6.1.0 x DLL 6.1.0
01:40:54.515 RENDER : Extendeded AMD info for AMD Radeon RX 6950 XT (RADV NAVI21) (primary device)
01:40:54.516 RENDER : * architecture RDNA2, 80 CUs, 40 WGPs (for RDNA), 64 ROPs
01:40:54.516 RENDER : * core clocks 2720 MHz, memory 1124 MHz
01:40:54.516 RENDER : * TFlops 27.9, memory bandwidth (562.0 GB/s)
01:40:54.516 RENDER : AMD AGS correctly initialized
01:40:54.516 RENDER : GPU_ATI (0x1002) (AMD Radeon RX 6950 XT (RADV NAVI21)) with 1 GPU detected, VRAM 16128MB (fast 0MB), shared 64362MB, driver version 99.19.02-230831a-396538C-AMD-Software-Adrenalin-Edition
01:40:54.516 RENDER : Detected output devices:
01:40:54.516 RENDER : * 1 device/s connected to AMD Radeon RX 6950 XT (RADV NAVI21):
01:40:54.516 RENDER : Generic Non-PnP Monitor (\\.\DISPLAY1), 1280x720 (offset 0x0), 30Hz
01:40:54.516 RENDER : Concurrent frames limit 2
01:40:54.592 RENDER : DX12 device successfully created by AMD AGS library
01:40:54.592 RENDER : * user markers not supported in this version AMD SW
01:40:54.592 RENDER : Graphics device features
01:40:54.592 RENDER : Needed:
01:40:54.592 RENDER : * Highest supported shader model: 6.8 (6.0 needed)
01:40:54.592 RENDER : Optional:
01:40:54.592 RENDER : * Allow tearing (VSYNC) : 1
01:40:54.592 RENDER : * 16 bits : 1
01:40:54.592 RENDER : * Resource heap tier : 3
01:40:54.592 RENDER : * Persistent heaps (DRED) : 1
01:40:54.592 RENDER : * DRED 1.2 is supported by compiler
01:40:54.615 RENDER : Main RT format setup.
01:40:54.615 RENDER : Main RT format for quality 0 : TEXFMT_R11G11B10_FLOAT (26)
01:40:54.615 RENDER : Main RT format for quality 1 : TEXFMT_R16G16B16A16_FLOAT (10)
01:40:54.617 ENGINE : Job system settings: coreCount=16, shortJobContextCount=16, shortJobThreadCount=15, longJobThreadCount=16
01:40:54.647 PROFILING : Settings changed took: 0.017700 ms
01:40:55.045 AUDIO : Endpoint: Speakers (PulseAudio Output)
01:40:55.045 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Avg. bytes: 384kB, Sample bits: 32, Block align: 8B
01:40:55.046 AUDIO : Audio client:
01:40:55.046 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Buffer size: 1536B, Frame: 512
01:40:55.049 RENDER : RENDER : Reload shaders
01:40:55.050 RENDER : Enfusion shader version 13
01:40:55.050 INIT : INIT : ShaderListReload
01:40:55.050 PROFILING : ShaderListReload took: 0.000500 ms
01:40:55.190 AUDIO : Endpoint: Speakers (PulseAudio Output)
01:40:55.190 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Avg. bytes: 384kB, Sample bits: 32, Block align: 8B
01:40:55.190 AUDIO : Audio client:
01:40:55.190 AUDIO : Format: Channels: 2, Sample rate: 48kHz, Buffer size: 1536B, Frame: 512
01:40:55.407 RENDER : Loaded 3752 newer shader binaries
01:40:55.407 PROFILING : Reload shaders took: 357.774200 ms
01:40:55.407 ENGINE : Initializing inputs.
01:40:55.420 NETWORK : Initializing networking.
01:40:55.421 NETWORK : Using new GameRplScheduler.
01:40:55.421 SCRIPT : SCRIPT : Initializing scripts
01:40:55.421 SCRIPT : SCRIPT : ScriptProjectManager init
01:40:57.621 PROFILING : ScriptProjectManager init took: 2199.497400 ms
01:40:57.707 PROFILING : Initializing scripts took: 2286.077800 ms
01:40:57.725 ENGINE : Enfusion engine successfully created.
01:40:57.725 PROFILING : Workbench Init Engine took: 4050.389200 ms
01:40:57.725 INIT : INIT : Workbench Create Game
01:40:57.737 GUI : Using default language (en_us)
01:40:57.737 GUI : Loading 'en_us' localization file.
01:40:57.737 INIT : INIT : Loading StringTable
01:40:57.760 PROFILING : Loading StringTable took: 23.572500 ms
01:40:57.760 SCRIPT : SCRIPT : Compiling GameLib scripts
01:40:57.829 SCRIPT : Module: Workbench; loaded 18x files; 36x classes; used 125K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 90ce0460
01:40:57.830 SCRIPT : Module: GameLib; loaded 465x files; 648x classes; used 828K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 4507af04
01:40:57.830 PROFILING : Compiling GameLib scripts took: 69.679300 ms
01:40:57.830 SCRIPT : SCRIPT : Compiling Game scripts
01:40:59.045 INIT : Workbench Create Game
01:40:59.045 SCRIPT : Compiling Game scripts
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete
01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed
01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete
01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api.
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api.
01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete
01:40:59.895 SCRIPT : Module: WorkbenchGame; loaded 171x files; 616x classes; used 2481K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: ad6a2625
01:40:59.902 SCRIPT : Module: Game; loaded 5695x files; 11168x classes; used 32439K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE,ENABLE_BASE_DESTRUCTION,BUDGET_OPTIMIZATION_CHECKS,SHOW_DISCLAIMER,DEBUG,RESPAWN_TIMER_COMPONENT_DEBUG,GAME_MODE_DEBUG,DEBUG_CONFIGURABLE_DIALOGS,DISABLE_WEAPON_SWITCHING,SCRIPTED_AIM_MODIFIER_DEBUG"; CRC32: 25e8ccf6
01:40:59.939 PROFILING : Compiling Game scripts took: 2108.960100 ms
01:40:59.945 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC.
01:40:59.985 ENGINE : Game successfully created.
01:40:59.986 PROFILING : Workbench Create Game took: 2260.919200 ms
01:40:59.994 DEFAULT : Using thumbnail cache directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Chat/thumbnails
01:41:00.821 INIT : INIT : Workbench Reload Game
01:41:00.823 ENGINE : Game destroyed.
01:41:00.830 GUI : Using default language (en_us)
01:41:00.830 GUI : Loading 'en_us' localization file.
01:41:00.830 INIT : INIT : Loading StringTable
01:41:00.844 PROFILING : Loading StringTable took: 13.885100 ms
01:41:00.845 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC.
01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: ban
01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: kick
01:41:00.852 ENGINE : Game successfully created.
01:41:00.852 ENGINE : Game successfully initialized.
01:41:00.852 PROFILING : Workbench Reload Game took: 31.214800 ms
01:41:01.520 WORLD : WORLD : Entities load '$ERR_Core:Worlds/ERR_Everon.ent'
01:41:02.515 PROFILING : Entities load took: 994.643200 ms
01:41:02.529 WORLD : WORLD : CreateEntities
01:41:02.535 WORLD : WORLD : NotifyBeforeEntitiesCreated
01:41:02.536 PROFILING : NotifyBeforeEntitiesCreated took: 0.003800 ms
01:41:02.536 WORLD : WORLD : Wait for preloading data
01:41:02.536 PROFILING : Wait for preloading data took: 0.004100 ms
01:41:02.649 ENTITY : Create entity @"ENTITY:2" ('Eden', GenericTerrainEntity) at <0.000000 0.000000 0.000000> @"{5AD924374E8C7AF6}Prefabs/World/Game/Eden/GenericTerrain_Eden.et"
01:41:02.649 PROFILING : PROFILING : Terrain load
01:41:04.597 PROFILING : Terrain load took: 1947.730900 ms
01:41:08.624 WORLD : CreateEntities
01:41:08.625 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:41:08.625 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:41:08.625 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:41:19.046 WORLD : WORLD : NotifyBeforeEntitiesInitialized
01:41:19.046 PROFILING : NotifyBeforeEntitiesInitialized took: 0.005300 ms
01:41:19.488 WORLD : WORLD : NotifyEntitiesInitialized
01:41:19.488 TERRAIN : TERRAIN : Initializing road networks...
01:41:19.491 PROFILING : Initializing road networks... took: 2.319400 ms
01:41:19.491 PROFILING : NotifyEntitiesInitialized took: 2.801500 ms
01:41:19.491 PROFILING : CreateEntities took: 16961.426100 ms
01:41:19.664 PROFILING : * WorldEditor: LoadWorld: 18149.563700 ms
01:41:21.127 TERRAIN : Loading tile map config (worlds/Eden/Eden/tileMap.conf)
01:41:21.128 TERRAIN : Loading minimap config (worlds/Eden/Eden/miniMap.conf)
01:41:21.129 TERRAIN : The default minimap texture ('worlds/Eden/EdenRasterized.edds') not found. Trying 'worlds/Eden/Eden.edds'...
01:41:21.129 TERRAIN : The default minimap texture ('worlds/Eden/Eden.edds') not found. Skipping...
01:41:21.226 SCRIPT : ERR VALIDATION: prison terrain=211.344, radio terrain=159.656, extraction terrain=65.1562
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7154 y=211.531
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7157 y=211.516
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7160 y=211.5
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7163 y=211.453
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7166 y=211.406
01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7154 y=211.438
01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7157 y=211.438
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7160 y=211.422
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7163 y=211.391
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7166 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7154 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7157 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7160 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7163 y=211.328
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7166 y=211.281
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7154 y=211.25
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7157 y=211.281
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7160 y=211.25
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7163 y=211.234
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7166 y=211.188
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7154 y=211.156
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7157 y=211.172
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7160 y=211.156
01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7163 y=211.141
01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7166 y=211.094
01:41:21.250 SCRIPT : ERR SITE CANDIDATE: position=<6090,211.344,7160> elevationRange=0.640625
01:41:21.275 BACKEND : Attempting online Game Config instead.
01:41:24.563 INIT : INIT : Workbench Reload Game
01:41:24.565 ENGINE : Game destroyed.
01:41:24.572 GUI : Using default language (en_us)
01:41:24.572 GUI : Loading 'en_us' localization file.
01:41:24.572 INIT : INIT : Loading StringTable
01:41:24.593 PROFILING : Loading StringTable took: 20.977700 ms
01:41:24.594 INIT : Creating game instance(ArmaReforgerScripted), version 1.8.0.13 built 2026-08-21 14:30:18 UTC.
01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: ban
01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: kick
01:41:24.602 ENGINE : Game successfully created.
01:41:24.602 ENGINE : Game successfully initialized.
01:41:24.602 PROFILING : Workbench Reload Game took: 39.087100 ms
01:41:24.605 DEFAULT (W): LogiLED: Cannot initialize! (service not running or no compatible device detected)
01:41:24.670 PLATFORM : Save data from container 'settings' have been loaded
01:41:24.759 PLATFORM : Save data from container 'sessions' have been loaded
01:41:24.759 PLATFORM : GameProject user settings load from profile @"ReforgerGameSettings.conf"
01:41:24.759 ENGINE : Game user settings config loaded
01:41:24.857 DEFAULT : [SaveGameManager] Starting new playthrough nr.0 '' for mission '{B6C516F86302C679}Worlds/ERR_Everon.ent'.
01:41:24.866 WORLD : WORLD : Game::LoadEntities
01:41:24.866 WORLD : WORLD : Initializing world systems @"{1C60D2EDA2B468B8}Configs/Systems/BaseGameModeSystems.conf"
01:41:24.867 NETWORK : Enabled lag compensation, 29 frames with 100 FPS and 280 ms rewind limits.
01:41:24.867 WORLD : WORLD : CreateEntities
01:41:24.867 WORLD : WORLD : CreateEntities
01:41:24.867 WORLD : WORLD : NotifyBeforeEntitiesCreated
01:41:24.879 RESOURCES : Loaded mission headers from 7 addon(s)!
01:41:24.879 PROFILING : NotifyBeforeEntitiesCreated took: 11.838100 ms
01:41:24.879 WORLD : WORLD : Wait for preloading data
01:41:24.879 PROFILING : Wait for preloading data took: 0.000700 ms
01:41:29.309 WORLD : Game::LoadEntities
01:41:29.309 WORLD : CreateEntities
01:41:29.309 WORLD : CreateEntities
01:41:29.309 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:41:29.309 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:41:29.309 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:41:30.730 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>')
01:41:30.730 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>')
01:41:30.730 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>')
01:41:30.739 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>
01:41:30.739 ENTITY : CreateComponent 'Hierarchy'
01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>')
01:41:30.739 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>
01:41:30.739 ENTITY : CreateComponent 'Hierarchy'
01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>')
01:41:30.740 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>
01:41:30.740 ENTITY : CreateComponent 'Hierarchy'
01:41:30.740 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>')
01:41:35.790 ENTITY : Create entity @"ENTITY:2305843009213693956" ('Factions', SCR_FactionManager) at <0.000000 0.000000 0.000000> @"{589540B35EBA8CDC}Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et"
01:41:35.790 RESOURCES : GetResourceObject @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et"
01:41:35.790 WORLD : Entity prefab load @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et"
01:41:35.790 RESOURCES : GetResourceObject @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et"
01:41:35.790 WORLD : Entity prefab load @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et"
01:41:35.791 RESOURCES : GetResourceObject @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et"
01:41:35.791 WORLD : Entity prefab load @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et"
01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1)
01:41:35.836 RESOURCES : GetResourceObject @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et"
01:41:35.836 WORLD : Entity prefab load @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et"
01:41:35.836 RESOURCES : GetResourceObject @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et"
01:41:35.836 WORLD : Entity prefab load @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et"
01:41:35.836 RESOURCES : GetResourceObject @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et"
01:41:35.836 WORLD : Entity prefab load @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et"
01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73)
01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033)
01:41:35.839 RESOURCES : GetResourceObject @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et"
01:41:35.839 WORLD : Entity prefab load @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et"
01:41:35.839 RESOURCES : GetResourceObject @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et"
01:41:35.839 WORLD : Entity prefab load @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et"
01:41:35.839 RESOURCES : GetResourceObject @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et"
01:41:35.839 WORLD : Entity prefab load @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et"
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216)
01:41:36.152 WORLD : WORLD : NotifyBeforeEntitiesInitialized
01:41:36.152 PROFILING : NotifyBeforeEntitiesInitialized took: 0.044800 ms
01:41:38.078 WORLD : InitEntities 'world'
01:41:38.078 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:41:38.104 WORLD : InitEntities 'world'
01:41:38.104 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:41:38.104 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate
01:41:38.105 WORLD : WORLD : NotifyEntitiesInitialized
01:41:38.105 TERRAIN : TERRAIN : Initializing road networks...
01:41:38.107 PROFILING : Initializing road networks... took: 2.516200 ms
01:41:38.107 DEFAULT : DEFAULT : WorldVolumesCollection
01:41:38.165 PROFILING : WorldVolumesCollection took: 57.969400 ms
01:41:38.165 INIT : INIT : SoundWorldInit
01:41:38.178 PROFILING : SoundWorldInit took: 13.175700 ms
01:41:38.179 PROFILING : NotifyEntitiesInitialized took: 73.950500 ms
01:41:38.179 PROFILING : CreateEntities took: 13311.136000 ms
01:41:38.179 PROFILING : CreateEntities took: 13311.314800 ms
01:41:38.179 WORLD : WORLD : Wait for preloading data around camera
01:41:38.179 PROFILING : Wait for preloading data around camera took: 0.000900 ms
01:41:38.179 WORLD : WORLD : EOnActivate
01:41:38.212 PROFILING : EOnActivate took: 32.311200 ms
01:41:38.212 PROFILING : Game::LoadEntities took: 13345.939800 ms
01:41:38.502 DEFAULT : Entered offline game state.
01:41:38.605 NETWORK : Player connected: connectionID=2147483646
01:41:38.605 NETWORK : ### Connecting player: connectionID=2147483646, Name=
01:41:38.605 NETWORK : ### Creating player: PlayerId=1, Name=jakub
01:41:38.610 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.611 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000>
01:41:38.611 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:41:38.613 SCRIPT (W): Can't open config file ""
01:41:38.620 WORLD : InitEntities 'world'
01:41:38.620 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.621 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout"
01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:41:38.621 SCRIPT (W): Slot_Chat Has no Content!
01:41:38.621 SCRIPT (W): Slot_VON Has no Content!
01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content!
01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content!
01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content!
01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content!
01:41:38.622 SCRIPT (W): Slot_Hints Has no Content!
01:41:38.637 NETWORK : ### Updating player: PlayerId=1, Name=jakub, rplIdentity=0xFFFFFFFE, IdentityId=00000000-0000-0000-0000-000000000000
01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config
01:41:38.638 NETWORK : Players connecting: 0
01:41:38.638 NETWORK : Players connected: 1 / 1
01:41:38.663 DEFAULT : Using autosave directory: C:/users/steamuser/AppData/Local/Temp/Arma Reforger Workbench/Projects/ERR_Chat/autosaves
01:41:38.664 PROFILING : Workbench startup took: 46095.096100 ms
01:41:38.688 WORLD : Frame start
01:41:38.688 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated.
01:41:38.701 WORLD : UpdateEntities
01:41:38.701 WORLD : Frame
01:41:38.701 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME
01:41:38.883 WORLD : UpdateEntities
01:41:38.883 WORLD : PostFrame
01:41:38.883 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout"
01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:41:38.925 RESOURCES : GetResourceObject @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout"
01:41:38.925 GUI : Layout load @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout"
01:41:38.925 GUI : Widget prefab @"{EA1CC57D868E94F9}UI/layouts/HUD/Hint/Hint.layout"
01:41:38.925 GUI (W): Overridden prefab member (GUID: '{661AB14E0F471C66}' type: ButtonWidgetClass) no longer exists in prefab
01:41:39.067 RENDER : RENDER : ObjectsHeightMap::Build
01:41:39.067 RENDER : RENDER : MeshOccupancyGridManager::GenerateAllForWorld
01:41:39.238 PROFILING : MeshOccupancyGridManager::GenerateAllForWorld took: 170.403800 ms
01:41:39.247 PROFILING : ObjectsHeightMap::Build took: 180.078800 ms
01:41:40.508 SCRIPT : Rereintroduced [mission]: phase 0 -> 1
01:41:40.919 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US)
01:41:40.999 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.344,7160>
01:41:41.049 SCRIPT : ERR SMOKE PASS: new identity may enter prison
01:41:41.049 SCRIPT : ERR SMOKE PASS: spawn consumes identity life
01:41:41.050 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection
01:41:41.050 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life
01:41:41.050 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected
01:41:41.050 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy
01:41:51.140 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize
01:41:51.140 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator
01:41:51.141 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells
01:42:06.266 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition
01:42:18.384 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning
01:42:18.385 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.344, 7160> killed himself!
01:42:22.418 SCRIPT : ERR SMOKE PASS: native damage kills prisoner
01:42:22.418 SCRIPT : ERR SMOKE PASS: death selects spectator without another life
01:42:22.418 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death
01:42:49.204 SCRIPT : Rereintroduced [mission]: phase 1 -> 6
01:42:49.204 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace
01:42:49.204 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1
01:42:49.250 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME
01:42:49.253 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:42:49.253 SCRIPT (W): Slot_Chat Has no Content!
01:42:49.253 SCRIPT (W): Slot_VON Has no Content!
01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content!
01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:42:51.240 SCRIPT : -- Stack trace --
01:42:51.240 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:42:51.241 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:42:51.241 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15
01:42:51.241 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:42:51.241 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:42:51.241 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:42:51.241 SCRIPT : -----------------
01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:42:51.242 SCRIPT : -- Stack trace --
01:42:51.242 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:42:51.242 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:42:51.242 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21
01:42:51.242 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:42:51.242 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:42:51.242 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:42:51.242 SCRIPT : -----------------
01:42:51.244 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:42:51.244 SCRIPT (W): Slot_Chat Has no Content!
01:42:51.244 SCRIPT (W): Slot_VON Has no Content!
01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content!
01:42:53.227 RESOURCES : Screenshot saved to $logs:err-result.png
01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested
01:43:19.438 DEFAULT (W): Achievements cannot be saved.
01:43:19.438 DEFAULT (W): Achievements failed to save. Consecutive calls to Achievements API may fail.
01:43:19.736 PLATFORM : Save data from container 'settings' have been loaded
01:43:19.836 PLATFORM : Save data from container 'sessions' have been loaded
01:43:19.836 PLATFORM : GameProject user settings load from profile @"ReforgerGameSettings.conf"
01:43:19.836 ENGINE : Game user settings config loaded
01:43:22.928 DEFAULT : [SaveGameManager] Starting new playthrough nr.0 '' for mission '{B6C516F86302C679}Worlds/ERR_Everon.ent'.
01:43:22.928 WORLD : WORLD : Entities load '$ERR_Core:Worlds/ERR_Everon.ent'
01:43:23.632 PROFILING : Entities load took: 703.289600 ms
01:43:23.634 WORLD : WORLD : Game::LoadEntities
01:43:23.635 WORLD : WORLD : Initializing world systems @"{1C60D2EDA2B468B8}Configs/Systems/BaseGameModeSystems.conf"
01:43:23.635 NETWORK : Enabled lag compensation, 29 frames with 100 FPS and 280 ms rewind limits.
01:43:23.635 WORLD : WORLD : CreateEntities
01:43:23.635 WORLD : WORLD : CreateEntities 'world'
01:43:23.635 WORLD : WORLD : NotifyBeforeEntitiesCreated
01:43:23.635 RESOURCES : Unloading all loaded mission headers from 7 addon(s)!
01:43:23.645 RESOURCES : Loaded mission headers from 7 addon(s)!
01:43:23.645 PROFILING : NotifyBeforeEntitiesCreated took: 9.256600 ms
01:43:23.645 WORLD : WORLD : Wait for preloading data
01:43:23.645 PROFILING : Wait for preloading data took: 0.000900 ms
01:43:23.645 ENTITY : Create entity @"ENTITY:2" ('Eden', GenericTerrainEntity) at <0.000000 0.000000 0.000000> @"{5AD924374E8C7AF6}Prefabs/World/Game/Eden/GenericTerrain_Eden.et"
01:43:23.645 PROFILING : PROFILING : Terrain load
01:43:25.207 PROFILING : Terrain load took: 1561.481800 ms
01:43:28.068 WORLD : Game::LoadEntities
01:43:28.068 WORLD : CreateEntities
01:43:28.068 WORLD : CreateEntities 'world'
01:43:28.068 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:43:28.068 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:43:28.068 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:43:29.407 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>')
01:43:29.407 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>')
01:43:29.407 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>')
01:43:29.412 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>')
01:43:29.413 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>')
01:43:29.413 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>')
01:43:29.417 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>
01:43:29.417 ENTITY : CreateComponent 'Hierarchy'
01:43:29.417 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>')
01:43:29.418 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>
01:43:29.418 ENTITY : CreateComponent 'Hierarchy'
01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>')
01:43:29.418 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>
01:43:29.418 ENTITY : CreateComponent 'Hierarchy'
01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>')
01:43:34.514 WORLD : WORLD : NotifyBeforeEntitiesInitialized
01:43:34.514 PROFILING : NotifyBeforeEntitiesInitialized took: 0.034100 ms
01:43:36.462 WORLD : InitEntities 'world'
01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:43:36.462 WORLD : InitEntities 'world'
01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:43:36.462 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate
01:43:36.463 WORLD : WORLD : NotifyEntitiesInitialized
01:43:36.463 TERRAIN : TERRAIN : Initializing road networks...
01:43:36.465 PROFILING : Initializing road networks... took: 1.744900 ms
01:43:36.465 DEFAULT : DEFAULT : WorldVolumesCollection
01:43:36.521 PROFILING : WorldVolumesCollection took: 56.157900 ms
01:43:36.521 INIT : INIT : SoundWorldInit
01:43:36.521 PROFILING : SoundWorldInit took: 0.389200 ms
01:43:36.521 PROFILING : NotifyEntitiesInitialized took: 58.456400 ms
01:43:36.521 PROFILING : CreateEntities took: 12885.704000 ms
01:43:36.522 PROFILING : CreateEntities took: 12885.896000 ms
01:43:36.522 WORLD : WORLD : Wait for preloading data around camera
01:43:36.522 PROFILING : Wait for preloading data around camera took: 0.001300 ms
01:43:36.522 WORLD : WORLD : EOnActivate
01:43:36.551 PROFILING : EOnActivate took: 28.585000 ms
01:43:36.551 PROFILING : Game::LoadEntities took: 12916.663600 ms
01:43:36.551 PROFILING : * LoadEntities: 12917.015400 ms
01:43:37.037 DEFAULT : Entered offline game state.
01:43:37.146 NETWORK : Player connected: connectionID=2147483646
01:43:37.146 NETWORK : ### Connecting player: connectionID=2147483646, Name=
01:43:37.146 NETWORK : ### Creating player: PlayerId=1, Name=jakub
01:43:37.148 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.148 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000>
01:43:37.148 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:43:37.150 SCRIPT (W): Can't open config file ""
01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress.
01:43:37.151 WORLD : InitEntities 'world'
01:43:37.151 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.151 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout"
01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:43:37.151 SCRIPT (W): Slot_Chat Has no Content!
01:43:37.152 SCRIPT (W): Slot_VON Has no Content!
01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content!
01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content!
01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content!
01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content!
01:43:37.152 SCRIPT (W): Slot_Hints Has no Content!
01:43:37.159 NETWORK : ### Updating player: PlayerId=1, Name=jakub, rplIdentity=0xFFFFFFFE, IdentityId=00000000-0000-0000-0000-000000000000
01:43:37.159 NETWORK : Players connecting: 0
01:43:37.159 NETWORK : Players connected: 1 / 1
01:43:37.182 WORLD : Frame start
01:43:37.182 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated.
01:43:37.195 WORLD : UpdateEntities
01:43:37.195 WORLD : Frame
01:43:37.195 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME
01:43:37.327 WORLD : UpdateEntities
01:43:37.327 WORLD : PostFrame
01:43:37.327 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout"
01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:43:37.349 RENDER : RENDER : ObjectsHeightMap::Build
01:43:37.349 RENDER : RENDER : MeshOccupancyGridManager::GenerateAllForWorld
01:43:37.518 PROFILING : MeshOccupancyGridManager::GenerateAllForWorld took: 169.161400 ms
01:43:37.526 PROFILING : ObjectsHeightMap::Build took: 176.719600 ms
01:43:38.733 SCRIPT : Rereintroduced [mission]: phase 0 -> 1
01:43:39.219 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US)
01:43:39.246 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.444,7160>
01:43:39.269 SCRIPT : ERR SMOKE PASS: new identity may enter prison
01:43:39.269 SCRIPT : ERR SMOKE PASS: spawn consumes identity life
01:43:39.270 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection
01:43:39.270 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life
01:43:39.270 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected
01:43:39.270 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy
01:43:49.368 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize
01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator
01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells
01:44:04.535 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition
01:44:16.624 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning
01:44:16.625 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.342, 7160> killed himself!
01:44:20.660 SCRIPT : ERR SMOKE PASS: native damage kills prisoner
01:44:20.661 SCRIPT : ERR SMOKE PASS: death selects spectator without another life
01:44:20.661 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death
01:44:47.538 SCRIPT : Rereintroduced [mission]: phase 1 -> 6
01:44:47.538 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace
01:44:47.539 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1
01:44:47.583 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME
01:44:47.585 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:44:47.585 SCRIPT (W): Slot_Chat Has no Content!
01:44:47.586 SCRIPT (W): Slot_VON Has no Content!
01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content!
01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:44:49.577 SCRIPT : -- Stack trace --
01:44:49.577 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:44:49.577 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:44:49.577 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15
01:44:49.577 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:44:49.577 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:44:49.577 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:44:49.578 SCRIPT : -----------------
01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:44:49.578 SCRIPT : -- Stack trace --
01:44:49.578 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:44:49.578 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:44:49.578 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21
01:44:49.578 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:44:49.579 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:44:49.579 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:44:49.579 SCRIPT : -----------------
01:44:49.580 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:44:49.580 SCRIPT (W): Slot_Chat Has no Content!
01:44:49.581 SCRIPT (W): Slot_VON Has no Content!
01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content!
01:44:51.563 RESOURCES : Screenshot saved to $logs:err-result.png
Binary file not shown.

After

Width:  |  Height:  |  Size: 230 KiB

@@ -0,0 +1,202 @@
---------------------------------------------
Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\error.log started at 2026-09-19 01:40:54 (2026-09-18 23:40:54 UTC)
01:40:54.310 INIT : Workbench startup
01:40:54.310 INIT : Workbench Init Engine
01:40:54.310 RESOURCES : ResourceDB: full scan
01:40:54.310 RESOURCES : processing files...
01:40:54.310 RESOURCES (W): resource not registered: @"$profile:rereintroduced.json". Setting null GUID
01:40:59.045 INIT : Workbench Create Game
01:40:59.045 SCRIPT : Compiling Game scripts
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete
01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed
01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete
01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api.
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api.
01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete
01:41:08.624 WORLD : CreateEntities
01:41:08.624 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:41:08.625 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:41:08.625 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:41:24.605 DEFAULT (W): LogiLED: Cannot initialize! (service not running or no compatible device detected)
01:41:29.309 WORLD : Game::LoadEntities
01:41:29.309 WORLD : CreateEntities
01:41:29.309 WORLD : CreateEntities
01:41:29.309 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:41:29.309 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:41:29.309 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:41:30.730 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>')
01:41:30.730 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>')
01:41:30.730 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>
01:41:30.730 ENTITY : CreateComponent 'Hierarchy'
01:41:30.730 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>')
01:41:30.735 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>
01:41:30.735 ENTITY : CreateComponent 'Hierarchy'
01:41:30.735 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>')
01:41:30.739 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>
01:41:30.739 ENTITY : CreateComponent 'Hierarchy'
01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>')
01:41:30.739 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>
01:41:30.739 ENTITY : CreateComponent 'Hierarchy'
01:41:30.739 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>')
01:41:30.740 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>
01:41:30.740 ENTITY : CreateComponent 'Hierarchy'
01:41:30.740 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>')
01:41:35.790 ENTITY : Create entity @"ENTITY:2305843009213693956" ('Factions', SCR_FactionManager) at <0.000000 0.000000 0.000000> @"{589540B35EBA8CDC}Prefabs/MP/Managers/Factions/FactionManager_USxUSSR.et"
01:41:35.790 RESOURCES : GetResourceObject @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et"
01:41:35.790 WORLD : Entity prefab load @"{5168FEA3054D6D15}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB_MERDC.et"
01:41:35.790 RESOURCES : GetResourceObject @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et"
01:41:35.790 WORLD : Entity prefab load @"{F6B23D17D5067C11}Prefabs/Vehicles/Wheeled/M151A2/M151A2_M2HB.et"
01:41:35.791 RESOURCES : GetResourceObject @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et"
01:41:35.791 WORLD : Entity prefab load @"{F649585ABB3706C4}Prefabs/Vehicles/Wheeled/M151A2/M151A2.et"
01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1)
01:41:35.836 RESOURCES : GetResourceObject @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et"
01:41:35.836 WORLD : Entity prefab load @"{F7B9B434FCFF00B3}Prefabs/Vehicles/Wheeled/Conflict_Variants/BRDM2_Conflict.et"
01:41:35.836 RESOURCES : GetResourceObject @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et"
01:41:35.836 WORLD : Entity prefab load @"{254289B9C09904AB}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2.et"
01:41:35.836 RESOURCES : GetResourceObject @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et"
01:41:35.836 WORLD : Entity prefab load @"{532B5F3CF8496E59}Prefabs/Vehicles/Wheeled/BRDM2/BRDM2_base.et"
01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73)
01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033)
01:41:35.839 RESOURCES : GetResourceObject @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et"
01:41:35.839 WORLD : Entity prefab load @"{BD75A18920BD1278}Prefabs/Vehicles/Wheeled/Conflict_Variants/BTR70_Conflict.et"
01:41:35.839 RESOURCES : GetResourceObject @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et"
01:41:35.839 WORLD : Entity prefab load @"{C012BB3488BEA0C2}Prefabs/Vehicles/Wheeled/BTR70/BTR70.et"
01:41:35.839 RESOURCES : GetResourceObject @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et"
01:41:35.839 WORLD : Entity prefab load @"{1C5FE7B7FF49BB8D}Prefabs/Vehicles/Wheeled/BTR70/BTR70_Base.et"
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49)
01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216)
01:41:38.078 WORLD : InitEntities 'world'
01:41:38.078 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:41:38.610 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.611 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000>
01:41:38.611 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:41:38.613 SCRIPT (W): Can't open config file ""
01:41:38.620 WORLD : InitEntities 'world'
01:41:38.620 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:41:38.621 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout"
01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:41:38.621 SCRIPT (W): Slot_Chat Has no Content!
01:41:38.621 SCRIPT (W): Slot_VON Has no Content!
01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content!
01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content!
01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content!
01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content!
01:41:38.622 SCRIPT (W): Slot_Hints Has no Content!
01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config
01:41:38.883 WORLD : UpdateEntities
01:41:38.883 WORLD : PostFrame
01:41:38.883 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout"
01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:41:38.925 RESOURCES : GetResourceObject @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout"
01:41:38.925 GUI : Layout load @"{20A6917D2114E29A}UI/layouts/HUD/Hint/HintInfoDisplay.layout"
01:41:38.925 GUI : Widget prefab @"{EA1CC57D868E94F9}UI/layouts/HUD/Hint/Hint.layout"
01:41:38.925 GUI (W): Overridden prefab member (GUID: '{661AB14E0F471C66}' type: ButtonWidgetClass) no longer exists in prefab
01:42:49.253 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:42:49.253 SCRIPT (W): Slot_Chat Has no Content!
01:42:49.253 SCRIPT (W): Slot_VON Has no Content!
01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content!
01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:42:51.244 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:42:51.244 SCRIPT (W): Slot_Chat Has no Content!
01:42:51.244 SCRIPT (W): Slot_VON Has no Content!
01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content!
01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested
01:43:19.438 DEFAULT (W): Achievements cannot be saved.
01:43:19.438 DEFAULT (W): Achievements failed to save. Consecutive calls to Achievements API may fail.
01:43:28.068 WORLD : Game::LoadEntities
01:43:28.068 WORLD : CreateEntities
01:43:28.068 WORLD : CreateEntities 'world'
01:43:28.068 ENTITY : Create entity @"ENTITY:610406" ('StaticModelEntity','Assets/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.xob') at <1931.796021 81.777000 5138.725098> @"{6A004A8F0571D456}Prefabs/Structures/Infrastructure/Towers/TransmitterTower_01/TransmitterTower_01_small.et"
01:43:28.068 ENTITY : CreateComponent 'ScriptedRadioComponent'
01:43:28.068 DEFAULT (W): World doesn't contain RadioManagerEntity to support any BaseRadioComponent.
01:43:29.407 ENTITY : Create entity @"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842066" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1080.213013 10.776751 6018.347168>')
01:43:29.407 ENTITY : Create entity @"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842068" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1082.185913 10.778749 6018.331055>')
01:43:29.407 ENTITY : Create entity @"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>
01:43:29.407 ENTITY : CreateComponent 'Hierarchy'
01:43:29.407 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842070" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <1084.190918 10.790751 6018.334961>')
01:43:29.412 ENTITY : Create entity @"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842333" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4425.594727 9.981750 11029.402344>')
01:43:29.413 ENTITY : Create entity @"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842335" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4426.584473 9.983749 11031.109375>')
01:43:29.413 ENTITY : Create entity @"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>
01:43:29.413 ENTITY : CreateComponent 'Hierarchy'
01:43:29.413 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842337" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <4427.572266 9.995750 11032.853516>')
01:43:29.417 ENTITY : Create entity @"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>
01:43:29.417 ENTITY : CreateComponent 'Hierarchy'
01:43:29.417 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842591" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.946289 10.470250 1551.986084>')
01:43:29.418 ENTITY : Create entity @"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>
01:43:29.418 ENTITY : CreateComponent 'Hierarchy'
01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842593" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10009.430664 10.472250 1550.081421>')
01:43:29.418 ENTITY : Create entity @"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>
01:43:29.418 ENTITY : CreateComponent 'Hierarchy'
01:43:29.418 ENTITY (W): Invalid PivotID 'socket_light_04' in Hierarchy component ('@"ENTITY:842595" ('GameEntity','Assets/Structures/BuildingsParts/Lights/LampTower_01.xob') at <10008.926758 10.484250 1548.140869>')
01:43:36.462 WORLD : InitEntities 'world'
01:43:36.462 ENTITY : Init entity @"ENTITY:2305843009213693953" ('Rereintroduced', ERR_GameMode) at <1076.468018 51.000999 1325.246948> @"{978E045E53EF36C8}Prefabs/ERR/GameMode.et"
01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:43:37.148 ENTITY : SpawnEntityPrefab @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.148 ENTITY : Create entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000>
01:43:37.148 ENTITY : EntityPrefabUse @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:43:37.150 SCRIPT (W): Can't open config file ""
01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress.
01:43:37.151 WORLD : InitEntities 'world'
01:43:37.151 ENTITY : Init entity @"ENTITY:4611686018427388381" ('SCR_PlayerController') at <0.000000 0.000000 0.000000> @"{225E51284CC95CFA}Prefabs/Characters/Core/DefaultPlayerControllerMP.et"
01:43:37.151 GUI : WidgetManager: CrateWidgets @"{3C9DCDD76AB83157}UI/layouts/HUD/HUDLayouts/HUDManager_Root.layout"
01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:43:37.151 SCRIPT (W): Slot_Chat Has no Content!
01:43:37.152 SCRIPT (W): Slot_VON Has no Content!
01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content!
01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content!
01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content!
01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content!
01:43:37.152 SCRIPT (W): Slot_Hints Has no Content!
01:43:37.327 WORLD : UpdateEntities
01:43:37.327 WORLD : PostFrame
01:43:37.327 GUI : WidgetManager: CrateWidgets @"{D89BBA18F99053D6}UI/layouts/HUD/Chat/ChatHud.layout"
01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:44:47.585 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:44:47.585 SCRIPT (W): Slot_Chat Has no Content!
01:44:47.586 SCRIPT (W): Slot_VON Has no Content!
01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content!
01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:44:49.580 GUI : WidgetManager: CrateWidgets @"{144919871D65F121}UI/layouts/HUD/GameOver/EndScreen/EndScreen.layout"
01:44:49.580 SCRIPT (W): Slot_Chat Has no Content!
01:44:49.581 SCRIPT (W): Slot_VON Has no Content!
01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content!
@@ -0,0 +1,156 @@
[gamescope] [Info] console: gamescope version 3.16.28 (gcc 16.2.1)
No CAP_SYS_NICE, falling back to regular-priority compute and threads.
Performance will be affected.
[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts'
[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope'
[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/common'
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/inspect.lua' (id: 0)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/modegen.lua' (id: 1)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/common/util.lua' (id: 2)
[gamescope] [Info] scriptmgr: Loading scripts from: '/usr/share/gamescope/scripts/00-gamescope/displays'
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/asus.rogally.lcd.lua' (id: 3)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/deckhd.steamdeck.deckhd-lcd.lua' (id: 4)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/gpd.win4.lcd.lua' (id: 5)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongo.lcd.lua' (id: 6)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/lenovo.legiongos.lcd.lua' (id: 7)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/onexplayer.f1.oled.lua' (id: 8)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.lcd.lua' (id: 9)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/valve.steamdeck.oled.lua' (id: 10)
[gamescope] [Info] scriptmgr: Running script file '/usr/share/gamescope/scripts/00-gamescope/displays/zotac.zone.oled.lua' (id: 11)
[gamescope] [Info] scriptmgr: Loading scripts from: '/etc/gamescope/scripts'
[gamescope] [Warn] scriptmgr: Directory '/etc/gamescope/scripts' does not exist
[gamescope] [Info] scriptmgr: Loading scripts from: '/home/jakub/.config/gamescope/scripts'
[gamescope] [Warn] scriptmgr: Directory '/home/jakub/.config/gamescope/scripts' does not exist
[gamescope] [Info] vulkan: selecting physical device 'AMD Radeon RX 6950 XT (RADV NAVI21)': queue family 1 (general queue family 0)
[gamescope] [Info] vulkan: physical device supports DRM format modifiers
[gamescope] [Info] wlserver: [backend/headless/backend.c:60] Creating headless backend
[gamescope] [Info] vulkan: supported DRM formats for sampling usage:
[gamescope] [Info] vulkan: AR24 (0x34325241)
[gamescope] [Info] vulkan: XR24 (0x34325258)
[gamescope] [Info] vulkan: AB24 (0x34324241)
[gamescope] [Info] vulkan: XB24 (0x34324258)
[gamescope] [Info] vulkan: RG16 (0x36314752)
[gamescope] [Info] vulkan: NV12 (0x3231564E)
[gamescope] [Info] vulkan: AB4H (0x48344241)
[gamescope] [Info] vulkan: XB4H (0x48344258)
[gamescope] [Info] vulkan: AB48 (0x38344241)
[gamescope] [Info] vulkan: XB48 (0x38344258)
[gamescope] [Info] vulkan: AB30 (0x30334241)
[gamescope] [Info] vulkan: XB30 (0x30334258)
[gamescope] [Info] vulkan: AR30 (0x30335241)
[gamescope] [Info] vulkan: XR30 (0x30335258)
[gamescope] [Info] wlserver: Using explicit sync when available
[gamescope] [Info] wlserver: Running compositor on wayland display 'gamescope-0'
[gamescope] [Info] wlserver: [backend/headless/backend.c:17] Starting headless backend
[gamescope] [Info] wlserver: Successfully initialized libei for input emulation!
[gamescope] [Error] wlserver: [xwayland/sockets.c:47] Failed to bind socket @/tmp/.X11-unix/X0: Address already in use
[gamescope] [Info] wlserver: [xwayland/server.c:108] Starting Xwayland on :2
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning: Multiple symbols for level 1/group 1 on key <FK23>
> Using F23, ignoring XF86TouchpadOff
> Warning: Symbol map for key <FK23> redefined
> Using last definition for conflicting fields
> Warning: Symbol map for key <FK24> redefined
> Using last definition for conflicting fields
> Warning: Could not resolve keysym XF86ElectronicPrivacyScreenOn
> Warning: Could not resolve keysym XF86ElectronicPrivacyScreenOff
> Warning: Could not resolve keysym XF86ActionOnSelection
> Warning: Could not resolve keysym XF86ContextualInsert
> Warning: Could not resolve keysym XF86ContextualQuery
Errors from xkbcomp are not fatal to the X server
[gamescope] [Info] pipewire: stream state changed: connecting
[gamescope] [Info] pipewire: stream state changed: paused
[gamescope] [Info] pipewire: stream available on node ID: 177
[gamescope] [Info] vblank: Using timerfd.
fsync: up and running.
[Gamescope WSI] No application info given.
[Gamescope WSI] Executable name: explorer.exe
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] Application info:
pApplicationName: xalia.exe
applicationVersion: 0
pEngineName: DXVK
engineVersion: 12587008
apiVersion: 4206592
[Gamescope WSI] Executable name: xalia.exe
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] No application info given.
[Gamescope WSI] Application info:
pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe
applicationVersion: 1
pEngineName: DXVK
engineVersion: 12587008
apiVersion: 4206592
[Gamescope WSI] Executable name: ArmaReforgerWorkbenchSteamDiag.exe
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] No application info given.
The XKEYBOARD keymap compiler (xkbcomp) reports:
> Warning: Unsupported maximum keycode 709, clipping.
> X11 cannot support keycodes above 255.
> Warning: Virtual modifier Hyper multiply defined
> Using 0, ignoring 0
> Warning: Virtual modifier ScrollLock multiply defined
> Using 0, ignoring 0
Errors from xkbcomp are not fatal to the X server
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] Application info:
pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe
applicationVersion: 0
pEngineName: DXVK
engineVersion: 12587008
apiVersion: 4206592
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] Application info:
pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe
applicationVersion: 0
pEngineName: vkd3d
engineVersion: 12587008
apiVersion: 4206592
[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1.
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] No application info given.
ATTENTION: default value of option vk_wsi_force_swapchain_to_current_extent overridden by environment.
[Gamescope WSI] Application info:
pApplicationName: ArmaReforgerWorkbenchSteamDiag.exe
applicationVersion: 0
pEngineName: vkd3d
engineVersion: 12587008
apiVersion: 4206592
[Gamescope WSI] Forcing on VK_EXT_swapchain_maintenance1.
[Gamescope WSI] Creating Gamescope surface: xid: 0x1a001a4
[Gamescope WSI] Atom of T was wrong type. Expected XCB_ATOM_CARDINAL.
[Gamescope WSI] Made gamescope surface for xid: 0x1a001a4
[Gamescope WSI] Surface state:
steam app id: 1874910
window xid: 0x1a001a4
wayland surface res id: 5
layer client flags: 0x4
server hdr output enabled: false
hdr formats exposed to client: false
[Gamescope WSI] Creating Gamescope surface: xid: 0x1a003a4
[Gamescope WSI] Atom of T was wrong type. Expected XCB_ATOM_CARDINAL.
[Gamescope WSI] Made gamescope surface for xid: 0x1a003a4
[Gamescope WSI] Surface state:
steam app id: 1874910
window xid: 0x1a003a4
wayland surface res id: 10
layer client flags: 0x4
server hdr output enabled: false
hdr formats exposed to client: false
[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false
[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b39d190 - imageCount: 4
[Gamescope WSI] Destroying swapchain: 0x55557b39d190
[Gamescope WSI] Destroyed swapchain: 0x55557b39d190
[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false
[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b39d190 - imageCount: 4
[Gamescope WSI] Destroying swapchain: 0x55557b39d190
[Gamescope WSI] Destroyed swapchain: 0x55557b39d190
[Gamescope WSI] Creating swapchain for xid: 0x1a003a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_B8G8R8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: false
[Gamescope WSI] Created swapchain for xid: 0x1a003a4 swapchain: 0x55557b344af0 - imageCount: 4
[Gamescope WSI] Creating swapchain for xid: 0x1a001a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_R8G8B8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: true
[Gamescope WSI] Created swapchain for xid: 0x1a001a4 swapchain: 0x55557c7565c0 - imageCount: 3
[Gamescope WSI] Destroying swapchain: 0x55557c7565c0
[Gamescope WSI] Destroyed swapchain: 0x55557c7565c0
[Gamescope WSI] Creating swapchain for xid: 0x1a001a4 - oldSwapchain: (nil) - provided minImageCount: 3 - minImageCount: 3 - format: VK_FORMAT_R8G8B8A8_UNORM - colorspace: VK_COLOR_SPACE_SRGB_NONLINEAR_KHR - flip: true
[Gamescope WSI] Created swapchain for xid: 0x1a001a4 swapchain: 0x55557c7565c0 - imageCount: 3
[gamescope] [Error] xwm: X11 I/O error! This is fatal. Aborting...
@@ -0,0 +1,17 @@
{
"log": "docs/evidence/native-2026-09-19-014052/console.log.txt",
"smoke_completions": 2,
"assertions_passed": 30,
"script_or_runtime_failures": [],
"engine_errors": [
"01:41:35.791 WORLD (E): Unknown keyword/data 'SlidingTrackMaterial' at offset 19441(0x4bf1)",
"01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 35955(0x8c73)",
"01:41:35.836 WORLD (E): Unknown keyword/data 'Parent' at offset 36915(0x9033)",
"01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 42646(0xa696)",
"01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 43645(0xaa7d)",
"01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 44617(0xae49)",
"01:41:35.839 WORLD (E): Unknown keyword/data 'Parent' at offset 45590(0xb216)"
],
"missing_end_screen": [],
"scope": "scripted local Workbench integration only; no multiplayer, piloting or FPS claim"
}
@@ -0,0 +1,22 @@
#1 t=1.3s M0 REGISTER group 1 [session=1789774898-1]
#2 t=1.3s M0 MORTAR DEPLOY site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; authored gun and four-person crew; finite ammunition initialization pending [session=1789774898-1]
#3 t=3.3s M0 REGISTER group 2 [session=1789774898-1]
#4 t=3.3s M0 REGISTER group 3 [session=1789774898-1]
#5 t=3.3s M0 REGISTER group 4 [session=1789774898-1]
#6 t=11.8s M0 MORTAR CREW ACTIVATE site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; startup delay elapsed; activating and equipping crew [session=1789774898-1]
#7 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A99170> @"ENTITY:4611686018427388719" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6000.000000 203.316498 7004.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1]
#8 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A9F530> @"ENTITY:4611686018427388825" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6003.000000 202.817322 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1]
#9 t=11.8s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4AAA670> @"ENTITY:4611686018427389135" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <5997.000000 202.910233 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789774898-1]
#10 t=11.8s M0 MORTAR RADIO EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; operator=SCR_ChimeraCharacter<0x00000000D4AB1530> @"ENTITY:4611686018427389297" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6006.000000 202.378983 6998.000000> @"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et" capability=2 (2=physical manpack); next HQ radio index verifies route [session=1789774898-1]
#11 t=70s M0 STOP HQ stopped; tactical orders released [session=1789774898-1]
#1 t=1.4s M0 REGISTER group 1 [session=1789775016-2]
#2 t=1.4s M0 MORTAR DEPLOY site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; authored gun and four-person crew; finite ammunition initialization pending [session=1789775016-2]
#3 t=3.4s M0 REGISTER group 2 [session=1789775016-2]
#4 t=3.4s M0 REGISTER group 3 [session=1789775016-2]
#5 t=3.4s M0 REGISTER group 4 [session=1789775016-2]
#6 t=11.9s M0 MORTAR CREW ACTIVATE site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; startup delay elapsed; activating and equipping crew [session=1789775016-2]
#7 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4A97AB0> @"ENTITY:4611686018427388719" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6000.000000 203.316498 7004.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2]
#8 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4AB88B0> @"ENTITY:4611686018427388825" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6003.000000 202.817322 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2]
#9 t=11.9s M0 MORTAR EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; crew=SCR_ChimeraCharacter<0x00000000D4ADD230> @"ENTITY:4611686018427389135" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <5997.000000 202.910233 7001.000000> @"{86E565387A634103}Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et" inventory HE=9 requested=9 radio capability=1 (0=none) [session=1789775016-2]
#10 t=11.9s M0 MORTAR RADIO EQUIP site=1 order=0 radio=M0 source=M0 position=<6000,202.788,7000>; operator=SCR_ChimeraCharacter<0x00000000D4A3B0F0> @"ENTITY:4611686018427389297" ('SCR_ChimeraCharacter','Assets/Characters/Basebody/Basebody_Male_01.xob') at <6006.000000 202.378983 6998.000000> @"{612F43A4D5AE765F}Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_RTO.et" capability=2 (2=physical manpack); next HQ radio index verifies route [session=1789775016-2]
#11 t=70.2s M0 STOP HQ stopped; tactical orders released [session=1789775016-2]
@@ -0,0 +1,8 @@
{
"result": "smoke-completed",
"session": "/tmp/erri-workbench-profile/logs/logs_2026-09-19_01-40-52",
"rounds_required": 2,
"display": "headless Gamescope 1280x720/30Hz",
"dedicated_server": false,
"audio": "silent sink and per-test-stream mute"
}
@@ -0,0 +1,188 @@
---------------------------------------------
Log Z:\tmp\erri-workbench-profile\logs\logs_2026-09-19_01-40-52\script.log started at 2026-09-19 01:40:55 (2026-09-18 23:40:55 UTC)
01:40:55.421 SCRIPT : SCRIPT : Initializing scripts
01:40:55.421 SCRIPT : SCRIPT : ScriptProjectManager init
01:40:57.760 SCRIPT : SCRIPT : Compiling GameLib scripts
01:40:57.829 SCRIPT : Module: Workbench; loaded 18x files; 36x classes; used 125K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 90ce0460
01:40:57.830 SCRIPT : Module: GameLib; loaded 465x files; 648x classes; used 828K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: 4507af04
01:40:57.830 SCRIPT : SCRIPT : Compiling Game scripts
01:40:59.045 SCRIPT : Compiling Game scripts
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,785": 'GetPlayerPlatformKind' is obsolete
01:40:59.045 SCRIPT (W): @"Scripts/Game/Editor/Components/EditableEntity/SCR_EditableEntityComponent.c,786": 'GetPlayerPlatformId' is obsolete
01:40:59.302 SCRIPT (W): @"Scripts/Game/Workshop/SCR_AddonManager.c,876": 'GetRefCount' is obsolete: Will be removed
01:40:59.333 SCRIPT (W): @"Scripts/Game/Campaign/SCR_PlayerProfileManagerComponent.c,142": 'PlayerData' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,159": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,162": 'RoomID' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,197": 'GetDSSession' is obsolete
01:40:59.432 SCRIPT (W): @"Scripts/Game/UI/Backend/CareerBackend.c,201": 'RoomID' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,481": 'GetStorage' is obsolete
01:40:59.532 SCRIPT (W): @"Scripts/Game/DataCollection/SCR_DataCollectorComponent.c,483": 'GetOnlineWritePrivilege' is obsolete
01:40:59.533 SCRIPT (W): @"Scripts/Game/Utilities/SCR_PlayerIdentityUtils.c,20": 'GetPlayerIdentityId' is obsolete
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,643": 'GetNotifyCount' is obsolete: Will be substitued by Notification Api.
01:40:59.575 SCRIPT (W): @"Scripts/Game/UI/Menu/MainMenuUI.c,645": 'GetNotifyItem' is obsolete: Will be substitued by Notification Api.
01:40:59.630 SCRIPT (W): @"Scripts/Game/DataCollection/PlayerData/SCR_PlayerData.c,210": 'PlayerData' is obsolete
01:40:59.895 SCRIPT : Module: WorkbenchGame; loaded 171x files; 616x classes; used 2481K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE"; CRC32: ad6a2625
01:40:59.902 SCRIPT : Module: Game; loaded 5695x files; 11168x classes; used 32439K of static memory; defines: "ENF_WB,WORKBENCH,PLATFORM_WINDOWS,ENABLE_DIAG,ENF_ENABLE_VHC_OVERRIDE,ENF_ENABLE_RPLCOMPONENT_IN_GAMECODE,ENABLE_BASE_DESTRUCTION,BUDGET_OPTIMIZATION_CHECKS,SHOW_DISCLAIMER,DEBUG,RESPAWN_TIMER_COMPONENT_DEBUG,GAME_MODE_DEBUG,DEBUG_CONFIGURABLE_DIALOGS,DISABLE_WEAPON_SWITCHING,SCRIPTED_AIM_MODIFIER_DEBUG"; CRC32: 25e8ccf6
01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: ban
01:41:00.852 SCRIPT : Unable to register a script command due keyword duplicity: kick
01:41:21.226 SCRIPT : ERR VALIDATION: prison terrain=211.344, radio terrain=159.656, extraction terrain=65.1562
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7154 y=211.531
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7157 y=211.516
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7160 y=211.5
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7163 y=211.453
01:41:21.226 SCRIPT : ERR TERRAIN: x=6084 z=7166 y=211.406
01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7154 y=211.438
01:41:21.226 SCRIPT : ERR TERRAIN: x=6087 z=7157 y=211.438
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7160 y=211.422
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7163 y=211.391
01:41:21.227 SCRIPT : ERR TERRAIN: x=6087 z=7166 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7154 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7157 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7160 y=211.344
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7163 y=211.328
01:41:21.227 SCRIPT : ERR TERRAIN: x=6090 z=7166 y=211.281
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7154 y=211.25
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7157 y=211.281
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7160 y=211.25
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7163 y=211.234
01:41:21.228 SCRIPT : ERR TERRAIN: x=6093 z=7166 y=211.188
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7154 y=211.156
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7157 y=211.172
01:41:21.228 SCRIPT : ERR TERRAIN: x=6096 z=7160 y=211.156
01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7163 y=211.141
01:41:21.229 SCRIPT : ERR TERRAIN: x=6096 z=7166 y=211.094
01:41:21.250 SCRIPT : ERR SITE CANDIDATE: position=<6090,211.344,7160> elevationRange=0.640625
01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: ban
01:41:24.602 SCRIPT : Unable to register a script command due keyword duplicity: kick
01:41:38.078 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:41:38.104 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:41:38.611 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:41:38.613 SCRIPT (W): Can't open config file ""
01:41:38.621 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:41:38.621 SCRIPT (W): Slot_Chat Has no Content!
01:41:38.621 SCRIPT (W): Slot_VON Has no Content!
01:41:38.621 SCRIPT (W): Slot_AvailableActions Has no Content!
01:41:38.621 SCRIPT (W): Slot_Vehicle Has no Content!
01:41:38.622 SCRIPT (W): Slot_GameVersion Has no Content!
01:41:38.622 SCRIPT (W): Slot_Notifications Has no Content!
01:41:38.622 SCRIPT (W): Slot_Hints Has no Content!
01:41:38.637 SCRIPT (W): Ban Settings could not be loaded from BE Storage: Relying on default config
01:41:38.688 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated.
01:41:38.701 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME
01:41:38.883 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:41:40.508 SCRIPT : Rereintroduced [mission]: phase 0 -> 1
01:41:40.919 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US)
01:41:40.999 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.344,7160>
01:41:41.049 SCRIPT : ERR SMOKE PASS: new identity may enter prison
01:41:41.049 SCRIPT : ERR SMOKE PASS: spawn consumes identity life
01:41:41.050 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection
01:41:41.050 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life
01:41:41.050 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected
01:41:41.050 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy
01:41:51.140 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize
01:41:51.140 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator
01:41:51.141 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells
01:42:06.266 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition
01:42:18.384 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning
01:42:18.385 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.344, 7160> killed himself!
01:42:22.418 SCRIPT : ERR SMOKE PASS: native damage kills prisoner
01:42:22.418 SCRIPT : ERR SMOKE PASS: death selects spectator without another life
01:42:22.418 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death
01:42:49.204 SCRIPT : Rereintroduced [mission]: phase 1 -> 6
01:42:49.204 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace
01:42:49.204 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1
01:42:49.251 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME
01:42:49.253 SCRIPT (W): Slot_Chat Has no Content!
01:42:49.253 SCRIPT (W): Slot_VON Has no Content!
01:42:49.253 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:49.253 SCRIPT (W): Slot_Notifications Has no Content!
01:42:51.240 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:42:51.240 SCRIPT : -- Stack trace --
01:42:51.240 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:42:51.241 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:42:51.241 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15
01:42:51.241 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:42:51.241 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:42:51.241 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:42:51.241 SCRIPT : -----------------
01:42:51.241 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:42:51.242 SCRIPT : -- Stack trace --
01:42:51.242 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:42:51.242 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:42:51.242 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21
01:42:51.242 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:42:51.242 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:42:51.242 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:42:51.243 SCRIPT : -----------------
01:42:51.244 SCRIPT (W): Slot_Chat Has no Content!
01:42:51.244 SCRIPT (W): Slot_VON Has no Content!
01:42:51.245 SCRIPT (W): Slot_GameVersion Has no Content!
01:42:51.245 SCRIPT (W): Slot_Notifications Has no Content!
01:43:19.217 SCRIPT (W): Maybe a problem: DataProgression is not ready but the analytics event was requested
01:43:36.462 SCRIPT (W): SCR_PerceivedFactionManagerComponent trying to set fall back faction 'CIV' but this faction could not be found so it is null instead.
01:43:36.462 SCRIPT : ERR SMOKE: scripted integration test enabled; gameplay acceptance remains separate
01:43:37.148 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_PUNISHMENT_KILLING_SET'. There should only be one of each key!
01:43:37.149 SCRIPT (W): Notification data in 'SCR_NotificationsLogDisplay' has duplicate notification info key: 'EDITOR_PERCEIVED_FACTION_TYPE_DISABLED'. There should only be one of each key!
01:43:37.150 SCRIPT (W): Can't open config file ""
01:43:37.150 SCRIPT (W): Cannot update game blocklist. Another request in progress.
01:43:37.151 SCRIPT (W): Slot_WeaponInfo Has no Content!
01:43:37.151 SCRIPT (W): Slot_Chat Has no Content!
01:43:37.152 SCRIPT (W): Slot_VON Has no Content!
01:43:37.152 SCRIPT (W): Slot_AvailableActions Has no Content!
01:43:37.152 SCRIPT (W): Slot_Vehicle Has no Content!
01:43:37.152 SCRIPT (W): Slot_GameVersion Has no Content!
01:43:37.152 SCRIPT (W): Slot_Notifications Has no Content!
01:43:37.152 SCRIPT (W): Slot_Hints Has no Content!
01:43:37.182 SCRIPT : ScenarioFramework: Available tasks are empty, no new tasks will be generated.
01:43:37.195 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = GAME
01:43:37.327 SCRIPT (W): EditBoxFilterComponent used on invalid widget type.
01:43:38.733 SCRIPT : Rereintroduced [mission]: phase 0 -> 1
01:43:39.219 SCRIPT : INFO: Faction: player jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) has joined faction #AR-Faction_US (US)
01:43:39.246 SCRIPT : Rereintroduced [spawn]: player 1 at <6090,211.444,7160>
01:43:39.269 SCRIPT : ERR SMOKE PASS: new identity may enter prison
01:43:39.269 SCRIPT : ERR SMOKE PASS: spawn consumes identity life
01:43:39.270 SCRIPT : ERR SMOKE PASS: disconnect retains living actor and clears connection
01:43:39.270 SCRIPT : ERR SMOKE PASS: reconnected identity retains spent life
01:43:39.270 SCRIPT : ERR SMOKE PASS: duplicate active identity rejected
01:43:39.270 SCRIPT : ERR SMOKE PASS: recycled connection receives independent life and extraction admission policy
01:43:49.368 SCRIPT : ERR SMOKE PASS: authored physical mortar and four-person crew initialize
01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar has a dedicated physical manpack operator
01:43:49.369 SCRIPT : ERR SMOKE PASS: mortar starts with exactly 27 physical HE shells
01:44:04.535 SCRIPT : ERR SMOKE PASS: depleted mortar inventory stays empty without fabricated ammunition
01:44:16.624 SCRIPT : ERR SMOKE PASS: lost mortar and crew remain lost without replacement spawning
01:44:16.625 SCRIPT : INFO: KILL SUICIDE: jakub (playerID = 1 | UUID = 00000000-0000-0000-0000-000000000000) from US faction at <6090, 211.342, 7160> killed himself!
01:44:20.660 SCRIPT : ERR SMOKE PASS: native damage kills prisoner
01:44:20.661 SCRIPT : ERR SMOKE PASS: death selects spectator without another life
01:44:20.661 SCRIPT : ERR SMOKE PASS: spectator camera activates after native death
01:44:47.538 SCRIPT : Rereintroduced [mission]: phase 1 -> 6
01:44:47.538 SCRIPT : ERR SMOKE PASS: death exhausts round life and reaches defeat after spectator grace
01:44:47.539 SCRIPT : ERR SMOKE COMPLETE: terminal=6 lostHelicopterCase=0 playerDeathCase=1
01:44:47.584 SCRIPT : SCR_BaseGameMode::OnGameStateChanged = POSTGAME
01:44:47.585 SCRIPT (W): Slot_Chat Has no Content!
01:44:47.586 SCRIPT (W): Slot_VON Has no Content!
01:44:47.586 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:47.586 SCRIPT (W): Slot_Notifications Has no Content!
01:44:49.577 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent Back
01:44:49.577 SCRIPT : -- Stack trace --
01:44:49.577 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:44:49.577 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:44:49.577 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 15
01:44:49.577 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:44:49.577 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:44:49.577 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:44:49.578 SCRIPT : -----------------
01:44:49.578 SCRIPT (W): SCR_ScriptedWidgetComponent.GetComponent: widget not found: SCR_InputButtonComponent ChatButton
01:44:49.578 SCRIPT : -- Stack trace --
01:44:49.578 SCRIPT : GetComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_ScriptedWidgetComponent.c : 43
01:44:49.578 SCRIPT : GetInputButtonComponent() Scripts/Game/UI/Components/WidgetLibrary/SCR_InputButton/SCR_InputButtonComponent.c : 1214
01:44:49.578 SCRIPT : OnMenuOpen() Scripts/Game/UI/GameOverScreen/SCR_GameOverScreenInput.c : 21
01:44:49.578 SCRIPT : OpenGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 447
01:44:49.579 SCRIPT : ShowGameOverScreen() Scripts/Game/GameOverScreen/SCR_GameOverScreenManagerComponent.c : 177
01:44:49.579 SCRIPT : OnUpdate() Scripts/Game/game.c : 885
01:44:49.579 SCRIPT : -----------------
01:44:49.580 SCRIPT (W): Slot_Chat Has no Content!
01:44:49.581 SCRIPT (W): Slot_VON Has no Content!
01:44:49.581 SCRIPT (W): Slot_GameVersion Has no Content!
01:44:49.581 SCRIPT (W): Slot_Notifications Has no Content!
@@ -0,0 +1,74 @@
{
"addons/ai/Prefabs/ERR/MortarCrew.et": "05d3e7353ff9fe5523218a1487b31b7b742b0be8adbcb060c7099978cf008bce",
"addons/ai/Prefabs/ERR/MortarCrew.et.meta": "fdfd4fcd21a67c3d698fa4aadc4e5c76e665cebf4be86013bc389e493fab63cc",
"addons/ai/Scripts/Game/ERR/ERR_HQ.c": "532b0073fc19625a72a057b92dcbfa46309dd0826a9912896c75d64ec37350c6",
"addons/ai/Scripts/Game/ERR/ERR_HQJournal.c": "b3e402cfe92d415f37f666045afb062e6e11670ba03a0ca6f2d9fd4fc3520ac1",
"addons/ai/Scripts/Game/ERR/ERR_HQNetwork.c": "92ff2caca52e94c2cc9642dfc8509ce6e9349b257012bade8650bace9231128c",
"addons/ai/Scripts/Game/ERR/ERR_HQObservation.c": "36c978ec5f052213ac1236e1398d85063efbfd7ef60fe04f1fc11447fefe1d68",
"addons/ai/Scripts/Game/ERR/ERR_HQReport.c": "c4d16ccb571db4d9444c0a8d2be7318845d25ff90238b6d304e96a9ea19f1a08",
"addons/ai/Scripts/Game/ERR/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762",
"addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c": "66b8f16b692a0f75fc9d920f5224d9292a0f1dc7dd8b2dde912e676fa80ddc9c",
"addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c": "657e96d1112b68c8ced37793e99f88e6078b38a579190e63d00b1f9a9a032e26",
"addons/ai/Scripts/Game/ERR/ERR_MortarPrediction.c": "470dd196ed64800c697d24c09d1344bacd2502587fac76af4ee0edae2563092d",
"addons/ai/Scripts/Game/ERR/ERR_MortarSalvo.c": "697c01f479df6c505a41d984a29c02002e3052114dafa2ec6252ae55e2979a2b",
"addons/ai/Scripts/Game/ERR/ERR_MortarSystem.c": "9369e9227eef9d0a46f4a86535aa498751bc780ee7d23c58e99ece877b910e21",
"addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c": "e5c0ebc95521a9a33a3f7d9cca6c551dda862a08b7af20b017877aba9584795b",
"addons/ai/Scripts/Game/ERR/ERR_SupportScenario.c": "71757018ec9716c4dc24f62a292a214919d3fd5daed3c16e03e56abd208e9f03",
"addons/ai/addon.gproj": "5f559db8f526700db11e6ae763f5245f19b7006fc68c56e4c09fb6f940bdf2a1",
"addons/chat/Missions/ERR_Everon.conf": "76f3ac0d21b585654beac7ddd68e3c8cbdd66dbfe909b17b04838fa813a7c29b",
"addons/chat/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f",
"addons/chat/Scripts/Game/ERR/ERR_AdminCommands.c": "86d0ddf7d9872c02c2e1f9972406b536473e0cc69837e8e30d90dfd4fab5511e",
"addons/chat/Scripts/Game/ERR/ERR_NativeMortarProbe.c": "ddb892141500c192c0787b011d57dd8c07dd8c9a3ca5fdc407f6c271897bde0a",
"addons/chat/Scripts/Game/ERR/ERR_NativeRadioProbe.c": "6f86e6815a0f7111b42d9b6a6eb183e1e377ac860c3c2bb30365c6a77c8d1bf8",
"addons/chat/Scripts/Game/ERR/ERR_NativeSmoke.c": "fe89b8e600b13863ebb1c7a32b1cf2d0a9b6daee1dbddcb6c54bfcda10bb4243",
"addons/chat/Scripts/WorkbenchGame/ERR/ERR_ValidateWorldPlugin.c": "81c92d408ce88cc9f98d6053f1d0c863427693ba748f00df9f1bf8079015ef94",
"addons/chat/addon.gproj": "ea1587e0174cf795334d306c71d99b06797fc891427cd57b6cab6e21cf0e4e0e",
"addons/core/Configs/ERR/GameOverScreens.conf": "335d270e667cbdecd78f9c9fedfb29fc19692857cb5169c47000edad79778e31",
"addons/core/Configs/ERR/GameOverScreens.conf.meta": "eb654b745c0b97b41c991694569ef4877a3c2315e0826f9556337cd68690843e",
"addons/core/Prefabs/ERR/Extraction.et": "d95d311de0231cf669440a10ef3d68014b70067e50b8bdfb05db637cfc7ed628",
"addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853",
"addons/core/Prefabs/ERR/GameMode.et": "eb6f1fb1af1422701179e5b5c7a592ebcc9d9b59cdd6e0da8499b410da76abb6",
"addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c",
"addons/core/Prefabs/ERR/Patrol.et": "c5685a8bc311cc5563fb3334beec9408d3d7a1069152fddeeb7df4f1b7f9e6ce",
"addons/core/Prefabs/ERR/Patrol.et.meta": "7c5da568fa2fcf0709ee2959253cb068d7c7ed7c2467af3b247a7e70efd96b69",
"addons/core/Prefabs/ERR/Prison.et": "cdf5f9ef11fc4160b5a5776190df6d0ad1ff3ca429f7244e2f35a4e3a7578dfb",
"addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb",
"addons/core/Prefabs/ERR/PrisonDoor.et": "fc66be9d36f1f01084de59f1b0a1e8817f9e46547ead33d4fafaac0107446c40",
"addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2",
"addons/core/Prefabs/ERR/PrisonWall.et": "8009d19365ae72a4749d7ad4fa04662575b06c65c6bf06507d380d57258b5eed",
"addons/core/Prefabs/ERR/PrisonWall.et.meta": "0294bc5dbb56f90f8153d62459bb0a6ad91d76a479812bbec9c7db182fdb58d6",
"addons/core/Prefabs/ERR/Radio.et": "3946b355bf75375c449ed2ce1881bce9c8d9497cdea426c441f89f88a7585cb8",
"addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f",
"addons/core/Prefabs/ERR/SpectatorCamera.et": "b5b87d5b7b707f3745741aebe7c923067c8a74f8fbb2a4711834bab03bb5a812",
"addons/core/Prefabs/ERR/SpectatorCamera.et.meta": "2a16558f93915e31908a674509e9c89976470f78a84a1174a64b94b68b8f77ad",
"addons/core/Scripts/Game/ERR/ERR_Actions.c": "adf93245e6d78c59b9839599d157a0d2b2b93ea93b3d1ae52e2904dd6c288266",
"addons/core/Scripts/Game/ERR/ERR_Actors.c": "b3c5aabb05f7cf35167bc09b5db51a4ffd89a46658805d6eedbfb80eee30273d",
"addons/core/Scripts/Game/ERR/ERR_EscapeGameOverScreenInfo.c": "d305db5ef64f2dae43df16f1be37d78daf58c6ff24e0a9d7d29cb2100731ab88",
"addons/core/Scripts/Game/ERR/ERR_FactionCatalog.c": "ef8b390bd8e83dee8df755981fb1cb5ec16fe967189a22c5b46edfc37c66e21d",
"addons/core/Scripts/Game/ERR/ERR_GameMode.c": "d3122c72c0d6e41d40634287dc28f540363197f7057c5228e2e8122e5b4a2600",
"addons/core/Scripts/Game/ERR/ERR_Location.c": "7e6fa49a458643998ea26b0a9fa499670bbe998fc660301a6186f7dd2977c14a",
"addons/core/Scripts/Game/ERR/ERR_MissionRules.c": "f7abc38ad8fdc375ce7fa63a65f0bade027d22b37e09de5e3f94ba8c3c63cc41",
"addons/core/Scripts/Game/ERR/ERR_Observer.c": "9bb6644e5644af1798d8ab7cbee055f0543160da33f097c15f4d2fcf19ffbf75",
"addons/core/Scripts/Game/ERR/ERR_PlayerGuide.c": "f0050e28133f37be49f277c7e1ae7540fb944a30e89c1a61e158d12ee8704660",
"addons/core/Scripts/Game/ERR/ERR_PlayerRoster.c": "1f9cbed16c8670444f967ff38931d2456748262b94a5d0139c78a45b22d0c61e",
"addons/core/Scripts/Game/ERR/ERR_ScenarioComponent.c": "935a0fde6cd91f2b57626a89732e7f5c708f27980acc24da077d8ddd0505c7e3",
"addons/core/Scripts/Game/ERR/ERR_Settings.c": "349d0d9c5c13bd4dd528681180c78fa612418de2351030a002bab195ce981b7e",
"addons/core/Scripts/Game/ERR/ERR_SpawnLogic.c": "e37222435b72944e294e306f0f78b618e7db7862d80d1bde6a5df801359bc04c",
"addons/core/Scripts/Game/ERR/ERR_Supplies.c": "752e8a56b0b8cde33cf532032cb0a203553017b686faac2e19bee06f7a9c0713",
"addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
"addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83",
"addons/core/Worlds/ERR_Everon_Layers/default.layer": "f1a058bd315c7d01d464715ac9f4e18ae3d2432551d094a9afbd4c9c5a2a9416",
"addons/core/addon.gproj": "231274e6b62302f32c65f9ff31de2ce8a9e51e1c8d12c87deeec82ae1f40de46",
"addons/intel/Scripts/Game/ERR/ERR_IntelService.c": "ff8d49d9d662834125f51a55f375918d8c3212e0a1a660234e454bdf7213b7b5",
"addons/intel/addon.gproj": "d0ced242cefb220a5cccd6779d61fda9bc55581701b9f78bcf13c09d92ddbcbe",
"addons/map/Materials/ERRM_MapRenderTarget.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
"addons/map/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0",
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "30dee8e9eab459ea32a7d835a9fb89d43df47708057cab829f067b25a24cd581",
"addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d",
"addons/map/Scripts/Game/ERR/ERR_DiscoveryMap.c": "ee9be2d313488224b3d52853e3fbe36bb225611d6a69c628b2a6a8efca8fc104",
"addons/map/Scripts/Game/ERR/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3",
"addons/map/Scripts/Game/ERRMap/ERRM_SharedMapComponent.c": "fc1a0c7df4fc96da446d7542a45a10fbec1eda1e543ba2f0581cb772277a47c5",
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "49a2da4181b94d42174f58c7f9b6bf2207116c99427d61ff1c212092ac7db4d2",
"addons/map/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54",
"addons/map/addon.gproj": "1b371e5e01ea9fa46e76570fecb8aaa3a9298e34cba7ccca8a6bdb5ca86eb46a"
}
+18
View File
@@ -82,5 +82,23 @@
"sha256": "33457ec2ead243640e57dc12c969be0d59923455f89669024e50998f63cca690",
"destination": "addons/map/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta",
"changes": "Namespaced types, paths and resource identities; explicit shared map item only."
},
{
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarSystem.c",
"sha256": "b355227b2b221147d35e1dacbc07cf650838229b9a6d22cd30cc1e304112b33f",
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarBattery.c",
"changes": "Only physical battery lifecycle, finite inventory, native activity and projectile accounting; successor creates authored group and gun. Original deployment and scheduler replaced."
},
{
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_MortarFiring.c",
"sha256": "aadd057a1f3f4326bd41500be7a12051a16de9d5925fca2452a46cdfbf0d6d12",
"destination": "addons/ai/Scripts/Game/ERR/ERR_MortarFiring.c",
"changes": "Native ballistic and final loading hooks migrated; successor HQ-delivered snapshots gate firing."
},
{
"source": "escapists-ai/Scripts/Game/EscapistsAI/EAI_SettlementSafety.c",
"sha256": "6961ad593d20f86c30b557542b4f67fd44d9579037776b07cd95616927eda83d",
"destination": "addons/ai/Scripts/Game/ERR/ERR_SettlementSafety.c",
"changes": "Use vanilla named settlements; original mission location dependency removed."
}
]
+5 -1
View File
@@ -4,7 +4,7 @@
## Repository checks
`python3 tools/check.py` passes: five-addon isolation, acyclic dependencies, fourteen source resource identities, exact successor/vanilla GUID references, production mission-rule boundaries, physical radio paths and failure handling, settings conversion, helicopter availability policy and mortar salvo policy. The latter two are helper tests, not operational support-controller evidence.
`python3 tools/check.py` passes: five-addon isolation, acyclic dependencies, fifteen source resource identities, exact successor/vanilla GUID references, production mission-rule boundaries, physical radio paths and failure handling, settings conversion, helicopter availability policy and mortar salvo policy. The latter two are helper tests, not operational support-controller evidence.
The reference guard verified all 533 original workspace source/resource files against the pre-test snapshot. Existing missions were not edited or saved. Native tests use a separate profile and only the successor projects plus vanilla dependencies. Earlier successful visible runs were measured on the right display. A later launch restored an oversized main Workbench window despite placement rules; those tests were stopped. Automated tests now run on an isolated headless display and create no physical-desktop windows.
@@ -61,3 +61,7 @@ Both installed executable version resources report 1.8.0.13 (game Steam build 24
## Silent complete-loop regression
[native-2026-09-19-013224](evidence/native-2026-09-19-013224/report.json) completed two headless escape rounds with 52 assertions and no script/runtime exceptions after the roster, spectator and radio-composition changes. Test audio was independently verified muted on the dedicated silent sink; other audio outputs were unchanged. Seven inherited vehicle schema errors remain. A preceding launch exited before gameplay with a host `double free or corruption` error; its raw diagnostics are retained in `native-2026-09-19-012838-host-crash` and are not counted as a successful run.
## Physical mortar inventory checkpoint
[native-2026-09-19-014052](evidence/native-2026-09-19-014052/report.json) completed two muted headless rounds with 30 assertions and no script/VM exceptions. Native inventories held exactly 27 HE shells across three crew plus a separate manpack operator. Deleting the shells did not replenish ammunition; deleting the gun and crew did not spawn replacements. Seven inherited vehicle schema errors remain. Firing, convoy rearming and multiplayer support acceptance are unverified. Further support migration is deferred while completing the base replacement.
+6 -1
View File
@@ -41,5 +41,10 @@
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AR.et": "23ADBBC31B6A3DC6",
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_AT.et": "1C78331E156A3D65",
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_SR.et": "333DA6244C7DA34C",
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_LAT.et": "BF643BE4ADBDFDD3"
"Prefabs/Characters/Factions/OPFOR/USSR_Army/Character_USSR_LAT.et": "BF643BE4ADBDFDD3",
"Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et": "D1FFE458E8AC4BDB",
"Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et": "98EC9C526AFBA282",
"Prefabs/Characters/Campaign/Final/OPFOR/USSR_Army/Regular/Campaign_USSR_Player_MortarCrew.et": "86E565387A634103",
"Prefabs/Items/Equipment/Radios/Radio_R148.et": "E1A5D4B878AA8980",
"Prefabs/Groups/OPFOR/Group_USSR_Base.et": "8DE0C0830FE0C33D"
}
+12 -2
View File
@@ -3,14 +3,14 @@
Requires Linux, gamescope, Proton, and a disposable COPY of a working Tools compat prefix.
No desktop rules or existing Wine processes are changed. This is not a dedicated server.
"""
import argparse, json, os, shutil, signal, subprocess, time
import argparse, fcntl, json, os, shutil, signal, subprocess, time
from pathlib import Path
ROOT = Path(__file__).resolve().parents[1]
p = argparse.ArgumentParser(description=__doc__)
p.add_argument('--steam', type=Path, default=Path.home()/'.local/share/Steam')
p.add_argument('--compat', type=Path, required=True, help='Disposable cloned Proton compatdata directory outside Steam')
p.add_argument('--profile', type=Path, required=True, help='Separate disposable successor Workbench profile')
p.add_argument('--smoke', choices=['victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response'], default='victory')
p.add_argument('--smoke', choices=['victory', 'lost-helicopter', 'player-death', 'radio-network', 'hq-response', 'mortar-inventory'], default='victory')
p.add_argument('--rounds', type=int, default=2)
p.add_argument('--timeout', type=int, default=360)
a = p.parse_args()
@@ -19,6 +19,9 @@ if not 1 <= a.rounds <= 10 or not 60 <= a.timeout <= 1800:
p.error('Use 1..10 rounds and a 60..1800 second timeout')
if compat.is_relative_to(steam) or not (compat/'pfx/system.reg').is_file():
p.error('--compat must be a disposable cloned prefix outside the Steam installation')
prefix_lock = (compat/'.erri-workbench.lock').open('a')
try: fcntl.flock(prefix_lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
except BlockingIOError: p.error('Another test runner owns this disposable Wine prefix')
if profile.is_relative_to(ROOT) or profile.is_relative_to(steam):
p.error('--profile must be outside source and Steam directories')
if not shutil.which('gamescope') or not shutil.which('pactl'): p.error('gamescope and pactl are required')
@@ -99,12 +102,19 @@ with (profile/'headless-launch.log').open('w') as output:
if child.poll() is not None: result = 'process-exited'; break
time.sleep(1)
finally:
# Stop Wine in this disposable prefix only. Proton's reaper may create a
# separate process group, so killing Gamescope alone can leave Wine alive.
wine_server = proton.parent/'files/bin/wineserver'
subprocess.run([str(wine_server), '-k'], env=env, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, timeout=10)
# Only this fresh process group belongs to the runner and disposable prefix.
try: os.killpg(child.pid, signal.SIGTERM)
except ProcessLookupError: pass
try: child.wait(timeout=10)
except subprocess.TimeoutExpired:
os.killpg(child.pid, signal.SIGKILL); child.wait()
# Gamescope's reaper can outlive its parent and ignores SIGTERM.
try: os.killpg(child.pid, signal.SIGKILL)
except ProcessLookupError: pass
summary = {'result':result, 'session':str(session) if session else None, 'rounds_required':a.rounds, 'display':'headless Gamescope 1280x720/30Hz', 'dedicated_server':False, 'audio':'silent sink and per-test-stream mute'}
if session:
(session/'runner.json').write_text(json.dumps(summary, indent=2)+'\n')
+1 -1
View File
@@ -7,7 +7,7 @@ p=argparse.ArgumentParser(description=__doc__)
p.add_argument('mode',choices=['workbench','server'])
p.add_argument('--exe',required=True,type=Path)
p.add_argument('--profile',required=True,type=Path)
p.add_argument('--smoke',choices=['victory','lost-helicopter','player-death', 'radio-network', 'hq-response'],help='Opt-in Workbench test; use a disposable profile')
p.add_argument('--smoke',choices=['victory','lost-helicopter','player-death', 'radio-network', 'hq-response', 'mortar-inventory'],help='Opt-in Workbench test; use a disposable profile')
p.add_argument('--execute',action='store_true',help='Deliberately execute the command; Workbench opens a window')
p.add_argument('--visible-output',help='User-approved spare display; required when executing Workbench')
a=p.parse_args()