public void ApplySteeringSettings() { foreach (KFModuleWheel mt in vessel.FindPartModulesImplementing <KFModuleWheel>()) { if (!Equals(fGroupNumber, 0f) && Equals(fGroupNumber, mt.fGroupNumber)) { mt.fSteeringRatio = WheelUtils.SetupRatios(mt.rootIndexLong, mt.part, vessel, fGroupNumber); mt.steeringInvert = steeringInvert; } } }
/// <summary>Sets up motor and steering direction direction.</summary> public void GetControlAxis() { controlAxisIndex = WheelUtils.GetRefAxis(part.transform.forward, vessel.ReferenceTransform); directionCorrector = WheelUtils.GetCorrector(part.transform.forward, vessel.ReferenceTransform, controlAxisIndex); if (Equals(controlAxisIndex, rootIndexLat)) { steeringCorrector = WheelUtils.GetCorrector(vessel.ReferenceTransform.up, vessel.rootPart.transform, rootIndexLat); } if (Equals(controlAxisIndex, rootIndexLong)) { steeringCorrector = WheelUtils.GetCorrector(vessel.ReferenceTransform.up, vessel.rootPart.transform, rootIndexLong); } if (Equals(controlAxisIndex, rootIndexUp)) { steeringCorrector = WheelUtils.GetCorrector(vessel.ReferenceTransform.up, vessel.rootPart.transform, rootIndexUp); } }
/// <summary>Configures the part for editor and flight.</summary> /// <remarks> /// Most importantly, it grabs a list of wheel colliders to be /// used later. Also configures visibility of tweakables, figures /// out the parts orientation and position in the vessel to calculate /// steering angles and sets some defaults. /// </remarks> /// <param name="state">Start state. Set by KSP to declare the scene it initializes this class in.</param> public override void OnStart(PartModule.StartState state) //when started { base.OnStart(state); fSusInc = KFPersistenceManager.suspensionIncrement; CustomResourceTextSetup(); fColliderMass = 10; var partOrientationForward = new Vector3(0f, 0f, 0f); var partOrientationRight = new Vector3(0f, 0f, 0f); var partOrientationUp = new Vector3(0f, 0f, 0f); if (!string.Equals(orientationObjectName, "Default")) { #if DEBUG KFLog.Warning("Setting transformed part orientation."); #endif partOrientationUp = transform.Search(orientationObjectName).up; partOrientationForward = transform.Search(orientationObjectName).forward; partOrientationRight = transform.Search(orientationObjectName).right; } else { #if DEBUG KFLog.Warning("Setting default part orientation."); #endif partOrientationUp = part.transform.up; partOrientationForward = part.transform.forward; partOrientationRight = part.transform.right; } if (hasRetractAnimation) { foreach (ModuleAnimateGeneric ma in part.FindModulesImplementing <ModuleAnimateGeneric>()) { ma.Actions["ToggleAction"].active = false; ma.Events["Toggle"].guiActive = false; ma.Events["Toggle"].guiActiveEditor = false; } SetupAnimation(); } //disables tweakables if being used on a passive part (mecannum wheel or skid, for example) if (disableTweakables) { KFLog.Warning("Disabling tweakables."); foreach (BaseField k in Fields) { #if DEBUG KFLog.Log(string.Format("Found {0}", k.guiName)); #endif k.guiActive = false; k.guiActiveEditor = false; } foreach (BaseAction a in Actions) { #if DEBUG KFLog.Log(string.Format("Found {0}", a.guiName)); #endif a.active = false; } foreach (BaseEvent e in Events) { #if DEBUG KFLog.Log(string.Format("Found {0}", e.guiName)); #endif e.active = false; } } if (fStartRetracted) { isRetracted = true; } if (!isRetracted) { fCurrentTravel = fRideHeight; //set up correct values from persistence } else { fCurrentTravel = 0f; } #if DEBUG KFLog.Log(string.Format("\"appliedRideHeight\" = {0}", appliedRideHeight)); #endif // Disable retract tweakables if retract option not specified. if (HighLogic.LoadedSceneIsEditor && !hasRetract) { part.DisableAnimateButton(); Actions["AGToggleDeployed"].active = false; Actions["Deploy"].active = false; Actions["Retract"].active = false; Fields["startRetracted"].guiActiveEditor = false; } if (HighLogic.LoadedSceneIsFlight && (!Equals(vessel.vesselType, VesselType.Debris) && !Equals(vessel.vesselType, VesselType.EVA))) { if (isDustEnabled) { _dustFX = part.gameObject.GetComponent <KFDustFX>(); if (Equals(_dustFX, null)) { _dustFX = part.gameObject.AddComponent <KFDustFX>(); _dustFX.OnStart(state); _dustFX.tweakScaleFactor = tweakScaleCorrector; } } fAppliedTravel = fRideHeight / 100f; StartCoroutine(StartupStuff()); maxRPM /= tweakScaleCorrector; fStartRetracted = false; if (!hasRetract) { part.DisableAnimateButton(); } // Wheel steering ratio setup rootIndexLong = WheelUtils.GetRefAxis(part.transform.forward, vessel.rootPart.transform); rootIndexLat = WheelUtils.GetRefAxis(part.transform.right, vessel.rootPart.transform); rootIndexUp = WheelUtils.GetRefAxis(part.transform.up, vessel.rootPart.transform); fSteeringRatio = WheelUtils.SetupRatios(rootIndexLong, part, vessel, fGroupNumber); GetControlAxis(); if (fTorque > 2f) { fTorque /= 100f; } wheelCount = 0; foreach (WheelCollider wheelCollider in part.GetComponentsInChildren <WheelCollider>()) { wheelCount++; JointSpring userSpring = wheelCollider.suspensionSpring; userSpring.spring = fSpringRate * tweakScaleCorrector; userSpring.damper = fDamperRate * tweakScaleCorrector; wheelCollider.suspensionSpring = userSpring; wheelCollider.suspensionDistance = wheelCollider.suspensionDistance * fAppliedTravel; wcList.Add(wheelCollider); suspensionDistance.Add(wheelCollider.suspensionDistance); wheelCollider.enabled = true; wheelCollider.gameObject.layer = 27; } if (brakesApplied) { fBrakeTorque = brakingTorque; // Were the brakes left applied? } if (isRetracted) { RetractDeploy("retract"); } isReady = true; } DestroyBounds(); SetupWaterSlider(); GameEvents.onGamePause.Add(OnPause); GameEvents.onGameUnpause.Add(OnUnpause); }