From d8ec5e21ff4759a54210791bd0de42bf46339ae3 Mon Sep 17 00:00:00 2001 From: Lynx Date: Thu, 2 Apr 2026 10:34:46 -0500 Subject: [PATCH 1/2] Derive inventory slot count from list (was hard-coded at 41) --- .../modernbeta/admintoolbox/managers/admin/AdminState.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java index 07821ab..9850f3b 100644 --- a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java +++ b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java @@ -65,12 +65,11 @@ static AdminState forPlayer(Player player) { } static AdminState fromConfig(UUID playerId, ConfigurationSection playerSection) { - final int PLAYER_INVENTORY_SLOTS = 41; - - ItemStack[] items = new ItemStack[PLAYER_INVENTORY_SLOTS]; + ItemStack[] items = new ItemStack[0]; if (playerSection.contains("inventory")) { List invList = playerSection.getList("inventory"); if (invList != null) { + items = new ItemStack[invList.size()]; for (int i = 0; i < invList.size(); i++) { Object obj = invList.get(i); if (obj == null) { From 7afc63dfd21c76c7b899fba833acec7ecea0a27b Mon Sep 17 00:00:00 2001 From: Lynx Date: Thu, 2 Apr 2026 14:42:08 -0500 Subject: [PATCH 2/2] improve inventory restore item count logic --- .../admintoolbox/managers/admin/AdminManager.java | 11 ++++++----- .../admintoolbox/managers/admin/AdminState.java | 11 ++++++++--- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java index 88d6904..91981e5 100644 --- a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java +++ b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminManager.java @@ -27,6 +27,7 @@ import org.modernbeta.admintoolbox.managers.admin.AdminState.TeleportHistory; import javax.annotation.Nullable; +import java.util.Arrays; import java.util.Map; import java.util.Optional; import java.util.UUID; @@ -178,14 +179,14 @@ public Optional getAdminState(OfflinePlayer player) { return Optional.ofNullable(adminStates.get(player.getUniqueId())); } - private @Nullable AdminState loadStateFromFile(UUID playerId) { + private @Nullable AdminState loadStateFromFile(Player player) { FileConfiguration state = plugin.getAdminStateConfig(); - if (!state.isConfigurationSection(playerId.toString())) return null; + if (!state.isConfigurationSection(player.getUniqueId().toString())) return null; - ConfigurationSection playerSection = state.getConfigurationSection(playerId.toString()); + ConfigurationSection playerSection = state.getConfigurationSection(player.getUniqueId().toString()); assert playerSection != null; - return AdminState.fromConfig(playerId, playerSection); + return AdminState.fromConfig(player, playerSection); } private CompletableFuture getNextLowestSafeLocation(Location location) { @@ -253,7 +254,7 @@ void onPluginDisable(PluginDisableEvent disableEvent) { @EventHandler(priority = EventPriority.HIGHEST) void onAdminJoin(PlayerJoinEvent joinEvent) { Player player = joinEvent.getPlayer(); - Optional.ofNullable(loadStateFromFile(player.getUniqueId())) + Optional.ofNullable(loadStateFromFile(player)) .ifPresent((state) -> { adminStates.put(player.getUniqueId(), state); diff --git a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java index 9850f3b..45f6bb9 100644 --- a/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java +++ b/src/main/java/org/modernbeta/admintoolbox/managers/admin/AdminState.java @@ -64,13 +64,18 @@ static AdminState forPlayer(Player player) { ); } - static AdminState fromConfig(UUID playerId, ConfigurationSection playerSection) { + static AdminState fromConfig(Player player, ConfigurationSection playerSection) { + UUID playerId = player.getUniqueId(); + ItemStack[] items = new ItemStack[0]; if (playerSection.contains("inventory")) { List invList = playerSection.getList("inventory"); if (invList != null) { - items = new ItemStack[invList.size()]; - for (int i = 0; i < invList.size(); i++) { + // NOTE: This is a hotfix for users who use plugins that change the inventory size + // from the vanilla default of 41. We used to hardcode this, it caused an + // exception when restoring. + items = new ItemStack[Math.min(invList.size(), player.getInventory().getContents().length)]; + for (int i = 0; i < items.length; i++) { Object obj = invList.get(i); if (obj == null) { items[i] = null; // preserve empty slots