LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

StonePicker

Description
Specialization for all stonePickers, requires WorkArea specialization
Functions

doCheckSpeedLimit

Description
Returns if speed limit should be checked
Definition
doCheckSpeedLimit()
Return Values
booleancheckSpeedlimitcheck speed limit
Code
276function StonePicker:doCheckSpeedLimit(superFunc)
277 local spec = self.spec_stonePicker
278 return superFunc(self) or (self:getIsImplementChainLowered() and (not spec.needsActivation or self:getIsTurnedOn()))
279end

getCanBeTurnedOn

Description
Definition
getCanBeTurnedOn()
Code
366function StonePicker:getCanBeTurnedOn(superFunc)
367 local spec = self.spec_stonePicker
368
369 local freeCapacity = self:getFillUnitFreeCapacity(spec.fillUnitIndex)
370 if freeCapacity <= 0 and not self:getIsAIActive() then
371 return false
372 end
373
374 return superFunc(self)
375end

getCanToggleTurnedOn

Description
Definition
getCanToggleTurnedOn()
Code
392function StonePicker:getCanToggleTurnedOn(superFunc)
393 local spec = self.spec_stonePicker
394 if not spec.needsActivation then
395 return false
396 end
397
398 return superFunc(self)
399end

getDefaultSpeedLimit

Description
Returns default speed limit
Definition
getDefaultSpeedLimit()
Return Values
floatspeedLimitspeed limit
Code
484function StonePicker.getDefaultSpeedLimit()
485 return 10
486end

getDirtMultiplier

Description
Returns current dirt multiplier
Definition
getDirtMultiplier()
Return Values
floatdirtMultipliercurrent dirt multiplier
Code
297function StonePicker:getDirtMultiplier(superFunc)
298 local spec = self.spec_stonePicker
299
300 local multiplier = superFunc(self)
301 if self.movingDirection > 0 and spec.isWorking and (not spec.needsActivation or self:getIsTurnedOn()) then
302 multiplier = multiplier + self:getWorkDirtMultiplier() * self:getLastSpeed() / spec.speedLimit
303 end
304
305 return multiplier
306end

getDoGroundManipulation

Description
Returns if tool does ground manipulation
Definition
getDoGroundManipulation()
Return Values
booleandoGroundManipulationdo ground manipulation
Code
284function StonePicker:getDoGroundManipulation(superFunc)
285 local spec = self.spec_stonePicker
286
287 if not spec.isWorking then
288 return false
289 end
290
291 return superFunc(self)
292end

getIsWorkAreaActive

Description
Definition
getIsWorkAreaActive()
Code
341function StonePicker:getIsWorkAreaActive(superFunc, workArea)
342 if workArea.type == WorkAreaType.STONEPICKER then
343 local spec = self.spec_stonePicker
344
345 if spec.startActivationTime > g_currentMission.time then
346 return false
347 end
348
349 if spec.onlyActiveWhenLowered and self.getIsLowered ~= nil then
350 if not self:getIsLowered(false) then
351 return false
352 end
353 end
354
355 local freeCapacity = self:getFillUnitFreeCapacity(spec.fillUnitIndex)
356 if freeCapacity <= 0 and not self:getIsAIActive() then
357 return false
358 end
359 end
360
361 return superFunc(self, workArea)
362end

getTurnedOnNotAllowedWarning

Description
Definition
getTurnedOnNotAllowedWarning()
Code
379function StonePicker:getTurnedOnNotAllowedWarning(superFunc)
380 local spec = self.spec_stonePicker
381
382 local freeCapacity = self:getFillUnitFreeCapacity(spec.fillUnitIndex)
383 if freeCapacity <= 0 and not self:getIsAIActive() then
384 return spec.texts.warningToolIsFull
385 end
386
387 return superFunc(self)
388end

getWearMultiplier

Description
Returns current wear multiplier
Definition
getWearMultiplier()
Return Values
floatdirtMultipliercurrent wear multiplier
Code
312function StonePicker:getWearMultiplier(superFunc)
313 local spec = self.spec_stonePicker
314 local multiplier = superFunc(self)
315
316 if self.movingDirection > 0 and spec.isWorking and (not spec.needsActivation or self:getIsTurnedOn()) then
317 multiplier = multiplier + self:getWorkWearMultiplier() * self:getLastSpeed() / self.speedLimit
318 end
319
320 return multiplier
321end

initSpecialization

Description
Called on specialization initializing
Definition
initSpecialization()
Code
15function StonePicker.initSpecialization()
16 g_workAreaTypeManager:addWorkAreaType("stonePicker", true)
17
18 local schema = Vehicle.xmlSchema
19 schema:setXMLSpecializationType("StonePicker")
20
21 schema:register(XMLValueType.INT, "vehicle.stonePicker#fillUnitIndex", "Index of fillunit to be used for picked stones")
22 schema:register(XMLValueType.INT, "vehicle.stonePicker#loadInfoIndex", "Index of load info to use")
23 schema:register(XMLValueType.NODE_INDEX, "vehicle.stonePicker.directionNode#node", "Direction node")
24 schema:register(XMLValueType.BOOL, "vehicle.stonePicker.onlyActiveWhenLowered#value", "Only active when lowered", true)
25 schema:register(XMLValueType.BOOL, "vehicle.stonePicker.needsActivation#value", "Needs activation", true)
26
27 EffectManager.registerEffectXMLPaths(schema, "vehicle.stonePicker.effects")
28 EffectManager.registerEffectXMLPaths(schema, "vehicle.stonePicker.soilEffects")
29
30 SoundManager.registerSampleXMLPaths(schema, "vehicle.stonePicker.sounds", "work")
31 SoundManager.registerSampleXMLPaths(schema, "vehicle.stonePicker.sounds", "stone")
32
33 schema:setXMLSpecializationType()
34end

loadWorkAreaFromXML

Description
Loads work areas from xml
Definition
loadWorkAreaFromXML(table workArea, integer xmlFile, string key)
Arguments
tableworkAreaworkArea
integerxmlFileid of xml object
stringkeykey
Return Values
booleansuccesssuccess
Code
329function StonePicker:loadWorkAreaFromXML(superFunc, workArea, xmlFile, key)
330 local retValue = superFunc(self, workArea, xmlFile, key)
331
332 if workArea.type == WorkAreaType.DEFAULT then
333 workArea.type = WorkAreaType.STONEPICKER
334 end
335
336 return retValue
337end

onDeactivate

Description
Definition
onDeactivate()
Code
428function StonePicker:onDeactivate()
429 if self.isClient then
430 local spec = self.spec_stonePicker
431 g_soundManager:stopSamples(spec.samples)
432 spec.isWorkSamplePlaying = false
433 end
434end

onDelete

Description
Called on deleting
Definition
onDelete()
Code
140function StonePicker:onDelete()
141 local spec = self.spec_stonePicker
142 g_soundManager:deleteSamples(spec.samples)
143 g_effectManager:deleteEffects(spec.effects)
144 g_effectManager:deleteEffects(spec.soilEffects)
145end

onEndWorkAreaProcessing

Description
Definition
onEndWorkAreaProcessing()
Code
456function StonePicker:onEndWorkAreaProcessing(dt)
457 local spec = self.spec_stonePicker
458
459 local params = spec.workAreaParameters
460
461 if self.isServer then
462 local lastStatsArea = spec.workAreaParameters.lastStatsArea
463 if lastStatsArea > 0 then
464 self:updateLastWorkedArea(lastStatsArea)
465 end
466
467 local state = (g_time - spec.workAreaParameters.lastChangedAreaTime) < 500
468 local soilState = spec.isWorking and self:getIsOnField()
469 if spec.isEffectActive ~= state
470 or spec.effectGrowthState ~= spec.workAreaParameters.lastGrowthState
471 or soilState ~= spec.isSoilEffectActive then
472 self:setStonePickerEffectsState(state, spec.workAreaParameters.lastGrowthState, soilState)
473 self:raiseDirtyFlags(spec.dirtyFlag)
474 end
475 end
476
477 local loadInfo = self:getFillVolumeLoadInfo(spec.loadInfoIndex)
478 self:addFillUnitFillLevel(self:getOwnerFarmId(), spec.fillUnitIndex, params.pickedLiters, FillType.STONE, ToolType.UNDEFINED, loadInfo)
479end

onFillUnitFillLevelChanged

Description
Definition
onFillUnitFillLevelChanged()
Code
403function StonePicker:onFillUnitFillLevelChanged(fillUnitIndex, fillLevelDelta, fillType, toolType, fillPositionData, appliedDelta)
404 local spec = self.spec_stonePicker
405
406 if self.isServer then
407 if spec.fillUnitIndex == fillUnitIndex then
408 local freeCapacity = self:getFillUnitFreeCapacity(spec.fillUnitIndex)
409 if freeCapacity <= 0 and self:getIsTurnedOn() and not self:getIsAIActive() then
410 self:setIsTurnedOn(false, false)
411 end
412 end
413 end
414end

onLoad

Description
Called on loading
Definition
onLoad(table savegame)
Arguments
tablesavegamesavegame
Code
85function StonePicker:onLoad(savegame)
86
87 if self:getGroundReferenceNodeFromIndex(1) == nil then
88 print("Warning: No ground reference nodes in "..self.configFileName)
89 end
90
91 local spec = self.spec_stonePicker
92
93 if self.isClient then
94 spec.samples = {}
95 spec.samples.work = g_soundManager:loadSampleFromXML(self.xmlFile, "vehicle.stonePicker.sounds", "work", self.baseDirectory, self.components, 0, AudioGroup.VEHICLE, self.i3dMappings, self)
96 spec.samples.stone = g_soundManager:loadSampleFromXML(self.xmlFile, "vehicle.stonePicker.sounds", "stone", self.baseDirectory, self.components, 0, AudioGroup.VEHICLE, self.i3dMappings, self)
97 spec.isWorkSamplePlaying = false
98 spec.isStoneSamplePlaying = false
99
100 spec.effects = g_effectManager:loadEffect(self.xmlFile, "vehicle.stonePicker.effects", self.components, self, self.i3dMappings)
101 spec.soilEffects = g_effectManager:loadEffect(self.xmlFile, "vehicle.stonePicker.soilEffects", self.components, self, self.i3dMappings)
102 end
103
104 spec.fillUnitIndex = self.xmlFile:getValue("vehicle.stonePicker#fillUnitIndex", 1)
105 spec.loadInfoIndex = self.xmlFile:getValue("vehicle.stonePicker#loadInfoIndex", 1)
106 spec.directionNode = self.xmlFile:getValue("vehicle.stonePicker.directionNode#node", self.components[1].node, self.components, self.i3dMappings)
107 spec.onlyActiveWhenLowered = self.xmlFile:getValue("vehicle.stonePicker.onlyActiveWhenLowered#value", true)
108 spec.needsActivation = self.xmlFile:getValue("vehicle.stonePicker.needsActivation#value", true)
109
110 spec.startActivationTimeout = 2000
111 spec.startActivationTime = 0
112 spec.hasGroundContact = false
113 spec.isWorking = false
114 spec.isEffectActive = false
115 spec.effectGrowthState = 1
116 spec.isSoilEffectActive = false
117
118 spec.texts = {}
119 spec.texts.warningToolIsFull = g_i18n:getText("warning_toolIsFull")
120
121 spec.workAreaParameters = {}
122 spec.workAreaParameters.angle = 0
123 spec.workAreaParameters.pickedLiters = 0
124 spec.workAreaParameters.lastChangedArea = 0
125 spec.workAreaParameters.lastChangedAreaTime = -math.huge
126 spec.workAreaParameters.lastGrowthState = 1
127 spec.workAreaParameters.lastStatsArea = 0
128 spec.workAreaParameters.lastTotalArea = 0
129
130 if self.isServer then
131 local firstSowableValue, lastSowableValue = g_currentMission.fieldGroundSystem:getSowableRange()
132 self:addAITerrainDetailRequiredRange(firstSowableValue, lastSowableValue)
133 end
134
135 spec.dirtyFlag = self:getNextDirtyFlag()
136end

onPostAttach

Description
Called if vehicle gets attached
Definition
onPostAttach(table attacherVehicle, integer inputJointDescIndex, integer jointDescIndex)
Arguments
tableattacherVehicleattacher vehicle
integerinputJointDescIndexindex of input attacher joint
integerjointDescIndexindex of attacher joint it gets attached to
Code
421function StonePicker:onPostAttach(attacherVehicle, inputJointDescIndex, jointDescIndex)
422 local spec = self.spec_stonePicker
423 spec.startActivationTime = g_currentMission.time + spec.startActivationTimeout
424end

onReadStream

Description
Definition
onReadStream()
Code
149function StonePicker:onReadStream(streamId, connection)
150 local state = streamReadBool(streamId)
151 local growthState = streamReadUIntN(streamId, 2)
152 local stateSoil = streamReadBool(streamId)
153 self:setStonePickerEffectsState(state, growthState, stateSoil)
154end

onReadUpdateStream

Description
Definition
onReadUpdateStream()
Code
167function StonePicker:onReadUpdateStream(streamId, timestamp, connection)
168 if connection.isServer then
169 if streamReadBool(streamId) then
170 local state = streamReadBool(streamId)
171 local growthState = streamReadUIntN(streamId, 2)
172 local stateSoil = streamReadBool(streamId)
173 self:setStonePickerEffectsState(state, growthState, stateSoil)
174 end
175 end
176end

onStartWorkAreaProcessing

Description
Definition
onStartWorkAreaProcessing()
Code
438function StonePicker:onStartWorkAreaProcessing(dt)
439 local spec = self.spec_stonePicker
440
441 spec.isWorking = false
442
443 local dx,_,dz = localDirectionToWorld(spec.directionNode, 0, 0, 1)
444 local angle = FSDensityMapUtil.convertToDensityMapAngle(MathUtil.getYRotationFromDirection(dx, dz), g_currentMission.fieldGroundSystem:getGroundAngleMaxValue())
445
446 spec.workAreaParameters.isActive = not spec.needsActivation or self:getIsTurnedOn()
447 spec.workAreaParameters.angle = angle
448 spec.workAreaParameters.pickedLiters = 0
449 spec.workAreaParameters.lastChangedArea = 0
450 spec.workAreaParameters.lastStatsArea = 0
451 spec.workAreaParameters.lastTotalArea = 0
452end

onWriteStream

Description
Definition
onWriteStream()
Code
158function StonePicker:onWriteStream(streamId, connection)
159 local spec = self.spec_stonePicker
160 streamWriteBool(streamId, spec.isEffectActive)
161 streamWriteUIntN(streamId, spec.effectGrowthState, 2)
162 streamWriteBool(streamId, spec.isSoilEffectActive)
163end

onWriteUpdateStream

Description
Definition
onWriteUpdateStream()
Code
180function StonePicker:onWriteUpdateStream(streamId, connection, dirtyMask)
181 if not connection.isServer then
182 local spec = self.spec_stonePicker
183 if streamWriteBool(streamId, bitAND(dirtyMask, spec.dirtyFlag) ~= 0) then
184 streamWriteBool(streamId, spec.isEffectActive)
185 streamWriteUIntN(streamId, spec.effectGrowthState, 2)
186 streamWriteBool(streamId, spec.isSoilEffectActive)
187 end
188 end
189end

prerequisitesPresent

Description
Checks if all prerequisite specializations are loaded
Definition
prerequisitesPresent(table specializations)
Arguments
tablespecializationsspecializations
Return Values
booleanhasPrerequisitetrue if all prerequisite specializations are loaded
Code
40function StonePicker.prerequisitesPresent(specializations)
41 return SpecializationUtil.hasSpecialization(FillUnit, specializations)
42 and SpecializationUtil.hasSpecialization(WorkArea, specializations)
43end

processStonePickerArea

Description
Definition
processStonePickerArea()
Code
193function StonePicker:processStonePickerArea(workArea, dt)
194 local spec = self.spec_stonePicker
195
196 if not spec.workAreaParameters.isActive then
197 return 0, 0
198 end
199
200 local xs,_,zs = getWorldTranslation(workArea.start)
201 local xw,_,zw = getWorldTranslation(workArea.width)
202 local xh,_,zh = getWorldTranslation(workArea.height)
203
204 local params = spec.workAreaParameters
205
206 local stoneFactor, touchedArea, totalArea = FSDensityMapUtil.updateStonePickerArea(xs,zs, xw,zw, xh,zh, params.angle)
207 local litersPerSqm = g_currentMission.stoneSystem:getLitersPerSqm()
208 local sqm = g_currentMission:getFruitPixelsToSqm() * touchedArea
209 local liters = sqm * litersPerSqm * stoneFactor
210
211 params.pickedLiters = params.pickedLiters + liters
212 params.lastChangedArea = params.lastChangedArea + touchedArea
213 params.lastStatsArea = params.lastStatsArea + touchedArea
214 params.lastTotalArea = params.lastTotalArea + totalArea
215 if touchedArea > 0 then
216 params.lastChangedAreaTime = g_time
217 params.lastGrowthState = MathUtil.clamp(math.floor(stoneFactor + 0.49), 1, 3)
218 end
219
220 FSDensityMapUtil.eraseTireTrack(xs,zs, xw,zw, xh,zh)
221
222 spec.isWorking = self:getLastSpeed() > 0.5
223
224 return touchedArea, totalArea
225end

registerEventListeners

Description
Definition
registerEventListeners()
Code
68function StonePicker.registerEventListeners(vehicleType)
69 SpecializationUtil.registerEventListener(vehicleType, "onLoad", StonePicker)
70 SpecializationUtil.registerEventListener(vehicleType, "onDelete", StonePicker)
71 SpecializationUtil.registerEventListener(vehicleType, "onReadStream", StonePicker)
72 SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", StonePicker)
73 SpecializationUtil.registerEventListener(vehicleType, "onReadUpdateStream", StonePicker)
74 SpecializationUtil.registerEventListener(vehicleType, "onWriteUpdateStream", StonePicker)
75 SpecializationUtil.registerEventListener(vehicleType, "onPostAttach", StonePicker)
76 SpecializationUtil.registerEventListener(vehicleType, "onDeactivate", StonePicker)
77 SpecializationUtil.registerEventListener(vehicleType, "onStartWorkAreaProcessing", StonePicker)
78 SpecializationUtil.registerEventListener(vehicleType, "onEndWorkAreaProcessing", StonePicker)
79 SpecializationUtil.registerEventListener(vehicleType, "onFillUnitFillLevelChanged", StonePicker)
80end

registerFunctions

Description
Definition
registerFunctions()
Code
47function StonePicker.registerFunctions(vehicleType)
48 SpecializationUtil.registerFunction(vehicleType, "processStonePickerArea", StonePicker.processStonePickerArea)
49 SpecializationUtil.registerFunction(vehicleType, "setStonePickerEffectsState", StonePicker.setStonePickerEffectsState)
50end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
54function StonePicker.registerOverwrittenFunctions(vehicleType)
55 SpecializationUtil.registerOverwrittenFunction(vehicleType, "doCheckSpeedLimit", StonePicker.doCheckSpeedLimit)
56 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDoGroundManipulation", StonePicker.getDoGroundManipulation)
57 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getDirtMultiplier", StonePicker.getDirtMultiplier)
58 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getWearMultiplier", StonePicker.getWearMultiplier)
59 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadWorkAreaFromXML", StonePicker.loadWorkAreaFromXML)
60 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsWorkAreaActive", StonePicker.getIsWorkAreaActive)
61 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeTurnedOn", StonePicker.getCanBeTurnedOn)
62 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getTurnedOnNotAllowedWarning", StonePicker.getTurnedOnNotAllowedWarning)
63 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanToggleTurnedOn", StonePicker.getCanToggleTurnedOn)
64end

setStonePickerEffectsState

Description
Definition
setStonePickerEffectsState()
Code
229function StonePicker:setStonePickerEffectsState(state, growthState, stateSoil)
230 local spec = self.spec_stonePicker
231 if state ~= spec.isEffectActive or growthState ~= spec.effectGrowthState or stateSoil ~= spec.isSoilEffectActive then
232 spec.isEffectActive = state
233 spec.effectGrowthState = growthState
234 spec.isSoilEffectActive = stateSoil
235
236 if self.isClient then
237 if state then
238 g_effectManager:setFillType(spec.effects, FillType.STONE, growthState)
239 g_effectManager:startEffects(spec.effects)
240
241 if not spec.isStoneSamplePlaying then
242 g_soundManager:playSample(spec.samples.stone)
243 spec.isStoneSamplePlaying = true
244 end
245 else
246 g_effectManager:stopEffects(spec.effects)
247
248 if spec.isStoneSamplePlaying then
249 g_soundManager:stopSample(spec.samples.stone)
250 spec.isStoneSamplePlaying = false
251 end
252 end
253
254 if stateSoil then
255 g_effectManager:startEffects(spec.soilEffects)
256
257 if not spec.isWorkSamplePlaying then
258 g_soundManager:playSample(spec.samples.work)
259 spec.isWorkSamplePlaying = true
260 end
261 else
262 g_effectManager:stopEffects(spec.soilEffects)
263
264 if spec.isWorkSamplePlaying then
265 g_soundManager:stopSample(spec.samples.work)
266 spec.isWorkSamplePlaying = false
267 end
268 end
269 end
270 end
271end