fix: under Wait peger AD's mål på Wait-punktet (AD tippede ellers i småportioner og holdt vognen); behov/bytte måles mod hjem-målet; mål gendannes ved hjemkørsel (v1.11.13.0)

This commit is contained in:
2026-09-23 03:10:52 +02:00
parent 827010ca99
commit 33f69cc6c8
5 changed files with 32 additions and 14 deletions
+3 -3
View File
@@ -13,12 +13,12 @@ ADLoadSwap.CHECK_INTERVAL_MS = 5000
local warnedNoSilo = setmetatable({}, {__mode = "k"})
-- Er en anden vare i listen så tom i målet, at et FULDT læs passer, og findes den i en silo?
function ADLoadSwap.findMissingIngredient(adEnv, vehicle, restFillType)
function ADLoadSwap.findMissingIngredient(adEnv, vehicle, restFillType, homeWayPointId)
local ingredients = ADSmartPickup.getIngredientsFor(adEnv, vehicle)
if ingredients == nil or #ingredients < 2 then
return nil
end
local choice = ADSmartPickup.findSupplyPickup(adEnv, vehicle, ingredients)
local choice = ADSmartPickup.findSupplyPickup(adEnv, vehicle, ingredients, homeWayPointId)
if choice == nil or choice.fillType == nil or choice.fillType == restFillType or choice.need.fits ~= true then
return nil
end
@@ -99,7 +99,7 @@ function ADLoadSwap.tryFromWait(adEnv, task, wait, dt, redirect, release, isReac
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)
local missing = ADLoadSwap.findMissingIngredient(adEnv, vehicle, wait.fillType, wait.homeDestinationID)
if missing == nil and not wait.isRejected then
return false
end
+10 -6
View File
@@ -517,13 +517,16 @@ 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.
-- askAccepted=true: returnerer i stedet true/false for "tager målet varen?" (nil = mål ukendt).
function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType, askAccepted)
-- targetWayPointId (valgfri): brug dette mål i stedet for AD's 2. markør (mens en traktor venter
-- ved et Wait-punkt, peger AD's markør på Wait-punktet, så AD ikke tipper).
function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType, askAccepted, targetWayPointId)
local secondMarker = driver.ad.stateModule:getSecondMarker()
local farmId = getFarmId(driver)
if secondMarker == nil or farmId == nil then
local wayPointId = targetWayPointId or (secondMarker ~= nil and secondMarker.id or nil)
if wayPointId == nil or farmId == nil then
return nil
end
local targetWayPoint = adEnv.ADGraphManager:getWayPointById(secondMarker.id)
local targetWayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId)
local target = targetWayPoint ~= nil and getUnloadStationAtMarker(adEnv, targetWayPoint, farmId) or nil
if target == nil then
return nil
@@ -539,13 +542,14 @@ function ADSmartPickup.getTargetFreeCapacity(adEnv, driver, fillType, askAccepte
end
-- Behovsstyret: den ingrediens aflæsningsmålet mangler mest, som også findes i en silo.
function ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients)
function ADSmartPickup.findSupplyPickup(adEnv, driver, ingredients, targetWayPointId)
local secondMarker = driver.ad.stateModule:getSecondMarker()
local farmId = getFarmId(driver)
if secondMarker == nil or farmId == nil then
local wayPointId = targetWayPointId or (secondMarker ~= nil and secondMarker.id or nil)
if wayPointId == nil or farmId == nil then
return nil
end
local targetWayPoint = adEnv.ADGraphManager:getWayPointById(secondMarker.id)
local targetWayPoint = adEnv.ADGraphManager:getWayPointById(wayPointId)
local target = targetWayPoint ~= nil and getUnloadStationAtMarker(adEnv, targetWayPoint, farmId) or nil
if target == nil then
return nil
+7 -4
View File
@@ -216,7 +216,9 @@ local function startWaiting(adEnv, task)
warnedNoWaitPoint[vehicle] = nil
claims[candidate.marker.id] = vehicle
waits[vehicle] = {task = task, homeDestinationID = task.destinationID, waitMarker = candidate.marker, fillType = fillType, rest = rest}
redirect(task, candidate.marker.id)
-- AD tipper (og holder vognen stille) så længe den står nær sit EGET mål — også i små
-- portioner, når målet forbruger løbende. Derfor peger AD's mål på Wait-punktet imens.
redirectForUnload(task, candidate.marker.id)
local fillTypeName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
Logging.info(ADUnloadWait.LOG_PREFIX .. "'%s' venter ved %s (markør %s): %.0f l %s rest, målet har kun %.0f l fri", tostring(vehicle:getName()), tostring(candidate.marker.name), tostring(candidate.marker.markerIndex or candidate.marker.id), rest, tostring(fillTypeName), free)
end
@@ -235,8 +237,9 @@ local function updateWaiting(adEnv, task, wait, dt)
end
-- 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
local home = wait.homeDestinationID
local free, capacity = ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType, nil, home)
local isRejected = free == nil and ADSmartPickup.getTargetFreeCapacity(adEnv, vehicle, fillType, true, home) == false
if isRejected then
free = 0
end
@@ -253,8 +256,8 @@ local function updateWaiting(adEnv, task, wait, dt)
end
return
end
local home = wait.homeDestinationID
release(vehicle)
restoreTarget(vehicle)
redirect(task, home)
Logging.info(ADUnloadWait.LOG_PREFIX .. "'%s' kører tilbage fra %s og læsser %.0f l af (målet har %.0f l fri)", tostring(vehicle:getName()), tostring(wait.waitMarker.name), rest, free)
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.12.0</version>
<version>1.11.13.0</version>
<title>
<en>AD Smart Pickup</en>
</title>
+11
View File
@@ -783,6 +783,17 @@ check("W13 Wait selv om markøren ikke er nået", tn.destinationID, 40)
FS25_AutoDrive.AutoDrive.getDistanceToUnloadPosition = nil
FS25_AutoDrive.AutoDrive.getMaxTriggerDistance = nil
-- W14: mens der ventes, peger AD's mål på Wait-punktet (så AD ikke tipper i småportioner);
-- behovet måles stadig mod hjem-målet, og AD's mål gendannes når den kører hjem
buildWaitWorld()
local vm, tm = makeUnloadingVehicle("Fastrac Mål", 591, 5000, 35000)
UnloadTask.update(tm, 16)
check("W14 AD's mål = Wait-punkt under ventetid", vm.ad.stateModule.secondMarkerId, 40)
waitBarnLevels[STRAW] = 10000 -- plads hjemme
UnloadTask.update(tm, 16)
check("W14 kører hjem (behov målt mod stalden, ikke Wait-punktet)", tm.destinationID, 30)
check("W14 AD's mål gendannet", vm.ad.stateModule.secondMarkerId, 30)
-- ==== I: run-integration — ingredienser fra run i stedet for multi-valg; Wait-pulje pr. run ====
-- I1: traktor i et run med ÉN valgt vare i AD får alligevel behovsstyring (run'ets liste)
local runDriver = buildCowWorld()