diff --git a/FS25_ADSmartPickup/adCpBridge.lua b/FS25_ADSmartPickup/adCpBridge.lua index 932078f..d50823f 100644 --- a/FS25_ADSmartPickup/adCpBridge.lua +++ b/FS25_ADSmartPickup/adCpBridge.lua @@ -451,6 +451,27 @@ function ADCpBridge.getCourse(vehicle) return ok and course or nil end +-- Forager: nye kurser får altid HEADLANDS runder og starter på forageren, så der ikke køres ind i træer, hegn +-- o.l. i hjørnerne (brugerkrav 29/9). Kan kurset ikke laves med forager (smal mark), prøves én gang uden. +ADCpBridge.HEADLANDS = 2 + +function ADCpBridge.setHeadlands(vehicle, n) + if vehicle.getCourseGeneratorSettings == nil then return false end + return (pcall(function() + local settings = vehicle:getCourseGeneratorSettings() + settings.numberOfHeadlands:setValue(n) + if settings.startOnHeadland ~= nil then settings.startOnHeadland:setValue(n > 0) end + end)) +end + +-- Har kurset forager? (ukendt API = antag ja, så intet genberegnes unødigt) +function ADCpBridge.courseHasHeadlands(course) + if course == nil then return false end + if course.getNumberOfHeadlands == nil then return true end + local ok, n = pcall(course.getNumberOfHeadlands, course) + return not ok or type(n) ~= "number" or n > 0 +end + -- Multi-tool: sæt antal sæt på kursus-generatoren før kurset laves (1 = normalt kursus). local function setMultiTools(vehicle, n) pcall(function() vehicle:getCourseGeneratorSettings().multiTools:setValue(n or 1) end) @@ -537,7 +558,8 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts) local function generateAndStart() if handle.cancelled then return end -- genbrug: maskinens eget kursus (CP's validate kræver kun hasCpCourse) — ingen ny beregning - if opts.reuse and ADCpBridge.getCourse(vehicle) ~= nil then + -- eget kursus genbruges kun med forager (ellers nyt kursus med 2 runder) + if opts.reuse and ADCpBridge.getCourse(vehicle) ~= nil and ADCpBridge.courseHasHeadlands(ADCpBridge.getCourse(vehicle)) then handle.reusedCourse = true return startWithCourse() end @@ -551,13 +573,21 @@ function ADCpBridge.start(vehicle, fieldX, fieldZ, onDone, opts) end setMultiTools(vehicle, opts.multiTools or 1) -- kursusberegningen kører over mange frames på store marker: moden venter længere imens - handle.generating = true - job:onClickGenerateFieldWorkCourse(function(generated) - handle.generating = false - if handle.cancelled then return end - if not generated then return finish(false, "Courseplay kunne ikke lave kursus") end - startWithCourse() - end) + local function generate(headlands) + ADCpBridge.setHeadlands(vehicle, headlands) + handle.generating = true + job:onClickGenerateFieldWorkCourse(function(generated) + handle.generating = false + if handle.cancelled then return end + if not generated and headlands > 0 then + Logging.info("ADSmartPickup: kursus med %d forager-runder kunne ikke laves — prøver uden forager", headlands) + return generate(0) + end + if not generated then return finish(false, "Courseplay kunne ikke lave kursus") end + startWithCourse() + end) + end + generate(ADCpBridge.HEADLANDS) end handle.onBoundary = function(_, success, message) if handle.fired then return end diff --git a/FS25_ADSmartPickup/modDesc.xml b/FS25_ADSmartPickup/modDesc.xml index 071e487..daea1a5 100644 --- a/FS25_ADSmartPickup/modDesc.xml +++ b/FS25_ADSmartPickup/modDesc.xml @@ -1,7 +1,7 @@ masterdraco - 1.51.4.0 + 1.51.5.0 <en>AD Smart Pickup</en> diff --git a/tests/test_adCpBridge.lua b/tests/test_adCpBridge.lua index 7cfbd7e..8523054 100644 --- a/tests/test_adCpBridge.lua +++ b/tests/test_adCpBridge.lua @@ -148,5 +148,21 @@ do AIJobType, g_currentMission = nil, nil end +-- forager: 2 runder og start på forageren (så der ikke køres ind i træer o.l. i hjørnerne) +local recorded = {} +local function setting(name) return {setValue = function(_, v) recorded[name] = v end} end +local headlandVehicle = {getCourseGeneratorSettings = function() return {numberOfHeadlands = setting("headlands"), startOnHeadland = setting("startOnHeadland")} end} +check("forager: sat", ADCpBridge.setHeadlands(headlandVehicle, 2), true) +check("forager: 2 runder", recorded.headlands, 2) +check("forager: start på forageren", recorded.startOnHeadland, true) +ADCpBridge.setHeadlands(headlandVehicle, 0) +check("forager: ingen -> ikke start på forageren", recorded.startOnHeadland, false) +check("forager: køretøj uden CP", ADCpBridge.setHeadlands({}, 2), false) +check("forager: standard er 2", ADCpBridge.HEADLANDS, 2) +-- genbrugt kursus uden forager beregnes på ny +check("forager i kursus: 2 runder", ADCpBridge.courseHasHeadlands({getNumberOfHeadlands = function() return 2 end}), true) +check("forager i kursus: ingen", ADCpBridge.courseHasHeadlands({getNumberOfHeadlands = function() return 0 end}), false) +check("forager i kursus: ukendt -> antag ja", ADCpBridge.courseHasHeadlands({}), true) +check("forager i kursus: intet kursus", ADCpBridge.courseHasHeadlands(nil), false) print(failures == 0 and "\nALLE TESTS OK" or ("\n" .. failures .. " FEJL")) os.exit(failures == 0 and 0 or 1)