// call this when there is a possibility of a key change
  public static void checkIfBindingsNeedUpdating() {
    if (joyNo < 0) return;

    for (Map.Entry<String, ControllerBinding> entry : joyBindingsMap.entrySet()) {
      if (entry.getValue().inputEvent.isValid()
          && entry.getValue().keyCodes != null
          && entry.getValue().keyCodes.length >= 1
          && !entry.getKey().contains("user.")) {
        KeyBinding kb = McKeyBindHelper.getMinecraftKeyBind(entry.getKey());
        if (kb == null && entry.getKey().contains("joy."))
          kb = McKeyBindHelper.getMinecraftKeyBind(entry.getKey().replace("joy.", "key."));
        if (kb != null) {
          int keyCode = McObfuscationHelper.keyCode(kb);
          if (entry.getValue().keyCodes[0] != keyCode) {
            entry.getValue().keyCodes = new int[] {keyCode};
            setControllerBinding(joyNo, entry.getKey(), entry.getValue());
          }
        }
      }
    }
  }
  public static void setDefaultJoyBindingMap(int joyIndex, boolean updateWithConfigFile) {
    if (currentDisplayedMap == joyIndex) {
      LogHelper.Info(
          "Skipping setting up the joybinding map as it is already set up for this joypad");
      return;
    }

    currentDisplayedMap = joyIndex;

    GameSettings settings = Minecraft.getMinecraft().gameSettings;
    LogHelper.Info("Setting default joy binding map");

    joyBindingsMap.clear();

    int yAxisIndex = ControllerUtils.findYAxisIndex(joyIndex);
    int xAxisIndex = ControllerUtils.findXAxisIndex(joyIndex);

    joyBindingsMap.put(
        "joy.jump",
        new ControllerBinding(
            "joy.jump",
            "Jump",
            new ButtonInputEvent(joyIndex, 0, 1),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindJump)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.inventory",
        new ControllerBinding(
            "joy.inventory",
            "Open inventory",
            new ButtonInputEvent(joyIndex, 3, 1),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindInventory)},
            100,
            EnumSet.of(BindingOptions.GAME_BINDING, BindingOptions.CATEGORY_INVENTORY)));

    joyBindingsMap.put(
        "joy.drop",
        new ControllerBinding(
            "joy.drop",
            "Drop",
            new ButtonInputEvent(joyIndex, 6, 1),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindDrop)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.sneak",
        new ControllerBinding(
            "joy.sneak",
            "Sneak",
            new ButtonInputEvent(joyIndex, 8, 1),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindSneak)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.attack",
        new ControllerBinding(
            "joy.attack",
            "Attack",
            new AxisInputEvent(joyIndex, 4, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            new int[] {-100},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.use",
        new ControllerBinding(
            "joy.use",
            "Use",
            new AxisInputEvent(joyIndex, 4, defaultAxisThreshhold, defaultAxisDeadZone),
            new int[] {-99},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.interact",
        new ControllerBinding(
            "joy.interact",
            "Interact",
            new ButtonInputEvent(joyIndex, 2, 1),
            new int[] {-99},
            0,
            EnumSet.of(BindingOptions.GAME_BINDING, BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.guiLeftClick",
        new ControllerBinding(
            "joy.guiLeftClick",
            "Left click",
            new ButtonInputEvent(joyIndex, 0, 1),
            new int[] {-100},
            0,
            EnumSet.of(BindingOptions.MENU_BINDING, BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.guiRightClick",
        new ControllerBinding(
            "joy.guiRightClick",
            "Right click",
            new ButtonInputEvent(joyIndex, 2, 1),
            new int[] {-99},
            0,
            EnumSet.of(BindingOptions.MENU_BINDING, BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.prevItem",
        new ControllerBinding(
            "joy.prevItem",
            "Previous item",
            new ButtonInputEvent(joyIndex, 4, 1),
            new int[] {-199},
            0,
            EnumSet.of(BindingOptions.GAME_BINDING, BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.nextItem",
        new ControllerBinding(
            "joy.nextItem",
            "Next item",
            new ButtonInputEvent(joyIndex, 5, 1),
            new int[] {-201},
            0,
            EnumSet.of(BindingOptions.GAME_BINDING, BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.sprint",
        new ControllerBinding(
            "joy.sprint",
            "Sprint",
            new ButtonInputEvent(joyIndex, 9, 1),
            new int[] {Keyboard.KEY_LCONTROL},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.menu",
        new ControllerBinding(
            "joy.menu",
            "Open menu",
            new ButtonInputEvent(joyIndex, 7, 1),
            new int[] {Keyboard.KEY_ESCAPE},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.MENU_BINDING,
                BindingOptions.CATEGORY_MISC)));

    joyBindingsMap.put(
        "joy.shiftClick",
        new ControllerBinding(
            "joy.shiftClick",
            "Shift-click",
            new ButtonInputEvent(joyIndex, 1, 1),
            new int[] {Keyboard.KEY_LSHIFT, -100},
            0,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_INVENTORY)));

    joyBindingsMap.put(
        "joy.cameraX+",
        new ControllerBinding(
            "joy.cameraX+",
            "Look right",
            new AxisInputEvent(
                joyIndex, xAxisIndex + 2, defaultAxisThreshhold, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.cameraX-",
        new ControllerBinding(
            "joy.cameraX-",
            "Look left",
            new AxisInputEvent(
                joyIndex, xAxisIndex + 2, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.cameraY-",
        new ControllerBinding(
            "joy.cameraY-",
            "Look up",
            new AxisInputEvent(
                joyIndex, xAxisIndex + 1, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.cameraY+",
        new ControllerBinding(
            "joy.cameraY+",
            "Look down",
            new AxisInputEvent(
                joyIndex, xAxisIndex + 1, defaultAxisThreshhold, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_GAMEPLAY)));

    joyBindingsMap.put(
        "joy.right",
        new ControllerBinding(
            "joy.right",
            "Strafe right",
            new AxisInputEvent(joyIndex, xAxisIndex, defaultAxisThreshhold, defaultAxisDeadZone),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindRight)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.left",
        new ControllerBinding(
            "joy.left",
            "Strafe left",
            new AxisInputEvent(
                joyIndex, xAxisIndex, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindLeft)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.back",
        new ControllerBinding(
            "joy.back",
            "Move backward",
            new AxisInputEvent(joyIndex, yAxisIndex, defaultAxisThreshhold, defaultAxisDeadZone),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindBack)},
            yAxisIndex,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.forward",
        new ControllerBinding(
            "joy.forward",
            "Move forward",
            new AxisInputEvent(
                joyIndex, yAxisIndex, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindForward)},
            0,
            EnumSet.of(
                BindingOptions.GAME_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_MOVEMENT)));

    joyBindingsMap.put(
        "joy.guiX+",
        new ControllerBinding(
            "joy.guiX+",
            "GUI right",
            new AxisInputEvent(joyIndex, xAxisIndex, defaultAxisThreshhold, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.guiX-",
        new ControllerBinding(
            "joy.guiX-",
            "GUI left",
            new AxisInputEvent(
                joyIndex, xAxisIndex, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.guiY+",
        new ControllerBinding(
            "joy.guiY+",
            "GUI down",
            new AxisInputEvent(joyIndex, yAxisIndex, defaultAxisThreshhold, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.guiY-",
        new ControllerBinding(
            "joy.guiY-",
            "GUI up",
            new AxisInputEvent(
                joyIndex, yAxisIndex, defaultAxisThreshhold * -1, defaultAxisDeadZone),
            null,
            0,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.closeInventory",
        new ControllerBinding(
            "joy.closeInventory",
            "Close container",
            new ButtonInputEvent(joyIndex, 3, 1),
            new int[] {McObfuscationHelper.keyCode(settings.keyBindInventory)},
            100,
            EnumSet.of(BindingOptions.MENU_BINDING, BindingOptions.CATEGORY_INVENTORY)));

    joyBindingsMap.put(
        "joy.scrollDown",
        new ControllerBinding(
            "joy.scrollDown",
            "Scroll down",
            new ButtonInputEvent(joyIndex, 5, 1),
            new int[] {-201},
            scrollDelay,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.RENDER_TICK,
                BindingOptions.CATEGORY_UI)));

    joyBindingsMap.put(
        "joy.scrollUp",
        new ControllerBinding(
            "joy.scrollUp",
            "Scroll up",
            new ButtonInputEvent(joyIndex, 4, 1),
            new int[] {-199},
            scrollDelay,
            EnumSet.of(
                BindingOptions.MENU_BINDING,
                BindingOptions.REPEAT_IF_HELD,
                BindingOptions.RENDER_TICK,
                BindingOptions.CATEGORY_UI)));

    if (updateWithConfigFile)
      config.getJoypadSavedBindings(joyIndex, Controllers.getController(joyIndex).getName());

    List<ControllerBinding> userBindings = config.getUserDefinedBindings(joyIndex);

    for (ControllerBinding b : userBindings) {
      joyBindingsMap.put(b.inputString, b);
    }
  }