diff --git a/FS25_ADSmartPickup/adLoadSwap.lua b/FS25_ADSmartPickup/adLoadSwap.lua index 162159d..ab1d9d1 100644 --- a/FS25_ADSmartPickup/adLoadSwap.lua +++ b/FS25_ADSmartPickup/adLoadSwap.lua @@ -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 diff --git a/FS25_ADSmartPickup/adSmartPickup.lua b/FS25_ADSmartPickup/adSmartPickup.lua index ed4edf9..947faac 100644 --- a/FS25_ADSmartPickup/adSmartPickup.lua +++ b/FS25_ADSmartPickup/adSmartPickup.lua @@ -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 diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index 2678ca6..3d22155 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -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 diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index e7f81e2..6f6515d 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.11.12.0 + 1.11.13.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adSmartPickup.lua b/tests/test_adSmartPickup.lua index d4809cb..3cc7685 100644 --- a/tests/test_adSmartPickup.lua +++ b/tests/test_adSmartPickup.lua @@ -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()