fix: Wait udløses også når AD stopper vognen i triggeren før markøren (isTargetReached aldrig sand) — 'fremme' = markør nået, inden for AD's trigger-afstand, eller AD tipper (v1.11.12.0)

This commit is contained in:
2026-09-23 03:06:33 +02:00
parent 0c6ea21829
commit 827010ca99
3 changed files with 41 additions and 2 deletions
+28 -1
View File
@@ -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
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.11.11.0</version>
<version>1.11.12.0</version>
<title>
<en>AD Smart Pickup</en>
</title>
+12
View File
@@ -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()