From 5e1d6a3659959b94ea6458817f3cbba6d37f9391 Mon Sep 17 00:00:00 2001 From: masterdraco Date: Sun, 27 Sep 2026 20:06:18 +0200 Subject: [PATCH] =?UTF-8?q?fix(markarbejde):=20CP=20f=C3=A5r=20markens=20p?= =?UTF-8?q?unkt=20n=C3=A6rmest=20traktoren=20som=20position=20(kursets=20s?= =?UTF-8?q?tartsted)=20=E2=80=94=20F17-kurset=20startede=20280=20m=20v?= =?UTF-8?q?=C3=A6k,=20og=20kultivatoren=20k=C3=B8rte=20gennem=20skoven=20(?= =?UTF-8?q?v1.43.1.0)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FS25_ADSmartPickup/adFieldJobs.lua | 12 ++++++++++++ FS25_ADSmartPickup/adFieldWork.lua | 12 +++++++++--- FS25_ADSmartPickup/modDesc.xml | 2 +- tests/test_adFieldJobs.lua | 11 +++++++++++ 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/FS25_ADSmartPickup/adFieldJobs.lua b/FS25_ADSmartPickup/adFieldJobs.lua index 6024ca9..d67cd20 100644 --- a/FS25_ADSmartPickup/adFieldJobs.lua +++ b/FS25_ADSmartPickup/adFieldJobs.lua @@ -123,6 +123,18 @@ function ADFieldJobs.shouldEmptyHarvester(s) return (s.fill or 0) > 0 and s.near == true and not s.busy and not s.controlled and not s.tried end +-- Markens punkt nærmest (x, z) — CP bruger det som kursets startsted. Uden position: første punkt. +function ADFieldJobs.nearestPoint(points, x, z) + if points == nil or points[1] == nil then return nil end + if x == nil or z == nil then return points[1] end + local best, bestD = nil, nil + for _, point in ipairs(points) do + local d = (point.x - x) ^ 2 + (point.z - z) ^ 2 + if bestD == nil or d < bestD then best, bestD = point, d end + end + return best +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 f486e1a..17c0c70 100644 --- a/FS25_ADSmartPickup/adFieldWork.lua +++ b/FS25_ADSmartPickup/adFieldWork.lua @@ -630,7 +630,9 @@ local function beginUnloader(adEnv, field, info, assignment) assignment.storeId = store.id local station = ADSmartPickup.getUnloadStationAtWayPointId(adEnv, store.id, vehicle:getOwnerFarmId()) local markerPoint = adEnv.ADGraphManager:getWayPointById(info.markerId) - local point = info.points[1] or {x = info.x, z = info.z} + -- punktet nærmest traktoren: CP lægger kursets start dér (ikke i den anden ende af marken) + local vx, vz = vehiclePosition(assignment.vehicle) + local point = ADFieldJobs.nearestPoint(info.points, vx, vz) or {x = info.x, z = info.z} assignment.phase = "starting" assignment.since = now() local handle, err = ADCpBridge.startUnloader(vehicle, point.x, point.z, markerPoint ~= nil and markerPoint.x or point.x, @@ -676,7 +678,9 @@ local function beginBaleCollector(adEnv, field, info, assignment) else log(field.id, "intet ballelager med plads og vej fundet — ballesamleren stopper når den er fuld") end - local point = info.points[1] or {x = info.x, z = info.z} + -- punktet nærmest traktoren: CP lægger kursets start dér (ikke i den anden ende af marken) + local vx, vz = vehiclePosition(assignment.vehicle) + local point = ADFieldJobs.nearestPoint(info.points, vx, vz) or {x = info.x, z = info.z} assignment.phase = "starting" assignment.since = now() local handle, err = ADCpBridge.startBaleFinder(vehicle, point.x, point.z, function(ok, reason) @@ -778,7 +782,9 @@ local function beginWork(adEnv, field, info, assignment) math.abs(field.windrowOffset), field.windrowOffset > 0 and "til venstre" or "til højre", target, own) end end - local point = info.points[1] or {x = info.x, z = info.z} + -- punktet nærmest traktoren: CP lægger kursets start dér (ikke i den anden ende af marken) + local vx, vz = vehiclePosition(assignment.vehicle) + local point = ADFieldJobs.nearestPoint(info.points, vx, vz) or {x = info.x, z = info.z} -- 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) diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 15cae4f..956117b 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.43.0.0 + 1.43.1.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adFieldJobs.lua b/tests/test_adFieldJobs.lua index f654b7a..a2fd084 100644 --- a/tests/test_adFieldJobs.lua +++ b/tests/test_adFieldJobs.lua @@ -187,5 +187,16 @@ check("EH optaget -> videre", ADFieldJobs.shouldEmptyHarvester({fill = 12000, ne check("EH spiller i -> videre", ADFieldJobs.shouldEmptyHarvester({fill = 12000, near = true, controlled = true}), false) check("EH allerede forsøgt -> videre", ADFieldJobs.shouldEmptyHarvester({fill = 12000, near = true, tried = true}), false) + +-- nearestPoint: CP bruger markens punkt som kursets startsted — tag det nærmest traktoren (in-game 27/9 F17: første +-- punkt lå 280 m væk i den anden ende, og CP kørte gennem skoven) +do + local pts = {{x = 1600, z = -1839}, {x = 1350, z = -1740}, {x = 1500, z = -1800}} + local p = ADFieldJobs.nearestPoint(pts, 1340, -1733) + check("NP nærmest traktoren", p.x .. "," .. p.z, "1350,-1740") + check("NP uden punkter -> nil", ADFieldJobs.nearestPoint({}, 0, 0), nil) + check("NP uden position -> første", ADFieldJobs.nearestPoint(pts, nil, nil).x, 1600) +end + print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)