From 827010ca99087deb6800962186ca47f02360b23e Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 23 Sep 2026 03:06:33 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20Wait=20udl=C3=B8ses=20ogs=C3=A5=20n?= =?UTF-8?q?=C3=A5r=20AD=20stopper=20vognen=20i=20triggeren=20f=C3=B8r=20ma?= =?UTF-8?q?rk=C3=B8ren=20(isTargetReached=20aldrig=20sand)=20=E2=80=94=20'?= =?UTF-8?q?fremme'=20=3D=20mark=C3=B8r=20n=C3=A5et,=20inden=20for=20AD's?= =?UTF-8?q?=20trigger-afstand,=20eller=20AD=20tipper=20(v1.11.12.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adUnloadWait.lua | 29 ++++++++++++++++++++++++++++- FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adSmartPickup.lua | 12 ++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index 1bf1c0b..2678ca6 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -147,13 +147,36 @@ local function release(vehicle) end end +-- "Fremme ved målet": AD stopper vognen så snart den står i aflæsningstriggeren — ofte +-- 5–10 m FØR markøren, så isTargetReached() bliver aldrig sand (set ved sukkerfabrikken). +-- Derfor tæller også AD's eget mål for tipning (afstand til aflæsningsstedet inden for +-- AD's trigger-afstand) og at AD er i gang med at tippe. +local function isAtUnloadTarget(adEnv, vehicle) + if vehicle.ad.drivePathModule:isTargetReached() then + return true + end + local trailerModule = vehicle.ad.trailerModule + if trailerModule ~= nil and trailerModule.isUnloading then + return true + end + local autoDrive = adEnv.AutoDrive + if autoDrive.getDistanceToUnloadPosition ~= nil and autoDrive.getMaxTriggerDistance ~= nil then + local ok, distance = pcall(autoDrive.getDistanceToUnloadPosition, vehicle) + local okMax, maxDistance = pcall(autoDrive.getMaxTriggerDistance, vehicle) + if ok and okMax and type(distance) == "number" and type(maxDistance) == "number" then + return distance <= maxDistance + end + end + return false +end + -- Står køretøjet ved målet med rest-læs, som målet ikke kan tage? Så find et Wait-punkt. local function startWaiting(adEnv, task) local vehicle = task.vehicle -- Kun "fremme ved målet". At AD stadig regner vognen som aflæssende (isActiveAtTrigger) -- tæller IKKE med: ved et fuldt fodertrug bliver isUnloading stående for evigt, selv om -- intet løber — og så blokerede traktoren stalden i stedet for at køre til Wait. - if not vehicle.ad.drivePathModule:isTargetReached() then + if not isAtUnloadTarget(adEnv, vehicle) then return end -- Efter et bytte er opgavens mål en silo, ikke AD's rigtige aflæsningsmål (anden markør); @@ -253,6 +276,10 @@ local function debugAtTarget(adEnv, task, dt) return end local free, capacity = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType) + -- kun den tilstand vi vil se: målet fuldt/afvist, og traktoren venter ikke ved et Wait-punkt + if waits[vehicle] ~= nil or (free ~= nil and free >= ADUnloadWait.MIN_FREE_TO_UNLOAD) then + return + end local trailerModule = vehicle.ad.trailerModule local states = {} for _, unit in ipairs(adEnv.AutoDrive.getAllDischargeableUnits(vehicle) or {}) do diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 207f52f..e7f81e2 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.11.11.0 + 1.11.12.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index d7f2c40..d4809cb 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -771,6 +771,18 @@ e5Food[HAY] = 21000 check("E5 halmlager tommere end truget -> halm", manager:getNextPickup(e5Driver, false), 21) g_currentMission.animalFoodSystem = nil +-- W13: AD stopper vognen i triggeren FØR markøren (isTargetReached=false) — Wait udløses alligevel +-- når vognen er inden for AD's trigger-afstand til aflæsningsstedet +buildWaitWorld() +local vn, tn = makeUnloadingVehicle("Fastrac Før markør", 581, 5000, 35000) +vn.targetReached = false +FS25_AutoDrive.AutoDrive.getDistanceToUnloadPosition = function() return 8.6 end +FS25_AutoDrive.AutoDrive.getMaxTriggerDistance = function() return 15 end +UnloadTask.update(tn, 16) +check("W13 Wait selv om markøren ikke er nået", tn.destinationID, 40) +FS25_AutoDrive.AutoDrive.getDistanceToUnloadPosition = nil +FS25_AutoDrive.AutoDrive.getMaxTriggerDistance = nil + -- ==== I: run-integration — ingredienser fra run i stedet for multi-valg; Wait-pulje pr. run ==== -- I1: traktor i et run med ÉN valgt vare i AD får alligevel behovsstyring (run'ets liste) local runDriver = buildCowWorld()