Sprache Deutsch Language English

Script Dokumentation LS 2015 - PowerConsumer (Patch 1.3)

Script Dokumentation Übersicht

scripts/vehicles/specializations/PowerConsumer.lua

Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
1--
2-- PowerConsumer
3-- This is the specialization for all vehicles that consume power
4--
5-- @author Manuel Leithner
6-- @date 15/07/14
7--
8-- Copyright (C) GIANTS Software GmbH, Confidential, All Rights Reserved.
9
10PowerConsumer = {};
11
12function PowerConsumer.prerequisitesPresent(specializations)
13 return true;
14end
15
16function PowerConsumer:preLoad(xmlFile)
17 self.getConsumedPtoTorque = PowerConsumer.getConsumedPtoTorque;
18 self.getPtoRpm = PowerConsumer.getPtoRpm;
19 self.getDoConsumePtoPower = PowerConsumer.getDoConsumePtoPower;
20 self.getPowerMultiplier = PowerConsumer.getPowerMultiplier;
21end
22
23function PowerConsumer:load(xmlFile)
24
25 self.getCanBeTurnedOn = Utils.overwrittenFunction(self.getCanBeTurnedOn, PowerConsumer.getCanBeTurnedOn);
26 self.getIsTurnedOnAllowed = Utils.overwrittenFunction(self.getIsTurnedOnAllowed, PowerConsumer.getIsTurnedOnAllowed);
27 self.getTurnedOnNotAllowedWarning = Utils.overwrittenFunction(self.getTurnedOnNotAllowedWarning, PowerConsumer.getTurnedOnNotAllowedWarning);
28
29 self.powerConsumer = {};
30 self.powerConsumer.forceNode = Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.powerConsumer#forceNode"));
31 self.powerConsumer.forceDirNode = Utils.getNoNil(Utils.indexToObject(self.components, getXMLString(xmlFile, "vehicle.powerConsumer#forceDirNode")), self.powerConsumer.forceNode);
32
33 self.powerConsumer.turnOnNotAllowedWarning = string.format(g_i18n:getText(Utils.getNoNil(getXMLString(xmlFile, "vehicle.powerConsumer#turnOnNotAllowedWarning"), "InvalidPowerOutputWarning")), self.typeDesc);
34
35 PowerConsumer.loadPowerSetup(self, xmlFile);
36
37 addConsoleCommand("gsSetPowerConsumer", "Sets properties of the powerConsumer specialization", "consoleSetPowerConsumer", nil);
38end
39
40function PowerConsumer:loadPowerSetup(xmlFile)
41 self.powerConsumer.maxForce = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#maxForce"), 0); -- kN
42 self.powerConsumer.forceDir = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#forceDir"), 1);
43 self.powerConsumer.neededPtoPower = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#neededPtoPower"), 0); -- in kW at ptoRpm
44 self.powerConsumer.ptoRpm = Utils.getNoNil(getXMLFloat(xmlFile, "vehicle.powerConsumer#ptoRpm"), 0);
45end
46
47function PowerConsumer:delete()
48end
49
50function PowerConsumer:readStream(streamId, connection)
51end
52
53function PowerConsumer:writeStream(streamId, connection)
54end
55
56function PowerConsumer:mouseEvent(posX, posY, isDown, isUp, button)
57end
58
59function PowerConsumer:keyEvent(unicode, sym, modifier, isDown)
60end
61
62function PowerConsumer:update(dt)
63 if self:getIsActive() and self.isServer then
64 if self.powerConsumer.forceNode ~= nil and self.movingDirection == self.powerConsumer.forceDir then
65 local multiplier = self:getPowerMultiplier();
66 if multiplier ~= 0 then
67
68 local frictionForce = self.lastSpeedReal * 1000 * getMass(self.powerConsumer.forceDirNode) / (dt/1000);
69
70 local force = -math.min(frictionForce, self.powerConsumer.maxForce)*self.movingDirection * multiplier;
71 local x,y,z = localDirectionToWorld(self.powerConsumer.forceDirNode, 0, 0, force);
72 local px,py,pz = getCenterOfMass(self.powerConsumer.forceNode);
73
74 addForce(self.powerConsumer.forceNode, x, y, z, px,py,pz, true);
75
76 if Vehicle.debugRendering and self:getIsActiveForInput() then
77 local str = string.format("frictionForce=%.2f maxForce=%.2f -> force=%.2f", frictionForce, self.powerConsumer.maxForce, force);
78 renderText(0.7, 0.85, getCorrectTextSize(0.02), str);
79 end
80 end
81 end
82 end
83end
84
85function PowerConsumer:draw()
86end
87
88function PowerConsumer:getPtoRpm()
89 if self.getIsTurnedOn ~= nil and self:getIsTurnedOn() then
90 return self.powerConsumer.ptoRpm;
91 end
92 return 0;
93end
94
95function PowerConsumer:getDoConsumePtoPower()
96 return self.getIsTurnedOn ~= nil and self:getIsTurnedOn();
97end
98
99function PowerConsumer:getPowerMultiplier()
100 return 1;
101end
102
103-- gets needed pto torque in kNm
104function PowerConsumer:getConsumedPtoTorque()
105 if self:getDoConsumePtoPower() then
106 local rpm = self.powerConsumer.ptoRpm;
107 if rpm > 0.001 then
108 return self.powerConsumer.neededPtoPower / (rpm*math.pi/30);
109 end
110 end
111 return 0;
112end
113
114function PowerConsumer.getTotalConsumedPtoTorque(self, excludeVehicle)
115 local torque = 0;
116 if self.getConsumedPtoTorque ~= nil and self.getPtoRpm ~= nil and self ~= excludeVehicle then
117 torque = self:getConsumedPtoTorque();
118 end
119
120 -- get implements torque recursively
121 for _, implement in pairs(self.attachedImplements) do
122 torque = torque + PowerConsumer.getTotalConsumedPtoTorque(implement.object, excludeVehicle);
123 end
124 return torque;
125end
126
127function PowerConsumer.getMaxPtoRpm(self)
128 local rpm = 0;
129 if self.getPtoRpm ~= nil then
130 rpm = self:getPtoRpm();
131 end
132
133 -- get pto rpm recursively
134 for _, implement in pairs(self.attachedImplements) do
135 rpm = math.max(rpm, PowerConsumer.getMaxPtoRpm(implement.object));
136 end
137 return rpm;
138end
139
140function PowerConsumer:getCanBeTurnedOn(superFunc)
141 if self.powerConsumer.neededPtoPower > 0 and self.powerConsumer.ptoRpm > 0 then
142 if self.attacherVehicle ~= nil then
143 local implement = self.attacherVehicle:getImplementByObject(self);
144 if implement ~= nil then
145 if implement.jointDescIndex ~= nil then
146 if self.attacherVehicle.attacherJoints[implement.jointDescIndex] ~= nil then
147 if not self.attacherVehicle.attacherJoints[implement.jointDescIndex].canTurnOnImplement then
148 return false;
149 end;
150 end;
151 end;
152 end;
153 end;
154 end;
155
156 if superFunc ~= nil then
157 return superFunc(self);
158 end;
159 return true;
160end;
161
162function PowerConsumer:getIsTurnedOnAllowed(superFunc, isTurnedOn)
163 if isTurnedOn then
164 local rootVehicle = self:getRootAttacherVehicle();
165 if rootVehicle ~= nil and rootVehicle.motor ~= nil then
166
167 local torqueRequested = 0;
168 local rpm = self.powerConsumer.ptoRpm;
169 if rpm > 0.001 then
170 torqueRequested = self.powerConsumer.neededPtoPower / (rpm*math.pi/30);
171 end
172
173 torqueRequested = torqueRequested + PowerConsumer.getTotalConsumedPtoTorque(rootVehicle, self);
174 torqueRequested = torqueRequested / rootVehicle.motor.ptoMotorRpmRatio;
175
176 -- 90% of motor torque should be more then requested torque, because we need some torque to accelerate the vehicle
177 if torqueRequested > 0 and torqueRequested > 0.9*rootVehicle.motor.maxTorque then
178 return false;
179 end;
180 end;
181 end;
182
183 if superFunc ~= nil then
184 local ret = superFunc(self, isTurnedOn);
185 return ret;
186 end
187 return true;
188end;
189
190function PowerConsumer:getTurnedOnNotAllowedWarning(superFunc)
191 if not PowerConsumer.getIsTurnedOnAllowed(self, nil, true) then
192 return self.powerConsumer.turnOnNotAllowedWarning;
193 else
194 return superFunc(self);
195 end;
196end;
197
198function PowerConsumer:developmentReloadFromXML(xmlFile)
199 PowerConsumer.loadPowerSetup(self, xmlFile);
200end
201
202function consoleSetPowerConsumer(neededPower, maxForce, forceDir, ptoRpm)
203 if neededPower == nil then
204 return "No arguments given! Usage: gsSetPowerConsumer <neededPower> <maxForce> <forceDir> <ptoRpm>";
205 end
206 local object;
207 if g_currentMission.controlledVehicle ~= nil then
208 if g_currentMission.controlledVehicle.selectedImplement ~= nil and g_currentMission.controlledVehicle.selectedImplement.object.powerConsumer ~= nil then
209 object = g_currentMission.controlledVehicle.selectedImplement.object;
210 end
211 end
212 if object ~= nil then
213 object.powerConsumer.neededPtoPower = Utils.getNoNil(neededPower, object.powerConsumer.neededPtoPower);
214 object.powerConsumer.maxForce = Utils.getNoNil(maxForce, object.powerConsumer.maxForce);
215 object.powerConsumer.forceDir = Utils.getNoNil(forceDir, object.powerConsumer.forceDir);
216 object.powerConsumer.ptoRpm = Utils.getNoNil(ptoRpm, object.powerConsumer.ptoRpm);
217 for i, veh in pairs(g_currentMission.vehicles) do
218 if veh.configFileName == object.configFileName then
219 veh.powerConsumer.neededPtoPower = object.powerConsumer.neededPtoPower
220 veh.powerConsumer.maxForce = object.powerConsumer.maxForce
221 veh.powerConsumer.forceDir = object.powerConsumer.forceDir
222 veh.powerConsumer.ptoRpm = object.powerConsumer.ptoRpm
223 end
224 end
225 else
226 return "No vehicle with powerConsumer specialization selected";
227 end
228end
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de
Script Dokumentation Übersicht