diff --git a/Courseplay.lua b/Courseplay.lua
index 1504fe686..d2a267377 100644
--- a/Courseplay.lua
+++ b/Courseplay.lua
@@ -196,6 +196,7 @@ function Courseplay:update(dt)
g_bunkerSiloManager:update(dt)
g_triggerManager:update(dt)
g_baleToCollectManager:update(dt)
+ g_courseEditor:update(dt)
if not self.postInit then
-- Doubles the map zoom for 4x Maps. Mainly to make it easier to set targets for unload triggers.
self.postInit = true
diff --git a/config/MasterTranslations.xml b/config/MasterTranslations.xml
index 47d6972d5..cb640baa6 100644
--- a/config/MasterTranslations.xml
+++ b/config/MasterTranslations.xml
@@ -1483,6 +1483,10 @@ The course is saved automatically on closing of the editor and overrides the sel
+
+
+
+
diff --git a/scripts/Course.lua b/scripts/Course.lua
index 1f35f0ad0..b16b2a726 100644
--- a/scripts/Course.lua
+++ b/scripts/Course.lua
@@ -1572,8 +1572,8 @@ function Course:saveToXml(courseXml, courseKey)
end
end
----@param vehicle table
----@param courseXml XmlFile
+---@param vehicle table|nil
+---@param courseXml table
---@param courseKey string key to the course in the XML
function Course.createFromXml(vehicle, courseXml, courseKey)
local course = Course(vehicle, {})
@@ -1602,7 +1602,9 @@ function Course.createFromXml(vehicle, courseXml, courseKey)
if course.nVehicles and course.nVehicles > 1 then
course.multiVehicleData = Course.MultiVehicleData.createFromXmlFile(courseXml, courseKey)
course:setPosition(course.multiVehicleData:getPosition())
- vehicle:getCpLaneOffsetSetting():setValue(course.multiVehicleData:getPosition())
+ if vehicle then
+ vehicle:getCpLaneOffsetSetting():setValue(course.multiVehicleData:getPosition())
+ end
else
course:enrichWaypointData()
end
@@ -1813,4 +1815,17 @@ function Course.MultiVehicleData.createFromStream(stream, nVehicles)
end
end
return mvd
+end
+
+function Course.MultiVehicleData.getAllowedPositions(nMultiToolVehicles)
+ if nMultiToolVehicles == 2 then
+ return {-1,1}
+ elseif nMultiToolVehicles == 3 then
+ return {-1,0,1}
+ elseif nMultiToolVehicles == 4 then
+ return {-2,-1,1,2}
+ elseif nMultiToolVehicles == 5 then
+ return {-2,-1,0,1,2}
+ end
+ return {0}
end
\ No newline at end of file
diff --git a/scripts/ai/parameters/AIParameterSettingList.lua b/scripts/ai/parameters/AIParameterSettingList.lua
index e9846cc7b..1e183a833 100644
--- a/scripts/ai/parameters/AIParameterSettingList.lua
+++ b/scripts/ai/parameters/AIParameterSettingList.lua
@@ -220,6 +220,18 @@ function AIParameterSettingList:refresh()
self:validateTexts()
end
+--- Gets the texts for the given values.
+---@param values table
+---@return table
+function AIParameterSettingList:getTextsForValues(values)
+ local texts = {}
+ for _, v in ipairs(values) do
+ local ix = self:getClosestIx(v)
+ table.insert(texts, self.data.texts[ix])
+ end
+ return texts
+end
+
function AIParameterSettingList:validateCurrentValue()
local new = self:checkAndSetValidValue(self.current)
if new ~= self.current then
diff --git a/scripts/editor/CourseEditor.lua b/scripts/editor/CourseEditor.lua
index a2e34485e..cb89cd69a 100644
--- a/scripts/editor/CourseEditor.lua
+++ b/scripts/editor/CourseEditor.lua
@@ -30,7 +30,7 @@ function CourseEditor:loadCourse()
local function load(self, xmlFile, baseKey, noEventSend, name)
xmlFile:iterate(baseKey, function (i, key)
CpUtil.debugVehicle(CpDebug.DBG_COURSES, self, "Loading assigned course: %s", key)
- local course = Course.createFromXml(self, xmlFile, key)
+ local course = Course.createFromXml(nil, xmlFile, key)
course:setName(name)
self.courseWrapper = EditorCourseWrapper(course)
end)
@@ -38,6 +38,10 @@ function CourseEditor:loadCourse()
self.file:load(CpCourseManager.xmlSchema, CpCourseManager.xmlKeyFileManager,
load, self, false)
self.courseDisplay:setCourse(self.courseWrapper)
+ local course = self.courseWrapper:getCourse()
+ if course and course:getMultiTools() > 1 then
+ self.needsMultiToolDialog = true
+ end
end
--- Saves the course, might be a good idea to consolidate this with the saving of CpCourseManager.
@@ -53,6 +57,40 @@ function CourseEditor:saveCourse()
CpCourseManager.xmlKeyFileManager, save, self)
end
+function CourseEditor:update(dt)
+ -- if not g_gui:getIsDialogVisible() and self.needsMultiToolDialog then
+ -- self.needsMultiToolDialog = false
+ -- end
+end
+
+function CourseEditor:onClickLaneOffsetSetting(closure, ignoreDialog)
+ local course = self.courseWrapper:getCourse()
+ local allowedValues = Course.MultiVehicleData.getAllowedPositions(course:getMultiTools())
+ local texts = CpFieldWorkJobParameters.laneOffset:getTextsForValues(allowedValues)
+ if not ignoreDialog and not g_gui:getIsDialogVisible() then
+ g_gui:showOptionDialog({
+ title = "",
+ text = CpFieldWorkJobParameters.laneOffset:getTitle(),
+ options = texts,
+ callback = function (item)
+ if item > 0 then
+ local value = allowedValues[item]
+ self.courseWrapper:getCourse():setPosition(value)
+ self.courseDisplay:setCourse(self.courseWrapper)
+ closure(texts[item])
+ end
+ end
+ })
+ else
+ local position = course.multiVehicleData.position
+ for ix, v in ipairs(allowedValues) do
+ if v == position then
+ closure(texts[ix])
+ end
+ end
+ end
+end
+
--- Activates the editor with a given course file.
--- Also open the custom build menu only for CP.
function CourseEditor:activate(file)
@@ -99,6 +137,7 @@ function CourseEditor:deactivate()
self.file = nil
self.field = nil
self.courseWrapper = nil
+ self.needsMultiToolDialog = false
end
@@ -401,5 +440,23 @@ local function resetMenuState(screen)
end
ConstructionScreen.resetMenuState = Utils.appendedFunction(ConstructionScreen.resetMenuState, resetMenuState)
+local function registerMenuActionEvents(screen)
+ if g_courseEditor.isActive and g_courseEditor.needsMultiToolDialog then
+ local _, eventId = screen.inputManager:registerActionEvent(InputAction.CONSTRUCTION_ACTION_SNAPPING, screen,
+ function(screen, actionName)
+ local event = screen.inputManager:getFirstActiveEventForActionName(actionName)
+ g_courseEditor:onClickLaneOffsetSetting(function(text)
+ screen.inputManager:setActionEventText(event.id, string.format(g_i18n:getText("CP_editor_change_lane_offset"), text))
+ end)
+ end, false, true, false, true)
+ g_courseEditor:onClickLaneOffsetSetting(function(text)
+ screen.inputManager:setActionEventText(eventId, string.format(g_i18n:getText("CP_editor_change_lane_offset"), text))
+ end, true)
+ screen.inputManager:setActionEventActive(eventId, true)
+ screen.inputManager:setActionEventTextVisibility(eventId, true)
+ end
+end
+ConstructionScreen.registerMenuActionEvents = Utils.appendedFunction(ConstructionScreen.registerMenuActionEvents, registerMenuActionEvents)
+
g_courseEditor = CourseEditor.new()
diff --git a/translations/translation_br.xml b/translations/translation_br.xml
index 2bd69a0e3..18af4e132 100644
--- a/translations/translation_br.xml
+++ b/translations/translation_br.xml
@@ -440,6 +440,7 @@ A rota é salva automaticamente ao fechar o editor e substituir a rota seleciona
+
diff --git a/translations/translation_cs.xml b/translations/translation_cs.xml
index 56627649b..a8e9266c1 100644
--- a/translations/translation_cs.xml
+++ b/translations/translation_cs.xml
@@ -440,6 +440,7 @@
+
diff --git a/translations/translation_ct.xml b/translations/translation_ct.xml
index 29fc5ee1a..21004b853 100644
--- a/translations/translation_ct.xml
+++ b/translations/translation_ct.xml
@@ -440,6 +440,7 @@
+
diff --git a/translations/translation_cz.xml b/translations/translation_cz.xml
index 843625b66..18c7dbec0 100644
--- a/translations/translation_cz.xml
+++ b/translations/translation_cz.xml
@@ -440,6 +440,7 @@ Trasa se automaticky uloží při zavření editoru a přepíše vybranou trasu.
+
diff --git a/translations/translation_da.xml b/translations/translation_da.xml
index 51908af39..d7dd6de3f 100644
--- a/translations/translation_da.xml
+++ b/translations/translation_da.xml
@@ -440,6 +440,7 @@ Ruten gemmes automatisk ved lukning af editoren og tilsidesætter den valgte rut
+
diff --git a/translations/translation_de.xml b/translations/translation_de.xml
index 523bc33b9..66997c202 100644
--- a/translations/translation_de.xml
+++ b/translations/translation_de.xml
@@ -440,6 +440,7 @@ Der Kurs wird beim Schließen automatisch gespeichert und überschrieben.
+
diff --git a/translations/translation_ea.xml b/translations/translation_ea.xml
index 7f957cc2c..c39e7877a 100644
--- a/translations/translation_ea.xml
+++ b/translations/translation_ea.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_en.xml b/translations/translation_en.xml
index b597bf61a..0204c5a05 100644
--- a/translations/translation_en.xml
+++ b/translations/translation_en.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_es.xml b/translations/translation_es.xml
index d7114cce4..418f810a5 100644
--- a/translations/translation_es.xml
+++ b/translations/translation_es.xml
@@ -440,6 +440,7 @@ El curso se guarda automáticamente al cerrar el editor y anula el curso selecci
+
diff --git a/translations/translation_fc.xml b/translations/translation_fc.xml
index e4dd6a2b7..227d7c32d 100644
--- a/translations/translation_fc.xml
+++ b/translations/translation_fc.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_fi.xml b/translations/translation_fi.xml
index fbd050a53..fa104315b 100644
--- a/translations/translation_fi.xml
+++ b/translations/translation_fi.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_fr.xml b/translations/translation_fr.xml
index 3ebff9db8..4200999d3 100644
--- a/translations/translation_fr.xml
+++ b/translations/translation_fr.xml
@@ -440,6 +440,7 @@ La course est automatiquement sauvegardée à la fermeture de l'éditeur et remp
+
diff --git a/translations/translation_hu.xml b/translations/translation_hu.xml
index 9babbb361..2fc16d3b9 100644
--- a/translations/translation_hu.xml
+++ b/translations/translation_hu.xml
@@ -440,6 +440,7 @@ Az útvonal automatikusan mentésre kerül a szerkesztő bezárásakor és felü
+
diff --git a/translations/translation_it.xml b/translations/translation_it.xml
index 64ff08578..ee28bc30a 100644
--- a/translations/translation_it.xml
+++ b/translations/translation_it.xml
@@ -440,6 +440,7 @@ Il percorso viene salvato automaticamente alla chiusura dell'editor e sovrascriv
+
diff --git a/translations/translation_jp.xml b/translations/translation_jp.xml
index 64f3e303a..6d0ed01fe 100644
--- a/translations/translation_jp.xml
+++ b/translations/translation_jp.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_kr.xml b/translations/translation_kr.xml
index 32428610b..06ae47f85 100644
--- a/translations/translation_kr.xml
+++ b/translations/translation_kr.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_nl.xml b/translations/translation_nl.xml
index 7c1a49f4a..16b34b875 100644
--- a/translations/translation_nl.xml
+++ b/translations/translation_nl.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_no.xml b/translations/translation_no.xml
index 395de0e6b..d80944650 100644
--- a/translations/translation_no.xml
+++ b/translations/translation_no.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_pl.xml b/translations/translation_pl.xml
index 1ffb085a1..d61eff10a 100644
--- a/translations/translation_pl.xml
+++ b/translations/translation_pl.xml
@@ -440,6 +440,7 @@ Kurs jest automatycznie zapisywany po zamknięciu edytora i nadpisuje wybrany ku
+
diff --git a/translations/translation_pt.xml b/translations/translation_pt.xml
index 29cced271..13b259007 100644
--- a/translations/translation_pt.xml
+++ b/translations/translation_pt.xml
@@ -440,6 +440,7 @@ A rota é guardada automaticamente ao fechar o editor e sobrepõe-se a qualquer
+
diff --git a/translations/translation_ro.xml b/translations/translation_ro.xml
index 01bfeecdf..aa2e9b642 100644
--- a/translations/translation_ro.xml
+++ b/translations/translation_ro.xml
@@ -440,6 +440,7 @@ The course is saved automatically on closing of the editor and overrides the sel
+
diff --git a/translations/translation_ru.xml b/translations/translation_ru.xml
index 6d08c4737..25664df97 100644
--- a/translations/translation_ru.xml
+++ b/translations/translation_ru.xml
@@ -440,6 +440,7 @@
+
diff --git a/translations/translation_sv.xml b/translations/translation_sv.xml
index d513009fb..f3deda841 100644
--- a/translations/translation_sv.xml
+++ b/translations/translation_sv.xml
@@ -440,6 +440,7 @@ Banan sparas automatiskt vid stängning av editorn och åsidosätter den valda b
+
diff --git a/translations/translation_tr.xml b/translations/translation_tr.xml
index d3356cbbb..cb7f031d9 100644
--- a/translations/translation_tr.xml
+++ b/translations/translation_tr.xml
@@ -440,6 +440,7 @@ Editör kapatıldığında kurs otomatik olarak kaydedilir ve seçilen kursu ge
+