Script v1.7.1.0
- AI
- Animals
- Contracts
- Debug
- Economy
- Effects
- Events
- Farms
- GUI
- Handtools
- I3d
- Materials
- Misc
- Objects
- Placeables
- Player
- Shop
- Sounds
- Specializations
- AIConveyorBelt
- AIImplement
- AIVehicle
- AnimatedVehicle
- ArticulatedAxis
- Attachable
- AttacherJointControl
- AttacherJoints
- BaleGrab
- BaleLoader
- Baler
- BaleWrapper
- BaseMaterial
- BunkerSiloCompacter
- BunkerSiloInteractor
- BuyableBale
- CCTDrivable
- Combine
- ConnectionHoses
- ConveyorBelt
- Cover
- CrabSteering
- Crawlers
- Cultivator
- Cutter
- Cylindered
- CylinderedFoldable
- Dashboard
- Dischargeable
- Drivable
- DynamicallyLoadedParts
- DynamicMountAttacher
- Enterable
- FertilizingCultivator
- FertilizingSowingMachine
- FillTriggerVehicle
- FillUnit
- FillVolume
- Foldable
- FoliageBending
- ForageWagon
- FrontloaderAttacher
- FruitPreparer
- GroundAdjustedNodes
- GroundReference
- Honk
- HookLiftContainer
- HookLiftTrailer
- IKChains
- JigglingParts
- Leveler
- Lights
- LivestockTrailer
- Locomotive
- LogGrab
- ManureBarrel
- MixerWagon
- Motorized
- Mountable
- Mower
- Pickup
- Pipe
- Plow
- PowerConsumer
- PowerTakeOffs
- RandomlyMovingParts
- ReceivingHopper
- ReverseDriving
- Rideable
- RidgeMarker
- Roller
- Ropes
- SemiTrailerFront
- Shovel
- SlopeCompensation
- SmartAttach
- SowingMachine
- SpeedRotatingParts
- SplineVehicle
- Sprayer
- StrawBlower
- StumpCutter
- Suspensions
- Tedder
- TensionBeltObject
- TensionBelts
- TipOccluder
- Trailer
- TreePlanter
- TreeSaw
- TurnOnVehicle
- Washable
- WaterTrailer
- Wearable
- Weeder
- Wheels
- Windrower
- Wipers
- WoodCrusher
- WoodHarvester
- WorkArea
- WorkMode
- WorkParticles
- Triggers
- Utils
- Vehicles
- Weather
Engine v1.7.1.0
- AI
- Animation
- Camera
- Entity
- Fillplanes
- General
- I3D
- Input
- Lighting
- Math
- Network
- Node
- Overlays
- Particle System
- Physics
- Rendering
- Scenegraph
- Shape
- Sound
- Spline
- String
- Terrain Detail
- Text Rendering
- Tire Track
- XML
- general
Foundation Reference
PowerConsumer
DescriptionSpecialization for vehicles consuming power (via pto or pulling force)Functions
- getCanBeTurnedOn
- getConsumedPtoTorque
- getConsumingLoad
- getDoConsumePtoPower
- getMaxPtoRpm
- getPowerMultiplier
- getPtoRpm
- getSpecValueNeededPower
- getTotalConsumedPtoTorque
- getTurnedOnNotAllowedWarning
- initSpecialization
- loadPowerSetup
- loadSpecValueNeededPower
- onLoad
- onUpdate
- prerequisitesPresent
- registerEventListeners
- registerFunctions
- registerOverwrittenFunctions
getCanBeTurnedOn
DescriptionReturns if turn on is allowedDefinition
getCanBeTurnedOn()Return Values
boolean | allow | allow turn on |
176 | function PowerConsumer:getCanBeTurnedOn(superFunc) |
177 | local rootVehicle = self:getRootVehicle() |
178 | if rootVehicle ~= nil and rootVehicle.getMotor ~= nil then |
179 | local rootMotor = rootVehicle:getMotor() |
180 | |
181 | local torqueRequested = self:getConsumedPtoTorque(true) |
182 | torqueRequested = torqueRequested + PowerConsumer.getTotalConsumedPtoTorque(rootVehicle, self) |
183 | torqueRequested = torqueRequested / rootMotor:getPtoMotorRpmRatio() |
184 | |
185 | -- 90% of motor torque should be more than requested torque, because we need some torque to accelerate the vehicle |
186 | if torqueRequested > 0 and torqueRequested > 0.9*rootMotor:getPeakTorque() then |
187 | return false, true |
188 | end |
189 | end |
190 | |
191 | if superFunc ~= nil then |
192 | return superFunc(self) |
193 | else |
194 | return true, false |
195 | end |
196 | end |
getConsumedPtoTorque
DescriptionReturns consumed pto torqueDefinition
getConsumedPtoTorque()Return Values
float | torque | consumed pto torque in kNm |
146 | function PowerConsumer:getConsumedPtoTorque(expected) |
147 | if self:getDoConsumePtoPower() or (expected ~= nil and expected) then |
148 | local spec = self.spec_powerConsumer |
149 | |
150 | local rpm = spec.ptoRpm |
151 | if rpm > 0.001 then |
152 | local consumingLoad, count = self:getConsumingLoad() |
153 | if count > 0 then |
154 | consumingLoad = consumingLoad / count |
155 | else |
156 | consumingLoad = 1 |
157 | end |
158 | |
159 | local neededPtoPower = spec.neededMinPtoPower + (consumingLoad * (spec.neededMaxPtoPower - spec.neededMinPtoPower)) |
160 | return neededPtoPower / (rpm*math.pi/30) |
161 | end |
162 | end |
163 | |
164 | return 0 |
165 | end |
getConsumingLoad
DescriptionDefinitiongetConsumingLoad()Code
169 | function PowerConsumer:getConsumingLoad() |
170 | return 0, 0 |
171 | end |
getDoConsumePtoPower
DescriptionReturns if should consume pto powerDefinition
getDoConsumePtoPower()Return Values
boolean | consume | consumePtoPower |
131 | function PowerConsumer:getDoConsumePtoPower() |
132 | return self.getIsTurnedOn ~= nil and self:getIsTurnedOn() |
133 | end |
getMaxPtoRpm
DescriptionReturns max pto rpmDefinition
getMaxPtoRpm()Return Values
float | maxPtoRpm | max pto rpm |
236 | function PowerConsumer.getMaxPtoRpm(self) |
237 | local rpm = 0 |
238 | |
239 | if self.getPtoRpm ~= nil then |
240 | rpm = self:getPtoRpm() |
241 | end |
242 | |
243 | if self.getAttachedImplements ~= nil then |
244 | local attachedImplements = self:getAttachedImplements() |
245 | for _, implement in pairs(attachedImplements) do |
246 | rpm = math.max(rpm, PowerConsumer.getMaxPtoRpm(implement.object)) |
247 | end |
248 | end |
249 | |
250 | return rpm |
251 | end |
getPowerMultiplier
DescriptionReturns power multiplierDefinition
getPowerMultiplier()Return Values
float | powerMultiplier | current power multiplier |
138 | function PowerConsumer:getPowerMultiplier() |
139 | return 1 |
140 | end |
getPtoRpm
DescriptionReturns rpm of ptoDefinition
getPtoRpm()Return Values
float | rpm | rpm of pto |
120 | function PowerConsumer:getPtoRpm() |
121 | if self:getDoConsumePtoPower() then |
122 | return self.spec_powerConsumer.ptoRpm |
123 | end |
124 | |
125 | return 0 |
126 | 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 |
306 | function PowerConsumer.getSpecValueNeededPower(storeItem, realItem) |
307 | if storeItem.specs.neededPower ~= nil then |
308 | local hp, kw = g_i18n:getPower(storeItem.specs.neededPower) |
309 | return string.format(g_i18n:getText("shop_neededPowerValue"), MathUtil.round(kw), MathUtil.round(hp)) |
310 | end |
311 | return nil |
312 | 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 |
215 | function PowerConsumer.getTotalConsumedPtoTorque(self, excludeVehicle) |
216 | local torque = 0 |
217 | if self ~= excludeVehicle then |
218 | if self.getConsumedPtoTorque ~= nil then |
219 | torque = self:getConsumedPtoTorque() |
220 | end |
221 | end |
222 | |
223 | if self.getAttachedImplements ~= nil then |
224 | local attachedImplements = self:getAttachedImplements() |
225 | for _, implement in pairs(attachedImplements) do |
226 | torque = torque + PowerConsumer.getTotalConsumedPtoTorque(implement.object, excludeVehicle) |
227 | end |
228 | end |
229 | |
230 | return torque |
231 | end |
getTurnedOnNotAllowedWarning
DescriptionReturns turn on not allowed warning textDefinition
getTurnedOnNotAllowedWarning()Return Values
string | warningText | turn on not allowed warning text |
201 | function PowerConsumer:getTurnedOnNotAllowedWarning(superFunc) |
202 | local spec = self.spec_powerConsumer |
203 | local _, notEnoughPower = PowerConsumer.getCanBeTurnedOn(self) |
204 | if notEnoughPower then |
205 | return spec.turnOnNotAllowedWarning |
206 | else |
207 | return superFunc(self) |
208 | end |
209 | end |
initSpecialization
DescriptionDefinitioninitSpecialization()Code
15 | function PowerConsumer.initSpecialization() |
16 | g_storeManager:addSpecType("neededPower", "shopListAttributeIconPowerReq", PowerConsumer.loadSpecValueNeededPower, PowerConsumer.getSpecValueNeededPower) |
17 | end |
loadPowerSetup
DescriptionCalled on loadingDefinition
loadPowerSetup(table savegame)Arguments
table | savegame | savegame |
103 | function PowerConsumer:loadPowerSetup(xmlFile) |
104 | local spec = self.spec_powerConsumer |
105 | |
106 | XMLUtil.checkDeprecatedXMLElements(xmlFile, self.configFileName, "vehicle.powerConsumer#neededPtoPower", "vehicle.powerConsumer#neededMinPtoPower and vehicle.powerConsumer#neededMaxPtoPower") |
107 | |
108 | spec.neededMaxPtoPower = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#neededMaxPtoPower"), 0) |
109 | spec.neededMinPtoPower = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#neededMinPtoPower"), spec.neededMaxPtoPower) -- in kW at ptoRpm |
110 | if spec.neededMaxPtoPower < spec.neededMinPtoPower then |
111 | g_logManager:xmlWarning(self.configFileName, "'vehicle.powerConsumer#neededMaxPtoPower' is smaller than 'vehicle.powerConsumer#neededMinPtoPower'") |
112 | end |
113 | |
114 | spec.ptoRpm = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#ptoRpm"), 0) |
115 | 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 |
295 | function PowerConsumer.loadSpecValueNeededPower(xmlFile, customEnvironment) |
296 | return getXMLString(xmlFile, "vehicle.storeData.specs.neededPower") |
297 | end |
onLoad
DescriptionCalled on loadingDefinition
onLoad(table savegame)Arguments
table | savegame | savegame |
56 | function PowerConsumer:onLoad(savegame) |
57 | local spec = self.spec_powerConsumer |
58 | |
59 | spec.forceNode = I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.powerConsumer#forceNode"), self.i3dMappings) |
60 | spec.forceDirNode = Utils.getNoNil(I3DUtil.indexToObject(self.components, getXMLString(self.xmlFile, "vehicle.powerConsumer#forceDirNode"), self.i3dMappings), spec.forceNode) |
61 | spec.forceFactor = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.powerConsumer#forceFactor"), 1.0) |
62 | |
63 | spec.maxForce = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.powerConsumer#maxForce"), 0) -- kN |
64 | spec.forceDir = Utils.getNoNil(getXMLFloat(self.xmlFile, "vehicle.powerConsumer#forceDir"), 1) |
65 | |
66 | spec.turnOnNotAllowedWarning = string.format(g_i18n:getText(Utils.getNoNil(getXMLString(self.xmlFile, "vehicle.powerConsumer#turnOnNotAllowedWarning"), "warning_insufficientPowerOutput"), self.customEnvironment), self.typeDesc) |
67 | |
68 | self:loadPowerSetup(self.xmlFile) |
69 | end |
onUpdate
DescriptionCalled on updateDefinition
onUpdate(float dt, boolean isActiveForInput, boolean isSelected)Arguments
float | dt | time since last call in ms |
boolean | isActiveForInput | true if vehicle is active for input |
boolean | isSelected | true if vehicle is selected |
76 | function PowerConsumer:onUpdate(dt, isActiveForInput, isActiveForInputIgnoreSelection, isSelected) |
77 | if self.isServer and self.isActive then |
78 | local spec = self.spec_powerConsumer |
79 | |
80 | if spec.forceNode ~= nil and self.movingDirection == spec.forceDir then |
81 | local multiplier = self:getPowerMultiplier() |
82 | if multiplier ~= 0 then |
83 | local frictionForce = spec.forceFactor * self.lastSpeedReal * 1000 * self:getTotalMass(false) / (dt/1000) |
84 | |
85 | local force = -math.min(frictionForce, spec.maxForce) * self.movingDirection * multiplier |
86 | local dx,dy,dz = localDirectionToWorld(spec.forceDirNode, 0, 0, force) |
87 | local px,py,pz = getCenterOfMass(spec.forceNode) |
88 | |
89 | addForce(spec.forceNode, dx,dy,dz, px,py,pz, true) |
90 | |
91 | if VehicleDebug.state == VehicleDebug.DEBUG_PHYSICS and self:getIsActiveForInput() then |
92 | local str = string.format("frictionForce=%.2f maxForce=%.2f -> force=%.2f", frictionForce, spec.maxForce, force) |
93 | renderText(0.7, 0.85, getCorrectTextSize(0.02), str) |
94 | end |
95 | end |
96 | end |
97 | end |
98 | end |
prerequisitesPresent
DescriptionChecks if all prerequisite specializations are loadedDefinition
prerequisitesPresent(table specializations)Arguments
table | specializations | specializations |
boolean | hasPrerequisite | true if all prerequisite specializations are loaded |
24 | function PowerConsumer.prerequisitesPresent(specializations) |
25 | return true |
26 | end |
registerEventListeners
DescriptionDefinitionregisterEventListeners()Code
48 | function PowerConsumer.registerEventListeners(vehicleType) |
49 | SpecializationUtil.registerEventListener(vehicleType, "onLoad", PowerConsumer) |
50 | SpecializationUtil.registerEventListener(vehicleType, "onUpdate", PowerConsumer) |
51 | end |
registerFunctions
DescriptionDefinitionregisterFunctions()Code
30 | function PowerConsumer.registerFunctions(vehicleType) |
31 | SpecializationUtil.registerFunction(vehicleType, "loadPowerSetup", PowerConsumer.loadPowerSetup) |
32 | SpecializationUtil.registerFunction(vehicleType, "getPtoRpm", PowerConsumer.getPtoRpm) |
33 | SpecializationUtil.registerFunction(vehicleType, "getDoConsumePtoPower", PowerConsumer.getDoConsumePtoPower) |
34 | SpecializationUtil.registerFunction(vehicleType, "getPowerMultiplier", PowerConsumer.getPowerMultiplier) |
35 | SpecializationUtil.registerFunction(vehicleType, "getConsumedPtoTorque", PowerConsumer.getConsumedPtoTorque) |
36 | SpecializationUtil.registerFunction(vehicleType, "getConsumingLoad", PowerConsumer.getConsumingLoad) |
37 | end |
registerOverwrittenFunctions
DescriptionDefinitionregisterOverwrittenFunctions()Code
41 | function PowerConsumer.registerOverwrittenFunctions(vehicleType) |
42 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeTurnedOn", PowerConsumer.getCanBeTurnedOn) |
43 | SpecializationUtil.registerOverwrittenFunction(vehicleType, "getTurnedOnNotAllowedWarning", PowerConsumer.getTurnedOnNotAllowedWarning) |
44 | end |