fix: ventende traktorer genoptages efter genindlæsning (AD's mål = Wait-punkt, ventetilstand tabt) (v1.12.9.0)

This commit is contained in:
2026-09-23 11:51:48 +02:00
parent 196c2cd847
commit 448af2bbea
4 changed files with 80 additions and 1 deletions
+3
View File
@@ -947,6 +947,9 @@ function ADSmartPickup:update(dt)
if ADUnloadWait ~= nil then
pcall(ADUnloadWait.releaseInactive)
if ADUnloadWait.adoptOrphansThrottled ~= nil then
ADUnloadWait.adoptOrphansThrottled(getAutoDriveEnv(), dt)
end
end
if ADOutbound ~= nil and ADOutbound.releaseInactive ~= nil then
pcall(ADOutbound.releaseInactive)
+46
View File
@@ -262,6 +262,52 @@ function ADUnloadWait.beforeUpdate(adEnv, task, dt)
end
end
-- Efter en genindlæsning er ventetilstanden (kun i hukommelsen) væk, men AutoDrives gemte mål
-- peger stadig på Wait-punktet, og traktoren står der med rest-læs — uden dette ville den blive
-- stående for evigt. Her genoptages ventningen for aktive traktorer i et forsynings-run hvis
-- aflæsningsopgave peger på en Wait-markør: hjem = run'ets mål, og reservationen sættes igen.
-- Kaldes fra ADSmartPickup:update (throttlet).
ADUnloadWait.ADOPT_INTERVAL_MS = 5000
local adoptTimerMs = ADUnloadWait.ADOPT_INTERVAL_MS
function ADUnloadWait.adoptOrphans(adEnv)
if ADRunsController == nil or ADRunsController.getFarmVehicles == nil then
return
end
for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do
local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil
local isActive = stateModule ~= nil and stateModule.isActive ~= nil and stateModule:isActive()
local run = isActive and waits[vehicle] == nil and ADRunsController.getRunForVehicle(vehicle) or nil
if run ~= nil and (run.kind or "supply") == "supply" and stateModule.getSecondMarker ~= nil then
local marker = stateModule:getSecondMarker()
local task = vehicle.ad.taskModule ~= nil and vehicle.ad.taskModule.getActiveTask ~= nil and vehicle.ad.taskModule:getActiveTask() or nil
if marker ~= nil and marker.id ~= nil and ADSupplyPlanner.isWaitMarker(marker) and task ~= nil and task.destinationID == marker.id and task.trailers ~= nil then
local fillType, rest = getRestLoad(adEnv, vehicle)
local homeId = ADRunsController.chooseTarget ~= nil and ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId
if fillType ~= nil and rest >= ADUnloadWait.MIN_REST_LITERS and homeId ~= nil then
ADWaitPool.claim(marker.id, vehicle)
pendingTargetRestore[vehicle] = homeId
waits[vehicle] = {task = task, homeDestinationID = homeId, waitMarker = marker, fillType = fillType, rest = rest}
local fillTypeName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
Logging.info(ADUnloadWait.LOG_PREFIX .. "'%s' genoptager ventning ved %s efter genindlæsning: %.0f l %s rest, hjem = markør %s", tostring(vehicle:getName()), tostring(marker.name), rest, tostring(fillTypeName), tostring(homeId))
end
end
end
end
end
function ADUnloadWait.adoptOrphansThrottled(adEnv, dt)
adoptTimerMs = adoptTimerMs + (dt or 0)
if adoptTimerMs < ADUnloadWait.ADOPT_INTERVAL_MS then
return
end
adoptTimerMs = 0
local ok, err = pcall(ADUnloadWait.adoptOrphans, adEnv)
if not ok then
Logging.warning(ADUnloadWait.LOG_PREFIX .. "kunne ikke genoptage ventende traktorer: %s", tostring(err))
end
end
-- Kaldes fra ADSmartPickup:update — standsede køretøjer slipper deres Wait-punkt.
function ADUnloadWait.releaseInactive()
for vehicle in pairs(waits) 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.12.8.0</version>
<version>1.12.9.0</version>
<title>
<en>AD Smart Pickup</en>
</title>