fix(runs): fyldte traktorer registreres 'på vej' ved run-start og efter AutoDrives genstart ved indlæsning — ellers så mål-valget 0 vogne på vej og sendte alle til samme biogas-drop; startloggen viser det valgte mål (v1.35.3.0)

This commit is contained in:
2026-09-27 10:15:34 +02:00
parent 6fbf05273e
commit 33b4f754b0
6 changed files with 88 additions and 2 deletions
+28 -1
View File
@@ -394,6 +394,27 @@ function ADRunsController.chooseTarget(adEnv, run, vehicle)
return bestId or targets[1] return bestId or targets[1]
end 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. -- Fire traktorer kan hedde det samme; løbenummeret er pladsen i farmens AD-køretøjsliste.
function ADRunsController.getVehicleLabel(adEnv, vehicle) function ADRunsController.getVehicleLabel(adEnv, vehicle)
local label, model = tostring(ADRuns.vehicleLabel(vehicle)), tostring(vehicle:getName()) 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 targetId = ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId
local dump = ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId) local dump = ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId)
stateModule:setSecondMarkerByWayPointId(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 dump ~= nil then
if ADUnloadWait ~= nil and ADUnloadWait.setDumpTarget ~= nil then if ADUnloadWait ~= nil and ADUnloadWait.setDumpTarget ~= nil then
ADUnloadWait.setDumpTarget(vehicle, dump.marker.id) ADUnloadWait.setDumpTarget(vehicle, dump.marker.id)
@@ -1060,7 +1085,9 @@ function ADRunsController.startRun(adEnv, runId)
local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients) local ok, err = pcall(applyAndStart, adEnv, run, vehicle, ingredients)
if ok then if ok then
started = started + 1 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) Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' startet mod %s", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)), target)
else else
result.ok, result.reason = false, "error" result.ok, result.reason = false, "error"
+17
View File
@@ -657,6 +657,20 @@ function ADSmartPickup.setEnRoute(vehicle, wayPointId, fillType, liters)
enRoute[vehicle] = {wayPointId = wayPointId, fillType = fillType, liters = liters} enRoute[vehicle] = {wayPointId = wayPointId, fillType = fillType, liters = liters}
end 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) function ADSmartPickup.clearEnRoute(vehicle)
enRoute[vehicle] = nil enRoute[vehicle] = nil
end end
@@ -1249,6 +1263,9 @@ function ADSmartPickup:update(dt)
end end
end end
if ADStuckDiag ~= nil then pcall(ADStuckDiag.tick, dt) 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) local ok, err = pcall(restoreStoppedVehicles)
if not ok then if not ok then
Logging.warning(ADSmartPickup.LOG_PREFIX .. "kunne ikke gendanne varevalg: %s", tostring(err)) Logging.warning(ADSmartPickup.LOG_PREFIX .. "kunne ikke gendanne varevalg: %s", tostring(err))
+11
View File
@@ -345,3 +345,14 @@ function ADSupplyPlanner.parallelFoodShare(groups, fillLevels, capacity, fillTyp
end end
return nil return nil
end 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
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?> <?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107"> <modDesc descVersion="107">
<author>masterdraco</author> <author>masterdraco</author>
<version>1.35.2.0</version> <version>1.35.3.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>
+24
View File
@@ -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 ADSmartPickup.countEnRoute = function() return 1 end
check("C16b lige mange på vej -> mindst fyldte", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 99) check("C16b lige mange på vej -> mindst fyldte", ADRunsController.chooseTarget(adEnv, multiRun, multiVehicle), 99)
ADSmartPickup.countEnRoute = nil 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}}) 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") check("C16 kun ukendte mål -> noTarget", ADRunsController.validateVehicle(adEnv, ADRuns.getRun(ADRunsController.store, multi.id), multiVehicle).reason, "noTarget")
+7
View File
@@ -244,5 +244,12 @@ do
check("PF ukendt vare -> nil", ADSupplyPlanner.parallelFoodShare(groups, levels, 100000, 99), nil) check("PF ukendt vare -> nil", ADSupplyPlanner.parallelFoodShare(groups, levels, 100000, 99), nil)
end 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")) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL"))
os.exit(failures == 0 and 0 or 1) os.exit(failures == 0 and 0 or 1)