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
Overloading
DescriptionClass for overloading vehiclesFunctions
- prerequisitesPresent
- load
- delete
- readStream
- writeStream
- readUpdateStream
- writeUpdateStream
- update
- updateTick
- draw
- setOverloadingActive
- getOverloadingActive
- doOverload
- getIsFoldAllowed
- getPtoRpm
- getDoConsumePtoPower
- getIsOverloadingAllowed
- findValidTrailer
- getAutomaticOverloadingState
- loadTrailerTriggers
- onOverloadingTrailerTrigger
- startOverloadingDelay
- stopOverloadingDelay
- updateOverloadingDelay
- setOverloadingDelay
- getOverloadingDelayIsActive
- getAllowDelayEffects
- getAllowDelayedEffects
- getAllowDelayedUnloading
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
20 | function Overloading.prerequisitesPresent(specializations) |
21 | return SpecializationUtil.hasSpecialization(Fillable, specializations) and SpecializationUtil.hasSpecialization(FillVolume, specializations); |
22 | end |
load
DescriptionCalled on loadingDefinition
load(table savegame)Arguments
table | savegame | savegame |
30 | function Overloading:load(savegame) |
31 | |
32 | self.setOverloadingActive = Overloading.setOverloadingActive; |
33 | self.doOverload = Overloading.doOverload; |
34 | self.getIsFoldAllowed = Utils.overwrittenFunction(self.getIsFoldAllowed, Overloading.getIsFoldAllowed); |
35 | self.getPtoRpm = Utils.overwrittenFunction(self.getPtoRpm, Overloading.getPtoRpm); |
36 | self.getDoConsumePtoPower = Utils.overwrittenFunction(self.getDoConsumePtoPower, Overloading.getDoConsumePtoPower); |
37 | self.getIsOverloadingAllowed = Overloading.getIsOverloadingAllowed; |
38 | self.findValidTrailer = Overloading.findValidTrailer; |
39 | self.loadTrailerTriggers = Overloading.loadTrailerTriggers; |
40 | self.onOverloadingTrailerTrigger = Overloading.onOverloadingTrailerTrigger; |
41 | self.getAutomaticOverloadingState = Overloading.getAutomaticOverloadingState; |
42 | self.getOverloadingActive = Utils.overwrittenFunction(self.getOverloadingActive, Overloading.getOverloadingActive); |
43 | |
44 | self.startOverloadingDelay = Overloading.startOverloadingDelay; |
45 | self.stopOverloadingDelay = Overloading.stopOverloadingDelay; |
46 | self.updateOverloadingDelay = Overloading.updateOverloadingDelay; |
47 | self.setOverloadingDelay = Overloading.setOverloadingDelay; |
48 | self.getOverloadingDelayIsActive = Overloading.getOverloadingDelayIsActive; |
49 | self.getAllowDelayedUnloading = Overloading.getAllowDelayedUnloading; |
50 | self.getAllowDelayEffects = Overloading.getAllowDelayEffects; |
51 | self.getAllowDelayedEffects = Overloading.getAllowDelayedEffects; |
52 | |
53 | Utils.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.combineTrailerTriggers.combineTrailerTrigger", "vehicle.overloading.trailerTriggers.trailerTrigger") |
54 | Utils.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.overloadingCapacity", "vehicle.overloading#capacity") |
55 | Utils.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.trailerTriggers#foldMinTime", "vehicle.overloading#foldMinTime") |
56 | Utils.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.trailerTriggers#foldMaxTime", "vehicle.overloading#foldMaxTime") |
57 | Utils.checkDeprecatedXMLElements(self.xmlFile, self.configFileName, "vehicle.trailerTriggers#allowFoldWhileOverloading", "vehicle.overloading#allowFoldWhileOverloading") |
58 | |
59 | self.overloading = {}; |
60 | self.overloading.trailerTriggers = {}; |
61 | self:loadTrailerTriggers(self.overloading.trailerTriggers, self.xmlFile); |
62 | for _, trigger in pairs(self.overloading.trailerTriggers) do |
63 | addTrigger(trigger.node, "onOverloadingTrailerTrigger", self); |
64 | end |
65 | self.overloading.trailersInRange = {}; |
66 | self.overloading.capacity = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.overloading#capacity"), 10); |
67 | self.overloading.fillUnitIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.overloading#fillUnitIndex"), 1); |
68 | self.overloading.unloadInfoIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.overloading#unloadInfoIndex"), 1); |
69 | self.overloading.loadInfoIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.overloading#loadInfoIndex"), 1); |
70 | self.overloading.dischargeInfoIndex = Utils.getNoNil(getXMLInt(self.xmlFile, "vehicle.overloading#dischargeInfoIndex"), 1); |
71 | self.overloading.stopOverloadIfEmpty = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.overloading#stopOverloadIfEmpty"), true); |
72 | self.overloading.forceActive = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.overloading#forceActive"), false); |
73 | self.overloading.canToggleOverloading = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.overloading#canToggleOverloading"), true); |
74 | self.overloading.foldMinTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.overloading#foldMinTime"), 0); |
75 | self.overloading.foldMaxTime = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.overloading#foldMaxTime"), 1); |
76 | self.overloading.allowFoldWhileOverloading = Utils.getNoNil(getXMLBool(self.xmlFile, "vehicle.overloading#allowFoldWhileOverloading"), false); |
77 | self.overloading.isActive = false; |
78 | self.overloading.didOverload = false; |
79 | |
80 | self.overloading.delay = {}; |
81 | self.overloading.delay.current = 0; |
82 | self.overloading.delay.unloadStartTime = 0; |
83 | self.overloading.delay.sentCurrent = 0; |
84 | self.overloading.delay.sentUnloadStartTime = 0; |
85 | self.overloading.delay.dirtyFlag = self:getNextDirtyFlag(); |
86 | self.overloading.delay.time = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.overloading#delay"), Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.pipe#delay"), 0)) * 1000; |
87 | |
88 | self.isSelectable = true; |
89 | |
90 | local linkNode = Utils.indexToObject(self.components, Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.fillSound#linkNode"), "0>")); |
91 | self.sampleFill = SoundUtil.loadSample(self.xmlFile, {}, "vehicle.fillSound", nil, self.baseDirectory, linkNode); |
92 | self.sampleFillStopTime = 0; |
93 | |
94 | |
95 | self.overloadingDirtyFlag = self:getNextDirtyFlag(); |
96 | |
97 | self:addConflictCheckedInput(InputBinding.TOGGLE_PIPE); |
98 | end |
delete
DescriptionCalled on deletingDefinition
delete()Code
102 | function Overloading:delete() |
103 | for _, trailerTrigger in pairs(self.overloading.trailerTriggers) do |
104 | removeTrigger(trailerTrigger.node); |
105 | end |
106 | |
107 | if self.isClient then |
108 | SoundUtil.deleteSample(self.sampleFill); |
109 | end |
110 | end |
readStream
DescriptionCalled on client side on joinDefinition
readStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
120 | function Overloading:readStream(streamId, connection) |
121 | if connection:getIsServer() then |
122 | self.overloading.didOverload = streamReadBool(streamId); |
123 | self:setOverloadingActive(streamReadBool(streamId), true); |
124 | end |
125 | end |
writeStream
DescriptionCalled on server side on joinDefinition
writeStream(integer streamId, integer connection)Arguments
integer | streamId | streamId |
integer | connection | connection |
131 | function Overloading:writeStream(streamId, connection) |
132 | if not connection:getIsServer() then |
133 | streamWriteBool(streamId, self.overloading.didOverload); |
134 | streamWriteBool(streamId, self.overloading.isActive); |
135 | end |
136 | end |
readUpdateStream
DescriptionCalled on on updateDefinition
readUpdateStream(integer streamId, integer timestamp, table connection)Arguments
integer | streamId | stream ID |
integer | timestamp | timestamp |
table | connection | connection |
143 | function Overloading:readUpdateStream(streamId, timestamp, connection) |
144 | if connection:getIsServer() then |
145 | if streamReadBool(streamId) then |
146 | self.overloading.didOverload = streamReadBool(streamId); |
147 | end; |
148 | |
149 | if streamReadBool(streamId) then |
150 | self.overloading.delay.current = streamReadUIntN(streamId, 6)/63*self.overloading.delay.time; |
151 | |
152 | if streamReadBool(streamId) then |
153 | self.overloading.delay.unloadStartTime = 1; |
154 | else |
155 | self.overloading.delay.unloadStartTime = -1; |
156 | end; |
157 | end; |
158 | end |
159 | end |
writeUpdateStream
DescriptionCalled on on updateDefinition
writeUpdateStream(integer streamId, table connection, integer dirtyMask)Arguments
integer | streamId | stream ID |
table | connection | connection |
integer | dirtyMask | dirty mask |
166 | function Overloading:writeUpdateStream(streamId, connection, dirtyMask) |
167 | if not connection:getIsServer() then |
168 | if streamWriteBool(streamId, bitAND(dirtyMask, self.overloadingDirtyFlag) ~= 0) then |
169 | streamWriteBool(streamId, self.overloading.didOverload); |
170 | end; |
171 | |
172 | if streamWriteBool(streamId, bitAND(dirtyMask, self.overloading.delay.dirtyFlag) ~= 0) then |
173 | streamWriteUIntN(streamId, Utils.clamp(math.floor(self.overloading.delay.current/self.overloading.delay.time*63), 0, 63), 6); |
174 | streamWriteBool(streamId, self.overloading.delay.unloadStartTime > 0); |
175 | end; |
176 | end |
177 | end |
update
DescriptionCalled on updateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
188 | function Overloading:update(dt) |
189 | if self.isClient and self:getIsActive() then |
190 | if InputBinding.hasEvent(InputBinding.TOGGLE_TIPSTATE) and self.overloading.canToggleOverloading then |
191 | if self:getIsActiveForInput(true) and not self:hasInputConflictWithSelection() then |
192 | if self:getIsOverloadingAllowed() then |
193 | self:setOverloadingActive(not self.overloading.isActive); |
194 | end |
195 | end |
196 | end |
197 | end |
198 | end |
updateTick
DescriptionCalled on update tickDefinition
updateTick(float dt)Arguments
float | dt | time since last call in ms |
203 | function Overloading:updateTick(dt) |
204 | -- sound for a more holistic refactoring |
205 | if self.isClient then |
206 | if self.overloading.didOverload or self.isFilling then |
207 | self.sampleFillStopTime = g_currentMission.time + 150; |
208 | end |
209 | |
210 | if self.sampleFillStopTime > g_currentMission.time then |
211 | if self:getIsActiveForSound(true) then |
212 | SoundUtil.playSample(self.sampleFill, 0, 0, nil); |
213 | SoundUtil.stop3DSample(self.sampleFill); |
214 | else |
215 | SoundUtil.stopSample(self.sampleFill); |
216 | SoundUtil.play3DSample(self.sampleFill); |
217 | end |
218 | else |
219 | SoundUtil.stopSample(self.sampleFill); |
220 | SoundUtil.stop3DSample(self.sampleFill); |
221 | end |
222 | end |
223 | |
224 | if self.isServer then |
225 | self:updateOverloadingDelay(dt); |
226 | |
227 | if self.overloading.delay.current ~= self.overloading.delay.sentCurrent or self.overloading.delay.unloadStartTime ~= self.overloading.delay.sentUnloadStartTime then |
228 | self:raiseDirtyFlags(self.overloading.delay.dirtyFlag); |
229 | |
230 | self.overloading.delay.sentCurrent = self.overloading.delay.current; |
231 | self.overloading.delay.sentUnloadStartTime = self.overloading.delay.unloadStartTime; |
232 | end; |
233 | |
234 | if self:getUnitFillLevel(self.overloading.fillUnitIndex) <= 0 and self:getOverloadingDelayIsActive() then |
235 | self:stopOverloadingDelay(); |
236 | end; |
237 | |
238 | self.overloading.didOverload = false; |
239 | if next(self.overloading.trailersInRange) ~= nil or self.shovelTargetFound ~= nil or self:getOverloadingActive() then |
240 | -- first update the target trailer |
241 | self.targetTrailer = self:findValidTrailer(self.overloading.trailersInRange); |
242 | |
243 | -- second, update status |
244 | if self.overloading.isActive then |
245 | if self:getUnitFillLevel(self.overloading.fillUnitIndex) > 0 and not self:getOverloadingDelayIsActive() then |
246 | self:startOverloadingDelay(); |
247 | end; |
248 | |
249 | if not self:getIsOverloadingAllowed() then |
250 | self:setOverloadingActive(false); |
251 | else |
252 | if self.overloading.stopOverloadIfEmpty then |
253 | if self:getUnitFillLevel(self.overloading.fillUnitIndex) == 0 then |
254 | self:setOverloadingActive(false); |
255 | end |
256 | end |
257 | end |
258 | |
259 | -- third, overload if required |
260 | if (self.targetTrailer ~= nil or self.shovelTargetFound ~= nil) and self:getAllowDelayedUnloading() then |
261 | |
262 | local fillType = self:getUnitLastValidFillType(self.overloading.fillUnitIndex); |
263 | local fillLevel = self:getUnitFillLevel(self.overloading.fillUnitIndex); |
264 | if self.lastLostFillLevel ~= nil then |
265 | fillLevel = math.max(fillLevel, self.lastLostFillLevel); |
266 | end |
267 | |
268 | local deltaFill = fillLevel; |
269 | if self:getUnitCapacity(self.overloading.fillUnitIndex) > 0 then |
270 | deltaFill = math.min(fillLevel, self.overloading.capacity*dt/1000.0); |
271 | end |
272 | |
273 | if self.targetTrailer ~= nil then |
274 | self.overloading.didOverload = self:doOverload(self.targetTrailer, fillType, deltaFill); |
275 | elseif self.shovelTargetFound ~= nil then |
276 | local realDelta = self.shovelTargetFound:addPipeFillLevel(self, deltaFill, fillType); |
277 | if realDelta > 0 then |
278 | self:setUnitFillLevel(self.overloading.fillUnitIndex, self:getUnitFillLevel(self.overloading.fillUnitIndex) - realDelta, fillType, false, self.fillVolumeUnloadInfos[self.overloading.unloadInfoIndex]); |
279 | self.overloading.didOverload = true; |
280 | else |
281 | self:setOverloadingActive(false); |
282 | end; |
283 | end; |
284 | end |
285 | else |
286 | if self:getAutomaticOverloadingState() then |
287 | self:setOverloadingActive(true); |
288 | end |
289 | end |
290 | else |
291 | self.targetTrailer = nil; |
292 | end |
293 | |
294 | if self.overloading.didOverload ~= self.sendDidOverload then |
295 | self:raiseDirtyFlags(self.overloadingDirtyFlag); |
296 | self.sendDidOverload = self.overloading.didOverload; |
297 | end |
298 | end |
299 | end |
draw
DescriptionCalled on drawDefinition
draw()Code
303 | function Overloading:draw() |
304 | if self.isClient and self:getIsActiveForInput(true) and not self:hasInputConflictWithSelection() then |
305 | if self.overloading.canToggleOverloading and self:getIsOverloadingAllowed() then |
306 | if self.overloading.isActive then |
307 | g_currentMission:addHelpButtonText(g_i18n:getText("action_stopOverloading"), InputBinding.TOGGLE_TIPSTATE, nil, GS_PRIO_HIGH); |
308 | else |
309 | if self:getUnitFillLevel(self.overloading.fillUnitIndex) > 0 and self.targetTrailer ~= nil then |
310 | g_currentMission:addHelpButtonText(g_i18n:getText("action_startOverloading"), InputBinding.TOGGLE_TIPSTATE, nil, GS_PRIO_HIGH); |
311 | end |
312 | end |
313 | end |
314 | end |
315 | end |
setOverloadingActive
DescriptionSet overloading is active stateDefinition
setOverloadingActive(boolean isActive, boolean noEventSend)Arguments
boolean | isActive | new is active state |
boolean | noEventSend | no event send |
321 | function Overloading:setOverloadingActive(isActive, noEventSend) |
322 | if isActive ~= self.overloading.isActive then |
323 | OverloadingToggleUnloadEvent.sendEvent(self, isActive, noEventSend); |
324 | self.overloading.isActive = isActive; |
325 | |
326 | if not isActive then |
327 | self.pipeUnloadingStartTime = -1; |
328 | end; |
329 | end |
330 | end |
getOverloadingActive
DescriptionReturns if overloading is activeDefinition
getOverloadingActive()Return Values
boolean | isActive | overloading is active |
335 | function Overloading:getOverloadingActive(superFunc) |
336 | if self.overloading.isActive then |
337 | return true; |
338 | end; |
339 | |
340 | if superFunc ~= nil then |
341 | return superFunc(self); |
342 | end |
343 | return false; |
344 | end |
doOverload
DescriptionDo overloadDefinition
doOverload(table tagetTrailer, integer fillType, float deltaFill)Arguments
table | tagetTrailer | trailer to fill |
integer | fillType | fill type to overload |
float | deltaFill | delta to fill |
boolean | didOverload | did overload something |
352 | function Overloading:doOverload(targetTrailer, fillType, deltaFill) |
353 | targetTrailer:resetFillLevelIfNeeded(fillType); |
354 | |
355 | local trailerFillLevel = targetTrailer:getFillLevel(fillType); |
356 | local trailerCapacity = targetTrailer:getCapacity(fillType); |
357 | |
358 | deltaFill = math.min(deltaFill, trailerCapacity - trailerFillLevel); |
359 | |
360 | if deltaFill > 0 then |
361 | targetTrailer:setFillLevel(trailerFillLevel+deltaFill, fillType, false, self.fillVolumeDischargeInfos[self.overloading.dischargeInfoIndex]); |
362 | self:setFillLevel(self:getUnitFillLevel(self.overloading.fillUnitIndex)-deltaFill, fillType, false, self.fillVolumeUnloadInfos[self.overloading.unloadInfoIndex]); |
363 | return true; |
364 | else |
365 | return false; |
366 | end |
367 | end |
getIsFoldAllowed
DescriptionReturns if fold is allowedDefinition
getIsFoldAllowed(boolean onAiTurnOn)Arguments
boolean | onAiTurnOn | called on ai turn on |
boolean | allowsFold | allows folding |
373 | function Overloading:getIsFoldAllowed(superFunc, onAiTurnOn) |
374 | if not self.overloading.allowFoldWhileOverloading and self.overloading.isActive then |
375 | if self:getUnitFillLevel(self.overloading.fillUnitIndex) > 0 then |
376 | return false; |
377 | end |
378 | end |
379 | if self.foldAnimTime ~= nil and (self.foldAnimTime > self.overloading.foldMaxTime or self.foldAnimTime < self.overloading.foldMinTime) then |
380 | return false; |
381 | end |
382 | |
383 | if superFunc ~= nil then |
384 | return superFunc(self, onAiTurnOn); |
385 | end |
386 | return true; |
387 | end |
getPtoRpm
DescriptionReturns rpm of ptoDefinition
getPtoRpm()Return Values
float | rpm | rpm of pto |
392 | function Overloading:getPtoRpm(superFunc) |
393 | local ptoRpm = 0; |
394 | if superFunc ~= nil then |
395 | ptoRpm = superFunc(self); |
396 | end |
397 | if self.overloading.didOverload and self.powerConsumer ~= nil then |
398 | ptoRpm = math.max(ptoRpm, self.powerConsumer.ptoRpm); |
399 | end |
400 | return ptoRpm; |
401 | end |
getDoConsumePtoPower
DescriptionReturns if should consume pto powerDefinition
getDoConsumePtoPower()Return Values
boolean | consume | consumePtoPower |
406 | function Overloading:getDoConsumePtoPower(superFunc) |
407 | local doConsumePower = superFunc(self); |
408 | return self.overloading.didOverload or doConsumePower; |
409 | end |
getIsOverloadingAllowed
DescriptionReturns if overloading is allowedDefinition
getIsOverloadingAllowed()Return Values
boolean | isAllowed | overloading is allowed |
414 | function Overloading:getIsOverloadingAllowed() |
415 | if self.foldAnimTime ~= nil then |
416 | if self.foldAnimTime > self.overloading.foldMaxTime or self.foldAnimTime < self.overloading.foldMinTime then |
417 | return false; |
418 | end |
419 | end |
420 | return true; |
421 | end |
findValidTrailer
DescriptionFind valid trailer in given tableDefinition
findValidTrailer(table trailers)Arguments
table | trailers | trailers to search |
table | trailer | valid trailer |
427 | function Overloading:findValidTrailer(trailers) |
428 | local fillType = self:getUnitLastValidFillType(self.overloading.fillUnitIndex); |
429 | for trailer,value in pairs(trailers) do |
430 | if not entityExists(trailer.components[1].node) then |
431 | value = 0; |
432 | end |
433 | if value > 0 then |
434 | if trailer:allowFillType(fillType) then |
435 | if trailer:getFillLevel(fillType) < trailer:getCapacity(fillType) then |
436 | return trailer; |
437 | end |
438 | end |
439 | end |
440 | end |
441 | end |
getAutomaticOverloadingState
DescriptionReturns if it is in automatic overloading stateDefinition
getAutomaticOverloadingState()Return Values
boolean | isInAutomaticOverloadingState | is in automatic overloading state |
446 | function Overloading:getAutomaticOverloadingState() |
447 | return false |
448 | end |
loadTrailerTriggers
DescriptionLoad trailer triggers from xml fileDefinition
loadTrailerTriggers(table triggers, integer xmlFile)Arguments
table | triggers | triggers table to add trailer triggers |
integer | xmlFile | id of xml object |
454 | function Overloading:loadTrailerTriggers(triggers, xmlFile) |
455 | local i = 0; |
456 | while true do |
457 | local key = string.format("vehicle.overloading.trailerTriggers.trailerTrigger(%d)", i); |
458 | if not hasXMLProperty(self.xmlFile, key) then |
459 | break; |
460 | end |
461 | local node = Utils.indexToObject(self.components, getXMLString(self.xmlFile, key.."#index")); |
462 | if node ~= nil then |
463 | triggers[node] = {node=node}; |
464 | end |
465 | i = i + 1; |
466 | end |
467 | end |
onOverloadingTrailerTrigger
DescriptionTrigger callbackDefinition
onOverloadingTrailerTrigger(integer triggerId, integer otherId, boolean onEnter, boolean onLeave, boolean onStay, integer otherShapeId)Arguments
integer | triggerId | id of trigger |
integer | otherId | id of other actor |
boolean | onEnter | on enter |
boolean | onLeave | on leave |
boolean | onStay | on stay |
integer | otherShapeId | id of other shape |
477 | function Overloading:onOverloadingTrailerTrigger(triggerId, otherId, onEnter, onLeave, onStay, otherShapeId) |
478 | if onEnter or onLeave then |
479 | local trailer = g_currentMission.nodeToVehicle[otherId]; |
480 | if trailer ~= nil and trailer.fillRootNode ~= nil and trailer ~= self then |
481 | if onEnter then |
482 | self.overloading.trailersInRange[trailer] = Utils.getNoNil(self.overloading.trailersInRange[trailer], 0) + 1; |
483 | else |
484 | self.overloading.trailersInRange[trailer] = math.max(Utils.getNoNil(self.overloading.trailersInRange[trailer], 0) - 1, 0); |
485 | if self.overloading.trailersInRange[trailer] == 0 then |
486 | self.overloading.trailersInRange[trailer] = nil |
487 | end |
488 | end |
489 | end |
490 | end |
491 | end |
startOverloadingDelay
DescriptionStart delayDefinition
startOverloadingDelay()Code
495 | function Overloading:startOverloadingDelay() |
496 | self.overloading.delay.unloadStartTime = g_currentMission.time; |
497 | self.overloading.delay.current = 0; |
498 | end |
stopOverloadingDelay
DescriptionStop delayDefinition
stopOverloadingDelay()Code
502 | function Overloading:stopOverloadingDelay() |
503 | self.overloading.delay.unloadStartTime = -1; |
504 | end |
updateOverloadingDelay
DescriptionUpdate delay timeDefinition
updateOverloadingDelay(float dt)Arguments
float | dt | time since last call in ms |
509 | function Overloading:updateOverloadingDelay(dt) |
510 | if self.overloading.delay.unloadStartTime > 0 then |
511 | if self.overloading.delay.current < self.overloading.delay.time then |
512 | self:setOverloadingDelay(math.min(self.overloading.delay.current + dt, self.overloading.delay.time)); |
513 | end; |
514 | else |
515 | if self.overloading.delay.current > 0 then |
516 | self:setOverloadingDelay(math.max(self.overloading.delay.current - dt, 0)); |
517 | end; |
518 | end; |
519 | end |
setOverloadingDelay
DescriptionSet current overloading delay timeDefinition
setOverloadingDelay(float delay)Arguments
float | delay | new delay time |
524 | function Overloading:setOverloadingDelay(delay) |
525 | self.overloading.delay.current = delay; |
526 | end |
getOverloadingDelayIsActive
DescriptionReturns if delay is activeDefinition
getOverloadingDelayIsActive()Return Values
boolean | isActive | delay is active |
531 | function Overloading:getOverloadingDelayIsActive() |
532 | return self.overloading.delay.unloadStartTime > 0; |
533 | end |
getAllowDelayEffects
DescriptionReturns if delay effects should be displayedDefinition
getAllowDelayEffects()Return Values
boolean | allow | allow delay effects (stop if unloading stoped) |
538 | function Overloading:getAllowDelayEffects() |
539 | if self:getUnitCapacity(self.overloading.fillUnitIndex) == 0 then |
540 | return self.overloading.didOverload; |
541 | end; |
542 | |
543 | return self.overloading.delay.current > 0 and self:getOverloadingDelayIsActive(); |
544 | end |
getAllowDelayedEffects
DescriptionReturns if delayed effects should be displayedDefinition
getAllowDelayedEffects()Return Values
boolean | allow | allow delayed effects (start after delay time, stop after delay time) |
549 | function Overloading:getAllowDelayedEffects() |
550 | if self:getUnitCapacity(self.overloading.fillUnitIndex) == 0 then |
551 | return self.overloading.didOverload; |
552 | end; |
553 | |
554 | return (self.overloading.delay.current > 0 and not self:getOverloadingDelayIsActive()) or self:getAllowDelayedUnloading(); |
555 | end |
getAllowDelayedUnloading
DescriptionReturns if delay is over and delayed unloading is allowedDefinition
getAllowDelayedUnloading()Return Values
boolean | isAllowed | is allowed |
560 | function Overloading:getAllowDelayedUnloading() |
561 | return self.overloading.delay.current == self.overloading.delay.time; |
562 | end |