Script v1.4.4.0
- Handtools
- Events
- Objects
- Placeables
- Triggers
- Utils
- Vehicles
- Specializations
- AIVehicle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BuiltInCutterTrailer
- BunkerSiloCompacter
- Combine
- ConveyorBelt
- Cover
- CrabSteering
- Crawler
- Cultivator
- Cutter
- Cylindered
- Drivable
- DynamicMountAttacher
- Fillable
- FillActivatable
- FillVolume
- Foldable
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- FuelTrailer
- Honk
- HookLiftContainer
- HookLiftTrailer
- Leveler
- Lights
- LivestockTrailer
- ManureBarrel
- ManureSpreader
- MixerWagon
- Motorized
- Mountable
- Mower
- NonTabbable
- Overloading
- Pickup
- Pipe
- Plough
- PowerConsumer
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- RidgeMarker
- Roller
- Ropes
- RotorSpreader
- SemiTrailerFront
- Shovel
- SowingMachine
- SpeedRotatingParts
- Sprayer
- Steerable
- StrawBlower
- StumpCutter
- Tedder
- TensionBelts
- Trailer
- TreePlanter
- TreePlanterActivatable
- TreeSaw
- TurnOnVehicle
- Washable
- WaterTrailer
- Weeder
- WheelRotations
- Windrower
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkParticles
Engine v7.0.0.2
- General
- Entity
- Node
- Scenegraph
- Lighting
- Camera
- Shape
- Particle System
- Physics
- Spline
- Animation
- Overlays
- Sound
- Input
- XML
- Network
- Callbacks
- Text Rendering
- Terrain Detail
- Tire Track
- Editor
- Rendering
- String
- Math
- I3D
- Fillplanes
Foundation Reference
RandomlyMovingParts
DescriptionClass for randomly moving partsFunctions
- prerequisitesPresent
- preLoad
- load
- update
- loadRandomlyMovingPartFromXML
- updateRandomlyMovingPart
- updateRotationTargetValues
- getIsRandomlyMovingPartActive
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
17 | function RandomlyMovingParts.prerequisitesPresent(specializations) |
18 | return true; |
19 | end; |
preLoad
DescriptionCalled before loadingDefinition
preLoad(table savegame)Arguments
table | savegame | savegame |
24 | function RandomlyMovingParts:preLoad(savegame) |
25 | self.loadRandomlyMovingPartFromXML = RandomlyMovingParts.loadRandomlyMovingPartFromXML; |
26 | self.updateRandomlyMovingPart = RandomlyMovingParts.updateRandomlyMovingPart; |
27 | self.updateRotationTargetValues = RandomlyMovingParts.updateRotationTargetValues; |
28 | self.getIsRandomlyMovingPartActive = RandomlyMovingParts.getIsRandomlyMovingPartActive; |
29 | end; |
load
DescriptionCalled on loadingDefinition
load(table savegame)Arguments
table | savegame | savegame |
34 | function RandomlyMovingParts:load(savegame) |
35 | |
36 | |
37 | self.randomlyMovingParts = {}; |
38 | self.randomlyMovingParts.nodes = {}; |
39 | |
40 | local i=0; |
41 | while true do |
42 | local baseName = string.format("vehicle.randomlyMovingParts.randomlyMovingPart(%d)", i); |
43 | if not hasXMLProperty(self.xmlFile, baseName) then |
44 | break; |
45 | end; |
46 | local randomlyMovingPart = {}; |
47 | if self:loadRandomlyMovingPartFromXML(randomlyMovingPart, self.xmlFile, baseName) then |
48 | table.insert(self.randomlyMovingParts.nodes, randomlyMovingPart); |
49 | end; |
50 | i = i + 1; |
51 | end; |
52 | |
53 | if table.getn(self.randomlyMovingParts.nodes) > 0 then |
54 | self.randomlyMovingParts.running = false; |
55 | end |
56 | |
57 | self.randomlyMovingPartsDirtyFlag = self:getNextDirtyFlag(); |
58 | end; |
update
DescriptionCalled on updateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
84 | function RandomlyMovingParts:update(dt) |
85 | if self:getIsActive() then |
86 | self.randomlyMovingParts.running = false; |
87 | for _,part in pairs(self.randomlyMovingParts.nodes) do |
88 | local state = self:updateRandomlyMovingPart(part, dt); |
89 | self.randomlyMovingParts.running = self.randomlyMovingParts.running or state; |
90 | end |
91 | end |
92 | end; |
loadRandomlyMovingPartFromXML
DescriptionLoad randomly moving part from xmlDefinition
loadRandomlyMovingPartFromXML(table part, integer xmlFile, string key)Arguments
table | part | part |
integer | xmlFile | id of xml object |
string | key | key |
boolean |
106 | function RandomlyMovingParts:loadRandomlyMovingPartFromXML(part, xmlFile, key) |
107 | if not hasXMLProperty(self.xmlFile, key) then |
108 | return false; |
109 | end |
110 | |
111 | local node = Utils.indexToObject(self.components, getXMLString(xmlFile, key .. "#index")); |
112 | if node == nil then |
113 | return false; |
114 | end |
115 | |
116 | part.node = node; |
117 | |
118 | part.isActive = true; |
119 | |
120 | local refNodeIndex = getXMLInt(xmlFile, key .. "#refNodeIndex"); |
121 | if refNodeIndex ~= nil then |
122 | refNodeIndex = refNodeIndex + 1; |
123 | if self.groundReferenceNodes[refNodeIndex] ~= nil then |
124 | part.refNodeIndex = refNodeIndex; |
125 | end |
126 | end |
127 | |
128 | local rx,ry,rz = getRotation(part.node); |
129 | local rotMean = Utils.getRadiansFromString(getXMLString(xmlFile, key .. "#rotMean"), 2); |
130 | if rotMean then |
131 | part.rotOrig = {rx, ry, rz}; |
132 | part.rotCur = {rx, ry, rz}; |
133 | |
134 | part.rotAxis = getXMLInt(xmlFile, key .. "#rotAxis"); |
135 | |
136 | part.rotMean = rotMean; |
137 | part.rotVar = Utils.getRadiansFromString(getXMLString(xmlFile, key .. "#rotVariance"), 2); |
138 | |
139 | part.rotTimeMean = Utils.getVectorNFromString(getXMLString(xmlFile, key .. "#rotTimeMean"), 2); |
140 | part.rotTimeVar = Utils.getVectorNFromString(getXMLString(xmlFile, key .. "#rotTimeVariance"), 2); |
141 | |
142 | part.pauseMean = Utils.getVectorNFromString(getXMLString(xmlFile, key .. "#pauseMean"), 2); |
143 | part.pauseVar = Utils.getVectorNFromString(getXMLString(xmlFile, key .. "#pauseVariance"), 2); |
144 | |
145 | for i=1,2 do |
146 | part.rotTimeMean[i] = part.rotTimeMean[i] * 1000; |
147 | part.rotTimeVar[i] = part.rotTimeVar[i] * 1000; |
148 | part.pauseMean[i] = part.pauseMean[i] * 1000; |
149 | part.pauseVar[i] = part.pauseVar[i] * 1000; |
150 | end |
151 | |
152 | part.rotTarget = {}; |
153 | part.rotSpeed = {}; |
154 | part.pause = {}; |
155 | |
156 | self:updateRotationTargetValues(part); |
157 | end |
158 | |
159 | part.nextMoveTime = g_currentMission.time + part.pause[2]; |
160 | |
161 | part.curMoveDirection = 1; |
162 | |
163 | part.isActive = true; |
164 | |
165 | return true; |
166 | end; |
updateRandomlyMovingPart
DescriptionUpdate randomly moving partsDefinition
updateRandomlyMovingPart(table part, float dt)Arguments
table | part | part to update |
float | dt | time since last call in ms |
boolean | updated | part was updated |
173 | function RandomlyMovingParts:updateRandomlyMovingPart(part, dt) |
174 | |
175 | if part.nextMoveTime < g_currentMission.time then |
176 | |
177 | part.isActive = self:getIsRandomlyMovingPartActive(part); |
178 | |
179 | if part.curMoveDirection > 0 then |
180 | |
181 | if part.isActive then |
182 | |
183 | part.rotCur[part.rotAxis] = math.min(part.rotTarget[1], part.rotCur[part.rotAxis] + (part.rotSpeed[1] * dt)); |
184 | if part.rotCur[part.rotAxis] == part.rotTarget[1] then |
185 | part.curMoveDirection = -1; |
186 | part.nextMoveTime = g_currentMission.time + part.pause[1]; |
187 | end |
188 | |
189 | end |
190 | |
191 | else |
192 | |
193 | part.rotCur[part.rotAxis] = math.max(part.rotTarget[2], part.rotCur[part.rotAxis] + (part.rotSpeed[2] * dt)); |
194 | if part.rotCur[part.rotAxis] == part.rotTarget[2] then |
195 | -- start next movement only if active |
196 | if part.isActive then |
197 | part.curMoveDirection = 1; |
198 | part.nextMoveTime = g_currentMission.time + part.pause[2]; |
199 | self:updateRotationTargetValues(part); |
200 | end |
201 | end |
202 | |
203 | end |
204 | |
205 | setRotation(part.node, part.rotCur[1], part.rotCur[2], part.rotCur[3]); |
206 | |
207 | return true; |
208 | |
209 | else |
210 | return false; |
211 | end |
212 | end |
updateRotationTargetValues
DescriptionUpdate rotation target valuesDefinition
updateRotationTargetValues(table part)Arguments
table | part | part to update |
217 | function RandomlyMovingParts:updateRotationTargetValues(part) |
218 | for i=1,2 do |
219 | part.rotTarget[i] = part.rotMean[i] + ( part.rotVar[i] * (-0.5 + math.random()) ); |
220 | end |
221 | |
222 | for i=1,2 do |
223 | local rotTime = part.rotTimeMean[i] + ( part.rotTimeVar[i] * (-0.5 + math.random()) ); |
224 | if i == 1 then |
225 | part.rotSpeed[i] = (part.rotTarget[1] - part.rotTarget[2]) / rotTime; |
226 | else |
227 | part.rotSpeed[i] = (part.rotTarget[2] - part.rotTarget[1]) / rotTime; |
228 | end |
229 | end |
230 | |
231 | for i=1,2 do |
232 | part.pause[i] = part.pauseMean[i] + ( part.pauseVar[i] * (-0.5 + math.random()) ); |
233 | end |
234 | end |
getIsRandomlyMovingPartActive
DescriptionReturns if randomly moving part is activeDefinition
getIsRandomlyMovingPartActive(table part)Arguments
table | part | part to check |
boolean | isActive | is active |
240 | function RandomlyMovingParts:getIsRandomlyMovingPartActive(part) |
241 | local retValue = true |
242 | if part.refNodeIndex ~= nil then |
243 | retValue = self.groundReferenceNodes[part.refNodeIndex].isActive; |
244 | end |
245 | return retValue; |
246 | end |