From 33b4f754b0eb21ae486fa0f8b8fd5042660d79a0 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Sun, 27 Sep 2026 10:15:34 +0200 Subject: [PATCH] =?UTF-8?q?fix(runs):=20fyldte=20traktorer=20registreres?= =?UTF-8?q?=20'p=C3=A5=20vej'=20ved=20run-start=20og=20efter=20AutoDrives?= =?UTF-8?q?=20genstart=20ved=20indl=C3=A6sning=20=E2=80=94=20ellers=20s?= =?UTF-8?q?=C3=A5=20m=C3=A5l-valget=200=20vogne=20p=C3=A5=20vej=20og=20sen?= =?UTF-8?q?dte=20alle=20til=20samme=20biogas-drop;=20startloggen=20viser?= =?UTF-8?q?=20det=20valgte=20m=C3=A5l=20(v1.35.3.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adRunsController.lua | 29 ++++++++++++++++++++++++- FS25_ADSmartPickup/adSmartPickup.lua | 17 +++++++++++++++ FS25_ADSmartPickup/adSupplyPlanner.lua | 11 ++++++++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adRunsController.lua | 24 ++++++++++++++++++++ tests/test_adSupplyPlanner.lua | 7 ++++++ 6 files changed, 88 insertions(+), 2 deletions(-) diff --git a/FS25_ADSmartPickup/adRunsController.lua b/FS25_ADSmartPickup/adRunsController.lua index 3dbf707..cffc0b1 100644 --- a/FS25_ADSmartPickup/adRunsController.lua +++ b/FS25_ADSmartPickup/adRunsController.lua @@ -394,6 +394,27 @@ function ADRunsController.chooseTarget(adEnv, run, vehicle) return bestId or targets[1] end +-- AutoDrive genstarter aktive traktorer efter indlæsning uden om run-starten: fyldte run-traktorer +-- registreres "på vej" til deres nuværende mål (ellers ser mål-valget 0 vogne på vej overalt). +ADRunsController.ADOPT_INTERVAL_MS = 5000 +local adoptTimerMs = 0 +function ADRunsController.adoptLoadedThrottled(adEnv, dt) + adoptTimerMs = adoptTimerMs + (dt or 0) + if adEnv == nil or adoptTimerMs < ADRunsController.ADOPT_INTERVAL_MS then return end + adoptTimerMs = 0 + for _, vehicle in pairs(getFarmVehiclesById(adEnv)) do + local run = ADRunsController.getRunForVehicle(vehicle) + local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil + if run ~= nil and (run.kind or "supply") == "supply" and stateModule ~= nil and stateModule:isActive() + and ADSmartPickup.getEnRoute(vehicle) == nil then + local second = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil + if second ~= nil and ADSmartPickup.registerCargo(adEnv, vehicle, second.id, ADRunsController.getRunIngredients(adEnv, run, vehicle)) then + Logging.info(ADRunsController.LOG_PREFIX .. "'%s' har læs på vej til %s (overtaget efter start/indlæsning)", tostring(ADRuns.vehicleLabel(vehicle)), tostring(second.name or second.id)) + end + end + end +end + -- Fire traktorer kan hedde det samme; løbenummeret er pladsen i farmens AD-køretøjsliste. function ADRunsController.getVehicleLabel(adEnv, vehicle) local label, model = tostring(ADRuns.vehicleLabel(vehicle)), tostring(vehicle:getName()) @@ -973,6 +994,10 @@ local function applyRunToVehicle(adEnv, run, vehicle, ingredients) local targetId = ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId local dump = ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId) stateModule:setSecondMarkerByWayPointId(targetId) + -- allerede fyldt: registrér læsset på vej, så næste traktor i samme start vælger et andet drop + if dump == nil and ADSmartPickup.registerCargo ~= nil then + ADSmartPickup.registerCargo(adEnv, vehicle, targetId, ingredients) + end if dump ~= nil then if ADUnloadWait ~= nil and ADUnloadWait.setDumpTarget ~= nil then ADUnloadWait.setDumpTarget(vehicle, dump.marker.id) @@ -1060,7 +1085,9 @@ function ADRunsController.startRun(adEnv, runId) local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients) if ok then started = started + 1 - local target = run.kind == "outbound" and ("kilde " .. tostring(run.sourceWayPointIds[1])) or ("markør " .. tostring(run.targetWayPointId)) + local second = vehicle.ad.stateModule.getSecondMarker ~= nil and vehicle.ad.stateModule:getSecondMarker() or nil + local target = run.kind == "outbound" and ("kilde " .. tostring(run.sourceWayPointIds[1])) + or ("markør " .. tostring(second ~= nil and second.id or run.targetWayPointId)) Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' startet mod %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), target) else result.ok, result.reason = false, "error" diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index a830ea2..8620a46 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -657,6 +657,20 @@ function ADSmartPickup.setEnRoute(vehicle, wayPointId, fillType, liters) enRoute[vehicle] = {wayPointId = wayPointId, fillType = fillType, liters = liters} end +function ADSmartPickup.getEnRoute(vehicle) + return enRoute[vehicle] +end + +-- Fyldt run-traktor -> "på vej" til mål targetId, så mål-valget for de næste fordeler dem. +function ADSmartPickup.registerCargo(adEnv, vehicle, targetId, ingredients) + if targetId == nil or ADUnloadWait == nil or ADUnloadWait.getRestLoad == nil then return false end + local restFillType, restLiters = ADUnloadWait.getRestLoad(adEnv, vehicle) + local fillType, liters = ADSupplyPlanner.cargoFor(restFillType, restLiters, ingredients) + if fillType == nil then return false end + ADSmartPickup.setEnRoute(vehicle, targetId, fillType, liters) + return true +end + function ADSmartPickup.clearEnRoute(vehicle) enRoute[vehicle] = nil end @@ -1249,6 +1263,9 @@ function ADSmartPickup:update(dt) end end if ADStuckDiag ~= nil then pcall(ADStuckDiag.tick, dt) end + if ADRunsController ~= nil and ADRunsController.adoptLoadedThrottled ~= nil then + pcall(ADRunsController.adoptLoadedThrottled, getAutoDriveEnv(), dt) + end local ok, err = pcall(restoreStoppedVehicles) if not ok then Logging.warning(ADSmartPickup.LOG_PREFIX .. "kunne ikke gendanne varevalg: %s", tostring(err)) diff --git a/FS25_ADSmartPickup/adSupplyPlanner.lua b/FS25_ADSmartPickup/adSupplyPlanner.lua index b479ab8..570c590 100644 --- a/FS25_ADSmartPickup/adSupplyPlanner.lua +++ b/FS25_ADSmartPickup/adSupplyPlanner.lua @@ -345,3 +345,14 @@ function ADSupplyPlanner.parallelFoodShare(groups, fillLevels, capacity, fillTyp end return nil end + +-- Læs der allerede ligger på vognen, når et run startes (eller AutoDrive genstarter traktoren efter +-- indlæsning): tæller som "på vej" til målet, hvis varen hører til run'et. Returnerer fillType, liter +-- eller nil. (in-game 27/9: tre fyldte biogas-traktorer kørte alle til Drop 1 — ingen var registreret.) +function ADSupplyPlanner.cargoFor(fillType, liters, ingredients) + if fillType == nil or type(liters) ~= "number" or liters <= 0 then return nil end + for _, ingredient in ipairs(ingredients or {}) do + if ingredient == fillType then return fillType, liters end + end + return nil +end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index f5bffb6..d637af2 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.35.2.0 + 1.35.3.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adRunsController.lua b/tests/test_adRunsController.lua index 0ff6306..8a14994 100644 --- a/tests/test_adRunsController.lua +++ b/tests/test_adRunsController.lua @@ -411,6 +411,30 @@ check("C16b ledigt mål foran mindre fyldt mål med vogn på vej", ADRunsControl ADSmartPickup.countEnRoute = function() return 1 end check("C16b lige mange på vej -> mindst fyldte", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 99) ADSmartPickup.countEnRoute = nil +-- C16c: fyldte traktorer startet i samme run fordeles på målene (in-game 27/9: tre fyldte biogas-traktorer +-- kørte alle til Drop 1, fordi læs der allerede lå på vognen aldrig blev registreret "på vej") +do + unloadAt[99].levels = {[STRAW] = 100000, [TMR] = 100000} + unloadAt[94].levels = {[STRAW] = 200000, [TMR] = 200000, [WATER] = 50000} + local onWay = {} + ADSmartPickup.countEnRoute = function(id, exclude) + local n = 0 + for v, target in pairs(onWay) do if v ~= exclude and target == id then n = n + 1 end end + return n + end + ADSmartPickup.registerCargo = function(_, v, targetId) onWay[v] = targetId; return true end + local loadedA = makeVehicle("vehicleLoadedA", "Fyldt A", {STRAW, TMR}, 1000000, 100, 0) + local loadedB = makeVehicle("vehicleLoadedB", "Fyldt B", {STRAW, TMR}, 1000000, 110, 0) + local both = ADRunsController.createRun("To fyldte") + ADRunsController.updateRun(both.id, {targetWayPointIds = {94, 99}}) + ADRunsController.assignVehicle(both.id, loadedA) + ADRunsController.assignVehicle(both.id, loadedB) + ADRunsController.startRun(adEnv, both.id) + local a, b = loadedA.ad.stateModule.secondMarkerId, loadedB.ad.stateModule.secondMarkerId + check("C16c første fyldte -> mindst fyldte mål", a, 99) + check("C16c anden fyldte -> det andet mål", b, 94) + ADSmartPickup.countEnRoute, ADSmartPickup.registerCargo = nil, nil +end ADRunsController.updateRun(multi.id, {targetWayPointIds = {4242}}) check("C16 kun ukendte mål -> noTarget", ADRunsController.validateVehicle(adEnv, ADRuns.getRun(ADRunsController.store, multi.id), multiVehicle).reason, "noTarget") diff --git a/tests/test_adSupplyPlanner.lua b/tests/test_adSupplyPlanner.lua index e9009aa..710857c 100644 --- a/tests/test_adSupplyPlanner.lua +++ b/tests/test_adSupplyPlanner.lua @@ -244,5 +244,12 @@ do check("PF ukendt vare -> nil", ADSupplyPlanner.parallelFoodShare(groups, levels, 100000, 99), nil) end +-- cargoFor: læs der allerede er på vognen ved start tæller som "på vej" (in-game 27/9: tre fyldte +-- biogas-traktorer startet fra fanen kørte alle til Drop 1 — ingen var registreret på vej) +check("CF run-vare på vognen", select(2, ADSupplyPlanner.cargoFor(SILAGE, 427215, {SILAGE})), 427215) +check("CF vare uden for run'et -> nil", ADSupplyPlanner.cargoFor(HAY, 5000, {SILAGE}), nil) +check("CF tom vogn -> nil", ADSupplyPlanner.cargoFor(SILAGE, 0, {SILAGE}), nil) +check("CF ukendt vare -> nil", ADSupplyPlanner.cargoFor(nil, 5000, {SILAGE}), nil) + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)