From fece920028b7b287b356d1cedf7ff84d8651c67f Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 14:58:10 +0200 Subject: [PATCH] =?UTF-8?q?feat(flows):=20traktor=20i=20et=20k=C3=B8rende?= =?UTF-8?q?=20flow=20startes=20n=C3=A5r=20spilleren=20selv=20har=20k=C3=B8?= =?UTF-8?q?rt=20den=20til=20Connect=20og=20koblet=20dens=20vogn=20p=C3=A5?= =?UTF-8?q?=20(v1.56.2.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adFlowWagons.lua | 22 ++++++++++++++++++++++ FS25_ADSmartPickup/adHitch.lua | 14 ++++++++++---- FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adFlowWagons.lua | 6 ++++++ 4 files changed, 39 insertions(+), 5 deletions(-) diff --git a/FS25_ADSmartPickup/adFlowWagons.lua b/FS25_ADSmartPickup/adFlowWagons.lua index be22302..ddcf997 100644 --- a/FS25_ADSmartPickup/adFlowWagons.lua +++ b/FS25_ADSmartPickup/adFlowWagons.lua @@ -39,6 +39,11 @@ function ADFlowWagons.retryFetch(reason, retries) return tostring(reason):find("^stoppedAway") ~= nil and (retries or 0) < ADFlowWagons.FETCH_RETRIES end +-- s = {flowRunning, ownWagon, adActive} -> start traktoren efter spillerens egen påkobling? +function ADFlowWagons.startAfterManualAttach(s) + return s.flowRunning == true and s.ownWagon == true and not s.adActive +end + -- Hvorfor "wait" (til loggen). s som startAction. function ADFlowWagons.waitReason(s) if s.tractorBusy then return "tractorBusy" end @@ -421,6 +426,22 @@ function ADFlowWagons.homeVehicle(adEnv, vehicle, runName) end end +-- ADHitch: spilleren har selv kørt traktoren til Connect og koblet på. +function ADFlowWagons.onManualAttach(adEnv, vehicle, wagon) + local run = ADRunsController.getRunForVehicle(vehicle) + if run == nil then return end + local tractorId = ADRunsController.getVehicleId(vehicle) + local wagonId = wagon ~= nil and ADRunsController.getVehicleId(wagon) or nil + local remembered = (run.wagons or {})[tractorId] + local module = vehicle.ad ~= nil and vehicle.ad.stateModule or nil + if not ADFlowWagons.startAfterManualAttach({flowRunning = not run.stopped and ADRunsController.runningRuns[run.id] == true, + ownWagon = wagonId ~= nil and (remembered == nil or remembered == wagonId), + adActive = module ~= nil and module:isActive()}) then return end + fetchRetries[vehicle], waiting[vehicle] = 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 + function ADFlowWagons.isEmptying(vehicle) return emptying[vehicle] ~= nil end @@ -567,6 +588,7 @@ local emptyTimer = 0 function ADFlowWagons.tick(adEnv, dt) if adEnv == nil or ADRunsController.store == nil then return end + if ADHitch ~= nil and ADHitch.onManualAttach == nil then ADHitch.onManualAttach = ADFlowWagons.onManualAttach end nowMs = nowMs + dt emptyTimer = emptyTimer + dt if emptyTimer >= 2000 then diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index 70a2c72..f0a977a 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -473,7 +473,7 @@ end local DONE_TEXT = {attach = "koblede '%s' på", detach = "koblede '%s' af", arrive = "er fremme%s"} local FAIL_TEXT = {attach = "kunne ikke koble på", detach = "kunne ikke koble af", arrive = "nåede ikke frem"} -local function finish(vehicle, job, ok, detail) +local function finish(vehicle, job, ok, detail, adEnv) jobs[vehicle] = nil if ok then Logging.info(ADHitch.LOG_PREFIX .. "'%s' " .. DONE_TEXT[job.action] .. " ved '%s'", vehicleName(vehicle), @@ -482,7 +482,13 @@ local function finish(vehicle, job, ok, detail) Logging.warning(ADHitch.LOG_PREFIX .. "'%s' %s ved '%s': %s", vehicleName(vehicle), FAIL_TEXT[job.action], job.markerName, tostring(detail)) end - if job.onDone ~= nil then pcall(job.onDone, vehicle, ok, detail) end + if job.onDone ~= nil then + pcall(job.onDone, vehicle, ok, detail) + elseif ok and job.action == "attach" and ADHitch.onManualAttach ~= nil then + -- spillerens egen tur til Connect: lad fx flowet starte traktoren bagefter + local okHook, err = pcall(ADHitch.onManualAttach, adEnv, vehicle, detail) + if not okHook then Logging.warning(ADHitch.LOG_PREFIX .. "efter manuel kobling: %s", tostring(err)) end + end end local ACTIONS = {attach = ADHitch.tryAttach, detach = ADHitch.tryDetach, arrive = function() return true, "" end} @@ -508,9 +514,9 @@ function ADHitch.tick(adEnv, dt) if job.crept then state.arriveDistance = ADHitch.ARRIVE_DISTANCE + ADHitch.CREPT_EXTRA_DISTANCE end ADHitch.step(job, state, elapsed, succeeded) if job.state == "done" then - finish(vehicle, job, true, detail) + finish(vehicle, job, true, detail, adEnv) elseif job.state == "failed" then - finish(vehicle, job, false, job.lastReason or job.reason) + finish(vehicle, job, false, job.lastReason or job.reason, adEnv) end end end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index e69ba85..b76fc7d 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.56.1.0 + 1.56.2.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFlowWagons.lua b/tests/test_adFlowWagons.lua index 492a6c7..1bdbe59 100644 --- a/tests/test_adFlowWagons.lua +++ b/tests/test_adFlowWagons.lua @@ -109,5 +109,11 @@ check("i stå: på vej (langt væk)", W.isStalled({nearTarget = false, sinceChan check("hent igen: stoppedAway første gang", W.retryFetch("stoppedAway (37 m fra markøren)", 0), true) check("hent igen: stoppedAway anden gang -> nej", W.retryFetch("stoppedAway", 1), false) check("hent igen: noAttachable -> nej (markøren skal rettes)", W.retryFetch("noAttachable", 0), false) +-- manuel påkobling (spilleren sendte traktoren til Connect): traktor i et kørende flow startes bagefter +-- (in-game 29/9: Cow Food 3 hentede sin vogn manuelt efter et fejlet forsøg og blev holdende) +check("manuel kobling: kørende flow, egen vogn -> start", W.startAfterManualAttach({flowRunning = true, ownWagon = true}), true) +check("manuel kobling: stoppet flow -> nej", W.startAfterManualAttach({flowRunning = false, ownWagon = true}), false) +check("manuel kobling: AD kører allerede -> nej", W.startAfterManualAttach({flowRunning = true, ownWagon = true, adActive = true}), false) +check("manuel kobling: fremmed vogn -> nej", W.startAfterManualAttach({flowRunning = true, ownWagon = false}), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)