protected override void DI_Start(StartState state) { if (HighLogic.LoadedSceneIsFlight && this.part != null && this.part.Modules != null) { this.wheelMotor = this.part.Modules.OfType <ModuleWheels.ModuleWheelMotor>().First(); } }
protected override void DI_Start(StartState state) { if (HighLogic.LoadedSceneIsFlight && this.vessel != null && this.part != null && this.part.Modules != null) { var moduleWheels = this.part.Modules.OfType <ModuleWheels.ModuleWheelMotor>(); if (moduleWheels != null && moduleWheels.Count() > 0) { this.wheelMotor = moduleWheels.First(); } } }
public void CalculateAverageSpeed() { List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>(); foreach (var part in this.vessel.parts) { ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>(); if (wheelMotor != null) { operableWheels.Add(wheelMotor); } } // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed this.averageSpeed = GetAverageSpeed(operableWheels); }
internal Wheel(Part part) { if (!Is(part)) { throw new ArgumentException("Part is not a wheel"); } Part = part; var internalPart = part.InternalPart; wheel = internalPart.Module <ModuleWheelBase>(); brakes = internalPart.Module <ModuleWheels.ModuleWheelBrakes>(); damage = internalPart.Module <ModuleWheels.ModuleWheelDamage>(); deployment = internalPart.Module <ModuleWheels.ModuleWheelDeployment>(); motor = internalPart.Module <ModuleWheels.ModuleWheelMotor> (); steering = internalPart.Module <ModuleWheels.ModuleWheelSteering>(); suspension = internalPart.Module <ModuleWheels.ModuleWheelSuspension>(); }
public void CalculatePowerRequirement() { double powerRequired = 0; List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>(); foreach (var part in this.vessel.parts) { ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>(); if (wheelMotor != null) { if (wheelMotor.motorEnabled) { // powerRequired += wheelMotor.inputResource.rate; powerRequired += wheelMotor.avgResRate; } } } // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed powerRequired = powerRequired / 100 * 35; ScreenMessages.PostScreenMessage("Current power requirements " + powerRequired.ToString("F2") + "/s"); }
/// <summary> /// Checks standard wheels with module ModuleWheelBase /// </summary> private WheelTestResult CheckWheels() { double powerRequired = 0; double maxSpeedSum = 0; int inTheAir = 0; int operable = 0; int damaged = 0; int online = 0; List <Part> wheels = new List <Part>(); for (int i = 0; i < this.vessel.parts.Count; i++) { var part = this.vessel.parts [i]; if (part.Modules.Contains("ModuleWheelBase")) { wheels.Add(part); } } for (int i = 0; i < wheels.Count; i++) { ModuleWheelBase wheelBase = wheels[i].FindModuleImplementing <ModuleWheelBase> (); if (wheelBase.wheelType == WheelType.LEG) { continue; } ModuleWheels.ModuleWheelDamage wheelDamage = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelDamage> (); // Malemute and Karibou wheels do not implement moduleDamage, so they're unbreakable? if (wheelDamage != null) { // Wheel is damaged if (wheelDamage.isDamaged) { damaged++; continue; } } // Whether or not wheel is touching the ground if (!wheelBase.isGrounded) { inTheAir++; continue; } else { operable++; } ModuleWheels.ModuleWheelMotor wheelMotor = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelMotor> (); if (wheelMotor != null) { // Wheel is on if (wheelMotor.motorEnabled) { powerRequired += wheelMotor.avgResRate; online++; double maxWheelSpeed = 0; if (wheelMotor.part.name == "roverWheel1") //RoveMax Model M1 gives crazy values { maxWheelSpeed = 42; } else { maxWheelSpeed = wheelMotor.wheelSpeedMax; } maxSpeedSum += maxWheelSpeed; } } } return(new WheelTestResult(powerRequired, maxSpeedSum, inTheAir, operable, damaged, online)); }
/// <summary> /// Test stock wheels implementing standard module ModuleWheelBase /// </summary> /// <returns></returns> private WheelTestResult CheckStockWheels() { double powerRequired = 0; double maxSpeedSum = 0; int inTheAir = 0; int operable = 0; int damaged = 0; int online = 0; float maxWheelRadius = 0; // Get wheel modules List <Part> wheels = new List <Part>(); for (int i = 0; i < vessel.parts.Count; i++) { var part = vessel.parts[i]; if (part.Modules.Contains("ModuleWheelBase")) { wheels.Add(part); } } for (int i = 0; i < wheels.Count; i++) { ModuleWheelBase wheelBase = wheels[i].FindModuleImplementing <ModuleWheelBase>(); // Skip legs if (wheelBase.wheelType == WheelType.LEG) { continue; } // Save max wheel radius for height compensations if (wheelBase.radius < maxWheelRadius) { maxWheelRadius = wheelBase.radius; } // Check damaged wheels ModuleWheels.ModuleWheelDamage wheelDamage = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelDamage>(); if (wheelDamage != null) { if (wheelDamage.isDamaged) { damaged++; continue; } } // Whether or not wheel is touching the ground if (!wheelBase.isGrounded) { inTheAir++; continue; } else { operable++; } // Check motorized wheels ModuleWheels.ModuleWheelMotor wheelMotor = wheels[i].FindModuleImplementing <ModuleWheels.ModuleWheelMotor>(); if (wheelMotor != null) { // Wheel is on if (wheelMotor.motorEnabled) { powerRequired += wheelMotor.avgResRate; online++; double maxWheelSpeed = 0; // RoveMax M1 and RoveMax M1-F (Making History expansion) don't have max wheels speed defined, so we just set it to something sensible if ((wheelMotor.part.name == "roverWheel1") || (wheelMotor.part.name == "roverWheelM1-F ")) { maxWheelSpeed = 42; } else { maxWheelSpeed = wheelMotor.wheelSpeedMax; } maxSpeedSum += maxWheelSpeed; } } } return(new WheelTestResult(powerRequired, maxSpeedSum, inTheAir, operable, damaged, online, maxWheelRadius)); }
public void Activate() { if (distanceToTarget == 0) { ScreenMessages.PostScreenMessage("No path to target calculated"); return; } if (this.vessel.situation != Vessel.Situations.LANDED) { ScreenMessages.PostScreenMessage("Something is wrong", 5); ScreenMessages.PostScreenMessage("Hmmmm, what can it be?", 6); ScreenMessages.PostScreenMessage("Ah, yes! You're not landed!", 7); return; } this.averageSpeed = 0; double powerRequired = 0; int inTheAir = 0; List <ModuleWheels.ModuleWheelMotor> operableWheels = new List <ModuleWheels.ModuleWheelMotor>(); foreach (var part in this.vessel.parts) { ModuleWheels.ModuleWheelMotor wheelMotor = part.FindModuleImplementing <ModuleWheels.ModuleWheelMotor>(); if (wheelMotor != null) { ModuleWheels.ModuleWheelDamage wheelDamage = part.FindModuleImplementing <ModuleWheels.ModuleWheelDamage>(); if (wheelDamage != null) { // Malemute and Karibou wheels do not implement moduleDamage, thus making this mod cheaty if (wheelDamage.isDamaged) { ScreenMessages.PostScreenMessage("Some wheels are broken, we're stuck!"); return; } if (wheelDamage.currentDownForce == 0) { inTheAir++; continue; } } if (wheelMotor.motorEnabled) { // powerRequired += wheelMotor.inputResource.rate; powerRequired += wheelMotor.avgResRate; } operableWheels.Add(wheelMotor); } } // Average speed will vary depending on number of wheels online from 50 to 70 percent of wheel max speed this.averageSpeed = GetAverageSpeed(operableWheels); if (this.averageSpeed == 0) { ScreenMessages.PostScreenMessage("At least two wheels must be online!"); return; } if (inTheAir > 0 && operableWheels.Count < 4) { ScreenMessages.PostScreenMessage("Wheels are not touching the ground, are you serious???"); return; } if (operableWheels.Count < 4) { ScreenMessages.PostScreenMessage("Monocycles, bicycles and trycicles are not supported, bye!"); return; } // Generally moving at high speed requires less power than wheels' max consumption // BV will require max online wheels consumption to be less than 35% of max power production powerRequired = powerRequired / 100 * 35; double solarPower = CalculateSolarPower(); double otherPower = CalculateOtherPower(); if (solarPower + otherPower < powerRequired) { ScreenMessages.PostScreenMessage("Your power production is low, do something with it!"); return; } if (otherPower >= powerRequired) { solarPowered = false; } isActive = true; lastTime = Planetarium.GetUniversalTime(); /* distanceToTarget = GeoUtils.GetDistance( * this.vessel.latitude, this.vessel.longitude, targetLatitude, targetLongitude, this.vessel.mainBody.Radius * );*/ distanceTravelled = 0; Events["Activate"].active = false; Events["Deactivate"].active = true; BonVoyage.Instance.UpdateRoverState(this.vessel, true); ScreenMessages.PostScreenMessage("Bon Voyage!!!"); }