--- a/addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c +++ b/addons/core/Scripts/Game/ERR/40_Chat/ERR_NativeSmoke.c @@ -726,11 +726,13 @@ { DamageManagerComponent.Cast(m_ERRSmokePlayer.FindComponent(DamageManagerComponent)).EnableDamageHandling(false); string convoyOutcome; System.GetCLIParam("errSmokeOutcome", convoyOutcome); + // Isolate this legacy finite-convoy fixture before prison escape can start + // unrelated opening hunters. Stop preserves already-created crew bodies. + if (ERR_HQ.Get().Hunters()) ERR_HQ.Get().Hunters().Stop(); // Both variants await HQ/mortar ticks, enabled by normal prison escape. if (!ERR_Check(UnlockPrison(m_ERRSmokePlayer), "convoy fixture unlocks prison to start normal mission AI")) return; if (convoyOutcome == "supply-convoys") { - if (ERR_HQ.Get().Hunters()) ERR_HQ.Get().Hunters().Stop(); m_ERRSmokePlayer.SetOrigin(ERR_Actors.Ground("8800 0 2700")); PerceivableComponent convoyObserver = PerceivableComponent.Cast(m_ERRSmokePlayer.FindComponent(PerceivableComponent)); if (!ERR_Check(convoyObserver != null, "convoy fixture observer has native perception component")) return; --- a/tests/test_native_convoy_probe.py +++ b/tests/test_native_convoy_probe.py @@ -34,6 +34,9 @@ branch=smoke[smoke.index('if (m_ERRTestConvoy)', smoke.index('if (m_ERRSmokeStep == 0)')):] branch=branch[:branch.index('m_ERRSmokeStep = 106;')] assert branch.count('UnlockPrison(m_ERRSmokePlayer)')==1 +# Prevent unrelated opening hunters before the capped legacy convoy is admitted. +assert branch.count('ERR_HQ.Get().Hunters().Stop()') == 1 +assert branch.index('ERR_HQ.Get().Hunters().Stop()') < branch.index('UnlockPrison(m_ERRSmokePlayer)') assert branch.index('UnlockPrison(m_ERRSmokePlayer)') < branch.index('if (convoyOutcome == "supply-convoys")') runner=ROOT/'tools/headless_workbench.py' for extra in (['--project','core','--rounds','1','--timeout','600'],