5class SCR_BIKIVehicleHelper
7 static const float KW2HP = 1.34102;
8 static const float HP2KW = 0.73549875;
10 static const float KW2PS = 1.3596216173039;
11 static const float PS2KW = 0.7457;
13 static const float KW2NMRPM = 9549.296585513720;
14 static const float NMRPM2KW = 0.000104719751;
19 static array<float> GetGearRatios(notnull BaseContainer vehicleContainer)
21 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
25 baseContainer = baseContainer.GetObject(
"Gearbox");
30 if (!baseContainer.Get(
"Forward", result))
34 if (baseContainer.Get(
"Reverse", reverse))
35 result.InsertAt(-reverse, 0);
43 static bool GetAutomaticGearbox(notnull BaseContainer vehicleContainer)
45 array<IEntityComponentSource> componentSources = {};
46 if (SCR_BaseContainerTools.FindComponentSourcesOfClass(vehicleContainer, SCR_CarControllerComponent,
true, componentSources) < 1)
49 IEntityComponentSource componentSource = componentSources[0];
54 if (!componentSource.Get(
"Type", gearboxMode))
57 return gearboxMode == 1;
63 static float GetInitialFuelQuantity(notnull BaseContainer vehicleContainer)
65 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer,
SCR_FuelManagerComponent);
69 BaseContainerList list = componentSource.GetObjectArray(
"FuelNodes");
73 BaseContainer baseContainer;
75 for (
int i, count = list.Count(); i < count; ++i)
78 list.Get(i).Get(
"m_fInitialFuelTankState", maxFuel);
88 static float GetFuelCapacity(notnull BaseContainer vehicleContainer)
90 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer,
SCR_FuelManagerComponent);
94 BaseContainerList list = componentSource.GetObjectArray(
"FuelNodes");
98 BaseContainer baseContainer;
100 for (
int i, count = list.Count(); i < count; ++i)
103 list.Get(i).Get(
"MaxFuel", maxFuel);
113 static float GetFuelIdleConsumption(notnull BaseContainer vehicleContainer)
115 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer, SCR_FuelConsumptionComponent);
116 if (!componentSource)
120 componentSource.Get(
"m_fFuelConsumptionIdle", result);
127 static float GetFuelMaxConsumption(notnull BaseContainer vehicleContainer)
129 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer, SCR_FuelConsumptionComponent);
130 if (!componentSource)
134 componentSource.Get(
"m_fFuelConsumption", result);
141 static array<EFuelType> GetFuelTypes(notnull BaseContainer vehicleContainer)
143 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer,
SCR_FuelManagerComponent);
144 if (!componentSource)
147 BaseContainerList list = componentSource.GetObjectArray(
"FuelNodes");
151 array<EFuelType> result = {};
152 BaseContainer baseContainer;
153 for (
int i, count = list.Count(); i < count; ++i)
156 list.Get(i).Get(
"FuelType", fuelType);
157 if (!result.Contains(fuelType))
158 result.Insert(fuelType);
167 static array<string> GetFuelTypesAsString(notnull BaseContainer vehicleContainer)
169 array<string> result = {};
170 foreach (
EFuelType fuelType : GetFuelTypes(vehicleContainer))
172 result.Insert(SCR_StringHelper.FormatSnakeCaseToUserFriendly(
typename.EnumToString(
EFuelType, fuelType)));
181 static float GetMechanicalHorsePower(notnull BaseContainer vehicleContainer)
183 return GetEnginePowerKW(vehicleContainer) * KW2HP;
189 static float GetMetricHorsePower(notnull BaseContainer vehicleContainer)
191 return GetEnginePowerKW(vehicleContainer) * KW2PS;
197 static float GetEnginePowerKW(notnull BaseContainer vehicleContainer)
199 BaseContainer baseContainer = GetEngineContainer(vehicleContainer);
204 if (baseContainer.Get(
"MaxPower", result))
208 baseContainer = GetSimulationContainer(vehicleContainer);
209 BaseContainerList baseContainerList = baseContainer.GetObjectArray(
"Rotors");
210 if (!baseContainerList)
213 if (baseContainerList.Count() < 1)
216 baseContainer = baseContainerList.Get(0);
219 if (!baseContainer.Get(
"TargetRPM", rpm))
223 if (!baseContainer.Get(
"TorqueForce", torque))
226 return rpm * torque[1] * NMRPM2KW;
233 static float GetEnginePowerKWByGearAndRPM(notnull BaseContainer vehicleContainer,
int gearIndex,
float rpm)
235 array<float> gearRatios = GetGearRatios(vehicleContainer);
236 if (!gearRatios.IsIndexValid(gearIndex))
239 float gearRatio = gearRatios[gearIndex];
247 static float GetIdleRPM(notnull BaseContainer vehicleContainer)
249 BaseContainer baseContainer = GetEngineContainer(vehicleContainer);
254 if (baseContainer.Get(
"RpmIdle", result))
257 if (baseContainer.Get(
"RPMIdle", result))
266 static float GetRPMRedLine(notnull BaseContainer vehicleContainer)
268 BaseContainer baseContainer = GetEngineContainer(vehicleContainer);
273 if (baseContainer.Get(
"RpmRedline", result))
282 static float GetMaxRPM(notnull BaseContainer vehicleContainer)
284 BaseContainer baseContainer = GetEngineContainer(vehicleContainer);
289 if (baseContainer.Get(
"RpmMax", result))
292 if (baseContainer.Get(
"RPMMax", result))
301 static float GetDifferentialRatio(notnull BaseContainer vehicleContainer)
303 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
307 BaseContainerList baseContainerList = baseContainer.GetObjectArray(
"Differentials");
308 if (!baseContainerList || baseContainerList.Count() < 1)
311 baseContainer = baseContainerList.Get(0);
316 baseContainer.Get(
"Ratio", result);
324 static float GetAxleDifferentialRatio(notnull BaseContainer vehicleContainer)
326 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
330 BaseContainerList baseContainerList = baseContainer.GetObjectArray(
"Axles");
331 if (!baseContainerList)
335 for (
int i, count = baseContainerList.Count(); i < count; ++i)
337 baseContainer = baseContainerList.Get(i);
341 baseContainer = baseContainer.GetObject(
"Differential");
345 if (baseContainer.Get(
"Ratio", result))
355 static float GetAxleCount(notnull BaseContainer vehicleContainer)
357 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
361 BaseContainerList baseContainerList = baseContainer.GetObjectArray(
"Axles");
362 if (!baseContainerList)
365 return baseContainerList.Count();
371 static float GetWheelsCircumference(notnull BaseContainer vehicleContainer)
373 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
377 BaseContainerList baseContainerList = baseContainer.GetObjectArray(
"Axles");
378 if (!baseContainerList || baseContainerList.Count() < 1)
381 baseContainer = baseContainerList.Get(0);
385 baseContainer = baseContainer.GetObject(
"Wheel");
388 baseContainer.Get(
"Radius", result);
390 return 2 * Math.PI * result;
396 static float GetTheoreticalMaxSpeed(notnull BaseContainer vehicleContainer,
bool useMaxRPM =
false)
398 array<float> gearRatios = GetGearRatios(vehicleContainer);
399 if (gearRatios.Count() < 1)
404 engineRPM = GetMaxRPM(vehicleContainer);
406 engineRPM = GetRPMRedLine(vehicleContainer);
408 if (SCR_BIKIGeneralHelper.IsWheeled(vehicleContainer))
410 float axleDifferentialRatio = GetAxleDifferentialRatio(vehicleContainer);
411 float wheelCircumference = GetWheelsCircumference(vehicleContainer);
412 return GetTheoreticalSpeed(engineRPM, gearRatios[gearRatios.Count() - 1], axleDifferentialRatio, wheelCircumference);
415 if (SCR_BIKIGeneralHelper.IsTracked(vehicleContainer))
417 BaseContainer roadWheel = GetSimulationContainer(vehicleContainer).GetObject(
"RoadWheel");
421 float wheelCircumference;
422 if (!roadWheel.Get(
"Radius", wheelCircumference))
425 return GetTheoreticalSpeed(engineRPM, gearRatios[gearRatios.Count() - 1], 1, wheelCircumference);
434 static array<float> GetTheoreticalMaxSpeedForAllGears(notnull BaseContainer vehicleContainer)
436 array<float> result = GetGearRatios(vehicleContainer);
437 if (result.IsEmpty())
440 float engineRPM = GetRPMRedLine(vehicleContainer);
441 float axleDifferentialRatio = GetAxleDifferentialRatio(vehicleContainer);
442 float wheelCircumference = GetWheelsCircumference(vehicleContainer);
443 foreach (
int i,
float gearRatio : result)
445 result[i] = GetTheoreticalSpeed(engineRPM, gearRatio, axleDifferentialRatio, wheelCircumference);
457 protected static float GetTheoreticalSpeed(
float engineRPM,
float gearRatio,
float axleDifferentialRatio,
float wheelCircumference)
459 if (engineRPM <= 0 || axleDifferentialRatio <= 0 || wheelCircumference <= 0 || gearRatio == 0)
462 float axleRPM = engineRPM / (gearRatio * axleDifferentialRatio);
463 float groundSpeed = axleRPM * (wheelCircumference / 60) * 3.6;
471 static float GetMaxSpeed(notnull BaseContainer vehicleContainer)
474 float theoreticalMaxSpeed = GetTheoreticalMaxSpeed(vehicleContainer);
475 if (theoreticalMaxSpeed == 0)
492 static array<int> GetSeats(notnull BaseContainer baseCompartmentHolder)
494 array<int> result = { 0, 0, 0, 0 };
496 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(baseCompartmentHolder, SCR_BaseCompartmentManagerComponent);
497 BaseContainerList baseContainerList;
498 BaseContainer baseContainer;
502 baseContainerList = componentSource.GetObjectArray(
"CompartmentSlots");
503 if (baseContainerList)
505 for (
int i, count = baseContainerList.Count(); i < count; ++i)
507 baseContainer = baseContainerList.Get(i);
508 typeName = baseContainer.GetClassName().ToType();
513 if (IsTurretCommanderSeat(baseContainer))
515 result[2] = result[2] + 1;
520 if (typeName.IsInherited(TurretCompartmentSlot))
522 result[1] = result[1] + 1;
527 if (typeName.IsInherited(PilotCompartmentSlot))
529 result[0] = result[0] + 1;
534 if (typeName.IsInherited(CargoCompartmentSlot))
536 result[3] = result[3] + 1;
543 componentSource = SCR_BaseContainerTools.FindComponentSource(baseCompartmentHolder, SlotManagerComponent);
546 baseContainerList = componentSource.GetObjectArray(
"Slots");
547 if (baseContainerList)
551 array<int> subResult;
552 for (
int i, count = baseContainerList.Count(); i < count; ++i)
554 baseContainer = baseContainerList.Get(i);
559 if (!resource.IsValid())
562 subResult = GetSeats(resource.GetResource().ToBaseContainer());
563 for (
int j; j < 4; ++j)
565 result[j] = result[j] + subResult[j];
578 protected static bool IsTurretCommanderSeat(notnull BaseContainer compartmentContainer)
581 if (compartmentContainer.Get(
"CompartmentUniqueName", commanderStr))
583 commanderStr.ToLower();
584 if (commanderStr.Contains(
"commander"))
588 BaseContainer baseContainer = compartmentContainer.GetObject(
"UIInfo");
591 if (baseContainer.Get(
"Name", commanderStr))
593 commanderStr.ToLower();
594 if (commanderStr.Contains(
"commander"))
607 protected static BaseContainer GetSimulationContainer(notnull BaseContainer vehicleContainer)
609 IEntityComponentSource componentSource = SCR_BaseContainerTools.FindComponentSource(vehicleContainer, VehicleBaseSimulation);
610 if (!componentSource)
613 return componentSource.GetObject(
"Simulation");
617 protected static BaseContainer GetEngineContainer(notnull BaseContainer vehicleContainer)
619 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
623 return baseContainer.GetObject(
"Engine");
627 protected static BaseContainer GetGearboxContainer(notnull BaseContainer vehicleContainer)
629 BaseContainer baseContainer = GetSimulationContainer(vehicleContainer);
633 return baseContainer.GetObject(
"Gearbox");
ResourceName resourceName
void SCR_FuelManagerComponent(IEntityComponentSource src, IEntity ent, IEntity parent)