From 2ec54715a1fc2ad5f25ab0555698160bb8eae46f Mon Sep 17 00:00:00 2001 From: ItzKatze <136186750+ItzKatze@users.noreply.github.com> Date: Fri, 31 Oct 2025 14:24:16 +0100 Subject: [PATCH] some fixes --- README.md | 34 +++--- .../command/RandomTeamsCommand.java | 64 ++++++++-- .../forcebattle/command/ResultCommand.java | 1 + .../forcebattle/command/SkipCommand.java | 2 +- .../forcebattle/game/GameListener.java | 37 ++++++ .../forcebattle/game/NametagManager.java | 111 +++++++++++------- .../fameless/forcebattle/game/Objective.java | 30 ++--- .../gui/impl/CraftingRecipeGUI.java | 8 +- .../forcebattle/gui/impl/ResultGUI.java | 55 ++++++--- src/main/resources/config.yml | 1 + 10 files changed, 232 insertions(+), 111 deletions(-) diff --git a/README.md b/README.md index 4eab072..034f948 100644 --- a/README.md +++ b/README.md @@ -39,23 +39,23 @@ Objective types can be enabled or disabled individually via the plugin's setting ### 📋 Commands -| Command | Description | -|:----------------------------|:------------------------------------------------------| -| `/backpack` | Opens the personal or team backpack (can be disabled) | -| `/displayresults` | Show the final leaderboard (player, team) | -| `/exclude ` | Exclude a player from the battle | -| `/help` | Display a list of available commands | -| `/joker ` | Adjust jokers for a player | -| `/language` | Open the language selection menu | -| `/points ` | Modify a player's points | -| `/randomteams ` | Creates random teams with a specific size | -| `/recipe ` | Displays the recipe of an item | -| `/reset [player]` | Reset the battle or a specific player | -| `/result ` | Show detailed results for a player | -| `/settings` | Open the plugin's settings menu | -| `/skip ` | Skip a player's current objective (for admins) | -| `/team` | Manage teams | -| `/timer` | Control the timer (start, stop, set duration) | +| Command | Description | +|:---------------------------------|:------------------------------------------------------| +| `/backpack` | Opens the personal or team backpack (can be disabled) | +| `/displayresults` | Show the final leaderboard (player, team) | +| `/exclude ` | Exclude a player from the battle | +| `/help` | Display a list of available commands | +| `/joker ` | Adjust jokers for a player | +| `/language` | Open the language selection menu | +| `/points ` | Modify a player's points | +| `/randomteams ` | Creates random teams with a specific size | +| `/recipe ` | Displays the recipe of an item | +| `/reset [player]` | Reset the battle or a specific player | +| `/result ` | Show detailed results for a player | +| `/settings` | Open the plugin's settings menu | +| `/skip ` | Skip a player's current objective (for admins) | +| `/team` | Manage teams | +| `/timer` | Control the timer (start, stop, set duration) | --- diff --git a/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java b/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java index b2686da..d434192 100644 --- a/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java +++ b/src/main/java/net/fameless/forcebattle/command/RandomTeamsCommand.java @@ -7,6 +7,7 @@ import net.fameless.forcebattle.command.framework.CommandCaller; import net.fameless.forcebattle.game.Team; import net.fameless.forcebattle.player.BattlePlayer; +import net.fameless.forcebattle.util.StringUtility; import net.kyori.adventure.text.Component; import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; @@ -22,7 +23,7 @@ public RandomTeamsCommand() { "randomteams", List.of(), CallerType.PLAYER, - "/randomteams ", + "/randomteams ", "forcebattle.randomteams", "Command to create random teams." ); @@ -36,8 +37,6 @@ protected void executeCommand(final CommandCaller caller, final String[] args) { } if (args.length > 0 && !args[0].isEmpty()) { - Team.deleteAll(); - int size; try { size = Integer.parseInt(args[0]); @@ -54,19 +53,55 @@ protected void executeCommand(final CommandCaller caller, final String[] args) { return; } - Random random = new Random(); int amountOfTeams = playerAmount / size; - for (int i = 0; i < amountOfTeams; i++) { - BattlePlayer player = players.get(random.nextInt(players.size())); - players.remove(player); - Team team = new Team(List.of(player)); + if (args[1].equalsIgnoreCase("fillExistingTeams")) { + List existingTeams = new ArrayList<>(Team.teams); + Random random = new Random(); + + for (Team team : existingTeams) { + for (BattlePlayer p : team.getPlayers()) { + players.remove(p); + } + } - for (int j = 0; j < size; j++) { - if (team.getPlayers().size() == size) break; - BattlePlayer newPlayer = players.get(random.nextInt(players.size())); - team.addPlayer(newPlayer); - players.remove(newPlayer); + 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); + } + } + + 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); + } + } + } else { + Team.deleteAll(); + + Random random = new Random(); + + 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); + } } } @@ -77,6 +112,9 @@ protected void executeCommand(final CommandCaller caller, final String[] args) { @Override protected List tabComplete(final CommandCaller caller, final String[] args) { + if (args.length == 2) { + return StringUtility.copyPartialMatches(args[1], List.of("fillExistingTeams"), new ArrayList<>()); + } return List.of(); } } diff --git a/src/main/java/net/fameless/forcebattle/command/ResultCommand.java b/src/main/java/net/fameless/forcebattle/command/ResultCommand.java index 8bd6a64..8a10250 100644 --- a/src/main/java/net/fameless/forcebattle/command/ResultCommand.java +++ b/src/main/java/net/fameless/forcebattle/command/ResultCommand.java @@ -96,6 +96,7 @@ public void executeCommand(@NotNull CommandCaller caller, String[] args) { return; } Team team = Team.getPlaces().get(place); + if (team == null) return; for (BattlePlayer player : BattlePlayer.getOnlinePlayers()) { new ResultGUI(team, true).open(player); } diff --git a/src/main/java/net/fameless/forcebattle/command/SkipCommand.java b/src/main/java/net/fameless/forcebattle/command/SkipCommand.java index de276a2..08b39c7 100644 --- a/src/main/java/net/fameless/forcebattle/command/SkipCommand.java +++ b/src/main/java/net/fameless/forcebattle/command/SkipCommand.java @@ -24,7 +24,7 @@ public SkipCommand() { "skip", List.of(), CallerType.NONE, - "/skip ", + "/skip ", "forcebattle.skip", "Command to skip a player's objective - meant for admins if an item is unobtainable" ); diff --git a/src/main/java/net/fameless/forcebattle/game/GameListener.java b/src/main/java/net/fameless/forcebattle/game/GameListener.java index 9784739..f1f0117 100644 --- a/src/main/java/net/fameless/forcebattle/game/GameListener.java +++ b/src/main/java/net/fameless/forcebattle/game/GameListener.java @@ -4,6 +4,8 @@ import net.fameless.forcebattle.caption.Caption; import net.fameless.forcebattle.configuration.PluginUpdater; import net.fameless.forcebattle.configuration.SettingsManager; +import net.fameless.forcebattle.event.PlayerTeamJoinEvent; +import net.fameless.forcebattle.event.PlayerTeamLeaveEvent; import net.fameless.forcebattle.event.TimerEndEvent; import net.fameless.forcebattle.event.TimerStartEvent; import net.fameless.forcebattle.game.tasks.AdvancementTask; @@ -44,6 +46,7 @@ import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerJoinEvent; +import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.ItemStack; @@ -76,6 +79,10 @@ public GameListener() { TaskManager.startAll(); } + //TODO "waiting" flickert im nametag + //TODO backpack buggt wohl bisl => man kann nicht pages switchen wenn jemand anders drin ist + //TODO randomteams command should fill already existing teams + @EventHandler public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { if (ForceBattle.getTimer().isRunning()) { @@ -119,6 +126,8 @@ public void onPlayerLogin(AsyncPlayerPreLoginEvent event) { public void onPlayerJoin(@NotNull PlayerJoinEvent event) { BattlePlayer battlePlayer = BattlePlayer.adapt(event.getPlayer()); + updateAllTablists(); + if (!ForceBattle.getTimer().isRunning() && startPhase) { if (!spawnCreated) { StructureUtil.createSpawn(); @@ -140,6 +149,11 @@ public void onPlayerJoin(@NotNull PlayerJoinEvent event) { } } + @EventHandler + public void onPlayerLeave(PlayerQuitEvent event) { + updateAllTablists(); + } + @EventHandler public void onGameStart(TimerStartEvent event) throws IOException { startPhase = false; @@ -164,6 +178,8 @@ public void onGameStart(TimerStartEvent event) throws IOException { } } + updateAllTablists(); + for (BattlePlayer player : BattlePlayer.getOnlinePlayers()) { if (player.getPlayer() == null) return; @@ -223,6 +239,16 @@ public void onHungerChange(FoodLevelChangeEvent event) { } } + @EventHandler + public void onTeamJoin(PlayerTeamJoinEvent event) { + updateAllTablists(); + } + + @EventHandler + public void onTeamLeave(PlayerTeamLeaveEvent event) { + updateAllTablists(); + } + @EventHandler public void onEntityDamageByEntity(EntityDamageByEntityEvent event) { if (!SettingsManager.isEnabled(SettingsManager.Setting.FORCE_MOB)) return; @@ -247,7 +273,18 @@ public void onPlayerDamage(EntityDamageEvent event) { } } + private void updateAllTablists() { + BattlePlayer.getOnlinePlayers().forEach(player -> { + if (player.isInTeam()) { + player.getPlayer().setPlayerListOrder(player.getTeam().getId()); + } else { + player.getPlayer().setPlayerListOrder(999); + } + }); + } + private void checkPlayerObjective(BattlePlayer battlePlayer, LivingEntity target) { + if (battlePlayer.getObjective() == null) return; if (battlePlayer.getObjective().getBattleType() != BattleType.FORCE_MOB) return; String objective = battlePlayer.getObjective().getObjectiveString(); diff --git a/src/main/java/net/fameless/forcebattle/game/NametagManager.java b/src/main/java/net/fameless/forcebattle/game/NametagManager.java index 3a1550b..dbbe5a3 100644 --- a/src/main/java/net/fameless/forcebattle/game/NametagManager.java +++ b/src/main/java/net/fameless/forcebattle/game/NametagManager.java @@ -16,8 +16,14 @@ import org.bukkit.scoreboard.Team; import org.jetbrains.annotations.NotNull; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + public class NametagManager { + private static final Map> lastSuffixes = new ConcurrentHashMap<>(); + public static void runTask() { Bukkit.getScheduler().runTaskTimer(ForceBattle.get(), () -> BattlePlayer.BATTLE_PLAYERS.forEach(NametagManager::updateNametag), 0, 3); @@ -28,6 +34,7 @@ private static void updateNametag(@NotNull BattlePlayer battlePlayer) { if (player == null) return; Scoreboard scoreboard = ScoreboardManager.getOrCreateScoreboard(battlePlayer); + Map cache = lastSuffixes.computeIfAbsent(battlePlayer.getUuid(), u -> new ConcurrentHashMap<>()); for (BattlePlayer targetPlayer : BattlePlayer.BATTLE_PLAYERS) { Player target = targetPlayer.getPlayer(); @@ -36,64 +43,78 @@ private static void updateNametag(@NotNull BattlePlayer battlePlayer) { Team team = scoreboard.getTeam(targetPlayer.getUuid().toString()); if (team == null) { team = scoreboard.registerNewTeam(targetPlayer.getUuid().toString()); + } + if (!team.hasEntry(targetPlayer.getName())) { team.addEntry(targetPlayer.getName()); } - StringBuilder suffix = new StringBuilder(" "); + String newSuffix = buildSuffix(targetPlayer); + String oldSuffix = team.getSuffix(); + + if (!newSuffix.equals(oldSuffix)) { + team.setSuffix(newSuffix); + cache.put(targetPlayer.getUuid(), newSuffix); + } + } + + player.setScoreboard(scoreboard); + } + + private static String buildSuffix(@NotNull BattlePlayer targetPlayer) { + StringBuilder suffix = new StringBuilder(" "); + + if (targetPlayer.isExcluded()) { + suffix.append(Caption.getAsLegacy("excluded")); + } else if (!ForceBattle.getTimer().isRunning()) { + suffix.append(Caption.getAsLegacy("waiting")); + } + + Objective objective = targetPlayer.getObjective(); + if (objective == null && targetPlayer.isInTeam()) { + objective = targetPlayer.getTeam().getObjective(); + } - if (targetPlayer.isExcluded()) { - suffix.append(Caption.getAsLegacy("excluded")); - } else if (!ForceBattle.getTimer().isRunning()) { - suffix.append(Caption.getAsLegacy("waiting")); + if (objective != null) { + String objectiveString; + if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) { + objectiveString = advancement.name; + } else { + objectiveString = StringUtility.formatName(objective.getObjectiveString()); } - Objective objective = targetPlayer.getObjective(); - if (objective == null && targetPlayer.isInTeam()) { - objective = targetPlayer.getTeam().getObjective(); + boolean hideObjectives = SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES); + boolean hidePoints = SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS); + + if (!hideObjectives) { + suffix.append(" ") + .append(ChatColor.GRAY) + .append(objective.getBattleType().getPrefix()) + .append(ChatColor.DARK_GRAY) + .append(" » ") + .append(ChatColor.BLUE) + .append(objectiveString); } - if (objective != null) { - String objectiveString; - if (BukkitUtil.convertObjective(BattleType.FORCE_ADVANCEMENT, objective.getObjectiveString()) instanceof FBAdvancement advancement) { - objectiveString = advancement.name; - } else { - objectiveString = StringUtility.formatName(objective.getObjectiveString()); - } - - boolean hideObjectives = SettingsManager.isEnabled(SettingsManager.Setting.HIDE_OBJECTIVES); - boolean hidePoints = SettingsManager.isEnabled(SettingsManager.Setting.HIDE_POINTS); - - if (!hideObjectives) { - suffix.append(" ") - .append(ChatColor.GRAY) - .append(objective.getBattleType().getPrefix()) - .append(ChatColor.DARK_GRAY) - .append(" » ") - .append(ChatColor.BLUE) - .append(objectiveString); - } - - if (!hideObjectives && !hidePoints) { - suffix.append(ChatColor.DARK_GRAY).append(" |"); - } - - if (!hidePoints) { - suffix.append(" ").append(ChatColor.GRAY).append("Points") - .append(ChatColor.DARK_GRAY).append(" » ") - .append(ChatColor.BLUE).append(targetPlayer.getPoints()); - } + if (!hideObjectives && !hidePoints) { + suffix.append(ChatColor.DARK_GRAY).append(" |"); } - var teamData = targetPlayer.getTeam(); - if (teamData != null) { - suffix.append(ChatColor.DARK_GRAY).append(" | ").append(ChatColor.GRAY) - .append("Team").append(ChatColor.DARK_GRAY).append(" » ") - .append(ChatColor.BLUE).append(teamData.getId()); + if (!hidePoints) { + suffix.append(" ") + .append(ChatColor.GRAY).append("Points") + .append(ChatColor.DARK_GRAY).append(" » ") + .append(ChatColor.BLUE).append(targetPlayer.getPoints()); } + } - team.setSuffix(suffix.toString()); + var teamData = targetPlayer.getTeam(); + if (teamData != null) { + suffix.append(ChatColor.DARK_GRAY).append(" | ") + .append(ChatColor.GRAY).append("Team") + .append(ChatColor.DARK_GRAY).append(" » ") + .append(ChatColor.BLUE).append(teamData.getId()); } - player.setScoreboard(scoreboard); + return suffix.toString(); } } diff --git a/src/main/java/net/fameless/forcebattle/game/Objective.java b/src/main/java/net/fameless/forcebattle/game/Objective.java index 68f4477..13a0529 100644 --- a/src/main/java/net/fameless/forcebattle/game/Objective.java +++ b/src/main/java/net/fameless/forcebattle/game/Objective.java @@ -8,9 +8,8 @@ import org.jetbrains.annotations.NotNull; import java.util.ArrayList; -import java.util.HashSet; +import java.util.Comparator; import java.util.List; -import java.util.Set; public class Objective { @@ -31,24 +30,19 @@ public Objective(BattleType battleType, String objectiveString) { objectives.add(this); } - public static @NotNull Set finishedBy(BattlePlayer battlePlayer) { - Set byPlayer = new HashSet<>(); - for (Objective o : objectives) { - if (o.isFinished() && o.whoFinished.equals(battlePlayer)) { - byPlayer.add(o); - } - } - return byPlayer; + public static @NotNull List finishedBy(BattlePlayer battlePlayer) { + return objectives.stream() + .filter(Objective::isFinished) + .filter(o -> o.whoFinished.equals(battlePlayer)) + .sorted(Comparator.comparingInt(Objective::getTime).reversed()) + .toList(); } - public static @NotNull Set finished() { - Set finished = new HashSet<>(); - for (Objective o : objectives) { - if (o.isFinished()) { - finished.add(o); - } - } - return finished; + public static @NotNull List finished() { + return objectives.stream() + .filter(Objective::isFinished) + .sorted(Comparator.comparingInt(Objective::getTime).reversed()) + .toList(); } public void delete() { diff --git a/src/main/java/net/fameless/forcebattle/gui/impl/CraftingRecipeGUI.java b/src/main/java/net/fameless/forcebattle/gui/impl/CraftingRecipeGUI.java index 067a1f7..be7b935 100644 --- a/src/main/java/net/fameless/forcebattle/gui/impl/CraftingRecipeGUI.java +++ b/src/main/java/net/fameless/forcebattle/gui/impl/CraftingRecipeGUI.java @@ -13,6 +13,7 @@ import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import org.bukkit.Bukkit; import org.bukkit.Material; +import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.inventory.*; import org.bukkit.inventory.meta.ItemMeta; @@ -219,7 +220,12 @@ private void centerAndPlaceGrid(ItemStack[] grid) { int guiSlot = GRID_SLOTS[row * 3 + col]; final ItemStack finalIngredient = ingredient; - set(new GUIItem(guiSlot) { + set(new GUIClickableItem(guiSlot) { + @Override + public void run(final InventoryClickEvent event, final BattlePlayer player) { + new CraftingRecipeGUI(finalIngredient).open(player); + } + @Override public ItemStack getItem(BattlePlayer player) { return finalIngredient; diff --git a/src/main/java/net/fameless/forcebattle/gui/impl/ResultGUI.java b/src/main/java/net/fameless/forcebattle/gui/impl/ResultGUI.java index fe400a2..fba8301 100644 --- a/src/main/java/net/fameless/forcebattle/gui/impl/ResultGUI.java +++ b/src/main/java/net/fameless/forcebattle/gui/impl/ResultGUI.java @@ -37,34 +37,50 @@ public class ResultGUI extends ForceBattleGUI { private final Team targetTeam; private final boolean animated; + private final boolean skipLoad; private final Map playerPageCache = new HashMap<>(); private final Map> objectiveList = new HashMap<>(); private final Map activeAnimations = new HashMap<>(); - public ResultGUI(ResultType resultType, int page, BattlePlayer targetPlayer, Team targetTeam, boolean animated) { + public ResultGUI(ResultType resultType, int page, BattlePlayer targetPlayer, Team targetTeam, boolean animated, boolean skipLoad) { super(generateTitle(resultType, targetPlayer, targetTeam, animated), 54); this.page = page; this.resultType = resultType; this.targetPlayer = targetPlayer; this.targetTeam = targetTeam; this.animated = animated; + this.skipLoad = skipLoad; + } + + public ResultGUI(ResultType resultType, int page, BattlePlayer targetPlayer, Team targetTeam, boolean animated) { + this(resultType, page, targetPlayer, targetTeam, animated, false); } public ResultGUI(BattlePlayer targetPlayer, boolean animated) { - this(ResultType.PLAYER, 1, targetPlayer, null, animated); + this(ResultType.PLAYER, 1, targetPlayer, null, animated, false); } public ResultGUI(Team targetTeam, boolean animated) { - this(ResultType.TEAM, 1, null, targetTeam, animated); + this(ResultType.TEAM, 1, null, targetTeam, animated, false); } public ResultGUI() { - this(ResultType.ALL, 1, null, null, false); + this(ResultType.ALL, 1, null, null, false, false); } @Override public void open(BattlePlayer viewer) { + if (skipLoad) { + super.open(viewer); + + List objectives = objectiveList.get(viewer); + if (objectives == null) return; + + if (!animated) setItems(viewer); + return; + } + Collection collection = switch (resultType) { case PLAYER -> Objective.finishedBy(targetPlayer); case TEAM -> ResultCommandUtils.combineTeamObjectives(targetTeam); @@ -77,18 +93,15 @@ public void open(BattlePlayer viewer) { super.open(viewer); - if (animated) { - startAnimation(viewer, objectives); - } else { - setItems(viewer); - } + if (animated) startAnimation(viewer, objectives, 0); + else setItems(viewer); } - private void startAnimation(BattlePlayer viewer, List objectives) { + private void startAnimation(BattlePlayer viewer, List objectives, int startIndex) { fill(ItemStackCreator.fillerItem()); BukkitRunnable task = new BukkitRunnable() { - int index = 0; + int index = startIndex; @Override public void run() { @@ -113,9 +126,23 @@ public void run() { return; } + int currentPage = (index / SPACES_ON_PAGE) + 1; int slot = 9 + (index % SPACES_ON_PAGE); + Objective objective = objectives.get(index); + if (currentPage != page) { + ResultGUI nextPageGUI = new ResultGUI(resultType, currentPage, targetPlayer, targetTeam, true, true); + nextPageGUI.objectiveList.put(viewer, objectives); + nextPageGUI.playerPageCache.put(viewer, currentPage); + + nextPageGUI.open(viewer); + nextPageGUI.startAnimation(viewer, objectives, index); + + cancel(); + return; + } + set(new GUIItem(slot) { @Override public ItemStack getItem(BattlePlayer player) { @@ -125,11 +152,6 @@ public ItemStack getItem(BattlePlayer player) { updateInventory(viewer); index++; - - if (index % SPACES_ON_PAGE == 0 && index < objectives.size()) { - new ResultGUI(resultType, page + 1, targetPlayer, targetTeam, true).open(viewer); - cancel(); - } } }; @@ -256,6 +278,7 @@ public static class ResultCommandUtils { public static @NotNull List combineTeamObjectives(@NotNull Team team) { List objectives = new ArrayList<>(); team.getPlayers().forEach(teamPlayer -> objectives.addAll(Objective.finishedBy(teamPlayer))); + objectives.sort(Comparator.comparingInt(Objective::getTime).reversed()); return objectives; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 2969859..e091b03 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -42,6 +42,7 @@ exclude: - DEBUG_STICK - FARMLAND - STRUCTURE_BLOCK + - TEST_BLOCK - BUBBLE_COLUMN - CAVE_AIR - KNOWLEDGE_BOOK