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>
+30
View File
@@ -1067,6 +1067,36 @@ manager:getNextPickup(chatty, false); manager:getNextPickup(chatty, false)
check("L6 gentaget valg logges én gang", #logLines, 1)
check("L6 loggen viser eget lager", logLines[1]:find("eget lager", 1, true) ~= nil, true)
-- W15: efter genindlæsning er ventetilstanden væk, men AD's mål peger stadig på Wait-punktet og
-- traktoren står der med rest-læs -> ventningen genoptages (hjem = run'ets mål) og den kører hjem
-- når der er plads
buildWaitWorld()
local orphan, orphanTask = makeUnloadingVehicle("Genindlæst", 515, 5090, 20000)
orphan.uniqueId = "vehicleOrphan"
orphan.spec_motorized = {}
orphan.ad.stateModule.secondMarkerId = 40 -- AD's gemte mål = Wait 1
orphanTask.destinationID = 40
orphan.ad.taskModule = {getActiveTask = function() return orphanTask end}
testVehicles = {orphan}
ADRunsController.store = ADRuns.newStore()
local orphanRun = ADRunsController.createRun("Cow Feed")
ADRunsController.updateRun(orphanRun.id, {targetWayPointId = 30})
ADRunsController.assignVehicle(orphanRun.id, orphan)
check("W15 ingen ventning før", ADUnloadWait.getWaitFor(orphan), nil)
ADUnloadWait.adoptOrphans(FS25_AutoDrive)
local adopted = ADUnloadWait.getWaitFor(orphan)
check("W15 ventning genoptaget", adopted ~= nil and adopted.markerName, "Wait 1")
check("W15 Wait-punktet reserveret", ADWaitPool.getOwner(40), orphan)
check("W15 hjem-mål husket", ADUnloadWait.getPendingTargetRestore(orphan), 30)
check("W15 logget", logLines[#logLines]:find("genoptager", 1, true) ~= nil, true)
ADUnloadWait.adoptOrphans(FS25_AutoDrive)
check("W15 ikke dobbelt", ADWaitPool.getOwner(40), orphan)
waitBarnLevels[STRAW] = 0 -- plads til hele resten
UnloadTask.update(orphanTask, 16)
check("W15 kører hjem", orphanTask.destinationID, 30)
check("W15 AD's mål gendannet", orphan.ad.stateModule.secondMarkerId, 30)
testVehicles = {}
-- X: udkørsel koblet på getNextPickup-wrap'en og Wait-logikken
resetWorld()
addMarker(1, "Suger Load", "Pickup points", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 1000}))