public void Rumble(int player = 0, float duration = 0.5f, float weakMotor = 1f, float strongMotor = 1f, float startFading = -1f)
    {
        if (!active)
        {
            return;
        }

        //Player 0 means both players
        TemporalRumbleInfo rumble = new TemporalRumbleInfo(player, weakMotor, strongMotor, duration, (startFading == -1f ? duration * 0.75f : startFading));

        temporalRumbleList.Add(rumble);
    }
    // Update is called once per frame
    void Update()
    {
        if (temporalRumbleList.Count > 0 || continousRumbleList.Count > 0)
        {
            float p1Weak   = 0f;
            float p1Strong = 0f;
            float p2Weak   = 0f;
            float p2Strong = 0f;

            if (!pauseRumble)
            {
                for (int i = temporalRumbleList.Count - 1; i >= 0; --i)
                {
                    TemporalRumbleInfo rumble = temporalRumbleList[i];
                    rumble.Update();

                    if (rumble.duration > 0)
                    {
                        switch (rumble.player)
                        {
                        case 0:
                            p1Weak   = rumble.GetMaxWeakValue(p1Weak);
                            p1Strong = rumble.GetMaxStrongValue(p1Strong);

                            p2Weak   = rumble.GetMaxWeakValue(p2Weak);
                            p2Strong = rumble.GetMaxStrongValue(p2Strong);
                            break;

                        case 1:
                            p1Weak   = rumble.GetMaxWeakValue(p1Weak);
                            p1Strong = rumble.GetMaxStrongValue(p1Strong);
                            break;

                        case 2:
                            p2Weak   = rumble.GetMaxWeakValue(p2Weak);
                            p2Strong = rumble.GetMaxStrongValue(p2Strong);
                            break;
                        }
                    }
                    else
                    {
                        temporalRumbleList.RemoveAt(i);
                    }
                }


                foreach (ContinousRumbleInfo rumble in continousRumbleList.Values)
                {
                    switch (rumble.player)
                    {
                    case 0:
                        p1Weak   = rumble.GetMaxWeakValue(p1Weak);
                        p1Strong = rumble.GetMaxStrongValue(p1Strong);

                        p2Weak   = rumble.GetMaxWeakValue(p2Weak);
                        p2Strong = rumble.GetMaxStrongValue(p2Strong);
                        break;

                    case 1:
                        p1Weak   = rumble.GetMaxWeakValue(p1Weak);
                        p1Strong = rumble.GetMaxStrongValue(p1Strong);
                        break;

                    case 2:
                        p2Weak   = rumble.GetMaxWeakValue(p2Weak);
                        p2Strong = rumble.GetMaxStrongValue(p2Strong);
                        break;
                    }
                }
            }

            //GamePad.SetVibration(PlayerIndex.One, p1Strong, p1Weak);
            //GamePad.SetVibration(PlayerIndex.Two, p2Strong, p2Weak);

            if (ShouldVibratePlayer(1))
            {
                InputManager.Devices[0].Vibrate(p1Strong, p1Weak);
            }
            if (ShouldVibratePlayer(2))
            {
                InputManager.Devices[1].Vibrate(p2Strong, p2Weak);
            }
        }
    }