diff --git a/BaleCollectorAIDriver.lua b/BaleCollectorAIDriver.lua
index 8f4428a56..3c65b2f7e 100644
--- a/BaleCollectorAIDriver.lua
+++ b/BaleCollectorAIDriver.lua
@@ -23,6 +23,8 @@ without a field course.
For unloading, it has the same behavior as the BaleLoaderAIDriver.
+It also works with a bale wrapper, find and wrap all wrappable bales.
+
--]]
---@class BaleCollectorAIDriver : BaleLoaderAIDriver
@@ -33,7 +35,7 @@ BaleCollectorAIDriver.myStates = {
WAITING_FOR_PATHFINDER = {},
DRIVING_TO_NEXT_BALE = {},
APPROACHING_BALE = {},
- PICKING_UP_BALE = {}
+ WORKING_ON_BALE = {}
}
function BaleCollectorAIDriver:init(vehicle)
@@ -69,6 +71,7 @@ function BaleCollectorAIDriver:setUpAndStart(startingPoint)
self:stop("NO_FIELD_SELECTED")
return
end
+ BaleWrapperAIDriver.initializeBaleWrapper(self)
self.bales = self:findBales(myField)
self:changeToFieldwork()
self:collectNextBale()
@@ -97,8 +100,15 @@ function BaleCollectorAIDriver:collectNextBale()
if #self.bales > 0 then
self:findPathToNextBale()
else
- self:info('No bales found.')
- if self:getFillLevel() > 0.1 then
+ self:info('No bales found, scan the field once more before leaving for the unload course.')
+ self.bales = self:findBales(self.vehicle.cp.settings.baleCollectionField:get())
+ if #self.bales > 0 then
+ self:info('Found more bales, collecting them')
+ self:findPathToNextBale()
+ return
+ end
+ self:info('There really is no more bales on the field')
+ if self.baleLoader and self:getFillLevel() > 0.1 then
self:changeToUnloadOrRefill()
self:startCourseWithPathfinding(self.unloadRefillCourse, 1)
else
@@ -113,7 +123,7 @@ function BaleCollectorAIDriver:findBales(fieldId)
self:debug('Finding bales on field %d...', fieldId or 0)
local balesFound = {}
for _, object in pairs(g_currentMission.nodeToObject) do
- if BaleToCollect.isValidBale(object) then
+ if BaleToCollect.isValidBale(object, self.baleWrapper) then
local bale = BaleToCollect(object)
-- if the bale has a mountObject it is already on the loader so ignore it
if (not fieldId or fieldId == 0 or bale:getFieldId() == fieldId) and
@@ -224,8 +234,8 @@ function BaleCollectorAIDriver:onLastWaypoint()
if self.state == self.states.ON_FIELDWORK_COURSE and self.fieldworkState == self.states.WORKING then
if self.baleCollectingState == self.states.DRIVING_TO_NEXT_BALE then
self:debug('last waypoint while driving to next bale reached')
- self:approachBale()
- elseif self.baleCollectingState == self.states.PICKING_UP_BALE then
+ self:startApproachingBale()
+ elseif self.baleCollectingState == self.states.WORKING_ON_BALE then
self:debug('last waypoint on bale pickup reached, start collecting bales again')
self:collectNextBale()
elseif self.baleCollectingState == self.states.APPROACHING_BALE then
@@ -250,7 +260,7 @@ function BaleCollectorAIDriver:onEndCourse()
end
end
-function BaleCollectorAIDriver:approachBale()
+function BaleCollectorAIDriver:startApproachingBale()
self:debug('Approaching bale...')
self:startCourse(self:getStraightForwardCourse(20), 1)
self:setBaleCollectingState(self.states.APPROACHING_BALE)
@@ -269,18 +279,44 @@ function BaleCollectorAIDriver:work()
self:setSpeed(self.vehicle:getSpeedLimit())
elseif self.baleCollectingState == self.states.APPROACHING_BALE then
self:setSpeed(self:getWorkSpeed() / 2)
+ self:approachBale()
+ elseif self.baleCollectingState == self.states.WORKING_ON_BALE then
+ self:workOnBale()
+ self:setSpeed(0)
+ end
+ self:checkFillLevels()
+end
+
+function BaleCollectorAIDriver:approachBale()
+ if self.baleLoader then
if self.baleLoader.spec_baleLoader.grabberMoveState then
self:debug('Start picking up bale')
- self:setBaleCollectingState(self.states.PICKING_UP_BALE)
+ self:setBaleCollectingState(self.states.WORKING_ON_BALE)
end
- elseif self.baleCollectingState == self.states.PICKING_UP_BALE then
- self:setSpeed(0)
+ end
+ if self.baleWrapper then
+ BaleWrapperAIDriver.handleBaleWrapper(self)
+ if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE then
+ self:debug('Start wrapping bale')
+ self:setBaleCollectingState(self.states.WORKING_ON_BALE)
+ end
+ end
+end
+
+function BaleCollectorAIDriver:workOnBale()
+ if self.baleLoader then
if not self.baleLoader.spec_baleLoader.grabberMoveState then
self:debug('Bale picked up, moving on to the next')
self:collectNextBale()
end
end
- self:checkFillLevels()
+ if self.baleWrapper then
+ BaleWrapperAIDriver.handleBaleWrapper(self)
+ if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_NONE then
+ self:debug('Bale wrapped, moving on to the next')
+ self:collectNextBale()
+ end
+ end
end
function BaleCollectorAIDriver:calculateTightTurnOffset()
diff --git a/BaleLoaderAIDriver.lua b/BaleLoaderAIDriver.lua
index 2fc56d296..6d76c682b 100644
--- a/BaleLoaderAIDriver.lua
+++ b/BaleLoaderAIDriver.lua
@@ -60,7 +60,6 @@ function BaleLoaderAIDriver:init(vehicle)
courseplay.debugVehicle(courseplay.DBG_AI_DRIVER,vehicle,'BaleLoaderAIDriver:init()')
UnloadableFieldworkAIDriver.init(self, vehicle)
self:initStates(BaleLoaderAIDriver.myStates)
- self:initializeBaleLoader()
self.unloadDoneX, self.unloadDoneZ = 0, 0
end
@@ -71,21 +70,25 @@ end
function BaleLoaderAIDriver:initializeBaleLoader()
self.baleLoader = AIDriverUtil.getImplementWithSpecialization(self.vehicle, BaleLoader)
- self:debug('baleloader %s', tostring(self.baleLoader))
- -- Bale loaders have no AI markers (as they are not AIImplements according to Giants) so add a function here
- -- to get the markers
- self.baleLoader.getAIMarkers = function(object)
- return UnloadableFieldworkAIDriver.getAIMarkersFromGrabberNode(object, object.spec_baleLoader)
- end
+ if self.baleLoader then
+ self:debug('baleloader %s', tostring(self.baleLoader))
+ -- Bale loaders have no AI markers (as they are not AIImplements according to Giants) so add a function here
+ -- to get the markers
+ self.baleLoader.getAIMarkers = function(object)
+ return UnloadableFieldworkAIDriver.getAIMarkersFromGrabberNode(object, object.spec_baleLoader)
+ end
- self.manualUnloadNode = WaypointNode(self.vehicle:getName() .. 'unloadNode')
- if self.baleLoader.cp.realUnloadOrFillNode then
- -- use that realUnloadOrFillNode for now as it includes the balerUnloadDistance config value
- -- TODO: can we just use the back marker node here as well?
- self.baleFinderProximitySensorPack = BackwardLookingProximitySensorPack(
- self.vehicle, self.ppc, self.baleLoader.cp.realUnloadOrFillNode, 5, 1)
+ self.manualUnloadNode = WaypointNode(self.vehicle:getName() .. 'unloadNode')
+ if self.baleLoader.cp.realUnloadOrFillNode then
+ -- use that realUnloadOrFillNode for now as it includes the balerUnloadDistance config value
+ -- TODO: can we just use the back marker node here as well?
+ self.baleFinderProximitySensorPack = BackwardLookingProximitySensorPack(
+ self.vehicle, self.ppc, self.baleLoader.cp.realUnloadOrFillNode, 5, 1)
+ end
+ self:debug('Initialized, bale loader: %s', self.baleLoader:getName())
+ else
+ self:debug('Has now bale loader specialization')
end
- self:debug('Initialized, bale loader: %s', self.baleLoader:getName())
end
---@return boolean true if unload took over the driving
diff --git a/BaleToCollect.lua b/BaleToCollect.lua
index 2fef3e713..2581c45d9 100644
--- a/BaleToCollect.lua
+++ b/BaleToCollect.lua
@@ -39,9 +39,21 @@ function BaleToCollect:init(baleObject)
end
--- Call this before attempting to construct a BaleToCollect to check the validity of the object
-function BaleToCollect.isValidBale(object)
+---@param baleWrapper table bale wrapper, if exists
+function BaleToCollect.isValidBale(object, baleWrapper)
-- nodeId is sometimes 0, causing issues for the BaleToCollect constructor
- return object.isa and object:isa(Bale) and object.nodeId and entityExists(object.nodeId)
+ if object.isa and object:isa(Bale) and object.nodeId and entityExists(object.nodeId) then
+ if baleWrapper then
+ -- if there is a bale wrapper, the bale must be wrappable and the wrapper does not want to skip this fill type
+ -- (and yes, this is another typo in Giants code
+ local wrappedBaleType = baleWrapper:getWrapperBaleType(object)
+ courseplay.debugFormat(courseplay.DBG_MODE_7, ' bale %d wrapping state: %d, wrapped bale type: %s',
+ object.id, tostring(object.wrappingState), tostring(wrappedBaleType))
+ return wrappedBaleType and object.wrappingState < 0.99
+ else
+ return true
+ end
+ end
end
function BaleToCollect:getFieldId()
diff --git a/BaleWrapperAIDriver.lua b/BaleWrapperAIDriver.lua
index 4f33ece79..3feeb1d1c 100644
--- a/BaleWrapperAIDriver.lua
+++ b/BaleWrapperAIDriver.lua
@@ -35,7 +35,7 @@ end
function BaleWrapperAIDriver:initializeBaleWrapper()
self.baleWrapper = AIDriverUtil.getAIImplementWithSpecialization(self.vehicle, BaleWrapper)
- if not self.baler then
+ if not self.baler and self.baleWrapper then
-- Bale wrappers which aren't balers have no AI markers as they have no pick up so add a function here
-- to get the markers
self.baleWrapper.getAIMarkers = function(object)
@@ -47,31 +47,37 @@ end
function BaleWrapperAIDriver:driveFieldwork(dt)
-- Don't drop the bale in the turn or on temporary alignment or connecting tracks
if self:isHandlingAllowed() then
- -- stop while wrapping only if we don't have a baler. If we do we should continue driving and working
- -- on the next bale, the baler code will take care about stopping if we need to
- if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE and not self.baler then
- self:setSpeed(0)
- end
- -- Yes, Giants has a typo in the state
- if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_WRAPPER_FINSIHED then
- -- inserts unload threshold after lowering the implement, useful after e.g. transition from connecting track to fieldwork
- if self.fieldworkState == self.states.WAITING_FOR_LOWER then
- local unloadThreshold = 2500 --delay in msecs, 2.5 secs seems to work well
- loweringDropTime = self.vehicle.timer + unloadThreshold
- elseif loweringDropTime == nil then
- loweringDropTime = 0
- end
- -- inserts unload threshold after turn so bales don't drop on headlands
- if self.turnStartedAt and self.realTurnDurationMs then
- local unloadThreshold = 4000 --delay in msecs, 4 secs seems to work well
- turnDropTime = self.turnStartedAt + self.realTurnDurationMs + unloadThreshold
- else
- turnDropTime = 0 --avoids problems in case of condition variables not existing / empty e.g. before the first turn
- end
- if self.vehicle.timer > math.max(loweringDropTime,turnDropTime) then --chooses the bigger delay
- self.baleWrapper:doStateChange(BaleWrapper.CHANGE_WRAPPER_START_DROP_BALE)
- end
- end
+ self:handleBaleWrapper()
end
return BalerAIDriver.driveFieldwork(self, dt)
end
+
+
+function BaleWrapperAIDriver:handleBaleWrapper()
+ -- stop while wrapping only if we don't have a baler. If we do we should continue driving and working
+ -- on the next bale, the baler code will take care about stopping if we need to
+ if self.baleWrapper.spec_baleWrapper.baleWrapperState ~= BaleWrapper.STATE_NONE and not self.baler then
+ self:setSpeed(0)
+ end
+ -- Yes, Giants has a typo in the state
+ if self.baleWrapper.spec_baleWrapper.baleWrapperState == BaleWrapper.STATE_WRAPPER_FINSIHED then
+ local loweringDropTime, turnDropTime
+ -- inserts unload threshold after lowering the implement, useful after e.g. transition from connecting track to fieldwork
+ if self.fieldworkState == self.states.WAITING_FOR_LOWER then
+ local unloadThreshold = 2500 --delay in msecs, 2.5 secs seems to work well
+ loweringDropTime = self.vehicle.timer + unloadThreshold
+ elseif loweringDropTime == nil then
+ loweringDropTime = 0
+ end
+ -- inserts unload threshold after turn so bales don't drop on headlands
+ if self.turnStartedAt and self.realTurnDurationMs then
+ local unloadThreshold = 4000 --delay in msecs, 4 secs seems to work well
+ turnDropTime = self.turnStartedAt + self.realTurnDurationMs + unloadThreshold
+ else
+ turnDropTime = 0 --avoids problems in case of condition variables not existing / empty e.g. before the first turn
+ end
+ if self.vehicle.timer > math.max(loweringDropTime,turnDropTime) then --chooses the bigger delay
+ self.baleWrapper:doStateChange(BaleWrapper.CHANGE_WRAPPER_START_DROP_BALE)
+ end
+ end
+end
\ No newline at end of file
diff --git a/Waypoint.lua b/Waypoint.lua
index 90c821887..6c3a6ddbe 100644
--- a/Waypoint.lua
+++ b/Waypoint.lua
@@ -1050,17 +1050,20 @@ end
---@param dx number direction to extend
---@param dz number direction to extend
function Course:extend(length, dx, dz)
+ self:print()
local lastWp = self.waypoints[#self.waypoints]
local len = self.waypoints[#self.waypoints - 1].dToNext
- dx, dz = dx or lastWp.dx / len, dz or lastWp.dz / len
+ dx, dz = dx or lastWp.dx, dz or lastWp.dz
+ print(dx, dz)
local wpDistance = 2
- for _ = wpDistance, math.max(length, wpDistance), wpDistance do
+ for i = wpDistance, math.max(length, wpDistance), wpDistance do
lastWp = self.waypoints[#self.waypoints]
local x = lastWp.x + dx * wpDistance
local z = lastWp.z + dz * wpDistance
self:appendWaypoint({x = x, z = z})
end
self:enrichWaypointData()
+ self:print()
end
--- Create a new (straight) temporary course based on a node
diff --git a/base.lua b/base.lua
index 67c6b4cc0..cc898fb7e 100644
--- a/base.lua
+++ b/base.lua
@@ -370,12 +370,6 @@ function courseplay:onLoad(savegame)
};
};
- -- WOOD CUTTING: increase max cut length
- if CpManager.isDeveloper then
- self.cutLengthMax = 15;
- self.cutLengthStep = 1;
- end;
-
self.cp.mouseCursorActive = false;
-- 2D course
diff --git a/config/ValidModeSetup.xml b/config/ValidModeSetup.xml
index fcf015216..8a57b9cf3 100644
--- a/config/ValidModeSetup.xml
+++ b/config/ValidModeSetup.xml
@@ -176,6 +176,9 @@
+
+
+
diff --git a/hud.lua b/hud.lua
index 7094acb08..b1f35d9e4 100644
--- a/hud.lua
+++ b/hud.lua
@@ -231,8 +231,8 @@ function courseplay.hud:setup()
[courseplay.MODE_SEED_FERTILIZE] = { 220, 72, 252,40 };
[courseplay.MODE_TRANSPORT] = { 4,108, 36,76 };
[courseplay.MODE_FIELDWORK] = { 40,108, 72,76 };
- [courseplay.MODE_BALE_COLLECTOR] = { 76,108, 108,76 };
- [courseplay.MODE_FIELD_SUPPLY] = { 112,108, 144,76 };
+ [courseplay.MODE_BALE_COLLECTOR] = { 76,108, 108,76 };
+ [courseplay.MODE_FIELD_SUPPLY] = { 112,108, 144,76 };
[courseplay.MODE_SHOVEL_FILL_AND_EMPTY] = { 148,108, 180,76 };
[courseplay.MODE_BUNKERSILO_COMPACTER] = { 219,431, 251,399 };
};
@@ -323,8 +323,8 @@ function courseplay.hud:setup()
[courseplay.MODE_SEED_FERTILIZE] = { 40,144, 72,112 };
[courseplay.MODE_TRANSPORT] = { 76,144, 108,112 };
[courseplay.MODE_FIELDWORK] = { 112,144, 144,112 };
- [courseplay.MODE_BALE_COLLECTOR] = { 148,144, 180,112 };
- [courseplay.MODE_FIELD_SUPPLY] = { 184,144, 216,112 };
+ [courseplay.MODE_BALE_COLLECTOR] = { 148,144, 180,112 };
+ [courseplay.MODE_FIELD_SUPPLY] = { 184,144, 216,112 };
[courseplay.MODE_SHOVEL_FILL_AND_EMPTY] = { 220,144, 252,112 };
[courseplay.MODE_BUNKERSILO_COMPACTER] = { 219,394, 251,362 };
};
diff --git a/modDesc.xml b/modDesc.xml
index 4ee98742a..e4de27e76 100644
--- a/modDesc.xml
+++ b/modDesc.xml
@@ -1,6 +1,6 @@
- 6.03.00049
+ 6.03.00050
CoursePlay SIX
diff --git a/settings.lua b/settings.lua
index c19004894..a9a6688af 100644
--- a/settings.lua
+++ b/settings.lua
@@ -11,50 +11,57 @@ function courseplay:openCloseHud(vehicle, open)
end;
end;
-function courseplay:setCpMode(vehicle, modeNum, dontSetAIDriver)
+function courseplay:setCpMode(vehicle, modeNum)
if vehicle.cp.mode ~= modeNum then
vehicle.cp.mode = modeNum;
courseplay.utils:setOverlayUVsPx(vehicle.cp.hud.currentModeIcon, courseplay.hud.bottomInfo.modeUVsPx[modeNum], courseplay.hud.iconSpriteSize.x, courseplay.hud.iconSpriteSize.y);
- if not dontSetAIDriver then
- -- another ugly hack: when this is called from loadVehicleCPSettings,
- -- setAIDriver fails as not everything is loaded yet, so just for that case,
- -- don't call it from here.
- courseplay:setAIDriver(vehicle, modeNum)
- end
+ courseplay.infoVehicle(vehicle, 'Setting mode %d', modeNum)
+ courseplay:setAIDriver(vehicle, modeNum)
end;
end;
function courseplay:setAIDriver(vehicle, mode)
+
+ local errorHandler = function(err)
+ printCallstack()
+ courseplay.infoVehicle(vehicle, "Exception, can't init mode %d: %s", mode, tostring(err))
+ return err
+ end
+
if vehicle.cp.driver then
vehicle.cp.driver:delete()
end
- local status,driver,err
+
+ local status, result
if mode == courseplay.MODE_TRANSPORT then
- ---@type AIDriver
- status,driver,err,errDriverName = xpcall(AIDriver, function(err) printCallstack(); return self,err,"AIDriver" end, vehicle)
- --local status, err = xpcall(self.cp.driver.update, function(err) printCallstack(); return err end, self.cp.driver, dt)
+ status, result = xpcall(AIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_GRAIN_TRANSPORT then
- status,driver,err,errDriverName = xpcall(GrainTransportAIDriver, function(err) printCallstack(); return self,err,"GrainTransportAIDriver" end, vehicle)
+ status, result = xpcall(GrainTransportAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_COMBI then
- status,driver,err,errDriverName = xpcall(CombineUnloadAIDriver, function(err) printCallstack(); return self,err,"CombineUnloadAIDriver" end, vehicle)
+ status, result = xpcall(CombineUnloadAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_OVERLOADER then
- status,driver,err,errDriverName = xpcall(OverloaderAIDriver, function(err) printCallstack(); return self,err,"OverloaderAIDriver" end, vehicle)
+ status, result = xpcall(OverloaderAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_SHOVEL_FILL_AND_EMPTY then
- status,driver,err,errDriverName = xpcall(ShovelModeAIDriver.create, function(err) printCallstack(); return self,err,"ShovelModeAIDriver" end, vehicle)
+ status, result = xpcall(ShovelModeAIDriver.create, errorHandler, vehicle)
elseif mode == courseplay.MODE_SEED_FERTILIZE then
- status,driver,err,errDriverName = xpcall(FillableFieldworkAIDriver, function(err) printCallstack(); return self,err,"FillableFieldworkAIDriver" end, vehicle)
+ status, result = xpcall(FillableFieldworkAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_FIELDWORK then
- status,driver,err,errDriverName = xpcall(UnloadableFieldworkAIDriver.create, function(err) printCallstack(); return self,err,"UnloadableFieldworkAIDriver" end, vehicle)
+ status, result = xpcall(UnloadableFieldworkAIDriver.create, errorHandler, vehicle)
elseif mode == courseplay.MODE_BALE_COLLECTOR then
- status,driver,err,errDriverName = xpcall(BaleCollectorAIDriver, function(err) printCallstack(); return self,err,"BaleCollectorAIDriver" end, vehicle)
+ status, result = xpcall(BaleCollectorAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_BUNKERSILO_COMPACTER then
- status,driver,err,errDriverName = xpcall(LevelCompactAIDriver, function(err) printCallstack(); return self,err,"LevelCompactAIDriver" end, vehicle)
+ status, result = xpcall(LevelCompactAIDriver, errorHandler, vehicle)
elseif mode == courseplay.MODE_FIELD_SUPPLY then
- status,driver,err,errDriverName = xpcall(FieldSupplyAIDriver, function(err) printCallstack(); return self,err,"FieldSupplyAIDriver" end, vehicle)
+ status, result = xpcall(FieldSupplyAIDriver, errorHandler, vehicle)
end
- vehicle.cp.driver = driver
- if not status then
- courseplay.infoVehicle(vehicle, "Exception, can't init %s, %s", errDriverName,tostring(err))
+ if status then
+ vehicle.cp.driver = result
+ else
+ -- give it another try as a fallback level
+ courseplay.infoVehicle(vehicle, 'Retrying initialization in mode 5')
+ status, result = xpcall(AIDriver, errorHandler, vehicle)
+ vehicle.cp.driver = status and result or nil
+ vehicle.cp.mode = courseplay.MODE_TRANSPORT
end
end
@@ -1817,6 +1824,7 @@ function StartingPointSetting:init(vehicle)
'COURSEPLAY_START_AT_POINT', 'COURSEPLAY_START_AT_POINT', vehicle, values, texts)
end
+-- TODO: this should probably part of the specific driver mode?
function StartingPointSetting:getValuesForMode(mode)
if mode == courseplay.MODE_COMBI or mode == courseplay.MODE_OVERLOADER then
return {
diff --git a/translations/translation_br.xml b/translations/translation_br.xml
index b61f8d90d..0f52a8003 100644
--- a/translations/translation_br.xml
+++ b/translations/translation_br.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_cs.xml b/translations/translation_cs.xml
index 69f50b744..ad8b66337 100644
--- a/translations/translation_cs.xml
+++ b/translations/translation_cs.xml
@@ -25,7 +25,7 @@
-
+
@@ -283,7 +283,7 @@
-
+
diff --git a/translations/translation_cz.xml b/translations/translation_cz.xml
index 2b6a8760d..fe4542784 100644
--- a/translations/translation_cz.xml
+++ b/translations/translation_cz.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_de.xml b/translations/translation_de.xml
index 1ea904561..01a3f8ae0 100644
--- a/translations/translation_de.xml
+++ b/translations/translation_de.xml
@@ -25,7 +25,7 @@
-
+
@@ -283,7 +283,7 @@
-
+
diff --git a/translations/translation_en.xml b/translations/translation_en.xml
index 39c4c516f..3a0f2939f 100644
--- a/translations/translation_en.xml
+++ b/translations/translation_en.xml
@@ -25,7 +25,7 @@
-
+
@@ -284,7 +284,7 @@
-
+
diff --git a/translations/translation_es.xml b/translations/translation_es.xml
index 908df402c..dc86f9798 100644
--- a/translations/translation_es.xml
+++ b/translations/translation_es.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_fr.xml b/translations/translation_fr.xml
index 8b3d131d5..9ee720db4 100644
--- a/translations/translation_fr.xml
+++ b/translations/translation_fr.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_hu.xml b/translations/translation_hu.xml
index beb963981..a62d3c04f 100644
--- a/translations/translation_hu.xml
+++ b/translations/translation_hu.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_it.xml b/translations/translation_it.xml
index dbe550a72..2dc26841e 100644
--- a/translations/translation_it.xml
+++ b/translations/translation_it.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_jp.xml b/translations/translation_jp.xml
index b63f8a143..9386d6fb6 100644
--- a/translations/translation_jp.xml
+++ b/translations/translation_jp.xml
@@ -25,7 +25,7 @@
-
+
@@ -283,7 +283,7 @@
-
+
diff --git a/translations/translation_nl.xml b/translations/translation_nl.xml
index ad6193956..23959d78d 100644
--- a/translations/translation_nl.xml
+++ b/translations/translation_nl.xml
@@ -25,7 +25,7 @@
-
+
@@ -279,7 +279,7 @@
-
+
diff --git a/translations/translation_pl.xml b/translations/translation_pl.xml
index 98c8f720e..e1cebece0 100644
--- a/translations/translation_pl.xml
+++ b/translations/translation_pl.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_pt.xml b/translations/translation_pt.xml
index f4e2d9d74..ddd8d86fa 100644
--- a/translations/translation_pt.xml
+++ b/translations/translation_pt.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_ru.xml b/translations/translation_ru.xml
index f0596ba86..b68c5f366 100644
--- a/translations/translation_ru.xml
+++ b/translations/translation_ru.xml
@@ -25,7 +25,7 @@
-
+
diff --git a/translations/translation_sl.xml b/translations/translation_sl.xml
index 56db05325..31553e04d 100644
--- a/translations/translation_sl.xml
+++ b/translations/translation_sl.xml
@@ -25,7 +25,7 @@
-
+
@@ -283,7 +283,7 @@
-
+