From 6af89c3034906ce145cd02d08e07cd7db3f5255c Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 14:18:11 +0200 Subject: [PATCH] =?UTF-8?q?fix(flows):=20t=C3=B8mning=20ved=20stop=20giver?= =?UTF-8?q?=20ikke=20l=C3=A6ngere=2010=20min=20ved=20et=20fuldt=20m=C3=A5l?= =?UTF-8?q?=20=E2=80=94=2045=20s=20ved=20m=C3=A5let=20uden=20at=20l=C3=A6s?= =?UTF-8?q?set=20falder=20->=20silo,=20ellers=20parkering=20med=20last;=20?= =?UTF-8?q?Wait-pulje/l=C3=A6s-bytte=20sl=C3=A5et=20fra=20under=20t=C3=B8m?= =?UTF-8?q?ning=20(v1.55.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adFlowWagons.lua | 34 +++++++++++++++++++++++++++-- FS25_ADSmartPickup/adUnloadWait.lua | 6 +++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adFlowWagons.lua | 7 ++++++ 4 files changed, 46 insertions(+), 3 deletions(-) diff --git a/FS25_ADSmartPickup/adFlowWagons.lua b/FS25_ADSmartPickup/adFlowWagons.lua index 43f3dfd..df2d3a5 100644 --- a/FS25_ADSmartPickup/adFlowWagons.lua +++ b/FS25_ADSmartPickup/adFlowWagons.lua @@ -105,6 +105,14 @@ end -- -> "home" | "target" | "dump" | "wait" | "giveUp" ADFlowWagons.EMPTY_MIN_LITERS = 100 ADFlowWagons.EMPTY_TIMEOUT_MS = 600000 +ADFlowWagons.EMPTY_STALL_MS = 45000 -- ved målet uden at læsset falder så længe = målet er fuldt +ADFlowWagons.EMPTY_NEAR_M = 40 -- m fra aflæsningsmarkøren tæller som "ved målet" + +-- s = {nearTarget, sinceChangeMs} +function ADFlowWagons.isStalled(s) + return s.nearTarget == true and (s.sinceChangeMs or 0) >= ADFlowWagons.EMPTY_STALL_MS +end + function ADFlowWagons.emptyStep(stage, s) local cargo = s.cargo or 0 if stage == "start" then @@ -112,6 +120,7 @@ function ADFlowWagons.emptyStep(stage, s) return s.hasTarget and "target" or "dump" end if (s.elapsedMs or 0) >= ADFlowWagons.EMPTY_TIMEOUT_MS then return "giveUp" end + if s.stalled and cargo >= ADFlowWagons.EMPTY_MIN_LITERS then return stage == "target" and "dump" or "giveUp" end if s.adActive then return "wait" end if cargo < ADFlowWagons.EMPTY_MIN_LITERS then return "home" end if stage == "target" then return "dump" end @@ -363,6 +372,7 @@ local function startDump(adEnv, vehicle, state) return end state.stage, state.since = "dump", nowMs + state.markerId, state.markerName, state.lastCargo = marker.id, marker.name, nil ADFieldWork.startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DELIVERTO, marker.id, nil, fillType) Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' aflæsser resten (%d l %s) ved %s før parkering", tostring(ADRuns.vehicleLabel(vehicle)), math.floor(cargo), fillName(fillType), tostring(marker.name)) @@ -384,7 +394,8 @@ function ADFlowWagons.homeVehicle(adEnv, vehicle, runName) local cargo, fillType = cargoOf(adEnv, vehicle) local action = ADFlowWagons.emptyStep("start", {cargo = cargo, hasTarget = target ~= nil}) if action == "home" then return goHome(adEnv, vehicle) end - local state = {stage = action, since = nowMs, runName = runName} + local state = {stage = action, since = nowMs, runName = runName, + markerId = target ~= nil and target.id or nil, markerName = target ~= nil and target.name or nil} emptying[vehicle] = state if action == "target" then ADFieldWork.startAd(adEnv, vehicle, adEnv.AutoDrive.MODE_DELIVERTO, target.id, nil, fillType) @@ -412,6 +423,20 @@ function ADFlowWagons.sendHome(adEnv, run) end end +-- Står traktoren ved tømningens markør, uden at læsset er faldet i EMPTY_STALL_MS? +local function stalledAt(adEnv, vehicle, state, cargo) + if state.lastCargo == nil or cargo < state.lastCargo - 1 then + state.lastCargo, state.changedAt = cargo, nowMs + end + local wayPoint = state.markerId ~= nil and adEnv.ADGraphManager:getWayPointById(state.markerId) or nil + local near = false + if wayPoint ~= nil and vehicle.rootNode ~= nil then + local x, _, z = getWorldTranslation(vehicle.rootNode) + near = math.sqrt((x - wayPoint.x) ^ 2 + (z - wayPoint.z) ^ 2) <= ADFlowWagons.EMPTY_NEAR_M + end + return ADFlowWagons.isStalled({nearTarget = near, sinceChangeMs = nowMs - (state.changedAt or nowMs)}) +end + local function tickEmptying(adEnv) local list = {} for vehicle, state in pairs(emptying) do table.insert(list, {vehicle = vehicle, state = state}) end @@ -423,8 +448,13 @@ local function tickEmptying(adEnv) if controlled then emptying[vehicle] = nil -- spilleren har overtaget else + local stalled = stalledAt(adEnv, vehicle, state, cargo) local action = ADFlowWagons.emptyStep(state.stage, {cargo = cargo, adActive = module ~= nil and module:isActive(), - elapsedMs = nowMs - state.since}) + elapsedMs = nowMs - state.since, stalled = stalled}) + if stalled and action ~= "wait" then + Logging.info(ADFlowWagons.LOG_PREFIX .. "'%s' kan ikke aflæsse ved %s (fuldt?) — videre", tostring(ADRuns.vehicleLabel(vehicle)), + tostring(state.markerName)) + end if action == "home" then goHome(adEnv, vehicle) elseif action == "dump" then diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index 32dbd1b..4b50467 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -295,6 +295,12 @@ function ADUnloadWait.beforeUpdate(adEnv, task, dt) if ADOutbound ~= nil and ADOutbound.isOutboundVehicle ~= nil and ADOutbound.isOutboundVehicle(task.vehicle) then return end + -- Tømning efter stop (ADFlowWagons): ingen Wait-pulje eller læs-bytte — den skal tømme og hjem + -- (in-game 29/9: Goat Food blev sendt til Cow Wait efter Stop alt) + if ADFlowWagons ~= nil and ADFlowWagons.isEmptying ~= nil and ADFlowWagons.isEmptying(task.vehicle) then + if waits[task.vehicle] ~= nil then release(task.vehicle) end + return + end pcall(debugAtTarget, adEnv, task, dt) local wait = waits[task.vehicle] if wait ~= nil then diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 7de2bc4..93b7ed0 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.55.0.0 + 1.55.1.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFlowWagons.lua b/tests/test_adFlowWagons.lua index 7bb80d8..e21b2f6 100644 --- a/tests/test_adFlowWagons.lua +++ b/tests/test_adFlowWagons.lua @@ -98,5 +98,12 @@ check("ledig: stoppet flow, tømmer/kører hjem", W.tractorFree({hasRun = true, check("vent-årsag: traktor optaget", W.waitReason({tractorBusy = true}), "tractorBusy") check("vent-årsag: vogn på en anden", W.waitReason({wagonAttached = true}), "wagonAttached") check("vent-årsag: vogn reserveret", W.waitReason({wagonBusy = true}), "wagonReserved") +-- tømning går i stå ved et fuldt mål (in-game 29/9: fåre-/BGA-vogne stod 10 min ved fuldt mål efter Stop alt) +check("tøm: står ved fuldt mål -> silo", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = true}), "dump") +check("tøm: står ved silo uden at tømme -> giv op", W.emptyStep("dump", {cargo = 5000, adActive = true, stalled = true}), "giveUp") +check("tøm: kører mod målet (ikke i stå) -> vent", W.emptyStep("target", {cargo = 5000, adActive = true, stalled = false}), "wait") +check("i stå: tæt på, uændret længe", W.isStalled({nearTarget = true, sinceChangeMs = W.EMPTY_STALL_MS}), true) +check("i stå: tæt på, lige ankommet", W.isStalled({nearTarget = true, sinceChangeMs = 5000}), false) +check("i stå: på vej (langt væk)", W.isStalled({nearTarget = false, sinceChangeMs = 999999}), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)