LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

RandomlyMovingParts

Description
Class for randomly moving parts
Functions

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
17function RandomlyMovingParts.prerequisitesPresent(specializations)
18 return true;
19end;

preLoad

Description
Called before loading
Definition
preLoad(table savegame)
Arguments
tablesavegamesavegame
Code
24function RandomlyMovingParts:preLoad(savegame)
25 self.loadRandomlyMovingPartFromXML = RandomlyMovingParts.loadRandomlyMovingPartFromXML;
26 self.updateRandomlyMovingPart = RandomlyMovingParts.updateRandomlyMovingPart;
27 self.updateRotationTargetValues = RandomlyMovingParts.updateRotationTargetValues;
28 self.getIsRandomlyMovingPartActive = RandomlyMovingParts.getIsRandomlyMovingPartActive;
29end;

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
34function 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();
58end;

update

Description
Called on update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
84function 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
92end;

loadRandomlyMovingPartFromXML

Description
Load randomly moving part from xml
Definition
loadRandomlyMovingPartFromXML(table part, integer xmlFile, string key)
Arguments
tablepartpart
integerxmlFileid of xml object
stringkeykey
Return Values
boolean
Code
106function 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;
166end;

updateRandomlyMovingPart

Description
Update randomly moving parts
Definition
updateRandomlyMovingPart(table part, float dt)
Arguments
tablepartpart to update
floatdttime since last call in ms
Return Values
booleanupdatedpart was updated
Code
173function 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
212end

updateRotationTargetValues

Description
Update rotation target values
Definition
updateRotationTargetValues(table part)
Arguments
tablepartpart to update
Code
217function 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
234end

getIsRandomlyMovingPartActive

Description
Returns if randomly moving part is active
Definition
getIsRandomlyMovingPartActive(table part)
Arguments
tablepartpart to check
Return Values
booleanisActiveis active
Code
240function 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;
246end