LUADOC - Farming Simulator 22

Script v1_7_1_0

Engine v1_7_1_0

Foundation Reference

ReverseDriving

Description
Specialization for vehicles with reverse driving functionality
Functions

actionEventToggleReverseDriving

Description
Definition
actionEventToggleReverseDriving()
Code
529function ReverseDriving.actionEventToggleReverseDriving(self, actionName, inputValue, callbackState, isAnalog)
530 local spec = self.spec_reverseDriving
531 if self:getIsReverseDrivingAllowed(not spec.isReverseDriving) then
532 self:setIsReverseDriving(not spec.isReverseDriving)
533 end
534end

getAIDirectionNode

Description
Definition
getAIDirectionNode()
Code
466function ReverseDriving:getAIDirectionNode(superFunc)
467 local spec = self.spec_reverseDriving
468 if spec.isReverseDriving then
469 return spec.aiDirectionNode or superFunc(self)
470 end
471
472 return superFunc(self)
473end

getAIImplementCollisionTrigger

Description
Definition
getAIImplementCollisionTrigger()
Code
488function ReverseDriving:getAIImplementCollisionTrigger(superFunc)
489 local spec = self.spec_reverseDriving
490 if spec.isReverseDriving then
491 return spec.aiCollisionTrigger or superFunc(self)
492 end
493
494 return superFunc(self)
495end

getAISteeringNode

Description
Definition
getAISteeringNode()
Code
477function ReverseDriving:getAISteeringNode(superFunc)
478 local spec = self.spec_reverseDriving
479 if spec.isReverseDriving then
480 return spec.aiSteeringNode or superFunc(self)
481 end
482
483 return superFunc(self)
484end

getAllowCharacterVisibilityUpdate

Description
Definition
getAllowCharacterVisibilityUpdate()
Code
387function ReverseDriving:getAllowCharacterVisibilityUpdate(superFunc)
388 local spec = self.spec_reverseDriving
389 return superFunc(self) and (not spec.hideCharacterOnChange or not spec.isChangingDirection)
390end

getCanBeSelected

Description
Definition
getCanBeSelected()
Code
436function ReverseDriving:getCanBeSelected(superFunc)
437 return true
438end

getCanStartAIVehicle

Description
Definition
getCanStartAIVehicle()
Code
394function ReverseDriving:getCanStartAIVehicle(superFunc)
395 local spec = self.spec_reverseDriving
396
397 if spec.hasReverseDriving then
398 if spec.isReverseDriving then
399 return false
400 end
401
402 if spec.isChangingDirection then
403 return false
404 end
405 end
406
407 return superFunc(self)
408end

getIsDashboardGroupActive

Description
Definition
getIsDashboardGroupActive()
Code
424function ReverseDriving:getIsDashboardGroupActive(superFunc, group)
425 if group.isReverseDriving ~= nil then
426 if self.spec_reverseDriving.isReverseDriving ~= group.isReverseDriving then
427 return false
428 end
429 end
430
431 return superFunc(self, group)
432end

getIsLightActive

Description
Definition
getIsLightActive()
Code
454function ReverseDriving:getIsLightActive(superFunc, light)
455 if light.enableDirection ~= nil then
456 if light.enableDirection ~= self:getReverserDirection() then
457 return false
458 end
459 end
460
461 return superFunc(self, light)
462end

getIsReverseDrivingAllowed

Description
Definition
getIsReverseDrivingAllowed()
Code
343function ReverseDriving:getIsReverseDrivingAllowed(newState)
344 local spec = self.spec_reverseDriving
345 if newState then
346 if spec.disablingAttacherJointIndices ~= nil then
347 for i=1, #spec.disablingAttacherJointIndices do
348 if self:getImplementFromAttacherJointIndex(spec.disablingAttacherJointIndices[i]) ~= nil then
349 return false
350 end
351 end
352 end
353 end
354
355 return true
356end

getSteeringDirection

Description
Definition
getSteeringDirection()
Code
376function ReverseDriving:getSteeringDirection(superFunc)
377 local spec = self.spec_reverseDriving
378 if spec.hasReverseDriving then
379 return spec.smoothReverserDirection
380 end
381
382 return superFunc(self)
383end

initSpecialization

Description
Definition
initSpecialization()
Code
27function ReverseDriving.initSpecialization()
28 local schema = Vehicle.xmlSchema
29 schema:setXMLSpecializationType("ReverseDriving")
30
31 IKUtil.registerIKChainTargetsXMLPaths(schema, "vehicle.reverseDriving")
32
33 schema:register(XMLValueType.NODE_INDEX, "vehicle.reverseDriving.steeringWheel#node", "Spawn place node")
34 schema:register(XMLValueType.ANGLE, "vehicle.reverseDriving.steeringWheel#indoorRotation", "Indoor rotation", "vehicle.drivable.steeringWheel#indoorRotation")
35 schema:register(XMLValueType.ANGLE, "vehicle.reverseDriving.steeringWheel#outdoorRotation", "Outdoor rotation", "vehicle.drivable.steeringWheel#outdoorRotation")
36 schema:register(XMLValueType.STRING, "vehicle.reverseDriving#animationName", "Animation name", "reverseDriving")
37
38 schema:register(XMLValueType.BOOL, "vehicle.reverseDriving#hideCharacterOnChange", "Hide the chracter while chaning the direction", true)
39 schema:register(XMLValueType.BOOL, "vehicle.reverseDriving#inverseTransmission", "Inverse the transmission gear ratio when direction has changed", false)
40
41 schema:register(XMLValueType.VECTOR_N, "vehicle.reverseDriving#disablingAttacherJointIndices", "Attacher joint indices which are disabling the reverse driving")
42
43 schema:register(XMLValueType.NODE_INDEX, "vehicle.reverseDriving.ai#directionNode", "Direction Node while in reverse driving mode")
44 schema:register(XMLValueType.NODE_INDEX, "vehicle.reverseDriving.ai#steeringNode", "Steering Node while in reverse driving mode")
45
46 AIImplement.registerAICollisionTriggerXMLPaths(schema, "vehicle.reverseDriving.ai")
47
48 schema:register(XMLValueType.BOOL, Dashboard.GROUP_XML_KEY .. "#isReverseDriving", "Is Reverse driving")
49
50 for i=1, #Lights.ADDITIONAL_LIGHT_ATTRIBUTES_KEYS do
51 local key = Lights.ADDITIONAL_LIGHT_ATTRIBUTES_KEYS[i]
52 schema:register(XMLValueType.INT, key .. "#enableDirection", "Light is enabled when driving into this direction [-1, 1]")
53 end
54
55 schema:setXMLSpecializationType()
56
57 local schemaSavegame = Vehicle.xmlSchemaSavegame
58 schemaSavegame:register(XMLValueType.BOOL, "vehicles.vehicle(?).reverseDriving#isActive", "Reverse driving is active")
59end

loadAdditionalLightAttributesFromXML

Description
Definition
loadAdditionalLightAttributesFromXML()
Code
442function ReverseDriving:loadAdditionalLightAttributesFromXML(superFunc, xmlFile, key, light)
443 if not superFunc(self, xmlFile, key, light) then
444 return false
445 end
446
447 light.enableDirection = xmlFile:getValue(key .. "#enableDirection")
448
449 return true
450end

loadDashboardGroupFromXML

Description
Definition
loadDashboardGroupFromXML()
Code
412function ReverseDriving:loadDashboardGroupFromXML(superFunc, xmlFile, key, group)
413 if not superFunc(self, xmlFile, key, group) then
414 return false
415 end
416
417 group.isReverseDriving = xmlFile:getValue(key .. "#isReverseDriving")
418
419 return true
420end

onLoad

Description
Called on loading
Definition
onLoad(table savegame)
Arguments
tablesavegamesavegame
Code
129function ReverseDriving:onLoad(savegame)
130 local spec = self.spec_reverseDriving
131
132 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.reverseDriving.steering#reversedIndex", "vehicle.reverseDriving.steeringWheel#node") --FS17 to FS19
133 XMLUtil.checkDeprecatedXMLElements(self.xmlFile, "vehicle.reverseDriving.steering#reversedNode", "vehicle.reverseDriving.steeringWheel#node") --FS17 to FS19
134
135 spec.reversedCharacterTargets = {}
136 IKUtil.loadIKChainTargets(self.xmlFile, "vehicle.reverseDriving", self.components, spec.reversedCharacterTargets, self.i3dMappings)
137
138 local node = self.xmlFile:getValue("vehicle.reverseDriving.steeringWheel#node", nil, self.components, self.i3dMappings)
139 if node ~= nil then
140 spec.steeringWheel = {}
141 spec.steeringWheel.node = node
142 local _,ry,_ = getRotation(spec.steeringWheel.node)
143 spec.steeringWheel.lastRotation = ry
144 spec.steeringWheel.indoorRotation = self.xmlFile:getValue("vehicle.reverseDriving.steeringWheel#indoorRotation", self.xmlFile:getValue("vehicle.drivable.steeringWheel#indoorRotation", 0))
145 spec.steeringWheel.outdoorRotation = self.xmlFile:getValue("vehicle.reverseDriving.steeringWheel#outdoorRotation", self.xmlFile:getValue("vehicle.drivable.steeringWheel#outdoorRotation", 0))
146 end
147
148 spec.reverseDrivingAnimation = self.xmlFile:getValue("vehicle.reverseDriving#animationName", "reverseDriving")
149
150 spec.hideCharacterOnChange = self.xmlFile:getValue("vehicle.reverseDriving#hideCharacterOnChange", true)
151 spec.inverseTransmission = self.xmlFile:getValue("vehicle.reverseDriving#inverseTransmission", false)
152
153 spec.disablingAttacherJointIndices = self.xmlFile:getValue("vehicle.reverseDriving#disablingAttacherJointIndices", nil, true)
154
155 spec.aiDirectionNode = self.xmlFile:getValue("vehicle.reverseDriving.ai#directionNode", nil, self.components, self.i3dMappings)
156 spec.aiSteeringNode = self.xmlFile:getValue("vehicle.reverseDriving.ai#steeringNode", nil, self.components, self.i3dMappings)
157
158 if self.loadAICollisionTriggerFromXML ~= nil then
159 spec.aiCollisionTrigger = self:loadAICollisionTriggerFromXML(self.xmlFile, "vehicle.reverseDriving.ai")
160 end
161
162 spec.hasReverseDriving = self:getAnimationExists(spec.reverseDrivingAnimation)
163
164 for name, id in pairs(self.configurations) do
165 local specializationKey = g_configurationManager:getConfigurationAttribute(name, "xmlKey")
166 if specializationKey ~= nil then
167 specializationKey = "." .. specializationKey
168 else
169 specializationKey = ""
170 end
171 local key = string.format("vehicle%s.%sConfigurations.%sConfiguration(%d).reverseDriving", specializationKey, name, name , id - 1)
172 if not self.xmlFile:getValue(key .. "#isAllowed", true) then
173 spec.hasReverseDriving = false
174 end
175 end
176
177 spec.isChangingDirection = false
178 spec.isReverseDriving = false
179 spec.isSelectable = true
180
181 spec.smoothReverserDirection = 1
182
183 if not spec.hasReverseDriving then
184 SpecializationUtil.removeEventListener(self, "onPostLoad", ReverseDriving)
185 SpecializationUtil.removeEventListener(self, "onReadStream", ReverseDriving)
186 SpecializationUtil.removeEventListener(self, "onWriteStream", ReverseDriving)
187 SpecializationUtil.removeEventListener(self, "onUpdate", ReverseDriving)
188 SpecializationUtil.removeEventListener(self, "onVehicleCharacterChanged", ReverseDriving)
189 SpecializationUtil.removeEventListener(self, "onRegisterActionEvents", ReverseDriving)
190 end
191end

onPostLoad

Description
Called after loading
Definition
onPostLoad(table savegame)
Arguments
tablesavegamesavegame
Code
196function ReverseDriving:onPostLoad(savegame)
197 local spec = self.spec_reverseDriving
198
199 local character = self:getVehicleCharacter()
200 if character ~= nil then
201 spec.defaultCharacterTargets = character:getIKChainTargets()
202 end
203
204 local isReverseDriving = false
205 if savegame ~= nil then
206 isReverseDriving = savegame.xmlFile:getValue(savegame.key..".reverseDriving#isActive", false)
207 end
208
209 self:setIsReverseDriving(isReverseDriving, true)
210 spec.updateAnimationOnEnter = isReverseDriving
211end

onReadStream

Description
Called on client side on join
Definition
onReadStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
226function ReverseDriving:onReadStream(streamId, connection)
227 self:setIsReverseDriving(Utils.getNoNil(streamReadBool(streamId), false), true)
228
229 local spec = self.spec_reverseDriving
230 spec.updateAnimationOnEnter = spec.isReverseDriving
231end

onRegisterActionEvents

Description
Definition
onRegisterActionEvents()
Code
515function ReverseDriving:onRegisterActionEvents(isActiveForInput, isActiveForInputIgnoreSelection)
516 if self.isClient then
517 local spec = self.spec_reverseDriving
518 self:clearActionEventsTable(spec.actionEvents)
519 if isActiveForInputIgnoreSelection then
520 local _, actionEventId = self:addPoweredActionEvent(spec.actionEvents, InputAction.CHANGE_DRIVING_DIRECTION, self, ReverseDriving.actionEventToggleReverseDriving, false, true, false, true, nil)
521 g_inputBinding:setActionEventTextPriority(actionEventId, GS_PRIO_NORMAL)
522 g_inputBinding:setActionEventText(actionEventId, g_i18n:getText("input_CHANGE_DRIVING_DIRECTION"))
523 end
524 end
525end

onUpdate

Description
Called on update
Definition
onUpdate(float dt, boolean isActiveForInput, boolean isSelected)
Arguments
floatdttime since last call in ms
booleanisActiveForInputtrue if vehicle is active for input
booleanisSelectedtrue if vehicle is selected
Code
246function ReverseDriving:onUpdate(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected)
247 local spec = self.spec_reverseDriving
248
249 if spec.isChangingDirection then
250 if spec.hideCharacterOnChange then
251 local character = self:getVehicleCharacter()
252 if character ~= nil then
253 character:setCharacterVisibility(false)
254 end
255 end
256
257 if not self:getIsEntered() then
258 if spec.updateAnimationOnEnter then
259 AnimatedVehicle.updateAnimations(self, 99999999, true)
260 spec.updateAnimationOnEnter = false
261 end
262 end
263
264 if not self:getIsAnimationPlaying(spec.reverseDrivingAnimation) then
265 self:reverseDirectionChanged(spec.reverserDirection)
266 end
267
268 local direction = (spec.isReverseDriving and 1) or -1
269 spec.smoothReverserDirection = MathUtil.clamp(spec.smoothReverserDirection - 0.001 * dt * direction, -1, 1)
270 end
271end

onVehicleCharacterChanged

Description
Definition
onVehicleCharacterChanged()
Code
499function ReverseDriving:onVehicleCharacterChanged(character)
500 local spec = self.spec_reverseDriving
501 if spec.updateAnimationOnEnter then
502 AnimatedVehicle.updateAnimations(self, 99999999, true)
503 spec.updateAnimationOnEnter = false
504 end
505
506 if spec.isReverseDriving and next(spec.reversedCharacterTargets) ~= nil then
507 character:setIKChainTargets(spec.reversedCharacterTargets, true)
508 else
509 character:setIKChainTargets(spec.defaultCharacterTargets, true)
510 end
511end

onWriteStream

Description
Called on server side on join
Definition
onWriteStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
237function ReverseDriving:onWriteStream(streamId, connection)
238 streamWriteBool(streamId, self.spec_reverseDriving.isReverseDriving)
239end

postInitSpecialization

Description
Definition
postInitSpecialization()
Code
63function ReverseDriving.postInitSpecialization()
64 local schema = Vehicle.xmlSchema
65 for name, _ in pairs(g_configurationManager:getConfigurations()) do
66 local specializationKey = g_configurationManager:getConfigurationAttribute(name, "xmlKey")
67 if specializationKey ~= nil then
68 specializationKey = "." .. specializationKey
69 else
70 specializationKey = ""
71 end
72
73 local configrationsKey = string.format("vehicle%s.%sConfigurations", specializationKey, name)
74 local configrationKey = string.format("%s.%sConfiguration(?)", configrationsKey, name)
75
76 schema:setXMLSharedRegistration("configReverseDriving", configrationKey)
77 schema:register(XMLValueType.BOOL, configrationKey .. ".reverseDriving#isAllowed", "Reverse driving is allowed while this configuration is equipped", true)
78 schema:setXMLSharedRegistration()
79 end
80end

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
19function ReverseDriving.prerequisitesPresent(specializations)
20 return SpecializationUtil.hasSpecialization(Drivable, specializations)
21 and SpecializationUtil.hasSpecialization(Enterable, specializations)
22 and SpecializationUtil.hasSpecialization(AnimatedVehicle, specializations)
23end

registerEventListeners

Description
Definition
registerEventListeners()
Code
116function ReverseDriving.registerEventListeners(vehicleType)
117 SpecializationUtil.registerEventListener(vehicleType, "onLoad", ReverseDriving)
118 SpecializationUtil.registerEventListener(vehicleType, "onPostLoad", ReverseDriving)
119 SpecializationUtil.registerEventListener(vehicleType, "onReadStream", ReverseDriving)
120 SpecializationUtil.registerEventListener(vehicleType, "onWriteStream", ReverseDriving)
121 SpecializationUtil.registerEventListener(vehicleType, "onUpdate", ReverseDriving)
122 SpecializationUtil.registerEventListener(vehicleType, "onVehicleCharacterChanged", ReverseDriving)
123 SpecializationUtil.registerEventListener(vehicleType, "onRegisterActionEvents", ReverseDriving)
124end

registerEvents

Description
Definition
registerEvents()
Code
84function ReverseDriving.registerEvents(vehicleType)
85 SpecializationUtil.registerEvent(vehicleType, "onStartReverseDirectionChange")
86 SpecializationUtil.registerEvent(vehicleType, "onReverseDirectionChanged")
87end

registerFunctions

Description
Definition
registerFunctions()
Code
91function ReverseDriving.registerFunctions(vehicleType)
92 SpecializationUtil.registerFunction(vehicleType, "reverseDirectionChanged", ReverseDriving.reverseDirectionChanged)
93 SpecializationUtil.registerFunction(vehicleType, "setIsReverseDriving", ReverseDriving.setIsReverseDriving)
94 SpecializationUtil.registerFunction(vehicleType, "getIsReverseDrivingAllowed", ReverseDriving.getIsReverseDrivingAllowed)
95end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
99function ReverseDriving.registerOverwrittenFunctions(vehicleType)
100 SpecializationUtil.registerOverwrittenFunction(vehicleType, "updateSteeringWheel", ReverseDriving.updateSteeringWheel)
101 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getSteeringDirection", ReverseDriving.getSteeringDirection)
102 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAllowCharacterVisibilityUpdate", ReverseDriving.getAllowCharacterVisibilityUpdate)
103 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanStartAIVehicle", ReverseDriving.getCanStartAIVehicle)
104 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadDashboardGroupFromXML", ReverseDriving.loadDashboardGroupFromXML)
105 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsDashboardGroupActive", ReverseDriving.getIsDashboardGroupActive)
106 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeSelected", ReverseDriving.getCanBeSelected)
107 SpecializationUtil.registerOverwrittenFunction(vehicleType, "loadAdditionalLightAttributesFromXML", ReverseDriving.loadAdditionalLightAttributesFromXML)
108 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getIsLightActive", ReverseDriving.getIsLightActive)
109 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAIDirectionNode", ReverseDriving.getAIDirectionNode)
110 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAISteeringNode", ReverseDriving.getAISteeringNode)
111 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getAIImplementCollisionTrigger", ReverseDriving.getAIImplementCollisionTrigger)
112end

reverseDirectionChanged

Description
Called after reverse drive change
Definition
reverseDirectionChanged(float direction)
Arguments
floatdirectionnew direction
Code
276function ReverseDriving:reverseDirectionChanged(direction)
277 local spec = self.spec_reverseDriving
278
279 spec.isChangingDirection = false
280 if spec.isReverseDriving then
281 self:setReverserDirection(-1)
282 spec.smoothReverserDirection = -1
283 else
284 self:setReverserDirection(1)
285 spec.smoothReverserDirection = 1
286 end
287
288 local character = self:getVehicleCharacter()
289 if character ~= nil then
290 if spec.isReverseDriving and next(spec.reversedCharacterTargets) ~= nil then
291 character:setIKChainTargets(spec.reversedCharacterTargets)
292 else
293 character:setIKChainTargets(spec.defaultCharacterTargets)
294 end
295
296 if character.meshThirdPerson ~= nil and not self:getIsEntered() then
297 character:updateVisibility()
298 end
299
300 character:setAllowCharacterUpdate(true)
301 end
302
303 if self.setLightsTypesMask ~= nil then
304 self:setLightsTypesMask(self.spec_lights.lightsTypesMask, true, true)
305 end
306
307 SpecializationUtil.raiseEvent(self, "onReverseDirectionChanged", direction)
308end

saveToXMLFile

Description
Definition
saveToXMLFile()
Code
215function ReverseDriving:saveToXMLFile(xmlFile, key, usedModNames)
216 local spec = self.spec_reverseDriving
217 if spec.hasReverseDriving then
218 xmlFile:setValue(key.."#isActive", spec.isReverseDriving)
219 end
220end

setIsReverseDriving

Description
Toggle reverse driving
Definition
setIsReverseDriving(boolean isReverseDriving, boolean noEventSend)
Arguments
booleanisReverseDriving
booleannoEventSendno event send
Code
314function ReverseDriving:setIsReverseDriving(isReverseDriving, noEventSend)
315 local spec = self.spec_reverseDriving
316 if isReverseDriving ~= spec.isReverseDriving then
317 spec.isChangingDirection = true
318 spec.isReverseDriving = isReverseDriving
319
320 local dir = (isReverseDriving and 1) or -1
321 self:playAnimation(spec.reverseDrivingAnimation, dir, self:getAnimationTime(spec.reverseDrivingAnimation), true)
322
323 -- deactivate update of character ik chains to prevent strange states after changing
324 local character = self:getVehicleCharacter()
325 if character ~= nil then
326 character:setAllowCharacterUpdate(false)
327 end
328
329 if spec.inverseTransmission then
330 if self.setTransmissionDirection ~= nil then
331 self:setTransmissionDirection(-dir)
332 end
333 end
334
335 self:setReverserDirection(0)
336 SpecializationUtil.raiseEvent(self, "onStartReverseDirectionChange")
337 ReverseDrivingSetStateEvent.sendEvent(self, isReverseDriving, noEventSend)
338 end
339end

updateSteeringWheel

Description
Definition
updateSteeringWheel()
Code
360function ReverseDriving:updateSteeringWheel(superFunc, steeringWheel, dt, direction)
361 local spec = self.spec_reverseDriving
362
363 if spec.isReverseDriving then
364 if spec.steeringWheel ~= nil then
365 steeringWheel = spec.steeringWheel
366 end
367
368 direction = -direction
369 end
370
371 superFunc(self, steeringWheel, dt, direction)
372end