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 | |
10 | PowerConsumer = {}; |
11 | |
12 | function PowerConsumer.prerequisitesPresent(specializations) |
13 | return true; |
14 | end |
15 | |
16 | function PowerConsumer:preLoad(xmlFile) |
17 | self.getConsumedPtoTorque = PowerConsumer.getConsumedPtoTorque; |
18 | self.getPtoRpm = PowerConsumer.getPtoRpm; |
19 | self.getDoConsumePtoPower = PowerConsumer.getDoConsumePtoPower; |
20 | self.getPowerMultiplier = PowerConsumer.getPowerMultiplier; |
21 | end |
22 | |
23 | function 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); |
38 | end |
39 | |
40 | function 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); |
45 | end |
46 | |
47 | function PowerConsumer:delete() |
48 | end |
49 | |
50 | function PowerConsumer:readStream(streamId, connection) |
51 | end |
52 | |
53 | function PowerConsumer:writeStream(streamId, connection) |
54 | end |
55 | |
56 | function PowerConsumer:mouseEvent(posX, posY, isDown, isUp, button) |
57 | end |
58 | |
59 | function PowerConsumer:keyEvent(unicode, sym, modifier, isDown) |
60 | end |
61 | |
62 | function 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 |
83 | end |
84 | |
85 | function PowerConsumer:draw() |
86 | end |
87 | |
88 | function PowerConsumer:getPtoRpm() |
89 | if self.getIsTurnedOn ~= nil and self:getIsTurnedOn() then |
90 | return self.powerConsumer.ptoRpm; |
91 | end |
92 | return 0; |
93 | end |
94 | |
95 | function PowerConsumer:getDoConsumePtoPower() |
96 | return self.getIsTurnedOn ~= nil and self:getIsTurnedOn(); |
97 | end |
98 | |
99 | function PowerConsumer:getPowerMultiplier() |
100 | return 1; |
101 | end |
102 | |
103 | -- gets needed pto torque in kNm |
104 | function 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; |
112 | end |
113 | |
114 | function 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; |
125 | end |
126 | |
127 | function 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; |
138 | end |
139 | |
140 | function 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; |
160 | end; |
161 | |
162 | function 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; |
188 | end; |
189 | |
190 | function 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; |
196 | end; |
197 | |
198 | function PowerConsumer:developmentReloadFromXML(xmlFile) |
199 | PowerConsumer.loadPowerSetup(self, xmlFile); |
200 | end |
201 | |
202 | function 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 |
228 | end
|
Copyright (c) 2008-2015 GIANTS Software GmbH, Confidential, All Rights Reserved.
This document is to be published solely by ls-mods.de