From d9ca005f766b2ebd639eadec992b35609fbbed40 Mon Sep 17 00:00:00 2001
From: Martin Tibke <5798184+mtibke@users.noreply.github.com>
Date: Thu, 29 Oct 2026 11:36:31 +0100
Subject: [PATCH] fix: allow vineyard tools without AI markers for fieldwork
Giants leaves out the AI markers on some vineyard tools, for example the
row spreading configuration of the Kuhn Accura 1200 (Beans and Alpacas),
because the built in helper refuses vineyard courses anyway. Without
markers getCanStartFieldWork() is false and Courseplay offers no fieldwork,
although it can work between the rows and already takes the markers from
the work areas.
Such a tool is also missing in the AI implement list of giants, so
lowerImplements() at the start of the work did not turn it on. The new
VineyardToolController lowers and raises it. Turns were already handled
by the work start and end handlers.
---
modDesc.xml | 1 +
.../ai/controllers/VineyardToolController.lua | 15 +++++++++
.../AIDriveStrategyFieldWorkCourse.lua | 3 ++
scripts/ai/util/AIUtil.lua | 31 +++++++++++++++++++
scripts/specializations/CpAIFieldWorker.lua | 2 ++
5 files changed, 52 insertions(+)
create mode 100644 scripts/ai/controllers/VineyardToolController.lua
diff --git a/modDesc.xml b/modDesc.xml
index a24cfce9b..7027b0378 100644
--- a/modDesc.xml
+++ b/modDesc.xml
@@ -241,6 +241,7 @@ Changelog 8.1.0.3
+
diff --git a/scripts/ai/controllers/VineyardToolController.lua b/scripts/ai/controllers/VineyardToolController.lua
new file mode 100644
index 000000000..57aa149b7
--- /dev/null
+++ b/scripts/ai/controllers/VineyardToolController.lua
@@ -0,0 +1,15 @@
+--- Lowers and raises vineyard tools without AI markers.
+--- These are not in the AI implement list of giants, so lowering all implements
+--- at the start of the work would not turn them on.
+---@class VineyardToolController : ImplementController
+VineyardToolController = CpObject(ImplementController)
+
+function VineyardToolController:onLowering()
+ self:debug('Lowering vineyard tool without AI markers')
+ self.implement:aiImplementStartLine()
+end
+
+function VineyardToolController:onRaising()
+ self:debug('Raising vineyard tool without AI markers')
+ self.implement:aiImplementEndLine()
+end
diff --git a/scripts/ai/strategies/AIDriveStrategyFieldWorkCourse.lua b/scripts/ai/strategies/AIDriveStrategyFieldWorkCourse.lua
index dceee575c..3e2444be4 100644
--- a/scripts/ai/strategies/AIDriveStrategyFieldWorkCourse.lua
+++ b/scripts/ai/strategies/AIDriveStrategyFieldWorkCourse.lua
@@ -284,6 +284,9 @@ function AIDriveStrategyFieldWorkCourse:initializeImplementControllers(vehicle)
self:addImplementController(vehicle, SoilSamplerController, nil, defaultDisabledStates, CpUtil.getSoilSamplerSpecName())
self:addImplementController(vehicle, StumpCutterController, StumpCutter, defaultDisabledStates)
self:addImplementController(vehicle, TreePlanterController, TreePlanter, {})
+ for _, tool in ipairs(AIUtil.getVineyardToolsWithoutAIMarkers(vehicle)) do
+ self:appendImplementController(VineyardToolController(vehicle, tool), {})
+ end
end
diff --git a/scripts/ai/util/AIUtil.lua b/scripts/ai/util/AIUtil.lua
index 2a34911e5..c666c2944 100644
--- a/scripts/ai/util/AIUtil.lua
+++ b/scripts/ai/util/AIUtil.lua
@@ -759,6 +759,37 @@ function AIUtil.hasValidUniversalTrailerAttached(vehicle)
return spec.isAutoloadAvailable and not spec.autoloadDisabled
end
+--- Is this a vineyard tool with work areas?
+--- Giants leaves out the AI markers on some of them, for example on the row spreading
+--- configuration of the Kuhn Accura 1200, as the built in helper can't work in vineyards.
+function AIUtil.isVineyardTool(object)
+ if object.getAIIsVineyardTool and object:getAIIsVineyardTool() and WorkWidthUtil.hasWorkAreas(object) then
+ return true
+ end
+ return false
+end
+
+--- Checks if a vineyard tool with work areas is attached.
+function AIUtil.hasVineyardToolAttached(vehicle)
+ for _, childVehicle in pairs(vehicle:getChildVehicles()) do
+ if AIUtil.isVineyardTool(childVehicle) then
+ return true
+ end
+ end
+ return false
+end
+
+--- Gets all vineyard tools, that are not in the AI implement list of giants, as they have no AI markers.
+function AIUtil.getVineyardToolsWithoutAIMarkers(vehicle)
+ local tools = {}
+ for _, childVehicle in pairs(vehicle:getChildVehicles()) do
+ if AIUtil.isVineyardTool(childVehicle) and not childVehicle:getCanImplementBeUsedForAI() then
+ table.insert(tools, childVehicle)
+ end
+ end
+ return tools
+end
+
--- Checks if cutter on an trailer is attached.
function AIUtil.hasCutterOnTrailerAttached(vehicle)
local trailer = AIUtil.getImplementWithSpecialization(vehicle, DynamicMountAttacher)
diff --git a/scripts/specializations/CpAIFieldWorker.lua b/scripts/specializations/CpAIFieldWorker.lua
index 0206324c7..4bbd511d2 100644
--- a/scripts/specializations/CpAIFieldWorker.lua
+++ b/scripts/specializations/CpAIFieldWorker.lua
@@ -276,6 +276,8 @@ function CpAIFieldWorker:getCanStartCpFieldWork()
AIUtil.hasImplementWithSpecialization(self, Cutter) or
AIUtil.hasChildVehicleWithSpecialization(self, VineCutter) or
AIUtil.hasChildVehicleWithSpecialization(self, VinePrepruner) or
+ --- Vineyard tools may come without AI markers, the giants fieldworker can't use them anyway.
+ AIUtil.hasVineyardToolAttached(self) or
--- This also allows the use of stump cutters, that work like a mulcher.
AIUtil.hasChildVehicleWithSpecialization(self, Plow) or
--- A few mowers can't be used by the giants fieldworker