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
PowerConsumer
DescriptionThis is the specialization for all vehicles that consume powerFunctions
- prerequisitesPresent
- preLoad
- load
- loadPowerSetup
- update
- getPtoRpm
- getDoConsumePtoPower
- getPowerMultiplier
- getConsumedPtoTorque
- getTotalConsumedPtoTorque
- getMaxPtoRpm
- getCanBeTurnedOn
- getIsTurnedOnAllowed
- getTurnedOnNotAllowedWarning
- loadSpecValueNeededPower
- getSpecValueNeededPower
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 PowerConsumer.prerequisitesPresent(specializations) |
18 | return SpecializationUtil.hasSpecialization(AttacherJoints, specializations); |
19 | end |
preLoad
DescriptionCalled before loadingDefinition
preLoad(table savegame)Arguments
table | savegame | savegame |
24 | function PowerConsumer:preLoad(savegame) |
25 | assert(self.getPowerMultiplier == nil, "PowerConsumer needs to be the first specialization which implements getPowerMultiplier"); |
26 | |
27 | self.getConsumedPtoTorque = PowerConsumer.getConsumedPtoTorque; |
28 | self.getPtoRpm = PowerConsumer.getPtoRpm; |
29 | self.getDoConsumePtoPower = PowerConsumer.getDoConsumePtoPower; |
30 | self.getPowerMultiplier = PowerConsumer.getPowerMultiplier; |
31 | |
32 | self.getCanBeTurnedOn = Utils.overwrittenFunction(self.getCanBeTurnedOn, PowerConsumer.getCanBeTurnedOn); |
33 | self.getIsTurnedOnAllowed = Utils.overwrittenFunction(self.getIsTurnedOnAllowed, PowerConsumer.getIsTurnedOnAllowed); |
34 | self.getTurnedOnNotAllowedWarning = Utils.overwrittenFunction(self.getTurnedOnNotAllowedWarning, PowerConsumer.getTurnedOnNotAllowedWarning); |
35 | end |
load
DescriptionCalled on loadingDefinition
load(table savegame)Arguments
table | savegame | savegame |
40 | function PowerConsumer:load(savegame) |
41 | self.powerConsumer = {}; |
42 | self.powerConsumer.forceNode = Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.powerConsumer#forceNode")); |
43 | self.powerConsumer.forceDirNode = Utils.getNoNil(Utils.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.powerConsumer#forceDirNode")), self.powerConsumer.forceNode); |
44 | self.powerConsumer.forceFactor = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.powerConsumer#forceFactor"), 1.0); |
45 | |
46 | self.powerConsumer.turnOnNotAllowedWarning = string.format(g_i18n:getText(Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.powerConsumer#turnOnNotAllowedWarning"), "warning_insufficientPowerOutput")), self.typeDesc); |
47 | self.powerConsumer.turnOnMotorNotStartedWarning = string.format(g_i18n:getText(Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.powerConsumer#turnOnMotorNotStartedWarning"), "warning_motorNotStarted")), self.typeDesc); |
48 | |
49 | self.powerConsumer.totalMass = self:getTotalMass(false); |
50 | |
51 | PowerConsumer.loadPowerSetup(self, self.xmlFile); |
52 | |
53 | addConsoleCommand("gsSetPowerConsumer", "Sets properties of the powerConsumer specialization", "consoleSetPowerConsumer", nil); |
54 | end |
loadPowerSetup
DescriptionCalled on loadingDefinition
loadPowerSetup(table savegame)Arguments
table | savegame | savegame |
59 | function PowerConsumer:loadPowerSetup(xmlFile) |
60 | self.powerConsumer.maxForce = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#maxForce"), 0); -- kN |
61 | self.powerConsumer.forceDir = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#forceDir"), 1); |
62 | self.powerConsumer.neededPtoPower = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#neededPtoPower"), 0); -- in kW at ptoRpm |
63 | self.powerConsumer.ptoRpm = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#ptoRpm"), 0); |
64 | end |
update
DescriptionCalled on updateDefinition
update(float dt)Arguments
float | dt | time since last call in ms |
84 | function PowerConsumer:update(dt) |
85 | if self:getIsActive() and self.isServer then |
86 | if self.powerConsumer.forceNode ~= nil and self.movingDirection == self.powerConsumer.forceDir then |
87 | local multiplier = self:getPowerMultiplier(); |
88 | if multiplier ~= 0 then |
89 | |
90 | local frictionForce = self.powerConsumer.forceFactor * self.lastSpeedReal * 1000 * self.powerConsumer.totalMass / (dt/1000); |
91 | |
92 | local force = -math.min(frictionForce, self.powerConsumer.maxForce)*self.movingDirection * multiplier; |
93 | local dx,dy,dz = localDirectionToWorld(self.powerConsumer.forceDirNode, 0, 0, force); |
94 | local px,py,pz = getCenterOfMass(self.powerConsumer.forceNode); |
95 | |
96 | addForce(self.powerConsumer.forceNode, dx,dy,dz, px,py,pz, true); |
97 | |
98 | if Vehicle.debugRendering and self:getIsActiveForInput() then |
99 | local str = string.format("frictionForce=%.2f maxForce=%.2f -> force=%.2f", frictionForce, self.powerConsumer.maxForce, force); |
100 | renderText(0.7, 0.85, getCorrectTextSize(0.02), str); |
101 | end |
102 | end |
103 | end |
104 | end |
105 | end |
getPtoRpm
DescriptionReturns rpm of ptoDefinition
getPtoRpm()Return Values
float | rpm | rpm of pto |
113 | function PowerConsumer:getPtoRpm() |
114 | if self.getIsTurnedOn ~= nil and self:getIsTurnedOn() then |
115 | return self.powerConsumer.ptoRpm; |
116 | end |
117 | return 0; |
118 | end |
getDoConsumePtoPower
DescriptionReturns if should consume pto powerDefinition
getDoConsumePtoPower()Return Values
boolean | consume | consumePtoPower |
123 | function PowerConsumer:getDoConsumePtoPower() |
124 | return self.getIsTurnedOn ~= nil and self:getIsTurnedOn(); |
125 | end |
getPowerMultiplier
DescriptionReturns power multiplierDefinition
getPowerMultiplier()Return Values
float | powerMultiplier | current power multiplier |
130 | function PowerConsumer:getPowerMultiplier() |
131 | return 1; |
132 | end |
getConsumedPtoTorque
DescriptionReturns consumed pto torqueDefinition
getConsumedPtoTorque()Return Values
float | torque | consumed pto torque in kNm |
138 | function PowerConsumer:getConsumedPtoTorque() |
139 | if self:getDoConsumePtoPower() then |
140 | local rpm = self.powerConsumer.ptoRpm; |
141 | if rpm > 0.001 then |
142 | return self.powerConsumer.neededPtoPower / (rpm*math.pi/30); |
143 | end |
144 | end |
145 | return 0; |
146 | end |
getTotalConsumedPtoTorque
DescriptionGet total amount of consumed pto torque (from every attached vehicle)Definition
getTotalConsumedPtoTorque(table excludeVehicle)Arguments
table | excludeVehicle | exluded vehicle |
float | total | amount of consumed pto torque in kNm |
152 | function PowerConsumer.getTotalConsumedPtoTorque(self, excludeVehicle) |
153 | local torque = 0; |
154 | if self.getConsumedPtoTorque ~= nil and self.getPtoRpm ~= nil and self ~= excludeVehicle then |
155 | torque = self:getConsumedPtoTorque(); |
156 | end |
157 | |
158 | -- get implements torque recursively |
159 | for _, implement in pairs(self.attachedImplements) do |
160 | torque = torque + PowerConsumer.getTotalConsumedPtoTorque(implement.object, excludeVehicle); |
161 | end |
162 | return torque; |
163 | end |
getMaxPtoRpm
DescriptionReturns max pto rpmDefinition
getMaxPtoRpm()Return Values
float | maxPtoRpm | max pto rpm |
168 | function PowerConsumer.getMaxPtoRpm(self) |
169 | local rpm = 0; |
170 | if self.getPtoRpm ~= nil then |
171 | rpm = self:getPtoRpm(); |
172 | end |
173 | |
174 | -- get pto rpm recursively |
175 | for _, implement in pairs(self.attachedImplements) do |
176 | rpm = math.max(rpm, PowerConsumer.getMaxPtoRpm(implement.object)); |
177 | end |
178 | return rpm; |
179 | end |
getCanBeTurnedOn
DescriptionReturns if can be turned onDefinition
getCanBeTurnedOn()Return Values
boolean | canBeTurnedOn | vehicle can be turned on |
184 | function PowerConsumer:getCanBeTurnedOn(superFunc) |
185 | if self.powerConsumer.neededPtoPower > 0 and self.powerConsumer.ptoRpm > 0 then |
186 | if self.attacherVehicle ~= nil then |
187 | local implement = self.attacherVehicle:getImplementByObject(self); |
188 | if implement ~= nil then |
189 | if implement.jointDescIndex ~= nil then |
190 | if self.attacherVehicle.attacherJoints[implement.jointDescIndex] ~= nil then |
191 | if not self.attacherVehicle.attacherJoints[implement.jointDescIndex].canTurnOnImplement then |
192 | return false; |
193 | end; |
194 | end; |
195 | end; |
196 | end; |
197 | end; |
198 | end; |
199 | |
200 | if superFunc ~= nil then |
201 | return superFunc(self); |
202 | end; |
203 | return true; |
204 | end; |
getIsTurnedOnAllowed
DescriptionReturns if turn on is allowedDefinition
getIsTurnedOnAllowed(boolean isTurnedOn)Arguments
boolean | isTurnedOn | is turned on |
boolean | allow | allow turn on |
210 | function PowerConsumer:getIsTurnedOnAllowed(superFunc, isTurnedOn) |
211 | if isTurnedOn then |
212 | local rootVehicle = self:getRootAttacherVehicle(); |
213 | if rootVehicle ~= nil and rootVehicle.motor ~= nil then |
214 | if not rootVehicle.isMotorStarted then |
215 | return false, true |
216 | end |
217 | |
218 | local torqueRequested = 0; |
219 | local rpm = self.powerConsumer.ptoRpm; |
220 | if rpm > 0.001 then |
221 | torqueRequested = self.powerConsumer.neededPtoPower / (rpm*math.pi/30); |
222 | end |
223 | |
224 | torqueRequested = torqueRequested + PowerConsumer.getTotalConsumedPtoTorque(rootVehicle, self); |
225 | torqueRequested = torqueRequested / rootVehicle.motor:getPtoMotorRpmRatio(); |
226 | |
227 | -- 90% of motor torque should be more then requested torque, because we need some torque to accelerate the vehicle |
228 | if torqueRequested > 0 and torqueRequested > 0.9*rootVehicle.motor:getMaxTorque() then |
229 | return false, false |
230 | end; |
231 | end; |
232 | end; |
233 | |
234 | if superFunc ~= nil then |
235 | return superFunc(self, isTurnedOn) |
236 | end |
237 | return true, false |
238 | end; |
getTurnedOnNotAllowedWarning
DescriptionReturns turn on not allowed warning textDefinition
getTurnedOnNotAllowedWarning()Return Values
string | warningText | turn on not allowed warning text |
243 | function PowerConsumer:getTurnedOnNotAllowedWarning(superFunc) |
244 | local isAllowed, motorOff = PowerConsumer.getIsTurnedOnAllowed(self, nil, true) |
245 | if motorOff then |
246 | return self.powerConsumer.turnOnMotorNotStartedWarning; |
247 | elseif not isAllowed then |
248 | return self.powerConsumer.turnOnNotAllowedWarning; |
249 | else |
250 | return superFunc(self); |
251 | end; |
252 | end; |
loadSpecValueNeededPower
DescriptionLoads needed power spec valueDefinition
loadSpecValueNeededPower(integer xmlFile, string customEnvironment)Arguments
integer | xmlFile | id of xml object |
string | customEnvironment | custom environment |
float | neededPower | needed power |
287 | function PowerConsumer.loadSpecValueNeededPower(xmlFile, customEnvironment) |
288 | return getXMLString(xmlFile, "vehicle.storeData.specs.neededPower") |
289 | end |
getSpecValueNeededPower
DescriptionReturns needed power spec valueDefinition
getSpecValueNeededPower(table storeItem, table realItem)Arguments
table | storeItem | store item |
table | realItem | real item |
string | l10n | l10n text |
float | neededPower | needed power in kw |
float | neededPower | needed power in hp |
298 | function PowerConsumer.getSpecValueNeededPower(storeItem, realItem) |
299 | if storeItem.specs.neededPower ~= nil then |
300 | local hp, kw = g_i18n:getPower(storeItem.specs.neededPower); |
301 | return string.format(g_i18n:getText("shop_neededPowerValue"), Utils.round(kw), Utils.round(hp)) |
302 | end |
303 | return nil |
304 | end |