fix(kobling): afkobling bekræftes — først 'koblet af' når intet sidder bag traktoren, ellers nyt forsøg i op til 20 s og turen stoppes; før kørte traktoren videre med vognen (v1.53.2.0)

This commit is contained in:
2026-09-29 14:03:41 +02:00
parent db9fdf2178
commit acbbe04a11
3 changed files with 29 additions and 6 deletions
+22 -5
View File
@@ -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)
+1 -1
View File
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<modDesc descVersion="107">
<author>masterdraco</author>
<version>1.53.1.0</version>
<version>1.53.2.0</version>
<title>
<en>AD Smart Pickup</en>
</title>
+6
View File
@@ -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)