LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

DynamicMountAttacher

Description
Class for vehicle which can dynamically mount objects (e.g. bales and pallets)
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 DynamicMountAttacher.prerequisitesPresent(specializations)
18 return true;
19end;

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
24function DynamicMountAttacher:load(savegame)
25
26 self.dynamicMountTriggerCallback = DynamicMountAttacher.dynamicMountTriggerCallback;
27 self.addDynamicMountedObject = DynamicMountAttacher.addDynamicMountedObject;
28 self.removeDynamicMountedObject = DynamicMountAttacher.removeDynamicMountedObject;
29
30 self.getFillLevelInformation = Utils.overwrittenFunction(self.getFillLevelInformation, DynamicMountAttacher.getFillLevelInformation);
31
32 -- Allow mountable object to attach them selfs to us
33 self.dynamicMountAttacherNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher#index"));
34 self.dynamicMountAttacherForceLimitScale = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.dynamicMountAttacher#forceLimitScale"), 1);
35 self.dynamicMountAttacherTimeToMount = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.dynamicMountAttacher#timeToMount"), 1000);
36
37 local closedMountType = getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher.grab#closedMountType")
38 if closedMountType ~= nil then
39 self.dynamicMountAttacherGrab = {};
40 self.dynamicMountAttacherGrab.openMountType = Utils.getNoNil(DynamicMountUtil[getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher.grab#openMountType")], DynamicMountUtil.TYPE_FORK);
41 self.dynamicMountAttacherGrab.closedMountType = Utils.getNoNil(DynamicMountUtil[closedMountType], DynamicMountUtil.TYPE_AUTO_ATTACH_XYZ);
42 self.dynamicMountAttacherGrab.currentMountType = self.dynamicMountAttacherGrab.openMountType;
43 end;
44
45 if self.isServer then
46 self.dynamicMountCollisionMasks = {};
47 local i=0;
48 while true do
49 local key = string.format("vehicle.dynamicMountAttacher.mountCollisionMask(%d)", i);
50 if not hasXMLProperty(self.xmlFile, key) then
51 break;
52 end
53 local node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key.."#index"));
54 local mask = getXMLInt(self.xmlFile, key.."#collisionMask");
55 if node ~= nil and mask ~= nil then
56 table.insert(self.dynamicMountCollisionMasks, {node=node, mountedCollisionMask=mask, unmountedCollisionMask=getCollisionMask(node)});
57 end
58 i=i+1;
59 end
60
61 local attacherTriggerTriggerNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher#triggerNode"));
62 local attacherTriggerRootNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher#rootNode"));
63 local attacherTriggerJointNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher#jointNode"));
64 if attacherTriggerTriggerNode ~= nil and attacherTriggerRootNode ~= nil and attacherTriggerJointNode ~= nil then
65 local forceAcceleration = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.dynamicMountAttacher#forceAcceleration"), 30);
66 addTrigger(attacherTriggerTriggerNode, "dynamicMountTriggerCallback", self);
67 local mountTypeString = Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.dynamicMountAttacher#mountType"), "TYPE_AUTO_ATTACH_XZ");
68 local mountType = Utils.getNoNil(DynamicMountUtil[mountTypeString], DynamicMountUtil.TYPE_AUTO_ATTACH_XZ);
69 self.dynamicMountAttacherTrigger = {triggerNode=attacherTriggerTriggerNode, rootNode=attacherTriggerRootNode, jointNode=attacherTriggerJointNode, forceAcceleration=forceAcceleration, mountType = mountType, mountTypeClosed=mountTypeClosed, currentMountType=mountType};
70 end
71 self.pendingDynamicMountObjects = {};
72 end
73
74 self.dynamicMountedObjects = {};
75 self.dynamicMountedObjectsDirtyFlag = self:getNextDirtyFlag();
76end;

delete

Description
Called on deleting
Definition
delete()
Code
80function DynamicMountAttacher:delete()
81 if self.isServer then
82 for object,_ in pairs(self.dynamicMountedObjects) do
83 object:unmountDynamic();
84 end
85 end
86 if self.dynamicMountAttacherTrigger ~= nil then
87 removeTrigger(self.dynamicMountAttacherTrigger.triggerNode);
88 end
89end;

readUpdateStream

Description
Called on client side on update
Definition
readUpdateStream(integer streamId, integer timestamp, table connection)
Arguments
integerstreamIdstream ID
integertimestamptimestamp
tableconnectionconnection
Code
96function DynamicMountAttacher:readUpdateStream(streamId, timestamp, connection)
97 if connection:getIsServer() then
98 if streamReadBool(streamId) then
99 local sum = streamReadIntN(streamId, 5);
100
101 self.dynamicMountedObjects = {};
102 for i=1, sum do
103 local object = readNetworkNodeObject(streamId);
104 self.dynamicMountedObjects[object] = object;
105 end;
106 end;
107 end
108end

writeUpdateStream

Description
Called on server side on update
Definition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)
Arguments
integerstreamIdstream ID
tableconnectionconnection
integerdirtyMaskdirty mask
Code
115function DynamicMountAttacher:writeUpdateStream(streamId, connection, dirtyMask)
116 if not connection:getIsServer() then
117 if streamWriteBool(streamId, bitAND(dirtyMask, self.dynamicMountedObjectsDirtyFlag) ~= 0) then
118 local num = 0;
119 for object,_ in pairs(self.dynamicMountedObjects) do
120 num = num + 1;
121 end;
122 streamWriteIntN(streamId, num, 5)
123
124 for object,_ in pairs(self.dynamicMountedObjects) do
125 writeNetworkNodeObject(streamId, object);
126 end;
127 end;
128 end
129end

updateTick

Description
Called on update tick
Definition
updateTick(float dt)
Arguments
floatdttime since last call in ms
Code
143function DynamicMountAttacher:updateTick(dt)
144 if self.isServer then
145 for object,_ in pairs(self.pendingDynamicMountObjects) do
146 if self.dynamicMountedObjects[object] == nil then
147 if object.lastMoveTime + self.dynamicMountAttacherTimeToMount < g_currentMission.time then
148 local doAttach = false;
149 if object.components ~= nil then
150 if entityExists(object.components[1].node) then
151 doAttach = true;
152 end;
153 end;
154 if object.nodeId ~= nil then
155 if entityExists(object.nodeId) then
156 doAttach = true;
157 end;
158 end;
159 if doAttach then
160 local trigger = self.dynamicMountAttacherTrigger;
161 if object:mountDynamic(self, trigger.rootNode, trigger.jointNode, trigger.mountType, trigger.forceAcceleration) then
162 self:addDynamicMountedObject(object);
163 end
164 else
165 self.pendingDynamicMountObjects[object] = nil;
166 end;
167 end
168 end
169 end
170
171 if self.dynamicMountAttacherGrab ~= nil and self.shovelOpenNode ~= nil then
172 for object,_ in pairs(self.dynamicMountedObjects) do
173 local closed = false;
174
175 local x,_,_ = getRotation(self.shovelOpenNode);
176 if self.shovelOpenDirection > 0 then
177 if x < self.shovelOpenRotation then
178 closed = true;
179 end;
180 else
181 if x > self.shovelOpenRotation then
182 closed = true;
183 end
184 end
185
186 local usedMountType = self.dynamicMountAttacherGrab.openMountType;
187 if closed then
188 usedMountType = self.dynamicMountAttacherGrab.closedMountType;
189 end;
190
191 if self.dynamicMountAttacherGrab.currentMountType ~= usedMountType then
192 self.dynamicMountAttacherGrab.currentMountType = usedMountType;
193
194 local x, y, z = getWorldTranslation(self.dynamicMountAttacherNode);
195 setJointPosition(object.dynamicMountJointIndex, 1, x,y,z);
196 if usedMountType == DynamicMountUtil.TYPE_FORK then
197
198 setJointRotationLimit(object.dynamicMountJointIndex, 0, true, 0, 0);
199 setJointRotationLimit(object.dynamicMountJointIndex, 1, true, 0, 0);
200 setJointRotationLimit(object.dynamicMountJointIndex, 2, true, 0, 0);
201
202 if object.dynamicMountSingleAxisFreeX then
203 setJointTranslationLimit(object.dynamicMountJointIndex, 0, false, 0, 0);
204 else
205 setJointTranslationLimit(object.dynamicMountJointIndex, 0, true, -0.01, 0.01);
206 end
207 if object.dynamicMountSingleAxisFreeY then
208 setJointTranslationLimit(object.dynamicMountJointIndex, 1, false, 0, 0);
209 else
210 setJointTranslationLimit(object.dynamicMountJointIndex, 1, true, -0.01, 0.01);
211 end
212 setJointTranslationLimit(object.dynamicMountJointIndex, 2, false, 0, 0);
213 else
214 setJointRotationLimit(object.dynamicMountJointIndex, 0, true, 0, 0);
215 setJointRotationLimit(object.dynamicMountJointIndex, 1, true, 0, 0);
216 setJointRotationLimit(object.dynamicMountJointIndex, 2, true, 0, 0);
217
218 if usedMountType == DynamicMountUtil.TYPE_AUTO_ATTACH_XYZ or usedMountType == DynamicMountUtil.TYPE_FIX_ATTACH then
219 setJointTranslationLimit(object.dynamicMountJointIndex, 0, true, -0.01, 0.01);
220 setJointTranslationLimit(object.dynamicMountJointIndex, 1, true, -0.01, 0.01);
221 setJointTranslationLimit(object.dynamicMountJointIndex, 2, true, -0.01, 0.01);
222 elseif usedMountType == DynamicMountUtil.TYPE_AUTO_ATTACH_XZ then
223 setJointTranslationLimit(object.dynamicMountJointIndex, 0, true, -0.01, 0.01);
224 setJointTranslationLimit(object.dynamicMountJointIndex, 1, false, 0, 0);
225 setJointTranslationLimit(object.dynamicMountJointIndex, 2, true, -0.01, 0.01);
226 elseif usedMountType == DynamicMountUtil.TYPE_AUTO_ATTACH_Y then
227 setJointTranslationLimit(object.dynamicMountJointIndex, 0, false, 0, 0);
228 setJointTranslationLimit(object.dynamicMountJointIndex, 1, true, -0.01, 0.01);
229 setJointTranslationLimit(object.dynamicMountJointIndex, 2, false, 0, 0);
230 end;
231 end;
232 end;
233 end;
234 end;
235 end
236end;

addDynamicMountedObject

Description
Add dynamic mount object
Definition
addDynamicMountedObject(table object)
Arguments
tableobjectobject
Code
244function DynamicMountAttacher:addDynamicMountedObject(object)
245 self.dynamicMountedObjects[object] = object;
246
247 for _, info in pairs(self.dynamicMountCollisionMasks) do
248 setCollisionMask(info.node, info.mountedCollisionMask);
249 end
250
251 self:raiseDirtyFlags(self.dynamicMountedObjectsDirtyFlag);
252end

removeDynamicMountedObject

Description
Remove dynamic mount object
Definition
removeDynamicMountedObject(table object, boolean isDeleting)
Arguments
tableobjectobject
booleanisDeletingis deleting
Code
258function DynamicMountAttacher:removeDynamicMountedObject(object, isDeleting)
259 self.dynamicMountedObjects[object] = nil;
260 if isDeleting then
261 self.pendingDynamicMountObjects[object] = nil;
262 end
263
264 if next(self.dynamicMountedObjects) == nil and next(self.pendingDynamicMountObjects) == nil then
265 for _, info in pairs(self.dynamicMountCollisionMasks) do
266 setCollisionMask(info.node, info.unmountedCollisionMask);
267 end
268 end
269
270 self:raiseDirtyFlags(self.dynamicMountedObjectsDirtyFlag);
271end

dynamicMountTriggerCallback

Description
Trigger callback
Definition
dynamicMountTriggerCallback(integer triggerId, integer otherActorId, boolean onEnter, boolean onLeave, boolean onStay, integer otherShapeId)
Arguments
integertriggerIdid of trigger
integerotherActorIdid of other actor
booleanonEnteron enter
booleanonLeaveon leave
booleanonStayon stay
integerotherShapeIdid of other shape
Code
281function DynamicMountAttacher:dynamicMountTriggerCallback(triggerId, otherActorId, onEnter, onLeave, onStay, otherShapeId)
282 if onEnter then
283 local object = g_currentMission:getNodeObject(otherActorId);
284 if object == nil then
285 object = g_currentMission.nodeToVehicle[otherActorId];
286 end;
287 if object == self:getRootAttacherVehicle() or object == self.attacherVehicle then
288 object = nil;
289 end;
290 if object ~= nil and object ~= self and object.getSupportsMountDynamic ~= nil and object:getSupportsMountDynamic() and object.lastMoveTime ~= nil then
291 self.pendingDynamicMountObjects[object] = Utils.getNoNil(self.pendingDynamicMountObjects[object], 0) + 1;
292 end
293 elseif onLeave then
294 local object = g_currentMission:getNodeObject(otherActorId);
295 if object == nil then
296 object = g_currentMission.nodeToVehicle[otherActorId];
297 end;
298 if object ~= nil then
299 if self.pendingDynamicMountObjects[object] ~= nil then
300 local count = self.pendingDynamicMountObjects[object]-1;
301 if count == 0 then
302 self.pendingDynamicMountObjects[object] = nil;
303
304 if self.dynamicMountedObjects[object] ~= nil then
305 self:removeDynamicMountedObject(object, false);
306 object:unmountDynamic();
307 end
308 else
309 self.pendingDynamicMountObjects[object] = count;
310 end
311 end
312 end
313 end
314end;

getFillLevelInformation

Description
Added fill level information to display it on the hud
Definition
getFillLevelInformation(table fillLevelInformations)
Arguments
tablefillLevelInformationstable to add the informations
Code
319function DynamicMountAttacher:getFillLevelInformation(superFunc, fillLevelInformations)
320 if superFunc ~= nil then
321 superFunc(self, fillLevelInformations)
322 end
323
324 for object,_ in pairs(self.dynamicMountedObjects) do
325 if object.getFillLevel ~= nil and object.getFillType ~= nil then
326 local added = false;
327 for _,fillLevelInformation in pairs(fillLevelInformations) do
328 if fillLevelInformation.fillType == object:getFillType() then
329 fillLevelInformation.fillLevel = fillLevelInformation.fillLevel + object:getFillLevel();
330 if object.getCapacity ~= nil then
331 fillLevelInformation.capacity = fillLevelInformation.capacity + object:getCapacity();
332 else
333 fillLevelInformation.capacity = fillLevelInformation.capacity + object:getFillLevel(); -- bale
334 end
335 added = true;
336 break;
337 end
338 end
339 if not added then
340 if object.getCapacity ~= nil then
341 table.insert(fillLevelInformations, {fillType=object:getFillType(), fillLevel=object:getFillLevel(), capacity=object:getCapacity()});
342 else
343 table.insert(fillLevelInformations, {fillType=object:getFillType(), fillLevel=object:getFillLevel(), capacity=object:getFillLevel()});
344 end
345 end
346 end
347 end
348end