fix(markarbejde): CP får markens punkt nærmest traktoren som position (kursets startsted) — F17-kurset startede 280 m væk, og kultivatoren kørte gennem skoven (v1.43.1.0)

This commit is contained in:
2026-09-27 20:06:18 +02:00
parent 5bb1ad6ae0
commit 5e1d6a3659
4 changed files with 33 additions and 4 deletions
+12
View File
@@ -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.
+9 -3
View File
@@ -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)
+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.43.0.0</version>
<version>1.43.1.0</version>
<title>
<en>AD Smart Pickup</en>
</title>