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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,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>
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user