fix(forsyning): intet at hente til valgt mål -> prøv run'ets andre mål før Wait (to traktorer til samme DOB); hold-tekst siger den reelle grund (v1.18.2.0)

This commit is contained in:
2026-09-24 06:05:17 +02:00
parent 57fc01ac47
commit 889689cfce
5 changed files with 59 additions and 4 deletions
+35 -1
View File
@@ -736,6 +736,37 @@ local function chooseRunTarget(adEnv, driver)
Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (%s)", tostring(ADRuns.vehicleLabel(driver)), marker ~= nil and tostring(marker.name) or tostring(targetId), why) Logging.info(ADSmartPickup.LOG_PREFIX .. "'%s' kører til %s (%s)", tostring(ADRuns.vehicleLabel(driver)), marker ~= nil and tostring(marker.name) or tostring(targetId), why)
end end
local tryOtherRunTargets
-- Det valgte mål har intet der kan hentes (kilden er tom, eller andre traktorer har allerede læs på vej
-- til det): prøv run'ets ANDRE mål, og skift AD's aflæsningsmål til det første der kan forsynes.
-- Ellers holdt traktoren ved Wait mens fx fire andre DOB'er ved samme biogasanlæg stod tomme.
tryOtherRunTargets = function(adEnv, driver, ingredients)
local run = ADRunsController ~= nil and ADRunsController.getRunForVehicle(driver) or nil
if run == nil or (run.kind or "supply") ~= "supply" then
return nil
end
-- AD's mål er midlertidigt en silo (forkert last læsses af): rør det ikke
if ADUnloadWait ~= nil and ADUnloadWait.getPendingTargetRestore ~= nil and ADUnloadWait.getPendingTargetRestore(driver) ~= nil then
return nil
end
local stateModule = driver.ad.stateModule
local current = stateModule.getSecondMarker ~= nil and stateModule:getSecondMarker() or nil
local currentId = current ~= nil and current.id or nil
for _, targetId in ipairs(ADRunsController.getRunTargets(run)) do
if targetId ~= currentId then
local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients, targetId)
if choice ~= nil and stateModule.setSecondMarkerByWayPointId ~= nil then
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 (intet at hente til %s)", tostring(ADRuns.vehicleLabel(driver)),
marker ~= nil and tostring(marker.name) or tostring(targetId), current ~= nil and tostring(current.name) or "?")
return choice
end
end
end
return nil
end
-- Samlet valg: behovsstyret med ingrediensliste, ellers mappe-logik. nil = AutoDrives original. -- Samlet valg: behovsstyret med ingrediensliste, ellers mappe-logik. nil = AutoDrives original.
function ADSmartPickup.choosePickup(adEnv, driver) function ADSmartPickup.choosePickup(adEnv, driver)
enRoute[driver] = nil -- ny tur: forrige læs er leveret (eller opgivet) enRoute[driver] = nil -- ny tur: forrige læs er leveret (eller opgivet)
@@ -747,6 +778,9 @@ function ADSmartPickup.choosePickup(adEnv, driver)
end end
local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients) local choice = ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients)
if choice == nil then
choice = tryOtherRunTargets(adEnv, driver, ingredients)
end
if choice == nil then if choice == nil then
-- Traktor i et forsynings-run uden noget (tilladt) at hente: hold ved Wait og prøv igen, i stedet -- Traktor i et forsynings-run uden noget (tilladt) at hente: hold ved Wait og prøv igen, i stedet
-- for at falde tilbage til mappe-logikken (den henter hvad som helst, fx ensilage i et halvfuldt trug). -- for at falde tilbage til mappe-logikken (den henter hvad som helst, fx ensilage i et halvfuldt trug).
@@ -762,7 +796,7 @@ function ADSmartPickup.choosePickup(adEnv, driver)
activePickups[driver] = {station = next.station, fillTypes = next.fillTypes, markerName = next.markerName, fillType = next.fillType} activePickups[driver] = {station = next.station, fillTypes = next.fillTypes, markerName = next.markerName, fillType = next.fillType}
return next.markerId return next.markerId
end end
local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente (bedste foder mangler, truget ikke nødlidende)"}, replan) local held = ADOutbound.holdSupplyVehicle(adEnv, driver, run, {"intet at hente til nogen af run'ets mål (tom kilde, læs på vej, eller bedste foder mangler)"}, replan)
if held ~= nil then if held ~= nil then
return held return held
end 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.18.1.0</version> <version>1.18.2.0</version>
<title> <title>
<en>AD Smart Pickup</en> <en>AD Smart Pickup</en>
</title> </title>
+1 -1
View File
@@ -1,6 +1,6 @@
# AD Smart Pickup — brugermanual # AD Smart Pickup — brugermanual
Version 1.18.1 · Farming Simulator 25 · tillæg til AutoDrive Version 1.18.2 · Farming Simulator 25 · tillæg til AutoDrive
*English version: [USER_MANUAL.md](USER_MANUAL.md)* *English version: [USER_MANUAL.md](USER_MANUAL.md)*
+1 -1
View File
@@ -1,6 +1,6 @@
# AD Smart Pickup — user manual # AD Smart Pickup — user manual
Version 1.18.1 · Farming Simulator 25 · add-on for AutoDrive Version 1.18.2 · Farming Simulator 25 · add-on for AutoDrive
*Dansk version: [BRUGERMANUAL.md](BRUGERMANUAL.md)* *Dansk version: [BRUGERMANUAL.md](BRUGERMANUAL.md)*
+21
View File
@@ -988,6 +988,27 @@ check("I6 næste tur: halm til stald 2", manager:getNextPickup(i6, false), 21)
check("I6 mål skiftet til stald 2", i6.ad.stateModule.secondMarkerId, 31) check("I6 mål skiftet til stald 2", i6.ad.stateModule.secondMarkerId, 31)
ADRunsController.store = ADRuns.newStore() ADRunsController.store = ADRuns.newStore()
-- I7: det valgte mål har intet der kan hentes (TMR-kilden er tom) -> prøv run'ets ANDRE mål før Wait
-- (in-game 24/9: to traktorer fik begge 'Biogas Drop 1'; nr. 2 holdt selv om 4 DOB'er var tomme)
buildCowWorld()
addMarker(31, "Cow 2 Food", "Cow Food", 6000, 0)
local cow2LevelsI7 = {[STRAW] = 10000, [TMR] = 100000}
table.insert(unloadStations, makeUnloadStation(131, 6000, 10, cow2LevelsI7, {[STRAW] = 100000, [TMR] = 100000}, {name = "kostald 2"}))
cowLevels[STRAW], cowLevels[TMR] = 100000, 0 -- stald 1 mangler KUN TMR (mest trængende)
stations[1].getFillLevel = function(_, fillType) return fillType == STRAW and 5000 or 0 end -- TMR-kilden tom
local i7 = makeSupplyDriver(markerByIndex(21), markerByIndex(30), {TMR, STRAW})
i7.uniqueId = "vehicleI7"; i7.carriable = {TMR, STRAW}; i7.trailers = {level = 0, capacity = 8000}
i7.ad.stateModule.setSecondMarkerByWayPointId = function(self, id) self.secondMarkerId = id end
i7.ad.stateModule.getSecondMarker = function(self) return markerByIndex(self.secondMarkerId or 30) end
testVehicles = {i7}
ADRunsController.store = ADRuns.newStore()
local twoBarnsI7 = ADRunsController.createRun("Kvæg2")
ADRunsController.updateRun(twoBarnsI7.id, {targetWayPointIds = {30, 31}})
ADRunsController.assignVehicle(twoBarnsI7.id, i7)
check("I7 henter halm til det andet mål", manager:getNextPickup(i7, false), 21)
check("I7 AD's mål skiftet til stald 2", i7.ad.stateModule.secondMarkerId, 31)
ADRunsController.store = ADRuns.newStore()
-- ==== V: forkert last på vognen ==== -- ==== V: forkert last på vognen ====
-- V1: pålæsning starter med anden vare på vognen -> opgaven afsluttes straks (AD leverer det den har) -- V1: pålæsning starter med anden vare på vognen -> opgaven afsluttes straks (AD leverer det den har)
buildCowWorld() buildCowWorld()