From bcfa2373216698e68e1def1bec3809b039d28084 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Sun, 27 Sep 2026 14:43:21 +0200 Subject: [PATCH] =?UTF-8?q?fix(markarbejde):=20CP=20startes=20ved=20sidste?= =?UTF-8?q?=20punkt=20(eget=20kursus=20+=20husket=20waypoint)=20eller=20n?= =?UTF-8?q?=C3=A6rmeste=20punkt=20(p=C3=A5begyndt=20h=C3=B8st/sl=C3=A5ning?= =?UTF-8?q?)=20i=20stedet=20for=20CP's=20standard=20'first'=20=E2=80=94=20?= =?UTF-8?q?F111=20blev=20h=C3=B8stet=20forfra=20(v1.38.4.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adCpBridge.lua | 6 ++++++ FS25_ADSmartPickup/adFieldJobs.lua | 12 ++++++++++++ FS25_ADSmartPickup/adFieldWork.lua | 6 ++++++ FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adFieldJobs.lua | 12 ++++++++++++ 5 files changed, 37 insertions(+), 1 deletion(-) diff --git a/FS25_ADSmartPickup/adCpBridge.lua b/FS25_ADSmartPickup/adCpBridge.lua index 2c0e142..29c132b 100644 --- a/FS25_ADSmartPickup/adCpBridge.lua +++ b/FS25_ADSmartPickup/adCpBridge.lua @@ -513,6 +513,12 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts) local params = job.cpJobParameters if params ~= nil and params.fieldPosition ~= nil then params.fieldPosition:setPosition(fieldX, fieldZ) end if params ~= nil and params.startPosition ~= nil then params.startPosition:setPosition(vx, vz) end + -- startpunkt i kurset: CP's standard er "first" (forfra) — "nearest"/"last" på en påbegyndt mark + local startAtValues = CpFieldWorkJobParameters ~= nil and {first = CpFieldWorkJobParameters.START_AT_FIRST_POINT, + nearest = CpFieldWorkJobParameters.START_AT_NEAREST_POINT, last = CpFieldWorkJobParameters.START_AT_LAST_POINT} or {} + if opts.startAt ~= nil and startAtValues[opts.startAt] ~= nil and params ~= nil and params.startAt ~= nil then + pcall(function() params.startAt:setValue(startAtValues[opts.startAt]) end) + end job:setValues() local handle = {cancelled = false, fired = false, finished = false} local function finish(ok, reason) diff --git a/FS25_ADSmartPickup/adFieldJobs.lua b/FS25_ADSmartPickup/adFieldJobs.lua index 47db921..46d8840 100644 --- a/FS25_ADSmartPickup/adFieldJobs.lua +++ b/FS25_ADSmartPickup/adFieldJobs.lua @@ -68,6 +68,18 @@ function ADFieldJobs.resumeField(x, z, role, fields) return nil end +-- Hvor Courseplay skal starte i kurset: "last" (eget kursus + husket waypoint = fortsæt præcis), "nearest" +-- (marken er allerede delvist høstet/slået), ellers "first". CP's eget standardvalg er "first" — også på en +-- halvt høstet mark (in-game 27/9: mejetærskeren startede F111 forfra). +-- s = {reuse, remembered, stage, standingRatio} +ADFieldJobs.PARTLY_DONE_RATIO = 0.95 +function ADFieldJobs.startAtFor(s) + if s.reuse and s.remembered then return "last" end + local cropStage = s.stage == "harvesting" or s.stage == "mowing" + if cropStage and type(s.standingRatio) == "number" and s.standingRatio < ADFieldJobs.PARTLY_DONE_RATIO then return "nearest" end + return "first" +end + -- Beslutning for én mark. assignments = sæt på marken ({phase, stage, helper}); kun sæt på det aktuelle -- trin tæller (en aflæsningsvogn på vej hjem fra høsten forstyrrer ikke kultiveringen). -- env = {raining = bool}: vejrfølsomme trin (høst/slå/vend/riv/hø) sendes ikke ud i regn. diff --git a/FS25_ADSmartPickup/adFieldWork.lua b/FS25_ADSmartPickup/adFieldWork.lua index d616284..3b5bfd0 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -773,6 +773,12 @@ local function beginWork(adEnv, field, info, assignment) -- genbrug af Courseplay-kurser: maskinens eget / en andens matchende kursus frem for ny beregning local cacheContext opts, cacheContext = ADCourseCache.prepare(adEnv, field, info, assignment, opts) + -- påbegyndt mark: fortsæt/start nærmest i stedet for forfra (CP's standard) + opts = opts or {} + local remembered = vehicle.getCpLastRememberedWaypointIx ~= nil and vehicle:getCpLastRememberedWaypointIx() ~= nil + opts.startAt = ADFieldJobs.startAtFor({reuse = opts.reuse == true, remembered = remembered, stage = field.stage, + standingRatio = info.standingRatio}) + if opts.startAt ~= "first" then log(field.id, "'%s' starter kurset ved %s punkt (marken er påbegyndt)", ADRuns.vehicleLabel(vehicle), opts.startAt == "last" and "sidste" or "nærmeste") end assignment.phase = "starting" assignment.since = now() local handle, err = ADCpBridge.start(vehicle, point.x, point.z, function(ok, reason) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index df8d002..c954356 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.38.3.0 + 1.38.4.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFieldJobs.lua b/tests/test_adFieldJobs.lua index acb3613..18e56e9 100644 --- a/tests/test_adFieldJobs.lua +++ b/tests/test_adFieldJobs.lua @@ -131,5 +131,17 @@ do check("RF på kanten tæller som indenfor", ADFieldJobs.resumeField(0.5, 50, "collector", fields), 90) end + +-- startAt: hvor Courseplay skal starte i kurset (CP's standard er "first" = forfra, også på en halvt høstet mark; +-- in-game 27/9: mejetærskeren startede F111 forfra) +check("SA eget kursus med husket waypoint -> last", ADFieldJobs.startAtFor({reuse = true, remembered = true, stage = "harvesting", standingRatio = 0.4}), "last") +check("SA halvt høstet -> nearest", ADFieldJobs.startAtFor({stage = "harvesting", standingRatio = 0.4}), "nearest") +check("SA halvt slået -> nearest", ADFieldJobs.startAtFor({stage = "mowing", standingRatio = 0.5}), "nearest") +check("SA urørt mark -> first", ADFieldJobs.startAtFor({stage = "harvesting", standingRatio = 1}), "first") +check("SA næsten urørt (97 %) -> first", ADFieldJobs.startAtFor({stage = "harvesting", standingRatio = 0.97}), "first") +check("SA ukendt fremdrift -> first", ADFieldJobs.startAtFor({stage = "harvesting"}), "first") +check("SA klargøring (ingen afgrøde at måle) -> first", ADFieldJobs.startAtFor({stage = "cultivating", standingRatio = 0.3}), "first") +check("SA husket waypoint uden eget kursus -> ikke last", ADFieldJobs.startAtFor({reuse = false, remembered = true, stage = "cultivating"}), "first") + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)