From bc8938a208222b38e5a20a046e4ff9cf91ef9f12 Mon Sep 17 00:00:00 2001 From: Krakenied Date: Wed, 8 Feb 2023 15:37:27 +0100 Subject: Fix ArrayIndexOutOfBoundsException Do not show back menu element when category menu is null --- .../java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java | 7 ++++--- .../java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java | 4 +++- .../main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java | 5 +++++ 3 files changed, 12 insertions(+), 4 deletions(-) (limited to 'bukkit/src/main') diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java index dd094855..2c6a03ae 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/PaginatedQMenu.java @@ -3,6 +3,7 @@ package com.leonardobishop.quests.bukkit.menu; import com.leonardobishop.quests.bukkit.BukkitQuestsPlugin; import com.leonardobishop.quests.bukkit.config.BukkitQuestsConfig; import com.leonardobishop.quests.bukkit.menu.element.*; +import com.leonardobishop.quests.bukkit.util.MenuUtils; import com.leonardobishop.quests.bukkit.util.StringUtils; import com.leonardobishop.quests.common.player.QPlayer; import org.bukkit.Bukkit; @@ -106,7 +107,7 @@ public abstract class PaginatedQMenu extends QMenu { int maxSize = pageSize - (backMenuElement == null ? 0 : 9); BukkitQuestsConfig config = (BukkitQuestsConfig) plugin.getQuestsConfig(); if ((menuElements.isEmpty() ? 0 : Collections.max(menuElements.keySet())) + 1 > maxSize - || menuElements.keySet().size() + menuElementsToFill.size() + customStaticElements > maxSize) { + || menuElements.size() + menuElementsToFill.size() + customStaticElements > maxSize) { MenuElement pageNextMenuElement = new PageNextMenuElement(config, this); MenuElement pagePrevMenuElement = new PagePrevMenuElement(config, this); MenuElement pageDescMenuElement = new PageDescMenuElement(config, this); @@ -122,8 +123,8 @@ public abstract class PaginatedQMenu extends QMenu { // else find a place for the back button if needed } else if (backMenuElement != null) { - int row = ((menuElements.keySet().size() + menuElementsToFill.size() + customStaticElements) / 9) + 1; - staticMenuElements[row * 9] = backMenuElement; + int slot = MenuUtils.getHigherOrEqualMultiple(menuElements.size() + menuElementsToFill.size() + customStaticElements, 9); + staticMenuElements[slot] = backMenuElement; } boolean staticMenuElementsIsFull = true; diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java index a33f344f..2e8e1875 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/menu/QuestQMenu.java @@ -29,7 +29,9 @@ public class QuestQMenu extends PaginatedQMenu { BukkitQuestsConfig config = (BukkitQuestsConfig) plugin.getQuestsConfig(); this.categoryName = categoryName; - MenuElement backMenuElement = new BackMenuElement(config, owner.getPlayerUUID(), plugin.getMenuController(), categoryQMenu); + MenuElement backMenuElement = categoryQMenu != null + ? new BackMenuElement(config, owner.getPlayerUUID(), plugin.getMenuController(), categoryQMenu) + : null; List filteredQuests = new ArrayList<>(); for (Quest quest : quests) { diff --git a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java index 48840201..d5c042c0 100644 --- a/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java +++ b/bukkit/src/main/java/com/leonardobishop/quests/bukkit/util/MenuUtils.java @@ -143,4 +143,9 @@ public class MenuUtils { return placeholders; } + public static int getHigherOrEqualMultiple(int num, int base) { + int r = num % base; + return r == 0 ? num : num + base - r; + } + } -- cgit v1.2.3-70-g09d2