Add configurable crash-site salvage; record Workshop 0.0.146
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-11-06 23:26:57 +01:00
parent 8b1c3cf88a
commit a7452f8be6
47 changed files with 2154 additions and 13 deletions
+7 -1
View File
@@ -1,6 +1,12 @@
# Changelog
Latest published Workshop version: **0.0.145**
Latest published Workshop version: **0.0.146**
## 2026-11-06 — Crash-site salvage
- Added configurable smoking helicopter and armored wreck sites with finite loot crates.
- Crash-site loot defaults to random quality, from poor pistol supplies to rich scoped-rifle and AA/RPG finds; Custom mode keeps manual loot controls.
- Added crash-site count, wreck mix and loot settings under Forces → Crash sites.
## 2026-11-06 — More room in admin lists
+2
View File
@@ -92,4 +92,6 @@ The [development source bundle tool](docs/development-source-bundle.md) previews
Random field hospitals and camps, their permanent/mobile guard split, finite supplies and authoring options are documented in [Field sites](docs/field-sites.md).
Configurable smoking wrecks and finite weapon crates are documented in [Crash-site salvage](docs/crash-sites.md).
Town population, configurable factory guards and safe tower/roof posts: [town and object garrisons](docs/town-garrisons.md).
@@ -0,0 +1,9 @@
GenericEntity : "{B90E5414AB7C325B}Prefabs/Props/Wrecks/BTR70_Wreck/BTR70_wreck_static.et" {
ID "9EA3A65E039FDAC0"
components {
Hierarchy "{BD920DE465D04435}" {}
RplComponent "{7E4852E4567E49D6}" { Streamable Disabled }
}
coords 0 0 0
angles 0 0 0
}
@@ -0,0 +1,7 @@
MetaFileClass {
Name "{56C7BD958478A96D}Prefabs/ERR/CrashArmorWreck.et"
Configurations {
ResourceClass PC {}
ResourceClass HEADLESS : PC {}
}
}
+30
View File
@@ -0,0 +1,30 @@
GenericEntity : "{EBBC859CCD94D96D}Prefabs/Props/EmptyStorages/USSR_AmmoBox_empty.et" {
ID "A2DD3ADFFC0219D9"
components {
RplComponent "{6530845A09302A0A}" { Streamable Disabled }
MeshObject "{6530845A09309E37}" {
Object "{819ED3266EE5113B}Assets/Props/Military/AmmoBox/EquipmentBoxWooden_01/EquipmentBoxWooden_Weapon_01.xob"
Materials {
MaterialAssignClass "{6530845A093091BB}" {
SourceMaterial "EquipmentBoxWooden_Weapon_01"
AssignedMaterial "{7D2E831AFA5CF50D}Assets/Props/Military/AmmoBox/EquipmentBoxWooden_01/Data/EquipmentBoxWooden_Weapon_01_USSR.emat"
}
MaterialAssignClass "{6530845A093091B2}" {
SourceMaterial "EquipmentBoxWooden_Weapon_01_Decal"
}
}
}
SCR_UniversalInventoryStorageComponent "{6530845A09302DE0}" {
MaxCumulativeVolume 1000000
MaxItemSize 200 100 100
m_fMaxWeight 400
Attributes SCR_ItemAttributeCollection "{6530845A09302DFF}" {
ItemDisplayName SCR_InventoryUIInfo "{6530845A09302D03}" {
Name "Crash-site weapons"
Description "Salvaged weapons and ammunition. This crate does not refill."
}
}
}
InventoryStorageManagerComponent "{18A1D42A468F584F}" {}
}
}
@@ -0,0 +1,7 @@
MetaFileClass {
Name "{CD7E33406E1ACA1D}Prefabs/ERR/CrashLootCrate.et"
Configurations {
ResourceClass PC {}
ResourceClass HEADLESS : PC {}
}
}
@@ -0,0 +1,9 @@
ReplicatedParticleEffectEntity {
ID "3B6ACA9A82472A27"
components {
Hierarchy "{666ECA1B7BACEF74}" {}
RplComponent "{7E4852E4567E49D6}" { Streamable Disabled }
}
UseFrameEvent 1
EffectPath "{6EE3295AC363E562}Particles/Enviroment/Smoke_Smokestack_Big.ptc"
}
@@ -0,0 +1,7 @@
MetaFileClass {
Name "{2608501780FEE1EA}Prefabs/ERR/CrashLootSmoke.et"
Configurations {
ResourceClass PC {}
ResourceClass HEADLESS : PC {}
}
}
@@ -3,7 +3,7 @@ class ERR_AdminMenuFields
{
static array<string> Keys()
{
return {"aiDoctrine", "aiShadow", "automaticEquipmentChancePercent", "sarkaAngerPerCar", "motorbikeCount", "droneReconCount", "droneCooldownSeconds", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "largeRoadblockCount", "mainRoadWidthMetres", "civilianTrafficCount", "garageVehicleCount", "garageChancePercent", "garageRadiusMetres", "garageSpawnIntervalSeconds", "emptyRestartHours", "startMode", "radioDefenceSeconds", "aiIntelChancePercent", "intelRevealChancePercent", "radioIntelSiteCount", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "convoyCount", "antiAirChancePercent", "antiPersonnelMineChancePercent", "heliTimerMinutes"};
return {"crashLootMode", "crashSiteCount", "crashHelicopterChancePercent", "crashRifleCount", "crashMagazineCount", "crashAntiAirChancePercent", "crashRocketChancePercent", "aiDoctrine", "aiShadow", "automaticEquipmentChancePercent", "sarkaAngerPerCar", "motorbikeCount", "droneReconCount", "droneCooldownSeconds", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "largeRoadblockCount", "mainRoadWidthMetres", "civilianTrafficCount", "garageVehicleCount", "garageChancePercent", "garageRadiusMetres", "garageSpawnIntervalSeconds", "emptyRestartHours", "startMode", "radioDefenceSeconds", "aiIntelChancePercent", "intelRevealChancePercent", "radioIntelSiteCount", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "convoyCount", "antiAirChancePercent", "antiPersonnelMineChancePercent", "heliTimerMinutes"};
}
static bool Available(string key, bool hq, bool intel)
{
@@ -26,6 +26,7 @@ class ERR_AdminMenuFields
}
static string Display(string key, string value)
{
if (key == "crashLootMode") { if (value == "1") return "Random"; return "Custom"; }
if (key == "aiDoctrine") { if (value == "1") return "Coordinated"; return "Current"; }
if (key == "aiShadow") { if (value == "1") return "On"; return "Off"; }
if (value == "-1" || value == "-2") return ERR_Settings.SelectionText(value.ToInt());
@@ -60,6 +61,13 @@ class ERR_AdminMenuFields
else if (key == "objectGuardHQMode") prefix = "mission objecthq";
else if (key == "objectGuardCount") prefix = "mission objectguards";
else if (key == "hunterSpawnDistanceMetres") prefix = "mission hunterdistance";
else if (key == "crashLootMode") prefix = "mission crashloot";
else if (key == "crashSiteCount") prefix = "mission crashsites";
else if (key == "crashHelicopterChancePercent") prefix = "mission crashhelis";
else if (key == "crashRifleCount") prefix = "mission crashrifles";
else if (key == "crashMagazineCount") prefix = "mission crashammo";
else if (key == "crashAntiAirChancePercent") prefix = "mission crashaa";
else if (key == "crashRocketChancePercent") prefix = "mission crashrockets";
else if (key == "fieldCampCount") prefix = "mission camps";
else if (key == "fieldHospitalCount") prefix = "mission hospitals";
else if (key == "roadblockCount") prefix = "mission roadblocks";
@@ -30,17 +30,18 @@ enum ERR_AdminPage
CHECKPOINTS = 26,
VEHICLE_POOL = 27,
PACKS = 28,
CRASH_SITES = 29,
}
class ERR_AdminMenuPages
{
static array<string> Pages() { return {"SettingsPage", "HQPage", "JournalPage", "ModsPage", "FactionsPage", "WorldPage", "IntelPage", "StatusPage", "TerrainsPage", "ItemsPage", "TTSPage", "ForcesPage", "GuardsPage", "SitesPage", "PlanePage", "RecommendationsPage", "WeightsPage", "AllowedItemsPage", "ItemPresetsPage", "AIPage", "StarterPage", "SarkaPage", "DronesPage", "RadioIntelPage", "TelemetryPage", "VehiclesPage", "CheckpointsPage", "VehiclePoolPage", "PacksPage"}; }
static array<string> Navigation() { return {"OpenSettings", "OpenHQ", "OpenJournal", "OpenMods", "OpenFactions", "OpenWorld", "OpenIntel", "OpenStatus", "OpenTerrains", "OpenItems", "OpenTTS", "OpenForces", "OpenGuards", "OpenSites", "OpenPlane", "OpenRecommendations", "OpenWeights", "OpenAllowedItems", "OpenItemPresets", "OpenAI", "OpenStarter", "OpenSarka", "OpenDrones", "OpenRadioIntel", "OpenTelemetry", "OpenVehicles", "OpenCheckpoints", "OpenVehiclePool", "OpenPacks"}; }
static array<string> Pages() { return {"SettingsPage", "HQPage", "JournalPage", "ModsPage", "FactionsPage", "WorldPage", "IntelPage", "StatusPage", "TerrainsPage", "ItemsPage", "TTSPage", "ForcesPage", "GuardsPage", "SitesPage", "PlanePage", "RecommendationsPage", "WeightsPage", "AllowedItemsPage", "ItemPresetsPage", "AIPage", "StarterPage", "SarkaPage", "DronesPage", "RadioIntelPage", "TelemetryPage", "VehiclesPage", "CheckpointsPage", "VehiclePoolPage", "PacksPage", "CrashSitesPage"}; }
static array<string> Navigation() { return {"OpenSettings", "OpenHQ", "OpenJournal", "OpenMods", "OpenFactions", "OpenWorld", "OpenIntel", "OpenStatus", "OpenTerrains", "OpenItems", "OpenTTS", "OpenForces", "OpenGuards", "OpenSites", "OpenPlane", "OpenRecommendations", "OpenWeights", "OpenAllowedItems", "OpenItemPresets", "OpenAI", "OpenStarter", "OpenSarka", "OpenDrones", "OpenRadioIntel", "OpenTelemetry", "OpenVehicles", "OpenCheckpoints", "OpenVehiclePool", "OpenPacks", "OpenCrashSites"}; }
static array<string> MainButtons() { return {"Main_Mission", "Main_Forces", "Main_HQ", "Main_Intel", "Main_Content", "Main_Audio", "Main_Status"}; }
static array<string> Sidebars() { return {"Sidebar_Mission", "Sidebar_Forces", "Sidebar_HQ", "Sidebar_Intel", "Sidebar_Content", "Sidebar_Audio", "Sidebar_Status"}; }
static int Group(int page)
{
array<int> groups = {0, 2, 6, 4, 1, 0, 3, 6, 0, 4, 5, 1, 1, 1, 2, 0, 4, 4, 4, 2, 4, 1, 2, 3, 0, 4, 1, 4, 1};
array<int> groups = {0, 2, 6, 4, 1, 0, 3, 6, 0, 4, 5, 1, 1, 1, 2, 0, 4, 4, 4, 2, 4, 1, 2, 3, 0, 4, 1, 4, 1, 1};
if (page < 0 || page >= groups.Count()) return -1;
return groups[page];
}
@@ -16,6 +16,13 @@ class ERR_CommandArguments
if (section == "mission" && option == "dronecooldown") return "droneCooldownSeconds";
if (section == "mission" && option == "plane") return "planeReconEnabled";
if (section == "mission" && option == "camps") return "fieldCampCount";
if (section == "mission" && option == "crashloot") return "crashLootMode";
if (section == "mission" && option == "crashsites") return "crashSiteCount";
if (section == "mission" && option == "crashhelis") return "crashHelicopterChancePercent";
if (section == "mission" && option == "crashrifles") return "crashRifleCount";
if (section == "mission" && option == "crashammo") return "crashMagazineCount";
if (section == "mission" && option == "crashaa") return "crashAntiAirChancePercent";
if (section == "mission" && option == "crashrockets") return "crashRocketChancePercent";
if (section == "mission" && option == "hospitals") return "fieldHospitalCount";
if (section == "mission" && option == "startweapons") return "startWeaponCount";
if (section == "mission" && option == "startammo") return "startMagazineCount";
@@ -44,6 +51,8 @@ class ERR_CommandArguments
}
static bool Selection(string key, string text, out int value)
{
if (key == "crashLootMode" && text == "random") { value = 1; return true; }
if (key == "crashLootMode" && text == "custom") { value = 0; return true; }
if (key == "aiDoctrine" && text == "current") { value = 0; return true; }
if (key == "aiDoctrine" && text == "coordinated") { value = 1; return true; }
if ((key == "aiShadow" || key == "restartOnEmpty" || key == "showAllSites") && text == "off") { value = 0; return true; }
@@ -191,6 +200,13 @@ class ERR_AdminService
if (key == "planeSectorSeconds") return "30-600; default 120. Applies next round.";
if (key == "planeReconEnabled") return "0 disabled, 1 enabled if Cessna 172 and Propeller Flight Core are loaded. Applies next round. A clear airport departure area is required.";
if (key == "fieldCampCount") return "1..16 field camps; default 12. Applies next round. Counts are requested: unsafe optional sites may be omitted.";
if (key == "crashLootMode") return "Random (1, default): each crate rolls independently from poor pistol supplies to rich scoped-rifle/launcher loot. Custom (0): use configured rifle, ammo and launcher values. Next round.";
if (key == "crashSiteCount") return "0..12; default 3. 0 disables sites. Finite wrecks and loot; no refills. Applies next round.";
if (key == "crashHelicopterChancePercent") return "0..100; default 50. 0 = armored wrecks; 100 = helicopters. Applies next round.";
if (key == "crashRifleCount") return "1..6; default 3. Random M21 / SVD rifles with fitted scopes. Custom loot mode only; next round.";
if (key == "crashMagazineCount") return "1..8; default 4. Matching ammunition for each selected rifle. Custom loot mode only; next round.";
if (key == "crashAntiAirChancePercent") return "0..100; default 25. One loaded Stinger, if installed and enabled. Custom loot mode only; next round.";
if (key == "crashRocketChancePercent") return "0..100; default 50. One scoped RPG-7 with two matching rockets. Custom loot mode only; next round.";
if (key == "fieldHospitalCount") return "1..8 field hospitals; default 6. Applies next round. The required radio-clue hospital is retained.";
if (key == "objectGuardEvery") return "Guard every 1st, 2nd, 3rd or 4th eligible site; default every third. Nearby buildings share one site. Next round.";
if (key == "objectGuardHQMode") return "0: all hold their posts; 1: half hold, half respond to HQ; 2: all may respond to HQ. All report contacts. Next round.";
@@ -219,7 +235,7 @@ class ERR_AdminService
}
protected string RoadblockTiming(string key)
{
if (key == "radioIntelSiteCount" || key == "garageVehicleCount" || key == "garageChancePercent" || key == "garageRadiusMetres" || key == "garageSpawnIntervalSeconds") return " for next round";
if (key == "crashLootMode" || key == "crashSiteCount" || key == "crashHelicopterChancePercent" || key == "crashRifleCount" || key == "crashMagazineCount" || key == "crashAntiAirChancePercent" || key == "crashRocketChancePercent" || key == "radioIntelSiteCount" || key == "garageVehicleCount" || key == "garageChancePercent" || key == "garageRadiusMetres" || key == "garageSpawnIntervalSeconds") return " for next round";
if (key == "aiDoctrine" || key == "aiShadow" || key == "droneReconCount" || key == "droneCooldownSeconds") return " for next round";
if (key == "motorbikeCount" || key == "planeAltitudeMetres" || key == "planeReplacementSeconds" || key == "planeSectorSeconds" || key == "planeReconEnabled" || key == "fieldCampCount" || key == "fieldHospitalCount" || key == "startWeaponCount" || key == "startMagazineCount" || key == "objectGuardCount" || key == "objectGuardEvery" || key == "objectGuardHQMode" || key == "hunterSpawnDistanceMetres" || key == "roadblockCount" || key == "largeRoadblockCount" || key == "mainRoadWidthMetres") return " for next round";
return "";
@@ -184,6 +184,7 @@ class ERR_AdminSession
GetGame().ERR_ServerVehicles().Snapshot(values, m_VehicleAddon, m_VehiclePage, m_VehicleFilter, m_VehicleQuery, m_VehicleRole);
GetGame().ERR_StartingSupplies().Snapshot(values);
m_Mode.Admin().Execute(m_Mode, true, "status", status);
if (m_Mode.CrashSites()) status.Insert(m_Mode.CrashSites().Status());
m_Controller.ERR_AdminDeliverSnapshot(m_Token, true, values, status);
}
void Log(int cursor, bool latest)
@@ -0,0 +1,68 @@
// Curated compatible weapon/ammunition pairs. No dependency is added for AA.
class ERR_CrashLoot
{
static ResourceName Rifle(bool west)
{
if (west) return "{81EB948E6414BD6F}Prefabs/Weapons/Rifles/M14/Rifle_M21_ARTII.et";
return "{6415B7923DE28C1B}Prefabs/Weapons/Rifles/SVD/Rifle_SVD_PSO.et";
}
static ResourceName Magazine(bool west)
{
if (west) return "{627255315038152A}Prefabs/Weapons/Magazines/Magazine_762x51_M14_20rnd_SpecialBall.et";
return "{9CCB46C6EE632C1A}Prefabs/Weapons/Magazines/Magazine_762x54_SVD_10rnd_Sniper.et";
}
static ResourceName Scope(bool west)
{
if (west) return "{D2018EDB1BBF4C88}Prefabs/Weapons/Attachments/Optics/Optic_ARTII/Optic_ARTII.et";
return "{C850A33226B8F9C1}Prefabs/Weapons/Attachments/Optics/Optic_PSO1/Optic_PSO1.et";
}
static ResourceName RPG() { return "{E8A55396050E1762}Prefabs/Weapons/Launchers/RPG7/Launcher_RPG7_PGO7.et"; }
static ResourceName Rocket() { return "{609E216CBF8D0B68}Prefabs/Weapons/Ammo/Ammo_Rocket_PG7VL.et"; }
static bool Allowed(ResourceName prefab)
{
if (!GetGame().ERR_ItemSelections().Allows(prefab)) return false;
Resource resource = Resource.Load(prefab);
return resource && resource.IsValid();
}
static bool RifleAllowed(bool west) { return Allowed(Rifle(west)) && Allowed(Magazine(west)) && Allowed(Scope(west)); }
// Roll quality once per site, then quantities within that quality. Never reroll on opening.
static void RandomPlan(array<ResourceName> items)
{
QualityPlan(Math.RandomInt(0, 100), items);
}
static void QualityPlan(int quality, array<ResourceName> items)
{
items.Clear();
if (quality < 30)
{
// Poor salvage can be only a few pistol magazines, without a weapon.
if (!Allowed(ERR_Supplies.Magazine())) return;
if (Math.RandomInt(0, 2) == 1 && Allowed(ERR_Supplies.Pistol())) items.Insert(ERR_Supplies.Pistol());
int magazines = Math.RandomInt(1, 4);
for (int i = 0; i < magazines; i++) items.Insert(ERR_Supplies.Magazine());
return;
}
if (quality < 65) { Plan(1, Math.RandomInt(1, 4), 0, 0, items); return; }
if (quality < 90) { Plan(Math.RandomInt(2, 4), Math.RandomInt(2, 6), 15, 35, items); return; }
Plan(Math.RandomInt(4, 7), Math.RandomInt(4, 9), 50, 75, items);
}
static void Plan(int rifles, int magazines, int aaChance, int rocketChance, array<ResourceName> items)
{
items.Clear();
bool west = RifleAllowed(true), east = RifleAllowed(false);
for (int i = 0; i < rifles && (west || east); i++)
{
bool useWest = west && (!east || Math.RandomInt(0, 2) == 0);
items.Insert(Rifle(useWest));
for (int j = 0; j < magazines; j++) items.Insert(Magazine(useWest));
}
if (Math.RandomInt(0, 100) < rocketChance && Allowed(RPG()) && Allowed(Rocket())
&& Allowed("{E5E9DBBF3BFB88C6}Prefabs/Weapons/Attachments/Optics/Optic_PGO7/Optic_PGO7V3.et"))
{
items.Insert(RPG()); items.Insert(Rocket()); items.Insert(Rocket());
}
// The inspected WCS Stinger is disposable and already contains one missile.
if (Math.RandomInt(0, 100) < aaChance && Allowed(ERR_EnemyLoadoutCatalog.FIM)
&& Allowed("{517333DE6AADE624}Prefabs/Weapons/Ammo/WCS/Ammo_Missile_FIM92.et")) items.Insert(ERR_EnemyLoadoutCatalog.FIM);
}
}
@@ -0,0 +1,200 @@
class ERR_CrashSite
{
vector Position;
IEntity Wreck;
IEntity Smoke;
IEntity Crate;
ref array<IEntity> Stock = {};
bool Ready;
}
// Finite server-owned scenery. Small bounded steps never block mission preparation.
class ERR_CrashSites
{
protected ERR_GameMode m_Mode;
protected ref array<ref ERR_CrashSite> m_Sites = {};
protected ref ERR_CampTerrain m_Terrain = new ERR_CampTerrain();
protected ref array<ResourceName> m_Loot = {};
protected ERR_CrashSite m_Pending;
protected InventoryStorageManagerComponent m_Inventory;
protected IEntity m_Item;
protected bool m_Accepted, m_ItemIssued, m_Started, m_Stopped;
protected int m_Target, m_Consumed, m_Attempts, m_HeliChance, m_LootMode, m_Rifles, m_Magazines, m_AA, m_Rockets;
protected int m_ItemIndex, m_ItemTicks, m_Skipped;
void ERR_CrashSites(ERR_GameMode mode) { m_Mode = mode; }
int Count() { return m_Sites.Count(); }
ERR_CrashSite At(int index) { return m_Sites[index]; }
string Status()
{
return string.Format("Crash sites: %1/%2 created; %3 unsuitable slots skipped. Finite loot; no refills.", Count(), m_Target, m_Skipped);
}
void Start()
{
if (m_Started || m_Stopped || !Replication.IsServer() || !m_Mode) return;
m_Started = true;
ERR_Settings settings = m_Mode.Settings();
m_LootMode = settings.Get("crashLootMode");
m_Target = settings.Get("crashSiteCount"); m_HeliChance = settings.Get("crashHelicopterChancePercent");
m_Rifles = settings.Get("crashRifleCount"); m_Magazines = settings.Get("crashMagazineCount");
m_AA = settings.Get("crashAntiAirChancePercent"); m_Rockets = settings.Get("crashRocketChancePercent");
if (m_Target > 0) GetGame().GetCallqueue().CallLater(Step, 250, true);
}
protected bool Ready()
{
if (!m_Mode.Sites() || !GetGame().GetWorldEntity()) return false;
ERR_ScenarioComponent scenario = ERR_ScenarioComponent.Cast(m_Mode.FindComponent(ERR_ScenarioComponent));
return scenario && !scenario.BackgroundPending();
}
protected bool Separated(vector point)
{
foreach (ERR_CrashSite site : m_Sites) if (vector.DistanceXZ(site.Position, point) < 600) return false;
if (m_Mode.Sites())
for (int i = 0; i < m_Mode.Sites().Count(); i++)
{
ERR_SiteRuntime other = m_Mode.Sites().At(i);
if (other && other.Definition && vector.DistanceXZ(other.Definition.Position, point) < 250) return false;
}
array<int> players = {}; GetGame().GetPlayerManager().GetPlayers(players);
foreach (int id : players)
{
IEntity actor = GetGame().GetPlayerManager().GetPlayerControlledEntity(id);
if (actor && vector.DistanceXZ(actor.GetOrigin(), point) < 400) return false;
}
return true;
}
protected bool Survey(out vector point, out float heading)
{
vector low, high; GetGame().GetWorldEntity().GetWorldBounds(low, high);
point = Vector(Math.RandomFloat(low[0], high[0]), 0, Math.RandomFloat(low[2], high[2]));
heading = Math.RandomFloat(0, 360);
if (!Separated(point)) return false;
SCR_AIWorld ai = SCR_AIWorld.Cast(GetGame().GetAIWorld());
if (!ai || !ai.GetRoadNetworkManager()) return false;
BaseRoad road; float distance;
ai.GetRoadNetworkManager().GetClosestRoad(point, road, distance, skipNavlinks: true);
if (road && distance < 20) return false;
float floor;
// Includes UH-1 tail (-8.8m), armor, smoke and the crate at x=6m plus access.
if (!m_Terrain.Clear(point, heading, 11, 0.6, floor, 5)) return false;
point = ERR_Actors.Ground(point);
return true;
}
protected IEntity Spawn(ResourceName resource, vector position, vector angles)
{
IEntity entity = ERR_Actors.Spawn(resource, position, angles);
if (entity) m_Mode.Own(entity);
return entity;
}
protected bool Create(vector point, float heading)
{
if (m_LootMode == 1) ERR_CrashLoot.RandomPlan(m_Loot);
else ERR_CrashLoot.Plan(m_Rifles, m_Magazines, m_AA, m_Rockets, m_Loot);
if (m_Loot.IsEmpty() && m_LootMode == 0) return false;
ERR_CrashSite site = new ERR_CrashSite(); site.Position = point;
ResourceName wreck = "{56C7BD958478A96D}Prefabs/ERR/CrashArmorWreck.et";
if (Math.RandomInt(0, 100) < m_HeliChance) wreck = ERR_CrashSiteResources.WreckPrefab();
vector wreckPoint = point;
if (wreck == ERR_CrashSiteResources.WreckPrefab())
{
vector minimum, maximum;
if (ERR_CrashSiteResources.Bounds(minimum, maximum)) wreckPoint[1] = wreckPoint[1] - minimum[1];
}
site.Wreck = Spawn(wreck, wreckPoint, Vector(heading, 0, 0));
vector cratePoint = ERR_Actors.Ground(point + ERR_CampTerrain.Rotate("6 0 0", heading));
site.Crate = Spawn("{CD7E33406E1ACA1D}Prefabs/ERR/CrashLootCrate.et", cratePoint + "0 0.1 0", Vector(heading, 0, 0));
site.Smoke = Spawn("{2608501780FEE1EA}Prefabs/ERR/CrashLootSmoke.et", point + "0 1 0", "0 0 0");
if (site.Crate) m_Inventory = InventoryStorageManagerComponent.Cast(site.Crate.FindComponent(InventoryStorageManagerComponent));
BaseInventoryStorageComponent storage;
if (site.Crate) storage = BaseInventoryStorageComponent.Cast(site.Crate.FindComponent(BaseInventoryStorageComponent));
if (!site.Wreck || !site.Crate || !site.Smoke || !m_Inventory || !storage)
{
ERR_Actors.DeleteSpawned(site.Smoke); ERR_Actors.DeleteSpawned(site.Crate); ERR_Actors.DeleteSpawned(site.Wreck);
m_Inventory = null; return false;
}
ParticleEffectEntity smoke = ParticleEffectEntity.Cast(site.Smoke);
if (smoke) { smoke.SetDeleteWhenStopped(false); smoke.Play(); }
m_Inventory.AddStorage(storage);
m_Sites.Insert(site); m_Pending = site; m_ItemIndex = 0;
SCR_AIWorld ai = SCR_AIWorld.Cast(GetGame().GetAIWorld());
if (ai) ai.RequestNavmeshRebuildEntity(site.Wreck);
return true;
}
protected void Fill()
{
if (!m_Pending.Crate || !m_Inventory) { Finish(); return; }
if (m_Item)
{
array<IEntity> items = {}; m_Inventory.GetItems(items);
InventoryItemComponent itemComponent = InventoryItemComponent.Cast(m_Item.FindComponent(InventoryItemComponent));
// A player may take the item between insertion and this confirmation tick.
// Any attached inventory slot consumes the grant; never steal it back.
if (items.Contains(m_Item) || (itemComponent && itemComponent.GetParentSlot()))
{
m_Pending.Stock.Insert(m_Item); m_Item = null; m_ItemIssued = false; m_ItemIndex++; m_ItemTicks = 0; m_Accepted = false;
return;
}
m_ItemTicks++;
if (m_ItemTicks > 12)
{
Print("Reintroduced [crash sites]: inventory rejected " + m_Loot[m_ItemIndex], LogLevel.WARNING);
ERR_Actors.DeleteSpawned(m_Item); m_Item = null; m_ItemIssued = false; m_ItemIndex++; m_ItemTicks = 0; m_Accepted = false; return;
}
if (!m_Accepted) m_Accepted = m_Inventory.TryInsertItem(m_Item);
return;
}
// A destroyed/consumed entity is still a spent grant, not a spawn retry.
if (m_ItemIssued) { m_ItemIssued = false; m_ItemIndex++; m_ItemTicks = 0; m_Accepted = false; return; }
if (m_ItemIndex >= m_Loot.Count()) { Finish(); return; }
ResourceName resource = m_Loot[m_ItemIndex];
if (!ERR_CrashLoot.Allowed(resource)) { m_ItemIndex++; return; }
m_ItemIssued = true;
m_Item = Spawn(resource, m_Pending.Crate.GetOrigin() + "0 0.4 0", "0 0 0");
if (!m_Item) { m_ItemIssued = false; m_ItemIndex++; }
}
protected void Finish()
{
if (m_Item)
{
InventoryItemComponent itemComponent = InventoryItemComponent.Cast(m_Item.FindComponent(InventoryItemComponent));
if (!itemComponent || !itemComponent.GetParentSlot()) ERR_Actors.DeleteSpawned(m_Item);
}
m_Item = null; m_ItemIssued = false;
if (m_Pending) m_Pending.Ready = true;
m_Pending = null; m_Inventory = null; m_Loot.Clear();
}
protected void Step()
{
if (m_Stopped || !Replication.IsServer() || !m_Mode || m_Mode != ERR_GameMode.Get() || ERR_MissionRules.Terminal(m_Mode.Phase())) { Stop(); return; }
if (!m_Mode.Active()) return;
if (m_Pending) { Fill(); return; }
if (m_Consumed >= m_Target) { Stop(); return; }
if (!Ready()) return;
int began = System.GetTickCount();
for (int sample = 0; sample < 8; sample++)
{
vector point; float heading;
m_Attempts++;
if (Survey(point, heading))
{
m_Consumed++; m_Attempts = 0;
if (!Create(point, heading)) m_Skipped++;
return;
}
if (m_Attempts >= 2000)
{
m_Consumed++; m_Skipped++; m_Attempts = 0;
Print("Reintroduced [crash sites]: skipped slot after bounded terrain search", LogLevel.WARNING);
return;
}
if (System.GetTickCount() - began >= 4) return;
}
}
void Stop()
{
if (m_Stopped) return;
m_Stopped = true;
if (GetGame()) GetGame().GetCallqueue().Remove(Step);
Finish();
// All scenery and issued stock remain in the round's owned-entity cleanup.
}
}
@@ -66,6 +66,7 @@ class ERR_GameMode : SCR_BaseGameMode
ERR_Performance Performance() { return m_Performance; }
protected ref ERR_CivilianTraffic m_CivilianTraffic;
protected ref ERR_GarageVehicles m_GarageVehicles;
protected ref ERR_CrashSites m_CrashSites;
protected ref ERR_ForceLedger m_Forces = new ERR_ForceLedger();
protected ref ERR_ForceSimulation m_ForceSimulation;
protected ref array<AIAgent> m_ForceAgents = {};
@@ -145,6 +146,7 @@ class ERR_GameMode : SCR_BaseGameMode
ERR_CommandService Command() { return m_Command; }
ERR_CivilianTraffic CivilianTraffic() { return m_CivilianTraffic; }
ERR_GarageVehicles GarageVehicles() { return m_GarageVehicles; }
ERR_CrashSites CrashSites() { return m_CrashSites; }
ERR_Objectives Objectives() { return m_Objectives; }
ERR_ExtractionService Extraction() { return m_Extraction; }
string EndReason() { return m_EndReason; }
@@ -551,6 +553,9 @@ class ERR_GameMode : SCR_BaseGameMode
m_GarageVehicles = new ERR_GarageVehicles(this);
OnStop().Insert(m_GarageVehicles.Stop);
m_GarageVehicles.Start();
m_CrashSites = new ERR_CrashSites(this);
OnStop().Insert(m_CrashSites.Stop);
m_CrashSites.Start();
GetGame().GetCallqueue().CallLater(ServerTick, 1000, true);
GetGame().GetCallqueue().CallLater(StartScenario, 1500, false);
}
@@ -9,11 +9,18 @@ class ERR_Settings
static array<string> Keys()
{
return {"telemetryEnabled", "aiDoctrine", "aiShadow", "sarkaAngerPerCar", "motorbikeCount", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "planeReconEnabled", "droneReconCount", "droneCooldownSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "largeRoadblockCount", "mainRoadWidthMetres", "civilianTrafficCount", "garageVehicleCount", "garageChancePercent", "garageRadiusMetres", "garageSpawnIntervalSeconds", "startMode", "keepWeaponOnUnconscious", "selfEpinephrine", "restartOnEmpty", "emptyRestartHours", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "aiIntelChancePercent", "intelRevealChancePercent", "radioIntelSiteCount", "showAllSites", "radioDefenceSeconds", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "antiAirChancePercent", "antiPersonnelMineChancePercent", "automaticEquipmentChancePercent", "automaticConvoyEnabled", "convoyCount", "heliTimerMinutes"};
return {"crashLootMode", "crashSiteCount", "crashHelicopterChancePercent", "crashRifleCount", "crashMagazineCount", "crashAntiAirChancePercent", "crashRocketChancePercent", "telemetryEnabled", "aiDoctrine", "aiShadow", "sarkaAngerPerCar", "motorbikeCount", "planeAltitudeMetres", "planeReplacementSeconds", "planeSectorSeconds", "planeReconEnabled", "droneReconCount", "droneCooldownSeconds", "fieldCampCount", "fieldHospitalCount", "startWeaponCount", "startMagazineCount", "objectGuardCount", "objectGuardEvery", "objectGuardHQMode", "hunterSpawnDistanceMetres", "roadblockCount", "largeRoadblockCount", "mainRoadWidthMetres", "civilianTrafficCount", "garageVehicleCount", "garageChancePercent", "garageRadiusMetres", "garageSpawnIntervalSeconds", "startMode", "keepWeaponOnUnconscious", "selfEpinephrine", "restartOnEmpty", "emptyRestartHours", "reportIntervalSeconds", "supportSquadLimit", "responseRadiusMetres", "aiIntelChancePercent", "intelRevealChancePercent", "radioIntelSiteCount", "showAllSites", "radioDefenceSeconds", "startTimeMinutes", "timeMultiplier", "startDateCode", "weatherProfile", "viewDistanceMetres", "antiAirChancePercent", "antiPersonnelMineChancePercent", "automaticEquipmentChancePercent", "automaticConvoyEnabled", "convoyCount", "heliTimerMinutes"};
}
static bool Valid(string key, int value)
{
if (key == "crashLootMode") return value == 0 || value == 1;
if (key == "crashSiteCount") return value >= 0 && value <= 12;
if (key == "crashHelicopterChancePercent") return value >= 0 && value <= 100;
if (key == "crashRifleCount") return value >= 1 && value <= 6;
if (key == "crashMagazineCount") return value >= 1 && value <= 8;
if (key == "crashAntiAirChancePercent") return value >= 0 && value <= 100;
if (key == "crashRocketChancePercent") return value >= 0 && value <= 100;
if (key == "telemetryEnabled" || key == "aiDoctrine" || key == "aiShadow") return value == 0 || value == 1;
if (key == "radioIntelSiteCount") return value >= 0 && value <= 20;
if (key == "sarkaAngerPerCar") return value >= 0 && value <= 30;
@@ -127,6 +134,13 @@ class ERR_Settings
static int AddedDefault(string key)
{
if (key == "crashLootMode") return 1;
if (key == "crashSiteCount") return 3;
if (key == "crashHelicopterChancePercent") return 50;
if (key == "crashRifleCount") return 3;
if (key == "crashMagazineCount") return 4;
if (key == "crashAntiAirChancePercent") return 25;
if (key == "crashRocketChancePercent") return 50;
if (key == "aiDoctrine" || key == "aiShadow") return 0;
if (key == "radioIntelSiteCount") return 5;
if (key == "sarkaAngerPerCar") return 3;
@@ -172,6 +186,13 @@ class ERR_Settings
void ERR_Settings(string path = PATH)
{
m_Path = path;
m_Values.Set("crashLootMode", AddedDefault("crashLootMode"));
m_Values.Set("crashSiteCount", AddedDefault("crashSiteCount"));
m_Values.Set("crashHelicopterChancePercent", AddedDefault("crashHelicopterChancePercent"));
m_Values.Set("crashRifleCount", AddedDefault("crashRifleCount"));
m_Values.Set("crashMagazineCount", AddedDefault("crashMagazineCount"));
m_Values.Set("crashAntiAirChancePercent", AddedDefault("crashAntiAirChancePercent"));
m_Values.Set("crashRocketChancePercent", AddedDefault("crashRocketChancePercent"));
m_Values.Set("telemetryEnabled", AddedDefault("telemetryEnabled"));
m_Values.Set("aiDoctrine", AddedDefault("aiDoctrine"));
m_Values.Set("aiShadow", AddedDefault("aiShadow"));
+46 -4
View File
@@ -44,10 +44,12 @@ ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_But
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenGuards" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 206 OffsetTop 206 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -209 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenSites" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 216 OffsetTop 216 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -258 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Field sites" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenSites" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 260 OffsetTop 260 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -263 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenSarka" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 270 OffsetTop 270 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -312 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Šárka hunters" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenSarka" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 314 OffsetTop 314 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -317 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenPacks" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 324 OffsetTop 324 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -366 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enemy packs" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenPacks" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 368 OffsetTop 368 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -371 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenCrashSites" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 270 OffsetTop 270 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -312 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Crash sites" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenCrashSites" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 314 OffsetTop 314 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -317 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenSarka" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 324 OffsetTop 324 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -366 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Šárka hunters" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenSarka" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 368 OffsetTop 368 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -371 } Color 0.9 0.66 0.25 1 }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "OpenPacks" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 378 OffsetTop 378 SizeX 180 OffsetRight -180 SizeY 42 OffsetBottom -420 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Enemy packs" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_OpenPacks" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 0 OffsetLeft 0 PositionY 422 OffsetTop 422 SizeX 180 OffsetRight -180 SizeY 3 OffsetBottom -425 } Color 0.9 0.66 0.25 1 }
} }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Main_HQ" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 320 OffsetLeft 320 PositionY 106 OffsetTop 106 SizeX 138 OffsetRight -458 SizeY 42 OffsetBottom -148 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "HQ" } } }
ImageWidgetClass { "Is Visible" 0 Name "Selected_Main_HQ" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 320 OffsetLeft 320 PositionY 150 OffsetTop 150 SizeX 138 OffsetRight -458 SizeY 3 OffsetBottom -153 } Color 0.9 0.66 0.25 1 }
@@ -1131,6 +1133,46 @@ TextWidgetClass { Name "Saved_fieldHospitalCount" Slot FrameWidgetSlot { Anchor
TextWidgetClass { Name "Help_fieldHospitalCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 226 OffsetTop 226 SizeX 456 OffsetRight -964 SizeY 54 OffsetBottom -280 } Color 0.9 0.92 0.94 1 Text "Medical supplies and guards. The radio-clue site is retained." "Font Size" 16 "Min Font Size" 16 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "SitesObjectives" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 318 OffsetTop 318 SizeX 936 OffsetRight -964 SizeY 90 OffsetBottom -408 } Color 0.9 0.92 0.94 1 Text "The prison, radio, extraction, supply cache and four mortar sites are unchanged. Defaults request 26 sites. More sites share the existing field guard budget. Discover them through intel or exploration." "Font Size" 18 "Min Font Size" 18 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
} }
FrameWidgetClass { "Is Visible" 0 Name "CrashSitesPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 532 OffsetBottom -692 } {
TextWidgetClass { Name "CrashHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -34 } Color 0.9 0.92 0.94 1 Text "Crash sites - next round" "Font Size" 22 "Min Font Size" 22 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "CrashHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 40 OffsetTop 40 SizeX 936 OffsetRight -964 SizeY 40 OffsetBottom -80 } Color 0.9 0.92 0.94 1 Text "Default loot is random for each crate: poor pistol supplies, a useful rifle, or a rich haul of scoped guns and launchers. No refills." "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 82 OffsetTop 82 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -108 } Color 0.9 0.92 0.94 1 Text "Loot mode: Random or Custom" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 82 OffsetTop 82 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -114 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 82 OffsetTop 82 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -114 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 118 OffsetTop 118 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -138 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 456 OffsetRight -484 SizeY 40 OffsetBottom -152 } Color 0.9 0.92 0.94 1 Text "Random rolls each crate independently. Custom uses the four loot controls below." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -182 } Color 0.9 0.92 0.94 1 Text "Crash sites (0-12)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 184 OffsetTop 184 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -216 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 184 OffsetTop 184 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -216 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 220 OffsetTop 220 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -240 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 242 OffsetTop 242 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -268 } Color 0.9 0.92 0.94 1 Text "0 disables sites. Finite wrecks and loot; no refills." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -182 } Color 0.9 0.92 0.94 1 Text "Helicopter chance (%)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 184 OffsetTop 184 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -216 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 184 OffsetTop 184 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -216 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 220 OffsetTop 220 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -240 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 242 OffsetTop 242 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -268 } Color 0.9 0.92 0.94 1 Text "0 = armored wrecks; 100 = helicopters." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 270 OffsetTop 270 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -292 } Color 0.9 0.92 0.94 1 Text "Custom: scoped rifles per crate (1-6)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 294 OffsetTop 294 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -326 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 294 OffsetTop 294 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -326 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 330 OffsetTop 330 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -350 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 352 OffsetTop 352 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -378 } Color 0.9 0.92 0.94 1 Text "Random M21 / SVD rifles with fitted scopes." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 270 OffsetTop 270 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -292 } Color 0.9 0.92 0.94 1 Text "Custom: magazines per rifle (1-8)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 294 OffsetTop 294 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -326 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 294 OffsetTop 294 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -326 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 330 OffsetTop 330 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -350 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 352 OffsetTop 352 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -378 } Color 0.9 0.92 0.94 1 Text "Matching ammunition for each selected rifle." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 380 OffsetTop 380 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -402 } Color 0.9 0.92 0.94 1 Text "Custom: anti-air launcher chance (%)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 404 OffsetTop 404 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -436 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 404 OffsetTop 404 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -436 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 440 OffsetTop 440 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -460 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 462 OffsetTop 462 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -488 } Color 0.9 0.92 0.94 1 Text "One loaded Stinger, if installed and enabled." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Label_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 380 OffsetTop 380 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -402 } Color 0.9 0.92 0.94 1 Text "Custom: rPG launcher chance (%)" "Font Size" 17 "Min Font Size" 17 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 404 OffsetTop 404 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -436 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 404 OffsetTop 404 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -436 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 440 OffsetTop 440 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -460 } Color 0.9 0.92 0.94 1 Text "Waiting for server" "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "Help_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 462 OffsetTop 462 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -488 } Color 0.9 0.92 0.94 1 Text "One scoped RPG-7 with two matching rockets." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
TextWidgetClass { Name "CrashFooter" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 498 OffsetTop 498 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -526 } Color 0.9 0.92 0.94 1 Text "Random ignores custom loot amounts and chances. Content blocks still apply. Default: 3 sites, 50% helicopters." "Font Size" 14 "Min Font Size" 14 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
} }
FrameWidgetClass { "Is Visible" 0 Name "PlanePage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 532 OffsetBottom -692 } {
TextWidgetClass { Name "PlaneHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 6 OffsetTop 6 SizeX 710 OffsetRight -738 SizeY 32 OffsetBottom -38 } Color 0.9 0.92 0.94 1 Text "Cessna patrol - changes apply next round" "Font Size" 22 "Min Font Size" 22 Wrap 1 FontProperties FontProperties { Font "{3E7733BAC8C831F6}UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.fnt" } }
+44
View File
@@ -0,0 +1,44 @@
# Crash-site salvage
Open **Forces → Crash sites** in mission administration. Saved changes apply next round. **Random loot is the default**: each crate rolls independently and only once.
| Setting | Default | Range |
| --- | ---: | ---: |
| Loot mode | Random | Random (1) or Custom (0) |
| Crash sites | 3 | 0–12; zero disables |
| Helicopter chance | 50% | 0–100%; remaining sites are armored wrecks |
| Custom: scoped rifles per crate | 3 | 1–6 |
| Custom: magazines per rifle | 4 | 1–8 |
| Custom: anti-air launcher chance | 25% | 0–100% per crate |
| Custom: RPG launcher chance | 50% | 0–100% per crate |
Helicopter sites use a static UH-1 wreck; armored sites use a static BTR-70 wreck. Neither is a vehicle, so neither can be driven or repaired. Replicated smoke marks each site. A weapon crate sits beside the wreck, outside its footprint.
Random mode ignores the four Custom loot controls. A crate can be poor or excellent:
| Quality chance | Possible contents |
| --- | --- |
| Poor — 30% | 1–3 PM magazines, with a 50% chance of a PM pistol; no rifles or launchers |
| Useful — 35% | One scoped rifle and 1–3 matching magazines |
| Good — 25% | 2–3 scoped rifles, 2–5 magazines each, 15% AA and 35% RPG chance |
| Excellent — 10% | 4–6 scoped rifles, 4–8 magazines each, 50% AA and 75% RPG chance |
Quantities and weapon variants are randomized within the quality range. The quality is never announced or rerolled when the crate is opened. In Custom mode, rifle and magazine quantities come from the saved controls and launcher rolls use the configured chances.
Premium rifles are M21/ART II and SVD/PSO, each with matching magazines. The RPG option adds a scoped RPG-7 and two PG-7VL rockets. The AA option adds one loaded disposable WCS Stinger if that resource is available. No new addon dependency is required. Content item and mod switches apply to weapons, scopes and ammunition; blocked/unavailable loadouts are omitted. Blocked content can leave a random crate poorer or empty. In Custom mode, the configured rifle count is an upper limit when equipment has been disabled. These curated crates do not use the extra-item probability weights.
Sites are generated after ordinary mission sites finish preparation, on dry clear terrain away from roads, players and mission objectives. Each slot has a bounded search; unsafe or unavailable slots are skipped. Sites are found by following smoke, with no automatic map marker or radio-intel credit. They have no dedicated guards, although ordinary patrols can encounter them.
Each slot and each inventory item is created at most once. Crates do not refill and wrecks do not respawn during the round. Mission cleanup owns the scenery and remaining issued equipment. Status → Mission status shows created and skipped slots.
Chat commands use the same authenticated settings service:
- `/esc mission crashloot set random` (or `custom`)
- `/esc mission crashsites set 3`
- `/esc mission crashhelis set 50`
- `/esc mission crashrifles set 3`
- `/esc mission crashammo set 4`
- `/esc mission crashaa set 25`
- `/esc mission crashrockets set 50`
Each command also supports `show` and `help`.
@@ -0,0 +1,11 @@
# Random crash-site loot — 2026-11-06
Random quality is now the default, including profiles without the new key. Each site draws once, ranging from pistol magazines with an optional pistol to scoped rifles, ammunition and launcher rolls. Custom mode retains the previous quantity/chance controls. Blocks still exclude content and can leave a random crate empty.
Validation:
- The production loot planner passed deterministic checks for every quality value, range endpoints, ammunition-only poor rolls, rich rolls and disabled content.
- Settings migration/bounds, menu command routing, generated layouts, the prior Custom planner, finite site lifecycle and inventory race regressions passed.
- Isolated Workbench compiled the current production addon, checked native poor/rich plans, accepted Random/Custom aliases, verified default Random and saved/reloaded settings, then filled a real randomly planned crate with one rifle and three magazines despite Custom launcher chances of 100%. Smoke, static wreck and menu bounds passed.
- All 728 production source/resource files matched the native snapshot, excluding the test project configuration and generated resource database. Cleanup and unchanged source/external inputs were confirmed.
No script/runtime failures occurred. The runner still returned nonzero for pre-existing external resource GUID, vehicle-field and DLC ownership errors. This was a local Workbench test, not dedicated multiplayer validation. No publication or push was performed.
@@ -0,0 +1,174 @@
#ifdef WORKBENCH
class ERR_CrashProbeSites : ERR_CrashSites
{
protected int m_Captured;
protected int m_ExpectedStock;
protected bool m_DestroyedGrant;
bool WaitingCorrectly() { return !m_Stopped && m_Attempts==0 && Count()==0; }
protected override void Fill()
{
if(false)
{
m_DestroyedGrant=true;ERR_Actors.DeleteSpawned(m_Item);
Print("ERR CRASH: removed first issued rifle before insertion to test spent-grant handling");
}
super.Fill();
}
void ProofCamera()
{
vector point=At(0).Position;
vector camera[4];vector eye=point+"10 12 -16";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,point+"0 2 0"),"0 1 0",camera);camera[3]=eye;
GetGame().GetCameraManager().SetCamera(m_Camera);
m_Camera.SetWorldTransform(camera);m_Camera.SetFOVDegree(65);m_Camera.SetDirty(true);m_Camera.ApplyTransform(0);
}
void ReportCamera() { Print("ERR CONTENT STAGE: 2");System.MakeScreenshot("$logs:crash-helicopter"); }
protected SCR_ManualCamera m_Camera;
void ERR_CrashProbeSites(ERR_GameMode mode) { m_Mode = mode; }
protected override bool Ready() { return true; }
protected override bool Survey(out vector point, out float heading)
{
if(Count()==0 && m_Attempts==1)
{
point="11180.619 0 11534.291";heading=0;float floor;
if(Separated(point) && m_Terrain.Clear(point,heading,11,0.6,floor,5)) {point=ERR_Actors.Ground(point);return true;}
}
return super.Survey(point,heading);
}
protected override bool Create(vector point, float heading)
{
m_HeliChance = 100;
bool created=super.Create(point, heading);
m_ExpectedStock=m_Loot.Count();
return created;
}
void Begin()
{
if(m_Mode.Settings().Get("crashLootMode")!=1){Fail("random mode not default");return;}
array<ResourceName> planned={};
foreach(int quality:{0,29,30,64,65,89,90,99})
{
ERR_CrashLoot.QualityPlan(quality,planned);
int count=planned.Count();
bool valid=count>=20 && count<=58;
if(quality<30)valid=count>=1 && count<=4;
else if(quality<65)valid=count>=2 && count<=4;
else if(quality<90)valid=count>=6 && count<=22;
if(!valid){Fail("quality plan boundaries");return;}
}
int selected;
if(!ERR_CommandArguments.Selection("crashLootMode","random",selected) || selected!=1){Fail("random command");return;}
if(!ERR_CommandArguments.Selection("crashLootMode","custom",selected) || selected!=0){Fail("custom command");return;}
m_Mode.Settings().Set("crashLootMode",1);
Print("ERR SMOKE PASS: default random, native poor-to-rich plans and mode command aliases");
m_Mode.Settings().Set("crashSiteCount",1);
m_Mode.Settings().Set("crashRifleCount",3); m_Mode.Settings().Set("crashMagazineCount",4);
m_Mode.Settings().Set("crashAntiAirChancePercent",100); m_Mode.Settings().Set("crashRocketChancePercent",100);
Start();
GetGame().GetCallqueue().CallLater(Check,1000,true);
}
void Fail(string text)
{
Print("ERR SMOKE FAIL: crash sites " + text,LogLevel.ERROR);
GetGame().GetCallqueue().Remove(Check); Stop();
}
void Check()
{
PrintFormat("ERR CRASH PROGRESS: count=%1 captured=%2 stopped=%3 consumed=%4 attempts=%5 item=%6",Count(),m_Captured,m_Stopped,m_Consumed,m_Attempts,m_ItemIndex);
Print("ERR CRASH TERRAIN: " + m_Terrain.Rejection());
if(m_Skipped>0){Fail("unexpected skipped slot");return;}
if(Count()<=m_Captured || !At(m_Captured).Ready)return;
ERR_CrashSite site=At(m_Captured);
if(!site.Wreck || Vehicle.Cast(site.Wreck) || site.Wreck.FindComponent(VehicleControllerComponent)){Fail("repairable vehicle");return;}
vector low, high;site.Wreck.GetBounds(low,high);
float bottom=site.Wreck.GetOrigin()[1]+low[1];
if(Math.AbsFloat(bottom-site.Position[1])>0.02){Fail("helicopter ground contact");return;}
ParticleEffectEntity smoke=ParticleEffectEntity.Cast(site.Smoke);
if(!smoke || !smoke.HasActiveParticles()){Fail("inactive smoke");return;}
if(site.Stock.Count()!=m_ExpectedStock){Fail("maximum crate stock count="+site.Stock.Count().ToString());return;}
int rifles, mags, rockets, aa;
foreach(IEntity item:site.Stock)
{
string path=item.GetPrefabData().GetPrefabName();
if(path.Contains("Rifle_"))rifles++;
if(path.Contains("Magazine_"))mags++;
if(path.Contains("Ammo_Rocket"))rockets++;
if(path.Contains("FIM92_Stinger.et"))
{
aa++;if(!ERR_EnemyLoadoutCatalog.Loaded(item)){Fail("unloaded AA");return;}
}
}
if(m_LootMode!=1 || m_ExpectedStock<1 || m_ExpectedStock>58){Fail("random loot dispatch");return;}
PrintFormat("ERR SMOKE PASS: crash %1 random crate: rifles=%2 magazines=%3 rockets=%4 AA=%5 static wreck and active smoke",m_Captured,rifles,mags,rockets,aa);
if(!m_Camera)
{
EntitySpawnParams params=new EntitySpawnParams();
m_Camera=SCR_ManualCamera.Cast(GetGame().SpawnEntity(SCR_ManualCamera,GetGame().GetWorld(),params));
GetGame().GetCameraManager().SetCamera(m_Camera);
}
vector camera[4];vector eye=site.Position+"18 10 22";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,site.Position+"0 2 0"),"0 1 0",camera);camera[3]=eye;m_Camera.SetWorldTransform(camera);m_Camera.SetVerticalFOV(65);
GetGame().GetCallqueue().CallLater(ProofCamera,100,true);
GetGame().GetCallqueue().CallLater(ReportCamera,2000,false);
m_Captured++;
if(m_Captured==1)GetGame().GetCallqueue().CallLater(Done,5000,false);
}
void Done()
{
GetGame().GetCallqueue().Remove(Check);
GetGame().GetCallqueue().Remove(ProofCamera);
if(Count()!=1 || !m_Stopped){Fail("finite completion");return;}
ERR_AdminMenu.Open();
GetGame().GetCallqueue().CallLater(MenuDone,5000,false);
}
void MenuDone()
{
Print("ERR SMOKE COMPLETE: random crash-site loot");
}
}
modded class SCR_RespawnSystemComponent
{
override void UpdateLoadingPlaceholder(float dt)
{
super.UpdateLoadingPlaceholder(dt);
if(m_wLoadingPlaceholder)m_wLoadingPlaceholder.SetVisible(false);
}
}
modded class ERR_AdminMenu
{
override void OnMenuOpen()
{
super.OnMenuOpen(); ShowPage(ERR_AdminPage.CRASH_SITES);
if(!ERR_ProbeNavigation(ERR_AdminPage.CRASH_SITES))Print("ERR SMOKE FAIL: crash menu bounds",LogLevel.ERROR);
Print("ERR CONTENT STAGE: 4");
}
}
modded class ERR_GameMode
{
protected ref ERR_CrashProbeSites m_CrashProbe;
protected bool m_CrashActive;
protected override void StartScenario() {}
override bool Active() { return m_CrashActive; }
protected override void EOnInit(IEntity owner)
{
super.EOnInit(owner);
if(SCR_Global.IsEditMode() || !Replication.IsServer())return;
GetGame().GetCallqueue().CallLater(CrashBegin,7000,false);
}
void ActivateCrash()
{
if(!m_CrashProbe.WaitingCorrectly()) {Print("ERR SMOKE FAIL: preparation waiting",LogLevel.ERROR);return;}
ERR_Settings loaded=new ERR_Settings();
if(loaded.Get("crashLootMode")!=1 || loaded.Get("crashSiteCount")!=1 || loaded.Get("crashRifleCount")!=3 || loaded.Get("crashMagazineCount")!=4) {Print("ERR SMOKE FAIL: persisted crash settings",LogLevel.ERROR);return;}
Print("ERR SMOKE PASS: preparation waits, settings saved and reloaded");m_CrashActive=true;
}
void CrashBegin()
{
m_CrashProbe=new ERR_CrashProbeSites(this);m_CrashProbe.Begin();OnStop().Insert(m_CrashProbe.Stop);
GetGame().GetCallqueue().CallLater(ActivateCrash,3000,false);
}
}
#endif
@@ -0,0 +1,13 @@
{
"result": "smoke-completed",
"cleanup_confirmed": true,
"source_unchanged_after_run": true,
"external_addons_unchanged_after_run": true,
"assertions": [
"23:15:29.194 SCRIPT : ERR SMOKE PASS: default random, native poor-to-rich plans and mode command aliases",
"23:15:32.174 SCRIPT : ERR SMOKE PASS: preparation waits, settings saved and reloaded",
"23:15:36.202 SCRIPT : ERR SMOKE PASS: crash 0 random crate: rifles=1 magazines=3 rockets=0 AA=0 static wreck and active smoke",
"23:15:46.274 SCRIPT : ERR SMOKE COMPLETE: random crash-site loot"
],
"matching_production_files": 728
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

@@ -0,0 +1,15 @@
# Crash sites — 2026-11-06
Implemented and tested locally; not published or pushed.
- Native Workbench run 4 created both helicopter and BTR wrecks with active smoke. Each maximum crate held six scoped rifles, 48 matching magazines, one RPG-7, two rockets and one loaded disposable Stinger: 58 root items. Both slots completed without replacement.
- Run 5 tested the final inventory race handling: the first rifle was deliberately deleted before insertion. It remained a spent grant; 18 of 19 planned items reached storage. Preparation waiting and persisted settings reload also passed. The armored-site screenshot is from this run.
- Run 6 compiled the final production source, verified helicopter ground contact to within 2cm, active smoke and all 19 planned items at default rifle/ammo settings with both launchers forced on. Preparation waiting, settings reload and native menu bounds passed. The helicopter screenshot is from this run.
- All 728 production source/resource files match the final native snapshot; the test-only project configuration and generated resource database are excluded. Hashes are recorded separately. No test fixture was added to the production addon.
- Targeted regressions passed for worker lifecycle, loot planning, inventory races, settings boundaries/migration, admin command routing and generated layout bounds. All 51 owned prefabs have unique saved root IDs.
The runner reported `smoke-completed`, confirmed cleanup, and unchanged source/external addon inputs. The successful runs had no script/runtime failures. The runner's overall exit status remains nonzero because of pre-existing external localization GUID, vehicle-field and DLC ownership errors. These are local Workbench integration tests, not a dedicated multiplayer or late-join test.
The smoke uses the engine's [ReplicatedParticleEffectEntity](https://community.bistudio.com/wikidata/external-data/arma-reforger/EnfusionScriptAPIPublic/interfaceReplicatedParticleEffectEntity.html). Scope and ammunition pairings were checked against the installed 1.9 prefabs; the WCS Stinger is an inspected disposable launcher with an initial missile.
Early test iterations caught and corrected preparation-time shutdown, too few terrain candidates and a duplicate inherited crate replication component. The retained fixture files document the maximum-load, removed-item and final-grounding checks. Private profiles and full logs remain under `.local/crash-sites`.
Binary file not shown.

After

Width:  |  Height:  |  Size: 720 KiB

@@ -0,0 +1,154 @@
#ifdef WORKBENCH
class ERR_CrashProbeSites : ERR_CrashSites
{
protected int m_Captured;
protected bool m_DestroyedGrant;
bool WaitingCorrectly() { return !m_Stopped && m_Attempts==0 && Count()==0; }
protected override void Fill()
{
if(false)
{
m_DestroyedGrant=true;ERR_Actors.DeleteSpawned(m_Item);
Print("ERR CRASH: removed first issued rifle before insertion to test spent-grant handling");
}
super.Fill();
}
void ProofCamera()
{
vector point=At(0).Position;
vector camera[4];vector eye=point+"10 12 -16";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,point+"0 2 0"),"0 1 0",camera);camera[3]=eye;
GetGame().GetCameraManager().SetCamera(m_Camera);
m_Camera.SetWorldTransform(camera);m_Camera.SetFOVDegree(65);m_Camera.SetDirty(true);m_Camera.ApplyTransform(0);
}
void ReportCamera() { Print("ERR CONTENT STAGE: 2");System.MakeScreenshot("$logs:crash-helicopter"); }
protected SCR_ManualCamera m_Camera;
void ERR_CrashProbeSites(ERR_GameMode mode) { m_Mode = mode; }
protected override bool Ready() { return true; }
protected override bool Survey(out vector point, out float heading)
{
if(Count()==0 && m_Attempts==1)
{
point="11180.619 0 11534.291";heading=0;float floor;
if(Separated(point) && m_Terrain.Clear(point,heading,11,0.6,floor,5)) {point=ERR_Actors.Ground(point);return true;}
}
return super.Survey(point,heading);
}
protected override bool Create(vector point, float heading)
{
m_HeliChance = 100;
return super.Create(point, heading);
}
void Begin()
{
m_Mode.Settings().Set("crashSiteCount",1);
m_Mode.Settings().Set("crashRifleCount",3); m_Mode.Settings().Set("crashMagazineCount",4);
m_Mode.Settings().Set("crashAntiAirChancePercent",100); m_Mode.Settings().Set("crashRocketChancePercent",100);
Start();
GetGame().GetCallqueue().CallLater(Check,1000,true);
}
void Fail(string text)
{
Print("ERR SMOKE FAIL: crash sites " + text,LogLevel.ERROR);
GetGame().GetCallqueue().Remove(Check); Stop();
}
void Check()
{
PrintFormat("ERR CRASH PROGRESS: count=%1 captured=%2 stopped=%3 consumed=%4 attempts=%5 item=%6",Count(),m_Captured,m_Stopped,m_Consumed,m_Attempts,m_ItemIndex);
Print("ERR CRASH TERRAIN: " + m_Terrain.Rejection());
if(m_Skipped>0){Fail("unexpected skipped slot");return;}
if(Count()<=m_Captured || !At(m_Captured).Ready)return;
ERR_CrashSite site=At(m_Captured);
if(!site.Wreck || Vehicle.Cast(site.Wreck) || site.Wreck.FindComponent(VehicleControllerComponent)){Fail("repairable vehicle");return;}
vector low, high;site.Wreck.GetBounds(low,high);
float bottom=site.Wreck.GetOrigin()[1]+low[1];
if(Math.AbsFloat(bottom-site.Position[1])>0.02){Fail("helicopter ground contact");return;}
ParticleEffectEntity smoke=ParticleEffectEntity.Cast(site.Smoke);
if(!smoke || !smoke.HasActiveParticles()){Fail("inactive smoke");return;}
if(site.Stock.Count()!=19){Fail("maximum crate stock count="+site.Stock.Count().ToString());return;}
int rifles, mags, rockets, aa;
foreach(IEntity item:site.Stock)
{
string path=item.GetPrefabData().GetPrefabName();
if(path.Contains("Rifle_"))rifles++;
if(path.Contains("Magazine_"))mags++;
if(path.Contains("Ammo_Rocket"))rockets++;
if(path.Contains("FIM92_Stinger.et"))
{
aa++;if(!ERR_EnemyLoadoutCatalog.Loaded(item)){Fail("unloaded AA");return;}
}
}
if(rifles!=3 || mags!=12 || rockets!=2 || aa!=1){Fail("weapon/ammo composition");return;}
PrintFormat("ERR SMOKE PASS: crash %1 grounded helicopter crate: rifles=%2 magazines=%3 rockets=%4 AA=%5 static wreck and active smoke",m_Captured,rifles,mags,rockets,aa);
if(!m_Camera)
{
EntitySpawnParams params=new EntitySpawnParams();
m_Camera=SCR_ManualCamera.Cast(GetGame().SpawnEntity(SCR_ManualCamera,GetGame().GetWorld(),params));
GetGame().GetCameraManager().SetCamera(m_Camera);
}
vector camera[4];vector eye=site.Position+"18 10 22";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,site.Position+"0 2 0"),"0 1 0",camera);camera[3]=eye;m_Camera.SetWorldTransform(camera);m_Camera.SetVerticalFOV(65);
GetGame().GetCallqueue().CallLater(ProofCamera,100,true);
GetGame().GetCallqueue().CallLater(ReportCamera,2000,false);
m_Captured++;
if(m_Captured==1)GetGame().GetCallqueue().CallLater(Done,5000,false);
}
void Done()
{
GetGame().GetCallqueue().Remove(Check);
GetGame().GetCallqueue().Remove(ProofCamera);
if(Count()!=1 || !m_Stopped){Fail("finite completion");return;}
ERR_AdminMenu.Open();
GetGame().GetCallqueue().CallLater(MenuDone,5000,false);
}
void MenuDone()
{
Print("ERR SMOKE COMPLETE: crash sites final inventory lifecycle");
}
}
modded class SCR_RespawnSystemComponent
{
override void UpdateLoadingPlaceholder(float dt)
{
super.UpdateLoadingPlaceholder(dt);
if(m_wLoadingPlaceholder)m_wLoadingPlaceholder.SetVisible(false);
}
}
modded class ERR_AdminMenu
{
override void OnMenuOpen()
{
super.OnMenuOpen(); ShowPage(ERR_AdminPage.CRASH_SITES);
if(!ERR_ProbeNavigation(ERR_AdminPage.CRASH_SITES))Print("ERR SMOKE FAIL: crash menu bounds",LogLevel.ERROR);
Print("ERR CONTENT STAGE: 4");
}
}
modded class ERR_GameMode
{
protected ref ERR_CrashProbeSites m_CrashProbe;
protected bool m_CrashActive;
protected override void StartScenario() {}
override bool Active() { return m_CrashActive; }
protected override void EOnInit(IEntity owner)
{
super.EOnInit(owner);
if(SCR_Global.IsEditMode() || !Replication.IsServer())return;
GetGame().GetCallqueue().CallLater(CrashBegin,7000,false);
}
void ActivateCrash()
{
if(!m_CrashProbe.WaitingCorrectly()) {Print("ERR SMOKE FAIL: preparation waiting",LogLevel.ERROR);return;}
ERR_Settings loaded=new ERR_Settings();
if(loaded.Get("crashSiteCount")!=1 || loaded.Get("crashRifleCount")!=3 || loaded.Get("crashMagazineCount")!=4) {Print("ERR SMOKE FAIL: persisted crash settings",LogLevel.ERROR);return;}
Print("ERR SMOKE PASS: preparation waits, settings saved and reloaded");m_CrashActive=true;
}
void CrashBegin()
{
m_CrashProbe=new ERR_CrashProbeSites(this);m_CrashProbe.Begin();OnStop().Insert(m_CrashProbe.Stop);
GetGame().GetCallqueue().CallLater(ActivateCrash,3000,false);
}
}
#endif
Binary file not shown.

After

Width:  |  Height:  |  Size: 730 KiB

@@ -0,0 +1,119 @@
#ifdef WORKBENCH
class ERR_CrashProbeSites : ERR_CrashSites
{
protected int m_Captured;
protected SCR_ManualCamera m_Camera;
void ERR_CrashProbeSites(ERR_GameMode mode) { m_Mode = mode; }
protected override bool Ready() { return true; }
protected override bool Survey(out vector point, out float heading)
{
if(Count()==0 && m_Attempts==1)
{
point="11180.619 0 11534.291";heading=0;float floor;
if(Separated(point) && m_Terrain.Clear(point,heading,11,0.6,floor,5)) {point=ERR_Actors.Ground(point);return true;}
}
return super.Survey(point,heading);
}
protected override bool Create(vector point, float heading)
{
m_HeliChance = 0;
if (Count() == 0) m_HeliChance = 100;
return super.Create(point, heading);
}
void Begin()
{
m_Mode.Settings().Set("crashSiteCount",2);
m_Mode.Settings().Set("crashRifleCount",6); m_Mode.Settings().Set("crashMagazineCount",8);
m_Mode.Settings().Set("crashAntiAirChancePercent",100); m_Mode.Settings().Set("crashRocketChancePercent",100);
Start();
GetGame().GetCallqueue().CallLater(Check,1000,true);
}
void Fail(string text)
{
Print("ERR SMOKE FAIL: crash sites " + text,LogLevel.ERROR);
GetGame().GetCallqueue().Remove(Check); Stop();
}
void Check()
{
PrintFormat("ERR CRASH PROGRESS: count=%1 captured=%2 stopped=%3 consumed=%4 attempts=%5 item=%6",Count(),m_Captured,m_Stopped,m_Consumed,m_Attempts,m_ItemIndex);
Print("ERR CRASH TERRAIN: " + m_Terrain.Rejection());
if(m_Skipped>0){Fail("unexpected skipped slot");return;}
if(Count()<=m_Captured || !At(m_Captured).Ready)return;
ERR_CrashSite site=At(m_Captured);
if(!site.Wreck || Vehicle.Cast(site.Wreck) || site.Wreck.FindComponent(VehicleControllerComponent)){Fail("repairable vehicle");return;}
ParticleEffectEntity smoke=ParticleEffectEntity.Cast(site.Smoke);
if(!smoke || !smoke.HasActiveParticles()){Fail("inactive smoke");return;}
if(site.Stock.Count()!=58){Fail("maximum crate stock count="+site.Stock.Count().ToString());return;}
int rifles, mags, rockets, aa;
foreach(IEntity item:site.Stock)
{
string path=item.GetPrefabData().GetPrefabName();
if(path.Contains("Rifle_"))rifles++;
if(path.Contains("Magazine_"))mags++;
if(path.Contains("Ammo_Rocket"))rockets++;
if(path.Contains("FIM92_Stinger.et"))
{
aa++;if(!ERR_EnemyLoadoutCatalog.Loaded(item)){Fail("unloaded AA");return;}
}
}
if(rifles!=6 || mags!=48 || rockets!=2 || aa!=1){Fail("weapon/ammo composition");return;}
PrintFormat("ERR SMOKE PASS: crash %1 maximum crate: rifles=%2 magazines=%3 rockets=%4 AA=%5 static wreck and active smoke",m_Captured,rifles,mags,rockets,aa);
if(!m_Camera)
{
EntitySpawnParams params=new EntitySpawnParams();
m_Camera=SCR_ManualCamera.Cast(GetGame().SpawnEntity(SCR_ManualCamera,GetGame().GetWorld(),params));
GetGame().GetCameraManager().SetCamera(m_Camera);
}
vector camera[4];vector eye=site.Position+"18 10 22";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,site.Position+"0 2 0"),"0 1 0",camera);camera[3]=eye;m_Camera.SetWorldTransform(camera);m_Camera.SetVerticalFOV(65);
PrintFormat("ERR CONTENT STAGE: %1",m_Captured+2);
m_Captured++;
if(m_Captured==2)GetGame().GetCallqueue().CallLater(Done,5000,false);
}
void Done()
{
GetGame().GetCallqueue().Remove(Check);
if(Count()!=2 || !m_Stopped){Fail("finite completion");return;}
ERR_AdminMenu.Open();
GetGame().GetCallqueue().CallLater(MenuDone,5000,false);
}
void MenuDone()
{
Print("ERR SMOKE COMPLETE: crash sites and finite maximum loot");
}
}
modded class SCR_RespawnSystemComponent
{
override void UpdateLoadingPlaceholder(float dt)
{
super.UpdateLoadingPlaceholder(dt);
if(m_wLoadingPlaceholder)m_wLoadingPlaceholder.SetVisible(false);
}
}
modded class ERR_AdminMenu
{
override void OnMenuOpen()
{
super.OnMenuOpen(); ShowPage(ERR_AdminPage.CRASH_SITES);
if(!ERR_ProbeNavigation(ERR_AdminPage.CRASH_SITES))Print("ERR SMOKE FAIL: crash menu bounds",LogLevel.ERROR);
Print("ERR CONTENT STAGE: 4");
}
}
modded class ERR_GameMode
{
protected ref ERR_CrashProbeSites m_CrashProbe;
protected override void StartScenario() {}
override bool Active() { return m_CrashProbe != null; }
protected override void EOnInit(IEntity owner)
{
super.EOnInit(owner);
if(SCR_Global.IsEditMode() || !Replication.IsServer())return;
GetGame().GetCallqueue().CallLater(CrashBegin,7000,false);
}
void CrashBegin()
{
m_CrashProbe=new ERR_CrashProbeSites(this);m_CrashProbe.Begin();OnStop().Insert(m_CrashProbe.Stop);
}
}
#endif
@@ -0,0 +1,11 @@
{
"result": "smoke-completed",
"cleanup_confirmed": true,
"source_unchanged_after_run": true,
"external_addons_unchanged_after_run": true,
"assertions": [
"23:02:23.261 SCRIPT : ERR SMOKE PASS: crash 0 maximum crate: rifles=6 magazines=48 rockets=2 AA=1 static wreck and active smoke",
"23:03:18.423 SCRIPT : ERR SMOKE PASS: crash 1 maximum crate: rifles=6 magazines=48 rockets=2 AA=1 static wreck and active smoke",
"23:03:28.507 SCRIPT : ERR SMOKE COMPLETE: crash sites and finite maximum loot"
]
}
@@ -0,0 +1,11 @@
{
"result": "smoke-completed",
"cleanup_confirmed": true,
"source_unchanged_after_run": true,
"external_addons_unchanged_after_run": true,
"assertions": [
"23:06:38.948 SCRIPT : ERR SMOKE PASS: preparation waits, settings saved and reloaded",
"23:06:53.988 SCRIPT : ERR SMOKE PASS: crash 0 spent-grant crate: rifles=2 magazines=12 rockets=2 AA=1 static wreck and active smoke",
"23:07:04.062 SCRIPT : ERR SMOKE COMPLETE: crash sites final inventory lifecycle"
]
}
@@ -0,0 +1,11 @@
{
"result": "smoke-completed",
"cleanup_confirmed": true,
"source_unchanged_after_run": true,
"external_addons_unchanged_after_run": true,
"assertions": [
"23:08:30.173 SCRIPT : ERR SMOKE PASS: preparation waits, settings saved and reloaded",
"23:08:45.235 SCRIPT : ERR SMOKE PASS: crash 0 grounded helicopter crate: rifles=3 magazines=12 rockets=2 AA=1 static wreck and active smoke",
"23:08:55.297 SCRIPT : ERR SMOKE COMPLETE: crash sites final inventory lifecycle"
]
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 463 KiB

@@ -0,0 +1,730 @@
{
"addons/core/AI/BehaviorTrees/ERR/MortarRapidFire.bt": "16b263bcb2fb3ae361367a600753a829425620d2e6b350a891c51fba47437ab6",
"addons/core/AI/BehaviorTrees/ERR/MortarRapidFire.bt.meta": "f2a44ece28891240e6bfa1d01af29428adcadbe82c80e287eb33cd5e58f1f90a",
"addons/core/Assets/Items/ERR_Atlas/AtlasCover.emat": "0a536cd31d1917965ab36d33e273a881be384eb8b863eb5da03d1666e141d45a",
"addons/core/Assets/Items/ERR_Atlas/AtlasCover.emat.meta": "9f4d59cd6d103547e3e494baf7cc8fce70f31f87c66fe6d26b70011bbd27e38b",
"addons/core/Assets/Items/ERR_Atlas/AtlasPaper.emat": "88a2c1061c01eb96ce8a0f753bd3e89e1d7af01471ccc4abb4774a7aa9a532fb",
"addons/core/Assets/Items/ERR_Atlas/AtlasPaper.emat.meta": "e0093b7df155499444f93a1148a07f66cc755489192db17c81f4035d17378efb",
"addons/core/Assets/Items/ERR_Atlas/AtlasPrint.emat": "9877c5b175c5f30dd80bea36c711b21ab38219aa7075adf9ae79932e1d4c76bc",
"addons/core/Assets/Items/ERR_Atlas/AtlasPrint.emat.meta": "33a9eaa49871813f2e8537f071ea0f5a4422eb08d536355a47314b6b6d845b19",
"addons/core/Assets/Items/ERR_Atlas/AtlasTurn.agf": "48dc42771b7e44994839dfabe9b007c23e37bd9be900196c757f42351e5c6b04",
"addons/core/Assets/Items/ERR_Atlas/AtlasTurn.agf.meta": "c081aec31c927c0c374dcc0f8eb3eaec498f71cb0e2ac746879b926f8dc7d00e",
"addons/core/Assets/Items/ERR_Atlas/AtlasTurn.agr": "8ec57b278c9d63324d00f7af62abf75230c5ef631d1cc070661585ee235c8a1f",
"addons/core/Assets/Items/ERR_Atlas/AtlasTurn.agr.meta": "b045e26f86116703d1b3599fdf747b413cc0064d8101eff659ded0355eff31fe",
"addons/core/Assets/Items/ERR_Atlas/AtlasWire.emat": "372247aac7b84ddf6c66e276d03321d22496e65726f55e490ee7287a90151318",
"addons/core/Assets/Items/ERR_Atlas/AtlasWire.emat.meta": "ea10c7bd630b31febf511fb28a42cc73597fcc1e3010597dc074c651813ede94",
"addons/core/Assets/Items/ERR_Atlas/ERR_Atlas.fbx": "03a654900103878223ab5c4a42e71d17022ca4885ced71b99c67d8c91652b5fc",
"addons/core/Assets/Items/ERR_Atlas/ERR_Atlas.txo": "9838bcb2e4ff1cd649586535ca7d5ad2497e6118cdfb76b8aadabded9cafb938",
"addons/core/Assets/Items/ERR_Atlas/ERR_Atlas.xob": "a4602d65e84cec1b23b6b09b5bc5847cbd52efe82925986c6eaf1c43bec1ac78",
"addons/core/Assets/Items/ERR_Atlas/ERR_Atlas.xob.meta": "04f4039be7950ca393ea74469898dabcfec4dc8b8f9e08068898c00333445878",
"addons/core/Assets/Items/ERR_Atlas/ERR_AtlasLeaf.fbx": "4ca13bbeafaa0dc0bf007ae9024b8d6c2a5279afc62e0ebc227e2bec2ad67a30",
"addons/core/Assets/Items/ERR_Atlas/ERR_AtlasLeaf.txo": "8ed37705192d3d9b18f26b5deb51af6f2a6d694e7e2dcdbd04b317497610b50d",
"addons/core/Assets/Items/ERR_Atlas/ERR_AtlasLeaf.xob": "fe6ea401412fdbb3bb46367cf7dc9215f7d01c6373c8ac954cbf23f2a6927bf7",
"addons/core/Assets/Items/ERR_Atlas/ERR_AtlasLeaf.xob.meta": "492a44fc323d3df469753d4bbbc35ceb3d362e734f48083ba633b3de5dd42d8b",
"addons/core/Configs/ERR/AdminMenus.conf": "5a4b405060135efd0f7faf913c7f061f6250a1e6e9d27f2bb394281d784b20e6",
"addons/core/Configs/ERR/AdminMenus.conf.meta": "5faf5ddc0a51c1d0f82d60af00d91edc22fe9c39aac50d8d04b772a2c9271be1",
"addons/core/Configs/ERR/Content/Registry.conf": "546a5a407c9e6c25c9157ae4392898fa3f40c04c7956649e62201f9ac0ba187c",
"addons/core/Configs/ERR/Content/Registry.conf.meta": "046aa988bf8e972afcf7a60b6f2312f605f016f98625dbbd9cd75ebf9ea88800",
"addons/core/Configs/ERR/EveronSites.conf": "781a9a3f4d2d4ea5b913fbfd15c2f1a991efdee7e033b7ba4241ad632609f52f",
"addons/core/Configs/ERR/EveronSites.conf.meta": "d5fe68025ef4e7c1e16082cf5873b7c7172eacbfaef4ab29b7e0e3c98f8dca56",
"addons/core/Configs/ERR/Factions/MissionVehicles.conf": "5f74f4a7089c7e7b54ad62463159ce8f0bab25a6b85268dc3872ea6001e048fb",
"addons/core/Configs/ERR/Factions/MissionVehicles.conf.meta": "00c368b6271d3440cc8bf627b03a384d247635723923fc5ad2104b8b4007b035",
"addons/core/Configs/ERR/Factions/US.conf": "4c3da063abb6e3ee39a6e4e0c5a9ffd5eae9d209d58470ea18b45dba5528db1b",
"addons/core/Configs/ERR/Factions/US.conf.meta": "a05469aef028e9e17eba545e81e2af2887b59f0fef17dac51a23c7b8155e381b",
"addons/core/Configs/ERR/Factions/USSR.conf": "407ea27f80a64c5184c089d43cdd0bdabfc5974c84f1d2a245081fdf2afa3f30",
"addons/core/Configs/ERR/Factions/USSR.conf.meta": "057397d97096346791b51b7b13fbe18af218bcf78e9984d9c01b49a2403de611",
"addons/core/Configs/ERR/GameOverScreens.conf": "1bb83c26a57d64595e91c3ba7926987e22b33dce2c6c876016e3ec2d04f9eb2a",
"addons/core/Configs/ERR/GameOverScreens.conf.meta": "eb654b745c0b97b41c991694569ef4877a3c2315e0826f9556337cd68690843e",
"addons/core/Configs/ERR/ObserverInput.conf": "1efd2e1823f80e6b8a3e4a697cdeb72dd87888ec5a2d16ae289937575b880072",
"addons/core/Configs/ERR/ObserverInput.conf.meta": "9714dce6c38ee81bcc513c8ebef51d7af63fd15bcdda2e40946937c625dc3ba4",
"addons/core/Configs/ERR/Telemetry.conf": "12d895ba4fcd159e23c2f3e94dc59e6f1e54702470cf0b1dad7d04f15572cf7a",
"addons/core/Configs/ERR/Telemetry.conf.meta": "afd52b410ce1a1026f4b0900b10aae2ee50c30764a212a59668233f4f8b8c5a1",
"addons/core/Configs/ERR/Tests/LegacySites.conf": "3864eb638d0ed4dd313013d2d787f975ae6ce4bbe238569919f76b73d5f7ca42",
"addons/core/Configs/ERR/Tests/LegacySites.conf.meta": "097ac7daef4fc18344699a8471fdd77f9d158f8c70bab394068d7a08e4777ac0",
"addons/core/Configs/ERR/VanillaFactions.conf": "db890b61b48ee15484041fd2245a862d9fa9e7ba21b1229c281ff37c448a35b1",
"addons/core/Configs/ERR/VanillaFactions.conf.meta": "ac77725c0c21974991ef47a466b88122e939de8b46fd23e68889e7674cbb2bfd",
"addons/core/Materials/ERRM_MapRenderTarget.emat": "4ab251037d40a850e3767c0de85136842bcd4fd130eda47bf8e19352b0d030e3",
"addons/core/Materials/ERRM_MapRenderTarget.emat.meta": "5ee1a705f8011a44020ca2691f5ccc17d44bf596fef9a36e98d1f267eb58fab0",
"addons/core/Missions/ERR_Everon.conf": "c6cce48484301a76b81f3a0cd76a4012f5808b901754d4114034e92beeefcff3",
"addons/core/Missions/ERR_Everon.conf.meta": "0a23c98bf83873536c65fa17d38dea33a1d7b9e4ab210f90633ff688abcc551f",
"addons/core/Prefabs/Characters/Core/Character_Base.et": "74a6f03a1e76173a0cfa20b23c711d02e70bac810d6743e16c60476bfe5be457",
"addons/core/Prefabs/Characters/Core/Character_Base.et.meta": "c6b142d1985719236268cdf12ac522fee4b1206871a6f22b568d9198d1fcc077",
"addons/core/Prefabs/ERR/AssaultParachute.et": "b556997989605e2a05982418b7e9f26d12d427eb3ea6e3bc50e85c67ea7aa4b8",
"addons/core/Prefabs/ERR/AssaultParachute.et.meta": "e9dea2d533ad1ce6ce689e0e2815c97a6382e1b90c35ce1efa88a885527e8e18",
"addons/core/Prefabs/ERR/CombatEpinephrine.et": "aa57d78bae861dc4a0fc509f7916190d2f2f0b36a1c3867f9bf9a071717cd7f5",
"addons/core/Prefabs/ERR/CombatEpinephrine.et.meta": "0e19ebd1dd4d81f739125a4dcbff898424ffe39572c2668bd56455d939b3f604",
"addons/core/Prefabs/ERR/ConvoyCrew.et": "29a525a29605386dfcf292dc2316e9fc7650ce39db9fbaa4ce4372ad0de66db4",
"addons/core/Prefabs/ERR/ConvoyCrew.et.meta": "0a909a15b7dcca34202ded136b3bdbbe8898153c9589e1cce1388433d362da02",
"addons/core/Prefabs/ERR/CrashArmorWreck.et": "322827292593b6e590ae3bb39aaf18f26feff40251e2399c20d47486b66cff06",
"addons/core/Prefabs/ERR/CrashArmorWreck.et.meta": "684aa32a6a60fced3d92ef5836a7934159ae140e2763c75b6e5615043a68c5d1",
"addons/core/Prefabs/ERR/CrashLootCrate.et": "580faa33a30dd072aa09f0f7d348940297207bff9d763609fc35665cd9327c66",
"addons/core/Prefabs/ERR/CrashLootCrate.et.meta": "0830626127410849e113c9b57aae2a77b9dcfcaf88adc54154a70ccbb2340dc8",
"addons/core/Prefabs/ERR/CrashLootSmoke.et": "bdb02288c808351c4624f371dc9c8d5dc254d00bd22f704eed0cce2aa7d693c2",
"addons/core/Prefabs/ERR/CrashLootSmoke.et.meta": "0b964ff8460331ac3177cd4b4672a1b8b80f74cf8f66deb6ac29c70830e74e95",
"addons/core/Prefabs/ERR/CrashSite.et": "8d06afe6e2db8986f06a7c5d6649e52df009f9eead7345bf2b477f50a0725b3c",
"addons/core/Prefabs/ERR/CrashSite.et.meta": "0f54fe80ed96394374c1922e1d0b05f7e0200ce5b979ff58325b033f51641f69",
"addons/core/Prefabs/ERR/CrashWreck.et": "f5de4785c0e3cdf02f1d5372e9b01171bd5a37acb9c36aa2a94bae3f429b2272",
"addons/core/Prefabs/ERR/CrashWreck.et.meta": "bde3299bdbbddb91d2ef471b61035b6cced29899cff4cd90c080fe584ce63f26",
"addons/core/Prefabs/ERR/Epinephrine.et": "e09c70b3d47a4dc5b92fd332c8222b99554b28a8a0c93cb5caac18eec4501571",
"addons/core/Prefabs/ERR/Epinephrine.et.meta": "f1861f0b0ccace1b7b3d9c29768e37a83bf0c6fae5a411b1bd61d6b2eec7ed89",
"addons/core/Prefabs/ERR/Extraction.et": "4d24c7811415c06386205e5bf5c132a23fcf21e96c75c7657ccd5f3ac914ac50",
"addons/core/Prefabs/ERR/Extraction.et.meta": "c2a838633001e2e3a202d39cb33aa744ebcd996017ad032359069641b5d13853",
"addons/core/Prefabs/ERR/FactionManager.et": "d34a8bbc5dce259c4a467c7bfa2ba746683bbeb9448de8c226856e65319f4911",
"addons/core/Prefabs/ERR/FactionManager.et.meta": "9bf53d5e4bcbe60dd1a4ece1409fc23c349055c860708620f5f6e9716290a97d",
"addons/core/Prefabs/ERR/FieldCover.et": "e403d5cb3a5966f0cea81f15e0e825d482ba1a7a27b12498319ba45a414963b0",
"addons/core/Prefabs/ERR/FieldCover.et.meta": "83461ffa76244e1d69f20b053a9741ccdf7d127009182bd540a7e5ba6150c3d9",
"addons/core/Prefabs/ERR/GameMode.et": "a2b7e632714e646a7010592cc7ac75f0afff7da6c995bf91aaf65d9473a6af3f",
"addons/core/Prefabs/ERR/GameMode.et.meta": "106769cd34525c9d440057072836cb7401a6752148c40edd7fe61c03bd58328c",
"addons/core/Prefabs/ERR/Items/EmergencyRepairKit.et": "0157bc235eeb78a0e1373b561fd22a1dcb225c833ff7c2d4abae688bca0ec92a",
"addons/core/Prefabs/ERR/Items/EmergencyRepairKit.et.meta": "da6f065cb2414b5a4cbe9ef0f0b1295b2466f26ad406c0bddb83845d4598efb3",
"addons/core/Prefabs/ERR/MortarCrew.et": "21086e886fe3199624208c9a866f883ec109f7d08746c2b56b497e59857fb656",
"addons/core/Prefabs/ERR/MortarCrew.et.meta": "fdfd4fcd21a67c3d698fa4aadc4e5c76e665cebf4be86013bc389e493fab63cc",
"addons/core/Prefabs/ERR/ObjectiveDocument.et": "5118ecaf9d2038eea44a4b785f05d2e78781dc1387249aa58a6782c7e6752e14",
"addons/core/Prefabs/ERR/ObjectiveDocument.et.meta": "eaba9903be147b98a1106e2273e2270773df73b9b22f2cd4e20136a8e281382e",
"addons/core/Prefabs/ERR/Patrol.et": "d3eca8fe9197c57a27a285cdb3baf168b037b198d92b39df28a338ae2cfd0c74",
"addons/core/Prefabs/ERR/Patrol.et.meta": "7c5da568fa2fcf0709ee2959253cb068d7c7ed7c2467af3b247a7e70efd96b69",
"addons/core/Prefabs/ERR/Prison.et": "c0ca5219aa2d6322ba7d094b92000640b259112ff6611a745c0713c8875d09d4",
"addons/core/Prefabs/ERR/Prison.et.meta": "2e426ef3de68f4107907854b51e818bc11d84649a01c538e3f18dd9ebec766bb",
"addons/core/Prefabs/ERR/PrisonBackpack.et": "ae750f08fc9af645561f59d7e5809bd22f4cec26ca8fa6409d09730765958c91",
"addons/core/Prefabs/ERR/PrisonBackpack.et.meta": "7da6aa45467250edc910ad7230dc244d1b041e8a6f55881eb3747ce51f9212ba",
"addons/core/Prefabs/ERR/PrisonDoor.et": "b0ff94443fe334032113a663917de23f920a8b73ffadc9c8e9f11b545022b3d2",
"addons/core/Prefabs/ERR/PrisonDoor.et.meta": "b8f3db52bf186426026668fbb9d633c3cbd4d438ab301fba880398f6a0e781c2",
"addons/core/Prefabs/ERR/PrisonPatrol.et": "dc88c31cf5c415573a874f74e13572f0add9e6122c8fcad507fe82860d789c47",
"addons/core/Prefabs/ERR/PrisonPatrol.et.meta": "5528e0d778dce5ed39c3e504c6427625527127b23269d20fbf12ca2bffe52ffe",
"addons/core/Prefabs/ERR/PrisonWall.et": "9b410b7c85bb001be4601ad93f750e17b8318b850306d84f29c4dc1b02723d7c",
"addons/core/Prefabs/ERR/PrisonWall.et.meta": "0294bc5dbb56f90f8153d62459bb0a6ad91d76a479812bbec9c7db182fdb58d6",
"addons/core/Prefabs/ERR/Prisoner.et": "e6d345ac98ad9ec742bf6c3b8686839c3256df9833d31bb4bdf605cd41d0ba5c",
"addons/core/Prefabs/ERR/Prisoner.et.meta": "974278ba49fafeed70b619a0067bbc70ae4d534be441c812ce2bef4a5fb3c022",
"addons/core/Prefabs/ERR/Radio.et": "99b1d80b49d1e7f9d30aa4283772a36fd66e962369f288f5fe329c7fc911bb1b",
"addons/core/Prefabs/ERR/Radio.et.meta": "bc91137b68ba550217914fb8892bb44d7e1920e4a1086f3e506623832a44212f",
"addons/core/Prefabs/ERR/RadioCamp.et": "5e6216bf8e6e160da5d9f966c8f7c2081bf6dd16dfac1b89d682a14b3b8a6716",
"addons/core/Prefabs/ERR/RadioCamp.et.meta": "3cb8d3d553ab6d8d111a74f721cf4e69ee1011cbb90248b83cdc7275697276bd",
"addons/core/Prefabs/ERR/ReconCrew.et": "33953379ceb725bcd0cbe505cd643c94adaed17dbbfa95dadd404d6b8e345715",
"addons/core/Prefabs/ERR/ReconCrew.et.meta": "2653e8c5b1cdb857de5badd5959ddd9826a6a298ab3c166628dbb835d7104d90",
"addons/core/Prefabs/ERR/ReconHelicopter.et": "c609ee59ab145e0a1936f95726b86df643f5cc425c43924029e9c1abc69ebbd0",
"addons/core/Prefabs/ERR/ReconHelicopter.et.meta": "d80f1c3d6a6f9104562b89729996c1c92ad240f08cdcf48d4c390a09d2047c08",
"addons/core/Prefabs/ERR/ReconPilotEast.et": "d961f329823b991eafed80d085de1bd89b44a4575be98d8dac385d6b77741ba2",
"addons/core/Prefabs/ERR/ReconPilotEast.et.meta": "d73df3c896359a54514d2efcd851f579feca7a2619b76c2a38f607649a31a4f1",
"addons/core/Prefabs/ERR/ReconPilotWest.et": "8f8221927269352e55c8026ee5b00e026c281c79af6684b386f24e7dc4675fb8",
"addons/core/Prefabs/ERR/ReconPilotWest.et.meta": "4785f23bb492c6af420ee7896ddbfc9767e0db1e06de95207df2dc949a1b1814",
"addons/core/Prefabs/ERR/RescueEscortION.et": "aa5cae65250936da239c865fe1070c68a1d20b49bcef37f6bd29021f22c274a9",
"addons/core/Prefabs/ERR/RescueEscortION.et.meta": "34eef8053198a49df774792322c6d3cba81f689e56b6a418aed5a14de0913537",
"addons/core/Prefabs/ERR/RescueEscortWest.et": "6f9671fb68e2716479d96be74b80ffb29fec535f1333c5e4dc4d7b684dca1ccb",
"addons/core/Prefabs/ERR/RescueEscortWest.et.meta": "45a87304712d6a18afb0ddc5b3ccbb70da395541e21aafe9d6d3641c392eaab3",
"addons/core/Prefabs/ERR/RescueHelicopter.et": "d9b3b01a0cdb6ed779f40f14f03dfd8fe732382931cdee02ea643f260783313c",
"addons/core/Prefabs/ERR/RescueHelicopter.et.meta": "f47b4a9a72faddcb5817e396dab7c115ac05a5455e5dc8ca4c6a3e9d5fc4093c",
"addons/core/Prefabs/ERR/RescueHelicopterAFRF.et": "cbd9c88b0a0c798096c78770cdef834cebfbdfd62fa12d96b56e74c5ac60dcb3",
"addons/core/Prefabs/ERR/RescueHelicopterAFRF.et.meta": "5cf8cdd7f34e2bffccedfab0cc0cf266d3c8a6856215e797874c531eb2a3ebf2",
"addons/core/Prefabs/ERR/RescueHelicopterFIA.et": "6aa11ddd56ebc9d0aefd06e1f55c7c61136d5c703b6eddc9cc84f3bcd8c8c26b",
"addons/core/Prefabs/ERR/RescueHelicopterFIA.et.meta": "ac0b32de9818aab77ff42d244cd5165112a7764eb6d289dcfe12ec77ea0c9b3b",
"addons/core/Prefabs/ERR/RescueHelicopterION.et": "a910548e7346439af90bb87e445f056aa1799572a69f87f45addbc17dc01fd85",
"addons/core/Prefabs/ERR/RescueHelicopterION.et.meta": "426a478d15718c0193490d5381f732e4c559348f2e5e9c7eb9473a4ca3017add",
"addons/core/Prefabs/ERR/RescueHelicopterWest.et": "dbf3827f58c27d957aac23f505a24c0af2a8f6c6555a82d0962a0ee5d47efb42",
"addons/core/Prefabs/ERR/RescueHelicopterWest.et.meta": "963b5b22139a2f3496e937855854c3ffe01604b86a93f1fb63b547bc1ba29068",
"addons/core/Prefabs/ERR/ScoutEast.et": "b4593aab494c4f21637757b3daff4f349da77b4c48ec5e8a4a2917a6a12cf811",
"addons/core/Prefabs/ERR/ScoutEast.et.meta": "7c72af632537f687e92f30b52d97fc7d70dadd39d33f37e0b1004f9596f55012",
"addons/core/Prefabs/ERR/ScoutGroup.et": "8dc0fce8ee3decc1c367411b00b6d8518df9d8458281cec0881464a2ce906af0",
"addons/core/Prefabs/ERR/ScoutGroup.et.meta": "62e43fd152ce57aa4ceb2187a49e4aecdeb9f428b3a1e8318f86bb83dbf8a259",
"addons/core/Prefabs/ERR/ScoutRadioPack.et": "f1c4911e2556c0e0caa8b896982190c5e7d0433e850b4610e19442caf9117607",
"addons/core/Prefabs/ERR/ScoutRadioPack.et.meta": "825506e3d814d30a52d5dbf64124470641c07a0453543ba71426841e6c783635",
"addons/core/Prefabs/ERR/ScoutWest.et": "2681b5a3f8621adb44195f0dbca6f3e79ef7decad8f9d0dd0e1a801ec2549627",
"addons/core/Prefabs/ERR/ScoutWest.et.meta": "22a6607b4b8fe606ca75a634a0b2ac3178e7bedae7f9ff01e7a4989f3b39a3da",
"addons/core/Prefabs/ERR/SpectatorCamera.et": "761d845fc1c086da58fd87c8933bf58d46d1ff5e17cca5950141743d07c8ce16",
"addons/core/Prefabs/ERR/SpectatorCamera.et.meta": "2a16558f93915e31908a674509e9c89976470f78a84a1174a64b94b68b8f77ad",
"addons/core/Prefabs/ERR/SupplyCache.et": "4c97b0514fe7e723046f40f0b396f6573b12eb9981ca5df70b9e8aa3cf29323e",
"addons/core/Prefabs/ERR/SupplyCache.et.meta": "2f5de3a4aab1e9d0e35521f48dc57b95bd6e449c383dec4f1c258e10295904cb",
"addons/core/Prefabs/ERR/SupplySite.et": "f33681281d26676fac88736091834d5a7b87fe0fa01883582542df964dcfc694",
"addons/core/Prefabs/ERR/SupplySite.et.meta": "b41944b12eb3528ff7a3ac94258b18c66ef161aa6a38894aee300a1ac4798630",
"addons/core/Prefabs/ERR/TerrainConnector.et": "cf9cb28f5a3f41931380864a29ac979aa1d5e843456f564ac7a7de78f88e1aa8",
"addons/core/Prefabs/ERR/TerrainConnector.et.meta": "9f37c979ae282aabca29ce84beb0db851ee8b9a19f7f3a64d387c175616127f3",
"addons/core/Prefabs/ERR/TerrainTakeover.et": "63e26db48c624056350f9ee123ae5b815bc2fad392060a9c26cfcd86c0af872a",
"addons/core/Prefabs/ERR/TerrainTakeover.et.meta": "64e953e378ab1d2a75ee7246f876f4ef93ae8a4e3fddb5002d7ba37268cb959d",
"addons/core/Prefabs/ERR/TerrainTakeoverWithChat.et": "aa857f7e8e0585839c7e9b2e3616702180779e68c6fb149d94a83c05bd52449b",
"addons/core/Prefabs/ERR/TerrainTakeoverWithChat.et.meta": "a213272011050a881c87fdd94b229e002ece24f26f25db5fe53824f8a5b147a8",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZ.et": "29f157849f413261494a63d4d5b0a97e8bbe61cb076efcd59d6c940653f23352",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZ.et.meta": "544c94cf1c26757a10654de7856cd6cc48b821ce3bdc02add13cfe6514269915",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et": "cd4acdcecad299445952aea0adefc85f2b9e9b43f8186f100e0505c5621b3656",
"addons/core/Prefabs/ERR/Vehicles/SupplyUAZRearSeats.et.meta": "123955da03462befb90e293b3bb856d49cc761166611b38ff47cb48ec2fbe95c",
"addons/core/Prefabs/Items/Equipment/ERRM_AtlasLeaf.et": "11185bc813c00c5bda09c0afaad78849a1c81d89843e8f7f3a14c0776b8296a9",
"addons/core/Prefabs/Items/Equipment/ERRM_AtlasLeaf.et.meta": "8cdfeb51c3774ed790a223ce74872cfbc4588fb6812a0e98136eb607dcc17d9d",
"addons/core/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et": "57dfbd215f28478a791b2e029832ddf3c363658d5dd5590cee4db9ec6a8b690a",
"addons/core/Prefabs/Items/Equipment/ERRM_SharedFieldMap.et.meta": "59093e9072c50d99c86da7609c87541016da5bcf92b98d99db4c524e1c8e0e8d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Actions.c": "cabb21413c90b252d29708b62228d0679c51c76e39ee0e483953ad7061b2b9d6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Actors.c": "7258b838f8365e4fa575c4f2ccc8532e22a33946405ebb490120534d5ca65607",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenu.c": "cac52cfb9f31ba42daed671e55bf5d55ea0840139deba5d13a0e156ec90559ff",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuFields.c": "8aa549d3cc74affd09eced9e4d7e7844737e207506d32bb678528c3beec5d933",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuPages.c": "902369a691fd179cc7ed75891692ee5f1f436921ff9820829691a364c4eb12e1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminMenuView.c": "6c34557350659782bc1a098169dbbabf1f71502c35cdf711b83ce0efad907142",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminPlayerTools.c": "56780d78bf423f54f482d8620f821b8d3eb0199194482b4f12e37f5ec3f55ef5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminProvider.c": "62e05aceb49da07fed7aa89fb6b2f8eb3efc373ac09eff286fba983c3ad570eb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminService.c": "68cea3bbf6ca9d33066e2c51d43093f6ffc3641e5bdb3dfdbf6ca282eb4260cf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AdminSession.c": "2120d677205453c21fae7fd52468de194871e9ad7ed3492982dddb3b229f42d2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_AirfieldPlacement.c": "0601d8da570e1f63e43ea7df451d0e997872e4e163669fd8ad37bedd59de7b9b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_BakedSpeech.c": "d11fff16f86fd3447126701af84c3800860d721263b3c2c16d3b91d686d8b2fc",
"addons/core/Scripts/Game/ERR/00_Core/ERR_BuryBodyAction.c": "adbf4cee5b5f5317b185f17738205f28b701a15364e643cc9fb443866a121109",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyGroundSupport.c": "8010394e7731d3bc2ce436cf795a37819e16d4d605e8d152027cf391e811d37c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingFeedback.c": "ac554a946cd14f73a5bf79005b8a3f770c9caaf0a6ea409134077b8d96f9433f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingGameMode.c": "1e670937736330716a467157d0f45bace512047d7e87d8678f4ae0ee123969c3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingOwner.c": "3f430930c2598951b75cba157a57967189686ca7a86aff8ecedd20f181262bbb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CasualtyLoadingService.c": "6efcfb4bb1bdf0da84400eef28a24f6c61e7f446073af2c9667b6f26f0bc47b5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ChatClient.c": "4bf937ff74e0483c17fa0103f73bfee3afd8f67a37c0c248b08772a17bfcc349",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CommunityStatistics.c": "84f2615fac1375bbe3738edd13a413ef1d524dea5ce0195b05b3a957aae84435",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentDefinition.c": "bc1dd4ed27ec894cf4bd617fb226cb8140b544aaa9ef6d8654e815d81e7f6fd0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentMenu.c": "d9df3b2dd8fca119ecee466dc71d336b5a70ee7d5fced368cf34e250d22075de",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentPolicy.c": "3a4987345d5a7159234a7e1a08bf5ac40dd5a23031e9b1953fc43a0501d9924b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ContentSettings.c": "3e2734dfb935a4e93d79b66ca4a7c883723a1fc348e3595432dbf2bfca643923",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CrashLoot.c": "043c6a0f1960f2ed47542e0c5eca00bd03c11e9af0e61c202b7ff23163c0cc18",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CrashSiteResources.c": "832aebf6e754dba54ba28b8f480180d32ced968a2d2f192424c4007a862c2b43",
"addons/core/Scripts/Game/ERR/00_Core/ERR_CrashSites.c": "e46cac54ca9210c69236c1d02a1f3aa84ce481c4ea8c1631bfee8b7586604ebd",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DebugAI.c": "bc5529c60591a6c36c39cdb753b1af948690fc3c3c725f38a8d595b41a499235",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DebugIntel.c": "a9f6e7e42a3214879a21052e897f9afc0653c12ff15d5bee7766e26a1af6ab17",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryMap.c": "8a8653b322c948c462002077272dae79e2f45a24e883767b3ad9c1f24caad237",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DiscoveryService.c": "552d9e40f72a135f19d25a17fbecf475b8bba8d8b62ec6b6d055c65499a0b637",
"addons/core/Scripts/Game/ERR/00_Core/ERR_DocumentComponent.c": "885c8ab4fc9e64c3f8b40056536096c8c32b011cb340b25ca00353a96da15c69",
"addons/core/Scripts/Game/ERR/00_Core/ERR_EnvironmentService.c": "c0fae5bf51ccf507bc84d44adc2d1dff021cd83653c0468b7645a4f343e3fc8d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Epinephrine.c": "14a75e040f510773313c7e70b57f338821bc1ded650bc65133968dcad6e49c7c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_EscapeGameOverScreenInfo.c": "4746b0715c6e9a527038b47d54d2ff305becea219da6b736f6998d81901143c9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionPlacement.c": "6d388fe21f08b25cbdb5dfa4e198d94a4c80c5092f8d17630a4654e18bf8b3f5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionRadio.c": "ad7fd91d8bb96f05f3be04a03fd00c20ab9413adb12d649d3020c6f7994319e1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ExtractionService.c": "c48e79a117990f83839704ae221af05fc7995b956af2d4b4f9ed2a6b91ec335a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionCatalog.c": "a5a8c53acf21259e14f59cb919535910f30dabff5a9179c664bc6a7a4d744d6e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionMenu.c": "1deab4c396c307fc17dbaa8731b2943ffb73c37dc0121a5cba5c239c34901ba3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_FactionSelection.c": "04b8bd8a042cf743ab8a87ec3711f9758e7b0112995a9d363e81a63df4eabe5e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ForceLedger.c": "0ecaf1c5a52568e751678b0b1236e91e6adb538f8fbf010d38b61a312d1bf253",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ForceSimulation.c": "2bbb8888c752a3ffc042f3059937526d25ae288af5b4db024cc683025a2605ce",
"addons/core/Scripts/Game/ERR/00_Core/ERR_GameMode.c": "18958230fbc946beebc8de273ae743ab0bc97516b7de08f27c3e549316962829",
"addons/core/Scripts/Game/ERR/00_Core/ERR_GeneratedSites.c": "4943f761d0274e163a1da325ac4f750de9180947b05b79ee173e12141bfd6661",
"addons/core/Scripts/Game/ERR/00_Core/ERR_InitialGuardRules.c": "8c9d6b1dc4c2af96284e34f487eebb5a221091016ef108006dec60b4e3836558",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Inventory.c": "b63e679d5b650b63a7a91dfc3f42a62f4be58b0338f6df3313e66d29a93bebf6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryHitZoneCompat.c": "23c34f901311dce63a79aafe83c11e2fc25bd3fddb0cde38bd313eb90878ca90",
"addons/core/Scripts/Game/ERR/00_Core/ERR_InventoryLayout.c": "1af5df45a0f06d19a017954e9bf4b2d722e2d2389f8ffdeb1d024435b9a08be8",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ItemPreferences.c": "1319637add7f9fdb122ac130784c5426d90a32380d870df03efcce7f297c55e9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ItemStationLifecycle.c": "0feee55cc5ddf13e00fe73ae3926ec2cadd5ba861d793a939164287ccbe1861d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ItemStationTeardown.c": "102e61216e86e47ad243cc19f6f66da1fcd8cc77f8799354ceaeb4a6dc74622e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_JournalText.c": "1ad00a77cb0be741c7b6ef5dad2d8a8c1ff1fcca3b093df2e132ead0b69f74e1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_LoadCasualtyAction.c": "1521af55a34110ce1c971b5226a618a9c6d931622abaae4946d9c0d27c05a273",
"addons/core/Scripts/Game/ERR/00_Core/ERR_LocalAdmission.c": "a076922d1ae966cf5cc67b198166ca6b1288358fb7f641207a4681e6a610a2ae",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Location.c": "6323facd2d5b32382b466a2aa0140064632a8c1de0597e0738cb09a3fcfd7abb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_MenuTheme.c": "90d9babfec7978b3d7f5baffedbbe5c1b54a9742f576f51e6232043e32d1cc9a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_MissionRules.c": "17d1f48878b02a457eebbe5ff87c4267488d68d2a9b3121dda77a8bc8e69c8c6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAdminMenuProbe.c": "2deded62be82adcf9866dacf8065f0c6a9a643bdd60a1c3e87990e1c70254c48",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAdminSettingsProbe.c": "73e58561e08e50008d33f81eed606dd4e8109fb69a627e892d28ca468d641f7d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAggressionProbe.c": "dcda8528a64d35e6aa2f030b59503a49ea8a85ffcc33beaecdf8da00c003b50e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeAirfieldMarkersProbe.c": "980025c07d042c2f109e2c99ccee0316b596806ba2c4fcd9446b6ad7580d1d1f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeBaseSmoke.c": "f7697361c6a056a62aff86de7f7d69e9ccf47b92121dcb96ed012ad136e47e30",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyGroundProbe.c": "41f40db3735f8aa535c0061458d9892dcfe972222b8a17238e67b65633c46bc3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyLoadProbe.c": "94c533deea654ec546df3f1ebb7cd213e6cd79b1125d99bab5303ef8e87b018b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyRemoveProbe.c": "4cfc06f6d43b709b63caae714155ffc562502e884f49a9825623c6f46972ad36",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCasualtyServiceProbe.c": "02a9d70d1f4ba20326df199ba41489cfbae12b7bb0aab441361421cee38ad9ea",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeContentProbe.c": "cb0ccfe1e1575f9ed80a8054058b471f3543378db059e6af2fed8eb42a262638",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeContractsProbe.c": "60aa767d9455f2f4958a6a47bd68bbd8ab0466adc8f1dd9ae433c40ae96c68ff",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeCoordinatedAIProbe.c": "9104a7a5154bf34906f135f00c5793229e343da6a1ed19dd572e3c1d9821d393",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeDefinitionProbe.c": "904d8d4c3e7b91d49dadfe495fc7b4f02f300e4aaf7efa348df5ca17ec4a6e8a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeDiscoveryMapProbe.c": "9ed32d391d08d937ff4f9f33bd11c3a204ce9a2230c2d72b6761e0320b31f24f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEndProbe.c": "2dec80c7e247ec5c257407f95d9d5edd42fe0cc44d6af9f724f6ebd10d8a355f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnemyLoadoutProbe.c": "0885ca69f6fa7f53414ce1792cfc3c49916886b8173783c634135c13c5d37429",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentProbe.c": "9e2e66ac5d9778a1c65445348e3300cbb90b68b3f669f3ddf1d2b78a858430eb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeEnvironmentRestartProbe.c": "7a836a206381b8e8de24c92baf141beb30575723675dd6948d738169ed26b507",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeExtractionProbe.c": "4b09385f73206de004f4f3c38a6192fd658a0d2012482dc5a84dff1599ceb972",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFactionCatalogProbe.c": "e3011fa47b67122d7b2c23af8f91b7a217599d6cc114c4f9de628744b9c948d3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFactionSelectionProbe.c": "946879d822e7be2d48e03a3140aa1aad3e3d44dd18507fa3cdedb4c6d7dd81b9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFlightFootprint.c": "a8862a04ac784426f431e2e9cd3f1f19f820b38a081674d29549b8b00277c72d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeFlightInputDiagnostics.c": "e231dcbdaefe81beb3bd587cb73be8fb3d3184bc86d18dbaa30a43ca4ba5dcc4",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeGeneratedSitesProbe.c": "a3202ee4658e98539122926755caf689a693a79642e8c88d3146c247dd961138",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeGuardCancelProbe.c": "bfa1c65cb039e19c3d1891e4a3fd33469e974c97cc7f42128efc31a8f587d514",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeInfantryCombatProbe.c": "3e4c4382ab91f470357268927b954fd101685df6b2244df483f0422d6c0d7da2",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeInventoryHitZoneProbe.c": "604eacdc66cd52bc8a0115862ee7884a8b0f83bdb50609397de671eacd476543",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeItemStationTeardownProbe.c": "028588a49fa9207087cd27ec9396979cd932daa071e2490bd0262cd71dae30d9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeLifecycleProbe.c": "b613a5dbe81c2032fd02d31070ae5631166d14d0b02cdbec3b63b782f0bbc115",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeLocalAdmissionProbe.c": "29c860ca3e51cdaa463f3c23a98ff45ee0499ce9bbc322046e0efbed587f1e09",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeMedicalCombatProbe.c": "59c5b04dd32370f8cf5c62fe6931d64209825522127a068b1957e9d1556274e1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeMedicalProbe.c": "4b73e7cf35e9c8fddb089678a320ea58272e1b6611318d0a762754c171eff785",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveLossProbe.c": "6b80fd317a8c6e8583bd4337870838a86251e3b8a681d0aa07e8b52e22abfc48",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveMapProbe.c": "37e66177ee0f16fc33d3d18321211206bc4f095fccbd17b177d4b8cc1ba4e057",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeObjectiveProbe.c": "71fbd2479a70048f83d8b262ad1452f427be2c0afc8b071ef13bff477b9dc29b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeOpeningToolsProbe.c": "0c5d6b96ed5a7cb1cf0d098d534dc7190449ed09339062e6b584729d53a61b4c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeOptionalSiteProbe.c": "59d86432c19fd85da30a63087cf1f15375c8ee30178ed7e2765c1bda4cc4d035",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePatrolProbe.c": "5a2af71cc4cfccc7dd7c23584398a38290eba1a8894cd46f6967252ff3a7087c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePoweredFlightProbe.c": "7ae5d6f85bbbebec214c66bfdf6f53b93c802f109fcd5bcfbad82c5d61d6cb9f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePreparationStatusProbe.c": "456f4d7c3272b89d5f4c6713617baa5596d846994152356fee9a659839bcd8b5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePrisonBreachProbe.c": "4889e0d3799a6a21b9f84bcb2f2ae78dce16269cccd1329f8d1fcc1a23e7c22c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativePrisonerProbe.c": "e2d1ffe5d269add55124601ff0d1dc032a398c7d51010736e6f0e4cbeb38ae86",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeProgressionIdentityProbe.c": "1d3fe20bce761a1082964bca9bad9ce79d1fa8b04db9b5053bae98da380ae560",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioCampProbe.c": "67f1a088f9b20e5f0f11ed3aa083ffa772bffd7c74d85b7a307344ac3d47e09a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioDefenceProbe.c": "ff1e27a0ce75b123a86e7df31354831880ca62ea90b6c5d7c60d3ba168e1fff0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRadioInteractionProbe.c": "7b27552d233813894f65c08eb9f04b547c4ca9ff96a2370a763cb94bd4a555c3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRecoveryProbe.c": "d6691f22432b3ce37d07d448aeb3ce7feb5cd09e852e0167b5e4676afd24bb21",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRescueProbe.c": "78f4dc11a179a5b924c0ec1939f0fc1e61d4e6f6647729c48a9f126ee32d1714",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeResultProbe.c": "c9a89cae067f221b9f33965b4d3ab311b78ba79ea383ca65032c4001df44b472",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeRoadblocksProbe.c": "6f44725b049f2545a9ce3c94ae3e9134e16077fa017a438fe4f073b453292c1e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSarkaProbe.c": "511816c4b86c9f1392bc4a1d83ad11e082280bec16356d8ab24ac1f2094bba93",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSiteGarrisonsProbe.c": "1a5ff8747d7501862085b5e9162043fee3b05e82c73c516ad8093aaada53dc60",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSiteSurvey.c": "ac0203753ade0cdff6d483132797a80e4520f14546c3f9dea288281cd4cd9c4f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeSpeechDownloadProbe.c": "5377da12cabd58b9105851a2348d7496316db371bfc4346a5fb3f84f245ec013",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeStationTeardownDiagnostic.c": "172248540932174341882861bb78a9720a6cf89981fcdf9dffe63f7fd4023f2c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTimeProbe.c": "4a2c6ffd947334a0a71eac083d10c853c524b00042e9ea0987497c4cee60c3d5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTransportProbe.c": "7a3fe04aa1c5ed1061ff63d9d5180e8b925932b62d76c1ffb49bd3dc23530993",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeTransportSurvey.c": "e5abdb69c0675a20f4287afb24b9e3c877e91b162c77c32d81ef61e2a8b72577",
"addons/core/Scripts/Game/ERR/00_Core/ERR_NativeVehicleSecurityProbe.c": "59bce863142e4fba4b6fb2f544bb8a58061f0e99b1a38e5ac291cea919563763",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveDetails.c": "628ebd166dcb5544c2d18dce489619984887ee18296cf2446fc6d894f89dd5bf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveMapPresentation.c": "70339c05c550b72a4fd5890a871c5d8e6a9e574813d61696194c5fbb1475ac8f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObjectiveText.c": "d2fd3670c89d679fcb1359ebccf67b58734fe5168e31fc239bdeffa7f8ff0607",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Objectives.c": "b9cd5bb3b193c20401175c4328405be1b121e8a60b7b5999910b6a71f834af8a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Observer.c": "7c478eff3575eb1bd8a85c08955d4ca7f63b57969cd7b2b76dfd6c42136de1af",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObserverPlayerView.c": "c287a1891451dce0836c6e859eb962c154aad9621a46e50400f44fb83f97d95e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObserverScope.c": "97d29535a0ca1571ceb86996f58b68e5ba0944edfe30370455c52a321772f85e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ObserverTargets.c": "1dfd50307b5d74075b90b5f2f70bae2c9488fc12df03d82eb19350a724f910f6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryGateObserver.c": "1e376ca83c0005cf532539e14d7f47363c47b7c5b03fe3d55405a59208705fd7",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryInputObserver.c": "808a46cc1e4b31b65dbbbcdd55493f594ebb3974bbec38b4a2402334c653c0ef",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryLookObserver.c": "d5a1b636938d65e9d11c78b31487f2924400c34d98e2ec812954a2a224da7dc0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_OrdinaryScenarioLaunch.c": "8d8da4c1222dcc6adfee350490f4399b4129cfce7a42b45fd7fba52febfd3eda",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PassengerHandbrake.c": "3078487e077aaed1567894f6df12386aae440b790b6c134118d3afc2c4da156d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Performance.c": "037ffa482e3765bb537629e34f10919d85d4b6bfb0abf56ccc7c0d44fce8872f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerAdminCommands.c": "eca9baa3b07da48a740851583540840f8bf5f65f7be854902a3778f76967faad",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerEscapeResult.c": "3124ab4d2d6d471409a47aba0af528790734df53243c03fe0cdac3e407047c14",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerGuide.c": "dc52f551a1d3705fceb64ea18d882009d9e9548c01f08ae1c7ef3083b19ab2d3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerMedical.c": "270454d50235bc28df9bba4fde2689934578874c4eca9560afb9f0f6324d7215",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerReconnect.c": "478fd041e8a13132df25202088f42d0810d36680060dd7a0424d8f40a5b1ca44",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PlayerRoster.c": "dc785a8a1d78a285fe55ce76f87b78a9f522eeb9f7d9655dfe9b5c4348a26a18",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationFailureMenu.c": "5c31219740bbc26cb903a91f4fe22866c465b38220391093c72a3b094ca30f34",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PreparationStatus.c": "c5cc9125986e2285282f3f7fa9068ca72f00d7e26465d00213e734039c0e34e4",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonAI.c": "67f8b444824634fc37fc253c60fd24b56d06d971f48e56a8d53095c97aaf0070",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonEscapeService.c": "ed180448cb516bc4ec521aedd366810a47787628c7f5ee9c9afdbd185d980751",
"addons/core/Scripts/Game/ERR/00_Core/ERR_PrisonPatrol.c": "284618391ee2da84dbcda4a99ca3c072eae3d67b8a9ef40a86827b9ea00810f9",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ProfileConfig.c": "b5aca526a860ed9ed609dc3fad99ebb34d2f6fbd537575a167390472efd4ba89",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioDefenceService.c": "f5f0bf1352141f933d0edb5630e30541e001dc07e1d2c8529b29cc159c126b13",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RadioFeedback.c": "545262e65e9b3645d9e514a0521e442fe08f0c2e4e7c83ba638c5105d09818db",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ReaperRHSCompat.c": "bcdf98c05ac6cdf0c7eaa854531b02e9ee4f53fbb346ae01d58114e572e7dd4f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RecoveryForecast.c": "0eda507fb58860c0eac1d957319d1e80e9576a870d22931c86081db748df44b6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RecoveryService.c": "182037828b74938746022ebe03bbd9cf849d52e31067c0b33f392f03969d6162",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RescueLanding.c": "e6f63ee8860335de1125e0a62eae3b8406faf5a5ad2c8d9c6f9a6da077986e56",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Resources.c": "d0169aac6fd0c38928c47a9002ded0fd8ba558ea3314a600e792d307ac1ca3ee",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RoundStatistics.c": "60e6839cc50fa02df1795a00b93fd431160f9201bdbb6f1e3b9b50271306e9fb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_RoundStatisticsLifecycle.c": "b813a9ccea9a61c9c6d7d4806cf18adfb323d483622ca1225930207ca2436d12",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ScenarioComponent.c": "ca6b20d5c4599e31957e5cb464d21bb3a4bac517dd539711f9d4f380e48a0e15",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SelectionStyle.c": "b9ea5158e51559dc13812cdfa8939ac36b58c79b9e4115c72465d869fdf264a8",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SelfEpinephrine.c": "da5850374b51e89016c4557d06f3c7c087b6e6e36fa9734b22c7c6c50d757914",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ServerItemCatalog.c": "047d8c4c36bfa32e1afed13f8199f01681ebd362c72d87da8868cb6959661973",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ServerItemsMenu.c": "b81283ec17fdd9f72096901f8bc2a3c87fb8fa4c8fd488579ba0817328b9dafd",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ServerItemsWeightsMenu.c": "f0900e42100c9a58402cfdd48b7f27689144f53e03d3ae3dcd4bbebc13a5f61f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ServerVehicleCatalog.c": "bbc346188ed280d34b1b519ab7c96c6bc35df9ec3e4bfd03591cb9b8008f89f7",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ServerVehiclesMenu.c": "d873cdd81b2350acac7068c4d59d5603437561e061a3b9ff2cde2356239da322",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Settings.c": "b0c89ea6f9ce8177649c8b05e9111deb097bc0058573cd09eb494136cbf17d72",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDefinition.c": "d421d70b32bd2b55cd8e4966c04af3d5bc381ac811d3b4b2efa4bc0a8af8bd2c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteDiscoveryRules.c": "dcbce3b7aee89bfc47a50e9de89209758af1f1bb462b99af67a8ad7a26e9f229",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteService.c": "2b283ad19b046fd6b33245d466b197bd05b4c472e128a747e6b1e725f4a34c2a",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SiteSquads.c": "183883783a4e8399cf62851a4cc65a5d091d25131bc53b4323cf17286315b2e0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnClientScene.c": "b56f99a91cdc53bdb93d320d10839339022d7e61e6b101eee8296271abd7d3cb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnFinalization.c": "6ec741f8d19ee316d3c67b0dd2216698584bf2cde3634a3d6a7c3cdc3a3935b8",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnLogic.c": "6d9243f66b4ca8c53d53fedff9dea8986c815e90c1f97de58200cd759aa8b49f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnPlacement.c": "fc5b61f1877aeaee75fbfd6aed3cd0b4c5277ae8543bc38a0c09836353d54b27",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnSceneInventory.c": "76b79d5bd9d1f367e1ed19724302b7d49f8b0ede85cf19e89c452582ef651f8f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpawnSceneLease.c": "20de7f96bacc9037580d88d4424664b4554b2c082d82e7d29913e9dfe390b594",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpeechMenu.c": "33f9ef80b4d6cdbf3646eab602d15ae0d05884bb20b3a7222b0648752339cda5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_SpeechService.c": "74ea305ac0c9a9d145646a5c73cba58e4920ab472943ae73b3dbd71d8216f752",
"addons/core/Scripts/Game/ERR/00_Core/ERR_StartBackpack.c": "4a36799d3a3defd674822974cd96647c0accb2a854631dd5488c35e2ef697f7c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_StartBackpackMenu.c": "07c90db1a84893759dae71f40b7ae3109827646e48fade542190d21598ac271e",
"addons/core/Scripts/Game/ERR/00_Core/ERR_StartRules.c": "ab7c21ef700343cbe769d8d51d91f167db37285b466d6af9873e121b3adf4ade",
"addons/core/Scripts/Game/ERR/00_Core/ERR_StartSetup.c": "58a6b617b22910d0ce9255f82091dc11cd1284417a66adf1cdaa7b661c1ed01c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Supplies.c": "752e8a56b0b8cde33cf532032cb0a203553017b686faac2e19bee06f7a9c0713",
"addons/core/Scripts/Game/ERR/00_Core/ERR_Telemetry.c": "b1dc3ecab89f5e6db1ff4ba613b43755a5ae44f3612249288cd134ad850719f6",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TelemetryCredentials.c": "9835caf69d4615d6a3fc840d9dc3cb0f507a0c5a2a6490893c21761f9cb4a216",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TelemetryLifecycle.c": "15d2d90d4457339dacd61c1bb23b619243b8af10731687c35ecc300125a642f5",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TelemetryServerName.c": "7744762c4586e2543601fb0899847bed311c439cfda3dcaba825adf870628693",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainCatalog.c": "ba2e68543a8c929492d06f8725a743d26849a630d6f8c09be0f23894f92d0990",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainControllerInit.c": "8071e38812ac61f9b480d9e91f9ebc7712b360d431f5555da83027db6cdf2471",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainMenu.c": "1da542ef60ff7c1897b1f12432c636ef6a08cc710bac520ef186589d506e9a54",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainPreference.c": "93fc55f2c33e95adbcf2bead3430aa14bdb55154315760bcc9647f89dc8286ff",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainSelection.c": "ee75cac068b99e7403f5eaabe556152513cf5d973602cc6e6b8967d25402f6ad",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainSites.c": "4ac347d4d91951bcc7175a965ccea25f3782edb6e352354cce506d6b626e5ac0",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainSupportStations.c": "c4fe4265963ec88e24379c143edae251452c84e43a3102f5da120205f9a39c9d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeover.c": "ac31af5ff2937f8a1fd89ac03732a8a473b27b09c83a07923f17986b0f9db841",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverClient.c": "70f192d5d749b4211c5604575d2b9d7e39deca589b5841ffdd03f99baeca1280",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverManagers.c": "ab1d64c8073e4daebf14f4ad2c745d874032675ebcac3fdb0fdae4626acb8dbf",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverPresentation.c": "91d450215eb6ed2da74446b5fbb805356e3881e3cb43e37fe45308e30b22be9c",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TerrainTakeoverSettings.c": "da22775930b13e41d4a71409e37af3bb99e4cc1d94bdea0e3b59fbdcd4d40132",
"addons/core/Scripts/Game/ERR/00_Core/ERR_TimeService.c": "63867760876d523a1794f619118a52c5cd387d5d92756cd286b2c16a348a6c7b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_UnconsciousCameraProbe.c": "cfc63058a20fad99e76c59b64d0d288cc3441fd3486ff63a6dde9998b4ab103d",
"addons/core/Scripts/Game/ERR/00_Core/ERR_UnconsciousWeapon.c": "24d31bc857486638e55c605283c17cde0cdbd3c5c6021eac1ec93611387b10d1",
"addons/core/Scripts/Game/ERR/00_Core/ERR_VehicleSecurityActions.c": "bd7d0aeb4abcc9d8044e4888f9a92f9e5fc97c098bdfa3bbad57e1a29697a779",
"addons/core/Scripts/Game/ERR/00_Core/ERR_VehicleSecurityComponent.c": "2ffec4e646584ec546147fc4b08249825cb32b531aba26467b586d760485adc3",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ViewDistance.c": "8514f72f8207f12570d2317e64094a45507a1647dfd45a1501499ef81e90189f",
"addons/core/Scripts/Game/ERR/00_Core/ERR_WelcomeIdentity.c": "8624bac67c1990f87b3fb799361e5facd31c2e03cb621563b9c73c4fe9d7f87b",
"addons/core/Scripts/Game/ERR/00_Core/ERR_WelcomeVoice.c": "a6a9a816dee1c766675990c158a757cf9ea8628a7b2b0de991af67ff4cd23e47",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ZBakedSpeechProbe.c": "533c89b6a258dccb61d7ff6abe0a43da58d52ffae60735a38c2545fbb4480afb",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ZSelfEpinephrineProbe.c": "a13e14d1ef525209d4609a2532c6d72135377ce058298937b632a91eeb6392fe",
"addons/core/Scripts/Game/ERR/00_Core/ERR_ZStartBackpackProbe.c": "6778cd98392f4e73dfe974782e626d98472251c1266698020d63edf8fe735bcf",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AIDriverHorn.c": "db9f100c6cc10efc6f5b86e8fe9adb75657ebabee6f8bf0c89b997c2e947750a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAmmoMission.c": "0a471a40c8f7dfb797d8d35e41c5b1ff91e8d2ab13b43cf866e46c0e4ab4ed9d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAssaultLoad.c": "de7b6c485167ab68ab0b37b96fe161ee821c2efd41362172b810448a02110e68",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirAssaultSystem.c": "2eaf9816eee3e1cd2ac70744a6ef7ea5a90d0a3eebdf925e384028a7edde6a42",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirReconSystem.c": "f8a0e3cf4552d8133efd33c2126ea15a7694676773a7047c15e00021c1d9721e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirSupportPolicy.c": "c1a7ac8759ca8ec8b43cbccf303255a2f0b69de447d0d991e44b6bd3db415d51",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftAmmo.c": "2be282406d0c45ab2e35b0ced791b5e494c662588f536701a4e82e6f5fb7c913",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftControlBridge.c": "b8f0141644d8f043c6db4c2d4bb93215c548e5c27ab5468c66e996d62bdf905a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldEnvelope.c": "0f53c7d9ab167a804eb904d63725decebb53fd5796fdf27864a75abed5679838",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldFlight.c": "c04e264cff9963821852094c451502d31bf9c96d4deae2e8ff8a2373b53b5665",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFieldRules.c": "30be68f4ca2db7e169f6f0432815821179cddf9159f7b150341dc8eb479bbd17",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFlight.c": "aa25a8e67a30c48677bf528236402b7f8e5d815dc18df93b878520ad3d1fe8a7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftFlightEnvelope.c": "8125cef61fb283d0d7c4dd2df3c04b062b448f1101fd48dd53f4f4097df5fef3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftRouteEnvelope.c": "e8fcef844239c47a1f2f36be420afe943bc450091b05859435406b46c87fa511",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftRouteFlight.c": "1d8d92bf6d97429d68a9f62018232e90cc124cc8d7445efeabe863706a31e2b9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AircraftService.c": "3f05209227986b5c6bfb193f8f53783cfd4ef083bce898e22257c3e63daed913",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AirfieldSupport.c": "c6d88ede0b1b6bac5a7075b6e2e783ccfa8850210aabd28bfa4bcdb698cc5f87",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AssaultParachute.c": "a93c996059e7166988e9d1b0b498cbfd36f19a1cf8520cb4e9215a8884752e18",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AttackSpace.c": "e7be303231b5946d78c61480a5de3f5b37a63d0d2281a9a30a21e59f072904d0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_AutomaticEquipment.c": "8658421f846fcd3402289103762edaccbe3ca26280d7d72df2846c32ae8a4cdc",
"addons/core/Scripts/Game/ERR/10_AI/ERR_BodyRecovery.c": "f5fc311ecac4533c2d053a686c51e71216e69130a34483f27146627172914c99",
"addons/core/Scripts/Game/ERR/10_AI/ERR_CessnaBridge.c": "f1adb0f9b92f6ed94a8e9897b64e2fccba0f28552525a93f1ab893faa4fc5da2",
"addons/core/Scripts/Game/ERR/10_AI/ERR_CivilianTraffic.c": "b6509be9cc891ba4c1fc0f3fed8b09ebb31ca69bf2e5b28b50a6060706baed73",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyBoardingProgress.c": "328f8a5eabb8174b7727eee1d675db83a2eb0be7b8e834db4e950a645ca5d7a3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyBudget.c": "fc7e254056c1da4aadd26d4f56d51ee375d5d3331f5f7e5183581108c7474a10",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyCombat.c": "5c4b7576b28d51edea868cbb91a0ab31a40e6ddb558f1b8a38e07e20fdb2969d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyMineStock.c": "4497d6b790a45df2b76d18541ddaf299b406def88b868caa29f096849026a42c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyPlacement.c": "af4799e3028448e1a73f944989313e5d10c6262521bd29a8cdd5236842717963",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyRoadPlan.c": "fae404f85cae63e63976938a5fdb73efc988ba25c5846564f12edca04fb88551",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyService.c": "5abc35861aebf2e4ad00de11f040d01f784c6f2184de2e10beaf46a74ec8758c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ConvoyStartup.c": "360228fd45aa6ecd9426e36120b5e637d2feee1e3a4a89aac8207526b871c87e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_DroneBridge.c": "9ad23a763c5995b2ac6f68ed02def487b0ba887e8ca68f0e546d1b6812504cc9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_DroneRecon.c": "dc685b57c884d733e0ff90cf7937f5664ec08545f4cbf59d63bc8a84383dc442",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyEquipment.c": "dfb6a7aeda23adb8aff2292753b694770affc9855bff9fb11d50bb534f9219eb",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyGunnerSkill.c": "adf8bac5a6f7e40b2f9caff5fe9be590c4e4ce2b2b387ba39e741a3c4f4cc564",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyLoadout.c": "a48f32dbd7f209bf08fce2840aaffc1781c571fc679763be58987f6b082e776c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyMapMarking.c": "0f161fd3e08a54e3e1063679127549e482c40253a022e9d06cd9ee4d740b8625",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyMedicine.c": "68b65c98214e1a27383e155727901a4f70e9c065bb0cf133bdcf7fe6d5a57a40",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyOptics.c": "215e8a05594c541861b48e093520c00091708eb0f3635dcee5d0b5e1160230eb",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemyRadio.c": "3a97e5c3de9ff33873d97c6b2d84ae505cfc4f3146e047b928e76ec3b22c8789",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EnemySkillAwareness.c": "00c450d033e43fc45c9e2cb64a1d81161d123cc594a4292cfc5f68eb6c17ee60",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMine.c": "067bed625a3f4d0fa189f46476988e90528c59b2351ec0ea71916317b06efabb",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMinePosts.c": "bcddb72845189b52e5ed71c687d7dd4b0b40b91b7306c3f6edf84a631002fc5b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EngineerMineSite.c": "d838f5693d4fa5d252d529e59777f560674c02532f1041a5598e938b3a850839",
"addons/core/Scripts/Game/ERR/10_AI/ERR_EquipmentLog.c": "df9eec7f94e4bf1b30b9463604e9b97ba3cbff36028a80b81327b0b021cbb2a9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_FiniteMagazineReservation.c": "8278590ced1936d618905b0cbd0b5aebddda238d426a6a2a52e455fc36bbb502",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GarageVehicles.c": "673661374e0854fd896d3d51aba84c07088057c941751b311daa4a97b899633e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotHQ.c": "c51fccd0ecdb0a1d6ba99ae965e2e572fc1ea65a5d8dc2e1e2a058698dae45c3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotLoading.c": "6abb278409527bb67db084138a773de240d99ba7f63f9ac740f8167615d53f1d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_GroundDepotTransfer.c": "21daa9ed8cb5f2dc08a0fa85e305fa4b4f3e7b01e16c71fd1ca98d66a4e8b652",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c": "9bd25f9fc7e574c515c7131e8b52eb357e295822e1ce2f401e6e86cfd6ce062f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAdminProvider.c": "8879febe59fd99584add06690b29853f7cf14b580bb15c9a955cf1a2ce033908",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAmmoReporting.c": "95c024cbdd35c02d9b0c3d389d29bb042e5dda6ffd2f5f0d896078274b3adb35",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQAmmoSampler.c": "8bb0ec1422887feaa340307d3c60bae50fc82d424fce6390876e580ff8b75e8b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQBodyObserver.c": "f59421c1e0c83f0f480d7dd4d048b4b0a41193ed8fe8f2f627d2b6a696420ea1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQCoordinated.c": "5b67ad624c4a6b0bbb715314ab9cf14e527018fccb7d38af479184b4952b8c49",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQCoverage.c": "0ef1ed718797114d95c636c8fa5a9e46a5f2a7ccbe3f432049b0c7d37f1eebd0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQDeliveredCasualties.c": "1f738127e55e843ee2705007cedb5c08741f52f63c75eca7c80242177af82273",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQDoctrine.c": "6335728e89ed40ce11b811f00b61bfea76e94dd3379e4357cbfc438b05522bb0",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQExecution.c": "d286b8273faec0acf87366bf53ad2517d5b7d909741e981cdf283cd1f4f50314",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQHunterOperations.c": "b9200b6de3a3a61de94ad720aca94aca64db542acc64ba65e7b8061a5e4884e7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQHypotheses.c": "060796bbbed604f9733d23e131c9836702870c6e25c81cc0b396c885eb06ade2",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQJournal.c": "53563ff54fc4e0656713d6eaec5e88ddf69fd4bfa8ef6a67cfa13380d24031e1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQLocalAwareness.c": "124260280ac8eda0e920bfcfc86932c9b21df6b1f7a6aa8acfc43feea3da149f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQLocalHandoff.c": "2dd700dae9d9b232d22ca63ff01af75a3f5cc213ac24b7c0a43ffa38bc0b9ffa",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMemory.c": "ec2047a477fb4273e22ae6bb68e7365f321f55c583b5d2c48c4abf2ac38e3b7d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMineSampler.c": "2a0fdc4d27e947a1d77b02ae23f757c7fa074eb456f817b7df0766583d757f55",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedAmmoSampler.c": "97dfab7381385959b0906be13fa2575253ac43be91a271a5d41edaf4106366ac",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedDispatch.c": "12769b56019e9fa5b8141498a1c33814ba5262253193495e72f85972365961a7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQMountedIntercept.c": "5f45545c11de5e183969203cdf07e29089697ddc89752a9c5aea0fa2a1a33a97",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQNetwork.c": "0b73be993628a55e3b21c8670d540e39c938093dd5cb4d586e800ac530509b25",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQObservation.c": "57ad3f0b68d150791e30a7e4bd7dfedfb1ddd78a1c76f228e67b33ea9cb7144e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQOperationSpeech.c": "6f133c104223ce23262c2927db9e16df0f76f1ee647085114baef1d51417f4f3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQOperations.c": "b83b805c61c3960801d24ae54854ba7aa4dc914ea89e61db365b5ec99f305ae5",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQPursuit.c": "280e91feecc4e5b6d0886fc4201b12117b58c56857d4386b6c4cb963557274bf",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQReport.c": "4c0c1f0e33f621d1e02375cf4f56b0e8c4ba6fd851912d3d16081949bae46158",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQRoadIntercept.c": "f87727aa1c722a180c7b71fa2d896601b6250978a21bd2d1e973501fee81373b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQSquadJudgment.c": "12e9ccc9d42a858a998bd46708fbb04d05d48dcf460303a5ecc1629021051bb4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQStatusSampler.c": "b937eaed913a5095afa8e678dc1c36b5c805541bf8cd5be927069533d6baed1c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQTacticalGround.c": "eba9a9cabdaa80b936aa5e7025544e8b011fb597b96cbdb8d781583c025afbe8",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQTask.c": "29359f52734cbf3400e12696057bbb7aa54466a018fc88c42015b6eb9bb9990c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HQWatch.c": "abe634cf6003ae920ec1ed18e305ed462920204960894520d3dd11f7e5ef1c33",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HelicopterAvailability.c": "60eaef2f6d4b2fd44861c5a4434ef97e732e40a5ff7401e2da451ed2dd9c2762",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterCloseContact.c": "56f22051566354ccdc61531af4869b62458a30d945e4d21de5aadf7079d2245b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterCombat.c": "df1c319d10efd07ed6f971cf0e41d8d7e377b04ea7f0fe143bf94df733fd1d9c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterCrewRecovery.c": "22e192ca222017d4d7a27210c6e42cf0f128827bca00b37924c9c8d6866b62a4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterGunTeam.c": "0e66d82964ef8eeba29de11d5bb2af954ad72a8090855ac4c1b28fe1e66c0d69",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterOpeningPlan.c": "7791513b8b41f4d2ba1b593b5219d7f6e2bf036e352f8e4eb1a8029fc97ab7c8",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterSarkaRules.c": "8c8c96e2f985f553e303f7e459b73a2a5cd0051951b22aa0ed364bc2ae19e194",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterService.c": "c938b8beb3f72ca1b2a76b48052dee70fe52651593dcdc16b7993a9398bc92e8",
"addons/core/Scripts/Game/ERR/10_AI/ERR_HunterTactics.c": "274ae619589b85cf64df1510631ab914aa9fe8c50fc2a76e6e8c5aa5a2c8d9ba",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryAmmoAccess.c": "ab4262f78d54782c5ecbf5fff4ebe3da16d72329658d7e18c0c35387dc8b3c7d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryAmmoTransfer.c": "99fa26beb0c0869d0cd694500f3bfc0705c2c1cf674dea90d98fb93a59570ef7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryCombat.c": "5d7a8e579edf95003133ddb6e509202dba56ac9e68385247e1ac0256c1b319ec",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryMineTransfer.c": "02c399413f80879c22b4891e8ec807c67a6235677095fc4b98bafdc360d6944c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantryResupply.c": "ca8eee2704e7758172e33014404bb1307c683f19b561b840d4592f6312051e62",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InfantrySupplyPool.c": "c8e454573cf064ff392291d6feebf1f23be64390b5b8e944c03dd065f9f46b42",
"addons/core/Scripts/Game/ERR/10_AI/ERR_InterceptVehicleFootprint.c": "5dea67d14ebab67231c485e14bc92f34c005a5f1bf6d9c0943db28e9857e958a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_KnownMines.c": "045468a052e485a91da601adcb42b504bb6e4ff13b096bc0666128e50a6aa9c6",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarAimSolution.c": "59e8343d09f7a44871d8d3335d6ad1d02216abb5deed30d38b5ec9ba3f2c0649",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarBattery.c": "157024afc8fd3c1ffeea6ae923ff091e5773b9ffcf5f5864f8040d001e689110",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarCourierTransfer.c": "968e58ca700b4a11e5e04a5c159696f514a0b1bce531210172b913e495f7e2b7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarFiring.c": "2606ed8c19d5569815dacd3248f012072bb76834f429ce7557d24d884724f733",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarLogistics.c": "b3624e4a00a2bdef16f6c100bbd79910e3bb8c2ae8ec5fe2ad5aa70bffecd303",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarPrediction.c": "05863b2b4f9f70cdb288f91c722cbea163c13f2a2927dc485482e5bd4fa7d57f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarReadiness.c": "4c3799b3f2681e977669de0cbfaeb307d9a682b04365bfc9f59079e762965758",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarRefresh.c": "52ae8d9d6cad92f42d68c634091b80a474d2666b6c06d63a8c30a3fab71494c4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarReportLedger.c": "42a96040b63e56677353e55164ae23031c90f70b4d6673a9f412ad7b19e636ae",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSalvo.c": "c128850c7a78a4d8fee00ad38f48b265f1fbd1d9b24b092ddc5c205b0f0ad6da",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSpotting.c": "39b3c223ade610ed9f1d73040423339ac65c90b153f30c6f5c42290978c57427",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarStation.c": "cbbd7c86f722b664c85ab7c070ae1131d2ce5c41d1dacb4381bff9c1720a1866",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSupplyTransfer.c": "ad71084f507ad9c32d3055e7ec6844a1ec5ddf568c0216ab8391e902b56e417c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MortarSystem.c": "01bae0bab685e9f0c86c3a8939d18ce6f20dc0b8c1a389d179d91e93008c6957",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedAmmoPickup.c": "5f7ca5b31f3b405c2a6ca32ff91042f5b4dac6ab9640ce67fb10d7a74236ba69",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedAmmoTransfer.c": "0b195784497672fdaf651f336c14f7be98c257f98c85cfbeb4f96fe1a401999b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedMagazineSeed.c": "b42d0aac142907433df8bedc40de24c94813544016cf5f451846f1980250f995",
"addons/core/Scripts/Game/ERR/10_AI/ERR_MountedResupply.c": "c26ad43705765be1c20eca37fbe2978b8c647151f6620ed37141657a4b7dc312",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirAssaultProbe.c": "c1d55b338b157b758e6ffb993d5f689029b28b13929797c91e5dcb15b5e561ea",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirLogisticsProbe.c": "58fe863775d0ad575cb566c78cef696c9826691cf49ef9adde76376be7316db1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAirReconProbe.c": "c1216e0512a0268e4dbb82429e228334401c0c3cac52ba4486ae6dc91e41576d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftControlProbe.c": "0cf3e72ccdc42e6ef20fb71d743f0e037a9e69b2e082c720fa705628cf790205",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftFieldProbe.c": "b64907c7566a894ca2f3c49ede5d972d4087a938da1a0ca87bcbd7c2203b2c52",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeAircraftRouteProbe.c": "8d0dca97e5106d1c84b64992c789e1af0689514beefc027e713ca6ab901fc470",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarCourierProbe.c": "740c8bebbd4128a9311b1167d1058549475d6b46f81c9b6c0d19650f4b50616f",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarFiringProbe.c": "ee570d21bede8baebefc799399712d9582b3e30ebda7299f6c941777f02ad2a2",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarSalvoProbe.c": "fb9ccc6b36247ab3ad828ffbb2556abf5c2838d93ea6cd1ad259c0a015142f5e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarStationProbe.c": "a110f0abc753cb1d2f781e457e637dd5346ecd2e924eb5eb3a5c7dca3d1e2340",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeMortarTransferProbe.c": "399c21940ef10777b46fdb3e905430ce43404ce1de2f4a6bb62f9c61c1a0689c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativePatrolHQProbe.c": "9784b551cbb91f017004fb728ce08b5c36bead0ffc83aa7149c2c46a7c4dc495",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeScoutProbe.c": "41b39b1abe5e51a5b8a428d533cccbfb0dda9d7a570228dc3489408c60543f17",
"addons/core/Scripts/Game/ERR/10_AI/ERR_NativeTownProbe.c": "28876e65f9f8a7d96d8056f446b61e12e97d9bbf1a5ac0d4c40edee44e6c4a21",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ObjectiveDefence.c": "83ef91c2118521aedb4c1838b2e47909c80e0950086449b98ced168f1fd87080",
"addons/core/Scripts/Game/ERR/10_AI/ERR_OptionalMotorbikes.c": "87cf6544983386d29058a6f892aadbf242a517cfff4ed24348f56a72bcde8cd1",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ParkedCarCatalog.c": "1d865c263e910071b127ccd1bdc8b58dd45768c4629194da49705f76995ff0e7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_PlaneFlight.c": "14fa2328e1d31cf59fb89cbb53ba33224be6cfcdd2813525fa9585f8b2e237c7",
"addons/core/Scripts/Game/ERR/10_AI/ERR_PlaneRecon.c": "fe94c29fd9befd3c1bf3ab97b9b27458a8563697d4d46f72df43c6e642f3664e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconAirports.c": "7551347d776d6e0eec818d6468cacbca7ac53daee7317e0a1618ca3d39ebc762",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconCrewLocks.c": "83b63c21574140208792aaf3d24e3d22b255a078871382122110bb48520d4541",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ReconFlightComponent.c": "1386e2a2d2a635417ca517aa1d8ddd4f657dd415ff59be2465543cd8f601e7a9",
"addons/core/Scripts/Game/ERR/10_AI/ERR_RescueAssets.c": "fca1a4518baf09f0b2c97f3a51995001d9674849417fea9ca1233e8d1f578495",
"addons/core/Scripts/Game/ERR/10_AI/ERR_RescueFlightComponent.c": "60db8029bbfbbb362b5bce61f509740eabea5925b93bc975e7c2b44addcf03f3",
"addons/core/Scripts/Game/ERR/10_AI/ERR_RoadblockMining.c": "47d0212cd20c0b320a47123d17f2b89f7d60b44072a00c69944ada7bb83c4e5a",
"addons/core/Scripts/Game/ERR/10_AI/ERR_Roadblocks.c": "879f78beeb284d1298ec49dbca9624c5f3899ffc6fcd376e748bf55e4347d4bf",
"addons/core/Scripts/Game/ERR/10_AI/ERR_ScoutSystem.c": "63287a252e4e7d5aefce840279f26ce3e1f286cb79cadb32596c37897cec7119",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SettlementSafety.c": "e5c0ebc95521a9a33a3f7d9cca6c551dda862a08b7af20b017877aba9584795b",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SoldierSpeech.c": "ca87494ecd355052b46b72e2faf13660e458f3d376285bb0e4c20fd0112ef2e2",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SoldierSpeechAudio.c": "4734d614c5366ae3ff57717f514664c9dfdbe4408e16ba36f6b10d807361e313",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SoldierSpeechContext.c": "d2baa94f036f7dde5cf24e004ad1fb9416f249cbf7d0c6c07c5898f7d21751be",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyColumn.c": "bd898aabcac5724d60dbecc4ff5ab6f062c66cf7c735ff59127c588ff94f898e",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyService.c": "5393efab9d663382e67b9b27a388063986a4f99c2607328c998f007588074ca4",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoySystem.c": "f09aa817c27d6af0ccfb544f4ab1ae2afafb63d626641e03d87cfe159475d821",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupplyConvoyTactics.c": "d2fe073b0c23c877afaa65e246544751eecabce4febd72412fc9a4ec18eb1c8c",
"addons/core/Scripts/Game/ERR/10_AI/ERR_SupportScenario.c": "151eb6189701e559bd4f1359c91187f5a64deab1f2bacbd521c4f4cf3de6d878",
"addons/core/Scripts/Game/ERR/10_AI/ERR_TownGarrisons.c": "9b48331ff8bf7e5a111b498c59a57a5d0210125af983424535286a4aeda9a18d",
"addons/core/Scripts/Game/ERR/10_AI/ERR_VehicleAlarmPerception.c": "45ac71d25e10a057a26a5b0fc7128935baaf47f4c0f87208a4420fa52086fd98",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelAdminProvider.c": "40adf8497b64cc74b1390149fe5ba789ee2f14e6fb3c325af8f5ffa8c806878e",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelDiscoveryFeedback.c": "741de1dbadfd46c154905a0918aad41386ddc139d843553db55d20d60700c020",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelEvidence.c": "ff436bd3c7aa0fcd5c24e940430c1ffdda934889953f63e877ae418bc9557d26",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelReroll.c": "d8b04de9ea789732cc78ebce9aa60786c86fe46d05f671cf251eefa68a214b59",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_IntelService.c": "2911325c79a7a372628b18ffa0e110d11919ce2c2cd7b19277bfd608fdb03dfc",
"addons/core/Scripts/Game/ERR/20_Intel/ERR_MineIntel.c": "3ce16cebaa9703b2f9803df7c11614f94de6460a9136dab8f80dcad41ae2b1c2",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_AtlasPresentation.c": "f0b36472b16477b8c3b5b62f55cfb2a3b3a08304b0779bc39244359af1abe203",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_NativeAtlasAnimationProbe.c": "845b39276bfdbadd6bfd9b41f445fce1a9d40231d38ef32adc7a6654868e17f2",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_NativeHeldMapProbe.c": "46c0210a3aef40fc34e4c9682d9364b1cc1e15d4373d8aabfeac7d9b8e55c351",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_NativeMapOwnershipProbe.c": "32418602f085e3edba7343f42a6a691630b533be262002f29248e8ae87a38254",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_SharedMapComponent.c": "73298c94ecc8d227452b0eddfcaec7fe9df4748875fa7fafcc52544a43658f36",
"addons/core/Scripts/Game/ERR/30_Map/ERRM_SharedMapPages.c": "2286d327b87f127f052e06c22f553b30ea31d25127b860fc02a220aeb4ce3ea2",
"addons/core/Scripts/Game/ERR/30_Map/ERR_ScenarioMap.c": "75fa1d742129ef7f33c005cd48f56db7f49ee7bde3c5428532b0b501b032b0a3",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_AdminCommands.c": "282fe1463add7af8771aa58507b254e69d2d06f50274d4c77321db073f8394f0",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeAlarmHearingProbe.c": "5dbb6a48909b76cd141e3a79ef01d2e68cafee55153821c4471f85c761fff94f",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyCoverProbe.c": "d2450140cf9bdf09210473234605b4c0d818ea5b91f9532209166a35c5d13701",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeConvoyProbe.c": "87df652b339df4fe4239617752ac5fd9f47aa4396ba94742a0af39a32b54e784",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeCrashGeometryProbe.c": "7867ce1794aa0d1bbab72c32f60f5bd0c2bad4f5ff6224978c215e7828840178",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeCrashStartProbe.c": "957f40e36bfc025b8bc752b1f41dc177c8d0844c69ee5994321a47cf3ddea1ad",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQBodyProbe.c": "811244cc8297817efbfc3ee4edf01c868eae23c88127ba0c72e98ee7422da72f",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQMemoryProbe.c": "9bcd0b2e1007d40cb794aabe80368a2584ae58aad6a3ebbee070efc7b21a8147",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeHQResponseProof.c": "0f8b09fd8753234c91fd6baaca0e2f812e409ae1c4be8f340b648ae59b69c2f3",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeInfantryTransferProbe.c": "9b2de4dc22bdadd51b0271219a971dc8dc07f70ed3534f306acf03ed81b29424",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeLocalHandoffProbe.c": "0d4d61c424a16008595f86fa61f3b848caf9bd6e9ebbacea9c10254d88ba378e",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMaintenanceProbe.c": "852b9b397efc3f919c97fec63bc3df1a850cd7833421af8441994afd191951d4",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMortarProbe.c": "ddb892141500c192c0787b011d57dd8c07dd8c9a3ca5fdc407f6c271897bde0a",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedAmmoProbe.c": "7ddb634444c79ad9291d53a754dc0ed383342e36720ddaa4b7aa4bd4e7ee656d",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedCourierProbe.c": "12710e9e5548fe8856f7a52f3566338369a8a1eedf0bd92af16229271872ada5",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedInterceptProbe.c": "34b0b1e38a59f14c4e83d93ec412779945388e6f4d697bda2f6cb90f519a6372",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeMountedSwapProbe.c": "a6721fcaaccadf8eddb06687c7d587d0a3e377d5d1bb0b8e72e630fede8690ac",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeRadioProbe.c": "a4bd5cd9fe0594e05238b2d6dcd80466773f8fa160dc60bbe1eda70e3acdbe79",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeRandomRadiusTrace.c": "7e946406067092e30b6b75cc6ef0c56db7f866249e02bd13648156933ee578d9",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c": "4dfb218419db4cd7a46d25cb1f2e578e75ad89efc43f99c6ca8ab8e591e139d7",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSupplyConvoyProbe.c": "89c2696071912500840f4bb91d754f695bf674335b51a7ee1d03727084fd4869",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSupplyTravelProbe.c": "32e6074e912491f2643a24cb44311b9fe5b069c76e4e94a45e7409ac82d36507",
"addons/core/Scripts/Game/ERR/40_Chat/ERR_OrdinaryScenarioLaunchChat.c": "a747af09599ce4d0c52051f18f00c4624d24d137e328341b580b82e896c6bf65",
"addons/core/Scripts/GameLib/ERR/00_Core/ERR_DiagnosticNoSplash.c": "0ea1b402f8927b6d68bf6f7e5caa2967f7e3a39147634faab147796b791933b5",
"addons/core/Scripts/WorkbenchGame/ERR/00_Core/ERR_BuildAtlasModel.c": "f6cb5e6f5afc9bb60a8a46d96b52c7506882faf0a880e0b20a01a2603b336d2c",
"addons/core/Scripts/WorkbenchGame/ERR/00_Core/ERR_ValidateBaseWorldPlugin.c": "49a38c37b51e5318c7dcbcb01543dd9a6300d053f0d39808b3974f4edc45b871",
"addons/core/Scripts/WorkbenchGame/ERR/40_Chat/ERR_ValidateWorldPlugin.c": "d1f3fc372d0d16062a5983f2a6cffb6e72f202cb93fea5b33b4d77e0c852ecc7",
"addons/core/Sounds/ERR/Speech/radio_01.acp": "cf63378bf3950f5e6c1c1f46c057ad38a371b14b945b1201777820384805c3af",
"addons/core/Sounds/ERR/Speech/radio_01.acp.meta": "d5966526f35aa64dc980238f72f4f93f9d0e6a360f10e3f6538e97b7d086aa47",
"addons/core/Sounds/ERR/Speech/radio_01.wav": "cfe4a00000bc9b629a9e8e282ed64e7177673f829c5657b1ae2b2cb9e661d2ae",
"addons/core/Sounds/ERR/Speech/radio_01.wav.meta": "eaf33fa344fccf9aacab626117d03b96b135fa819d3e63ae300fac544291b571",
"addons/core/Sounds/ERR/Speech/radio_02.acp": "9111d118594094a8e09acdf80d8b107cc7d5d890b6ab086274e0e1004039e345",
"addons/core/Sounds/ERR/Speech/radio_02.acp.meta": "76b55d9abf7f599c5db3269a5829546a6d5f92e6350b2fe987245f9cd6b599fb",
"addons/core/Sounds/ERR/Speech/radio_02.wav": "6f0c94ae0e501afe6cc1aba804ba6a0403ba4de931debc28bf22970f591d0798",
"addons/core/Sounds/ERR/Speech/radio_02.wav.meta": "06ec85166aa4c54a6fafa1fa2eb2cc32f4a36dc8eecde8f9ba9912229e5e00e0",
"addons/core/Sounds/ERR/Speech/radio_03.acp": "019f939d65396f4a334a024bbf53c41479a9f8ce806610945af2be13e7352c70",
"addons/core/Sounds/ERR/Speech/radio_03.acp.meta": "8aa2f4f26f04bc3085ae046f543c047cdadf9af9e06a38920f1e1fd8a3aa02fe",
"addons/core/Sounds/ERR/Speech/radio_03.wav": "415a206bd1de167342cf1b82d59c708441b8d802395f941d15097c064133802a",
"addons/core/Sounds/ERR/Speech/radio_03.wav.meta": "de1d81fb653146404de5b6a6018c1cd73e902571b82d544de5b6cfccf21f5410",
"addons/core/Sounds/ERR/Speech/radio_04.acp": "77bcff7cc7ce49036a440e829fb4eab1dbe5252b0fc9ea24c42e6f6b68e2698e",
"addons/core/Sounds/ERR/Speech/radio_04.acp.meta": "dd61ee2545776cf23403240424470661c737048d01432d90b24f2c9e75f45d82",
"addons/core/Sounds/ERR/Speech/radio_04.wav": "a225810c7fba048517248fd9f7e9f7ab8aad5bac35e59f22e11e69166551f7f3",
"addons/core/Sounds/ERR/Speech/radio_04.wav.meta": "0ae046e2ac7f9653661ba99646d40dd78d52f113ea6554e1dbfd6e578572a4f4",
"addons/core/Sounds/ERR/Speech/radio_05.acp": "7dbc2b3b3d251eb8d3e749b0a7f32186b0421a95fa5585be493cf04b45510e3d",
"addons/core/Sounds/ERR/Speech/radio_05.acp.meta": "cbf3b48ed3865e30ba5d838d96ec4f1ee950cdcd51368f7a9259460e4b78cc1b",
"addons/core/Sounds/ERR/Speech/radio_05.wav": "90f5abe221165ac5cd7d88c9b3e01cf6fd4d00b594c84d09c6baf101fdb776ad",
"addons/core/Sounds/ERR/Speech/radio_05.wav.meta": "d8e3de0e1ae8670a01bcc272a1adf4199ffcea514ce024ee3286820dedab4d83",
"addons/core/Sounds/ERR/Speech/radio_06.acp": "e14da41c1cd186f35a4f385fab71ad85ad6fe718e67299a65466339ae23a2922",
"addons/core/Sounds/ERR/Speech/radio_06.acp.meta": "efc810a60e93453942adba476b423121f2a7dc1133b25d8764c1bec546a3949b",
"addons/core/Sounds/ERR/Speech/radio_06.wav": "b3f86b8dde535bc1a63301376c8d42775446d1b6117168557841565391fe0a14",
"addons/core/Sounds/ERR/Speech/radio_06.wav.meta": "07f53131f4ad153cc09051ba1de07f7b43d38f69781aad24371c4eeb331b280b",
"addons/core/Sounds/ERR/Speech/radio_07.acp": "bf3a48af07ad6e5da2ca6ed6c581fc6232e1bd62ebb905b934188366f2bc3d77",
"addons/core/Sounds/ERR/Speech/radio_07.acp.meta": "60aab59223c0ea734f7c1e88f803de30164ccef1a909730abed3eb76b3378ca2",
"addons/core/Sounds/ERR/Speech/radio_07.wav": "f3fd18ddaebe9eb3d0db9ac73c89a7b7a7f18b76e4b66d404d544be660a6825e",
"addons/core/Sounds/ERR/Speech/radio_07.wav.meta": "ef6c72aa32c1c46f7133782536744bdaf4eee03bcdb75aecb87accef6d1c4f2d",
"addons/core/Sounds/ERR/Speech/radio_08.acp": "a82c5dbcd7094085324d93d539c6f829c53dcf3781f40b8d65a10b7cb4125bae",
"addons/core/Sounds/ERR/Speech/radio_08.acp.meta": "69fb3400109e19d4f4d0fb371d056edbecc0a96a0a923174d1aba95dfeac1014",
"addons/core/Sounds/ERR/Speech/radio_08.wav": "ce3c2aff20dbea83aa6545a383c454969c5caeb53d5a88155ec182f789047d4a",
"addons/core/Sounds/ERR/Speech/radio_08.wav.meta": "72c5e117ab7b605b8370fe90923edee73593df6071c39b86556731387814a014",
"addons/core/Sounds/ERR/Speech/radio_09.acp": "73725377def1832742c7620fec46dc0100400d92b9cb79add8b4d44e94c46c0a",
"addons/core/Sounds/ERR/Speech/radio_09.acp.meta": "95456fe20def274a1972867024e9d0eb572f3878eae19c63522fcefe401dcb07",
"addons/core/Sounds/ERR/Speech/radio_09.wav": "3eb0be6393c431b526dbddc723cb608a7681a2dcd8af6910d9f2234aa98c923c",
"addons/core/Sounds/ERR/Speech/radio_09.wav.meta": "724dd301d1b25e41318503a815e87b54e7283735c51fd122af55c070f26adb37",
"addons/core/Sounds/ERR/Speech/radio_10.acp": "f976a0fecf73b3379ffb9728e96c68ca79800712919320e7ff7f3484cd2c9724",
"addons/core/Sounds/ERR/Speech/radio_10.acp.meta": "5411a9ffa23e42c8a2e8d4eba75d6e87631bcf542128327dfefd603a64d5b6ec",
"addons/core/Sounds/ERR/Speech/radio_10.wav": "2b2dac499a45a7779e79465d628a67b87078c0951db7db3e051feeb4342f2816",
"addons/core/Sounds/ERR/Speech/radio_10.wav.meta": "c3ac10a092dcb26ec637be6c9264a85eae1b6da55b9d8b44a14766a70ddf2933",
"addons/core/Sounds/ERR/Speech/soldier_1001.acp": "1af0d303063f37811a9b1a25424d887fe5eed4b5c57da71cf36ba6985f8cf002",
"addons/core/Sounds/ERR/Speech/soldier_1001.acp.meta": "2fbdda4d9fa83c6945985bd2f2215aa9f745b3a18adb0e7edafac1b01c161ba5",
"addons/core/Sounds/ERR/Speech/soldier_1001.wav": "a8935a5aded028f2fb03734f4423e731ea4f5b17394526df47c0407a3deddfe7",
"addons/core/Sounds/ERR/Speech/soldier_1001.wav.meta": "aff7a92a727d8bd4df033be2961fb85cafdc5c45fd272c5ea718bc07fb8e5cce",
"addons/core/Sounds/ERR/Speech/soldier_1002.acp": "1444636949683a430efe20a7f296e85e669cb8e26799c326f73a00c4f8d32fa5",
"addons/core/Sounds/ERR/Speech/soldier_1002.acp.meta": "d8eb34135a3b76f0a4f889f9662d954b3b0b3638c10c0732e25ca29d7b2ef412",
"addons/core/Sounds/ERR/Speech/soldier_1002.wav": "8535643e93757dd916f4158b5b03671cefc599489dbccf6bb0f7abf294fbae88",
"addons/core/Sounds/ERR/Speech/soldier_1002.wav.meta": "e8c8813e5a1989a0d7e4d2a5c90622c4b0f909aafb929f4737c82e5710220d1f",
"addons/core/Sounds/ERR/Speech/soldier_1003.acp": "5ab123f150debd6fda0b822fee7ffca5a0bdc168f4d8d2e28b3982972db05613",
"addons/core/Sounds/ERR/Speech/soldier_1003.acp.meta": "f89fa8e7ac42e7f675d29f0b241d181df572413c6c41bf31cfb98fa205baa87e",
"addons/core/Sounds/ERR/Speech/soldier_1003.wav": "5910896661ad67333d2374a16ca44ce831a5820feb337655df99c02df2915d5a",
"addons/core/Sounds/ERR/Speech/soldier_1003.wav.meta": "5281a71be599a70aeb9972ea85364e5ef32f824db94c71953d8a1912fb2a27c2",
"addons/core/Sounds/ERR/Speech/soldier_1004.acp": "10ac847b206834168e63d8d0f7ad25d7542a58a49d331af50aecf13e7e070ac9",
"addons/core/Sounds/ERR/Speech/soldier_1004.acp.meta": "8c073328d3f5f06ca583d97e9ce2453d8167ec7bc5643ab90783748a4cd9b6bf",
"addons/core/Sounds/ERR/Speech/soldier_1004.wav": "76375e462ba518c76f752d4b194c9370dffcebd8ce0037865133b37af3ff9a9e",
"addons/core/Sounds/ERR/Speech/soldier_1004.wav.meta": "563aae8d93efeaa7ca098c12bf0004da279321607793bb32a93b2530d6832d06",
"addons/core/Sounds/ERR/Speech/soldier_1005.acp": "ea3d874f84dd85f09871444c348b1c7f4948fc043c59cba4d3aea8b8eaa8b86e",
"addons/core/Sounds/ERR/Speech/soldier_1005.acp.meta": "40cbfddfa9937e319d412f3ecb66b75e2c1c88f2823a64e43a81a2939fb9021a",
"addons/core/Sounds/ERR/Speech/soldier_1005.wav": "3e20728fb61863278738f5366343cddd6fac1b8b114a14867f91ebb5cac547d8",
"addons/core/Sounds/ERR/Speech/soldier_1005.wav.meta": "e330fc819872b0a97a280a42d936ff75e30d21ea3ac96891988b48ded36af7b0",
"addons/core/Sounds/ERR/Speech/soldier_1100.acp": "86dc8e90d826947672342f44a6ff8d2fd4a8f014db0b215c0865b3728b14ea88",
"addons/core/Sounds/ERR/Speech/soldier_1100.acp.meta": "1a41730365335ebfabf6c75ab1c67ecb1d0d6c85db56d1d85f688a780a3ecf15",
"addons/core/Sounds/ERR/Speech/soldier_1100.wav": "eaf1deb5381f6bac165e364a652920fcf78438c351c564ebe50a216f3f3ba5a0",
"addons/core/Sounds/ERR/Speech/soldier_1100.wav.meta": "dcd087d3e0bec53abdd4e42218a3bbb234b7ae3cd2da05dcee71a298632a8da9",
"addons/core/Sounds/ERR/Speech/soldier_1101.acp": "2680131b5364efe39f3dee44ce1605dbc9e064cea9baf8247a8c5b55dcfa8d99",
"addons/core/Sounds/ERR/Speech/soldier_1101.acp.meta": "4feaa2b8e069ee2e9576d4009329f585b1b5ade9e47816882b78075f4897646f",
"addons/core/Sounds/ERR/Speech/soldier_1101.wav": "4bca012ec25d8456cd38d26606312f54b480b674365b76a9c9f54e408314570b",
"addons/core/Sounds/ERR/Speech/soldier_1101.wav.meta": "6ac6bd7a06be3fa35c513137b4584e405c0cd7e32d0c6912f2d7f9b5a3087d36",
"addons/core/Sounds/ERR/Speech/soldier_1102.acp": "08002dc26a4c07d6bf488d5f7c8c6587787c1755ce374b4053dad582eb2d77cb",
"addons/core/Sounds/ERR/Speech/soldier_1102.acp.meta": "2133e516f162d6aaa7f0d3a191421964ca6df7b00d0a50fa42ffaba70864bef4",
"addons/core/Sounds/ERR/Speech/soldier_1102.wav": "1432bb3c9d99910314a84d9773d2afafe4f5fbb143afb291b0deed55d25ee6d0",
"addons/core/Sounds/ERR/Speech/soldier_1102.wav.meta": "a6ca33938733e22789434db35ca2cdfb0fc4c51716feadf4a28a60ee9d1044b2",
"addons/core/Sounds/ERR/Speech/soldier_1103.acp": "c93e1e75c272d31107fde86205b859cf505e2acf7d8776fbd81357bc8b3625b9",
"addons/core/Sounds/ERR/Speech/soldier_1103.acp.meta": "f3d41ab27e932b10d46c3a2aa63f826825403a70640381a089db608c1c00a257",
"addons/core/Sounds/ERR/Speech/soldier_1103.wav": "c294454907a229d521c2285eec26dbb82f9782f2a7eca764e11713ff63f0e004",
"addons/core/Sounds/ERR/Speech/soldier_1103.wav.meta": "968d93e9dee2104aee94407604d021d8849a83dc3d115484088e81289654c246",
"addons/core/Sounds/ERR/Speech/soldier_1104.acp": "cb94ed3c95670f11f78f6470f1f50492fff6d2f0ac94602d054d474d52400cec",
"addons/core/Sounds/ERR/Speech/soldier_1104.acp.meta": "92d43bf610784953d8d94322b73ae235f7a8aeb83ece72733d795c8034275052",
"addons/core/Sounds/ERR/Speech/soldier_1104.wav": "952b3d71366c26fc12bdbb9014665bfc0402f30944c22b1b2369d26a93db7104",
"addons/core/Sounds/ERR/Speech/soldier_1104.wav.meta": "939562214b39250feaa8f6f6c6bd10c3d4e0b4c529f338490a2dc234919c0d31",
"addons/core/Sounds/ERR/Speech/soldier_1105.acp": "62c5d3d230a8a15cf2a4de193620ccdf83ca9973b550ace4e8edf7cc49f52851",
"addons/core/Sounds/ERR/Speech/soldier_1105.acp.meta": "6774063562b9c83975bc394dd3c72aa2a0d8001d0990ab8ff870ae2876889f93",
"addons/core/Sounds/ERR/Speech/soldier_1105.wav": "20e9e82d9897b598497da4722432f83ae03a5e6bf9a1f7a77caab712e3fc3130",
"addons/core/Sounds/ERR/Speech/soldier_1105.wav.meta": "6f21652352edbd59d1244ce9c2dcd1ad4ab65f022222381d9709c28148121c42",
"addons/core/Sounds/ERR/Speech/soldier_1200.acp": "c27db60629a41145697e041224cc2dde21c72d6a883fa305c71ec9c5b86bd84e",
"addons/core/Sounds/ERR/Speech/soldier_1200.acp.meta": "ea228ec869a7a0266f5604266f68c4166abc6cfeaa29180cb3b4351464b71079",
"addons/core/Sounds/ERR/Speech/soldier_1200.wav": "5a1561e821ef33a574c1f9ef95ccf76e69b832bf0a20bcbbf914760345921859",
"addons/core/Sounds/ERR/Speech/soldier_1200.wav.meta": "ccf3b62fd2eea460d576fa68863a901eb0025f47b1b76729a4289162d0dfa0c8",
"addons/core/Sounds/ERR/Speech/soldier_1201.acp": "45f220c5b6bac64db61eebcf54bb52da572f9f8f1ea0872c5af9fd3238c25a4e",
"addons/core/Sounds/ERR/Speech/soldier_1201.acp.meta": "3be417d66b05e11e0b520af136dfc45c86c17d5e35b56a611efbcf38e0d35003",
"addons/core/Sounds/ERR/Speech/soldier_1201.wav": "f058f0482cfe4034fdf37d9b596f7ba8172fae1c57aeb387ce153f8041895e45",
"addons/core/Sounds/ERR/Speech/soldier_1201.wav.meta": "abaebe719eff7e009eb4d0222060280877451126c02154706df6d13e4c5d3e11",
"addons/core/Sounds/ERR/Speech/soldier_1202.acp": "c08625886d8c6dc405cf96c640c9dafd4510ba5cef2c22b037c8c7b3eb5bea39",
"addons/core/Sounds/ERR/Speech/soldier_1202.acp.meta": "cf345e968edad1b825dd33b87267b63f770c169250f8c51195bffc3161d396bd",
"addons/core/Sounds/ERR/Speech/soldier_1202.wav": "c875f4e798ff5e24c3eb3b48bdfa1b8af03de9326a19c671eca86660297ad737",
"addons/core/Sounds/ERR/Speech/soldier_1202.wav.meta": "dd2d6411abe914bce71c6688a1647c2699303ca248191ec01c6325b366e5d7fb",
"addons/core/Sounds/ERR/Speech/soldier_1203.acp": "f0237a51ffe0e7d463154d321117a9b19c6914f6ee680ebf07a0ff9ab51fc340",
"addons/core/Sounds/ERR/Speech/soldier_1203.acp.meta": "0e93332191ac74be950ce8139b96ed6fdfe3ddbe68de8949826dc801d12c97f2",
"addons/core/Sounds/ERR/Speech/soldier_1203.wav": "6e7857dc96dfb556f011ba89f2f4ea659cfd7b605b88790c69e754d5cc51398a",
"addons/core/Sounds/ERR/Speech/soldier_1203.wav.meta": "0f564169dc05a95f7b01f64f72bdabf6de9ed3f37a2f44b4751f89b38eb18cd8",
"addons/core/Sounds/ERR/Speech/soldier_1204.acp": "94dbf98b5e05f1ebf6960495032c46203caaa4440dfb1ffd3beda2679fe6bec5",
"addons/core/Sounds/ERR/Speech/soldier_1204.acp.meta": "7cc8c61f4bb210c0576fac350d170f8f54a6e55531db6102c1a0fa7cb7a8a809",
"addons/core/Sounds/ERR/Speech/soldier_1204.wav": "bd170ca015b017114e42078dcc5c49d5626aef17d22e4a12b8282e9ee4908ae6",
"addons/core/Sounds/ERR/Speech/soldier_1204.wav.meta": "1c6ddb11c22a14d9d498074e2fb2864783f91afc552c4cd671452fa8df483de0",
"addons/core/Sounds/ERR/Speech/soldier_1205.acp": "47180a3445a265335d682eac6fa51fedca51d76f329adc39b1802092b311118b",
"addons/core/Sounds/ERR/Speech/soldier_1205.acp.meta": "c34346f4b10149b426ebb4e94db8c29883c9d0e36f2b42d07d41570eb8932554",
"addons/core/Sounds/ERR/Speech/soldier_1205.wav": "769c457805376e9c0172ddb525ead5f1d8774e15bd1f3f3b218a19f9d77b6883",
"addons/core/Sounds/ERR/Speech/soldier_1205.wav.meta": "31a2a7314b44afb3f0031376b2ad6df22649e8089bf1a3bbeb64cdc41156cff7",
"addons/core/Sounds/ERR/Speech/soldier_clear.acp": "f33f03f3d24182a95db7d02058f2dd6ae52098e3b5142a33ede833ee881d54ed",
"addons/core/Sounds/ERR/Speech/soldier_clear.acp.meta": "7d3643c9de2d81ab0f1b4898e781341c1962bd8505c20882233ef7c40159b23b",
"addons/core/Sounds/ERR/Speech/soldier_clear.wav": "d6527b8136aa720b721463210420f47de0dbc45acc4e4c390b6a44968c5f0acd",
"addons/core/Sounds/ERR/Speech/soldier_clear.wav.meta": "d9f9a921a85fe275c6cce649421a19946ff6aec49559796725c3858d9fe9b261",
"addons/core/Sounds/ERR/Speech/soldier_covering.acp": "7d4109edbd6c20f9e2af0b394fa12e8b3b40fc18bf2b5ac118beebb1fa4a79b1",
"addons/core/Sounds/ERR/Speech/soldier_covering.acp.meta": "320908bf7decea55b8d8b4a89b30e84e7d96a033d4a9cd1bd84912dce013f0d8",
"addons/core/Sounds/ERR/Speech/soldier_covering.wav": "f51e0086eaf0eece8b4061711088a413a2dbeae263deab7ea30fb1852dafda69",
"addons/core/Sounds/ERR/Speech/soldier_covering.wav.meta": "7bdf2d2c5f9cf741bae523e1ab0b9acc99b38ccd1228ebfbcba92f2b9a5cba9d",
"addons/core/Sounds/ERR/Speech/soldier_engaging.acp": "9f052e87edaf182030edb656821621cdeabbf13d65bc181308357530c9d93a74",
"addons/core/Sounds/ERR/Speech/soldier_engaging.acp.meta": "9e487fa3746c46b2993f1dfd1f0513f375571728704533674bee62586e25b72b",
"addons/core/Sounds/ERR/Speech/soldier_engaging.wav": "ac0f2d7d698732e3d7c270186e7aa2ab7e6bd4c908f36b07fb6f66a3cbe75ccf",
"addons/core/Sounds/ERR/Speech/soldier_engaging.wav.meta": "d571b9ebce196cc209078a83e4bde8f6a5f4b6d28c2945e2b47953ccb6889e97",
"addons/core/Sounds/ERR/Speech/soldier_moving.acp": "05503ca7af13a7ad03ed2a3aa562cc58504fdfff3148477f8d81b5a01abdf37c",
"addons/core/Sounds/ERR/Speech/soldier_moving.acp.meta": "a2474c87e4e1587226919dfdbd03739d938803d34f4a4f441889b0d8015513bd",
"addons/core/Sounds/ERR/Speech/soldier_moving.wav": "a61dda64e6fc2a11eac3e6008ee14b89f360bd67e258dce1191a71d9e2e26fad",
"addons/core/Sounds/ERR/Speech/soldier_moving.wav.meta": "bd87cd72ccb819584f9da09fb0d6973ffd6eb0bb5572c562978500e2af467217",
"addons/core/Sounds/ERR/Speech/soldier_no_ammo.acp": "c821c61afb2ddc12d3ecdb552a66d2a9ff89a5258a567ff2a99fed4f45a33520",
"addons/core/Sounds/ERR/Speech/soldier_no_ammo.acp.meta": "65a27b81a5b437163befd4dc566785a9dda4def1798495ca53c8f768a5d7a73f",
"addons/core/Sounds/ERR/Speech/soldier_no_ammo.wav": "ffe6ef5fdf30411749e0cb73186e3005b1ce6a52fcb7c836caeb1bca422ed3ed",
"addons/core/Sounds/ERR/Speech/soldier_no_ammo.wav.meta": "25b5680fd2a313c18e15ce6e0d3f709d78352b93206c22c7881be19b81faddd5",
"addons/core/Sounds/ERR/Speech/soldier_reloading.acp": "51c5cb464bab6637cf9e3b1880a010e05774d76a92298daf40b1d84970845be7",
"addons/core/Sounds/ERR/Speech/soldier_reloading.acp.meta": "ca351e809b1ba7c69b066d2c1d0a5d2afdcaa833c1163e6d13a0396437e98cf6",
"addons/core/Sounds/ERR/Speech/soldier_reloading.wav": "15b2749f79bc73fd0784bcd6e6076e1bc50da835e0c434cd43bd185d0735c732",
"addons/core/Sounds/ERR/Speech/soldier_reloading.wav.meta": "161c9ebee1d0496c7aa9501d00eba646094bf1ce89cda4efde6e3a0229a49e4f",
"addons/core/Sounds/ERR/Speech/soldier_target_down.acp": "77acc89c4ef0b912b969a2e5f6c41e071e04d10cfe89666fbc1296878dab62bf",
"addons/core/Sounds/ERR/Speech/soldier_target_down.acp.meta": "fe456d354ace93b0f2261de483e86ccc92991011b1738c5703d6d7bc0daa49a6",
"addons/core/Sounds/ERR/Speech/soldier_target_down.wav": "e2e60e8b83a24a548c90b84c5e1137adb7e792cf1d4ba6232ddfb1012fa78892",
"addons/core/Sounds/ERR/Speech/soldier_target_down.wav.meta": "064588b86589ac9437fbccafedeefae04bec3331dd8a229d1c6d27b5e524a9e9",
"addons/core/Sounds/ERR/Speech/soldier_target_lost.acp": "5ffd3ff57550296274e9e93fb64efdf2fb06a51161d6deb221c1f3eb408d1459",
"addons/core/Sounds/ERR/Speech/soldier_target_lost.acp.meta": "366a3c9e20f27c0f73bdff5827576df8924e99241061f933e72bd342e5bc7119",
"addons/core/Sounds/ERR/Speech/soldier_target_lost.wav": "bbcf454d48adea47478d410b1baf14df3a5d018237272e70ae33ee62823f822f",
"addons/core/Sounds/ERR/Speech/soldier_target_lost.wav.meta": "d1ac64242280521a7e40de51ae32a007878d7801401020e7a074a48e0f8ce62e",
"addons/core/Sounds/ERR/Speech/soldier_under_fire.acp": "5af1c949d4662c2f33320165d2efdbd69cb183af1101aa246fe538bf0d91a33e",
"addons/core/Sounds/ERR/Speech/soldier_under_fire.acp.meta": "aa7799e8a790539166a1d3a9c691416e7b2f6589d1674f5cf4b3e47523f15259",
"addons/core/Sounds/ERR/Speech/soldier_under_fire.wav": "e4bd5e69fda289593fc6e6b8c2fae9a271a10d0a9bae877f18ba02dbbf75d1fc",
"addons/core/Sounds/ERR/Speech/soldier_under_fire.wav.meta": "25a988c31e4fc3ae6540920df3d4548307a4a1e3b96b1303e9b7bdb4ac5eea27",
"addons/core/Sounds/ERR/Speech/welcome.acp": "f8a7b6cdd08b57b4b227a2d5b480a6c76857d7fc8ace3434478aec01c0de5a83",
"addons/core/Sounds/ERR/Speech/welcome.acp.meta": "d3ac98b02c0725d347b30d0ac7586cb22904d46b65a145e4a1131222484a6929",
"addons/core/Sounds/ERR/Speech/welcome.wav": "01de068469bd6746dba7634fb6b5b85b150621d3359c17fd01bcb916b34b1720",
"addons/core/Sounds/ERR/Speech/welcome.wav.meta": "bf33edad44bbb04df852501154f08a9a9900ce503248abc698127a51e9eec934",
"addons/core/UI/Textures/ERR/SiteMarkers.edds": "611ec6c68c2456c2af017c47135134d73122461017b315f64ed7ca9891f20c21",
"addons/core/UI/Textures/ERR/SiteMarkers.edds.meta": "90f40b38e52a79951b72da2960e30887d5ee8bbcefbada0c0ac950c1bfcf847f",
"addons/core/UI/Textures/ERR/SiteMarkers.imageset": "3f947d03b3492ada541032539cdb3f34a03d68ae83c0ef8796dc7fd091b5911d",
"addons/core/UI/Textures/ERR/SiteMarkers.imageset.meta": "1dc5285abd0062af288fb40b2f22b5b7c3925cf7270a096862335db250ac1453",
"addons/core/UI/Textures/ERR/SiteMarkers.png": "76b472982234bd27050a9430e6a53f4c14fa38f7388db3706ebef506eab4e660",
"addons/core/UI/layouts/ERR/AdminMenu.layout": "c297ca4f2ce3470c3610e6c1560b996510c2d868238893e350354c780a04bad7",
"addons/core/UI/layouts/ERR/AdminMenu.layout.meta": "9deeece996f43b1f1fed6b5ec89279645c7b6424250200a42580cc088142e9bf",
"addons/core/UI/layouts/ERR/AdminValue.layout": "cd811af6d2fb187f01c74e20ea07ad85669546b0ad70efae2ce52921ce26cbca",
"addons/core/UI/layouts/ERR/AdminValue.layout.meta": "56b3d2335db400c1308e07c4a35d278b23ef32013dfd6dc82951866327428d08",
"addons/core/UI/layouts/ERR/ContentRow.layout": "7bf19d12b1b5e2c165f8671e92ae9227b54b4d1e551de94fa67bd54d3a66fddb",
"addons/core/UI/layouts/ERR/ContentRow.layout.meta": "8c4bc13b41e7aee38e0ca640a97813ed1a6964a00e2cff9e1fe4ebd71fc2fdc6",
"addons/core/UI/layouts/ERR/ItemRow.layout": "3c7ae3acdf2fad0ba661a1152ea319392668d774adc09a2a8b61e9a0319db312",
"addons/core/UI/layouts/ERR/ItemRow.layout.meta": "33eaef9c403ea3a030e58ec17f78e46af457048243571ad5856fff04101fb60b",
"addons/core/UI/layouts/ERR/ItemWeightRow.layout": "f71a5a0bd8d28191eca69154d05191179cab5187d573f0f72a8bbf11f06f4f8d",
"addons/core/UI/layouts/ERR/ItemWeightRow.layout.meta": "eb4b28587abdf6100092fd6eee1695663fa6e1548d5e53017173c4a5f7320240",
"addons/core/UI/layouts/ERR/PauseModsButton.layout": "d21d436291e2c1b262e33dc228b0d60a1d188dc9e85cfda6d2373f8281431b79",
"addons/core/UI/layouts/ERR/PauseModsButton.layout.meta": "9ed6adabd8f53eb9a562d7186789876bba5c4202155ca894c1af866ca47354f3",
"addons/core/UI/layouts/ERR/PreparationFailure.layout": "b7c4a2e6aa2be0992b478bb4f969f80355753573fffbc15be44670f3b136ea2e",
"addons/core/UI/layouts/ERR/PreparationFailure.layout.meta": "17ca2c9a12f691680883cec368ff06f511c996e5da5c25498f5f0955887867b0",
"addons/core/UI/layouts/ERR/PreparationStatus.layout": "ec3369f4030e593d34043e70a311b0963606cf024cb452648671556f25f5b52a",
"addons/core/UI/layouts/ERR/PreparationStatus.layout.meta": "75b12176a443bb911fc4ad446982d762201fda42ed38736b79bc5439fca31ccc",
"addons/core/UI/layouts/ERR/RoundResults.layout": "8550ebc009024f619827a43fd766aff8b7fbf8bc87ef7593db0fd7f4d778c615",
"addons/core/UI/layouts/ERR/RoundResults.layout.meta": "7509e050b3910ee5730dd25c60aacf405110e943f4ab46e3fc2186b3b15a3cf9",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout": "82d9ae77f076f945583791dfa0b01f1c925e6ff8aaebcf382fd56089fe61a115",
"addons/core/UI/layouts/ERRMap/ObjectiveMapElement.layout.meta": "8691fe2eaf46568bca4a9f8128b247a8da810bb87a5546aa7ca3334e740270d6",
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout": "aef5d565301046ae902033ec4eb4799ff1bdd9a37bc507898781d8790f04fc2a",
"addons/core/UI/layouts/ERRMap/SharedMapRenderTarget.layout.meta": "5c846445cc089e2e08899ba703059d4adb805ff30ab5a16409a3cd59718cbd54",
"addons/core/Worlds/ERR_Everon.ent": "22324bc7eb0d80dec8a1f3bd61a9df9201b72f749f4e751766b0c9d0b7d46b87",
"addons/core/Worlds/ERR_Everon.ent.meta": "19d1903ca72baa326b4724a6791d0da1104a1e53f3f31dc1ca41a856efd68e83",
"addons/core/Worlds/ERR_Everon_Layers/default.layer": "6bcb7fbb27b6282719dae8a37486e518d4cbaea385f2ea9af1918b36bb28b175"
}
@@ -0,0 +1,151 @@
#ifdef WORKBENCH
class ERR_CrashProbeSites : ERR_CrashSites
{
protected int m_Captured;
protected bool m_DestroyedGrant;
bool WaitingCorrectly() { return !m_Stopped && m_Attempts==0 && Count()==0; }
protected override void Fill()
{
if(!m_DestroyedGrant && m_Item && m_ItemIndex==0)
{
m_DestroyedGrant=true;ERR_Actors.DeleteSpawned(m_Item);
Print("ERR CRASH: removed first issued rifle before insertion to test spent-grant handling");
}
super.Fill();
}
void ProofCamera()
{
vector point=At(0).Position;
vector camera[4];vector eye=point+"10 12 -16";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,point+"0 2 0"),"0 1 0",camera);camera[3]=eye;
GetGame().GetCameraManager().SetCamera(m_Camera);
m_Camera.SetWorldTransform(camera);m_Camera.SetFOVDegree(65);m_Camera.SetDirty(true);m_Camera.ApplyTransform(0);
}
void ReportCamera() { Print("ERR CONTENT STAGE: 2");System.MakeScreenshot("$logs:crash-armor"); }
protected SCR_ManualCamera m_Camera;
void ERR_CrashProbeSites(ERR_GameMode mode) { m_Mode = mode; }
protected override bool Ready() { return true; }
protected override bool Survey(out vector point, out float heading)
{
if(Count()==0 && m_Attempts==1)
{
point="11180.619 0 11534.291";heading=0;float floor;
if(Separated(point) && m_Terrain.Clear(point,heading,11,0.6,floor,5)) {point=ERR_Actors.Ground(point);return true;}
}
return super.Survey(point,heading);
}
protected override bool Create(vector point, float heading)
{
m_HeliChance = 0;
return super.Create(point, heading);
}
void Begin()
{
m_Mode.Settings().Set("crashSiteCount",1);
m_Mode.Settings().Set("crashRifleCount",3); m_Mode.Settings().Set("crashMagazineCount",4);
m_Mode.Settings().Set("crashAntiAirChancePercent",100); m_Mode.Settings().Set("crashRocketChancePercent",100);
Start();
GetGame().GetCallqueue().CallLater(Check,1000,true);
}
void Fail(string text)
{
Print("ERR SMOKE FAIL: crash sites " + text,LogLevel.ERROR);
GetGame().GetCallqueue().Remove(Check); Stop();
}
void Check()
{
PrintFormat("ERR CRASH PROGRESS: count=%1 captured=%2 stopped=%3 consumed=%4 attempts=%5 item=%6",Count(),m_Captured,m_Stopped,m_Consumed,m_Attempts,m_ItemIndex);
Print("ERR CRASH TERRAIN: " + m_Terrain.Rejection());
if(m_Skipped>0){Fail("unexpected skipped slot");return;}
if(Count()<=m_Captured || !At(m_Captured).Ready)return;
ERR_CrashSite site=At(m_Captured);
if(!site.Wreck || Vehicle.Cast(site.Wreck) || site.Wreck.FindComponent(VehicleControllerComponent)){Fail("repairable vehicle");return;}
ParticleEffectEntity smoke=ParticleEffectEntity.Cast(site.Smoke);
if(!smoke || !smoke.HasActiveParticles()){Fail("inactive smoke");return;}
if(site.Stock.Count()!=18){Fail("maximum crate stock count="+site.Stock.Count().ToString());return;}
int rifles, mags, rockets, aa;
foreach(IEntity item:site.Stock)
{
string path=item.GetPrefabData().GetPrefabName();
if(path.Contains("Rifle_"))rifles++;
if(path.Contains("Magazine_"))mags++;
if(path.Contains("Ammo_Rocket"))rockets++;
if(path.Contains("FIM92_Stinger.et"))
{
aa++;if(!ERR_EnemyLoadoutCatalog.Loaded(item)){Fail("unloaded AA");return;}
}
}
if(rifles!=2 || mags!=12 || rockets!=2 || aa!=1){Fail("weapon/ammo composition");return;}
PrintFormat("ERR SMOKE PASS: crash %1 spent-grant crate: rifles=%2 magazines=%3 rockets=%4 AA=%5 static wreck and active smoke",m_Captured,rifles,mags,rockets,aa);
if(!m_Camera)
{
EntitySpawnParams params=new EntitySpawnParams();
m_Camera=SCR_ManualCamera.Cast(GetGame().SpawnEntity(SCR_ManualCamera,GetGame().GetWorld(),params));
GetGame().GetCameraManager().SetCamera(m_Camera);
}
vector camera[4];vector eye=site.Position+"18 10 22";
Math3D.DirectionAndUpMatrix(vector.Direction(eye,site.Position+"0 2 0"),"0 1 0",camera);camera[3]=eye;m_Camera.SetWorldTransform(camera);m_Camera.SetVerticalFOV(65);
GetGame().GetCallqueue().CallLater(ProofCamera,100,true);
GetGame().GetCallqueue().CallLater(ReportCamera,2000,false);
m_Captured++;
if(m_Captured==1)GetGame().GetCallqueue().CallLater(Done,5000,false);
}
void Done()
{
GetGame().GetCallqueue().Remove(Check);
GetGame().GetCallqueue().Remove(ProofCamera);
if(Count()!=1 || !m_Stopped){Fail("finite completion");return;}
ERR_AdminMenu.Open();
GetGame().GetCallqueue().CallLater(MenuDone,5000,false);
}
void MenuDone()
{
Print("ERR SMOKE COMPLETE: crash sites final inventory lifecycle");
}
}
modded class SCR_RespawnSystemComponent
{
override void UpdateLoadingPlaceholder(float dt)
{
super.UpdateLoadingPlaceholder(dt);
if(m_wLoadingPlaceholder)m_wLoadingPlaceholder.SetVisible(false);
}
}
modded class ERR_AdminMenu
{
override void OnMenuOpen()
{
super.OnMenuOpen(); ShowPage(ERR_AdminPage.CRASH_SITES);
if(!ERR_ProbeNavigation(ERR_AdminPage.CRASH_SITES))Print("ERR SMOKE FAIL: crash menu bounds",LogLevel.ERROR);
Print("ERR CONTENT STAGE: 4");
}
}
modded class ERR_GameMode
{
protected ref ERR_CrashProbeSites m_CrashProbe;
protected bool m_CrashActive;
protected override void StartScenario() {}
override bool Active() { return m_CrashActive; }
protected override void EOnInit(IEntity owner)
{
super.EOnInit(owner);
if(SCR_Global.IsEditMode() || !Replication.IsServer())return;
GetGame().GetCallqueue().CallLater(CrashBegin,7000,false);
}
void ActivateCrash()
{
if(!m_CrashProbe.WaitingCorrectly()) {Print("ERR SMOKE FAIL: preparation waiting",LogLevel.ERROR);return;}
ERR_Settings loaded=new ERR_Settings();
if(loaded.Get("crashSiteCount")!=1 || loaded.Get("crashRifleCount")!=3 || loaded.Get("crashMagazineCount")!=4) {Print("ERR SMOKE FAIL: persisted crash settings",LogLevel.ERROR);return;}
Print("ERR SMOKE PASS: preparation waits, settings saved and reloaded");m_CrashActive=true;
}
void CrashBegin()
{
m_CrashProbe=new ERR_CrashProbeSites(this);m_CrashProbe.Begin();OnStop().Insert(m_CrashProbe.Stop);
GetGame().GetCallqueue().CallLater(ActivateCrash,3000,false);
}
}
#endif
+5
View File
@@ -190,6 +190,11 @@
"guid": "BBFE0BDC501C440F",
"addon": "595F2BF2F44836FB",
"verification": "Exact path/type/GUID verified in installed owning resourceDatabase.rdb, 2026-10-13; rescue faction asset audit inspected the authored helicopter seats and pilot loadouts."
},
"Prefabs/Weapons/Ammo/WCS/Ammo_Missile_FIM92.et": {
"addon": "629B2BA37EFFD577",
"guid": "517333DE6AADE624",
"verification": "Exact path/type/GUID verified in installed owning resourceDatabase.rdb, 2026-11-06; crash-site loaded Stinger verified in native Workbench."
}
}
}
+7
View File
@@ -45,6 +45,7 @@
"Configs/System/chimeraInputCommon.conf": "795184CF9AD764DB",
"Configs/System/chimeraMenus.conf": "C747AFB6B750CE9A",
"Configs/Systems/MissionSystems.conf": "C50579A2EC48E8EF",
"Particles/Enviroment/Smoke_Smokestack_Big.ptc": "6EE3295AC363E562",
"Prefabs/AI/Groups/Group_Base.et": "000CD338713F2B5A",
"Prefabs/AI/SCR_AIWorld.et": "E0A05C76552E7F58",
"Prefabs/AI/Waypoints/AIWaypoint_Cycle.et": "35BD6541CBB8AC08",
@@ -115,6 +116,7 @@
"Prefabs/Props/Military/Fortification/CzechHedgehog_01_painted.et": "A46D45922F8CAD6C",
"Prefabs/Props/Military/Sandbags/Sandbag_01_long_burlap.et": "21D83950DF36F250",
"Prefabs/Props/Military/Sandbags/Sandbag_01_short_burlap.et": "CFFEB23FBEA00322",
"Prefabs/Props/Wrecks/BTR70_Wreck/BTR70_wreck_static.et": "B90E5414AB7C325B",
"Prefabs/Props/Wrecks/UH1H_wreck/UH1H_wreck_static.et": "74DCE1AEC6832E18",
"Prefabs/Structures/BuildingParts/Doors/DoorSet_Base.et": "87CADB5ADC989993",
"Prefabs/Structures/BuildingParts/Doors/Door_MetalGate_01_Short_LEFT_EXT_ST_B.et": "34B08027DBDE322A",
@@ -142,20 +144,25 @@
"Prefabs/Vehicles/Wheeled/UAZ469/VehParts/Seats/UAZ469_seats_rear.et": "780AAF0A51AEE61A",
"Prefabs/Vehicles/Wheeled/Ural4320/Ural4320_ammo.et": "3336BE330C4F355B",
"Prefabs/Vehicles/Wheeled/Ural4320/Ural4320_transport.et": "16C1F16C9B053801",
"Prefabs/Weapons/Ammo/Ammo_Rocket_PG7VL.et": "609E216CBF8D0B68",
"Prefabs/Weapons/Ammo/Ammo_Shell_82mm_HE_O832DU.et": "98EC9C526AFBA282",
"Prefabs/Weapons/Attachments/Optics/Optic_4x20/Optic_4x20.et": "BD496EE1B40DC510",
"Prefabs/Weapons/Attachments/Optics/Optic_ARTII/Optic_ARTII.et": "D2018EDB1BBF4C88",
"Prefabs/Weapons/Attachments/Optics/Optic_PGO7/Optic_PGO7V3.et": "E5E9DBBF3BFB88C6",
"Prefabs/Weapons/Attachments/Optics/Optic_PSO1/Optic_PSO1.et": "C850A33226B8F9C1",
"Prefabs/Weapons/Core/VehiclePeriscope_DummyWeapon_Base.et": "7E1DD1CE4D6A23F4",
"Prefabs/Weapons/Explosives/Mine_PMN4/Mine_PMN4.et": "B05A816C0BF50802",
"Prefabs/Weapons/Grenades/M18/Smoke_M18_Green.et": "D41D22DD1B8E921E",
"Prefabs/Weapons/Handguns/PM/Handgun_PM.et": "C0F7DD85A86B2900",
"Prefabs/Weapons/Launchers/RPG7/Launcher_RPG7_PGO7.et": "E8A55396050E1762",
"Prefabs/Weapons/Magazines/Magazine_545x39_AK_30rnd_Ball.et": "BBB50A815A2F916B",
"Prefabs/Weapons/Magazines/Magazine_762x51_M14_20rnd_SpecialBall.et": "627255315038152A",
"Prefabs/Weapons/Magazines/Magazine_762x54_SVD_10rnd_Sniper.et": "9CCB46C6EE632C1A",
"Prefabs/Weapons/Magazines/Magazine_9x18_PM_8rnd_Ball.et": "8B853CDD11BA916E",
"Prefabs/Weapons/Mortars/2B14/Mortar_2B14.et": "D1FFE458E8AC4BDB",
"Prefabs/Weapons/Rifles/AK74/Rifle_AK74.et": "FA5C25BF66A53DCF",
"Prefabs/Weapons/Rifles/M14/Rifle_M21_ARTII.et": "81EB948E6414BD6F",
"Prefabs/Weapons/Rifles/SVD/Rifle_SVD_PSO.et": "6415B7923DE28C1B",
"Prefabs/World/Game/PerceptionManager.et": "028DAEAD63E056BE",
"Sounds/FinalMix.afm": "B764D803219C775E",
"Sounds/Items/_SharedData/PickUp/Items_PickUp_Map.acp": "13F8D0DE67678118",
+1 -1
View File
@@ -55,7 +55,7 @@ assert 'Apply_planeReconEnabled' not in names # Saved-state toggle pair, not a
assert len(names) == len(set(names)), 'Menu widget names must be unique'
for key in keys:
assert all(name in names for name in (key, 'Apply_' + key, 'Saved_' + key, 'Help_' + key))
if key not in ('radioIntelSiteCount','droneReconCount','droneCooldownSeconds','sarkaAngerPerCar','emptyRestartHours','aiDoctrine','aiShadow','motorbikeCount','planeAltitudeMetres','planeReplacementSeconds','planeSectorSeconds','fieldCampCount','fieldHospitalCount','startMode','garageVehicleCount','garageChancePercent','garageRadiusMetres','garageSpawnIntervalSeconds','civilianTrafficCount','roadblockCount','largeRoadblockCount','mainRoadWidthMetres','hunterSpawnDistanceMetres','objectGuardCount','objectGuardEvery','objectGuardHQMode','startWeaponCount','startMagazineCount'): assert ('Default_' if key == 'viewDistanceMetres' else 'Random_') + key in names
if key not in ('crashLootMode','crashSiteCount','crashHelicopterChancePercent','crashRifleCount','crashMagazineCount','crashAntiAirChancePercent','crashRocketChancePercent','radioIntelSiteCount','droneReconCount','droneCooldownSeconds','sarkaAngerPerCar','emptyRestartHours','aiDoctrine','aiShadow','motorbikeCount','planeAltitudeMetres','planeReplacementSeconds','planeSectorSeconds','fieldCampCount','fieldHospitalCount','startMode','garageVehicleCount','garageChancePercent','garageRadiusMetres','garageSpawnIntervalSeconds','civilianTrafficCount','roadblockCount','largeRoadblockCount','mainRoadWidthMetres','hunterSpawnDistanceMetres','objectGuardCount','objectGuardEvery','objectGuardHQMode','startWeaponCount','startMagazineCount'): assert ('Default_' if key == 'viewDistanceMetres' else 'Random_') + key in names
else: assert 'Random_startMode' not in names
for name in ('Close', 'SettingsPage', 'HQPage', 'JournalPage', 'JournalText', 'JournalContent', 'JournalScroll', 'PauseJournal', 'LatestJournal', 'Status'):
assert name in names
+16
View File
@@ -11,6 +11,22 @@ rules=(rules.replace('string ', 'std::string ').replace('out int ', 'int& ')
.replace(' < 0) return false;', ' == std::string::npos) return false;').replace('text.ToInt()', 'std::stoi(text)'))
run('#include <cassert>\n#include <string>\n'+rules+r'''
int main(){
assert(CoreSetting("mission","crashloot")=="crashLootMode");
assert(Valid("crashLootMode",0)&&Valid("crashLootMode",1)&&!Valid("crashLootMode",-1)&&!Valid("crashLootMode",2));
assert(CoreSetting("mission","crashsites")=="crashSiteCount");
assert(Valid("crashSiteCount",0)&&Valid("crashSiteCount",12));
assert(!Valid("crashSiteCount",-1)&&!Valid("crashSiteCount",13));
assert(CoreSetting("mission","crashrifles")=="crashRifleCount");
assert(CoreSetting("mission","crashammo")=="crashMagazineCount");
assert(Valid("crashRifleCount",1)&&Valid("crashRifleCount",6));
assert(!Valid("crashRifleCount",0)&&!Valid("crashRifleCount",7));
assert(Valid("crashMagazineCount",1)&&Valid("crashMagazineCount",8));
assert(!Valid("crashMagazineCount",0)&&!Valid("crashMagazineCount",9));
for(std::string option:{"crashhelis","crashaa","crashrockets"}){
auto key=CoreSetting("mission",option); assert(!key.empty());
assert(Valid(key,0)&&Valid(key,100)&&!Valid(key,-1)&&!Valid(key,101));
}
assert(CoreSetting("mission","telemetry")=="telemetryEnabled");
assert(Valid("telemetryEnabled",0)&&Valid("telemetryEnabled",1));
assert(!Valid("telemetryEnabled",-1)&&!Valid("telemetryEnabled",2));
+39
View File
@@ -0,0 +1,39 @@
"""Execute the production finite loot planner with deterministic rolls/resource gates."""
from policy_harness import ROOT, body, run
plan=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_CrashLoot.c','static void Plan(')
plan=plan.replace('array<ResourceName> items','array<ResourceName>& items').replace('Math.RandomInt','Roll').replace('ERR_EnemyLoadoutCatalog.FIM','FIM')
run(r'''
#include <cassert>
#include <string>
#include <vector>
using ResourceName=std::string;
template<class T> struct array:std::vector<T>{void Clear(){this->clear();}void Insert(T v){this->push_back(v);}};
bool west=true,east=true,launchers=true;
int roll=0;
int Roll(int,int){return roll;}
ResourceName FIM="AA";
bool RifleAllowed(bool w){return w?west:east;}
bool Allowed(ResourceName){return launchers;}
ResourceName Rifle(bool w){return w?"W":"E";}
ResourceName Magazine(bool w){return w?"WM":"EM";}
ResourceName RPG(){return "RPG";}
ResourceName Rocket(){return "ROCKET";}
'''+plan+r'''
int main(){
array<ResourceName> items;
// Zero chances never grant launchers, even on the lowest roll.
Plan(3,4,0,0,items);assert(items.size()==15);
for(int i=0;i<3;i++){assert(items[i*5]=="W");for(int j=1;j<=4;j++)assert(items[i*5+j]=="WM");}
// Disabled rifle family falls back only to an allowed paired loadout.
west=false;Plan(6,8,100,100,items);assert(items.size()==58);
for(int i=0;i<6;i++){assert(items[i*9]=="E");for(int j=1;j<=8;j++)assert(items[i*9+j]=="EM");}
assert(items[54]=="RPG"&&items[55]=="ROCKET"&&items[56]=="ROCKET"&&items[57]=="AA");
// Unavailable/blocked optional resources cannot be forced by 100% chances.
launchers=false;Plan(1,1,100,100,items);assert(items.size()==2);
east=false;Plan(6,8,100,100,items);assert(items.empty());
// A roll equal to the configured percentage is excluded.
launchers=true;roll=25;Plan(1,1,25,25,items);assert(items.empty());
roll=24;Plan(1,1,25,25,items);assert(items.size()==4);
}
''')
print('PASS: finite paired rifle/ammo plan, maximum capacity, zero/100% endpoints, disabled families and unavailable launchers')
+41
View File
@@ -0,0 +1,41 @@
"""Execute real quality rolls and verify poor/rich ranges without a guaranteed premium weapon."""
from policy_harness import ROOT,body,run
path=ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_CrashLoot.c'
code='\n'.join(body(path,s) for s in ['static void Plan(', 'static void QualityPlan(', 'static void RandomPlan('])
code=code.replace('array<ResourceName> items','array<ResourceName>& items').replace('Math.RandomInt','Roll').replace('ERR_EnemyLoadoutCatalog.FIM','FIM').replace('ERR_Supplies.Magazine()','PistolMagazine()').replace('ERR_Supplies.Pistol()','Pistol()')
run(r"""
#include <cassert>
#include <string>
#include <vector>
using ResourceName=std::string;
template<class T> struct array:std::vector<T>{void Clear(){this->clear();}void Insert(T v){this->push_back(v);}};
bool enabled=true;int extreme=0,qualityRoll=-1;
int Roll(int low,int high){if(low==0&&high==100&&qualityRoll>=0){int q=qualityRoll;qualityRoll=-1;return q;}return extreme?high-1:low;}
ResourceName FIM="AA";
bool RifleAllowed(bool){return enabled;}
bool Allowed(ResourceName){return enabled;}
ResourceName Rifle(bool w){return w?"W":"E";}
ResourceName Magazine(bool w){return w?"WM":"EM";}
ResourceName RPG(){return "RPG";}
ResourceName Rocket(){return "ROCKET";}
ResourceName Pistol(){return "PM";}
ResourceName PistolMagazine(){return "PMM";}
"""+code+r"""
int main(){
array<ResourceName> items;
for(int q=0;q<100;q++){
for(extreme=0;extreme<=1;extreme++){
QualityPlan(q,items);
if(q<30){assert(items.size()>=1&&items.size()<=4);for(auto item:items)assert(item=="PM"||item=="PMM");}
else if(q<65)assert(items.size()>=2&&items.size()<=4);
else if(q<90)assert(items.size()>=6&&items.size()<=22);
else assert(items.size()>=20&&items.size()<=58);
}
}
extreme=0;qualityRoll=0;RandomPlan(items);assert(items.size()==1&&items[0]=="PMM");
qualityRoll=99;RandomPlan(items);assert(items.size()>=20&&items.size()<=58);
// Disabled content remains excluded even on the richest roll.
enabled=false;QualityPlan(99,items);assert(items.empty());QualityPlan(0,items);assert(items.empty());
}
""")
print('PASS: every quality boundary, ammunition-only poor rolls, rich rolls, one random quality draw and content exclusion')
+45
View File
@@ -0,0 +1,45 @@
"""Exercise the production worker's preparation, finite-slot and stop rules."""
from policy_harness import ROOT, body, run
step = body(ROOT / 'addons/core/Scripts/Game/ERR/00_Core/ERR_CrashSites.c', 'protected void Step(')
step = step.replace('protected void Step', 'void Step').replace('Replication.IsServer()', 'Replication::IsServer()').replace('ERR_GameMode.Get()', 'ERR_GameMode::Get()').replace('ERR_MissionRules.Terminal', 'ERR_MissionRules::Terminal').replace('m_Mode.', 'm_Mode->').replace('System.GetTickCount()', '0').replace('LogLevel.WARNING', '0')
run(r'''
#include <cassert>
using vector = int;
void Print(const char*,int){}
namespace Replication { bool server=true; bool IsServer(){return server;} }
namespace ERR_MissionRules { bool Terminal(int phase){return phase==2;} }
struct ERR_GameMode { int phase=0; bool Active(){return phase==1;} int Phase(){return phase;} static ERR_GameMode* Get(); } mode;
ERR_GameMode* ERR_GameMode::Get(){return &mode;}
struct Worker {
ERR_GameMode* m_Mode=&mode;
bool m_Stopped=false, m_Pending=false, ready=true, surveyed=true, created=true;
int m_Consumed=0,m_Target=2,m_Attempts=0,m_Skipped=0,spawns=0,fills=0;
void Stop(){m_Stopped=true;}
bool Ready(){return ready;}
bool Survey(vector&,float&){return surveyed;}
bool Create(vector,float){spawns++;m_Pending=created;return created;}
void Fill(){fills++;m_Pending=false;}
''' + step + r'''
};
int main(){
Worker waiting;
for(int i=0;i<1000;i++)waiting.Step();
assert(!waiting.m_Stopped && waiting.m_Attempts==0 && waiting.spawns==0);
mode.phase=1;waiting.ready=false;
for(int i=0;i<1000;i++)waiting.Step();
assert(!waiting.m_Stopped && waiting.m_Attempts==0);
waiting.ready=true;
for(int i=0;i<1000;i++)waiting.Step();
assert(waiting.spawns==2 && waiting.fills==2 && waiting.m_Consumed==2 && waiting.m_Stopped);
Worker disabled;disabled.m_Target=0;disabled.Step();assert(disabled.spawns==0&&disabled.m_Stopped);
Worker impossible;impossible.surveyed=false;
for(int i=0;i<4001;i++)impossible.Step();
assert(impossible.spawns==0&&impossible.m_Skipped==2&&impossible.m_Stopped);
Worker failed;failed.created=false;
for(int i=0;i<10;i++)failed.Step();
assert(failed.spawns==2&&failed.m_Skipped==2&&failed.m_Stopped);
Worker client;Replication::server=false;client.Step();assert(client.spawns==0&&client.m_Stopped);
Replication::server=true;mode.phase=2;Worker ended;ended.Step();assert(ended.spawns==0&&ended.m_Stopped);
}
''')
print('PASS: crash worker waits through preparation, bounds failed searches, consumes slots once, never refills, and stops on clients/end')
+44
View File
@@ -0,0 +1,44 @@
"""Execute the real fill loop against inventory races and delayed insertions."""
from policy_harness import ROOT, body, run
fill=body(ROOT/'addons/core/Scripts/Game/ERR/00_Core/ERR_CrashSites.c','protected void Fill(')
fill=fill.replace('protected void Fill','void Fill').replace('InventoryItemComponent itemComponent','InventoryItemComponent* itemComponent').replace('InventoryItemComponent.Cast','InventoryItemComponent::Cast').replace('FindComponent(InventoryItemComponent)','FindComponent()').replace('ERR_Actors.DeleteSpawned','ERR_Actors::DeleteSpawned').replace('ERR_CrashLoot.Allowed','ERR_CrashLoot::Allowed').replace('LogLevel.WARNING','0').replace('null','nullptr')
for name in ('m_Pending','m_Inventory','m_Item','itemComponent'):fill=fill.replace(name+'.',name+'->')
fill=fill.replace('Crate.GetOrigin()', 'Crate->GetOrigin()')
run(r'''
#include <cassert>
#include <string>
#include <vector>
#include <algorithm>
using ResourceName=std::string;
struct InventoryItemComponent {bool attached=false;bool GetParentSlot(){return attached;}static InventoryItemComponent* Cast(InventoryItemComponent* p){return p;}};
struct Entity {InventoryItemComponent component;bool removed=false;InventoryItemComponent* FindComponent(){return &component;}std::string GetOrigin(){return "";}};
using IEntity=Entity*;
template<class T> struct array:std::vector<T>{void Insert(T v){this->push_back(v);}bool Contains(T v){return std::find(this->begin(),this->end(),v)!=this->end();}int Count(){return this->size();}};
struct Inventory {bool contains=false,accept=true;IEntity item=nullptr;void GetItems(array<IEntity>& a){if(contains)a.Insert(item);}bool TryInsertItem(IEntity){return accept;}};
namespace ERR_Actors {void DeleteSpawned(IEntity e){e->removed=true;}}
namespace ERR_CrashLoot {bool Allowed(ResourceName){return true;}}
void Print(std::string,int){}
struct Site {IEntity Crate;array<IEntity> Stock;};
struct Worker {
Entity crate,item;Site site;Inventory inventory;
Site* m_Pending=&site;Inventory* m_Inventory=&inventory;IEntity m_Item=nullptr;
bool m_ItemIssued=false,m_Accepted=false,finished=false;
int m_ItemIndex=0,m_ItemTicks=0,spawns=0;
array<ResourceName> m_Loot;
Worker(){site.Crate=&crate;m_Loot.Insert("rifle");m_Loot.Insert("ammo");}
void Finish(){finished=true;}
IEntity Spawn(ResourceName,std::string,std::string){spawns++;return &item;}
''' + fill + r'''
};
int main(){
Worker destroyed;destroyed.m_ItemIssued=true;destroyed.Fill();assert(destroyed.spawns==0&&destroyed.m_ItemIndex==1);
Worker taken;taken.m_Item=&taken.item;taken.m_ItemIssued=true;taken.item.component.attached=true;taken.Fill();
assert(taken.m_ItemIndex==1&&taken.site.Stock.size()==1&&!taken.item.removed&&taken.spawns==0);
Worker delayed;delayed.Fill();assert(delayed.spawns==1);delayed.Fill();assert(delayed.m_Accepted);
for(int i=0;i<12;i++)delayed.Fill();
assert(delayed.spawns==1&&delayed.item.removed&&delayed.m_ItemIndex==1);
Worker success;success.Fill();success.inventory.item=success.m_Item;success.inventory.contains=true;success.Fill();
assert(success.spawns==1&&success.m_ItemIndex==1&&success.site.Stock.size()==1);
}
''')
print('PASS: destroyed grants are not respawned, taken items are retained, and delayed/rejected inserts cannot duplicate loot')
+1 -1
View File
@@ -5,7 +5,7 @@ from policy_harness import ROOT,body,run
spec=importlib.util.spec_from_file_location('import_settings',BASE/'tools/import_settings.py')
m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m)
result,deferred=m.merge({'configVersion':1,'reportIntervalSeconds':20.0,'supportSquadLimit':2,'responseRadiusMetres':1500,'convoyCount':3},{'aiIntelChancePercent':0,'intelRevealChancePercent':100})
assert result==dict(telemetryEnabled=1,droneReconCount=0,droneCooldownSeconds=300,aiDoctrine=0,aiShadow=0,planeAltitudeMetres=250,planeReplacementSeconds=60,planeSectorSeconds=120,planeReconEnabled=1,roadblockCount=4,largeRoadblockCount=4,mainRoadWidthMetres=6,civilianTrafficCount=3,garageVehicleCount=16,garageChancePercent=70,garageRadiusMetres=1000,garageSpawnIntervalSeconds=5,startMode=0,keepWeaponOnUnconscious=1,selfEpinephrine=0,restartOnEmpty=1,emptyRestartHours=5,reportIntervalSeconds=20,supportSquadLimit=2,responseRadiusMetres=1500,aiIntelChancePercent=0,intelRevealChancePercent=100,radioIntelSiteCount=5,showAllSites=0,radioDefenceSeconds=180,startTimeMinutes=840,timeMultiplier=1,startDateCode=0,weatherProfile=0,viewDistanceMetres=0,automaticEquipmentChancePercent=25,antiAirChancePercent=7,antiPersonnelMineChancePercent=60,automaticConvoyEnabled=1,convoyCount=3,heliTimerMinutes=15)
assert result==dict(crashLootMode=1,crashSiteCount=3,crashHelicopterChancePercent=50,crashRifleCount=3,crashMagazineCount=4,crashAntiAirChancePercent=25,crashRocketChancePercent=50,telemetryEnabled=1,droneReconCount=0,droneCooldownSeconds=300,aiDoctrine=0,aiShadow=0,planeAltitudeMetres=250,planeReplacementSeconds=60,planeSectorSeconds=120,planeReconEnabled=1,roadblockCount=4,largeRoadblockCount=4,mainRoadWidthMetres=6,civilianTrafficCount=3,garageVehicleCount=16,garageChancePercent=70,garageRadiusMetres=1000,garageSpawnIntervalSeconds=5,startMode=0,keepWeaponOnUnconscious=1,selfEpinephrine=0,restartOnEmpty=1,emptyRestartHours=5,reportIntervalSeconds=20,supportSquadLimit=2,responseRadiusMetres=1500,aiIntelChancePercent=0,intelRevealChancePercent=100,radioIntelSiteCount=5,showAllSites=0,radioDefenceSeconds=180,startTimeMinutes=840,timeMultiplier=1,startDateCode=0,weatherProfile=0,viewDistanceMetres=0,automaticEquipmentChancePercent=25,antiAirChancePercent=7,antiPersonnelMineChancePercent=60,automaticConvoyEnabled=1,convoyCount=3,heliTimerMinutes=15)
assert deferred==[]
for count in (0,1,3,20):
values,notes=m.merge(ai={'convoyCount':count})
+4
View File
@@ -34,6 +34,10 @@ def check():
subprocess.run([sys.executable,str(ROOT/'tests/test_rescue_recovery.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_casualty_fleet.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_plane_boarding.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_crash_sites_lifecycle.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_crash_loot_plan.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_crash_random_loot.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_crash_stock_lifecycle.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_civilian_traffic.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_garage_vehicle_rules.py')],check=True)
subprocess.run([sys.executable,str(ROOT/'tests/test_garage_vehicle_observers.py')],check=True)
+8
View File
@@ -3,6 +3,14 @@
import argparse,json,os,tempfile,sys
from pathlib import Path
SCHEMA={
'crashLootMode':(1,0,1),
'crashSiteCount':(3,0,12),
'crashHelicopterChancePercent':(50,0,100),
'crashRifleCount':(3,1,6),
'crashMagazineCount':(4,1,8),
'crashAntiAirChancePercent':(25,0,100),
'crashRocketChancePercent':(50,0,100),
'telemetryEnabled':(1,0,1),
'aiDoctrine':(0,0,1),
'aiShadow':(0,0,1),
+8
View File
@@ -18,6 +18,7 @@
"FACTIONS",
"GUARDS",
"SITES",
"CRASH_SITES",
"SARKA",
"PACKS"
]
@@ -268,6 +269,13 @@
"widget": "PacksPage",
"button": "OpenPacks",
"label": "Enemy packs"
},
{
"id": 29,
"key": "CRASH_SITES",
"widget": "CrashSitesPage",
"button": "OpenCrashSites",
"label": "Crash sites"
}
]
}
@@ -0,0 +1,40 @@
FrameWidgetClass { "Is Visible" {{VISIBLE_CrashSitesPage}} Name "CrashSitesPage" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 160 OffsetTop 160 SizeX 1000 OffsetRight -1220 SizeY 532 OffsetBottom -692 } {
TextWidgetClass { Name "CrashHeading" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 4 OffsetTop 4 SizeX 936 OffsetRight -964 SizeY 30 OffsetBottom -34 } Color {{COLOR_TEXT}} Text "Crash sites - next round" "Font Size" {{SIZE_HEADING}} "Min Font Size" {{SIZE_HEADING}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "CrashHelp" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 40 OffsetTop 40 SizeX 936 OffsetRight -964 SizeY 40 OffsetBottom -80 } Color {{COLOR_TEXT}} Text "Default loot is random for each crate: poor pistol supplies, a useful rifle, or a rich haul of scoped guns and launchers. No refills." "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 82 OffsetTop 82 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -108 } Color {{COLOR_TEXT}} Text "Loot mode: Random or Custom" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 82 OffsetTop 82 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -114 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 82 OffsetTop 82 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -114 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 118 OffsetTop 118 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -138 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashLootMode" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 112 OffsetTop 112 SizeX 456 OffsetRight -484 SizeY 40 OffsetBottom -152 } Color {{COLOR_TEXT}} Text "Random rolls each crate independently. Custom uses the four loot controls below." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -182 } Color {{COLOR_TEXT}} Text "Crash sites (0-12)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 184 OffsetTop 184 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -216 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 184 OffsetTop 184 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -216 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 220 OffsetTop 220 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -240 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashSiteCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 242 OffsetTop 242 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -268 } Color {{COLOR_TEXT}} Text "0 disables sites. Finite wrecks and loot; no refills." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 160 OffsetTop 160 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -182 } Color {{COLOR_TEXT}} Text "Helicopter chance (%)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 184 OffsetTop 184 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -216 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 184 OffsetTop 184 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -216 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 220 OffsetTop 220 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -240 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashHelicopterChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 242 OffsetTop 242 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -268 } Color {{COLOR_TEXT}} Text "0 = armored wrecks; 100 = helicopters." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 270 OffsetTop 270 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -292 } Color {{COLOR_TEXT}} Text "Custom: scoped rifles per crate (1-6)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 294 OffsetTop 294 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -326 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 294 OffsetTop 294 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -326 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 330 OffsetTop 330 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -350 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashRifleCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 352 OffsetTop 352 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -378 } Color {{COLOR_TEXT}} Text "Random M21 / SVD rifles with fitted scopes." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 270 OffsetTop 270 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -292 } Color {{COLOR_TEXT}} Text "Custom: magazines per rifle (1-8)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 294 OffsetTop 294 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -326 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 294 OffsetTop 294 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -326 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 330 OffsetTop 330 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -350 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashMagazineCount" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 352 OffsetTop 352 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -378 } Color {{COLOR_TEXT}} Text "Matching ammunition for each selected rifle." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 380 OffsetTop 380 SizeX 456 OffsetRight -484 SizeY 22 OffsetBottom -402 } Color {{COLOR_TEXT}} Text "Custom: anti-air launcher chance (%)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 404 OffsetTop 404 SizeX 180 OffsetRight -208 SizeY 32 OffsetBottom -436 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 220 OffsetLeft 220 PositionY 404 OffsetTop 404 SizeX 100 OffsetRight -320 SizeY 32 OffsetBottom -436 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 440 OffsetTop 440 SizeX 456 OffsetRight -484 SizeY 20 OffsetBottom -460 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashAntiAirChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 462 OffsetTop 462 SizeX 456 OffsetRight -484 SizeY 26 OffsetBottom -488 } Color {{COLOR_TEXT}} Text "One loaded Stinger, if installed and enabled." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Label_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 380 OffsetTop 380 SizeX 456 OffsetRight -964 SizeY 22 OffsetBottom -402 } Color {{COLOR_TEXT}} Text "Custom: rPG launcher chance (%)" "Font Size" {{SIZE_HELP}} "Min Font Size" {{SIZE_HELP}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
ButtonWidgetClass : "{DA43C77A0D1E59F8}UI/layouts/ERR/AdminValue.layout" { Name "crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 404 OffsetTop 404 SizeX 180 OffsetRight -688 SizeY 32 OffsetBottom -436 } components { SCR_EditBoxComponent "{547290FFBD5B33E9}" { m_sLabel "" } } }
ButtonWidgetClass : "{75C912A1C89BE6C2}UI/layouts/WidgetLibrary/Buttons/WLib_ButtonText.layout" { Name "Apply_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 700 OffsetLeft 700 PositionY 404 OffsetTop 404 SizeX 100 OffsetRight -800 SizeY 32 OffsetBottom -436 } components { SCR_ButtonTextComponent "{5548F0143AE99095}" { m_sText "Apply" } } }
TextWidgetClass { Name "Saved_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 440 OffsetTop 440 SizeX 456 OffsetRight -964 SizeY 20 OffsetBottom -460 } Color {{COLOR_TEXT}} Text "Waiting for server" "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "Help_crashRocketChancePercent" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 508 OffsetLeft 508 PositionY 462 OffsetTop 462 SizeX 456 OffsetRight -964 SizeY 26 OffsetBottom -488 } Color {{COLOR_TEXT}} Text "One scoped RPG-7 with two matching rockets." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
TextWidgetClass { Name "CrashFooter" Slot FrameWidgetSlot { Anchor 0 0 0 0 PositionX 28 OffsetLeft 28 PositionY 498 OffsetTop 498 SizeX 936 OffsetRight -964 SizeY 28 OffsetBottom -526 } Color {{COLOR_TEXT}} Text "Random ignores custom loot amounts and chances. Content blocks still apply. Default: 3 sites, 50% helicopters." "Font Size" {{SIZE_CAPTION_SMALL}} "Min Font Size" {{SIZE_CAPTION_SMALL}} Wrap 1 FontProperties FontProperties { Font "{{FONT}}" } }
} }
+1
View File
@@ -38,6 +38,7 @@ FrameWidgetClass {
{{include:pages/CheckpointsPage.layout.in}}
{{include:pages/GuardsPage.layout.in}}
{{include:pages/SitesPage.layout.in}}
{{include:pages/CrashSitesPage.layout.in}}
{{include:pages/PlanePage.layout.in}}
{{include:pages/DronesPage.layout.in}}
{{include:pages/RecommendationsPage.layout.in}}