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
ConveyorBelt
DescriptionClass for conveyor belts to control unloading start time and unloading effectsFunctions
- prerequisitesPresent
- load
- delete
- readStream
- writeStream
- readUpdateStream
- writeUpdateStream
- update
- updateTick
- setUnitFillLevel
- getAllowDelayedUnloading
- getAllowDelayEffects
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 ConveyorBelt.prerequisitesPresent(specializations) |
18 | return SpecializationUtil.hasSpecialization(Overloading, specializations) and SpecializationUtil.hasSpecialization(Pipe, specializations); |
19 | end |
load
DescriptionCalled on loadingDefinition
load(table savegame)Arguments
table | savegame | savegame |
24 | function 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(); |
110 | end; |
delete
DescriptionCalled on deletingDefinition
delete()Code
114 | function 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 |
122 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
128 | function 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; |
136 | end; |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
142 | function 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; |
150 | end; |
readUpdateStream
DescriptionCalled on client side on updateDefinition
readUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
157 | function 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 |
169 | end |
writeUpdateStream
DescriptionCalled on server side on updateDefinition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
176 | function 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 |
182 | end |
update
DescriptionCalled on updateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
193 | function 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; |
198 | end |
updateTick
DescriptionCalled on update tickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
203 | function 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; |
213 | end |
setUnitFillLevel
DescriptionSet unit fill levelDefinition
setUnitFillLevel(integer fillUnitIndex, float fillLevel, integer fillType, boolean force, table fillInfo)Arguments
integer | fillUnitIndex | index of fill unit |
float | fillLevel | new fill level |
integer | fillType | fill type |
boolean | force | force action |
table | fillInfo | fill info for fill volume |
225 | function 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; |
314 | end |
getAllowDelayedUnloading
DescriptionReturns if delay is over and delayed unloading is allowedDefinition
getAllowDelayedUnloading()Return Values
boolean | isAllowed | is allowed |
319 | function 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; |
331 | end |
getAllowDelayEffects
DescriptionReturns if delay effects should be displayedDefinition
getAllowDelayEffects()Return Values
boolean | allow | allow delay effects (stop if unloading stoped) |
336 | function ConveyorBelt:getAllowDelayEffects() |
337 | return self.conveyorBelt.lastFillLevelChangedTime + 250 > g_currentMission.time and self.conveyorBelt.lastUnloadingTime + 250 > g_currentMission.time; |
338 | end |