--- a/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c +++ b/addons/core/Scripts/Game/ERR/10_AI/ERR_HQ.c @@ -1318,7 +1318,7 @@ if (vehicle.Released || vehicle.Arrived || vehicle.SupplyToken > 0 || !vehicle.Registered || !vehicle.Group) continue; foreach (ERR_HQUnit unit : m_Units) { - if (unit.Group != vehicle.Group || !unit.ReservedForSupport || unit.Downlink || !unit.Radio) continue; + if (unit.Group != vehicle.Group || !unit.ReservedForSupport || unit.LogisticsReservation > 0 || unit.Downlink || !unit.Radio) continue; if (!ConvoyPositionKnown(unit, now)) break; ERR_HQReport contact = ConvoyContact(unit, now); if (contact) @@ -1523,6 +1523,7 @@ m_Hunters.Tick(now); m_ObjectiveDefence.Tick(now); m_Towns.Tick(now); + TickMountedIntercept(now); m_Convoys.Tick(now); AutomaticConvoy(now); m_Bodies.TickBudget(now); @@ -1565,7 +1566,7 @@ if (!unit.Group && !unit.Uplink) { ReleaseLostForce(unit, now); m_Units.Remove(i); continue; } QueueReports(unit, now); } - if (now >= m_NextAssignment) { PlanConvoy(now); PlanResupply(now); Assign(now); m_NextAssignment = now + 5000; } + if (now >= m_NextAssignment) { PlanConvoy(now); PlanResupply(now); PlanMountedIntercept(now); Assign(now); m_NextAssignment = now + 5000; } MaintainEngineerMines(now); m_Resupply.Tick(now); m_Logistics.Tick(now); --- a/tests/test_hq_convoy_combat.py +++ b/tests/test_hq_convoy_combat.py @@ -49,7 +49,7 @@ int calls=0;bool valid=true;ERR_ConvoyCombatOrder* last=nullptr; bool ApplyCombatOrder(ERR_ConvoyTask* task,ERR_ConvoyCombatOrder* o,float){calls++;last=o;if(!task||!valid)return false; auto s=task->Vehicles.at(o->VehicleIndex)->Combat;s->Held=o->Hold;s->LastCommandId=o->CommandId;s->ReportId=o->ReportId;s->ObservedAt=o->ObservedAt;return true;}}; -struct ERR_HQUnit {SCR_AIGroup* Group=nullptr;bool ReservedForSupport=true;void* Radio=this;string ForceSourceId="vehicle-0"; +struct ERR_HQUnit {int LogisticsReservation=0;SCR_AIGroup* Group=nullptr;bool ReservedForSupport=true;void* Radio=this;string ForceSourceId="vehicle-0"; ERR_HQRoute* Downlink=nullptr;ERR_ConvoyCombatOrder* PendingConvoyOrder=nullptr;void* PendingOrder=nullptr;void* PendingTask=nullptr; bool PendingCheckin=false;float NextStatus=0; '''+cancel+r'''