LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

RidgeMarker

Description
Specialization for tools with a ridge marker
Functions

actionEventToggleRidgeMarkers

Description
Definition
actionEventToggleRidgeMarkers()
Code
440function RidgeMarker.actionEventToggleRidgeMarkers(self, actionName, inputValue, callbackState, isAnalog)
441 local spec = self.spec_ridgeMarker
442
443 local newState = (spec.ridgeMarkerState + 1) % (spec.numRigdeMarkers+1)
444 if self:canFoldRidgeMarker(newState) then
445 self:setRidgeMarkerState(newState)
446 end
447end

canFoldRidgeMarker

Description
Return if ridge markers can be folden
Definition
canFoldRidgeMarker(integer state)
Arguments
integerstatestate
Return Values
booleancanFoldridge markers can be folden
Code
222function RidgeMarker:canFoldRidgeMarker(state)
223 local spec = self.spec_ridgeMarker
224
225 local foldAnimTime = nil
226 if self.getFoldAnimTime ~= nil then
227 foldAnimTime = self:getFoldAnimTime()
228 if foldAnimTime < spec.ridgeMarkerMinFoldTime or foldAnimTime > spec.ridgeMarkerMaxFoldTime then
229 return false
230 end
231 end
232
233 local foldableSpec = self.spec_foldable
234 if state ~= 0 and not foldableSpec.moveToMiddle and spec.foldDisableDirection ~= nil and (spec.foldDisableDirection == foldableSpec.foldMoveDirection or foldableSpec.foldMoveDirection == 0) then
235 return false
236 end
237
238 return true
239end

getCanBeSelected

Description
Definition
getCanBeSelected()
Code
351function RidgeMarker:getCanBeSelected(superFunc)
352 return true
353end

getIsSpeedRotatingPartActive

Description
Returns true if speed rotating part is active
Definition
getIsSpeedRotatingPartActive(table speedRotatingPart)
Arguments
tablespeedRotatingPartspeedRotatingPart
Return Values
booleanisActivespeed rotating part is active
Code
341function RidgeMarker:getIsSpeedRotatingPartActive(superFunc, speedRotatingPart)
342 if speedRotatingPart.ridgeMarkerAnim ~= nil and self:getAnimationTime(speedRotatingPart.ridgeMarkerAnim) < speedRotatingPart.ridgeMarkerAnimTimeMax then
343 return false
344 end
345
346 return superFunc(self, speedRotatingPart)
347end

getIsWorkAreaActive

Description
Returns true if work area is active
Definition
getIsWorkAreaActive(table workArea)
Arguments
tableworkAreaworkArea
Return Values
booleanisActivework area is active
Code
359function RidgeMarker:getIsWorkAreaActive(superFunc, workArea)
360
361 if workArea.type == WorkAreaType.RIDGEMARKER then
362 local spec = self.spec_ridgeMarker
363 local ridgeMarker = spec.workAreaToRidgeMarker[workArea.index]
364
365 if ridgeMarker ~= nil then
366 local animTime = self:getAnimationTime(ridgeMarker.animName)
367 if animTime > ridgeMarker.maxWorkLimit or animTime < ridgeMarker.minWorkLimit then
368 return false
369 end
370
371 if spec.onlyActiveWhenLowered and not self:getIsLowered(false) then
372 return false
373 end
374 end
375 end
376
377 return superFunc(self, workArea)
378end

initSpecialization

Description
Called on specialization initializing
Definition
initSpecialization()
Code
20function RidgeMarker.initSpecialization()
21 g_workAreaTypeManager:addWorkAreaType("ridgemarker", false)
22end

loadRidgeMarker

Description
Definition
loadRidgeMarker()
Code
172function RidgeMarker:loadRidgeMarker(xmlFile, key, ridgeMarker)
173 ridgeMarker.animName = getXMLString(xmlFile, key .. "#animName")
174 ridgeMarker.minWorkLimit = Utils.getNoNil(getXMLFloat(xmlFile, key .. "#minWorkLimit"), 0.99)
175 ridgeMarker.maxWorkLimit = Utils.getNoNil(getXMLFloat(xmlFile, key .. "#maxWorkLimit"), 1)
176
177 ridgeMarker.liftedAnimTime = getXMLFloat(xmlFile, key .. "#liftedAnimTime")
178 ridgeMarker.workAreaIndex = getXMLInt(xmlFile, key .. "#workAreaIndex")
179
180 if ridgeMarker.workAreaIndex == nil then
181 g_logManager:xmlWarning(self.configFileName, "Missing 'workAreaIndex' for ridgeMarker '%s'!", key)
182 return false
183 end
184
185 return true
186end

loadSpeedRotatingPartFromXML

Description
Loads speed rotating parts from xml
Definition
loadSpeedRotatingPartFromXML(table speedRotatingPart, integer xmlFile, string key)
Arguments
tablespeedRotatingPartspeedRotatingPart
integerxmlFileid of xml object
stringkeykey
Return Values
booleansuccesssuccess
Code
326function RidgeMarker:loadSpeedRotatingPartFromXML(superFunc, speedRotatingPart, xmlFile, key)
327 if not superFunc(self, speedRotatingPart, xmlFile, key) then
328 return false
329 end
330
331 speedRotatingPart.ridgeMarkerAnim = getXMLString(xmlFile, key .. "#ridgeMarkerAnim")
332 speedRotatingPart.ridgeMarkerAnimTimeMax = Utils.getNoNil(getXMLFloat(xmlFile, key .. "#ridgeMarkerAnimTimeMax"), 0.99)
333
334 return true
335end

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
290function RidgeMarker:loadWorkAreaFromXML(superFunc, workArea, xmlFile, key)
291 if not superFunc(self, workArea, xmlFile, key) then
292 return false
293 end
294
295 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, key ..".area#startIndexTest", key ..".testArea#startNode") -- FS17 to FS19
296 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, key ..".area#widthIndexTest", key ..".testArea#widthNode") -- FS17 to FS19
297 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, key ..".area#heightIndexTest", key ..".testArea#heightNode") -- FS17 to FS19
298
299 local startTest = I3DUtil.indexToObject(self.components, getXMLString(xmlFile, key ..".testArea#startNode"), self.i3dMappings)
300 local widthTest = I3DUtil.indexToObject(self.components, getXMLString(xmlFile, key ..".testArea#widthNode"), self.i3dMappings)
301 local heightTest = I3DUtil.indexToObject(self.components, getXMLString(xmlFile, key ..".testArea#heightNode"), self.i3dMappings)
302
303 if startTest ~= nil and widthTest ~= nil and heightTest ~= nil then
304 workArea.startTest = startTest
305 workArea.widthTest = widthTest
306 workArea.heightTest = heightTest
307
308 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, key .."#animName") -- FS17 to FS19
309
310 if workArea.type == WorkAreaType.DEFAULT then
311 workArea.type = WorkAreaType.RIDGEMARKER
312 end
313 elseif workArea.type == WorkAreaType.RIDGEMARKER then
314 g_logManager:xmlWarning(self.configFileName, "Missing test area for ridge marker area '%s'", key)
315 end
316
317 return true
318end

onAIImplementStart

Description
Definition
onAIImplementStart()
Code
434function RidgeMarker:onAIImplementStart()
435 self:setRidgeMarkerState(0, true)
436end

onFoldStateChanged

Description
Called on folding state change
Definition
onFoldStateChanged(integer direction, boolean moveToMiddle)
Arguments
integerdirectiondirection
booleanmoveToMiddlemove to middle position
Code
426function RidgeMarker:onFoldStateChanged(direction, moveToMiddle)
427 if not moveToMiddle and direction > 0 then
428 self:setRidgeMarkerState(0, true)
429 end
430end

onLoad

Description
Called on loading
Definition
onLoad(table savegame)
Arguments
tablesavegamesavegame
Code
67function RidgeMarker:onLoad(savegame)
68 local spec = self.spec_ridgeMarker
69
70 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.ridgeMarkers", "vehicle.ridgeMarker") -- FS17 to FS19
71 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.ridgeMarkers.ridgeMarker", "vehicle.ridgeMarker.marker") -- FS17 to FS19
72 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.ridgeMarker.ridgeMarker", "vehicle.ridgeMarker.marker") -- FS17 to FS19
73
74 local inputButtonStr = getXMLString(self.xmlFile, "vehicle.ridgeMarker#inputButton")
75 if inputButtonStr ~= nil then
76 spec.ridgeMarkerInputButton = InputAction[inputButtonStr]
77 end
78 spec.ridgeMarkerInputButton = Utils.getNoNil(spec.ridgeMarkerInputButton, InputAction.IMPLEMENT_EXTRA4)
79
80 spec.ridgeMarkers = {}
81 spec.workAreaToRidgeMarker = {}
82 local i = 0
83 while true do
84 local key = string.format("vehicle.ridgeMarker.marker(%d)", i)
85 if not hasXMLProperty(self.xmlFile, key) then
86 break
87 end
88
89 if table.getn(spec.ridgeMarkers) >= RidgeMarker.MAX_NUM_RIDGEMARKERS-1 then
90 g_logManager:xmlError(self.configFileName, "Too many ridgeMarker states. Only %d states are supported!", RidgeMarker.MAX_NUM_RIDGEMARKERS-1)
91 break
92 end
93
94 local ridgeMarker = {}
95 if self:loadRidgeMarker(self.xmlFile, key, ridgeMarker) then
96 table.insert(spec.ridgeMarkers, ridgeMarker)
97 spec.workAreaToRidgeMarker[ridgeMarker.workAreaIndex] = ridgeMarker
98 end
99
100 i = i + 1
101 end
102 spec.numRigdeMarkers = table.getn(spec.ridgeMarkers)
103
104 spec.ridgeMarkerMinFoldTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ridgeMarker#foldMinLimit"), 0)
105 spec.ridgeMarkerMaxFoldTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.ridgeMarker#foldMaxLimit"), 1)
106 spec.foldDisableDirection = getXMLInt(self.xmlFile, "vehicle.ridgeMarker#foldDisableDirection")
107 spec.onlyActiveWhenLowered = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.ridgeMarker#onlyActiveWhenLowered"), true)
108 spec.ridgeMarkerState = 0
109 spec.directionNode = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.ridgeMarker#directionNode"), self.i3dMappings)
110end

onPostLoad

Description
Definition
onPostLoad()
Code
114function RidgeMarker:onPostLoad(savegame)
115 local spec = self.spec_ridgeMarker
116 if spec.numRigdeMarkers > 0 and savegame ~= nil then
117 local state = getXMLInt(savegame.xmlFile, savegame.key..".ridgeMarker#state")
118 if state ~= nil then
119 self:setRidgeMarkerState(state, true)
120 if state ~= 0 then
121 AnimatedVehicle.updateAnimationByName(self, spec.ridgeMarkers[state].animName, 9999999)
122 end
123 end
124 end
125end

onReadStream

Description
Called on client side on join
Definition
onReadStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
140function RidgeMarker:onReadStream(streamId, connection)
141 local spec = self.spec_ridgeMarker
142 if spec.numRigdeMarkers > 0 then
143 local state = streamReadUIntN(streamId, RidgeMarker.SEND_NUM_BITS)
144 self:setRidgeMarkerState(state, true)
145 if state ~= 0 then
146 AnimatedVehicle.updateAnimationByName(self, spec.ridgeMarkers[state].animName, 9999999)
147 end
148 end
149end

onRegisterActionEvents

Description
Definition
onRegisterActionEvents()
Code
382function RidgeMarker:onRegisterActionEvents(isActiveForInput, isActiveForInputIgnoreSelection)
383 if self.isClient then
384 local spec = self.spec_ridgeMarker
385 self:clearActionEventsTable(spec.actionEvents)
386
387 if isActiveForInputIgnoreSelection and spec.numRigdeMarkers > 0 then
388 local _, actionEventId = self:addActionEvent(spec.actionEvents, spec.ridgeMarkerInputButton, self, RidgeMarker.actionEventToggleRidgeMarkers, false, true, false, true, nil)
389 g_inputBinding:setActionEventTextPriority(actionEventId, GS_PRIO_NORMAL)
390 g_inputBinding:setActionEventText(actionEventId, g_i18n:getText("action_toggleRidgeMarker"))
391 end
392 end
393end

onSetLowered

Description
Called on lowered state change
Definition
onSetLowered(boolean lowered)
Arguments
booleanloweredis lowered
Code
398function RidgeMarker:onSetLowered(lowered)
399 local spec = self.spec_ridgeMarker
400 if lowered then
401 for _, ridgeMarker in pairs(spec.ridgeMarkers) do
402 if ridgeMarker.liftedAnimTime ~= nil then
403 local animTime = self:getAnimationTime(ridgeMarker.animName)
404 if animTime == ridgeMarker.liftedAnimTime then
405 self:playAnimation(ridgeMarker.animName, 1, animTime, true)
406 end
407 end
408 end
409 else
410 for _, ridgeMarker in pairs(spec.ridgeMarkers) do
411 if ridgeMarker.liftedAnimTime ~= nil then
412 local animTime = self:getAnimationTime(ridgeMarker.animName)
413 if animTime > ridgeMarker.liftedAnimTime then
414 self:setAnimationStopTime(ridgeMarker.animName, ridgeMarker.liftedAnimTime)
415 self:playAnimation(ridgeMarker.animName, -1, animTime, true)
416 end
417 end
418 end
419 end
420end

onUpdate

Description
Definition
onUpdate()
Code
164function RidgeMarker:onUpdate(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
165 if self.isClient then
166 RidgeMarker.updateActionEvents(self)
167 end
168end

onWriteStream

Description
Called on server side on join
Definition
onWriteStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
155function RidgeMarker:onWriteStream(streamId, connection)
156 local spec = self.spec_ridgeMarker
157 if spec.numRigdeMarkers > 0 then
158 streamWriteUIntN(streamId, spec.ridgeMarkerState, RidgeMarker.SEND_NUM_BITS)
159 end
160end

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
28function RidgeMarker.prerequisitesPresent(specializations)
29 return SpecializationUtil.hasSpecialization(AnimatedVehicle, specializations) and SpecializationUtil.hasSpecialization(WorkArea, specializations)
30end

processRidgeMarkerArea

Description
Definition
processRidgeMarkerArea()
Code
243function RidgeMarker:processRidgeMarkerArea(workArea, dt)
244 local spec = self.spec_ridgeMarker
245
246 local x,_,z = getWorldTranslation(workArea.startTest)
247 local x1,_,z1 = getWorldTranslation(workArea.widthTest)
248 local x2,_,z2 = getWorldTranslation(workArea.heightTest)
249 local cultivatorArea = FSDensityMapUtil.getAreaDensity(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.cultivatorValue, x, z, x1, z1, x2, z2)
250 local plowArea = FSDensityMapUtil.getAreaDensity(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.plowValue, x, z, x1, z1, x2, z2)
251
252 local x,_,z = getWorldTranslation(workArea.start)
253 local x1,_,z1 = getWorldTranslation(workArea.width)
254 local x2,_,z2 = getWorldTranslation(workArea.height)
255 local sowingArea = FSDensityMapUtil.getAreaDensity(g_currentMission.terrainDetailId, g_currentMission.terrainDetailTypeFirstChannel, g_currentMission.terrainDetailTypeNumChannels, g_currentMission.sowingValue, x, z, x1, z1, x2, z2)
256
257 -- ignore non-field areas
258 if sowingArea > 0 or cultivatorArea > 0 or plowArea > 0 then
259 local wx,wz = x1-x, z1-z
260 local hx,hz = x2-x, z2-z
261
262 local worldToDensity = g_currentMission.terrainDetailMapSize / g_currentMission.terrainSize
263 x = math.floor(x*worldToDensity+0.5)/worldToDensity
264 z = math.floor(z*worldToDensity+0.5)/worldToDensity
265
266 x1, z1 = x+wx, z+wz
267 x2, z2 = x+hx, z+hz
268
269 local dx,_,dz = localDirectionToWorld(Utils.getNoNil(spec.directionNode, self.rootNode), 0, 0, 1)
270 local angle = FSDensityMapUtil.convertToDensityMapAngle(MathUtil.getYRotationFromDirection(dx, dz), g_currentMission.terrainDetailAngleMaxValue)
271
272 if cultivatorArea < plowArea then
273 FSDensityMapUtil.updateCultivatorArea(x,z, x1,z1, x2,z2, false, false, angle, nil)
274 else
275 FSDensityMapUtil.updatePlowArea(x,z, x1,z1, x2,z2, false, false, angle, false)
276 end
277
278 FSDensityMapUtil.eraseTireTrack(x,z, x1,z1, x2,z2)
279 end
280
281 return 0, 0
282end

registerEventListeners

Description
Definition
registerEventListeners()
Code
53function RidgeMarker.registerEventListeners(vehicleType)
54 SpecializationUtil.registerEventListener(vehicleType, "onLoad", RidgeMarker)
55 SpecializationUtil.registerEventListener(vehicleType, "onPostLoad", RidgeMarker)
56 SpecializationUtil.registerEventListener(vehicleType, "onReadStream", RidgeMarker)
57 SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", RidgeMarker)
58 SpecializationUtil.registerEventListener(vehicleType, "onRegisterActionEvents", RidgeMarker)
59 SpecializationUtil.registerEventListener(vehicleType, "onSetLowered", RidgeMarker)
60 SpecializationUtil.registerEventListener(vehicleType, "onFoldStateChanged", RidgeMarker)
61 SpecializationUtil.registerEventListener(vehicleType, "onAIImplementStart", RidgeMarker)
62end

registerFunctions

Description
Definition
registerFunctions()
Code
34function RidgeMarker.registerFunctions(vehicleType)
35 SpecializationUtil.registerFunction(vehicleType, "loadRidgeMarker", RidgeMarker.loadRidgeMarker)
36 SpecializationUtil.registerFunction(vehicleType, "setRidgeMarkerState", RidgeMarker.setRidgeMarkerState)
37 SpecializationUtil.registerFunction(vehicleType, "canFoldRidgeMarker", RidgeMarker.canFoldRidgeMarker)
38 SpecializationUtil.registerFunction(vehicleType, "processRidgeMarkerArea", RidgeMarker.processRidgeMarkerArea)
39end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
43function RidgeMarker.registerOverwrittenFunctions(vehicleType)
44 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadWorkAreaFromXML", RidgeMarker.loadWorkAreaFromXML)
45 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsWorkAreaActive", RidgeMarker.getIsWorkAreaActive)
46 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadSpeedRotatingPartFromXML", RidgeMarker.loadSpeedRotatingPartFromXML)
47 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsSpeedRotatingPartActive", RidgeMarker.getIsSpeedRotatingPartActive)
48 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeSelected", RidgeMarker.getCanBeSelected)
49end

saveToXMLFile

Description
Definition
saveToXMLFile()
Code
129function RidgeMarker:saveToXMLFile(xmlFile, key, usedModNames)
130 local spec = self.spec_ridgeMarker
131 if spec.numRigdeMarkers > 0 then
132 setXMLInt(xmlFile, key.."#state", spec.ridgeMarkerState)
133 end
134end

setRidgeMarkerState

Description
Toggle ridge marker state
Definition
setRidgeMarkerState(integer state, boolean noEventSend)
Arguments
integerstatenew state
booleannoEventSendno event send
Code
192function RidgeMarker:setRidgeMarkerState(state, noEventSend)
193 local spec = self.spec_ridgeMarker
194
195 if spec.ridgeMarkerState ~= state then
196 RidgeMarkerSetStateEvent.sendEvent(self, state, noEventSend)
197
198 -- fold last state
199 if spec.ridgeMarkerState ~= 0 then
200 local animTime = self:getAnimationTime(spec.ridgeMarkers[spec.ridgeMarkerState].animName)
201 self:playAnimation(spec.ridgeMarkers[spec.ridgeMarkerState].animName, -1, animTime, true)
202 end
203 spec.ridgeMarkerState = state
204
205 -- unfold new state
206 if spec.ridgeMarkerState ~= 0 then
207 if spec.ridgeMarkers[spec.ridgeMarkerState].liftedAnimTime ~= nil and not self:getIsLowered(true) then
208 self:setAnimationStopTime(spec.ridgeMarkers[spec.ridgeMarkerState].animName, spec.ridgeMarkers[spec.ridgeMarkerState].liftedAnimTime)
209 end
210
211 local animTime = self:getAnimationTime(spec.ridgeMarkers[spec.ridgeMarkerState].animName)
212 self:playAnimation(spec.ridgeMarkers[spec.ridgeMarkerState].animName, 1, animTime, true)
213 end
214 end
215end

updateActionEvents

Description
Definition
updateActionEvents()
Code
451function RidgeMarker.updateActionEvents(self)
452 local spec = self.spec_ridgeMarker
453
454 local actionEvent = spec.actionEvents[spec.ridgeMarkerInputButton]
455 if actionEvent ~= nil then
456 local isVisible = false
457 if spec.numRigdeMarkers > 0 then
458 local newState = (spec.ridgeMarkerState + 1) % (spec.numRigdeMarkers+1)
459 if self:canFoldRidgeMarker(newState) then
460 isVisible = true
461 end
462 end
463
464 g_inputBinding:setActionEventActive(actionEvent.actionEventId, isVisible)
465 end
466end