LUADOC - Farming Simulator 17

Printable Version

Script v1.4.4.0

Engine v7.0.0.2

Foundation Reference

PowerConsumer

Description
This is the specialization for all vehicles that consume power
Functions

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
17function PowerConsumer.prerequisitesPresent(specializations)
18 return SpecializationUtil.hasSpecialization(AttacherJoints, specializations);
19end

preLoad

Description
Called before loading
Definition
preLoad(table savegame)
Arguments
tablesavegamesavegame
Code
24function 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);
35end

load

Description
Called on loading
Definition
load(table savegame)
Arguments
tablesavegamesavegame
Code
40function 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);
54end

loadPowerSetup

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

update

Description
Called on update
Definition
update(float dt)
Arguments
floatdttime since last call in ms
Code
84function 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
105end

getPtoRpm

Description
Returns rpm of pto
Definition
getPtoRpm()
Return Values
floatrpmrpm of pto
Code
113function PowerConsumer:getPtoRpm()
114 if self.getIsTurnedOn ~= nil and self:getIsTurnedOn() then
115 return self.powerConsumer.ptoRpm;
116 end
117 return 0;
118end

getDoConsumePtoPower

Description
Returns if should consume pto power
Definition
getDoConsumePtoPower()
Return Values
booleanconsumeconsumePtoPower
Code
123function PowerConsumer:getDoConsumePtoPower()
124 return self.getIsTurnedOn ~= nil and self:getIsTurnedOn();
125end

getPowerMultiplier

Description
Returns power multiplier
Definition
getPowerMultiplier()
Return Values
floatpowerMultipliercurrent power multiplier
Code
130function PowerConsumer:getPowerMultiplier()
131 return 1;
132end

getConsumedPtoTorque

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

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
152function 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;
163end

getMaxPtoRpm

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

getCanBeTurnedOn

Description
Returns if can be turned on
Definition
getCanBeTurnedOn()
Return Values
booleancanBeTurnedOnvehicle can be turned on
Code
184function 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;
204end;

getIsTurnedOnAllowed

Description
Returns if turn on is allowed
Definition
getIsTurnedOnAllowed(boolean isTurnedOn)
Arguments
booleanisTurnedOnis turned on
Return Values
booleanallowallow turn on
Code
210function 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
238end;

getTurnedOnNotAllowedWarning

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

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
287function PowerConsumer.loadSpecValueNeededPower(xmlFile, customEnvironment)
288 return getXMLString(xmlFile, "vehicle.storeData.specs.neededPower")
289end

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
298function 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
304end