Files
EscapistsReintroduced/docs/evidence/hunter-search-2026-10-04/native-fixture.c.txt
T
jakub 6a667d8deb Capture current mission, AI, map and administration development
Include the current addon, terrain integrations, tools, regression tests and recorded development evidence.
2026-10-13 22:52:53 +02:00

78 lines
3.2 KiB
Plaintext

// Private fixture forces the observed opening-plan failure; production owns all
// fallback placement, real vehicle/crew spawning, registration and routing.
modded class ERR_HunterOpeningPlan
{
override void Step(array<IEntity> players)
{
if (m_Done) return;
m_Scanned = 64; m_Done = true;
Print("ERR HUNT FIXTURE: opening exhausted with no three-way layout");
}
}
modded class ERR_HunterService
{
protected ref array<vector> m_ERRStarts = {};
bool ERR_CheckPhysicalHunters()
{
if (m_Hunters.Count() != 3) return false;
int ready; bool moved;
foreach (ERR_HunterVehicle unit : m_Hunters)
{
if (!unit.Registered || unit.Released || !unit.CrewValid(m_Mode) || VehicleRadioCapability(unit.Driver) != 2) return false;
ready++;
}
if (m_ERRStarts.IsEmpty())
{
foreach (ERR_HunterVehicle first : m_Hunters) m_ERRStarts.Insert(first.Entity.GetOrigin());
Print("ERR HUNT PASS: three independent fallback UAZs physically spawned, crewed, registered and radio-equipped on Nogova");
}
for (int i=0; i<m_Hunters.Count(); i++)
{
ERR_HunterVehicle hunter=m_Hunters[i];
float distance=vector.DistanceXZ(m_ERRStarts[i],hunter.Entity.GetOrigin());
if(distance>25 && hunter.Waypoint)
{
PrintFormat("ERR HUNT PASS: fallback patrol drives natively; hunter=%1 distance=%2 waypoint=%3",i,distance,hunter.Waypoint.GetOrigin());
return true;
}
}
return false;
}
}
modded class ArmaReforgerScripted
{
protected float m_ERRHuntStart=-1, m_ERRHuntNext;
protected bool m_ERRHuntDone, m_ERRHunterPassed, m_ERRFlankPassed, m_ERRContact;
protected ERR_SupplyConvoyTask m_ERRConvoy;
override void OnUpdate(BaseWorld world,float timeslice)
{
super.OnUpdate(world,timeslice);
ERR_GameMode mode=ERR_GameMode.Get();
if(m_ERRHuntDone || !world || !Replication.IsServer() || !mode || !mode.Active())return;
float now=world.GetWorldTime();
if(m_ERRHuntStart<0) {m_ERRHuntStart=now;mode.Transition(ERR_Phase.RADIO_SEARCH);}
if(now<m_ERRHuntNext)return;m_ERRHuntNext=now+1000;
ERR_HQ hq=ERR_HQ.Get();if(!hq || !hq.Hunters())return;
// Playerless fixture: normal mission deliberately skips tactical Tick without players.
hq.Tick(now);
if(!m_ERRHunterPassed && hq.Hunters().ERR_CheckPhysicalHunters()) m_ERRHunterPassed=true;
if(!m_ERRConvoy && hq.Convoys().Count()>0) m_ERRConvoy=ERR_SupplyConvoyTask.Cast(hq.Convoys().At(0));
if(m_ERRConvoy && m_ERRConvoy.Tactics && !m_ERRContact)
{
m_ERRContact=true;
vector contact=m_ERRConvoy.Vehicles[2].Entity.GetOrigin()+"0 0 200";
m_ERRConvoy.Tactics.Report(contact,now,now);
Print("ERR HUNT FIXTURE: one synthetic convoy contact; no claim of organic perception");
}
if(m_ERRContact && !m_ERRFlankPassed)
{
bool ready=true;
foreach(ERR_SupplyTeam team:m_ERRConvoy.Teams)
if(!team.SearchPlanned || !team.Aboard(m_ERRConvoy.Vehicles[2].Entity,false) || team.Released)ready=false;
if(ready){m_ERRFlankPassed=true;Print("ERR HUNT PASS: both real convoy infantry teams dismounted with native flank/search orders");}
}
if(m_ERRHunterPassed && m_ERRFlankPassed){m_ERRHuntDone=true;Print("ERR HUNT COMPLETE");}
if(now-m_ERRHuntStart>210000) {m_ERRHuntDone=true;Print("ERR HUNT FAIL: fixture deadline",LogLevel.ERROR);Print("ERR HUNT COMPLETE");}
}
}