From 448af2bbea68f4158e132ee0e78f1807464efe11 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Wed, 23 Sep 2026 11:51:48 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20ventende=20traktorer=20genoptages=20efte?= =?UTF-8?q?r=20genindl=C3=A6sning=20(AD's=20m=C3=A5l=20=3D=20Wait-punkt,?= =?UTF-8?q?=20ventetilstand=20tabt)=20(v1.12.9.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adSmartPickup.lua | 3 ++ FS25_ADSmartPickup/adUnloadWait.lua | 46 ++++++++++++++++++++++++++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adSmartPickup.lua | 30 ++++++++++++++++++ 4 files changed, 80 insertions(+), 1 deletion(-) diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index 4799a88..0dd84ca 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -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) diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index 5079cb6..dfa3bec 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -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 diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index ae55452..16b5a9c 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.12.8.0 + 1.12.9.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index 34041ca..6812c3f 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -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}))