fix: forkert last midt i et run — pålæsning afsluttes straks, målet der ikke tager varen regnes som fuldt (Wait), og resten læsses af i silo fra Wait (v1.11.7.0)

This commit is contained in:
2026-09-23 02:24:16 +02:00
parent 91c724b9f4
commit ce32eb8e44
5 changed files with 87 additions and 6 deletions
+5 -3
View File
@@ -87,13 +87,14 @@ function ADLoadSwap.tryFromWait(adEnv, task, wait, dt, redirect, release, isReac
end
wait.swapTimerMs = 0
local vehicle = task.vehicle
-- Tager målet slet ikke varen (forkert last), skal den af uanset hvad der ellers mangler.
local missing = ADLoadSwap.findMissingIngredient(adEnv, vehicle, wait.fillType)
if missing == nil then
if missing == nil and not wait.isRejected then
return false
end
local marker = ADLoadSwap.findDumpMarker(adEnv, vehicle, wait.fillType, wait.rest, wait.homeDestinationID, isReachable)
local restName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(wait.fillType) or tostring(wait.fillType)
local missingName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(missing.fillType) or tostring(missing.fillType)
local missingName = missing ~= nil and (g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(missing.fillType) or tostring(missing.fillType)) or "-"
if marker == nil then
if not warnedNoSilo[vehicle] then
warnedNoSilo[vehicle] = true
@@ -104,7 +105,8 @@ function ADLoadSwap.tryFromWait(adEnv, task, wait, dt, redirect, release, isReac
warnedNoSilo[vehicle] = nil
release(vehicle)
redirect(task, marker.id)
Logging.info(ADLoadSwap.LOG_PREFIX .. "'%s' bytter læs: %.0f l %s tilbage i %s (markør %s), målet mangler %s", tostring(vehicle:getName()), wait.rest, tostring(restName), tostring(marker.name), tostring(marker.markerIndex or marker.id), tostring(missingName))
local why = missing ~= nil and ("målet mangler " .. tostring(missingName)) or "målet tager ikke varen"
Logging.info(ADLoadSwap.LOG_PREFIX .. "'%s' bytter læs: %.0f l %s tilbage i %s (markør %s), %s", tostring(vehicle:getName()), wait.rest, tostring(restName), tostring(marker.name), tostring(marker.markerIndex or marker.id), why)
return true
end
+35 -1
View File
@@ -516,7 +516,8 @@ end
-- Fri plads + kapacitet for varen i køretøjets aflæsningsmål (Wait-punkt-logikken);
-- nil hvis målet ikke kendes eller ikke tager varen.
function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType)
-- askAccepted=true: returnerer i stedet true/false for "tager målet varen?" (nil = mål ukendt).
function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType, askAccepted)
local secondMarker = driver.ad.stateModule:getSecondMarker()
local farmId = getFarmId(driver)
if secondMarker == nil or farmId == nil then
@@ -528,6 +529,9 @@ function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType)
return nil
end
local level, capacity = getTargetLevelAndCapacity(target, fillType, farmId)
if askAccepted then
return level ~= nil
end
if level == nil then
return nil
end
@@ -723,7 +727,37 @@ local function installLoadWaitHook(adEnv)
return pickup.stalledMs > ADSmartPickup.MAX_WAIT_WITHOUT_LOADING_MS
end
-- Vognen kan kun læsse oven i SAMME vare. Er der en anden vare på vognen (rest fra et
-- tidligere run), afsluttes pålæsningen med det samme, så AD kører til aflæsning med
-- det den har — dér tager Wait-/bytte-logikken over, hvis målet ikke tager varen.
local function hasWrongCargo(loadTask)
if loadTask.spuCargoChecked or ADUnloadWait == nil or ADUnloadWait.getRestLoad == nil then
return false
end
loadTask.spuCargoChecked = true
local pickup = activePickups[loadTask.vehicle]
if pickup == nil or pickup.fillType == nil then
return false
end
local fillType, liters = ADUnloadWait.getRestLoad(adEnv, loadTask.vehicle)
if fillType == nil or liters < 100 or fillType == pickup.fillType then
return false
end
local cargoName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
local wantedName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(pickup.fillType) or tostring(pickup.fillType)
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' har %.0f l %s på vognen og skulle hente %s — leverer først det den har", tostring(loadTask.vehicle:getName()), liters, tostring(cargoName), tostring(wantedName))
return true
end
task.update = function(self, dt)
local wrongOk, isWrong = pcall(hasWrongCargo, self)
if wrongOk and isWrong then
activePickups[self.vehicle] = nil
if self.finished ~= nil then
self:finished()
return
end
end
local ok, shouldWait = pcall(ADSmartPickup.shouldWaitForLoading, self.vehicle)
shouldWait = ok and shouldWait
if shouldWait then
+11 -1
View File
@@ -127,7 +127,12 @@ local function startWaiting(adEnv, task)
if fillType == nil or rest < ADUnloadWait.MIN_REST_LITERS then
return
end
local free = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType)
local free, capacity = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType)
-- nil = målet tager slet ikke varen (forkert last fra et tidligere run): som "fuldt"
local isRejected = free == nil and ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType, true) == false
if isRejected then
free = 0
end
if free == nil or free >= ADUnloadWait.MIN_FREE_TO_UNLOAD then
return
end
@@ -169,6 +174,11 @@ local function updateWaiting(adEnv, task, wait, dt)
-- Friske tal til evt. bytte og til tilbage-loggen — ikke dem fra da ventningen startede.
wait.fillType, wait.rest = fillType, rest
local free, capacity = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType)
local isRejected = free == nil and ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType, true) == false
if isRejected then
free = 0
end
wait.isRejected = isRejected
-- run'ets "kør hjem under X %" (fri ≥ (100-X) % af kapaciteten), ellers standardreglen
local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle(vehicle) or nil
local freeFraction = run ~= nil and run.returnBelowPercent ~= nil and (1 - run.returnBelowPercent / 100) or nil
+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.11.6.0</version>
<version>1.11.7.0</version>
<title>
<en>AD Smart Pickup</en>
</title>