public void ToggleArms() { if (animation != null) { animation.Toggle(); } centrifugeState = CentrifugeStates.MovingArms; rotationState = (int)centrifugeState; Events["ToggleArms"].guiName = animation.Events["Toggle"].guiName; Events["ToggleArms"].guiActive = false; Events["ToggleCentrifuge"].guiActive = false; updateRotationHelpers(true); }
public void ToggleCentrifuge() { //Update State switch (centrifugeState) { case CentrifugeStates.Stopped: case CentrifugeStates.Idle: if (animation != null && animation.Events["Toggle"].guiName == animation.startEventGUIName) { animation.Toggle(); centrifugeState = CentrifugeStates.Moving; rotationState = (int)centrifugeState; Events["ToggleArms"].guiActive = false; Events["ToggleArms"].guiName = animation.Events["Toggle"].guiName; Events["ToggleCentrifuge"].guiActive = false; Events["ToggleCentrifuge"].guiName = stopCentrifugeName; updateRotationHelpers(true); break; } centrifugeState = CentrifugeStates.SpinningUp; currentDegPerSec = 0.0f; currentDegPerSecCounter = 0.0f; rotationState = (int)centrifugeState; Events["ToggleCentrifuge"].guiName = stopCentrifugeName; Events["ToggleArms"].guiActive = false; Events["ToggleArms"].guiName = animation.Events["Toggle"].guiName; break; case CentrifugeStates.SpinningUp: case CentrifugeStates.Spinning: centrifugeState = CentrifugeStates.SpinningDown; rotationState = (int)centrifugeState; break; default: centrifugeState = CentrifugeStates.SpinningDown; rotationState = (int)centrifugeState; break; } }
protected bool updateState() { float accelerationPerFrame = centrifugeAcceleration * TimeWarp.fixedDeltaTime; bool isRotating = false; switch (centrifugeState) { case CentrifugeStates.SpinningUp: isRotating = true; currentDegPerSec = Mathf.Lerp(currentDegPerSec, maxDegPerSec, accelerationPerFrame); currentDegPerSecCounter = Mathf.Lerp(currentDegPerSecCounter, maxDegPerSecCounter, accelerationPerFrame * counterTorqueSpeedMultiplier); if ((currentDegPerSec / maxDegPerSec) >= 0.99f) { centrifugeState = CentrifugeStates.Spinning; rotationState = (int)centrifugeState; } Events["ToggleCentrifuge"].guiActive = true; break; case CentrifugeStates.SpinningDown: isRotating = true; currentDegPerSec = Mathf.Lerp(currentDegPerSec, 0f, accelerationPerFrame); currentDegPerSecCounter = Mathf.Lerp(currentDegPerSecCounter, 0f, accelerationPerFrame * counterTorqueSpeedMultiplier); if ((currentDegPerSec / maxDegPerSec) <= 0.01f) { centrifugeState = CentrifugeStates.Stopped; rotationState = (int)centrifugeState; } Events["ToggleCentrifuge"].guiActive = true; break; case CentrifugeStates.Spinning: isRotating = true; currentDegPerSec = maxDegPerSec; currentDegPerSecCounter = maxDegPerSecCounter; break; case CentrifugeStates.Moving: if (animation.aniState == ModuleAnimateGeneric.animationStates.LOCKED || animation.aniState == ModuleAnimateGeneric.animationStates.CLAMPED) { centrifugeState = CentrifugeStates.SpinningUp; rotationState = (int)centrifugeState; currentDegPerSec = 0.0f; currentDegPerSecCounter = 0.0f; Events["ToggleCentrifuge"].guiName = stopCentrifugeName; updateRotationHelpers(false); } else { return(false); } break; case CentrifugeStates.MovingArms: if (animation.aniState == ModuleAnimateGeneric.animationStates.LOCKED || animation.aniState == ModuleAnimateGeneric.animationStates.CLAMPED) { centrifugeState = CentrifugeStates.Stopped; rotationState = (int)centrifugeState; updateRotationHelpers(false); } break; case CentrifugeStates.Stopped: centrifugeState = CentrifugeStates.Idle; rotationState = (int)centrifugeState; // centrifugeTransform.localEulerAngles = Vector3.zero; // this.part.internalModel.transform.localEulerAngles = new Vector3(-90, 0, 0); rotationState = (int)centrifugeState; Events["ToggleCentrifuge"].guiActive = true; Events["ToggleCentrifuge"].guiName = startCentrifugeName; Events["ToggleArms"].guiActive = true; return(false); } //Consume the input resource if (centrifugeState == CentrifugeStates.Spinning && string.IsNullOrEmpty(inputResource) == false) { double resourcePerTimeTick = inputAmount * TimeWarp.fixedDeltaTime; double amountObtained = this.part.RequestResource(inputResource, resourcePerTimeTick, ResourceFlowMode.ALL_VESSEL); if (amountObtained / resourcePerTimeTick < 0.999) { this.part.RequestResource(inputResource, -amountObtained); centrifugeState = CentrifugeStates.SpinningDown; rotationState = (int)centrifugeState; ScreenMessages.PostScreenMessage("Insufficient " + inputResource + " to power the centrifuge. Shutting down.", 5.0f, ScreenMessageStyle.UPPER_CENTER); Events["ToggleCentrifuge"].guiActive = false; } } //Spin the centrifuge if (isRotating) { //Get rotations per frame float rotationsPerFrame = currentDegPerSec * TimeWarp.fixedDeltaTime; float counterRotationsPerFrame = currentDegPerSecCounter * TimeWarp.fixedDeltaTime * -1.0f; //Rotate centrifuge & counter-torque centrifugeTransform.Rotate(rotationAxisVec, rotationsPerFrame); if (counterTorqueTransform != null) { counterTorqueTransform.Rotate(rotationAxisVec, counterRotationsPerFrame); } //Rotate the IVA if (this.part.internalModel != null) { this.part.internalModel.transform.Rotate(rotationAxisVec, -rotationsPerFrame); } } return(true); }
public override void OnStart(StartState state) { base.OnStart(state); if (HighLogic.LoadedSceneIsFlight == false) { return; } //Deploy/Stow animation animation = this.part.FindModuleImplementing <ModuleAnimateGenericSFX>(); if (animation != null) { animation.Events["Toggle"].guiActive = false; animation.Events["Toggle"].guiActiveEditor = false; } //Get the rotation transforms if (string.IsNullOrEmpty(centrifugeName) || string.IsNullOrEmpty(counterTorqueName)) { return; } centrifugeTransform = this.part.FindModelTransform(centrifugeName); counterTorqueTransform = this.part.FindModelTransform(counterTorqueName); //Get the rotation vector if (string.IsNullOrEmpty(rotationAxis) == false) { try { string[] axisValues = rotationAxis.Split(new char[] { ',' }); rotationAxisVec = new Vector3(float.Parse(axisValues[0]), float.Parse(axisValues[1]), float.Parse(axisValues[2])); } catch { rotationAxisVec = new Vector3(0, 0, 1.0f); } } else { rotationAxisVec = new Vector3(0, 0, 1.0f); } //Get rotation helpers List <WBIIVARotationHelper> helpers = this.part.FindModulesImplementing <WBIIVARotationHelper>(); if (helpers.Count > 0) { rotationHelpers = helpers.ToArray(); } //Calculate max degrees per second maxDegPerSec = rotationsPerMinute * 6.0f; maxDegPerSecCounter = maxDegPerSec * counterTorqueSpeedMultiplier; //Set state centrifugeState = (CentrifugeStates)rotationState; //Update GUI if (centrifugeState == CentrifugeStates.Spinning) { Events["ToggleCentrifuge"].guiName = stopCentrifugeName; } else { Events["ToggleCentrifuge"].guiName = startCentrifugeName; } Events["ToggleArms"].guiName = animation.Events["Toggle"].guiName; if (centrifugeState == CentrifugeStates.Stopped) { Events["ToggleArms"].guiActive = true; } else { Events["ToggleArms"].guiActive = false; } }