Exemplo n.º 1
0
 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);
 }
Exemplo n.º 2
0
        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;
            }
        }
Exemplo n.º 3
0
        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);
        }
Exemplo n.º 4
0
        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;
            }
        }