private void UpdateGamePadButtons(int controllerId)
    {
        var curGamePad = GamePadStateArray[controllerId];
        for (int i = 0; i < 14; i++)
        {
            ButtonState curStateButton = ButtonState.Released;
            Controller.ButtonsStates curButton = new Controller.ButtonsStates();
            if (i <= _abxy.Length - 1)
            {
                curButton = (Controller.ButtonsStates)GamePads[controllerId].GetType().GetField(_abxy[i]).GetValue(GamePads[controllerId]);
                curStateButton = (ButtonState)typeof(GamePadButtons).GetProperty(_abxyXinput[i]).GetValue(GamePadStateArray[controllerId].Buttons, null);
            }
            else
            {
                int iValue = i - 10;
                curButton = (Controller.ButtonsStates)GamePads[controllerId].GetType().GetField(_dPad[iValue].ToUpper()).GetValue(GamePads[controllerId]);
                curStateButton = (ButtonState)typeof(GamePadDPad).GetProperty(_dPad[iValue]).GetValue(GamePadStateArray[controllerId].DPad, null);
            }

            #region Failed attempt to cache reflection values
            /* --> Failed attempt to cache reflection values
                if(!cachedStates[controllerId]) {
                if (i <= _abxy.Length - 1)
                {
                    statesArrayCache[i] = (Controller.ButtonsStates)GamePads[controllerId].GetType().GetField(_abxy[i]).GetValue(GamePads[controllerId]);
                    xinputStatesCache[i] = (ButtonState)typeof(GamePadButtons).GetProperty(_abxyXinput[i]).GetValue(GamePadStateArray[controllerId].Buttons, null);
                }
                else
                {
                    int iValue = i - 10;
                    statesArrayCache[i] = (Controller.ButtonsStates)GamePads[controllerId].GetType().GetField(_dPad[iValue].ToUpper()).GetValue(GamePads[controllerId]);
                    xinputStatesCache[i] = (ButtonState)typeof(GamePadDPad).GetProperty(_dPad[iValue]).GetValue(GamePadStateArray[controllerId].DPad, null);
                }
                cachedStates[controllerId] = true;
            }
            curButton = statesArrayCache[i];
            curStateButton = xinputStatesCache[i];
             */
            #endregion

            #region Old code, stopped working for some reason
            //-----> Old code, stopped working for some reason
            //Check Button States
            //if (curButton.Pressed && curStateButton == ButtonState.Released)
            //{
            //    curButton.Pressed = false;
            //    //Or use reflection again curButton.GetType().GetField("Pressed").SetValue(curButton, false);
            //}
            //if (!curButton.Pressed && (curButton.Released || curButton.Held) && curStateButton == ButtonState.Released)
            //{
            //    curButton.Pressed = true;
            //    Debug.Log("Pressed");
            //    curButton.Held = false;
            //    curButton.Released = false;
            //}
            //if (!curButton.Pressed && curButton.Released && curStateButton == ButtonState.Pressed)
            //{
            //    curButton.Held = true;
            //    curButton.Released = false;
            //    Debug.Log("Held");
            //}
            //if (!curButton.Pressed && !curButton.Released && !curButton.Held && curStateButton == ButtonState.Pressed)
            //{
            //    curButton.Released = true;
            //    Debug.Log("Released");
            //}
            #endregion

            #region Check Button States (New code, working for now, order of conditions is primordial)
            //Held
            if (curButton.Pressed && (!curButton.Released || !curButton.Held) && curStateButton == ButtonState.Pressed)
            {
                curButton.Pressed = false;
                //Debug.Log("Held");
                curButton.Held = true;
                curButton.Released = false;
                curButton.Zero = false;
                //Or use reflection again curButton.GetType().GetField("Pressed").SetValue(curButton, false);
            }
            else if (!curButton.Pressed && !curButton.Released && !curButton.Zero && curButton.Held && curStateButton == ButtonState.Pressed)
            {
                curButton.Pressed = false;
                //Debug.Log("Held");
                curButton.Held = true;
                curButton.Released = false;
                curButton.Zero = false;
            }

            //Pressed
            if (curButton.Pressed && curStateButton == ButtonState.Pressed)
            {
                curButton.Pressed = false;
                curButton.Zero = false;
            }
            else if (!curButton.Pressed && curButton.Zero && curStateButton == ButtonState.Pressed)
            {
                curButton.Pressed = true;
                //Debug.Log("Pressed");
                curButton.Held = false;
                curButton.Released = false;
                curButton.Zero = false;
            }

            //Zero
            if (!curButton.Pressed && !curButton.Held && !curButton.Zero && curButton.Released && curStateButton == ButtonState.Released)
            {
                curButton.Released = false;
                curButton.Held = false;
                curButton.Pressed = false;
                curButton.Zero = true;
                //Debug.Log("Zero1");
            }
            else if (!curButton.Pressed && !curButton.Held && !curButton.Released && !curButton.Zero && curStateButton == ButtonState.Released)
            {
                curButton.Released = false;
                curButton.Held = false;
                curButton.Pressed = false;
                curButton.Zero = true;
                //Debug.Log("Zero2");
            }

            //Released
            if (curButton.Released && curStateButton == ButtonState.Released)
            {
                curButton.Pressed = false;
                curButton.Held = false;
                curButton.Released = false;
                curButton.Zero = true;
                //Debug.Log("Released2");
            }
            else if ((curButton.Pressed || curButton.Held) && !curButton.Released && !curButton.Zero && curStateButton == ButtonState.Released)
            {
                curButton.Released = true;
                //Debug.Log("Released 1");
            }
            #endregion

            #region Failed attempt to cache reflection values
            /*--> Failed attempt to cache reflection values
             * statesArrayCache[i] = curButton;
            xinputStatesCache[i] = curStateButton; */
            #endregion

            //Finished Checking, Set Values
            if (i <= _abxy.Length - 1)
            {
                GamePads[controllerId].GetType().GetField(_abxy[i]).SetValue(GamePads[controllerId], curButton);
            }
            else
            {
                int iValue = i - 10;
                GamePads[controllerId].GetType().GetField(_dPad[iValue].ToUpper()).SetValue(GamePads[controllerId], curButton);
            }
        }
    }
    private void SetUnityButtons(int controllerId)
    {
        for (int i = 0; i < _controllerClassButtons.Length; i++)
        {
            Controller.ButtonsStates curGamePadButton = new Controller.ButtonsStates();
            ControllerComputerInputs.ButtonInput curcomputerButton = new ControllerComputerInputs.ButtonInput();

            string gamePadButton = _controllerClassButtons[i];
            string computerButton = _computerClassButtons[i];
            if (gamePadButton == "Start" || gamePadButton == "Select")
                gamePadButton = gamePadButton.ToLower();

            curGamePadButton = (Controller.ButtonsStates)GamePads[controllerId].GetType().GetField(gamePadButton).GetValue(GamePadController.GamePads[controllerId]);
            curcomputerButton = (ControllerComputerInputs.ButtonInput)computerInputs[controllerId].GetType().GetField(computerButton).GetValue(GamePadController.computerInputs[controllerId]);

            if (curcomputerButton.inputSetup)
            {
                curGamePadButton.Held = SetAndCheckIfUnityButtonIsSetup(controllerId, curcomputerButton, curGamePadButton.Held, curcomputerButton.Held);
                curGamePadButton.Pressed = SetAndCheckIfUnityButtonIsSetup(controllerId, curcomputerButton, curGamePadButton.Pressed, curcomputerButton.Pressed);
                curGamePadButton.Released = SetAndCheckIfUnityButtonIsSetup(controllerId, curcomputerButton, curGamePadButton.Released, curcomputerButton.Released);
                curGamePadButton.Zero = SetAndCheckIfUnityButtonIsSetup(controllerId, curcomputerButton, curGamePadButton.Zero, curcomputerButton.Zero);

                GamePads[controllerId].GetType().GetField(gamePadButton).SetValue(GamePads[controllerId], curGamePadButton);
            }
        }
    }