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; |
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 |