Script v1_7_1_0
- AI
- Animals
- Collections
- Contracts
- Debug
- Economy
- Elements
- EnvironmentalScore
- Errors
- Events
- GUI
- Handtools
- Hud
- I3d
- Input
- Jobs
- Maps
- Materials
- Misc
- Objects
- Parameters
- Placeables
- Placement
- Player
- Shop
- Sounds
- Specialization
- Specializations
- AIConveyorBelt
- AIDrivable
- AIFieldWorker
- AIImplement
- AIJobVehicle
- AIVehicle
- AIVehicleObstacle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- AutoLoader
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BaseMaterial
- BigBag
- BunkerSiloCompacter
- BunkerSiloInteractor
- CCTDrivable
- Combine
- ConnectionHoses
- ConveyorBelt
- Cover
- CrabSteering
- Crawlers
- CropSensor
- Cultivator
- Cutter
- Cylindered
- CylinderedFoldable
- Dashboard
- Dischargeable
- Drivable
- DynamicallyLoadedParts
- DynamicMountAttacher
- Enterable
- ExtendedAIVehicle
- ExtendedCombine
- ExtendedMotorized
- ExtendedMower
- ExtendedSowingMachine
- ExtendedSprayer
- ExtendedWearable
- FertilizingCultivator
- FertilizingSowingMachine
- FillTriggerVehicle
- FillUnit
- FillVolume
- Foldable
- FoliageBending
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- GroundAdjustedNodes
- GroundReference
- HeadlandAnimation
- Honk
- HookLiftContainer
- HookLiftTrailer
- IKChains
- InlineWrapper
- JigglingParts
- Leveler
- LicensePlates
- Lights
- LivestockTrailer
- Locomotive
- LogGrab
- ManureBarrel
- ManureSensor
- MixerWagon
- Motorized
- Mountable
- Mower
- Mulcher
- MultipleItemPurchase
- Pallet
- Pickup
- Pipe
- PlaceableAI
- PlaceableAnimatedObjects
- PlaceableBeehive
- PlaceableBeehivePalletSpa...
- PlaceableBunkerSilo
- PlaceableBuyingStation
- PlaceableCartridgePlayer
- PlaceableChargingStation
- PlaceableClearAreas
- PlaceableColorable
- PlaceableDeletedNodes
- PlaceableDoghouse
- PlaceableDynamicallyLoade...
- PlaceableFarmhouse
- PlaceableFence
- PlaceableFoliageAreas
- PlaceableGreenhouse
- PlaceableHighPressureWash...
- PlaceableHotspots
- PlaceableHusbandry
- PlaceableHusbandryAnimals
- PlaceableHusbandryFeeding...
- PlaceableHusbandryFence
- PlaceableHusbandryFood
- PlaceableHusbandryLiquidM...
- PlaceableHusbandryMilk
- PlaceableHusbandryPallets
- PlaceableHusbandryStraw
- PlaceableHusbandryWater
- PlaceableIncomePerHour
- PlaceableIndoorAreas
- PlaceableInfoTrigger
- PlaceableLeveling
- PlaceableLights
- PlaceableManureHeap
- PlaceablePlacement
- PlaceableProductionPoint
- PlaceableSellingStation
- PlaceableSilo
- PlaceableSiloExtension
- PlaceableSolarPanels
- PlaceableTipOcclusionArea...
- PlaceableTrainSystem
- PlaceableTriggerMarkers
- PlaceableVine
- PlaceableWardrobe
- PlaceableWeatherStation
- PlaceableWeighingStation
- PlaceableWindTurbine
- PlaceableWorkshop
- Plow
- PlowPacker
- PowerConsumer
- PowerTakeOffs
- PrecisionFarmingStatistic
- PushHandTool
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- Rideable
- RidgeMarker
- Roller
- Ropes
- RTKStation
- SaltSpreader
- SemiTrailerFront
- Shovel
- SlopeCompensation
- SmartAttach
- SoilSampler
- SowingMachine
- SpeedRotatingParts
- SplineVehicle
- Sprayer
- StonePicker
- StrawBlower
- StumpCutter
- SupportVehicle
- Suspensions
- Tedder
- TensionBeltObject
- TensionBelts
- TestAreas
- TipOccluder
- Trailer
- TreePlanter
- TreeSaplingPallet
- TreeSaw
- TurnOnVehicle
- VariableWorkWidth
- VehicleSettings
- VineCutter
- VineDetector
- VinePrepruner
- Washable
- WaterTrailer
- Wearable
- Weeder
- WeedSpotSpray
- Wheels
- WindBending
- Windrower
- Wipers
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkMode
- WorkParticles
- StateMachine
- Statistics
- Tasks
- Triggers
- Utils
- Vehicles
Engine v1_7_1_0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- general
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- NoteNode
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- VoiceChat
- XML
Foundation Reference
ReverseDriving
DescriptionSpecialization for vehicles with reverse driving functionalityFunctions
- actionEventToggleReverseDriving
- getAIDirectionNode
- getAIImplementCollisionTrigger
- getAISteeringNode
- getAllowCharacterVisibilityUpdate
- getCanBeSelected
- getCanStartAIVehicle
- getIsDashboardGroupActive
- getIsLightActive
- getIsReverseDrivingAllowed
- getSteeringDirection
- initSpecialization
- loadAdditionalLightAttributesFromXML
- loadDashboardGroupFromXML
- onLoad
- onPostLoad
- onReadStream
- onRegisterActionEvents
- onUpdate
- onVehicleCharacterChanged
- onWriteStream
- postInitSpecialization
- prerequisitesPresent
- registerEventListeners
- registerEvents
- registerFunctions
- registerOverwrittenFunctions
- reverseDirectionChanged
- saveToXMLFile
- setIsReverseDriving
- updateSteeringWheel
actionEventToggleReverseDriving
DescriptionDefinitionactionEventToggleReverseDriving()Code
529 | function 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 |
534 | end |
getAIDirectionNode
DescriptionDefinitiongetAIDirectionNode()Code
466 | function 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) |
473 | end |
getAIImplementCollisionTrigger
DescriptionDefinitiongetAIImplementCollisionTrigger()Code
488 | function 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) |
495 | end |
getAISteeringNode
DescriptionDefinitiongetAISteeringNode()Code
477 | function 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) |
484 | end |
getAllowCharacterVisibilityUpdate
DescriptionDefinitiongetAllowCharacterVisibilityUpdate()Code
387 | function ReverseDriving:getAllowCharacterVisibilityUpdate(superFunc) |
388 | local spec = self.spec_reverseDriving |
389 | return superFunc(self) and (not spec.hideCharacterOnChange or not spec.isChangingDirection) |
390 | end |
getCanBeSelected
DescriptionDefinitiongetCanBeSelected()Code
436 | function ReverseDriving:getCanBeSelected(superFunc) |
437 | return true |
438 | end |
getCanStartAIVehicle
DescriptionDefinitiongetCanStartAIVehicle()Code
394 | function 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) |
408 | end |
getIsDashboardGroupActive
DescriptionDefinitiongetIsDashboardGroupActive()Code
424 | function 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) |
432 | end |
getIsLightActive
DescriptionDefinitiongetIsLightActive()Code
454 | function 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) |
462 | end |
getIsReverseDrivingAllowed
DescriptionDefinitiongetIsReverseDrivingAllowed()Code
343 | function 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 |
356 | end |
getSteeringDirection
DescriptionDefinitiongetSteeringDirection()Code
376 | function 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) |
383 | end |
initSpecialization
DescriptionDefinitioninitSpecialization()Code
27 | function 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") |
59 | end |
loadAdditionalLightAttributesFromXML
DescriptionDefinitionloadAdditionalLightAttributesFromXML()Code
442 | function 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 |
450 | end |
loadDashboardGroupFromXML
DescriptionDefinitionloadDashboardGroupFromXML()Code
412 | function 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 |
420 | end |
onLoad
DescriptionCalled on loadingDefinition
onLoad(table savegame)Arguments
table | savegame | savegame |
129 | function 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 |
191 | end |
onPostLoad
DescriptionCalled after loadingDefinition
onPostLoad(table savegame)Arguments
table | savegame | savegame |
196 | function 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 |
211 | end |
onReadStream
DescriptionCalled on client side on joinDefinition
onReadStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
226 | function 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 |
231 | end |
onRegisterActionEvents
DescriptionDefinitiononRegisterActionEvents()Code
515 | function 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 |
525 | end |
onUpdate
DescriptionCalled on updateDefinition
onUpdate(float dt, boolean isActiveForInput, boolean isSelected)Arguments
float | dt | time since last call in ms |
boolean | isActiveForInput | true if vehicle is active for input |
boolean | isSelected | true if vehicle is selected |
246 | function 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 |
271 | end |
onVehicleCharacterChanged
DescriptionDefinitiononVehicleCharacterChanged()Code
499 | function 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 |
511 | end |
onWriteStream
DescriptionCalled on server side on joinDefinition
onWriteStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
237 | function ReverseDriving:onWriteStream(streamId, connection) |
238 | streamWriteBool(streamId, self.spec_reverseDriving.isReverseDriving) |
239 | end |
postInitSpecialization
DescriptionDefinitionpostInitSpecialization()Code
63 | function 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 |
80 | 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 |
19 | function ReverseDriving.prerequisitesPresent(specializations) |
20 | return SpecializationUtil.hasSpecialization(Drivable, specializations) |
21 | and SpecializationUtil.hasSpecialization(Enterable, specializations) |
22 | and SpecializationUtil.hasSpecialization(AnimatedVehicle, specializations) |
23 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
116 | function 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) |
124 | end |
registerEvents
DescriptionDefinitionregisterEvents()Code
84 | function ReverseDriving.registerEvents(vehicleType) |
85 | SpecializationUtil.registerEvent(vehicleType, "onStartReverseDirectionChange") |
86 | SpecializationUtil.registerEvent(vehicleType, "onReverseDirectionChanged") |
87 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
91 | function ReverseDriving.registerFunctions(vehicleType) |
92 | SpecializationUtil.registerFunction(vehicleType, "reverseDirectionChanged", ReverseDriving.reverseDirectionChanged) |
93 | SpecializationUtil.registerFunction(vehicleType, "setIsReverseDriving", ReverseDriving.setIsReverseDriving) |
94 | SpecializationUtil.registerFunction(vehicleType, "getIsReverseDrivingAllowed", ReverseDriving.getIsReverseDrivingAllowed) |
95 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
99 | function 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) |
112 | end |
reverseDirectionChanged
DescriptionCalled after reverse drive changeDefinition
reverseDirectionChanged(float direction)Arguments
float | direction | new direction |
276 | function 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) |
308 | end |
saveToXMLFile
DescriptionDefinitionsaveToXMLFile()Code
215 | function 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 |
220 | end |
setIsReverseDriving
DescriptionToggle reverse drivingDefinition
setIsReverseDriving(boolean isReverseDriving, boolean noEventSend)Arguments
boolean | isReverseDriving | |
boolean | noEventSend | no event send |
314 | function 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 |
339 | end |
updateSteeringWheel
DescriptionDefinitionupdateSteeringWheel()Code
360 | function 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) |
372 | end |