From 784144cd4eb3daef82a1a4c6cb5a016e78e59a5c Mon Sep 17 00:00:00 2001 From: masterdraco Date: Tue, 29 Sep 2026 23:23:20 +0200 Subject: [PATCH] =?UTF-8?q?fix(afl=C3=A6sning):=20tipvogn=20skiftes=20til?= =?UTF-8?q?=20en=20tip-side=20AD=20m=C3=A5=20afl=C3=A6sse=20fra?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit EDK 650 Unrealistic har kun allowAIDischarge på bagudtip; på venstre/højre/ kornluge åbnede AD aflæsningen, men intet løb ud (Chicken Food 2 786.712 l hvede ved Farma med plads; Disponibel Vogn 3 fuld af løg). CP-genstart logger kun ved ændring (v1.60.16.0). --- CHANGELOG.md | 3 ++ FS25_ADSmartPickup/adCpResume.lua | 7 +++- FS25_ADSmartPickup/adTipSide.lua | 58 +++++++++++++++++++++++++++++ FS25_ADSmartPickup/adUnloadWait.lua | 12 ++++++ FS25_ADSmartPickup/modDesc.xml | 3 +- 5 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 FS25_ADSmartPickup/adTipSide.lua diff --git a/CHANGELOG.md b/CHANGELOG.md index a550d0a..68861ed 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,9 @@ står i [docs/BRUGERMANUAL.md](docs/BRUGERMANUAL.md) (dansk) og [docs/USER_MANUA ## 1.60 — "Kræver handling" → flow, menuplacering, flow-vogne i guiden +- **1.60.16** Tipvogne skiftes under AD-aflæsning til en tip-side, AutoDrive må aflæsse fra (`allowAIDischarge`). + Farmtech EDK 650 (Unrealistic) tillader kun bagudtip; stod den på venstre, højre eller kornluge, åbnede AD + aflæsningen, men intet løb ud, og vognen holdt med fuldt læs. CP-genstartslisten logges kun, når den ændrer sig. - **1.60.15** Humle (HOPS, Dakota) behandles som vinafgrøde: aldrig slåafgrøde, og markmaskiner kører på rækkerne som ved druer. - **1.60.14** Afkobling ved redskabets egen parkering godtager 8 m (før 5 m): lange redskaber som en valse står med roden over 5 m inde i båsen, så afkoblingen fejlede med "stoppedAway". diff --git a/FS25_ADSmartPickup/adCpResume.lua b/FS25_ADSmartPickup/adCpResume.lua index ed414d6..e7c8fbe 100644 --- a/FS25_ADSmartPickup/adCpResume.lua +++ b/FS25_ADSmartPickup/adCpResume.lua @@ -110,7 +110,12 @@ function ADCpResume.save(adEnv) end xmlFile:save() xmlFile:delete() - Logging.info(ADCpResume.LOG_PREFIX .. "gemt: %d maskine(r) kører Courseplay", #ids) + -- gemmes ved hver runs-gem (flere gange i minuttet): log kun når listen ændrer sig + local signature = table.concat(ids, ",") + if signature ~= ADCpResume.lastLogged then + ADCpResume.lastLogged = signature + Logging.info(ADCpResume.LOG_PREFIX .. "gemt: %d maskine(r) kører Courseplay", #ids) + end return true end diff --git a/FS25_ADSmartPickup/adTipSide.lua b/FS25_ADSmartPickup/adTipSide.lua new file mode 100644 index 0000000..1bff405 --- /dev/null +++ b/FS25_ADSmartPickup/adTipSide.lua @@ -0,0 +1,58 @@ +-- AD Tip Side +-- Tipvogne med flere tip-sider (fx Farmtech EDK 650 Unrealistic: bag / kornluge / venstre / højre) tillader kun +-- AI-aflæsning (allowAIDischarge) på nogle af udløbene. Står vognen på en side uden, åbner AD aflæsningen ved +-- målet, men intet løber ud — vognen holder med fuldt læs (in-game 29/9: Chicken Food 2 med 786.712 l hvede på +-- højre side ved en Farma med 10 mio. l fri; Disponibel Vogn 3 fuld af løg). Når AD kører en vogn, skiftes den til +-- en side, AI må aflæsse fra. + +ADTipSide = {} +ADTipSide.LOG_PREFIX = "ADSmartPickup: tip-side: " + +-- ---- ren logik ---- + +-- sides = {{node = udløbsindeks}}, allowAI = {[udløbsindeks] = true}, current = nuværende side +-- -> sideindeks der skal vælges, eller nil (nuværende er fin / ingen side tilladt / ukendt) +function ADTipSide.choose(sides, allowAI, current) + local currentSide = (sides or {})[current] + if currentSide ~= nil and (allowAI or {})[currentSide.node] then return nil end + for index, side in ipairs(sides or {}) do + if (allowAI or {})[side.node] then return index end + end + return nil +end + +-- ---- spil ---- + +local warned = setmetatable({}, {__mode = "k"}) + +local function sidesOf(object) + local spec = object.spec_trailer + local dis = object.spec_dischargeable + if spec == nil or dis == nil or spec.tipSides == nil or #spec.tipSides < 2 then return nil end + local sides, allowAI = {}, {} + for index, side in ipairs(spec.tipSides) do sides[index] = {node = side.dischargeNodeIndex} end + for index, node in ipairs(dis.dischargeNodes or {}) do + if node.allowAIDischarge then allowAI[index] = true end + end + return sides, allowAI, spec.preferedTipSideIndex +end + +-- Alle tipvogne bag traktoren: skift til en AI-tilladt side (kun mens vognen ikke tipper). +function ADTipSide.ensure(vehicle) + local children = vehicle.getChildVehicles ~= nil and vehicle:getChildVehicles() or {} + for _, object in pairs(children) do + if object ~= vehicle and object.setPreferedTipSide ~= nil then + local sides, allowAI, current = sidesOf(object) + local tipping = Trailer ~= nil and object.getTipState ~= nil and object:getTipState() ~= Trailer.TIPSTATE_CLOSED + local index = sides ~= nil and not tipping and ADTipSide.choose(sides, allowAI, current) or nil + if index ~= nil then + object:setPreferedTipSide(index) + if not warned[object] then + warned[object] = true + Logging.info(ADTipSide.LOG_PREFIX .. "'%s': tip-side %s -> %d (AutoDrive må kun aflæse fra den side)", + tostring(object.getName ~= nil and object:getName() or "?"), tostring(current), index) + end + end + end + end +end diff --git a/FS25_ADSmartPickup/adUnloadWait.lua b/FS25_ADSmartPickup/adUnloadWait.lua index ce5a923..47f3c7d 100644 --- a/FS25_ADSmartPickup/adUnloadWait.lua +++ b/FS25_ADSmartPickup/adUnloadWait.lua @@ -426,6 +426,9 @@ function ADUnloadWait.getClaims(adEnv) return ADWaitPool.getClaims(adEnv) end +ADUnloadWait.TIP_CHECK_MS = 2000 +local tipChecked = setmetatable({}, {__mode = "k"}) + function ADUnloadWait.install(adEnv) local task, autoDrive = adEnv.UnloadAtDestinationTask, adEnv.AutoDrive if isInstalled or task == nil or task.update == nil or autoDrive == nil or autoDrive.getSetting == nil then @@ -438,6 +441,15 @@ function ADUnloadWait.install(adEnv) local originalUpdate, originalFinished, originalGetSetting = task.update, task.finished, autoDrive.getSetting task.update = function(self, dt) + -- alle aflæsningsture (også udkørsel og tømning): tipvognen på en side AD må aflæsse fra (EDK 650, 29/9) + if ADTipSide ~= nil and self.vehicle ~= nil then + local now = g_time or 0 + if (tipChecked[self.vehicle] or -math.huge) + ADUnloadWait.TIP_CHECK_MS <= now then + tipChecked[self.vehicle] = now + local okTip, errTip = pcall(ADTipSide.ensure, self.vehicle) + if not okTip then Logging.warning(ADUnloadWait.LOG_PREFIX .. "tip-side: %s", tostring(errTip)) end + end + end local ok, err = pcall(ADUnloadWait.beforeUpdate, adEnv, self, dt) if not ok then Logging.warning(ADUnloadWait.LOG_PREFIX .. "fejl i Wait-punkt-logik, AutoDrive fortsætter selv: %s", tostring(err)) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 9e4c50b..e0659ce 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.60.15.0 + 1.60.16.0 <en>AD Smart Pickup</en> @@ -31,6 +31,7 @@ +