feat: forkert last ved Start læsses af i nærmeste silo før run'et fortsætter; run-mål gendannes ved næste tur (v1.11.6.0)

This commit is contained in:
2026-09-23 02:19:22 +02:00
parent d8414f224d
commit 91c724b9f4
5 changed files with 67 additions and 6 deletions
+35 -1
View File
@@ -309,6 +309,36 @@ function ADRunsController.validateVehicle(adEnv, run, vehicle)
return result
end
-- Vognens last som INGEN af run'ets mål tager -> {marker, fillType, liters} for en silo der gør
-- (plads >= resten, vejnet til siloen og fra siloen til målet); nil når lasten passer eller
-- ingen silo findes (så kører AD som normalt og Wait-logikken tager over).
function ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId)
if ADUnloadWait == nil or ADUnloadWait.getRestLoad == nil or ADLoadSwap == nil or ADLoadSwap.findDumpMarker == nil then
return nil
end
local fillType, liters = ADUnloadWait.getRestLoad(adEnv, vehicle)
if fillType == nil or liters < 100 then
return nil
end
local farmId = ADSmartPickup.getFarmId(vehicle)
for _, entry in ipairs(getTargetStations(adEnv, run, farmId)) do
if ADSmartPickup.getStationLevelAndCapacity(entry.station, fillType, farmId) ~= nil then
return nil
end
end
local isReachable = function(markerId)
return ADUnloadWait.hasRouteBothWays == nil or ADUnloadWait.hasRouteBothWays(adEnv, vehicle, markerId, targetId)
end
local marker = ADLoadSwap.findDumpMarker(adEnv, vehicle, fillType, liters, targetId, isReachable)
local fillTypeName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
if marker == nil then
Logging.warning(ADRunsController.LOG_PREFIX .. "run '%s': '%s' har %.0f l %s på vognen, som målet ikke tager, og ingen silo med plads/vejnet tager den — AutoDrive starter som normalt", tostring(run.name), tostring(vehicle:getName()), liters, tostring(fillTypeName))
return nil
end
Logging.info(ADRunsController.LOG_PREFIX .. "run '%s': '%s' læsser først %.0f l %s af i %s (markør %s) — målet tager ikke varen", tostring(run.name), tostring(vehicle:getName()), liters, tostring(fillTypeName), tostring(marker.name), tostring(marker.markerIndex or marker.id))
return {marker = marker, fillType = fillType, liters = liters}
end
-- ---- Start / Stop ----
-- AD gemmer indstillinger som INDEKS i values; useFolders er global, rotateTargets pr. køretøj.
@@ -360,7 +390,11 @@ local function applyRunToVehicle(adEnv, run, vehicle, ingredients)
local stateModule = vehicle.ad.stateModule
local farmId = ADSmartPickup.getFarmId(vehicle)
stateModule:setMode(adEnv.AutoDrive.MODE_PICKUPANDDELIVER)
stateModule:setSecondMarkerByWayPointId(ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId)
-- Forkert last på vognen (fx halm fra et tidligere run, mål = sukkerfabrik): første stop
-- bliver en silo der tager varen; næste tur sætter choosePickup målet tilbage til run'ets.
local targetId = ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId
local dump = ADRunsController.findWrongCargoDump(adEnv, run, vehicle, targetId)
stateModule:setSecondMarkerByWayPointId(dump ~= nil and dump.marker.id or targetId)
local loadMarker = findNearestLoadMarker(adEnv, vehicle, farmId)
if loadMarker ~= nil then
stateModule:setFirstMarkerByWayPointId(loadMarker.id)
+6 -4
View File
@@ -611,11 +611,12 @@ function ADSmartPickup.getIngredientsFor(adEnv, driver)
return ADSupplyPlanner.resolveIngredients(supplyState[driver], driver.ad.stateModule:getSelectedFillTypes())
end
-- Run med flere mål: ved turens start sættes AD's aflæsningsmål til den stald der mangler
-- mest. AD læser først målet når vognen er læsset, så skiftet her gælder for hele turen.
-- Ved turens start sættes AD's aflæsningsmål til run'ets mål — ved flere mål den stald der
-- mangler mest; ved ét mål gendannes det (fx efter at forkert last er læsset af i en silo).
-- AD læser først målet når vognen er læsset, så skiftet her gælder for hele turen.
local function chooseRunTarget(adEnv, driver)
local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle(driver) or nil
if run == nil or ADRunsController.chooseTarget == nil or #ADRunsController.getRunTargets(run) < 2 then
if run == nil or ADRunsController.chooseTarget == nil or #ADRunsController.getRunTargets(run) < 1 then
return
end
local stateModule = driver.ad.stateModule
@@ -626,7 +627,8 @@ local function chooseRunTarget(adEnv, driver)
end
stateModule:setSecondMarkerByWayPointId(targetId)
local marker = adEnv.ADGraphManager.getMapMarkerByWayPointId ~= nil and adEnv.ADGraphManager:getMapMarkerByWayPointId(targetId) or nil
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (mangler mest af run'ets mål)", tostring(driver:getName()), marker ~= nil and tostring(marker.name) or tostring(targetId))
local why = #ADRunsController.getRunTargets(run) > 1 and "mangler mest af run'ets mål" or "run'ets mål"
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (%s)", tostring(driver:getName()), marker ~= nil and tostring(marker.name) or tostring(targetId), why)
end
-- Samlet valg: behovsstyret med ingrediensliste, ellers mappe-logik. nil = AutoDrives original.
+4
View File
@@ -208,6 +208,10 @@ end
-- Hvem holder hvor (GUI'ets Wait-puljer-visning). Sorteret på mappe, dernæst markør-id.
-- Vognens indhold (største enhed) og evt. Wait-tilstand — til overblikket i fanen.
function ADUnloadWait.hasRouteBothWays(adEnv, vehicle, toWayPointId, homeWayPointId)
return hasRouteBothWays(adEnv, vehicle, toWayPointId, homeWayPointId)
end
function ADUnloadWait.getRestLoad(adEnv, vehicle)
return getRestLoad(adEnv, vehicle)
end
+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.5.0</version>
<version>1.11.6.0</version>
<title>
<en>AD Smart Pickup</en>
</title>