#ifdef WORKBENCH modded class ERR_GameMode { protected ref ERR_GarageDLCProbe m_ERRGarageProbe; protected override void StartScenario() {} protected override void EOnInit(IEntity owner) { super.EOnInit(owner); if (SCR_Global.IsEditMode() || !Replication.IsServer()) return; GetGame().GetCallqueue().CallLater(ERR_BeginGarageProbe, 2000, false); } protected void ERR_BeginGarageProbe() { m_ERRGarageProbe = new ERR_GarageDLCProbe(this); m_ERRGarageProbe.Begin(); } } class ERR_GarageDLCProbe : ERR_GarageVehicles { protected Vehicle m_Car; protected IEntity m_Observer; protected int m_Index, m_Phase, m_Passed, m_Rally, m_Street; protected float m_Deadline; void ERR_GarageDLCProbe(ERR_GameMode mode) { m_Mode = mode; } protected override bool Running() { return true; } void Begin() { m_Cars.Find(); foreach (ResourceName name : m_Cars.Prefabs) { PrintFormat("ERR GARAGE CATALOG: %1", name); if (ERR_ParkedCarCatalog.Candidate(name, true)) m_Rally++; else m_Street++; } if (m_Rally != 24 || m_Street != 28) { Fail("catalog expected 24 Rally variants and 28 street cars"); return; } PrintFormat("ERR SMOKE PASS: garage catalog street=%1 rally=%2",m_Street,m_Rally); GetGame().GetCallqueue().CallLater(CheckCar, 2000, true); } void Fail(string reason) { Print("ERR SMOKE FAIL: garage-dlc " + reason, LogLevel.ERROR); GetGame().GetCallqueue().Remove(CheckCar); Stop(); } void CheckCar() { if (m_Car) { vector low, high; m_Car.GetBounds(low, high); array seats = {}; bool driver, armed; ERR_ConvoyRules.CollectSeats(m_Car,seats); foreach (BaseCompartmentSlot seat : seats) { if (seat.GetType() == ECompartmentType.PILOT && seat.IsCompartmentAccessible()) driver = true; if (seat.GetType() == ECompartmentType.TURRET) armed = true; } VehicleWheeledSimulation simulation = VehicleWheeledSimulation.Cast(m_Car.FindComponent(VehicleWheeledSimulation)); int wheelCount=-1; if (simulation) wheelCount=simulation.WheelCount(); PrintFormat("ERR GARAGE FIT: prefab=%1 low=%2 high=%3 driver=%4 armed=%5 wheels=%6",m_Car.GetPrefabData().GetPrefabName(),low,high,driver,armed,wheelCount); if (!driver || armed || !ERR_GarageVehicleRules.Envelope(low, high) || !simulation || simulation.WheelCount()!=4) { Fail("native car fit/seat/wheel validation"); return; } m_Passed++; ERR_Actors.DeleteSpawned(m_Car); m_Car=null; } if (m_Index < m_Cars.Prefabs.Count()) { m_Car=Vehicle.Cast(ERR_Actors.Spawn(m_Cars.Prefabs[m_Index++],ERR_Actors.Ground("4788 0 11528")+"0 0.15 0")); if (!m_Car) Fail("native car spawn"); return; } PrintFormat("ERR SMOKE PASS: all %1 cars have fitting bounds, unarmed accessible driver seats and four wheels",m_Passed); GetGame().GetCallqueue().Remove(CheckCar); m_Observer=ERR_Actors.Spawn(ERR_CivilianTraffic.DriverPrefab(),ERR_Actors.Ground("9730 0 1560")); if (!m_Observer) { Fail("observer spawn"); return; } m_Requested=2; m_GarageChance=100; m_SpawnRadius=1000; m_CleanupRadius=1400; m_SpawnInterval=1000; m_Deadline=Now()+180000; GetGame().GetCallqueue().CallLater(Step,250,true); } protected override bool Observers(array positions,array actors) { positions.Clear();actors.Clear(); if (!m_Observer) return false; positions.Insert(m_Observer.GetOrigin());actors.Insert(m_Observer);return true; } protected override bool Remember(IEntity entity) { if (!entity.GetPrefabData() || !ERR_GarageVehicleRules.Yard(entity.GetPrefabData().GetPrefabName())) return true; return super.Remember(entity); } protected override void Step() { super.Step(); if (Now()>m_Deadline) { Fail("yard placement deadline"); return; } if (m_Parked.Count()!=2) return; foreach (ERR_ParkedVehicle parked:m_Parked) { vector matrix[4]; parked.Entity.GetWorldTransform(matrix); if (!parked.Site.Yard || !YardGround(parked.Origin,matrix) || !Clear(parked.Origin,matrix,parked.Entity)) {Fail("yard ground/clearance");return;} PrintFormat("ERR GARAGE YARD: prefab=%1 position=%2 anchor=%3",parked.Entity.GetPrefabData().GetPrefabName(),parked.Origin,parked.Site.Garage.GetPrefabData().GetPrefabName()); } Print("ERR SMOKE PASS: two native residential yard spawns retain road/ground/visibility/collision vetoes"); Print("ERR SMOKE COMPLETE: garage-dlc catalog and native yard placement");Stop(); } } #endif