diff --git a/FS25_ADSmartPickup/adHitch.lua b/FS25_ADSmartPickup/adHitch.lua index 517431e..fc4f50a 100644 --- a/FS25_ADSmartPickup/adHitch.lua +++ b/FS25_ADSmartPickup/adHitch.lua @@ -107,6 +107,12 @@ function ADHitch.newJob(markerId, markerName, action) actElapsed = 0, seenActive = false} end +-- Afkobling bekræftes: "done" først når intet sidder bag traktoren efter et forsøg. -> "attempt" | "done" | "nothing" +function ADHitch.detachStep(rearCount, attempted) + if rearCount > 0 then return "attempt" end + return attempted and "done" or "nothing" +end + -- Et skridt i jobbet. succeeded = lykkedes kobling/afkobling i denne tick (kun relevant i "acting"). -- Tilstande: driving -> acting -> done | failed (reason: stoppedAway / noAttachable / nothingToDetach) function ADHitch.step(job, state, dt, succeeded) @@ -251,10 +257,13 @@ local function parkIdOf(adEnv, vehicle) return marker ~= nil and marker.id or nil end --- Kobler redskaberne bag traktoren af. -> ok, navne eller årsag -function ADHitch.tryDetach(vehicle) +-- Kobler redskaberne bag traktoren af. -> ok, navne eller årsag. Med job bekræftes afkoblingen ved næste tick +-- (ok først når intet sidder bagpå); uden job (konsol) meldes ok straks efter kaldet. +function ADHitch.tryDetach(vehicle, job) local rear = ADHitch.rearImplements(attachedImplements(vehicle)) - if #rear == 0 then return false, "nothingToDetach" end + local step = ADHitch.detachStep(#rear, job ~= nil and job.detachNames ~= nil) + if step == "done" then return true, job.detachNames end + if step == "nothing" then return false, "nothingToDetach" end local names = {} for _, implement in ipairs(rear) do local object = implement.object @@ -270,7 +279,15 @@ function ADHitch.tryDetach(vehicle) vehicle:detachImplementByObject(object) table.insert(names, implement.name) end - return true, table.concat(names, ", ") + if job == nil then return true, table.concat(names, ", ") end + if job.detachNames ~= nil then + job.detachRetries = (job.detachRetries or 0) + 1 + if job.detachRetries == 1 then + Logging.warning(ADHitch.LOG_PREFIX .. "'%s': '%s' sidder der stadig efter afkobling — prøver igen", vehicleName(vehicle), table.concat(names, ", ")) + end + end + job.detachNames = job.detachNames or table.concat(names, ", ") + return false, "stillAttached: " .. table.concat(names, ", ") end local function start(adEnv, vehicle, markerId, action, onDone) @@ -425,7 +442,7 @@ function ADHitch.tick(adEnv, dt) for vehicle, job in pairs(current) do local succeeded, detail = false, nil if job.state == "acting" then - succeeded, detail = ACTIONS[job.action](vehicle) + succeeded, detail = ACTIONS[job.action](vehicle, job) if not succeeded then job.lastReason = detail end end local state = vehicleState(adEnv, vehicle, job.markerId) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 9af3b3f..8ae9ad9 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.53.1.0 + 1.53.2.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adHitch.lua b/tests/test_adHitch.lua index be266f8..80eb635 100644 --- a/tests/test_adHitch.lua +++ b/tests/test_adHitch.lua @@ -109,5 +109,11 @@ for _ = 1, 16 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 50 check("afkobling: stadig i gang efter 8 s (folder ud)", foldJob.state, "acting") for _ = 1, 30 do H.step(foldJob, {adActive = false, distance = 1, speed = 0}, 500, false) end check("afkobling: opgivet efter sin frist", foldJob.state, "failed") +-- afkobling bekræftes: først "done" når intet sidder bag traktoren efter et forsøg (in-game 29/9: loggede +-- "koblede af", men vognen sad der stadig, og traktoren kørte med den) +check("afkobl: redskab bagpå -> forsøg", H.detachStep(1, false), "attempt") +check("afkobl: forsøgt, sidder der stadig -> forsøg igen", H.detachStep(1, true), "attempt") +check("afkobl: forsøgt, intet bagpå -> færdig", H.detachStep(0, true), "done") +check("afkobl: intet bagpå fra start", H.detachStep(0, false), "nothing") print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)