LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

ConveyorBelt

Description
Class for conveyor belts to control unloading start time and unloading effects
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 ConveyorBelt.prerequisitesPresent(specializations)
18 return SpecializationUtil.hasSpecialization(Overloading, specializations) and SpecializationUtil.hasSpecialization(Pipe, specializations);
19end

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
24function ConveyorBelt:load(savegame)
25 self.setUnitFillLevel = Utils.overwrittenFunction(self.setUnitFillLevel, ConveyorBelt.setUnitFillLevel);
26
27 self.conveyorBelt = {};
28
29 self.conveyorBelt.effects = EffectManager:loadEffect(self.xmlFile, "vehicle.conveyorBeltEffect", self.components, self);
30 self.conveyorBelt.currentDelay = 0;
31 for _, effect in pairs(self.conveyorBelt.effects) do
32 if effect.planeFadeTime ~= nil then
33 self.conveyorBelt.currentDelay = self.conveyorBelt.currentDelay + effect.planeFadeTime;
34 end
35 end
36 self.conveyorBelt.maxDelay = self.conveyorBelt.currentDelay
37
38 self.conveyorBelt.turnedOnRotationNodes = Utils.loadRotationNodes(self.xmlFile, {}, "vehicle.turnedOnRotationNodes.turnedOnRotationNode", "conveyorBelt", self.components);
39 self.conveyorBelt.scrollers = Utils.loadScrollers(self.components, self.xmlFile, "vehicle.conveyorBeltScrollers.conveyorBeltScroller", {}, true);
40
41 self.conveyorBelt.startFillLevel = self:getUnitCapacity(self.overloading.fillUnitIndex) * Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.conveyorBelt#startPercentage"), 0.9);
42
43 local i = 0
44 while true do
45 local key = string.format("vehicle.conveyorBelt.offset(%d)", i);
46 if not hasXMLProperty(self.xmlFile, key) then
47 break
48 end
49
50 local movingToolNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key.."#movingToolNode"))
51 if movingToolNode ~= nil and self.nodesToMovingTools[movingToolNode] ~= nil then
52 if self.conveyorBelt.offsets == nil then
53 self.conveyorBelt.offsets = {}
54 end
55
56 local offset = {}
57 offset.movingTool = self.nodesToMovingTools[movingToolNode]
58 offset.lastState = 0;
59 offset.effects = {}
60 local j = 0
61 while true do
62 local effectKey = string.format(key..".effect(%d)", j);
63 if not hasXMLProperty(self.xmlFile, effectKey) then
64 break
65 end
66
67 local effectIndex = Utils.getNoNil(getXMLInt(self.xmlFile, effectKey.."#index"), 0)
68 if self.conveyorBelt.effects[effectIndex] ~= nil and self.conveyorBelt.effects[effectIndex].setOffset ~= nil then
69 local effect = {}
70 effect.effect = self.conveyorBelt.effects[effectIndex]
71 effect.minValue = Utils.getNoNil(getXMLFloat(self.xmlFile, effectKey.."#minOffset"), 0)*1000
72 effect.maxValue = Utils.getNoNil(getXMLFloat(self.xmlFile, effectKey.."#maxOffset"), 1)*1000
73 effect.inverted = Utils.getNoNil(getXMLBool(self.xmlFile, effectKey.."#inverted"), false)
74 table.insert(offset.effects, effect)
75 end
76 j = j + 1
77 end
78
79 table.insert(self.conveyorBelt.offsets, offset)
80 end
81 i = i + 1
82 end
83
84 self.conveyorBelt.lastLoadingTime = 0;
85 self.conveyorBelt.lastUnloadingTime = 0;
86 self.conveyorBelt.lastFillLevelChangedTime = 0;
87 self.conveyorBelt.lastFilllevel = 0;
88
89 if table.getn(self.conveyorBelt.effects) > 0 then
90 self.getAllowDelayedUnloading = ConveyorBelt.getAllowDelayedUnloading;
91 self.getAllowDelayEffects = ConveyorBelt.getAllowDelayEffects;
92 end;
93
94 local triggerId = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.conveyorBelt.tipTrigger#index"));
95 if triggerId ~= nil and triggerId ~= 0 then
96 self.conveyorBelt.tipTrigger = ConveyorBeltTipTrigger:new(self.isServer, self.isClient);
97 self.conveyorBelt.tipTrigger:load(triggerId, self);
98 self.conveyorBelt.tipTrigger:register(true)
99 self.conveyorBelt.tipTrigger:addUpdateEventListener(self)
100
101 self.conveyorBelt.fillUnitIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.conveyorBelt.tipTrigger#fillUnitIndex"), 1)
102 if self.fillUnits[self.conveyorBelt.fillUnitIndex] ~= nil then
103 for fillType, _ in pairs(self.fillUnits[self.conveyorBelt.fillUnitIndex].fillTypes) do
104 self.conveyorBelt.tipTrigger:addAcceptedFillType(fillType, 0, false, true, {TipTrigger.TOOL_TYPE_TRAILER, TipTrigger.TOOL_TYPE_SHOVEL, TipTrigger.TOOL_TYPE_PIPE, TipTrigger.TOOL_TYPE_PALLET})
105 end
106 end;
107 end;
108
109 self.fillLevelChangedDirtyFlag = self:getNextDirtyFlag();
110end;

delete

Description
Called on deleting
Definition
delete()
Code
114function ConveyorBelt:delete()
115 if self.isClient then
116 EffectManager:deleteEffects(self.conveyorBelt.effects);
117 end
118
119 if self.conveyorBelt.tipTrigger ~= nil then
120 self.conveyorBelt.tipTrigger:delete();
121 end
122end

readStream

Description
Called on client side on join
Definition
readStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
128function ConveyorBelt:readStream(streamId, connection)
129 if self.conveyorBelt.tipTrigger ~= nil then
130 if connection:getIsServer() then
131 local tipTriggerId = streamReadInt32(streamId);
132 self.conveyorBelt.tipTrigger:readStream(streamId, connection);
133 g_client:finishRegisterObject(self.conveyorBelt.tipTrigger, tipTriggerId);
134 end;
135 end;
136end;

writeStream

Description
Called on server side on join
Definition
writeStream(integer streamId, integer connection)
Arguments
integerstreamIdstreamId
integerconnectionconnection
Code
142function ConveyorBelt:writeStream(streamId, connection)
143 if self.conveyorBelt.tipTrigger ~= nil then
144 if not connection:getIsServer() then
145 streamWriteInt32(streamId, self.conveyorBelt.tipTrigger.id);
146 self.conveyorBelt.tipTrigger:writeStream(streamId, connection);
147 g_server:registerObjectInStream(connection, self.conveyorBelt.tipTrigger);
148 end;
149 end;
150end;

readUpdateStream

Description
Called on client side on update
Definition
readUpdateStream(integer streamId, integer timestamp, table connection)
Arguments
integerstreamIdstream ID
integertimestamptimestamp
tableconnectionconnection
Code
157function ConveyorBelt:readUpdateStream(streamId, timestamp, connection)
158 if connection:getIsServer() then
159 if streamReadBool(streamId) then
160 self.conveyorBelt.lastFillLevelChangedTime = g_currentMission.time;
161
162 if streamReadBool(streamId) then
163 self.conveyorBelt.lastLoadingTime = g_currentMission.time;
164 else
165 self.conveyorBelt.lastUnloadingTime = g_currentMission.time;
166 end;
167 end;
168 end
169end

writeUpdateStream

Description
Called on server side on update
Definition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)
Arguments
integerstreamIdstream ID
tableconnectionconnection
integerdirtyMaskdirty mask
Code
176function ConveyorBelt:writeUpdateStream(streamId, connection, dirtyMask)
177 if not connection:getIsServer() then
178 if streamWriteBool(streamId, bitAND(dirtyMask, self.fillLevelChangedDirtyFlag) ~= 0) then
179 streamWriteBool(streamId, self.conveyorBelt.lastLoadingTime > self.conveyorBelt.lastUnloadingTime);
180 end;
181 end
182end

update

Description
Called on update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
193function ConveyorBelt:update(dt)
194 if self.isClient then
195 Utils.updateRotationNodes(self, self.conveyorBelt.turnedOnRotationNodes, dt, self.conveyorBelt.lastFillLevelChangedTime + 100 > g_currentMission.time);
196 Utils.updateScrollers(self.conveyorBelt.scrollers, dt, self.conveyorBelt.lastFillLevelChangedTime + 100 > g_currentMission.time);
197 end;
198end

updateTick

Description
Called on update tick
Definition
updateTick(float dt)
Arguments
floatdttime since last call in ms
Code
203function ConveyorBelt:updateTick(dt)
204 if self.isClient then
205 if self.conveyorBelt.lastFillLevelChangedTime + 100 < g_currentMission.time then
206 for _, effect in pairs(self.conveyorBelt.effects) do
207 if effect.setScrollUpdate ~= nil then
208 effect:setScrollUpdate(false);
209 end
210 end
211 end;
212 end;
213end

setUnitFillLevel

Description
Set unit fill level
Definition
setUnitFillLevel(integer fillUnitIndex, float fillLevel, integer fillType, boolean force, table fillInfo)
Arguments
integerfillUnitIndexindex of fill unit
floatfillLevelnew fill level
integerfillTypefill type
booleanforceforce action
tablefillInfofill info for fill volume
Code
225function ConveyorBelt:setUnitFillLevel(superFunc, fillUnitIndex, fillLevel, fillType, force, fillInfo)
226 local isLoading = fillLevel > self.conveyorBelt.lastFilllevel;
227 local isUnLoading = fillLevel < self.conveyorBelt.lastFilllevel;
228
229 if fillUnitIndex == self.overloading.fillUnitIndex then
230 if self.isClient then
231 if self.conveyorBelt.effects ~= nil then
232 if fillType ~= FillUtil.FILLTYPE_UNKNOWN then
233 EffectManager:setFillType(self.conveyorBelt.effects, fillType)
234 EffectManager:startEffects(self.conveyorBelt.effects)
235 else
236 EffectManager:stopEffects(self.conveyorBelt.effects)
237 end;
238 end
239
240 for _, effect in pairs(self.conveyorBelt.effects) do
241 if effect.setMorphPosition ~= nil then
242 if isLoading then
243 local globalPos = Utils.clamp(fillLevel/self.conveyorBelt.startFillLevel, 0, 1)
244 local localPos = (globalPos - (effect.startDelay/self.conveyorBelt.currentDelay)) / (effect.planeFadeTime/self.conveyorBelt.currentDelay);
245 local offset = effect.offset/effect.planeFadeTime;
246
247 effect:setMorphPosition(offset, Utils.clamp(localPos+offset, offset, 1));
248 elseif isUnLoading and not isLoading then
249 local globalPos = 1-Utils.clamp(fillLevel/self.conveyorBelt.startFillLevel, 0, 1);
250 local localPos = (globalPos - (effect.startDelay/self.conveyorBelt.currentDelay)) / (effect.planeFadeTime/self.conveyorBelt.currentDelay);
251 local offset = effect.offset/effect.planeFadeTime;
252
253 effect:setMorphPosition(Utils.clamp(localPos+offset, offset, 1), 1)
254 end;
255 end
256 end
257
258 for _, effect in pairs(self.conveyorBelt.effects) do
259 if effect.setScrollUpdate ~= nil then
260 effect:setScrollUpdate(true);
261 end
262 end
263
264 if self.conveyorBelt.offsets ~= nil then
265 local updateDelay = false;
266 for _, offset in pairs(self.conveyorBelt.offsets) do
267 local movingTool = offset.movingTool
268 local state = Cylindered.getMovingToolState(self, movingTool);
269 if state ~= offset.lastState then
270 for _, effect in pairs(offset.effects) do
271 local effectState = state
272 if effect.inverted then
273 effectState = 1 - effectState
274 end
275
276 effect.effect:setOffset(Utils.lerp(effect.minValue, effect.maxValue, effectState));
277 updateDelay = true;
278 end
279
280 offset.lastState = state;
281 end;
282 end
283
284 if updateDelay then
285 self.conveyorBelt.currentDelay = 0;
286 for _, effect in pairs(self.conveyorBelt.effects) do
287 if effect.planeFadeTime ~= nil then
288 self.conveyorBelt.currentDelay = self.conveyorBelt.currentDelay + effect.planeFadeTime - effect.offset;
289 end
290 end
291 end;
292 end
293 end;
294 end;
295
296 self.conveyorBelt.lastFilllevel = fillLevel;
297
298 if self.isServer then
299 self.conveyorBelt.lastFillLevelChangedTime = g_currentMission.time;
300
301 if isLoading then
302 self.conveyorBelt.lastLoadingTime = g_currentMission.time;
303 elseif isUnLoading then
304 self.conveyorBelt.lastUnloadingTime = g_currentMission.time;
305 end;
306
307 self:raiseDirtyFlags(self.fillLevelChangedDirtyFlag);
308 end;
309
310 if superFunc ~= nil then
311 return superFunc(self, fillUnitIndex, fillLevel, fillType, force, fillInfo);
312 end
313 return nil;
314end

getAllowDelayedUnloading

Description
Returns if delay is over and delayed unloading is allowed
Definition
getAllowDelayedUnloading()
Return Values
booleanisAllowedis allowed
Code
319function ConveyorBelt:getAllowDelayedUnloading()
320 local fillLevel = self:getUnitFillLevel(self.overloading.fillUnitIndex);
321
322 if fillLevel > self.conveyorBelt.startFillLevel then
323 return true;
324 end;
325
326 if fillLevel > 0 and self.conveyorBelt.lastLoadingTime + 250 < g_currentMission.time and self:getOverloadingActive() then
327 return true;
328 end;
329
330 return false;
331end

getAllowDelayEffects

Description
Returns if delay effects should be displayed
Definition
getAllowDelayEffects()
Return Values
booleanallowallow delay effects (stop if unloading stoped)
Code
336function ConveyorBelt:getAllowDelayEffects()
337 return self.conveyorBelt.lastFillLevelChangedTime + 250 > g_currentMission.time and self.conveyorBelt.lastUnloadingTime + 250 > g_currentMission.time;
338end