private void Disable()
 {
     if (InputManagerA.GetInputLibrary() == InputManagerA.InputLibrary.InControl)
     {
         InputManager.OnDeviceDetached -= deviceDetached;
         InputManager.OnDeviceAttached -= deviceAttached;
     }
 }
    // Start is called before the first frame update
    public void InitializeControls()
    {
        KeyCode[] myKeyCodes = (KeyCode[])Enum.GetValues(typeof(KeyCode));
        myPlayer       = GetComponent <s_Player>();
        xboxController = (XboxController)myPlayer.GetPlayerID() + 1;

        for (int i = 0; i < myKeyCodes.Length; i++)
        {
            myKeys.Add(new Nothing(myPlayer, 0));
            keyCodeMyKeysLocation.Add(new KeyValuePair <int, int>((int)myKeyCodes[i], i));
        }

        XboxAxis[] myContInput = (XboxAxis[])Enum.GetValues(typeof(XboxAxis));
        for (int i = 0; i < myContInput.Length; i++)
        {
            myXCIAxis.Add(new NothingA(myPlayer, ""));
            XCIMyKeysLocation.Add(new KeyValuePair <int, int>((int)myContInput[i], i));
        }

        XboxButton[] myContButtonInput = (XboxButton[])Enum.GetValues(typeof(XboxButton));
        for (int i = 0; i < myContButtonInput.Length; i++)
        {
            myXCIButtons.Add(new NothingA(myPlayer, ""));
            XCIMyKeyButtonLocation.Add(new KeyValuePair <int, int>((int)myContButtonInput[i], i));
        }

        keyCodeMyKeysLocation.Sort((x, y) => x.Key.CompareTo(y.Key));
        XCIMyKeysLocation.Sort((x, y) => x.Key.CompareTo(y.Key));
        XCIMyKeyButtonLocation.Sort((x, y) => x.Key.CompareTo(y.Key));

        if (InputManagerA.GetInputLibrary() == InputManagerA.InputLibrary.InControl)
        {
            if (myPlayer.GetPlayerID() < InputManager.Devices.Count)
            {
                m_controllerDevice = InputManager.Devices[myPlayer.GetPlayerID()];
            }
            else
            {
                if (!myPlayer.GetAI() && myPlayer.GetPlayerID() > InputManager.Devices.Count + 1)
                {
                    s_ErrorMessage.AddMesage("Error Connecting controllers");
                }
            }
        }
        setDefaultControls();
        for (int i = 0; i < m_inControlWrappers.Count; i++)
        {
            m_inControlWrappers[i].ControlNotInUse();
        }
    }
    // Update is called once per frame
    void Update()
    {
        if (myPlayer.GetAI() || s_GameManager.GetPaused())
        {
            return;
        }


        switch (InputManagerA.GetInputLibrary())
        {
        case InputManagerA.InputLibrary.XCI:
            if (!s_GameManager.Singleton.GetAcceptPlayerInput())
            {
                for (int i = 0; i < myXCIAxis.Count; i++)
                {
                    myXCIAxis[i].Execute0(0);
                }
                return;
            }
            for (int i = 0; i < myXCIAxis.Count; i++)
            {
                AxisControlsXInput(i);
            }
            for (int i = 0; i < myXCIButtons.Count; i++)
            {
                ButtonControlsXInput(i);
            }
            break;

        case InputManagerA.InputLibrary.InControl:
            for (int i = 0; i < m_inControlWrappers.Count; i++)
            {
                m_inControlWrappers[i].ControlInUse();
            }
            break;

        case InputManagerA.InputLibrary.Unity:
        default:    /*
                     * if(!myPlayer.GetUseKeyboardAndMouse())// if this is true then this function is being called elsewhere so we do not want to call it here
                     */
            CallKeyboardAndMouseInput();
            break;
        }
    }
    public void CallKeyboardAndMouseInput()
    {
        if (Input.GetMouseButtonDown(0))
        {
            myPlayer.SetFireButtonDown(true);
        }
        if (Input.GetMouseButtonUp(0))
        {
            myPlayer.SetFireButtonDown(false);
        }

        for (int i = 0; i < myKeys.Count; i++)
        {
            if (myKeys[i].IsAxis() && InputManagerA.GetInputLibrary() == InputManagerA.InputLibrary.Unity)
            {
                AxisControls(i, (myKeys[i] as Axis).GetAxisName());
            }
            else
            {
                keyCheck(i);
            }
        }
    }
    void setDefaultControls()
    {
        switch (ControlScheme)
        {
        case ControlSystem.Default:
            myKeys[getIndexOfButton(KeyCode.W)]      = new MoveNorth(myPlayer, KeyCode.W);
            myKeys[getIndexOfButton(KeyCode.S)]      = new MoveSouth(myPlayer, KeyCode.S);
            myKeys[getIndexOfButton(KeyCode.A)]      = new MoveWest(myPlayer, KeyCode.A);
            myKeys[getIndexOfButton(KeyCode.D)]      = new MoveEast(myPlayer, KeyCode.D);
            myKeys[getIndexOfButton(KeyCode.Space)]  = new FireWeapon(myPlayer, KeyCode.Space);
            myKeys[getIndexOfButton(KeyCode.E)]      = new DropWeapon(myPlayer, KeyCode.E);
            myKeys[getIndexOfButton(KeyCode.Mouse1)] = new Dodge(myPlayer, KeyCode.Mouse1);
            myKeys[getIndexOfButton(KeyCode.Mouse0)] = new FireWeapon(myPlayer, KeyCode.Mouse0);
            myKeys[getIndexOfButton(KeyCode.Mouse2)] = new FireWeaponSecondary(myPlayer, KeyCode.Mouse2);
            myKeys[getIndexOfButton(KeyCode.Q)]      = new Dodge(myPlayer, KeyCode.Q);
            myKeys[getIndexOfButton(KeyCode.F)]      = new Kick(myPlayer, KeyCode.F);


            switch (InputManagerA.GetInputLibrary())
            {
            case InputManagerA.InputLibrary.XCI:
                myXCIAxis[getIndexOfAxis(XboxAxis.LeftStickX)]             = new MoveLeftRightA(myPlayer, XboxAxis.LeftStickX);
                myXCIAxis[getIndexOfAxis(XboxAxis.LeftStickY)]             = new MoveUpDownA(myPlayer, XboxAxis.LeftStickY);
                myXCIAxis[getIndexOfAxis(XboxAxis.RightStickX)]            = new FireWeaponAutoH(myPlayer, XboxAxis.RightStickX);
                myXCIAxis[getIndexOfAxis(XboxAxis.RightStickY)]            = new FireWeaponAutoV(myPlayer, XboxAxis.RightStickY);
                myXCIAxis[getIndexOfAxis(XboxAxis.RightTrigger)]           = new FireWeaponA(myPlayer, XboxAxis.RightTrigger, true);
                myXCIAxis[getIndexOfAxis(XboxAxis.LeftTrigger)]            = new FireWeaponSecondaryA(myPlayer, XboxAxis.LeftTrigger, true);
                myXCIButtons[getIndexOfXboxButton(XboxButton.Y)]           = new DropWeapon(myPlayer, XboxButton.Y);
                myXCIButtons[getIndexOfXboxButton(XboxButton.RightBumper)] = new Kick(myPlayer, XboxButton.RightBumper);
                myXCIButtons[getIndexOfXboxButton(XboxButton.LeftBumper)]  = new Dodge(myPlayer, XboxButton.LeftBumper);

                break;

            case InputManagerA.InputLibrary.InControl:
                m_inControlWrappers.Add(new ICLeftStickX(m_controllerDevice, new MoveLeftRightA(myPlayer, "", false)));
                m_inControlWrappers.Add(new ICLeftStickY(m_controllerDevice, new MoveUpDownA(myPlayer, "", false)));
                m_inControlWrappers[m_inControlWrappers.Count - 1].Inverse(true);
                m_inControlWrappers.Add(new ICRightStickX(m_controllerDevice, new FireWeaponAutoH(myPlayer, "", false)));
                m_inControlWrappers.Add(new ICRightStickY(m_controllerDevice, new FireWeaponAutoV(myPlayer, "", false)));
                m_inControlWrappers[m_inControlWrappers.Count - 1].Inverse(true);
                m_inControlWrappers.Add(new ICRightTrigger(m_controllerDevice, new FireWeaponA(myPlayer, "", false)));
                m_inControlWrappers.Add(new ICLeftTrigger(m_controllerDevice, new FireWeaponSecondaryA(myPlayer, "", false)));
                m_inControlWrappers.Add(new ICRightBumper(m_controllerDevice, new Kick(myPlayer, (KeyCode)0)));
                m_inControlWrappers.Add(new ICLeftBumper(m_controllerDevice, new Dodge(myPlayer, (KeyCode)0)));
                m_inControlWrappers.Add(new ICYButton(m_controllerDevice, new DropWeapon(myPlayer, (KeyCode)0)));


                break;

            case InputManagerA.InputLibrary.Unity:
            default:
                myKeys.Add(new MoveLeftRightA(myPlayer, getProperAxisName(myPlayer, (int)XEI.LeftStickX)));
                myKeys.Add(new MoveUpDownA(myPlayer, getProperAxisName(myPlayer, (int)XEI.LeftStickY)));
                myKeys.Add(new FireWeaponAutoH(myPlayer, getProperAxisName(myPlayer, (int)XEI.RightStickX)));
                myKeys.Add(new FireWeaponAutoV(myPlayer, getProperAxisName(myPlayer, (int)XEI.RightStickY)));
                myKeys.Add(new FireWeaponA(myPlayer, getProperAxisName(myPlayer, (int)XEI.RightTrigger)));
                myKeys.Add(new FireWeaponSecondaryA(myPlayer, getProperAxisName(myPlayer, (int)XEI.LeftTrigger)));
                myKeys[getIndexOfButton(((KeyCode)((int)(XEI.Button3)) + 20 * myPlayer.GetPlayerID()))] = new DropWeapon(myPlayer, ((KeyCode)((int)(XEI.Button3)) + 20 * myPlayer.GetPlayerID()));
                myKeys[getIndexOfButton(((KeyCode)((int)(XEI.Button4)) + 20 * myPlayer.GetPlayerID()))] = new Dodge(myPlayer, ((KeyCode)((int)(XEI.Button4)) + 20 * myPlayer.GetPlayerID()));
                myKeys[getIndexOfButton(((KeyCode)((int)(XEI.Button5)) + 20 * myPlayer.GetPlayerID()))] = new Kick(myPlayer, ((KeyCode)((int)(XEI.Button5)) + 20 * myPlayer.GetPlayerID()));

                break;
            }
            break;

        case ControlSystem.TankControls:
            myKeys[getIndexOfButton(KeyCode.W)] = new MoveForward(myPlayer, KeyCode.W);
            myKeys[getIndexOfButton(KeyCode.S)] = new MoveBack(myPlayer, KeyCode.S);
            myKeys[getIndexOfButton(KeyCode.A)] = new RotateLeft(myPlayer, KeyCode.A);
            myKeys[getIndexOfButton(KeyCode.D)] = new RotateRight(myPlayer, KeyCode.D);


            myKeys.Add(new AimLeftRightA(myPlayer, getProperAxisName(myPlayer, 4)));
            myKeys.Add(new FireWeaponA(myPlayer, getProperAxisName(myPlayer, 10), true));
            myKeys.Add(new AimUpDownA(myPlayer, getProperAxisName(myPlayer, 5)));
            myKeys.Add(new MoveLeftRightA(myPlayer, getProperAxisName(myPlayer, 1)));
            myKeys.Add(new MoveUpDownA(myPlayer, getProperAxisName(myPlayer, 2)));
            break;

        case ControlSystem.FireAndAimAsOne:
            myKeys[getIndexOfButton(KeyCode.W)] = new MoveNorth(myPlayer, KeyCode.W);
            myKeys[getIndexOfButton(KeyCode.S)] = new MoveSouth(myPlayer, KeyCode.S);
            myKeys[getIndexOfButton(KeyCode.A)] = new MoveEast(myPlayer, KeyCode.A);
            myKeys[getIndexOfButton(KeyCode.D)] = new MoveWest(myPlayer, KeyCode.D);

            myKeys.Add(new FireWeaponAutoH(myPlayer, getProperAxisName(myPlayer, 4), false, true));
            myKeys.Add(new FireWeaponAutoV(myPlayer, getProperAxisName(myPlayer, 5), false, true));
            myKeys.Add(new MoveLeftRightA(myPlayer, getProperAxisName(myPlayer, 1)));
            myKeys.Add(new MoveUpDownA(myPlayer, getProperAxisName(myPlayer, 2)));

            break;

        default:
            break;
        }
    }