fix: ventende traktorer genoptages efter genindlæsning (AD's mål = Wait-punkt, ventetilstand tabt) (v1.12.9.0)
This commit is contained in:
@@ -947,6 +947,9 @@ function ADSmartPickup:update(dt)
|
|||||||
|
|
||||||
if ADUnloadWait ~= nil then
|
if ADUnloadWait ~= nil then
|
||||||
pcall(ADUnloadWait.releaseInactive)
|
pcall(ADUnloadWait.releaseInactive)
|
||||||
|
if ADUnloadWait.adoptOrphansThrottled ~= nil then
|
||||||
|
ADUnloadWait.adoptOrphansThrottled(getAutoDriveEnv(), dt)
|
||||||
|
end
|
||||||
end
|
end
|
||||||
if ADOutbound ~= nil and ADOutbound.releaseInactive ~= nil then
|
if ADOutbound ~= nil and ADOutbound.releaseInactive ~= nil then
|
||||||
pcall(ADOutbound.releaseInactive)
|
pcall(ADOutbound.releaseInactive)
|
||||||
|
|||||||
@@ -262,6 +262,52 @@ function ADUnloadWait.beforeUpdate(adEnv, task, dt)
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
-- Efter en genindlæsning er ventetilstanden (kun i hukommelsen) væk, men AutoDrives gemte mål
|
||||||
|
-- peger stadig på Wait-punktet, og traktoren står der med rest-læs — uden dette ville den blive
|
||||||
|
-- stående for evigt. Her genoptages ventningen for aktive traktorer i et forsynings-run hvis
|
||||||
|
-- aflæsningsopgave peger på en Wait-markør: hjem = run'ets mål, og reservationen sættes igen.
|
||||||
|
-- Kaldes fra ADSmartPickup:update (throttlet).
|
||||||
|
ADUnloadWait.ADOPT_INTERVAL_MS = 5000
|
||||||
|
local adoptTimerMs = ADUnloadWait.ADOPT_INTERVAL_MS
|
||||||
|
|
||||||
|
function ADUnloadWait.adoptOrphans(adEnv)
|
||||||
|
if ADRunsController == nil or ADRunsController.getFarmVehicles == nil then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do
|
||||||
|
local stateModule = vehicle.ad ~= nil and vehicle.ad.stateModule or nil
|
||||||
|
local isActive = stateModule ~= nil and stateModule.isActive ~= nil and stateModule:isActive()
|
||||||
|
local run = isActive and waits[vehicle] == nil and ADRunsController.getRunForVehicle(vehicle) or nil
|
||||||
|
if run ~= nil and (run.kind or "supply") == "supply" and stateModule.getSecondMarker ~= nil then
|
||||||
|
local marker = stateModule:getSecondMarker()
|
||||||
|
local task = vehicle.ad.taskModule ~= nil and vehicle.ad.taskModule.getActiveTask ~= nil and vehicle.ad.taskModule:getActiveTask() or nil
|
||||||
|
if marker ~= nil and marker.id ~= nil and ADSupplyPlanner.isWaitMarker(marker) and task ~= nil and task.destinationID == marker.id and task.trailers ~= nil then
|
||||||
|
local fillType, rest = getRestLoad(adEnv, vehicle)
|
||||||
|
local homeId = ADRunsController.chooseTarget ~= nil and ADRunsController.chooseTarget(adEnv, run, vehicle) or run.targetWayPointId
|
||||||
|
if fillType ~= nil and rest >= ADUnloadWait.MIN_REST_LITERS and homeId ~= nil then
|
||||||
|
ADWaitPool.claim(marker.id, vehicle)
|
||||||
|
pendingTargetRestore[vehicle] = homeId
|
||||||
|
waits[vehicle] = {task = task, homeDestinationID = homeId, waitMarker = marker, fillType = fillType, rest = rest}
|
||||||
|
local fillTypeName = g_fillTypeManager ~= nil and g_fillTypeManager:getFillTypeNameByIndex(fillType) or tostring(fillType)
|
||||||
|
Logging.info(ADUnloadWait.LOG_PREFIX .. "'%s' genoptager ventning ved %s efter genindlæsning: %.0f l %s rest, hjem = markør %s", tostring(vehicle:getName()), tostring(marker.name), rest, tostring(fillTypeName), tostring(homeId))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function ADUnloadWait.adoptOrphansThrottled(adEnv, dt)
|
||||||
|
adoptTimerMs = adoptTimerMs + (dt or 0)
|
||||||
|
if adoptTimerMs < ADUnloadWait.ADOPT_INTERVAL_MS then
|
||||||
|
return
|
||||||
|
end
|
||||||
|
adoptTimerMs = 0
|
||||||
|
local ok, err = pcall(ADUnloadWait.adoptOrphans, adEnv)
|
||||||
|
if not ok then
|
||||||
|
Logging.warning(ADUnloadWait.LOG_PREFIX .. "kunne ikke genoptage ventende traktorer: %s", tostring(err))
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
-- Kaldes fra ADSmartPickup:update — standsede køretøjer slipper deres Wait-punkt.
|
-- Kaldes fra ADSmartPickup:update — standsede køretøjer slipper deres Wait-punkt.
|
||||||
function ADUnloadWait.releaseInactive()
|
function ADUnloadWait.releaseInactive()
|
||||||
for vehicle in pairs(waits) do
|
for vehicle in pairs(waits) do
|
||||||
|
|||||||
@@ -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.12.8.0</version>
|
<version>1.12.9.0</version>
|
||||||
<title>
|
<title>
|
||||||
<en>AD Smart Pickup</en>
|
<en>AD Smart Pickup</en>
|
||||||
</title>
|
</title>
|
||||||
|
|||||||
@@ -1067,6 +1067,36 @@ manager:getNextPickup(chatty, false); manager:getNextPickup(chatty, false)
|
|||||||
check("L6 gentaget valg logges én gang", #logLines, 1)
|
check("L6 gentaget valg logges én gang", #logLines, 1)
|
||||||
check("L6 loggen viser eget lager", logLines[1]:find("eget lager", 1, true) ~= nil, true)
|
check("L6 loggen viser eget lager", logLines[1]:find("eget lager", 1, true) ~= nil, true)
|
||||||
|
|
||||||
|
-- W15: efter genindlæsning er ventetilstanden væk, men AD's mål peger stadig på Wait-punktet og
|
||||||
|
-- traktoren står der med rest-læs -> ventningen genoptages (hjem = run'ets mål) og den kører hjem
|
||||||
|
-- når der er plads
|
||||||
|
buildWaitWorld()
|
||||||
|
local orphan, orphanTask = makeUnloadingVehicle("Genindlæst", 515, 5090, 20000)
|
||||||
|
orphan.uniqueId = "vehicleOrphan"
|
||||||
|
orphan.spec_motorized = {}
|
||||||
|
orphan.ad.stateModule.secondMarkerId = 40 -- AD's gemte mål = Wait 1
|
||||||
|
orphanTask.destinationID = 40
|
||||||
|
orphan.ad.taskModule = {getActiveTask = function() return orphanTask end}
|
||||||
|
testVehicles = {orphan}
|
||||||
|
ADRunsController.store = ADRuns.newStore()
|
||||||
|
local orphanRun = ADRunsController.createRun("Cow Feed")
|
||||||
|
ADRunsController.updateRun(orphanRun.id, {targetWayPointId = 30})
|
||||||
|
ADRunsController.assignVehicle(orphanRun.id, orphan)
|
||||||
|
check("W15 ingen ventning før", ADUnloadWait.getWaitFor(orphan), nil)
|
||||||
|
ADUnloadWait.adoptOrphans(FS25_AutoDrive)
|
||||||
|
local adopted = ADUnloadWait.getWaitFor(orphan)
|
||||||
|
check("W15 ventning genoptaget", adopted ~= nil and adopted.markerName, "Wait 1")
|
||||||
|
check("W15 Wait-punktet reserveret", ADWaitPool.getOwner(40), orphan)
|
||||||
|
check("W15 hjem-mål husket", ADUnloadWait.getPendingTargetRestore(orphan), 30)
|
||||||
|
check("W15 logget", logLines[#logLines]:find("genoptager", 1, true) ~= nil, true)
|
||||||
|
ADUnloadWait.adoptOrphans(FS25_AutoDrive)
|
||||||
|
check("W15 ikke dobbelt", ADWaitPool.getOwner(40), orphan)
|
||||||
|
waitBarnLevels[STRAW] = 0 -- plads til hele resten
|
||||||
|
UnloadTask.update(orphanTask, 16)
|
||||||
|
check("W15 kører hjem", orphanTask.destinationID, 30)
|
||||||
|
check("W15 AD's mål gendannet", orphan.ad.stateModule.secondMarkerId, 30)
|
||||||
|
testVehicles = {}
|
||||||
|
|
||||||
-- X: udkørsel koblet på getNextPickup-wrap'en og Wait-logikken
|
-- X: udkørsel koblet på getNextPickup-wrap'en og Wait-logikken
|
||||||
resetWorld()
|
resetWorld()
|
||||||
addMarker(1, "Suger Load", "Pickup points", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 1000}))
|
addMarker(1, "Suger Load", "Pickup points", 0, 0); table.insert(stations, makeStation(101, 0, 15, {[WHEAT] = 1000}))
|
||||||
|
|||||||
Reference in New Issue
Block a user