feat(marker): smalle standardmaskiner — vender/river i egen bredde, læssevogn følger rivens kursus; Riv også til ensilage (v1.23.0.0)

Brugerspørgsmål 25/9: få standardredskaber har 40,8 m. Vender og river kører hele marken i deres egen
bredde; efter riv ligger skåret midt i banen, så læssevognen kopierer rivens kursus uden breddekrav.
Uden riv kræver læssevognen stadig slåbredden (nu med hint 'sæt Riv til').
This commit is contained in:
2026-09-25 23:31:46 +02:00
parent 4c88118e56
commit ba88eb5f99
11 changed files with 105 additions and 42 deletions
+30 -15
View File
@@ -14,8 +14,8 @@ ADFieldJobs.PLAYER_DRIVING_KMH = 3
-- Courseplay kan efterlade hjørner på skæve marker: efter så mange færdige slå-ture går marken videre.
ADFieldJobs.MAX_MOW_PASSES = 2
ADFieldJobs.state = {fields = {}, fleet = {}, assignments = {}}
-- mark-id -> kopi af slåmaskinens Courseplay-kursus (kun i hukommelsen; efter genindlæsning hentes det
-- igen fra slåmaskinen, som CP selv gemmer kurset på)
-- mark-id -> {mower = kursus, rake = kursus}: kopier af slåmaskinens/rivens Courseplay-kursus (kun i
-- hukommelsen; efter genindlæsning hentes de fra maskinen, som CP selv gemmer kurset på)
ADFieldJobs.courses = {}
ADFieldJobs.timer = 0
ADFieldJobs.now = 0
@@ -246,7 +246,7 @@ end
local function dispatch(adEnv, field, info, role)
local candidates = ADFieldJobs.getRigs(adEnv)
local rig, reason, args = ADFieldFleet.pick(candidates, role, info.x, info.z, field.mowWidth)
local rig, reason, args = ADFieldFleet.pick(candidates, role, info.x, info.z, ADFieldModel.requiredWidth(field, role))
if rig == nil then
note(field.id, {reason = {key = "spu_field_reason_" .. reason, role = role, args = args}})
return
@@ -258,18 +258,32 @@ local function dispatch(adEnv, field, info, role)
note(field.id, {reason = false})
end
-- Slåkurset for marken: gemt kopi, ellers slåmaskinens nuværende kursus (efter genindlæsning).
local function mowCourse(adEnv, field)
if ADFieldJobs.courses[field.id] ~= nil then return ADFieldJobs.courses[field.id] end
if field.mowVehicleId == nil then return nil end
-- Kurset som et trin skal genbruge ("mower"/"rake"): gemt kopi, ellers maskinens nuværende kursus
-- (efter genindlæsning).
local function sourceCourse(adEnv, field, source)
local saved = ADFieldJobs.courses[field.id]
if saved ~= nil and saved[source] ~= nil then return saved[source] end
local vehicleId = source == "rake" and field.rakeVehicleId or field.mowVehicleId
if vehicleId == nil then return nil end
for _, vehicle in ipairs(ADRunsController.getFarmVehicles(adEnv)) do
if ADRunsController.getVehicleId(vehicle) == field.mowVehicleId then
if ADRunsController.getVehicleId(vehicle) == vehicleId then
return ADCpBridge.getCourse(vehicle)
end
end
return nil
end
local function rememberCourse(field, source, vehicle, vehicleId)
local course = ADCpBridge.getCourse(vehicle)
local ok, copy = false, nil
if course ~= nil and course.copy ~= nil then ok, copy = pcall(course.copy, course) end
ADFieldJobs.courses[field.id] = ADFieldJobs.courses[field.id] or {}
ADFieldJobs.courses[field.id][source] = ok and copy or course
if source == "rake" then
note(field.id, {rakeVehicleId = vehicleId})
end
end
local function beginWork(adEnv, field, info, assignment)
local vehicle = assignment.vehicle
if assignment.role == "collector" then
@@ -298,9 +312,10 @@ local function beginWork(adEnv, field, info, assignment)
local point = info.points[1] or {x = info.x, z = info.z}
assignment.phase = "starting"
assignment.since = ADFieldJobs.now
local course = assignment.role ~= "mower" and mowCourse(adEnv, field) or nil
if assignment.role ~= "mower" and course == nil then
log(field.id, "intet slåkursus kendt — Courseplay laver et nyt kursus til %s", assignment.role)
local source = ADFieldModel.courseSource(field, assignment.role)
local course = source ~= nil and sourceCourse(adEnv, field, source) or nil
if source ~= nil and course == nil then
log(field.id, "intet %s-kursus kendt — Courseplay laver et nyt kursus til %s", source, assignment.role)
end
local handle, err = ADCpBridge.start(vehicle, point.x, point.z, function(ok, reason)
if ok then
@@ -308,11 +323,11 @@ local function beginWork(adEnv, field, info, assignment)
assignment.since = ADFieldJobs.now
if assignment.role == "mower" then
note(field.id, {mowWidth = assignment.width, mowVehicleId = assignment.vehicleId})
local mowed = ADCpBridge.getCourse(vehicle)
local copied = mowed ~= nil and mowed.copy ~= nil and select(2, pcall(mowed.copy, mowed)) or mowed
ADFieldJobs.courses[field.id] = type(copied) == "table" and copied or mowed
rememberCourse(field, "mower", vehicle, assignment.vehicleId)
elseif assignment.role == "rake" then
rememberCourse(field, "rake", vehicle, assignment.vehicleId)
end
log(field.id, "Courseplay startet (%s%s)", assignment.role, reason == "copied" and ", slåkursus kopieret" or "")
log(field.id, "Courseplay startet (%s%s)", assignment.role, reason == "copied" and (", " .. tostring(source) .. "-kursus kopieret") or "")
else
release(assignment)
note(field.id, {retryAt = ADFieldJobs.now + ADFieldModel.RETRY_MS, reason = {text = tostring(reason)}})