LUADOC - Farming Simulator 19

Script v1.7.1.0

Engine v1.7.1.0

Foundation Reference

PowerConsumer

Description
Specialization for vehicles consuming power (via pto or pulling force)
Functions

getCanBeTurnedOn

Description
Returns if turn on is allowed
Definition
getCanBeTurnedOn()
Return Values
booleanallowallow turn on
Code
176function 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
196end

getConsumedPtoTorque

Description
Returns consumed pto torque
Definition
getConsumedPtoTorque()
Return Values
floattorqueconsumed pto torque in kNm
Code
146function 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
165end

getConsumingLoad

Description
Definition
getConsumingLoad()
Code
169function PowerConsumer:getConsumingLoad()
170 return 0, 0
171end

getDoConsumePtoPower

Description
Returns if should consume pto power
Definition
getDoConsumePtoPower()
Return Values
booleanconsumeconsumePtoPower
Code
131function PowerConsumer:getDoConsumePtoPower()
132 return self.getIsTurnedOn ~= nil and self:getIsTurnedOn()
133end

getMaxPtoRpm

Description
Returns max pto rpm
Definition
getMaxPtoRpm()
Return Values
floatmaxPtoRpmmax pto rpm
Code
236function 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
251end

getPowerMultiplier

Description
Returns power multiplier
Definition
getPowerMultiplier()
Return Values
floatpowerMultipliercurrent power multiplier
Code
138function PowerConsumer:getPowerMultiplier()
139 return 1
140end

getPtoRpm

Description
Returns rpm of pto
Definition
getPtoRpm()
Return Values
floatrpmrpm of pto
Code
120function PowerConsumer:getPtoRpm()
121 if self:getDoConsumePtoPower() then
122 return self.spec_powerConsumer.ptoRpm
123 end
124
125 return 0
126end

getSpecValueNeededPower

Description
Returns needed power spec value
Definition
getSpecValueNeededPower(table storeItem, table realItem)
Arguments
tablestoreItemstore item
tablerealItemreal item
Return Values
stringl10nl10n text
floatneededPowerneeded power in kw
floatneededPowerneeded power in hp
Code
306function 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
312end

getTotalConsumedPtoTorque

Description
Get total amount of consumed pto torque (from every attached vehicle)
Definition
getTotalConsumedPtoTorque(table excludeVehicle)
Arguments
tableexcludeVehicleexluded vehicle
Return Values
floattotalamount of consumed pto torque in kNm
Code
215function 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
231end

getTurnedOnNotAllowedWarning

Description
Returns turn on not allowed warning text
Definition
getTurnedOnNotAllowedWarning()
Return Values
stringwarningTextturn on not allowed warning text
Code
201function 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
209end

initSpecialization

Description
Definition
initSpecialization()
Code
15function PowerConsumer.initSpecialization()
16 g_storeManager:addSpecType("neededPower", "shopListAttributeIconPowerReq", PowerConsumer.loadSpecValueNeededPower, PowerConsumer.getSpecValueNeededPower)
17end

loadPowerSetup

Description
Called on loading
Definition
loadPowerSetup(table savegame)
Arguments
tablesavegamesavegame
Code
103function 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)
115end

loadSpecValueNeededPower

Description
Loads needed power spec value
Definition
loadSpecValueNeededPower(integer xmlFile, string customEnvironment)
Arguments
integerxmlFileid of xml object
stringcustomEnvironmentcustom environment
Return Values
floatneededPowerneeded power
Code
295function PowerConsumer.loadSpecValueNeededPower(xmlFile, customEnvironment)
296 return getXMLString(xmlFile, "vehicle.storeData.specs.neededPower")
297end

onLoad

Description
Called on loading
Definition
onLoad(table savegame)
Arguments
tablesavegamesavegame
Code
56function 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)
69end

onUpdate

Description
Called on update
Definition
onUpdate(float dt, boolean isActiveForInput, boolean isSelected)
Arguments
floatdttime since last call in ms
booleanisActiveForInputtrue if vehicle is active for input
booleanisSelectedtrue if vehicle is selected
Code
76function 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
98end

prerequisitesPresent

Description
Checks if all prerequisite specializations are loaded
Definition
prerequisitesPresent(table specializations)
Arguments
tablespecializationsspecializations
Return Values
booleanhasPrerequisitetrue if all prerequisite specializations are loaded
Code
24function PowerConsumer.prerequisitesPresent(specializations)
25 return true
26end

registerEventListeners

Description
Definition
registerEventListeners()
Code
48function PowerConsumer.registerEventListeners(vehicleType)
49 SpecializationUtil.registerEventListener(vehicleType, "onLoad", PowerConsumer)
50 SpecializationUtil.registerEventListener(vehicleType, "onUpdate", PowerConsumer)
51end

registerFunctions

Description
Definition
registerFunctions()
Code
30function 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)
37end

registerOverwrittenFunctions

Description
Definition
registerOverwrittenFunctions()
Code
41function PowerConsumer.registerOverwrittenFunctions(vehicleType)
42 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getCanBeTurnedOn", PowerConsumer.getCanBeTurnedOn)
43 SpecializationUtil.registerOverwrittenFunction(vehicleType, "getTurnedOnNotAllowedWarning", PowerConsumer.getTurnedOnNotAllowedWarning)
44end