Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- AIConveyorBelt
- AIImplement
- AIVehicle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BaseMaterial
- BunkerSiloCompacter
- BunkerSiloInteractor
- BuyableBale
- CCTDrivable
- Combine
- ConnectionHoses
- ConveyorBelt
- Cover
- CrabSteering
- Crawlers
- Cultivator
- Cutter
- Cylindered
- CylinderedFoldable
- Dashboard
- Dischargeable
- Drivable
- DynamicallyLoadedParts
- DynamicMountAttacher
- Enterable
- FertilizingCultivator
- FertilizingSowingMachine
- FillTriggerVehicle
- FillUnit
- FillVolume
- Foldable
- FoliageBending
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- GroundAdjustedNodes
- GroundReference
- Honk
- HookLiftContainer
- HookLiftTrailer
- IKChains
- JigglingParts
- Leveler
- Lights
- LivestockTrailer
- Locomotive
- LogGrab
- ManureBarrel
- MixerWagon
- Motorized
- Mountable
- Mower
- Pickup
- Pipe
- Plow
- PowerConsumer
- PowerTakeOffs
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- Rideable
- RidgeMarker
- Roller
- Ropes
- SemiTrailerFront
- Shovel
- SlopeCompensation
- SmartAttach
- SowingMachine
- SpeedRotatingParts
- SplineVehicle
- Sprayer
- StrawBlower
- StumpCutter
- Suspensions
- Tedder
- TensionBeltObject
- TensionBelts
- TipOccluder
- Trailer
- TreePlanter
- TreeSaw
- TurnOnVehicle
- Washable
- WaterTrailer
- Wearable
- Weeder
- Wheels
- Windrower
- Wipers
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkMode
- WorkParticles
- Triggers
- Utils
- Vehicles
- Weather
Engine v1.7.1.0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- XML
- general
Foundation Reference
Mower
DescriptionSpecialization for vehicles with grass mowing functionalityFunctions
- actionEventToggleDrop
- doCheckSpeedLimit
- getCanBeSelected
- getDefaultSpeedLimit
- getDirtMultiplier
- getDropArea
- getMowerLoadPercentage
- getWearMultiplier
- initSpecialization
- loadWorkAreaFromXML
- onDelete
- onEndWorkAreaProcessing
- onLoad
- onReadStream
- onReadUpdateStream
- onRegisterActionEvents
- onStartWorkAreaProcessing
- onTurnedOff
- onTurnedOn
- onWriteStream
- onWriteUpdateStream
- prerequisitesPresent
- processDropArea
- processMowerArea
- registerEventListeners
- registerFunctions
- registerOverwrittenFunctions
- setDropEffectEnabled
- setUseMowerWindrowDropAreas
- updateActionEventToggleDrop
actionEventToggleDrop
DescriptionDefinitionactionEventToggleDrop()Code
584 | function Mower.actionEventToggleDrop(self, actionName, inputValue, callbackState, isAnalog) |
585 | local spec = self.spec_mower |
586 | self:setUseMowerWindrowDropAreas(not spec.useWindrowDropAreas) |
587 | end |
doCheckSpeedLimit
DescriptionReturns if speed limit should be checkedDefinition
doCheckSpeedLimit()Return Values
boolean | checkSpeedlimit | check speed limit |
445 | function Mower:doCheckSpeedLimit(superFunc) |
446 | return superFunc(self) or (self:getIsTurnedOn() and (self.getIsLowered == nil or self:getIsLowered())) |
447 | end |
getCanBeSelected
DescriptionDefinitiongetCanBeSelected()Code
451 | function Mower:getCanBeSelected(superFunc) |
452 | return true |
453 | end |
getDefaultSpeedLimit
DescriptionReturns default speed limitDefinition
getDefaultSpeedLimit()Return Values
float | speedLimit | speed limit |
578 | function Mower.getDefaultSpeedLimit() |
579 | return 20 |
580 | end |
getDirtMultiplier
DescriptionDefinitiongetDirtMultiplier()Code
457 | function Mower:getDirtMultiplier(superFunc) |
458 | local spec = self.spec_mower |
459 | |
460 | local multiplier = superFunc(self) |
461 | |
462 | if spec.isWorking then |
463 | multiplier = multiplier + self:getWorkDirtMultiplier() * self:getLastSpeed() / self.speedLimit |
464 | end |
465 | |
466 | return multiplier |
467 | end |
getDropArea
DescriptionDefinitiongetDropArea()Code
342 | function Mower:getDropArea(workArea) |
343 | if workArea.dropWindrow then |
344 | local dropArea = workArea |
345 | if workArea.dropAreaIndex ~= nil then |
346 | dropArea = self.spec_workArea.workAreas[workArea.dropAreaIndex] |
347 | if dropArea == nil then |
348 | print("Warning: Invalid dropAreaIndex '"..tostring(workArea.dropAreaIndex).."' in '"..tostring(self.configFileName).."'!") |
349 | workArea.dropAreaIndex = nil |
350 | end |
351 | end |
352 | return dropArea |
353 | end |
354 | |
355 | return nil |
356 | end |
getMowerLoadPercentage
DescriptionDefinitiongetMowerLoadPercentage()Code
566 | function Mower:getMowerLoadPercentage() |
567 | if self.spec_mower ~= nil then |
568 | return self.spec_mower.workAreaParameters.lastUsedAreasPct |
569 | end |
570 | |
571 | return 0 |
572 | end |
getWearMultiplier
DescriptionDefinitiongetWearMultiplier()Code
471 | function Mower:getWearMultiplier(superFunc) |
472 | local spec = self.spec_mower |
473 | |
474 | local multiplier = superFunc(self) |
475 | |
476 | if spec.isWorking then |
477 | multiplier = multiplier + self:getWorkWearMultiplier() * self:getLastSpeed() / self.speedLimit |
478 | end |
479 | |
480 | return multiplier |
481 | end |
initSpecialization
DescriptionCalled on specialization initializingDefinition
initSpecialization()Code
17 | function Mower.initSpecialization() |
18 | g_workAreaTypeManager:addWorkAreaType("mower", false) |
19 | end |
loadWorkAreaFromXML
DescriptionLoads work areas from xmlDefinition
loadWorkAreaFromXML(table workArea, integer xmlFile, string key)Arguments
table | workArea | workArea |
integer | xmlFile | id of xml object |
string | key | key |
boolean | success | success |
400 | function Mower:loadWorkAreaFromXML(superFunc, workArea, xmlFile, key) |
401 | local retValue = superFunc(self, workArea, xmlFile, key) |
402 | |
403 | if workArea.type == WorkAreaType.DEFAULT then |
404 | workArea.type = WorkAreaType.MOWER |
405 | end |
406 | |
407 | if workArea.type == WorkAreaType.MOWER then |
408 | workArea.dropWindrow = Utils.getNoNil(getXMLBool(xmlFile, key .. ".mower#dropWindrow"), true) |
409 | workArea.dropAreaIndex = Utils.getNoNil(getXMLInt(xmlFile, key .. ".mower#dropAreaIndex"), 1) |
410 | |
411 | workArea.lastPickupLiters = 0 |
412 | end |
413 | |
414 | if workArea.type == WorkAreaType.AUXILIARY then |
415 | workArea.litersToDrop = 0 |
416 | if self.spec_mower.dropAreas == nil then |
417 | self.spec_mower.dropAreas = {} |
418 | end |
419 | table.insert(self.spec_mower.dropAreas, workArea) |
420 | end |
421 | |
422 | return retValue |
423 | end |
onDelete
DescriptionCalled on deletingDefinition
onDelete()Code
172 | function Mower:onDelete() |
173 | if self.isClient then |
174 | local spec = self.spec_mower |
175 | |
176 | for _, dropEffect in pairs(spec.dropEffects) do |
177 | g_effectManager:deleteEffects(dropEffect.effects) |
178 | end |
179 | g_animationManager:deleteAnimations(spec.animationNodes) |
180 | end |
181 | end |
onEndWorkAreaProcessing
DescriptionDefinitiononEndWorkAreaProcessing()Code
534 | function Mower:onEndWorkAreaProcessing(dt, hasProcessed) |
535 | local spec = self.spec_mower |
536 | |
537 | for _, dropArea in ipairs(spec.dropAreas) do |
538 | if dropArea.litersToDrop > 0 then |
539 | self:processDropArea(dropArea, dt) |
540 | end |
541 | end |
542 | |
543 | if self.isServer then |
544 | local lastStatsArea = spec.workAreaParameters.lastStatsArea |
545 | local lastTotalArea = spec.workAreaParameters.lastTotalArea |
546 | |
547 | if lastStatsArea > 0 then |
548 | local ha = MathUtil.areaToHa(lastStatsArea, g_currentMission:getFruitPixelsToSqm()) -- 4096px are mapped to 2048m |
549 | local stats = g_currentMission:farmStats(self:getLastTouchedFarmlandFarmId()) |
550 | stats:updateStats("threshedHectares", ha) |
551 | stats:updateStats("workedHectares", ha) |
552 | end |
553 | end |
554 | |
555 | spec.workAreaParameters.lastUsedAreasTime = spec.workAreaParameters.lastUsedAreasTime + dt |
556 | if spec.workAreaParameters.lastUsedAreasTime > 500 then |
557 | spec.workAreaParameters.lastUsedAreasPct = spec.workAreaParameters.lastUsedAreas / math.max(spec.workAreaParameters.lastUsedAreasSum, 0.01) |
558 | spec.workAreaParameters.lastUsedAreas = 0 |
559 | spec.workAreaParameters.lastUsedAreasSum = 0 |
560 | spec.workAreaParameters.lastUsedAreasTime = 0 |
561 | end |
562 | end |
onLoad
DescriptionCalled on loadingDefinition
onLoad(table savegame)Arguments
table | savegame | savegame |
69 | function Mower:onLoad(savegame) |
70 | local spec = self.spec_mower |
71 | |
72 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.mowerEffects.mowerEffect", "vehicle.mower.dropEffects.dropEffect") --FS17 to FS19 |
73 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.mowerEffects.mowerEffect#mowerCutArea", "vehicle.mower.dropEffects.dropEffect#dropAreaIndex") --FS17 to FS19 |
74 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.turnedOnRotationNodes.turnedOnRotationNode#type", "vehicle.mower.turnOnNodes.turnOnNode", "mower") --FS17 to FS19 |
75 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.mowerStartSound", "vehicle.turnOnVehicle.sounds.start") --FS17 to FS19 |
76 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.mowerStopSound", "vehicle.turnOnVehicle.sounds.stop") --FS17 to FS19 |
77 | XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.mowerSound", "vehicle.turnOnVehicle.sounds.work") --FS17 to FS19 |
78 | |
79 | if self.isClient then |
80 | spec.animationNodes = g_animationManager:loadAnimations(self.xmlFile, "vehicle.mower.animationNodes", self.components, self, self.i3dMappings) |
81 | |
82 | spec.dropEffects = {} |
83 | local i = 0 |
84 | while true do |
85 | local key = string.format("vehicle.mower.dropEffects.dropEffect(%d)", i) |
86 | if not hasXMLProperty(self.xmlFile, key) then |
87 | break |
88 | end |
89 | local effects = g_effectManager:loadEffect(self.xmlFile, key, self.components, self, self.i3dMappings) |
90 | if effects ~= nil then |
91 | local dropEffect = {} |
92 | dropEffect.effects = effects |
93 | dropEffect.dropAreaIndex = Utils.getNoNil(getXMLInt(self.xmlFile, key .. "#dropAreaIndex"), 1) |
94 | dropEffect.workAreaIndex = getXMLInt(self.xmlFile, key .. "#workAreaIndex") |
95 | if self.spec_workArea.workAreas[dropEffect.dropAreaIndex] == nil then |
96 | g_logManager:xmlWarning(self.configFileName, "Invalid dropAreaIndex '%s' in '%s'", dropEffect.dropAreaIndex, key) |
97 | dropEffect.dropAreaIndex = nil |
98 | end |
99 | dropEffect.activeTime = -1 |
100 | dropEffect.activeTimeDuration = 750 |
101 | dropEffect.isActive = false |
102 | dropEffect.isActiveSent = false |
103 | table.insert(spec.dropEffects, dropEffect) |
104 | end |
105 | i = i + 1 |
106 | end |
107 | end |
108 | |
109 | if spec.dropAreas == nil then |
110 | spec.dropAreas = {} |
111 | end |
112 | |
113 | spec.fruitTypeConverters = {} |
114 | local converter = getXMLString(self.xmlFile, "vehicle.mower#fruitTypeConverter") |
115 | if converter ~= nil then |
116 | local data = g_fruitTypeManager:getConverterDataByName(converter) |
117 | if data ~= nil then |
118 | for input, converted in pairs(data) do |
119 | spec.fruitTypeConverters[input] = converted |
120 | end |
121 | end |
122 | else |
123 | print(string.format("Warning: Missing fruit type converter in '%s'", self.configFileName)) |
124 | end |
125 | |
126 | spec.fillUnitIndex = getXMLFloat(self.xmlFile, "vehicle.mower#fillUnitIndex") |
127 | spec.pickupFillScale = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.mower#pickupFillScale"), 1) |
128 | |
129 | spec.toggleWindrowDropEnableText = getXMLString(self.xmlFile, "vehicle.mower.toggleWindrowDrop#enableText") |
130 | spec.toggleWindrowDropDisableText = getXMLString(self.xmlFile, "vehicle.mower.toggleWindrowDrop#disableText") |
131 | if spec.toggleWindrowDropEnableText ~= nil then |
132 | spec.toggleWindrowDropEnableText = g_i18n:convertText(spec.toggleWindrowDropEnableText, self.customEnvironment) |
133 | end |
134 | if spec.toggleWindrowDropDisableText ~= nil then |
135 | spec.toggleWindrowDropDisableText = g_i18n:convertText(spec.toggleWindrowDropDisableText, self.customEnvironment) |
136 | end |
137 | |
138 | spec.toggleWindrowDropAnimation = getXMLString(self.xmlFile, "vehicle.mower.toggleWindrowDrop#animationName") |
139 | spec.enableWindrowDropAnimationSpeed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.mower.toggleWindrowDrop#animationEnableSpeed"), 1) |
140 | spec.disableWindrowDropAnimationSpeed = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.mower.toggleWindrowDrop#animationDisableSpeed"), -spec.enableWindrowDropAnimationSpeed) |
141 | |
142 | spec.useWindrowDropAreas = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.mower.toggleWindrowDrop#startEnabled"), false) |
143 | |
144 | spec.workAreaParameters = {} |
145 | spec.workAreaParameters.lastChangedArea = 0 |
146 | spec.workAreaParameters.lastStatsArea = 0 |
147 | spec.workAreaParameters.lastTotalArea = 0 |
148 | spec.workAreaParameters.lastUsedAreas = 0 |
149 | spec.workAreaParameters.lastUsedAreasSum = 0 |
150 | spec.workAreaParameters.lastUsedAreasPct = 0 |
151 | spec.workAreaParameters.lastUsedAreasTime = 0 |
152 | |
153 | spec.isWorking = false |
154 | |
155 | spec.dirtyFlag = self:getNextDirtyFlag() |
156 | |
157 | if self.addAITerrainDetailRequiredRange ~= nil then |
158 | self:addAITerrainDetailRequiredRange(g_currentMission.grassValue, g_currentMission.grassValue, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels) |
159 | self:addAITerrainDetailRequiredRange(g_currentMission.sowingValue, g_currentMission.sowingValue, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels) |
160 | end |
161 | |
162 | if self.addAIFruitRequirement ~= nil then |
163 | for inputFruitType, _ in pairs(spec.fruitTypeConverters) do |
164 | local desc = g_fruitTypeManager:getFruitTypeByIndex(inputFruitType) |
165 | self:addAIFruitRequirement(desc.index, desc.minHarvestingGrowthState, desc.maxHarvestingGrowthState) |
166 | end |
167 | end |
168 | end |
onReadStream
DescriptionCalled on client side on joinDefinition
onReadStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
187 | function Mower:onReadStream(streamId, connection) |
188 | local spec = self.spec_mower |
189 | if spec.toggleWindrowDropEnableText ~= nil and spec.toggleWindrowDropDisableText ~= nil then |
190 | local useMowerWindrowDropAreas = streamReadBool(streamId) |
191 | self:setUseMowerWindrowDropAreas(useMowerWindrowDropAreas, true) |
192 | end |
193 | end |
onReadUpdateStream
DescriptionCalled on on updateDefinition
onReadUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
211 | function Mower:onReadUpdateStream(streamId, timestamp, connection) |
212 | if connection:getIsServer() then |
213 | local spec = self.spec_mower |
214 | |
215 | if #spec.dropEffects > 0 then |
216 | if streamReadBool(streamId) then |
217 | for _, dropEffect in ipairs(spec.dropEffects) do |
218 | dropEffect.fillType = streamReadUIntN(streamId, FillTypeManager.SEND_NUM_BITS) |
219 | self:setDropEffectEnabled(dropEffect, streamReadBool(streamId)) |
220 | end |
221 | end |
222 | end |
223 | end |
224 | end |
onRegisterActionEvents
DescriptionDefinitiononRegisterActionEvents()Code
427 | function Mower:onRegisterActionEvents(isActiveForInput, isActiveForInputIgnoreSelection) |
428 | if self.isClient then |
429 | local spec = self.spec_mower |
430 | self:clearActionEventsTable(spec.actionEvents) |
431 | |
432 | if isActiveForInputIgnoreSelection then |
433 | if spec.toggleWindrowDropEnableText ~= nil and spec.toggleWindrowDropDisableText ~= nil then |
434 | local _, actionEventId = self:addActionEvent(spec.actionEvents, InputAction.IMPLEMENT_EXTRA3, self, Mower.actionEventToggleDrop, false, true, false, true, nil) |
435 | g_inputBinding:setActionEventTextPriority(actionEventId, GS_PRIO_LOW) |
436 | Mower.updateActionEventToggleDrop(self) |
437 | end |
438 | end |
439 | end |
440 | end |
onStartWorkAreaProcessing
DescriptionDefinitiononStartWorkAreaProcessing()Code
509 | function Mower:onStartWorkAreaProcessing(dt) |
510 | local spec = self.spec_mower |
511 | |
512 | if self.isServer then |
513 | for _, dropEffect in pairs(spec.dropEffects) do |
514 | -- activate or deactivate dropEffect. Could be 1 frame delayed but safes a second for loop in onEndWorkAreaProcessing |
515 | if dropEffect.isActive ~= dropEffect.isActiveSent then |
516 | dropEffect.isActiveSent = dropEffect.isActive |
517 | self:setDropEffectEnabled(dropEffect, dropEffect.isActiveSent) |
518 | self:raiseDirtyFlags(spec.dirtyFlag) |
519 | end |
520 | |
521 | dropEffect.isActive = false |
522 | end |
523 | end |
524 | |
525 | spec.workAreaParameters.lastChangedArea = 0 |
526 | spec.workAreaParameters.lastStatsArea = 0 |
527 | spec.workAreaParameters.lastTotalArea = 0 |
528 | |
529 | spec.isWorking = false |
530 | end |
onTurnedOff
DescriptionCalled on turn offDefinition
onTurnedOff(boolean noEventSend)Arguments
boolean | noEventSend | no event send |
496 | function Mower:onTurnedOff() |
497 | if self.isClient then |
498 | local spec = self.spec_mower |
499 | for _, dropEffect in pairs(spec.dropEffects) do |
500 | self:setDropEffectEnabled(dropEffect, false) |
501 | end |
502 | |
503 | g_animationManager:stopAnimations(spec.animationNodes) |
504 | end |
505 | end |
onTurnedOn
DescriptionCalled on turn offDefinition
onTurnedOn(boolean noEventSend)Arguments
boolean | noEventSend | no event send |
486 | function Mower:onTurnedOn() |
487 | if self.isClient then |
488 | local spec = self.spec_mower |
489 | g_animationManager:startAnimations(spec.animationNodes) |
490 | end |
491 | end |
onWriteStream
DescriptionCalled on server side on joinDefinition
onWriteStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
199 | function Mower:onWriteStream(streamId, connection) |
200 | local spec = self.spec_mower |
201 | if spec.toggleWindrowDropEnableText ~= nil and spec.toggleWindrowDropDisableText ~= nil then |
202 | streamWriteBool(streamId, spec.useWindrowDropAreas) |
203 | end |
204 | end |
onWriteUpdateStream
DescriptionCalled on on updateDefinition
onWriteUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
231 | function Mower:onWriteUpdateStream(streamId, connection, dirtyMask) |
232 | if not connection:getIsServer() then |
233 | local spec = self.spec_mower |
234 | |
235 | if #spec.dropEffects > 0 then |
236 | if streamWriteBool(streamId, bitAND(dirtyMask, spec.dirtyFlag) ~= 0) then |
237 | for _, dropEffect in ipairs(spec.dropEffects) do |
238 | streamWriteUIntN(streamId, dropEffect.fillType or FillType.UNKNOWN, FillTypeManager.SEND_NUM_BITS) |
239 | streamWriteBool(streamId, dropEffect.isActiveSent) |
240 | end |
241 | end |
242 | end |
243 | end |
244 | end |
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
25 | function Mower.prerequisitesPresent(specializations) |
26 | return SpecializationUtil.hasSpecialization(WorkArea, specializations) and SpecializationUtil.hasSpecialization(TurnOnVehicle, specializations) |
27 | end |
processDropArea
DescriptionDefinitionprocessDropArea()Code
298 | function Mower:processDropArea(dropArea, dt) |
299 | local spec = self.spec_mower |
300 | |
301 | local dropped, lineOffset = 0 |
302 | if dropArea.litersToDrop > g_densityMapHeightManager:getMinValidLiterValue(dropArea.fillType) then |
303 | local xs,_,zs = getWorldTranslation(dropArea.start) |
304 | local xw,_,zw = getWorldTranslation(dropArea.width) |
305 | local xh,_,zh = getWorldTranslation(dropArea.height) |
306 | |
307 | local f = math.random() -- any benefit from randomness in this case? |
308 | local sx = xs + (f * (xh - xs)) |
309 | local sz = zs + (f * (zh - zs)) |
310 | local sy = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, sx,0,sz) |
311 | |
312 | local f = math.random() |
313 | local ex = xw + (f * (xh - xs)) |
314 | local ez = zw + (f * (zh - zs)) |
315 | local ey = getTerrainHeightAtWorldPos(g_currentMission.terrainRootNode, ex,0,ez) |
316 | |
317 | dropped, lineOffset = DensityMapHeightUtil.tipToGroundAroundLine(self, dropArea.litersToDrop, dropArea.fillType, sx,sy,sz, ex,ey,ez, 0, nil, dropArea.dropLineOffset, false, nil, false) |
318 | |
319 | dropArea.litersToDrop = dropArea.litersToDrop - dropped |
320 | dropArea.dropLineOffset = lineOffset |
321 | end |
322 | |
323 | for _, dropEffect in pairs(spec.dropEffects) do |
324 | if dropEffect.dropAreaIndex == dropArea.index and dropped > 0 and (dropEffect.workAreaIndex == nil or dropEffect.workAreaIndex == dropArea.workAreaIndex) then |
325 | if dropEffect.fillType ~= dropArea.fillType then |
326 | dropEffect.fillType = dropArea.fillType |
327 | g_effectManager:setFillType(dropEffect.effects, dropEffect.fillType) |
328 | end |
329 | dropEffect.activeTime = dropEffect.activeTimeDuration |
330 | dropEffect.isActive = true |
331 | else |
332 | dropEffect.activeTime = math.max(dropEffect.activeTime - dt, 0) |
333 | if dropEffect.activeTime > 0 then |
334 | dropEffect.isActive = true |
335 | end |
336 | end |
337 | end |
338 | end |
processMowerArea
DescriptionDefinitionprocessMowerArea()Code
248 | function Mower:processMowerArea(workArea, dt) |
249 | local spec = self.spec_mower |
250 | |
251 | if self:getLastSpeed() > 1 then |
252 | spec.isWorking = true |
253 | end |
254 | |
255 | local xs,_,zs = getWorldTranslation(workArea.start) |
256 | local xw,_,zw = getWorldTranslation(workArea.width) |
257 | local xh,_,zh = getWorldTranslation(workArea.height) |
258 | |
259 | for inputFruitType, converterData in pairs(spec.fruitTypeConverters) do |
260 | local changedArea, totalArea, sprayFactor, plowFactor, limeFactor, weedFactor, _, _ = FSDensityMapUtil.cutFruitArea(inputFruitType, xs,zs, xw,zw, xh,zh, true, true, false) |
261 | |
262 | if changedArea > 0 then |
263 | local multiplier = g_currentMission:getHarvestScaleMultiplier(inputFruitType, sprayFactor, plowFactor, limeFactor, weedFactor) |
264 | changedArea = changedArea * multiplier |
265 | |
266 | local pixelToSqm = g_currentMission:getFruitPixelsToSqm() |
267 | local sqm = changedArea * pixelToSqm |
268 | local litersToDrop = sqm * g_fruitTypeManager:getFillTypeLiterPerSqm(converterData.fillTypeIndex, 1) |
269 | |
270 | workArea.lastPickupLiters = litersToDrop |
271 | |
272 | local dropArea = self:getDropArea(workArea) |
273 | if dropArea ~= nil then |
274 | dropArea.litersToDrop = dropArea.litersToDrop + litersToDrop |
275 | dropArea.fillType = converterData.fillTypeIndex |
276 | dropArea.workAreaIndex = workArea.index |
277 | elseif spec.fillUnitIndex ~= nil then |
278 | if self.isServer then |
279 | self:addFillUnitFillLevel(self:getOwnerFarmId(), spec.fillUnitIndex, litersToDrop, converterData.fillTypeIndex, ToolType.UNDEFINED) |
280 | end |
281 | end |
282 | |
283 | spec.workAreaParameters.lastChangedArea = spec.workAreaParameters.lastChangedArea + changedArea |
284 | spec.workAreaParameters.lastStatsArea = spec.workAreaParameters.lastStatsArea + changedArea |
285 | spec.workAreaParameters.lastTotalArea = spec.workAreaParameters.lastTotalArea + totalArea |
286 | |
287 | spec.workAreaParameters.lastUsedAreas = spec.workAreaParameters.lastUsedAreas + 1 |
288 | end |
289 | end |
290 | |
291 | spec.workAreaParameters.lastUsedAreasSum = spec.workAreaParameters.lastUsedAreasSum + 1 |
292 | |
293 | return spec.workAreaParameters.lastChangedArea, spec.workAreaParameters.lastTotalArea |
294 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
51 | function Mower.registerEventListeners(vehicleType) |
52 | SpecializationUtil.registerEventListener(vehicleType, "onLoad", Mower) |
53 | SpecializationUtil.registerEventListener(vehicleType, "onDelete", Mower) |
54 | SpecializationUtil.registerEventListener(vehicleType, "onReadStream", Mower) |
55 | SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", Mower) |
56 | SpecializationUtil.registerEventListener(vehicleType, "onReadUpdateStream", Mower) |
57 | SpecializationUtil.registerEventListener(vehicleType, "onWriteUpdateStream", Mower) |
58 | SpecializationUtil.registerEventListener(vehicleType, "onRegisterActionEvents", Mower) |
59 | SpecializationUtil.registerEventListener(vehicleType, "onTurnedOn", Mower) |
60 | SpecializationUtil.registerEventListener(vehicleType, "onTurnedOff", Mower) |
61 | SpecializationUtil.registerEventListener(vehicleType, "onStartWorkAreaProcessing", Mower) |
62 | SpecializationUtil.registerEventListener(vehicleType, "onEndWorkAreaProcessing", Mower) |
63 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
31 | function Mower.registerFunctions(vehicleType) |
32 | SpecializationUtil.registerFunction(vehicleType, "processMowerArea", Mower.processMowerArea) |
33 | SpecializationUtil.registerFunction(vehicleType, "processDropArea", Mower.processDropArea) |
34 | SpecializationUtil.registerFunction(vehicleType, "getDropArea", Mower.getDropArea) |
35 | SpecializationUtil.registerFunction(vehicleType, "setDropEffectEnabled", Mower.setDropEffectEnabled) |
36 | SpecializationUtil.registerFunction(vehicleType, "setUseMowerWindrowDropAreas", Mower.setUseMowerWindrowDropAreas) |
37 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
41 | function Mower.registerOverwrittenFunctions(vehicleType) |
42 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadWorkAreaFromXML", Mower.loadWorkAreaFromXML) |
43 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "doCheckSpeedLimit", Mower.doCheckSpeedLimit) |
44 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeSelected", Mower.getCanBeSelected) |
45 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDirtMultiplier", Mower.getDirtMultiplier) |
46 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getWearMultiplier", Mower.getWearMultiplier) |
47 | end |
setDropEffectEnabled
DescriptionEnable mower effectDefinition
setDropEffectEnabled(table mowerEffect, boolean isActive)Arguments
table | mowerEffect | mower effect |
boolean | isActive | new is active state |
362 | function Mower:setDropEffectEnabled(dropEffect, isActive) |
363 | dropEffect.isActive = isActive |
364 | if self.isClient then |
365 | if isActive then |
366 | g_effectManager:setFillType(dropEffect.effects, dropEffect.fillType) |
367 | g_effectManager:startEffects(dropEffect.effects) |
368 | else |
369 | g_effectManager:stopEffects(dropEffect.effects) |
370 | end |
371 | end |
372 | end |
setUseMowerWindrowDropAreas
DescriptionToggle use of windrower drop areasDefinition
setUseMowerWindrowDropAreas(boolean useMowerWindrowDropAreas, boolean noEventSend)Arguments
boolean | useMowerWindrowDropAreas | use mower windrow drop areas |
boolean | noEventSend | no event send |
378 | function Mower:setUseMowerWindrowDropAreas(useMowerWindrowDropAreas, noEventSend) |
379 | local spec = self.spec_mower |
380 | if useMowerWindrowDropAreas ~= spec.useWindrowDropAreas then |
381 | MowerToggleWindrowDropEvent.sendEvent(self, useMowerWindrowDropAreas, noEventSend) |
382 | spec.useWindrowDropAreas = useMowerWindrowDropAreas |
383 | |
384 | if spec.toggleWindrowDropAnimation ~= nil and self.playAnimation ~= nil then |
385 | local speed = spec.enableWindrowDropAnimationSpeed |
386 | if not useMowerWindrowDropAreas then |
387 | speed = spec.disableWindrowDropAnimationSpeed |
388 | end |
389 | self:playAnimation(spec.toggleWindrowDropAnimation, speed, nil, true) |
390 | end |
391 | end |
392 | end |
updateActionEventToggleDrop
DescriptionDefinitionupdateActionEventToggleDrop()Code
591 | function Mower.updateActionEventToggleDrop(self) |
592 | local spec = self.spec_mower |
593 | local actionEvent = spec.actionEvents[InputAction.IMPLEMENT_EXTRA3] |
594 | if actionEvent ~= nil then |
595 | local text = string.format(spec.toggleWindrowDropDisableText, self.typeDesc) |
596 | if not spec.useWindrowDropAreas then |
597 | text = string.format(spec.toggleWindrowDropEnableText, self.typeDesc) |
598 | end |
599 | g_inputBinding:setActionEventText(actionEvent.actionEventId, text) |
600 | end |
601 | end |