fix(pulje/flows): redskab koblet på uden ejer (hentet før genindlæsning) sættes tilbage efter 2 min; flow husker kun vogn når et kørende flow stoppes, ikke ved oprydning efter indlæsning (v1.60.4.0)

This commit is contained in:
2026-09-29 19:03:49 +02:00
parent 02bd9b8fd4
commit 1c6cda3c10
3 changed files with 56 additions and 5 deletions
+47 -4
View File
@@ -44,6 +44,19 @@ function ADFlowWagons.startAfterManualAttach(s)
return s.flowRunning == true and s.ownWagon == true and not s.adActive
end
-- Husk vognen bag traktoren ved hjemtur? Kun når et KØRENDE flow stoppes (reason "stop") — ved oprydning efter
-- indlæsning ("afterLoad") kan traktoren have et puljeredskab på fra et lån (in-game 29/9).
function ADFlowWagons.shouldRememberOnHome(reason)
return reason == "stop"
end
-- Påkobling uden ejer (hentet før genindlæsning, markopgaven tabt): s = {owned, idleMs} -> "home"|"wait"|"none"
ADFlowWagons.ORPHAN_MS = 120000
function ADFlowWagons.orphanAction(s)
if s.owned then return "none" end
return (s.idleMs or 0) >= ADFlowWagons.ORPHAN_MS and "home" or "wait"
end
-- Hvorfor "wait" (til loggen). s som startAction.
function ADFlowWagons.waitReason(s)
if s.tractorBusy then return "tractorBusy" end
@@ -147,6 +160,7 @@ local emptying = setmetatable({}, {__mode = "k"}) -- traktor -> {stage, since, f
local homing = setmetatable({}, {__mode = "k"}) -- traktor -> true (flowets hjemtur: vogn af, traktor hjem)
local fetchRetries = setmetatable({}, {__mode = "k"}) -- traktor -> antal nye hente-forsøg
local lastWaitText = setmetatable({}, {__mode = "k"}) -- traktor -> sidst loggede venteårsag (kun ændringer logges)
local orphans = setmetatable({}, {__mode = "k"}) -- traktor -> ms siden påkobling uden ejer
local missingCount = {} -- runId -> tjek i træk
local seenBuildings = {} -- bygnings-id'er set i denne session
local rememberTimer, buildingTimer = 0, 0
@@ -421,9 +435,12 @@ local function rememberWagonOf(vehicle)
end
-- Én traktor hjem (fra et stoppet/slettet flow): tøm først, så parkering.
function ADFlowWagons.homeVehicle(adEnv, vehicle, runName)
-- reason: "stop" (et kørende flow stoppes: vognen huskes) | "afterLoad" (oprydning: intet huskes)
function ADFlowWagons.homeVehicle(adEnv, vehicle, runName, reason)
waiting[vehicle] = nil
rememberWagonOf(vehicle) -- vognen sættes af nu: flowet skal kunne finde den igen ved næste start
if ADFlowWagons.shouldRememberOnHome(reason or "stop") then
rememberWagonOf(vehicle) -- vognen sættes af nu: flowet skal kunne finde den igen ved næste start
end
ADHitch.stow(vehicle, "flowet stoppet")
if fetching[vehicle] ~= nil then
fetching[vehicle] = nil
@@ -452,6 +469,7 @@ end
-- ADHitch: spilleren har selv kørt traktoren til Connect og koblet på.
function ADFlowWagons.onManualAttach(adEnv, vehicle, wagon)
local run = ADRunsController.getRunForVehicle(vehicle)
orphans[vehicle] = 0 -- ryddes af tickOrphans når nogen ejer opgaven (flow, markopgave, AD, spilleren)
if run == nil then return end
local tractorId = ADRunsController.getVehicleId(vehicle)
local wagonId = wagon ~= nil and ADRunsController.getVehicleId(wagon) or nil
@@ -461,11 +479,34 @@ function ADFlowWagons.onManualAttach(adEnv, vehicle, wagon)
if not ADFlowWagons.startAfterManualAttach({flowRunning = not run.stopped,
ownWagon = wagonId ~= nil and (remembered == nil or remembered == wagonId),
adActive = module ~= nil and module:isActive()}) then return end
fetchRetries[vehicle], waiting[vehicle] = nil, nil
fetchRetries[vehicle], waiting[vehicle], orphans[vehicle] = nil, nil, nil
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s': '%s' har selv hentet sin vogn — startes", tostring(run.name), tostring(ADRuns.vehicleLabel(vehicle)))
ADRunsController.startVehicle(adEnv, run, vehicle)
end
-- Traktorer der har koblet et redskab på uden ejer: efter ORPHAN_MS sættes redskabet tilbage og traktoren kører hjem.
local function tickOrphans(adEnv, elapsed)
for vehicle, idle in pairs(orphans) do
local id = ADRunsController.getVehicleId(vehicle)
local run = ADRunsController.getRunForVehicle(vehicle)
local module = vehicle.ad ~= nil and vehicle.ad.stateModule or nil
local owned = (module ~= nil and module:isActive()) or (vehicle.getIsControlled ~= nil and vehicle:getIsControlled())
or (run ~= nil and not run.stopped) or (ADFieldJobs ~= nil and id ~= nil and ADFieldJobs.state.assignments[id] ~= nil)
or (ADCpBridge ~= nil and ADCpBridge.isWorking(vehicle)) or #ADHitch.rearImplementsOf(vehicle) == 0
local action = ADFlowWagons.orphanAction({owned = owned, idleMs = idle + elapsed})
if action == "none" then
orphans[vehicle] = nil
elseif action == "home" then
orphans[vehicle] = nil
Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' har et redskab på uden opgave (hentet før genindlæsning?) — sættes tilbage og kører hjem",
tostring(ADRuns.vehicleLabel(vehicle)))
goHome(adEnv, vehicle)
else
orphans[vehicle] = idle + elapsed
end
end
end
function ADFlowWagons.isEmptying(vehicle)
return emptying[vehicle] ~= nil
end
@@ -601,7 +642,7 @@ local function cleanupAfterLoad(adEnv)
and not ADFlowWagons.isPoolBusy(vehicle, vehicleId) then
Logging.info(ADFlowWagons.LOG_PREFIX .. "flow '%s' er stoppet: '%s' tømmer og sætter sin vogn på plads", tostring(run.name),
tostring(ADRuns.vehicleLabel(vehicle)))
pcall(ADFlowWagons.homeVehicle, adEnv, vehicle, run.name)
pcall(ADFlowWagons.homeVehicle, adEnv, vehicle, run.name, "afterLoad")
end
end
end
@@ -617,6 +658,8 @@ function ADFlowWagons.tick(adEnv, dt)
emptyTimer = emptyTimer + dt
if emptyTimer >= 2000 then
emptyTimer = 0
local okOrphan, errOrphan = pcall(tickOrphans, adEnv, 2000)
if not okOrphan then Logging.warning(ADFlowWagons.LOG_PREFIX .. "redskaber uden opgave: %s", tostring(errOrphan)) end
local okEmpty, errEmpty = pcall(tickEmptying, adEnv)
if not okEmpty then Logging.warning(ADFlowWagons.LOG_PREFIX .. "tømning: %s", tostring(errEmpty)) end
end