From 948b0bc481fe1d9e1427d125d20f9b26488cbdff Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Sun, 2 Nov 2025 12:22:14 +0100 Subject: [PATCH] fixed team backpack gui issue --- .../command/RandomTeamsCommand.java | 108 +++++++++--------- .../forcebattle/game/GameListener.java | 4 + .../forcebattle/game/ObjectiveManager.java | 6 +- .../net/fameless/forcebattle/game/Team.java | 4 +- .../forcebattle/gui/ForceBattleGUI.java | 24 ++-- .../fameless/forcebattle/gui/GUIListener.java | 8 +- .../forcebattle/gui/impl/TeamBackpackGUI.java | 35 ++++-- .../forcebattle/player/BattlePlayer.java | 8 ++ 8 files changed, 124 insertions(+), 73 deletions(-) diff --git a/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java b/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java index d434192..a86c94d 100644 --- a/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java +++ b/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java @@ -36,78 +36,80 @@ protected void executeCommand(final CommandCaller caller, final String[] args) { return; } - if (args.length > 0 && !args[0].isEmpty()) { - int size; - try { - size = Integer.parseInt(args[0]); - } catch (NumberFormatException e) { - caller.sendMessage(Caption.of("command.not_a_number")); - return; - } + if (args.length == 0 || args[0].isEmpty()) { + sendUsage(caller); + return; + } - List players = new ArrayList<>(BattlePlayer.getOnlinePlayers()); - int playerAmount = players.size(); + int size; + try { + size = Integer.parseInt(args[0]); + } catch (NumberFormatException e) { + caller.sendMessage(Caption.of("command.not_a_number")); + return; + } - if (playerAmount % size != 0) { - caller.sendMessage(Caption.of("error.no_equal_teams")); - return; - } + List players = new ArrayList<>(BattlePlayer.getOnlinePlayers()); + int playerAmount = players.size(); - int amountOfTeams = playerAmount / size; + if (playerAmount % size != 0) { + caller.sendMessage(Caption.of("error.no_equal_teams")); + return; + } - if (args[1].equalsIgnoreCase("fillExistingTeams")) { - List existingTeams = new ArrayList<>(Team.teams); - Random random = new Random(); + int amountOfTeams = playerAmount / size; + Random random = new Random(); - for (Team team : existingTeams) { - for (BattlePlayer p : team.getPlayers()) { - players.remove(p); - } + if (args.length > 1 && args[1].equalsIgnoreCase("fillExistingTeams")) { + List existingTeams = new ArrayList<>(Team.teams); + + for (Team team : existingTeams) { + for (BattlePlayer p : team.getPlayers()) { + players.remove(p); } + } - for (Team team : existingTeams) { - while (team.getPlayers().size() > size) { - BattlePlayer removed = team.getPlayers().get(random.nextInt(team.getPlayers().size())); - team.removePlayer(removed); - players.add(removed); - } + for (Team team : existingTeams) { + while (team.getPlayers().size() > size) { + BattlePlayer removed = team.getPlayers().get(random.nextInt(team.getPlayers().size())); + team.removePlayer(removed); + players.add(removed); } + } - for (Team team : existingTeams) { - while (team.getPlayers().size() < size && !players.isEmpty()) { - BattlePlayer randomPlayer = players.remove(random.nextInt(players.size())); - team.addPlayer(randomPlayer); - } + for (Team team : existingTeams) { + while (team.getPlayers().size() < size && !players.isEmpty()) { + BattlePlayer randomPlayer = players.remove(random.nextInt(players.size())); + team.addPlayer(randomPlayer); } + } - while (!players.isEmpty()) { - BattlePlayer first = players.remove(random.nextInt(players.size())); - Team team = new Team(List.of(first)); + while (!players.isEmpty()) { + BattlePlayer first = players.remove(random.nextInt(players.size())); + Team team = new Team(List.of(first)); - while (team.getPlayers().size() < size && !players.isEmpty()) { - BattlePlayer next = players.remove(random.nextInt(players.size())); - team.addPlayer(next); - } + while (team.getPlayers().size() < size && !players.isEmpty()) { + BattlePlayer next = players.remove(random.nextInt(players.size())); + team.addPlayer(next); } - } else { - Team.deleteAll(); + } - Random random = new Random(); + } else { + Team.deleteAll(); - for (int i = 0; i < amountOfTeams; i++) { - BattlePlayer first = players.remove(random.nextInt(players.size())); - Team team = new Team(List.of(first)); + for (int i = 0; i < amountOfTeams; i++) { + BattlePlayer first = players.remove(random.nextInt(players.size())); + Team team = new Team(List.of(first)); - while (team.getPlayers().size() < size && !players.isEmpty()) { - BattlePlayer next = players.remove(random.nextInt(players.size())); - team.addPlayer(next); - } + while (team.getPlayers().size() < size && !players.isEmpty()) { + BattlePlayer next = players.remove(random.nextInt(players.size())); + team.addPlayer(next); } } - - caller.sendMessage(Caption.of("notification.randomteams_successfully_created", - TagResolver.resolver("amount", Tag.inserting(Component.text(String.valueOf(amountOfTeams)))))); } + + caller.sendMessage(Caption.of("notification.randomteams_successfully_created", + TagResolver.resolver("amount", Tag.inserting(Component.text(String.valueOf(amountOfTeams)))))); } @Override diff --git a/src/main/java/net/fameless/forcebattle/game/GameListener.java b/src/main/java/net/fameless/forcebattle/game/GameListener.java index f1f0117..886a3e4 100644 --- a/src/main/java/net/fameless/forcebattle/game/GameListener.java +++ b/src/main/java/net/fameless/forcebattle/game/GameListener.java @@ -367,6 +367,8 @@ public void onPlayerSkip(@NotNull PlayerInteractEvent event) { )); battlePlayer.updateObjective(true, true); + battlePlayer.addSkippedObjectiveToList(oldObjective); + decreaseItemAmount(event); if (oldObjective.getBattleType() == BattleType.FORCE_ITEM) { @@ -418,6 +420,8 @@ public void onTeamSkip(@NotNull PlayerInteractEvent event) { team.updateObjective(battlePlayer, true, true); + battlePlayer.addSkippedObjectiveToList(oldObjective); + decreaseItemAmount(event); if (oldObjective.getBattleType() == BattleType.FORCE_ITEM) { diff --git a/src/main/java/net/fameless/forcebattle/game/ObjectiveManager.java b/src/main/java/net/fameless/forcebattle/game/ObjectiveManager.java index 6f83ef6..37a58ac 100644 --- a/src/main/java/net/fameless/forcebattle/game/ObjectiveManager.java +++ b/src/main/java/net/fameless/forcebattle/game/ObjectiveManager.java @@ -104,9 +104,13 @@ private Objective generateObjective(BattleType battleType, BattlePlayer battlePl if (SettingsManager.isEnabled(SettingsManager.Setting.NO_DUPLICATE_OBJECTIVES)) { Set finished = new HashSet<>(); if (team == null || !battlePlayer.isInTeam()) { + battlePlayer.getSkippedObjectives().forEach(obj -> finished.add(obj.getObjectiveString())); Objective.finishedBy(battlePlayer).forEach(obj -> finished.add(obj.getObjectiveString())); } else { - team.getPlayers().forEach(p -> Objective.finishedBy(p).forEach(obj -> finished.add(obj.getObjectiveString()))); + for (BattlePlayer teammate : team.getPlayers()) { + teammate.getSkippedObjectives().forEach(obj -> finished.add(obj.getObjectiveString())); + Objective.finishedBy(teammate).forEach(obj -> finished.add(obj.getObjectiveString())); + } } allPossible.removeIf(finished::contains); } diff --git a/src/main/java/net/fameless/forcebattle/game/Team.java b/src/main/java/net/fameless/forcebattle/game/Team.java index 70565a0..2e2ec8d 100644 --- a/src/main/java/net/fameless/forcebattle/game/Team.java +++ b/src/main/java/net/fameless/forcebattle/game/Team.java @@ -210,10 +210,12 @@ public void createBackpackGUIs() { int requiredSlots = getPlayers().size() * SLOTS_PER_MEMBER; int requiredPages = (int) Math.ceil(requiredSlots / (double) MAX_PAGE_SIZE); + BACKPACK_INVENTORIES.clear(); + for (int i = 0; i < requiredPages; i++) { int pageSize = Math.min(MAX_PAGE_SIZE, requiredSlots - (i * MAX_PAGE_SIZE)); - BACKPACK_INVENTORIES.add(new TeamBackpackGUI(i, pageSize)); + BACKPACK_INVENTORIES.add(new TeamBackpackGUI(i, pageSize, this)); } } diff --git a/src/main/java/net/fameless/forcebattle/gui/ForceBattleGUI.java b/src/main/java/net/fameless/forcebattle/gui/ForceBattleGUI.java index fb39130..5ed56e2 100644 --- a/src/main/java/net/fameless/forcebattle/gui/ForceBattleGUI.java +++ b/src/main/java/net/fameless/forcebattle/gui/ForceBattleGUI.java @@ -21,9 +21,10 @@ public abstract class ForceBattleGUI implements Listener, InventoryHolder { protected String title; protected int size; protected final List items; - private Inventory inventory; - private BattlePlayer player; + + private final Set currentViewers = ConcurrentHashMap.newKeySet(); + private boolean hasFinishedLoading = false; public ForceBattleGUI(String title, int size) { @@ -122,11 +123,11 @@ public ItemStack getItem(BattlePlayer player) { } public void open(BattlePlayer player) { - this.player = player; Player p = player.getPlayer(); ForceBattleGUI previous = GUI_MAP.get(p.getUniqueId()); if (previous != null) { + previous.removeViewer(p.getUniqueId()); previous.onClose(new InventoryCloseEvent(p.getOpenInventory()), CloseReason.SERVER_EXITED); GUI_MAP.remove(p.getUniqueId()); } @@ -134,6 +135,9 @@ public void open(BattlePlayer player) { if (this.inventory == null) { this.inventory = Bukkit.createInventory(this, size, title); } + + // Add to viewers + this.currentViewers.add(p.getUniqueId()); GUI_MAP.put(p.getUniqueId(), this); try { @@ -151,11 +155,16 @@ public void open(BattlePlayer player) { } public void close(BattlePlayer player, CloseReason reason) { + UUID playerId = player.getPlayer().getUniqueId(); player.getPlayer().closeInventory(); onClose(new InventoryCloseEvent(player.getPlayer().getOpenInventory()), reason); - GUI_MAP.remove(player.getPlayer().getUniqueId()); + removeViewer(playerId); + GUI_MAP.remove(playerId); } + private void removeViewer(UUID playerId) { + currentViewers.remove(playerId); + } public void updateInventory(BattlePlayer player) { synchronized (items) { @@ -166,10 +175,9 @@ public void updateInventory(BattlePlayer player) { } } - public void setTitle(String title) { - this.title = title; - if (inventory != null) { - inventory = Bukkit.createInventory(this, size, title); + public void updateInventoryForPlayer(BattlePlayer player) { + Player bukkitPlayer = player.getPlayer(); + if (bukkitPlayer.getOpenInventory().getTopInventory().getHolder() == this) { updateInventory(player); } } diff --git a/src/main/java/net/fameless/forcebattle/gui/GUIListener.java b/src/main/java/net/fameless/forcebattle/gui/GUIListener.java index 046d43f..11ebafe 100644 --- a/src/main/java/net/fameless/forcebattle/gui/GUIListener.java +++ b/src/main/java/net/fameless/forcebattle/gui/GUIListener.java @@ -1,5 +1,7 @@ package net.fameless.forcebattle.gui; +import net.fameless.forcebattle.player.BattlePlayer; +import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryClickEvent; @@ -20,7 +22,11 @@ public void onClick(InventoryClickEvent event) { if (clicked instanceof GUIClickableItem clickable) { event.setCancelled(true); - clickable.onClick(event, gui.getPlayer()); + + Player player = (Player) event.getWhoClicked(); + BattlePlayer battlePlayer = BattlePlayer.adapt(player); + + clickable.onClick(event, battlePlayer); } } diff --git a/src/main/java/net/fameless/forcebattle/gui/impl/TeamBackpackGUI.java b/src/main/java/net/fameless/forcebattle/gui/impl/TeamBackpackGUI.java index d77a9f8..b048e9e 100644 --- a/src/main/java/net/fameless/forcebattle/gui/impl/TeamBackpackGUI.java +++ b/src/main/java/net/fameless/forcebattle/gui/impl/TeamBackpackGUI.java @@ -4,36 +4,53 @@ import net.fameless.forcebattle.game.Team; import net.fameless.forcebattle.gui.ForceBattleGUI; import net.fameless.forcebattle.gui.GUIClickableItem; +import net.fameless.forcebattle.gui.GUIItem; import net.fameless.forcebattle.player.BattlePlayer; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; public class TeamBackpackGUI extends ForceBattleGUI { - private final int index; + private final Team team; - - public TeamBackpackGUI(int index, int size) { + public TeamBackpackGUI(int index, int size, Team team) { super(Caption.getAsLegacy("gui.team_backpack_title", - TagResolver.resolver("page", Tag.inserting(Component.text(String.valueOf(index + 1))))), size); + TagResolver.resolver("page", Tag.inserting(Component.text(String.valueOf(index + 1))))), size); this.index = index; + this.team = team; } @Override public void setItems(final BattlePlayer player) { - Team team = player.getTeam(); int inventoryPages = team.getBACKPACK_INVENTORIES().size(); if (index < 0 || index >= inventoryPages) return; - if (index < inventoryPages - 1) { - set(GUIClickableItem.getGoForthItem(size - 1, team.getBACKPACK_INVENTORIES().get(index + 1))); + int nextArrowSlot = size - 1; + int prevArrowSlot = size - 9; + + synchronized (items) { + items.removeIf(item -> { + if (item.slot == nextArrowSlot || item.slot == prevArrowSlot) { + return item instanceof GUIClickableItem; + } + return false; + }); } - if (index > 0) { - set(GUIClickableItem.getGoBackItem(size - 9, team.getBACKPACK_INVENTORIES().get(index - 1))); + GUIItem nextItem = get(nextArrowSlot); + if (nextItem instanceof GUIClickableItem) { + getInventory().setItem(nextArrowSlot, null); } + + GUIItem prevItem = get(prevArrowSlot); + if (prevItem instanceof GUIClickableItem) { + getInventory().setItem(prevArrowSlot, null); + } + + if (index < inventoryPages - 1) set(GUIClickableItem.getGoForthItem(size - 1, team.getBACKPACK_INVENTORIES().get(index + 1))); + if (index > 0) set(GUIClickableItem.getGoBackItem(size - 9, team.getBACKPACK_INVENTORIES().get(index - 1))); } @Override diff --git a/src/main/java/net/fameless/forcebattle/player/BattlePlayer.java b/src/main/java/net/fameless/forcebattle/player/BattlePlayer.java index d26dcf4..4e4f3a5 100644 --- a/src/main/java/net/fameless/forcebattle/player/BattlePlayer.java +++ b/src/main/java/net/fameless/forcebattle/player/BattlePlayer.java @@ -54,6 +54,9 @@ public class BattlePlayer implements CommandCaller { @Getter private Objective objective; @Getter + @Setter + private List skippedObjectives = new ArrayList<>(); + @Getter private boolean excluded; @Getter @Setter @@ -277,6 +280,7 @@ public void reset(boolean newObjective) { this.points = 0; this.chainProgress = 0; + this.skippedObjectives = new ArrayList<>(); if (this.isInTeam()) { this.getTeam().setChainProgress(0); } @@ -329,6 +333,10 @@ public boolean hasPermission(@NotNull String permission) { return getPlayer().hasPermission(permission); } + public void addSkippedObjectiveToList(Objective objective) { + skippedObjectives.add(objective); + } + public void addPlayerSkip(final int amount) { if (getPlayer() == null) { return;