From 478f0e0bbc9b907fbee2657e41fdb5086eeb2a9f Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Sat, 3 May 2025 13:06:59 +0000 Subject: [PATCH 01/53] Bump version from 5.0.15 to 5.0.15-SNAPSHOT0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 107188ae..4a0ae76a 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15 + 5.0.15-SNAPSHOT0 BuildBattle From 753c683c3f1be2a2a122e8a47aaf20c28f1de18a Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Tue, 6 May 2025 21:40:58 +0200 Subject: [PATCH 02/53] Fixed NPE AddGoBackButton --- .../projects/buildbattle/handlers/menu/OptionsRegistry.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/OptionsRegistry.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/OptionsRegistry.java index 68af2b9d..d855073b 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/OptionsRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/OptionsRegistry.java @@ -194,7 +194,9 @@ public void addGoBackItem(NormalFastInv gui, int slot) { } public void addGoBackItem(PaginatedFastInv gui, int slot) { - gui.setItem(slot, backButton.build(), event -> { + gui.setItem(slot, new ItemBuilder(XMaterial.STONE_BUTTON.parseItem()) + .name(new MessageBuilder("MENU_BUTTONS_BACK_ITEM_NAME").asKey().build()) + .lore(new MessageBuilder("MENU_BUTTONS_BACK_ITEM_LORE").asKey().build()).build(), event -> { event.setCancelled(true); event.getWhoClicked().closeInventory(); getOptionsGui().open(event.getWhoClicked()); From 45563d1e520d55f13fe0e9b78b7b3e5dd3521a05 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Tue, 6 May 2025 19:41:20 +0000 Subject: [PATCH 03/53] Bump version from 5.0.15-SNAPSHOT0 to 5.0.15-SNAPSHOT1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 4a0ae76a..e0fe29de 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT0 + 5.0.15-SNAPSHOT1 BuildBattle From e995bac9c41ee8e2c1425e3cc0e4d740e9613d23 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 18:21:22 +0200 Subject: [PATCH 04/53] Fixed on Plotreset time did not update to world time --- .../plugily/projects/buildbattle/arena/managers/plots/Plot.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java b/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java index 65c47f4d..7c28c0ff 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java +++ b/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java @@ -191,6 +191,7 @@ public void resetPlot() { setWeatherType(p.getPlayerWeather()); p.resetPlayerTime(); } + setTime(Time.WORLD_TIME); World centerWorld = cuboid.getCenter().getWorld(); From decd821a8ee30207e2834819609fcd8783f02f90 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 18:33:46 +0200 Subject: [PATCH 05/53] Fixed Player Outside Plot interaction with blocks were possible --- .../buildbattle/arena/ArenaEvents.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index bd329f20..5de2ef77 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -91,6 +91,24 @@ public void onBreak(BlockBreakEvent event) { event.setCancelled(true); } + @EventHandler + public void onOutSidePlotInteract(PlugilyPlayerInteractEvent event) { + if(event.getClickedBlock() == null) { + return; + } + BaseArena arena = plugin.getArenaRegistry().getArena(event.getPlayer()); + if(arena == null) { + return; + } + if(arena.getArenaState() != IArenaState.IN_GAME) { + return; + } + Plot buildPlot = arena.getPlotManager().getPlot(event.getPlayer()); + if(buildPlot != null && buildPlot.getCuboid() != null && !buildPlot.getCuboid().isIn(event.getClickedBlock().getLocation())) { + event.setCancelled(true); + } + } + @EventHandler(priority = EventPriority.HIGH) public void onItemSpawn(ItemSpawnEvent event) { if (!plugin.getArenaRegistry().getArenaWorlds().contains(event.getLocation().getWorld())) { From c353086c06cee3005ba4e5b661f5700f2eec7ab4 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 18:37:03 +0200 Subject: [PATCH 06/53] Fixed Time.Changed message did not translate placeholder into language.yml content. --- .../buildbattle/handlers/menu/registry/TimeChangeOption.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/TimeChangeOption.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/TimeChangeOption.java index fc0c08c7..11d6d18e 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/TimeChangeOption.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/TimeChangeOption.java @@ -87,7 +87,7 @@ private void addClockItem(NormalFastInv gui, Plot plot, String messageKey) { for(Player p : plot.getMembers()) { p.setPlayerTime(Plot.Time.format(time, p.getWorld().getTime()), false); - new MessageBuilder("MENU_OPTION_CONTENT_TIME_CHANGED").asKey().player(p).value(time.name()).sendPlayer(); + new MessageBuilder("MENU_OPTION_CONTENT_TIME_CHANGED").asKey().player(p).value(new MessageBuilder(messageKey).asKey().build()).sendPlayer(); } })); } From 6bd13f44b8ce97da5fbdfd2898bb9255f57ea907 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 19 May 2025 16:38:08 +0000 Subject: [PATCH 07/53] Bump version from 5.0.15-SNAPSHOT1 to 5.0.15-SNAPSHOT2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index e0fe29de..292a0e75 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT1 + 5.0.15-SNAPSHOT2 BuildBattle From c165f338765a4602e211a67eab4913c21f7e9904 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 19:09:21 +0200 Subject: [PATCH 08/53] Fixed none builder Players of GTB didn't got the builder set weather and time --- pom.xml | 2 +- .../java/plugily/projects/buildbattle/arena/BaseArena.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 292a0e75..6b5853bb 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.1 + 1.4.1-SNAPSHOT5 compile true diff --git a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java index 9c3c3cad..47163d1b 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java @@ -179,7 +179,8 @@ public final void checkPlayerOutSidePlot() { if(this instanceof BuildArena) { buildPlot = getPlotFromPlayer(player); - } else if(this instanceof GuessArena && (buildPlot = getPlotFromPlayer(player)) != null) { + } else if(this instanceof GuessArena) { + buildPlot = ((GuessArena) this).getBuildPlot(); player.setPlayerWeather(buildPlot.getWeatherType()); player.setPlayerTime(Plot.Time.format(buildPlot.getTime(), player.getWorld().getTime()), false); } From a03d222c8e5ecc82951decab79d15374bcf94993 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 19:56:57 +0200 Subject: [PATCH 09/53] Allow Plot selection also if ArenaState is FULL_GAME --- .../commands/arguments/admin/plot/SelectPlotArgument.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/plot/SelectPlotArgument.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/plot/SelectPlotArgument.java index 7c95b451..33858b24 100644 --- a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/plot/SelectPlotArgument.java +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/plot/SelectPlotArgument.java @@ -41,7 +41,7 @@ public void execute(CommandSender sender, String[] args) { Player player = (Player) sender; BaseArena arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena(player); - if(arena != null && (arena.getArenaState() == IArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == IArenaState.STARTING)) + if(arena != null && (arena.getArenaState() == IArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == IArenaState.STARTING || arena.getArenaState() == IArenaState.FULL_GAME)) arena.getPlugin().getPlotMenuHandler().createMenu(player, arena); } }); From f7b705b75680b49d8de78471b7cc0d3292147478 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 19:57:23 +0200 Subject: [PATCH 10/53] Fixed resetPlayerWeather did not change the weather --- .../projects/buildbattle/arena/managers/plots/Plot.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java b/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java index 7c28c0ff..31c9fb1b 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java +++ b/src/main/java/plugily/projects/buildbattle/arena/managers/plots/Plot.java @@ -187,11 +187,11 @@ public void resetPlot() { particles.clear(); for(Player p : members) { - p.resetPlayerWeather(); - setWeatherType(p.getPlayerWeather()); + p.setPlayerWeather(WeatherType.CLEAR); p.resetPlayerTime(); } setTime(Time.WORLD_TIME); + setWeatherType(WeatherType.CLEAR); World centerWorld = cuboid.getCenter().getWorld(); From ced80d45feb4e1c9bbee595ebcc15dce2bb8162b Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 20:23:10 +0200 Subject: [PATCH 11/53] Fixed clickable ground items due to new outside plot interaction check --- .../java/plugily/projects/buildbattle/arena/ArenaEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index 5de2ef77..8f532ee0 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -104,7 +104,7 @@ public void onOutSidePlotInteract(PlugilyPlayerInteractEvent event) { return; } Plot buildPlot = arena.getPlotManager().getPlot(event.getPlayer()); - if(buildPlot != null && buildPlot.getCuboid() != null && !buildPlot.getCuboid().isIn(event.getClickedBlock().getLocation())) { + if(buildPlot != null && buildPlot.getCuboid() != null && !buildPlot.getCuboid().isInWithMarge(event.getClickedBlock().getLocation(), 2)) { event.setCancelled(true); } } From dd38ec0ff51a4f5c99ad6f8f492f69b1f001f6af Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 20:37:56 +0200 Subject: [PATCH 12/53] Fixed plot distribution on plot selection on a solo game could cause to set multiple players on the same plot --- .../java/plugily/projects/buildbattle/arena/BuildArena.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/BuildArena.java b/src/main/java/plugily/projects/buildbattle/arena/BuildArena.java index bebe90ab..81ff16ed 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/BuildArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/BuildArena.java @@ -105,7 +105,9 @@ public void distributePlots() { if(players.isEmpty()) { break; } - + if(!plot.getMembers().isEmpty()) { + continue; + } if(!getPlugin().getUserManager().getUser(players.get(0)).isSpectator()) { plot.addMember(players.remove(0), this, true); } From 1038cb0fdf871e4f96fec29e41952c0d31e219ae Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 20:38:41 +0200 Subject: [PATCH 13/53] Fixed plot distribution on plot selection on a solo game could cause to set multiple players on the same plot --- .../java/plugily/projects/buildbattle/arena/GuessArena.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java b/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java index 02fe0198..7bc6f594 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java @@ -90,6 +90,9 @@ public void distributePlots() { if(players.isEmpty()) { break; } + if(!plot.getMembers().isEmpty()) { + continue; + } if(!getPlugin().getUserManager().getUser(players.get(0)).isSpectator()) { plot.addMember(players.remove(0), this, true); } From b7aa9bb7e4b77816a0496f475fb4a5d6b6236b7a Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 20:55:50 +0200 Subject: [PATCH 14/53] Added onVoteInventoryInteractEvent to block movement of items while plot voting stage. --- .../buildbattle/arena/ArenaEvents.java | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index 8f532ee0..141a312d 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -32,6 +32,8 @@ import org.bukkit.event.block.*; import org.bukkit.event.entity.*; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCreativeEvent; +import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -665,4 +667,23 @@ public void onPlayerDropItem(PlayerDropItemEvent event) { } } + @EventHandler + public void onVoteInventoryInteractEvent(InventoryCreativeEvent event) { + if(!(event.getWhoClicked() instanceof Player)) { + return; + } + Player player = (Player) event.getWhoClicked(); + BaseArena arena = plugin.getArenaRegistry().getArena(player); + if(!(arena instanceof BuildArena)) { + return; + } + if(arena.getArenaState() != IArenaState.IN_GAME) { + return; + } + if(arena.getArenaInGameState() != BaseArena.ArenaInGameState.PLOT_VOTING) { + return; + } + event.setCancelled(true); + } + } From d29bfa6bc6d369a32553e86e8cefe7ea0ce02fd1 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 21:08:45 +0200 Subject: [PATCH 15/53] Fixed ItemFrames and Paintings were not able to be removed by player on plot. --- .../buildbattle/arena/ArenaEvents.java | 32 ++++++++++++++++--- 1 file changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index 141a312d..efa408c2 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -31,9 +31,9 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.block.*; import org.bukkit.event.entity.*; +import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.inventory.InventoryCreativeEvent; -import org.bukkit.event.inventory.InventoryInteractEvent; import org.bukkit.event.inventory.InventoryType; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; @@ -113,7 +113,7 @@ public void onOutSidePlotInteract(PlugilyPlayerInteractEvent event) { @EventHandler(priority = EventPriority.HIGH) public void onItemSpawn(ItemSpawnEvent event) { - if (!plugin.getArenaRegistry().getArenaWorlds().contains(event.getLocation().getWorld())) { + if(!plugin.getArenaRegistry().getArenaWorlds().contains(event.getLocation().getWorld())) { return; } @@ -175,6 +175,29 @@ public void onItemFrameRotate(PlayerInteractEntityEvent event) { } } + @EventHandler(priority = EventPriority.HIGHEST) + public void onHangingBreakEvent(HangingBreakByEntityEvent event) { + if(event.getEntity() instanceof ItemFrame || event.getEntity() instanceof Painting) { + if(event.getRemover() instanceof Player && plugin.getArenaRegistry().isInArena((Player) event.getRemover())) { + Player player = (Player) event.getRemover(); + BaseArena arena = plugin.getArenaRegistry().getArena(player); + if(arena == null) { + return; + } + if(arena.getArenaState() != IArenaState.IN_GAME) { + return; + } + Plot buildPlot = arena.getPlotManager().getPlot(player); + + if(buildPlot != null && buildPlot.getCuboid() != null && buildPlot.getCuboid().isIn(event.getEntity().getLocation())) { + event.setCancelled(false); + return; + } + event.setCancelled(true); + } + } + } + @EventHandler public void onNPCClick(PlugilyPlayerInteractEntityEvent event) { if(VersionUtils.checkOffHand(event.getHand()) || event.getRightClicked().getType() != EntityType.VILLAGER) { @@ -459,7 +482,6 @@ public void onEntityDamageEntity(EntityDamageByEntityEvent event) { } - @EventHandler(priority = EventPriority.HIGH) public void onDamage(EntityDamageEvent event) { if(event.getEntity().getType() != EntityType.PLAYER) { @@ -531,10 +553,10 @@ public void onOtherBlockExplode(BlockExplodeEvent event) { public void onEnderpearlThrow(ProjectileLaunchEvent event) { if(event.getEntity().getShooter() instanceof Player) { BaseArena arena = plugin.getArenaRegistry().getArena((Player) event.getEntity().getShooter()); - if (arena == null || arena.getArenaState() != IArenaState.IN_GAME) { + if(arena == null || arena.getArenaState() != IArenaState.IN_GAME) { return; } - if (event.getEntity() instanceof EnderPearl) { + if(event.getEntity() instanceof EnderPearl) { event.setCancelled(true); } } From 7a2f5b1e6d58cca4f3fe7cd47cecf1dfe432b4d2 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 19 May 2025 19:11:00 +0000 Subject: [PATCH 16/53] Bump version from 5.0.15-SNAPSHOT2 to 5.0.15-SNAPSHOT3 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 6b5853bb..78fdc4c7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT2 + 5.0.15-SNAPSHOT3 BuildBattle From 5600114b5577fd0eef14fac6b2104083d3ef757b Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 22:02:35 +0200 Subject: [PATCH 17/53] Fixed on first time setup without restart the NPE getArenaInGameState is null --- src/main/java/plugily/projects/buildbattle/arena/BaseArena.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java index 47163d1b..9f935ee9 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java @@ -57,7 +57,7 @@ public class BaseArena extends PluginArena { protected ParticleRefreshScheduler particleRefreshScheduler; private ArenaType arenaType; - private ArenaInGameState arenaInGameState; + private ArenaInGameState arenaInGameState = ArenaInGameState.NONE; private Map plotList = new HashMap<>(); From 809fc5c64d833d8cb68a80b351ad54406532dbdf Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 19 May 2025 20:07:38 +0000 Subject: [PATCH 18/53] Bump version from 5.0.15-SNAPSHOT3 to 5.0.15-SNAPSHOT4 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 78fdc4c7..02cadab3 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT3 + 5.0.15-SNAPSHOT4 BuildBattle From c3e922befa30e8fa78f025e204ce896368d49399 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 19 May 2025 22:36:22 +0200 Subject: [PATCH 19/53] Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb --- .../handlers/menu/registry/particles/ParticleRegistry.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/particles/ParticleRegistry.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/particles/ParticleRegistry.java index 3479dda3..cd4cedfd 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/particles/ParticleRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/particles/ParticleRegistry.java @@ -173,6 +173,9 @@ private void addParticles(PaginatedFastInv gui) { return; } Plot plot = arena.getPlotManager().getPlot(player); + if(plot == null) { + return; + } if(plot.getParticles().size() >= plugin.getConfig().getInt("Particle.Max-Amount", 25)) { new MessageBuilder("IN_GAME_MESSAGES_PLOT_LIMIT_PARTICLES").asKey().player(player).sendPlayer(); return; From 7d1ba4bdf0de8f4ea288d8f8fe65ff0765815fd1 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 19 May 2025 20:36:51 +0000 Subject: [PATCH 20/53] Bump version from 5.0.15-SNAPSHOT4 to 5.0.15-SNAPSHOT5 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 02cadab3..75fb2ce4 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT4 + 5.0.15-SNAPSHOT5 BuildBattle From b70807354759e1018ec627ee160151953680c7aa Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 22 May 2025 21:35:45 +0200 Subject: [PATCH 21/53] Update MinigamesBox --- pom.xml | 2 +- src/main/resources/config.yml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 75fb2ce4..51a958f2 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.1-SNAPSHOT5 + 1.4.1-SNAPSHOT8 compile true diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index d466aefd..c1b646e3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -77,6 +77,9 @@ Block: # Setting it to false means on all stages of the game the event will be cancelled. # Setting it to true means only while IN_GAME the event will be cancelled. Check: true + # Should all interactions with interactive materials such as doors / buttons / fences / redstone be blocked during ingame + # Full list see https://github.com/CryptoMorin/XSeries/blob/e84000a2bead7367d893cf8661f8d5432116adaa/core/src/main/java/com/cryptomorin/xseries/XTag.java#L2793 + Interact: false # Enable this option when you're using MySQL, otherwise it won't work. @@ -284,4 +287,4 @@ Update-Notifier: # You edited it, huh? Next time hurt yourself! Do-Not-Edit: File-Version: 1 - Core-Version: 5 + Core-Version: 6 From 63648308e412dc157d5508d533ff2a0ca7d03163 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 22 May 2025 19:36:07 +0000 Subject: [PATCH 22/53] Bump version from 5.0.15-SNAPSHOT5 to 5.0.15-SNAPSHOT6 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 51a958f2..936b99ee 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT5 + 5.0.15-SNAPSHOT6 BuildBattle From 0a0179b244dd0335af7dd35057f63401dd54ec34 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 22 May 2025 21:42:09 +0200 Subject: [PATCH 23/53] Adjusted CHANGELOG.md --- .github/CHANGELOG.md | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index b7f72ce6..5a3b0c42 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -10,7 +10,22 @@ deploy webhooks to print changelog successfully That's all, matcher will stop when detects next line started with `###` match -## 5.0.15 Release (03.05.2025) +### 5.1.0 Release (22.05.2025) +* Added onVoteInventoryInteractEvent to block movement of items while plot voting stage +* Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb +* Fixed on first time setup without restart the NPE getArenaInGameState is null +* Fixed ItemFrames and Paintings were not able to be removed by player on plot +* Fixed plot distribution on plot selection on a solo game could cause to set multiple players on the same plot +* Fixed resetPlayerWeather did not change the weather +* Fixed none builder Players of GTB didn't got the builder set weather and time +* Fixed Time.Changed message did not translate placeholder into language.yml content +* Fixed on Plotreset time did not update to world time +* Fixed Player Outside Plot interaction with blocks were possible +* Fixed NPE AddGoBackButton +* Changed Allow Plot selection also if ArenaState is FULL_GAME +* Updated Minigamesbox to 1.4.2 + +### 5.0.15 Release (03.05.2025) * Allowing by default 20 places placeholder for summary list * Check if OPTIONS_MENU item is still in builders inventory and readd it if necessary * Fixed IllegalArgumentException on PlotSelector, also switched to PaginatedInventory to support all Plots From a498d535ed3ba64342e1106e6f1a69e642c05b2d Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 22 May 2025 22:06:25 +0200 Subject: [PATCH 24/53] Added a lot of new default themes at themes.yml --- src/main/resources/themes.yml | 159 ++++++++++++++++++++++++++++++++-- 1 file changed, 153 insertions(+), 6 deletions(-) diff --git a/src/main/resources/themes.yml b/src/main/resources/themes.yml index 623de2a2..45013770 100644 --- a/src/main/resources/themes.yml +++ b/src/main/resources/themes.yml @@ -1,6 +1,10 @@ # Theme configuration # All game themes players will build. +# Use the following layout to support multiple answers +# Main theme, second possibility, x possibility +# E.g. You want Castle as main Theme but also allow fortress and mansion as different possibility it would look like +# - Castle, Fortress, Mansion Themes: # Solo themes. Classic: @@ -9,12 +13,81 @@ Themes: - Emoji - House - Flower + - Tree + - Car + - Book + - Ocean + - Mountain + - Forest + - Desert + - Volcano + - Island + - Cave + - Waterfall + - River + - Lake + - Glacier + - Jungle + - Pizza + - Burger + - Cake + - Ice Cream + - Fruit + - Vegetable + - Candy + - Sushi + - Bread + - Coffee + - Dragon + - Wizard Tower + - Fairy Tale + - Spaceship + - Robot + - Alien + - Monster + - Superhero + - Pirate Ship + - Ancient Ruin + - Music + - Dreams + - Emotions + - Future + - Past + - Chaos + - Order + - Light + - Darkness + - Time + - Shoe + - Chair + - Lamp + - Clock + - Camera + - Phone + - Television + - Pencil + - Key + - Umbrella # Team mode themes. Teams: - Well - Car - Rainbow - Arcade Machine + - Bridge + - Road + - Train Tracks + - Chain + - Puzzle + - Web + - Rainbow + - Secret Passage + - Parallel Worlds + - Lost and Found + - A New Discovery + - The Great Escape + - Time Travel + - A Legendary Battle # Guess the build themes. Guess-The-Build: Easy: @@ -22,18 +95,64 @@ Themes: - Sun - Bread - Book - - Dollar + - Dollar, Money, Bill + - Cloud + - Tree + - House, Home, Abode + - Car, Automobile, Vehicle + - Ball, Sphere + - Chair, Seat + - Lamp, Light + - River, Stream + - Mountain, Peak, Summit + - Flower, Bloom + - Boat, Ship + - Hat, Cap + - Shoe, Footwear + - Door, Gateway + - Window, Pane Medium: - School Bus - - Horse + - Horse, Steed, Pony - Fountain - Sumo - - Bicycle + - Bicycle, Bike + - Lighthouse + - Pyramid + - Robot, Android, Golem + - Spaceship, Rocket + - Guitar, Instrument + - Volcano, Mount Vesuvius + - Castle, Fortress, Mansion + - Bridge, Overpass, Viaduct + - Windmill, Mill + - Octopus, Cephalopod + - Hot Air Balloon, Airship + - Train, Locomotive + - Carousel, Merry-go-round + - Chess Piece, Knight, Rook + - Telescope, Spyglass Hard: - - Soccer - - Birthday Cake + - Soccer, Football + - Birthday Cake, Celebration Cake - Typewriter - - Solar System + - Solar System, Galaxy, Cosmos + - Eiffel Tower, Landmark + - Dragon, Wyrm, Beast + - Submarine, U-boat + - Grandfather Clock, Timepiece + - Rollercoaster, Amusement Ride + - DNA, Helix + - Globe, World Map, Earth + - Opera House, Concert Hall + - Satellite, Orbiter + - Microscope, Magnifying Glass + - Labyrinth, Maze + - Golden Gate Bridge, Suspension Bridge + - The Sphinx, Monument + - Chandelier, Candelabra + - Pirate Ship, Galleon, Brig + - Globe Theater, Amphitheater # Special holiday themes @@ -45,27 +164,55 @@ Holiday: - Void - Minecraft - Mojang + - Prank + - Illusion + - Trick + - Joke + - Upside Down Valentine: - Heart - Love - Cupid - Chocolate Box + - Roses + - Romance + - Teddy Bear + - Arrow + - Poem + - Sweet Halloween: - Pumpkin - Skeleton - Jack'o'Lantern - Candies + - Ghost + - Witch + - Bat + - Spiderweb + - Vampire + - Zombie Christmas: - Santa - Presents - Snowman - Stocking + - Reindeer + - Sleigh + - Elf + - Ornament + - Gingerbread + - Chimney NewYear: - Rocket - Firework - Party - Firecracker - Champagne + - Clock + - Countdown + - Confetti + - Ball Drop + - Resolutions # Theme names that are blacklisted. Blacklisted: From f62139093311ff29f0ab9a335903e64e3c27f4b5 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 22 May 2025 23:01:59 +0200 Subject: [PATCH 25/53] Added possibility to add same meaning words for gtb themes by using ", " in themes.yml Changed (for API usage) renamed BBTheme to GuessTheme --- .github/CHANGELOG.md | 3 ++ .../event/guess/PlayerThemeGuessEvent.java | 8 +-- .../buildbattle/arena/ArenaEvents.java | 2 +- .../buildbattle/arena/GuessArena.java | 10 ++-- .../arena/states/guess/InGameState.java | 53 ++++++++++--------- .../boot/PlaceholderInitializer.java | 10 ++-- .../arguments/game/GuessArgument.java | 2 +- .../themes/{BBTheme.java => GuessTheme.java} | 22 +++++--- .../handlers/themes/ThemeManager.java | 2 +- src/main/resources/themes.yml | 10 ++-- 10 files changed, 70 insertions(+), 52 deletions(-) rename src/main/java/plugily/projects/buildbattle/handlers/themes/{BBTheme.java => GuessTheme.java} (75%) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 5a3b0c42..92bc219e 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -12,6 +12,8 @@ That's all, matcher will stop when detects next line started with `###` match ### 5.1.0 Release (22.05.2025) * Added onVoteInventoryInteractEvent to block movement of items while plot voting stage +* Added a lot of new default themes at themes.yml +* Added possibility to add same meaning words for gtb themes by using ", " in themes.yml * Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb * Fixed on first time setup without restart the NPE getArenaInGameState is null * Fixed ItemFrames and Paintings were not able to be removed by player on plot @@ -23,6 +25,7 @@ That's all, matcher will stop when detects next line started with `###` match * Fixed Player Outside Plot interaction with blocks were possible * Fixed NPE AddGoBackButton * Changed Allow Plot selection also if ArenaState is FULL_GAME +* Changed (for API usage) renamed BBTheme to GuessTheme * Updated Minigamesbox to 1.4.2 ### 5.0.15 Release (03.05.2025) diff --git a/src/main/java/plugily/projects/buildbattle/api/event/guess/PlayerThemeGuessEvent.java b/src/main/java/plugily/projects/buildbattle/api/event/guess/PlayerThemeGuessEvent.java index 9f11cb2b..aa42b297 100644 --- a/src/main/java/plugily/projects/buildbattle/api/event/guess/PlayerThemeGuessEvent.java +++ b/src/main/java/plugily/projects/buildbattle/api/event/guess/PlayerThemeGuessEvent.java @@ -22,7 +22,7 @@ import org.bukkit.event.HandlerList; import plugily.projects.buildbattle.arena.GuessArena; -import plugily.projects.buildbattle.handlers.themes.BBTheme; +import plugily.projects.buildbattle.handlers.themes.GuessTheme; import plugily.projects.minigamesbox.api.events.PlugilyEvent; @@ -35,9 +35,9 @@ public class PlayerThemeGuessEvent extends PlugilyEvent { private static final HandlerList HANDLERS = new HandlerList(); - private final BBTheme theme; + private final GuessTheme theme; - public PlayerThemeGuessEvent(GuessArena eventArena, BBTheme theme) { + public PlayerThemeGuessEvent(GuessArena eventArena, GuessTheme theme) { super(eventArena); this.theme = theme; } @@ -51,7 +51,7 @@ public HandlerList getHandlers() { return HANDLERS; } - public BBTheme getTheme() { + public GuessTheme getTheme() { return theme; } } diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index efa408c2..ac3d9e0b 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -671,7 +671,7 @@ public void onGTBGuessChat(AsyncPlayerChatEvent event) { new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_GUESS_BUILDER").asKey().arena(gameArena).player(player).sendPlayer(); return; } - if(gameArena.getCurrentBBTheme() == null || !gameArena.getCurrentBBTheme().getTheme().equalsIgnoreCase(event.getMessage())) { + if(gameArena.getCurrentBBTheme() == null || gameArena.getCurrentBBTheme().getThemes().stream().noneMatch(theme -> theme.equalsIgnoreCase(event.getMessage()))) { return; } event.setCancelled(true); diff --git a/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java b/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java index 7bc6f594..865c9316 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/GuessArena.java @@ -28,7 +28,7 @@ import plugily.projects.buildbattle.arena.managers.plots.Plot; import plugily.projects.buildbattle.arena.states.guess.InGameState; import plugily.projects.buildbattle.arena.states.guess.StartingState; -import plugily.projects.buildbattle.handlers.themes.BBTheme; +import plugily.projects.buildbattle.handlers.themes.GuessTheme; import plugily.projects.minigamesbox.api.arena.IArenaState; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; @@ -46,7 +46,7 @@ public class GuessArena extends BaseArena { private final List whoGuessed = new ArrayList<>(); private int round = 1; - private BBTheme currentTheme = null; + private GuessTheme currentTheme = null; private Plot buildPlot = null; private List removedCharsAt = new ArrayList<>(); @@ -207,7 +207,7 @@ public void broadcastPlayerGuessed(Player player) { Bukkit.getScheduler().runTask(getPlugin(), () -> Bukkit.getPluginManager().callEvent(new PlayerThemeGuessEvent(this, currentTheme))); } - public BBTheme getCurrentBBTheme() { + public GuessTheme getCurrentBBTheme() { return currentTheme; } @@ -239,11 +239,11 @@ public int getRound() { return round; } - public void setCurrentTheme(BBTheme currentTheme) { + public void setCurrentTheme(GuessTheme currentTheme) { if(currentTheme == null) { getPlugin().getDebugger().debug("Arena {0} set Theme null", getId()); } else { - getPlugin().getDebugger().debug("Arena {0} set Theme to {1} ({2})", getId(), currentTheme.getTheme(), currentTheme.getDifficulty()); + getPlugin().getDebugger().debug("Arena {0} set Theme to {1} ({2})", getId(), currentTheme.getThemesAsString(), currentTheme.getDifficulty()); } this.currentTheme = currentTheme; } diff --git a/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java b/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java index 5581746e..3aed416e 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java +++ b/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java @@ -26,10 +26,9 @@ import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import plugily.projects.buildbattle.arena.BaseArena; -import plugily.projects.buildbattle.arena.BuildArena; import plugily.projects.buildbattle.arena.GuessArena; import plugily.projects.buildbattle.arena.managers.plots.Plot; -import plugily.projects.buildbattle.handlers.themes.BBTheme; +import plugily.projects.buildbattle.handlers.themes.GuessTheme; import plugily.projects.buildbattle.handlers.themes.ThemeManager; import plugily.projects.minigamesbox.api.user.IUser; import plugily.projects.minigamesbox.classic.arena.PluginArena; @@ -42,7 +41,9 @@ import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.logging.Level; /** * @author Tigerpanzer_02 @@ -89,14 +90,14 @@ public void handleCall(PluginArena arena) { if(timer <= 90) { if(timer == 90) { - new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_CHARS").asKey().arena(pluginArena).integer(pluginArena.getCurrentBBTheme().getTheme().length()).sendArena(); + new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_CHARS").asKey().arena(pluginArena).integer(pluginArena.getCurrentBBTheme().getDefaultTheme().length()).sendArena(); } sendThemeHints(arena, pluginArena); } if(timer <= 0) { //not all guessed - new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_WAS").asKey().value(pluginArena.getCurrentBBTheme().getTheme()).arena(pluginArena).sendArena(); - new TitleBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_TITLE").asKey().value(pluginArena.getCurrentBBTheme().getTheme()).arena(pluginArena).sendArena(); + new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_WAS").asKey().value(pluginArena.getCurrentBBTheme().getThemesAsString()).arena(pluginArena).sendArena(); + new TitleBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_TITLE").asKey().value(pluginArena.getCurrentBBTheme().getThemesAsString()).arena(pluginArena).sendArena(); setArenaTimer(getPlugin().getConfig().getInt("Time-Manager." + pluginArena.getArenaType().getPrefix() + ".Round-Delay")); pluginArena.setArenaInGameState(BaseArena.ArenaInGameState.PLOT_VOTING); @@ -134,10 +135,10 @@ private void sendThemeHints(PluginArena arena, GuessArena pluginArena) { continue; } if(pluginArena.getWhoGuessed().contains(player)) { - getPlugin().getActionBarManager().addActionBar(player, new ActionBar(new MessageBuilder(pluginArena.getCurrentBBTheme().getTheme()), ActionBar.ActionBarType.DISPLAY)); + getPlugin().getActionBarManager().addActionBar(player, new ActionBar(new MessageBuilder(pluginArena.getCurrentBBTheme().getDefaultTheme()), ActionBar.ActionBarType.DISPLAY)); continue; } - int themeLength = pluginArena.getCurrentBBTheme().getTheme().length(); + int themeLength = pluginArena.getCurrentBBTheme().getDefaultTheme().length(); List charsAt = new ArrayList<>(themeLength); for(int i = 0; i < themeLength; i++) { @@ -157,7 +158,7 @@ private void sendThemeHints(PluginArena arena, GuessArena pluginArena) { StringBuilder actionbar = new StringBuilder(); for(int i = 0; i < themeLength; i++) { - char charAt = pluginArena.getCurrentBBTheme().getTheme().charAt(i); + char charAt = pluginArena.getCurrentBBTheme().getDefaultTheme().charAt(i); if(Character.isWhitespace(charAt)) { actionbar.append(" "); @@ -177,13 +178,13 @@ private void forceSetTheme(GuessArena pluginArena) { if(pluginArena.isCurrentThemeSet()) { return; } - BBTheme.Difficulty difficulty = BBTheme.Difficulty.EASY; + GuessTheme.Difficulty difficulty = GuessTheme.Difficulty.EASY; switch(pluginArena.getPlugin().getRandom().nextInt(2 + 1)) { case 1: - difficulty = BBTheme.Difficulty.MEDIUM; + difficulty = GuessTheme.Difficulty.MEDIUM; break; case 2: - difficulty = BBTheme.Difficulty.HARD; + difficulty = GuessTheme.Difficulty.HARD; break; default: break; @@ -200,8 +201,8 @@ private void handleOptionsMenu(GuessArena pluginArena) { } } - private void setChosenTheme(GuessArena pluginArena, BBTheme bbTheme) { - setTheme(pluginArena, bbTheme); + private void setChosenTheme(GuessArena pluginArena, GuessTheme guessTheme) { + setTheme(pluginArena, guessTheme); pluginArena.getCurrentBuilders().forEach(HumanEntity::closeInventory); pluginArena.getCurrentBuilders().forEach(player -> getPlugin().getActionBarManager().addActionBar(player, new ActionBar(new MessageBuilder("IN_GAME_MESSAGES_PLOT_GTB_THEME_NAME").asKey().player(player).arena(pluginArena), @@ -225,20 +226,20 @@ private void openThemeSelectionInventoryToCurrentBuilder(GuessArena pluginArena) }); - BBTheme easy = getThemeByDifficulty(pluginArena, BBTheme.Difficulty.EASY); - gui.setItem(11, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(easy.getTheme()).build()) + GuessTheme easy = getThemeByDifficulty(pluginArena, GuessTheme.Difficulty.EASY); + gui.setItem(11, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(easy.getThemesAsString()).build()) .lore(getThemeItemLore(pluginArena).value(new MessageBuilder("MENU_THEME_GTB_DIFFICULTIES_EASY").asKey().build()).integer(easy.getDifficulty().getPointsReward()).build().split(";")).build(), event -> { setChosenTheme(pluginArena, easy); })); - BBTheme medium = getThemeByDifficulty(pluginArena, BBTheme.Difficulty.MEDIUM); - gui.setItem(13, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(medium.getTheme()).build()) + GuessTheme medium = getThemeByDifficulty(pluginArena, GuessTheme.Difficulty.MEDIUM); + gui.setItem(13, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(medium.getThemesAsString()).build()) .lore(getThemeItemLore(pluginArena).value(new MessageBuilder("MENU_THEME_GTB_DIFFICULTIES_MEDIUM").asKey().build()).integer(medium.getDifficulty().getPointsReward()).build().split(";")).build(), event -> { setChosenTheme(pluginArena, medium); })); - BBTheme hard = getThemeByDifficulty(pluginArena, BBTheme.Difficulty.HARD); - gui.setItem(15, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(hard.getTheme()).build()) + GuessTheme hard = getThemeByDifficulty(pluginArena, GuessTheme.Difficulty.HARD); + gui.setItem(15, new SimpleClickableItem(new ItemBuilder(Material.PAPER).name(getThemeItemName(pluginArena).value(hard.getThemesAsString()).build()) .lore(getThemeItemLore(pluginArena).value(new MessageBuilder("MENU_THEME_GTB_DIFFICULTIES_HARD").asKey().build()).integer(hard.getDifficulty().getPointsReward()).build().split(";")).build(), event -> { setChosenTheme(pluginArena, hard); })); @@ -256,20 +257,24 @@ public MessageBuilder getThemeItemLore(GuessArena pluginArena) { } - private BBTheme getThemeByDifficulty(GuessArena pluginArena, BBTheme.Difficulty difficulty) { + private GuessTheme getThemeByDifficulty(GuessArena pluginArena, GuessTheme.Difficulty difficulty) { List themes = pluginArena.getPlugin().getThemeManager().getThemes(ThemeManager.GameThemes.getByDifficulty(difficulty)); List themesFilter = new ArrayList<>(themes); themesFilter.removeAll(pluginArena.getPlayedThemes()); if(themesFilter.isEmpty()) { themesFilter = themes; } - String themeName = themesFilter.get(getPlugin().getRandom().nextInt(themesFilter.size())); - BBTheme theme = new BBTheme(themeName, difficulty); - pluginArena.getPlayedThemes().add(themeName); + String unmatchedThemes = themesFilter.get(getPlugin().getRandom().nextInt(themesFilter.size())); + ArrayList themeNames = new ArrayList<>(Arrays.asList(unmatchedThemes.split("\\s*,\\s*"))); + if(themeNames.isEmpty()) { + pluginArena.getPlugin().getDebugger().debug(Level.WARNING, "&cThemes.yml broken. Th following line was found "+unmatchedThemes+ " ! Please remove empty lines!"); + } + GuessTheme theme = new GuessTheme(themeNames, difficulty); + pluginArena.getPlayedThemes().add(unmatchedThemes); return theme; } - private void setTheme(GuessArena pluginArena, BBTheme theme) { + private void setTheme(GuessArena pluginArena, GuessTheme theme) { pluginArena.setCurrentTheme(theme); } diff --git a/src/main/java/plugily/projects/buildbattle/boot/PlaceholderInitializer.java b/src/main/java/plugily/projects/buildbattle/boot/PlaceholderInitializer.java index f06e5a84..de0b7374 100644 --- a/src/main/java/plugily/projects/buildbattle/boot/PlaceholderInitializer.java +++ b/src/main/java/plugily/projects/buildbattle/boot/PlaceholderInitializer.java @@ -28,7 +28,7 @@ import plugily.projects.buildbattle.arena.BuildArena; import plugily.projects.buildbattle.arena.GuessArena; import plugily.projects.buildbattle.arena.managers.plots.Plot; -import plugily.projects.buildbattle.handlers.themes.BBTheme; +import plugily.projects.buildbattle.handlers.themes.GuessTheme; import plugily.projects.minigamesbox.api.arena.IArenaState; import plugily.projects.minigamesbox.api.arena.IPluginArena; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; @@ -92,8 +92,8 @@ private String getTheme(Player player, IPluginArena arena) { } if(theme.equalsIgnoreCase(new MessageBuilder("SCOREBOARD_THEME_UNKNOWN").asKey().build())) { if(((GuessArena) pluginArena).getCurrentBuilders().contains(player) || ((GuessArena) pluginArena).getWhoGuessed().contains(player)) { - BBTheme guessTheme = ((GuessArena) pluginArena).getCurrentBBTheme(); - theme = guessTheme == null ? new MessageBuilder("SCOREBOARD_THEME_UNKNOWN").asKey().build() : guessTheme.getTheme(); + GuessTheme guessTheme = ((GuessArena) pluginArena).getCurrentBBTheme(); + theme = guessTheme == null ? new MessageBuilder("SCOREBOARD_THEME_UNKNOWN").asKey().build() : guessTheme.getDefaultTheme(); } } return theme; @@ -115,7 +115,7 @@ public String getValue(IPluginArena arena) { private String getTheme(IPluginArena arena) { BaseArena pluginArena = arenaRegistry.getArena(arena.getId()); if(pluginArena instanceof GuessArena) { - BBTheme theme = ((GuessArena) pluginArena).getCurrentBBTheme(); + GuessTheme theme = ((GuessArena) pluginArena).getCurrentBBTheme(); if(theme == null) { return null; } @@ -140,7 +140,7 @@ public String getValue(IPluginArena arena) { private String getTheme(IPluginArena arena) { BaseArena pluginArena = arenaRegistry.getArena(arena.getId()); if(pluginArena instanceof GuessArena) { - BBTheme theme = ((GuessArena) pluginArena).getCurrentBBTheme(); + GuessTheme theme = ((GuessArena) pluginArena).getCurrentBBTheme(); if(theme == null) { return "0"; } diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/game/GuessArgument.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/game/GuessArgument.java index b51a0d72..46a510b2 100644 --- a/src/main/java/plugily/projects/buildbattle/commands/arguments/game/GuessArgument.java +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/game/GuessArgument.java @@ -72,7 +72,7 @@ public void execute(CommandSender sender, String[] args) { return; } - if(gameArena.getCurrentBBTheme() == null || !gameArena.getCurrentBBTheme().getTheme().equalsIgnoreCase(Arrays.toString(args).split(" ", 2)[1].replace(",", "").replace("]", ""))) { + if(gameArena.getCurrentBBTheme() == null || gameArena.getCurrentBBTheme().getThemes().stream().noneMatch(theme -> theme.equalsIgnoreCase(Arrays.toString(args).split(" ", 2)[1].replace(",", "").replace("]", "")))) { return; } diff --git a/src/main/java/plugily/projects/buildbattle/handlers/themes/BBTheme.java b/src/main/java/plugily/projects/buildbattle/handlers/themes/GuessTheme.java similarity index 75% rename from src/main/java/plugily/projects/buildbattle/handlers/themes/BBTheme.java rename to src/main/java/plugily/projects/buildbattle/handlers/themes/GuessTheme.java index 99976039..69f54ffa 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/themes/BBTheme.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/themes/GuessTheme.java @@ -20,18 +20,28 @@ package plugily.projects.buildbattle.handlers.themes; -public class BBTheme { +import java.util.ArrayList; - private final String theme; +public class GuessTheme { + + private final ArrayList themes; private final Difficulty difficulty; - public BBTheme(String theme, Difficulty difficulty) { - this.theme = theme == null ? "" : theme; + public GuessTheme(ArrayList themes, Difficulty difficulty) { + this.themes = themes; this.difficulty = difficulty; } - public String getTheme() { - return theme; + public ArrayList getThemes() { + return themes; + } + + public String getThemesAsString() { + return String.join(", ", themes); + } + + public String getDefaultTheme() { + return themes.get(0); } public Difficulty getDifficulty() { diff --git a/src/main/java/plugily/projects/buildbattle/handlers/themes/ThemeManager.java b/src/main/java/plugily/projects/buildbattle/handlers/themes/ThemeManager.java index 6252b78c..3f2329ba 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/themes/ThemeManager.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/themes/ThemeManager.java @@ -160,7 +160,7 @@ public static GameThemes getByArenaType(BaseArena.ArenaType arenaType) { } @Nullable - public static GameThemes getByDifficulty(BBTheme.Difficulty difficulty) { + public static GameThemes getByDifficulty(GuessTheme.Difficulty difficulty) { switch(difficulty) { case EASY: return GUESS_THE_BUILD_EASY; diff --git a/src/main/resources/themes.yml b/src/main/resources/themes.yml index 45013770..5edfaf74 100644 --- a/src/main/resources/themes.yml +++ b/src/main/resources/themes.yml @@ -1,10 +1,6 @@ # Theme configuration # All game themes players will build. -# Use the following layout to support multiple answers -# Main theme, second possibility, x possibility -# E.g. You want Castle as main Theme but also allow fortress and mansion as different possibility it would look like -# - Castle, Fortress, Mansion Themes: # Solo themes. Classic: @@ -89,6 +85,10 @@ Themes: - Time Travel - A Legendary Battle # Guess the build themes. + # Use the following layout to support multiple answers + # Main theme, second possibility, x possibility + # E.g. You want Castle as main Theme but also allow fortress and mansion as different possibility it would look like + # - Castle, Fortress, Mansion Guess-The-Build: Easy: - Apple @@ -223,5 +223,5 @@ Blacklisted: # Really, don't edit ;p # You edited it, huh? Next time hurt yourself! Do-Not-Edit: - File-Version: 1 + File-Version: 2 Core-Version: 1 \ No newline at end of file From dff15d0ac39c4cf5d35b61bf67f24e45f7b8a24f Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 22 May 2025 21:02:24 +0000 Subject: [PATCH 26/53] Bump version from 5.0.15-SNAPSHOT6 to 5.0.15-SNAPSHOT7 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 936b99ee..278afc14 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT6 + 5.0.15-SNAPSHOT7 BuildBattle From ea49d145a7f6619423abd9d7331f93d85961f8f9 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 22 May 2025 23:04:20 +0200 Subject: [PATCH 27/53] [ci skip] Adjusted CHANGELOG.md --- .github/CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 92bc219e..90c2995e 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -12,7 +12,7 @@ That's all, matcher will stop when detects next line started with `###` match ### 5.1.0 Release (22.05.2025) * Added onVoteInventoryInteractEvent to block movement of items while plot voting stage -* Added a lot of new default themes at themes.yml +* Added a lot of new default themes at themes.yml (+140) * Added possibility to add same meaning words for gtb themes by using ", " in themes.yml * Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb * Fixed on first time setup without restart the NPE getArenaInGameState is null From d57137f6523f416ad29b116ebce59602ef0eab17 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Fri, 23 May 2025 00:35:58 +0200 Subject: [PATCH 28/53] [ci skip] Update README.md --- .github/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/README.md b/.github/README.md index cbfa83df..ceef1c59 100644 --- a/.github/README.md +++ b/.github/README.md @@ -1,11 +1,11 @@ ![](https://images.plugily.xyz/banner/display.php?id=BuildBattle) -# Build Battle [![Maven Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/buildbattle?color=40c14a&name=Maven&prefix=v)](https://maven.plugily.xyz/#/releases/plugily/projects/buildbattle) [![JavaDoc Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/buildbattle?color=40c14a&name=JavaDoc&prefix=v)](https://maven.plugily.xyz/javadoc/releases/plugily/projects/buildbattle/latest) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plugily-Projects_BuildBattle&metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=Plugily-Projects_BuildBattle) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&style=for-the-badge&logo=discord)](https://discord.plugily.xyz) [![Patreon]( https://img.shields.io/badge/Patreon-F96854?style=for-the-badge&logo=patreon&logoColor=white)](https://patreon.com/plugily) +# Build Battle / Guess The Build [![Maven Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/buildbattle?color=40c14a&name=Maven&prefix=v)](https://maven.plugily.xyz/#/releases/plugily/projects/buildbattle) [![JavaDoc Repository](https://maven.plugily.xyz/api/badge/latest/releases/plugily/projects/buildbattle?color=40c14a&name=JavaDoc&prefix=v)](https://maven.plugily.xyz/javadoc/releases/plugily/projects/buildbattle/latest) [![Maintainability Rating](https://sonarcloud.io/api/project_badges/measure?project=Plugily-Projects_BuildBattle&metric=sqale_rating)](https://sonarcloud.io/summary/overall?id=Plugily-Projects_BuildBattle) [![Discord](https://img.shields.io/discord/345628548716822530.svg?color=7289DA&style=for-the-badge&logo=discord)](https://discord.plugily.xyz) [![Patreon]( https://img.shields.io/badge/Patreon-F96854?style=for-the-badge&logo=patreon&logoColor=white)](https://patreon.com/plugily) -BuildBattle is a Minecraft minigame designed for small and big servers. This minigame is unique and very configurable, +BuildBattle / Guess The Build is a Minecraft minigame designed for small and big servers. This minigame is unique and very configurable, 100% free and open source! -The goal is to build the best you can! You must compete with other players in this building game. Who will be the best? +There are different modes such as the classic BuildBattle and the guess mode calles Guess The Build. On the classic version the goal is to build the best you can! You must compete with other players in this building game. Who will be the best? On the guess mode you have to build whileas the other players are guessing the correct word according to your building which grants points to the players. The player with the most points (best guesses) wins. Have fun using it! Leave a good rating if you really like it. ## Want to contribute in this project? From 45f68501998e145f082aebc70b8897cc9b80cabf Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Fri, 23 May 2025 00:36:41 +0200 Subject: [PATCH 29/53] Update README.md --- .github/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index ceef1c59..01174c95 100644 --- a/.github/README.md +++ b/.github/README.md @@ -5,7 +5,7 @@ BuildBattle / Guess The Build is a Minecraft minigame designed for small and big servers. This minigame is unique and very configurable, 100% free and open source! -There are different modes such as the classic BuildBattle and the guess mode calles Guess The Build. On the classic version the goal is to build the best you can! You must compete with other players in this building game. Who will be the best? On the guess mode you have to build whileas the other players are guessing the correct word according to your building which grants points to the players. The player with the most points (best guesses) wins. +There are different modes such as the classic BuildBattle and the guess mode called Guess The Build. On the classic version the goal is to build the best you can on your own as solo or as team with unlimited team sizes! You must compete with other players in this building game. Who will be the best? On the guess mode you have to build whileas the other players are guessing the correct word according to your building which grants points to the players. The player with the most points (best guesses) wins. Have fun using it! Leave a good rating if you really like it. ## Want to contribute in this project? From 1725f963e790ec491f672e93afb115b7261fee09 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 22 May 2025 22:37:04 +0000 Subject: [PATCH 30/53] Bump version from 5.0.15-SNAPSHOT7 to 5.0.15-SNAPSHOT8 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 278afc14..f13e53de 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT7 + 5.0.15-SNAPSHOT8 BuildBattle From b309c80ee3d1cdf45ea03e505d29974bccbc9de8 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Fri, 23 May 2025 00:38:21 +0200 Subject: [PATCH 31/53] Changed Heads menus from NormalInventory to Paginated Inventory to support more heads --- .../registry/playerheads/HeadsCategory.java | 8 ++--- .../playerheads/PlayerHeadsRegistry.java | 35 +++++++++++++------ 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java index f65cc6ed..969e3ff3 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java @@ -21,7 +21,7 @@ package plugily.projects.buildbattle.handlers.menu.registry.playerheads; import org.bukkit.inventory.ItemStack; -import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; +import plugily.projects.minigamesbox.inventory.utils.fastinv.PaginatedFastInv; /** * @author Plajer @@ -35,7 +35,7 @@ public class HeadsCategory { private final String categoryID; private ItemStack itemStack; private String permission; - private NormalFastInv gui; + private PaginatedFastInv gui; public HeadsCategory(String categoryID) { this.categoryID = categoryID; @@ -61,11 +61,11 @@ public void setPermission(String permission) { this.permission = permission; } - public NormalFastInv getGui() { + public PaginatedFastInv getGui() { return gui; } - public void setGui(NormalFastInv inventoryView) { + public void setGui(PaginatedFastInv inventoryView) { this.gui = inventoryView; } } diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java index e3fd501d..b34290e9 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java @@ -30,13 +30,11 @@ import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; import plugily.projects.minigamesbox.classic.utils.helper.ItemUtils; import plugily.projects.minigamesbox.classic.utils.misc.complement.ComplementAccessor; -import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; -import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; +import plugily.projects.minigamesbox.inventory.utils.fastinv.InventoryScheme; +import plugily.projects.minigamesbox.inventory.utils.fastinv.PaginatedFastInv; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; +import java.util.*; import java.util.stream.Collectors; /** @@ -47,7 +45,7 @@ public class PlayerHeadsRegistry { private final Main plugin; - private final Map categories = new HashMap<>(); + private final Map categories = new HashMap<>(); public PlayerHeadsRegistry(OptionsRegistry registry) { this.plugin = registry.getPlugin(); @@ -86,10 +84,27 @@ private void registerCategories() { stack.setItemMeta(im); playerHeads.add(stack); } - NormalFastInv gui = new NormalFastInv(plugin.getBukkitHelper().serializeInt(playerHeads.size() + 1), new MessageBuilder(config.getString(str + ".menuname")).build()); + PaginatedFastInv gui = new PaginatedFastInv(54, new MessageBuilder(config.getString(str + ".menuname")).build()); + new InventoryScheme() + .mask(" 1111111 ") + .mask(" 1111111 ") + .mask(" 1111111 ") + .mask(" 1111111 ") + .bindPagination('1').apply(gui); + + + gui.previousPageItem(45, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("<- " + p + "/" + gui.lastPage()).build()); + gui.nextPageItem(53, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name(p + "/" + gui.lastPage() + " ->").build()); + + gui.setItem(52, new ItemBuilder(XMaterial.BARRIER.parseItem()).name("X").build(), + e -> e.getWhoClicked().closeInventory()); + + plugin.getOptionsRegistry().addGoBackItem(gui, 46); + + for(ItemStack playerHead : playerHeads) { - gui.addItem(new SimpleClickableItem(playerHead, clickEvent -> clickEvent.getWhoClicked().getInventory().addItem(playerHead.clone()))); + gui.addContent(playerHead, clickEvent -> clickEvent.getWhoClicked().getInventory().addItem(playerHead.clone())); } plugin.getOptionsRegistry().addGoBackItem(gui, gui.getInventory().getSize() - 1); @@ -98,7 +113,7 @@ private void registerCategories() { } } - public Map getCategories() { + public Map getCategories() { return categories; } From 27aa2126d281ebb6e201dfd417b029c6251d659b Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 22 May 2025 22:38:45 +0000 Subject: [PATCH 32/53] Bump version from 5.0.15-SNAPSHOT8 to 5.0.15-SNAPSHOT9 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index f13e53de..49e57c6c 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT8 + 5.0.15-SNAPSHOT9 BuildBattle From 9df2839d9c0f0c047c3ed2f6e1268ce4b86a4684 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Sun, 25 May 2025 13:11:07 +0200 Subject: [PATCH 33/53] [ci skip] Update README.md --- .github/README.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/README.md b/.github/README.md index 01174c95..9551e21e 100644 --- a/.github/README.md +++ b/.github/README.md @@ -31,7 +31,13 @@ Have fun using it! Leave a good rating if you really like it. jetbrains logo -Thanks to Code Whale for Open Source license for POEditor project. +Thanks to Code Whale for Open Source license for POEditor project, so we are able to have locales. + +#### Minecraft Heads + +[![https://minecraft-heads.com/](https://images.minecraft-heads.com/banners/minecraft-heads_leaderboard_728x90.png)](https://minecraft-heads.com/) + +Thanks to Minecraft Heads to let us use the Name and Textures of the heads to provide you a better heads experience ingame. ## Contributors From 363bb8e309cf48cb7a60793dd9d89851045bdb40 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Wed, 28 May 2025 15:34:27 +0200 Subject: [PATCH 34/53] Updated MinigamesBox --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 49e57c6c..180a3676 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.1-SNAPSHOT8 + 1.4.1-SNAPSHOT13 compile true From ed013d5b138ba52d432e1134fa0a468a7808a82b Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Wed, 28 May 2025 13:34:42 +0000 Subject: [PATCH 35/53] Bump version from 5.0.15-SNAPSHOT9 to 5.0.15-SNAPSHOT10 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 180a3676..fc929aa9 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT9 + 5.0.15-SNAPSHOT10 BuildBattle From 26af2f3b244d4299bcdb1f12aed95e75bb622d2d Mon Sep 17 00:00:00 2001 From: Tigerpanzer02 <37453987+Tigerpanzer02@users.noreply.github.com.> Date: Fri, 30 May 2025 13:53:54 +0200 Subject: [PATCH 36/53] Hide guessing players from builder in gtb mode --- .../buildbattle/arena/states/guess/InGameState.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java b/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java index 3aed416e..573e707d 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java +++ b/src/main/java/plugily/projects/buildbattle/arena/states/guess/InGameState.java @@ -32,11 +32,13 @@ import plugily.projects.buildbattle.handlers.themes.ThemeManager; import plugily.projects.minigamesbox.api.user.IUser; import plugily.projects.minigamesbox.classic.arena.PluginArena; +import plugily.projects.minigamesbox.classic.arena.PluginArenaUtils; import plugily.projects.minigamesbox.classic.arena.states.PluginInGameState; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; import plugily.projects.minigamesbox.classic.utils.actionbar.ActionBar; import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; @@ -75,6 +77,7 @@ public void handleCall(PluginArena arena) { Bukkit.getScheduler().runTaskLater(getPlugin(), () -> pluginArena.getCurrentBuilders().forEach(player -> { player.setGameMode(GameMode.CREATIVE); + pluginArena.getPlayersLeft().forEach(ingamePlayer -> VersionUtils.hidePlayer(getPlugin(), player, ingamePlayer)); pluginArena.getPlugin().getSpecialItemManager().getSpecialItem("OPTIONS_MENU").setItem(player); } ), 40); @@ -107,6 +110,9 @@ public void handleCall(PluginArena arena) { handleOptionsMenu(pluginArena); break; case PLOT_VOTING: + for(Player player : pluginArena.getPlayersLeft()) { + PluginArenaUtils.showPlayer(player, arena); + } if(pluginArena.getRound() + 1 > pluginArena.getPlotList().size() * pluginArena.getArenaOption("GTB_ROUNDS_PER_PLOT")) { pluginArena.calculateWinnerPlot(); adjustStatistics(pluginArena); From 66590e262e557ef5e69fc5eaea6fb2f573b40e6c Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Fri, 30 May 2025 11:55:13 +0000 Subject: [PATCH 37/53] Bump version from 5.0.15-SNAPSHOT10 to 5.0.15-SNAPSHOT11 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index fc929aa9..fc946a50 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT10 + 5.0.15-SNAPSHOT11 BuildBattle From 23b96d8359c5d251572e3c8d9cc0a4ed2b6a20d5 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:49:22 +0200 Subject: [PATCH 38/53] Fixed WaterFlow to Floor Ground --- .../java/plugily/projects/buildbattle/arena/ArenaEvents.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index ac3d9e0b..94370a1e 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -576,7 +576,7 @@ public void onWaterFlowEvent(BlockFromToEvent event) { if(!buildPlot.getCuboid().isIn(toBlock) && buildPlot.getCuboid().isIn(blockLoc)) { event.setCancelled(true); } - if(!buildPlot.getCuboid().isInWithMarge(toBlock, -1) && buildPlot.getCuboid().isIn(toBlock)) { + if(!buildPlot.getCuboid().isIn(toBlock)) { event.setCancelled(true); } } From d06a06899f451cb957f31969b31f396edc372dde Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 9 Jun 2025 11:52:05 +0200 Subject: [PATCH 39/53] Updated minigamesbox --- .github/CHANGELOG.md | 3 +++ pom.xml | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 90c2995e..c936b6bd 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -11,6 +11,7 @@ deploy webhooks to print changelog successfully That's all, matcher will stop when detects next line started with `###` match ### 5.1.0 Release (22.05.2025) +* Added paginated Heads menu to support more than one site of heads * Added onVoteInventoryInteractEvent to block movement of items while plot voting stage * Added a lot of new default themes at themes.yml (+140) * Added possibility to add same meaning words for gtb themes by using ", " in themes.yml @@ -24,8 +25,10 @@ That's all, matcher will stop when detects next line started with `###` match * Fixed on Plotreset time did not update to world time * Fixed Player Outside Plot interaction with blocks were possible * Fixed NPE AddGoBackButton +* Fixed Water Flow on Ground * Changed Allow Plot selection also if ArenaState is FULL_GAME * Changed (for API usage) renamed BBTheme to GuessTheme +* Changed Hide guessing players from builder in gtb mode * Updated Minigamesbox to 1.4.2 ### 5.0.15 Release (03.05.2025) diff --git a/pom.xml b/pom.xml index 180a3676..4ae722e9 100644 --- a/pom.xml +++ b/pom.xml @@ -78,7 +78,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.1-SNAPSHOT13 + 1.4.2 compile true From b8bfe68ef12d77917f1284ba6d5fb70b0acc6bfe Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 9 Jun 2025 09:52:49 +0000 Subject: [PATCH 40/53] Bump version from 5.0.15-SNAPSHOT11 to 5.0.15-SNAPSHOT12 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 73e40510..d6a31883 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT11 + 5.0.15-SNAPSHOT12 BuildBattle From e6034a3652b921dba6bfdb20290af60204b9d842 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 10 Jul 2025 20:38:59 +0200 Subject: [PATCH 41/53] Added Heads from HeadDatabase Added /bba settheme for Console use Fixed Floor NPC spawns on any actions --- .github/CHANGELOG.md | 5 + pom.xml | 10 +- .../plugily/projects/buildbattle/Main.java | 7 + .../arena/states/build/InGameState.java | 2 +- .../buildbattle/boot/MessageInitializer.java | 1 + .../admin/arena/SetThemeArgument.java | 32 ++- .../registry/playerheads/HeadsCategory.java | 9 + .../playerheads/PlayerHeadsOption.java | 139 ++++++++++--- .../playerheads/PlayerHeadsRegistry.java | 125 +++++++++-- .../handlers/misc/HeadDatabaseManager.java | 194 ++++++++++++++++++ .../handlers/setup/SpecificCategory.java | 15 +- src/main/resources/config.yml | 2 +- src/main/resources/heads/mainmenu.yml | 143 ++++++++++++- src/main/resources/language.yml | 4 +- 14 files changed, 619 insertions(+), 69 deletions(-) create mode 100644 src/main/java/plugily/projects/buildbattle/handlers/misc/HeadDatabaseManager.java diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index c936b6bd..33306e76 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -11,10 +11,15 @@ deploy webhooks to print changelog successfully That's all, matcher will stop when detects next line started with `###` match ### 5.1.0 Release (22.05.2025) +* TODO MAKE LANGUAGE:YML UPDATE BEFORE RELEASE! +* Added Heads from HeadDatabase (selected on each server start 200 per category) +* Added Heads Search function * Added paginated Heads menu to support more than one site of heads * Added onVoteInventoryInteractEvent to block movement of items while plot voting stage * Added a lot of new default themes at themes.yml (+140) * Added possibility to add same meaning words for gtb themes by using ", " in themes.yml +* Added /bba settheme for Console use +* Fixed Floor NPC spawns on any actions * Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb * Fixed on first time setup without restart the NPE getArenaInGameState is null * Fixed ItemFrames and Paintings were not able to be removed by player on plot diff --git a/pom.xml b/pom.xml index d6a31883..1e7ff3cb 100644 --- a/pom.xml +++ b/pom.xml @@ -62,6 +62,14 @@ + io.papermc.paper paper-api @@ -78,7 +86,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.2 + 1.4.2-SNAPSHOT6 compile true diff --git a/src/main/java/plugily/projects/buildbattle/Main.java b/src/main/java/plugily/projects/buildbattle/Main.java index 2bf87f06..aaef09e1 100644 --- a/src/main/java/plugily/projects/buildbattle/Main.java +++ b/src/main/java/plugily/projects/buildbattle/Main.java @@ -34,6 +34,7 @@ import plugily.projects.buildbattle.commands.arguments.ArgumentsRegistry; import plugily.projects.buildbattle.handlers.menu.OptionsRegistry; import plugily.projects.buildbattle.handlers.misc.BlacklistManager; +import plugily.projects.buildbattle.handlers.misc.HeadDatabaseManager; import plugily.projects.buildbattle.handlers.setup.SetupCategoryManager; import plugily.projects.buildbattle.handlers.themes.ThemeManager; import plugily.projects.minigamesbox.classic.PluginMain; @@ -48,6 +49,7 @@ public class Main extends PluginMain { private VoteItems voteItems; + private HeadDatabaseManager headDatabaseManager; private ThemeManager themeManager; private BlacklistManager blacklistManager; private OptionsRegistry optionsRegistry; @@ -81,6 +83,7 @@ public void initializePluginClasses() { addFileName("themes"); addFileName("vote_items"); blacklistManager = new BlacklistManager(this); + headDatabaseManager = new HeadDatabaseManager(this); themeManager = new ThemeManager(this); BaseArena.init(this); new ArenaEvents(this); @@ -111,6 +114,10 @@ public VoteItems getVoteItems() { return voteItems; } + public HeadDatabaseManager getHeadDatabaseManager() { + return headDatabaseManager; + } + public ThemeManager getThemeManager() { return themeManager; } diff --git a/src/main/java/plugily/projects/buildbattle/arena/states/build/InGameState.java b/src/main/java/plugily/projects/buildbattle/arena/states/build/InGameState.java index 5d1f000c..b78ce81a 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/states/build/InGameState.java +++ b/src/main/java/plugily/projects/buildbattle/arena/states/build/InGameState.java @@ -259,7 +259,7 @@ public void voteRoutine(BuildArena pluginArena) { while(plot == null && !pluginArena.getQueue().isEmpty()) { // should not happen anymore... to be removed - System.out.print("A PLAYER HAS NO PLOT!"); + getPlugin().getDebugger().debug("A PLAYER HAS NO PLOT!"); plot = pluginArena.getQueue().poll(); } diff --git a/src/main/java/plugily/projects/buildbattle/boot/MessageInitializer.java b/src/main/java/plugily/projects/buildbattle/boot/MessageInitializer.java index 30a38f53..35f716b7 100644 --- a/src/main/java/plugily/projects/buildbattle/boot/MessageInitializer.java +++ b/src/main/java/plugily/projects/buildbattle/boot/MessageInitializer.java @@ -111,6 +111,7 @@ public void registerMessages() { messageManager.registerMessage("MENU_OPTION_CONTENT_HEADS_INVENTORY", new Message("Menu.Option.Content.Heads.Inventory", "")); messageManager.registerMessage("MENU_OPTION_CONTENT_HEADS_ITEM_NAME", new Message("Menu.Option.Content.Heads.Item.Name", "")); messageManager.registerMessage("MENU_OPTION_CONTENT_HEADS_ITEM_LORE", new Message("Menu.Option.Content.Heads.Item.Lore", "")); + messageManager.registerMessage("MENU_OPTION_CONTENT_HEADS_DATABASE_LORE", new Message("Menu.Option.Content.Heads.Database.Lore", "Get Head %value%")); messageManager.registerMessage("MENU_OPTION_CONTENT_FLOOR_ITEM_NAME", new Message("Menu.Option.Content.Floor.Item.Name", "")); messageManager.registerMessage("MENU_OPTION_CONTENT_FLOOR_ITEM_LORE", new Message("Menu.Option.Content.Floor.Item.Lore", "")); messageManager.registerMessage("MENU_OPTION_CONTENT_FLOOR_CHANGED", new Message("Menu.Option.Content.Floor.Changed", "")); diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/SetThemeArgument.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/SetThemeArgument.java index afe7ab82..c0985653 100644 --- a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/SetThemeArgument.java +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/SetThemeArgument.java @@ -31,6 +31,7 @@ import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import java.io.Console; import java.util.StringJoiner; /** @@ -41,12 +42,29 @@ public class SetThemeArgument { public SetThemeArgument(ArgumentsRegistry registry) { - registry.mapArgument("buildbattleadmin", new LabeledCommandArgument("settheme", "buildbattle.admin.settheme", CommandArgument.ExecutorType.PLAYER, - new LabelData("/bba settheme &6", "/bba settheme", + registry.mapArgument("buildbattleadmin", new LabeledCommandArgument("settheme", "buildbattle.admin.settheme", CommandArgument.ExecutorType.BOTH, + new LabelData("/bba settheme &6", "/bba settheme || Console /bba settheme ", "&7Set new arena theme\n&6Permission: &7buildbattle.admin.settheme\n&6You can set arena theme only when it started\n&6and only for 20 seconds after start!")) { @Override public void execute(CommandSender sender, String[] args) { - BaseArena arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena((Player) sender); + if(args.length == 1) { + //todo translatable + new MessageBuilder("&cPlease type arena theme!").prefix().send(sender); + return; + } + BaseArena arena; + int themeArgStart = 1; + if(!(sender instanceof Player)) { + if(args.length == 2) { + //todo translatable + new MessageBuilder("&cPlease type arena name!").prefix().send(sender); + return; + } + arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena(args[1]); + themeArgStart = 2; + } else { + arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena((Player) sender); + } if(arena == null) { new MessageBuilder("COMMANDS_NOT_PLAYING").asKey().send(sender); return; @@ -56,13 +74,9 @@ public void execute(CommandSender sender, String[] args) { new MessageBuilder("&cCan't set theme on this arena type!").prefix().send(sender); return; } - if(args.length == 1) { - //todo translatable - new MessageBuilder("&cPlease type arena theme!").prefix().send(sender); - return; - } StringJoiner themeName = new StringJoiner(" "); - for(int i = 1; i < args.length; i++) + + for(int i = themeArgStart; i < args.length; i++) themeName.add(args[i]); if(arena.getArenaInGameState() == BaseArena.ArenaInGameState.BUILD_TIME || arena.getArenaState() == IArenaState.STARTING) { if(arena.getPlugin().getThemeManager().isThemeBlacklisted(themeName.toString())) { diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java index 969e3ff3..3dee56a9 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/HeadsCategory.java @@ -36,6 +36,7 @@ public class HeadsCategory { private ItemStack itemStack; private String permission; private PaginatedFastInv gui; + private boolean search = false; public HeadsCategory(String categoryID) { this.categoryID = categoryID; @@ -68,4 +69,12 @@ public PaginatedFastInv getGui() { public void setGui(PaginatedFastInv inventoryView) { this.gui = inventoryView; } + + public void setSearch(boolean search) { + this.search = search; + } + + public boolean isSearch() { + return search; + } } diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsOption.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsOption.java index 1f65916a..46223997 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsOption.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsOption.java @@ -20,16 +20,30 @@ package plugily.projects.buildbattle.handlers.menu.registry.playerheads; +import org.bukkit.conversations.ConversationContext; +import org.bukkit.conversations.Prompt; +import org.bukkit.conversations.StringPrompt; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import plugily.projects.buildbattle.handlers.menu.MenuOption; import plugily.projects.buildbattle.handlers.menu.OptionsRegistry; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; +import plugily.projects.minigamesbox.classic.utils.conversation.SimpleConversationBuilder; import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; import plugily.projects.minigamesbox.inventory.normal.NormalFastInv; +import plugily.projects.minigamesbox.inventory.utils.fastinv.InventoryScheme; +import plugily.projects.minigamesbox.inventory.utils.fastinv.PaginatedFastInv; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; /** * @author Plajer @@ -38,41 +52,98 @@ */ public class PlayerHeadsOption { - public PlayerHeadsOption(OptionsRegistry registry) { - registry.registerOption(new MenuOption(10, "PLAYER_HEADS", new ItemBuilder(XMaterial.PLAYER_HEAD.parseItem()) - .name(new MessageBuilder("MENU_OPTION_CONTENT_HEADS_ITEM_NAME").asKey().build()) - .lore(new MessageBuilder("MENU_OPTION_CONTENT_HEADS_ITEM_LORE").asKey().build()) - .build(), new MessageBuilder("MENU_OPTION_CONTENT_HEADS_INVENTORY").asKey().build()) { - - @Override - public void onClick(InventoryClickEvent event) { - HumanEntity humanEntity = event.getWhoClicked(); - humanEntity.closeInventory(); - if (!(humanEntity instanceof Player)) { - return; - } - Player player = (Player) humanEntity; - if (registry.getPlugin().getConfigPreferences().getOption("HEAD_MENU_CUSTOM")) { - player.performCommand(registry.getPlugin().getConfig().getString("Head-Menu.Command", "heads")); - return; - } - NormalFastInv gui = new NormalFastInv(registry.getPlugin().getBukkitHelper().serializeInt(registry.getPlayerHeadsRegistry().getCategories().size() + 1), new MessageBuilder("MENU_OPTION_CONTENT_HEADS_INVENTORY").asKey().build()); - - for (HeadsCategory headsCategory : registry.getPlayerHeadsRegistry().getCategories().keySet()) { - gui.addItem(new SimpleClickableItem(headsCategory.getItemStack(), clickEvent -> { - player.closeInventory(); - if (!player.hasPermission(headsCategory.getPermission())) { - new MessageBuilder("IN_GAME_MESSAGES_PLOT_PERMISSION_HEAD").asKey().player(player).sendPlayer(); - return; - } - headsCategory.getGui().open(player); - })); - } - - registry.getPlugin().getOptionsRegistry().addGoBackItem(gui, gui.getInventory().getSize() - 1); - gui.open(humanEntity); + public PlayerHeadsOption(OptionsRegistry registry) { + registry.registerOption(new MenuOption(10, "PLAYER_HEADS", new ItemBuilder(XMaterial.PLAYER_HEAD.parseItem()) + .name(new MessageBuilder("MENU_OPTION_CONTENT_HEADS_ITEM_NAME").asKey().build()) + .lore(new MessageBuilder("MENU_OPTION_CONTENT_HEADS_ITEM_LORE").asKey().build()) + .build(), new MessageBuilder("MENU_OPTION_CONTENT_HEADS_INVENTORY").asKey().build()) { + + @Override + public void onClick(InventoryClickEvent event) { + HumanEntity humanEntity = event.getWhoClicked(); + humanEntity.closeInventory(); + if(!(humanEntity instanceof Player)) { + return; + } + Player player = (Player) humanEntity; + if(registry.getPlugin().getConfigPreferences().getOption("HEAD_MENU_CUSTOM")) { + player.performCommand(registry.getPlugin().getConfig().getString("Head-Menu.Command", "heads")); + return; + } + NormalFastInv gui = new NormalFastInv(registry.getPlugin().getBukkitHelper().serializeInt(registry.getPlayerHeadsRegistry().getCategories().size() + 1), new MessageBuilder("MENU_OPTION_CONTENT_HEADS_INVENTORY").asKey().build()); + + for(HeadsCategory headsCategory : registry.getPlayerHeadsRegistry().getCategories().keySet()) { + if(headsCategory.isSearch()) { + gui.setItem(gui.getInventory().getSize() - 2, headsCategory.getItemStack(), clickEvent -> { + player.closeInventory(); + if(!player.hasPermission(headsCategory.getPermission())) { + new MessageBuilder("IN_GAME_MESSAGES_PLOT_PERMISSION_HEAD").asKey().player(player).sendPlayer(); + return; + } + createChatEvent(event, player, registry); + }); + continue; + } + + gui.addItem(headsCategory.getItemStack(), clickEvent -> { + player.closeInventory(); + if(!player.hasPermission(headsCategory.getPermission())) { + new MessageBuilder("IN_GAME_MESSAGES_PLOT_PERMISSION_HEAD").asKey().player(player).sendPlayer(); + return; } + headsCategory.getGui().open(player); + }); + } + + registry.getPlugin().getOptionsRegistry().addGoBackItem(gui, gui.getInventory().getSize() - 1); + gui.open(player); + } + }); + } + + private static void createChatEvent(InventoryClickEvent event, Player player, OptionsRegistry registry) { + new SimpleConversationBuilder(registry.getPlugin()).withPrompt(new StringPrompt() { + @Override + public @NotNull String getPromptText(ConversationContext context) { + return new MessageBuilder("&ePlease type in chat the name of the head!").prefix().build(); + } + + @Override + public Prompt acceptInput(ConversationContext context, String input) { + String name = new MessageBuilder(input, false).build(); + context.getForWhom().sendRawMessage(new MessageBuilder("&e✔ Completed | Got " + name).prefix().build()); + + PaginatedFastInv resultGui = new PaginatedFastInv(54, new MessageBuilder("Searching %value%").value(name).build()); + new InventoryScheme() + .mask("111111111") + .mask("111111111") + .mask("111111111") + .mask("111111111") + .mask("111111111") + .bindPagination('1').apply(resultGui); + + + resultGui.previousPageItem(45, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("&7<- &6" + p + "&7/&6" + resultGui.lastPage()).colorizeItem().build()); + resultGui.addPageChangeHandler(openedPage -> { + resultGui.setItem(49, new ItemBuilder(XMaterial.BARRIER.parseItem()).name("&7X &6" + openedPage + " &7X").colorizeItem().build(), e -> e.getWhoClicked().closeInventory()); }); - } + resultGui.nextPageItem(53, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("&6 " + p + "&7/&6" + resultGui.lastPage() + " &7->").colorizeItem().build()); + + registry.getPlugin().getOptionsRegistry().addGoBackItem(resultGui, 46); + + List filteredHeads = registry.getPlayerHeadsRegistry().getHeadsDatabase().values().stream() + .flatMap(innerMap -> innerMap.entrySet().stream()) + .filter(entry -> entry.getKey().toLowerCase().contains(input.toLowerCase())) + .map(Map.Entry::getValue) + .collect(Collectors.toList()); + + for(ItemStack playerHead : filteredHeads) { + resultGui.addContent(playerHead, clickEvent -> clickEvent.getWhoClicked().getInventory().addItem(playerHead.clone())); + } + resultGui.open(player); + return Prompt.END_OF_CONVERSATION; + } + }).buildFor((Player) event.getWhoClicked()); + } } diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java index b34290e9..e728d286 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java @@ -20,21 +20,30 @@ package plugily.projects.buildbattle.handlers.menu.registry.playerheads; +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import plugily.projects.buildbattle.Main; +import plugily.projects.buildbattle.arena.BaseArena; import plugily.projects.buildbattle.handlers.menu.OptionsRegistry; +import plugily.projects.buildbattle.handlers.misc.HeadDatabaseManager; import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; import plugily.projects.minigamesbox.classic.utils.helper.ItemUtils; import plugily.projects.minigamesbox.classic.utils.misc.complement.ComplementAccessor; +import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XEnchantment; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.minigamesbox.inventory.utils.fastinv.InventoryScheme; import plugily.projects.minigamesbox.inventory.utils.fastinv.PaginatedFastInv; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.stream.Collectors; /** @@ -58,6 +67,27 @@ private void registerCategories() { if(!config.getBoolean(str + ".enabled", true)) { continue; } + if(config.getBoolean(str + ".database", false)) { + String categoryName = config.getString(str + ".config", "fail"); + if(categoryName.equalsIgnoreCase("search")) { + HeadsCategory category = new HeadsCategory(str); + category.setItemStack(new ItemBuilder(ItemUtils.getSkull(config.getString(str + ".texture"))) + .name(new MessageBuilder(config.getString(str + ".displayname")).value(categoryName.toUpperCase()).build()) + .lore(config.getStringList(str + ".lore").stream() + .map(lore -> new MessageBuilder(lore).value(categoryName.toUpperCase()).build()).collect(Collectors.toList())) + .glowEffect().build()); + category.setPermission(config.getString(str + ".permission")); + category.setSearch(true); + categories.put(category, null); + } else { + CompletableFuture.supplyAsync(() -> plugin.getHeadDatabaseManager().getDatabase(categoryName)).thenAccept(download -> { + if(download != HeadDatabaseManager.DownloadStatus.FAIL) { + useDatabaseHeads(config, str); + } + }); + } + continue; + } HeadsCategory category = new HeadsCategory(str); category.setItemStack(new ItemBuilder(ItemUtils.getSkull(config.getString(str + ".texture"))) @@ -84,37 +114,98 @@ private void registerCategories() { stack.setItemMeta(im); playerHeads.add(stack); } - PaginatedFastInv gui = new PaginatedFastInv(54, new MessageBuilder(config.getString(str + ".menuname")).build()); - new InventoryScheme() - .mask(" 1111111 ") - .mask(" 1111111 ") - .mask(" 1111111 ") - .mask(" 1111111 ") - .bindPagination('1').apply(gui); + createPaginatedInventory(str, config, playerHeads, category); + } + } + private void createPaginatedInventory(String str, FileConfiguration config, Collection playerHeads, HeadsCategory category) { + PaginatedFastInv gui = new PaginatedFastInv(54, new MessageBuilder(config.getString(str + ".menuname")).value(config.getString(str + ".config")).build()); + new InventoryScheme() + .mask("111111111") + .mask("111111111") + .mask("111111111") + .mask("111111111") + .mask("111111111") + .bindPagination('1').apply(gui); + + + gui.previousPageItem(45, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("&7<- &6" + p + "&7/&6" + gui.lastPage()).colorizeItem().build()); + gui.addPageChangeHandler(openedPage -> { + gui.setItem(49, new ItemBuilder(XMaterial.BARRIER.parseItem()).name("&7X &6" + openedPage + " &7X").colorizeItem().build(), e -> e.getWhoClicked().closeInventory()); + }); + gui.nextPageItem(53, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("&6 " + p + "&7/&6" + gui.lastPage() + " &7->").colorizeItem().build()); + + plugin.getOptionsRegistry().addGoBackItem(gui, 46); + + if(playerHeads.size() > 200) { + List heads = new ArrayList<>(playerHeads); + Collections.shuffle(heads); + int start = plugin.getRandom().nextInt(heads.size() - 225); + playerHeads = heads.subList(start, start + 225); + } - gui.previousPageItem(45, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name("<- " + p + "/" + gui.lastPage()).build()); - gui.nextPageItem(53, p -> new ItemBuilder(XMaterial.ARROW.parseItem()).name(p + "/" + gui.lastPage() + " ->").build()); + for(ItemStack playerHead : playerHeads) { + gui.addContent(playerHead, clickEvent -> clickEvent.getWhoClicked().getInventory().addItem(playerHead.clone())); + } - gui.setItem(52, new ItemBuilder(XMaterial.BARRIER.parseItem()).name("X").build(), - e -> e.getWhoClicked().closeInventory()); + plugin.getOptionsRegistry().addGoBackItem(gui, gui.getInventory().getSize() - 1); + category.setGui(gui); + categories.put(category, gui); + } - plugin.getOptionsRegistry().addGoBackItem(gui, 46); + public void useDatabaseHeads(FileConfiguration config, String str) { + HeadsCategory category = new HeadsCategory(str); + String categoryName = config.getString(str + ".config", "fail"); + category.setItemStack(new ItemBuilder(ItemUtils.getSkull(config.getString(str + ".texture"))) + .name(new MessageBuilder(config.getString(str + ".displayname")).value(categoryName.toUpperCase()).build()) + .lore(config.getStringList(str + ".lore").stream() + .map(lore -> new MessageBuilder(lore).value(categoryName.toUpperCase()).build()).collect(Collectors.toList())) + .build()); + category.setPermission(config.getString(str + ".permission")); - for(ItemStack playerHead : playerHeads) { - gui.addContent(playerHead, clickEvent -> clickEvent.getWhoClicked().getInventory().addItem(playerHead.clone())); + CompletableFuture.supplyAsync(() -> loadHeadsFromYML(categoryName)).thenAccept(playerHeads -> createPaginatedInventory(str, config, playerHeads.values(), category)); + } + + private final Map> headsDatabase = new HashMap<>(); + + public Map loadHeadsFromYML(String name) { + // Should do this in async thread to do not cause dead for the main thread + long start = System.currentTimeMillis(); + FileConfiguration categoryConfig = ConfigUtils.getConfig(plugin, "heads/database/" + name); + Map heads = new HashMap<>(); + for(String path : categoryConfig.getKeys(false)) { + heads.put(path, categoryConfig.getString(path)); + } + plugin.getDebugger().debug("[System] [Plugin] Head file loading " + name + " finished took ms" + (System.currentTimeMillis() - start)); + + long secondStart = System.currentTimeMillis(); + Map playerHeads = new HashMap<>(); + for(Map.Entry entry : heads.entrySet()) { + if(entry.getKey().toLowerCase().contains("(dup)")) { + continue; } + ItemStack stack = ItemUtils.getSkull(entry.getValue()); + ItemMeta im = stack.getItemMeta(); - plugin.getOptionsRegistry().addGoBackItem(gui, gui.getInventory().getSize() - 1); - category.setGui(gui); - categories.put(category, gui); + ComplementAccessor.getComplement().setDisplayName(im, new MessageBuilder(entry.getKey()).build()); + ComplementAccessor.getComplement().setLore(im, Collections.singletonList(new MessageBuilder("MENU_OPTION_CONTENT_HEADS_DATABASE_LORE").asKey().value(entry.getKey()).build())); + stack.setItemMeta(im); + playerHeads.put(entry.getKey(), stack); } + headsDatabase.put(name, playerHeads); + plugin.getDebugger().debug("[System] [Plugin] Head textures loading " + name + " finished took ms" + (System.currentTimeMillis() - secondStart)); + return playerHeads; } + public Map getCategories() { return categories; } + public Map> getHeadsDatabase() { + return headsDatabase; + } + } diff --git a/src/main/java/plugily/projects/buildbattle/handlers/misc/HeadDatabaseManager.java b/src/main/java/plugily/projects/buildbattle/handlers/misc/HeadDatabaseManager.java new file mode 100644 index 00000000..ce40a6d6 --- /dev/null +++ b/src/main/java/plugily/projects/buildbattle/handlers/misc/HeadDatabaseManager.java @@ -0,0 +1,194 @@ +package plugily.projects.buildbattle.handlers.misc; + +import plugily.projects.buildbattle.Main; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; + +import javax.net.ssl.HttpsURLConnection; +import java.io.*; +import java.net.URL; +import java.nio.file.Files; +import java.util.*; +import java.util.logging.Level; + +/** + * @author Tigerpanzer_02 + *

+ * Created at 09.07.2025 + */ +public class HeadDatabaseManager { + + private final Main plugin; + private final ArrayList headCatalog = new ArrayList<>(Arrays.asList("alphabet", "animals", "blocks", "decoration", "food-drinks", "humanoid", "humans", "miscellaneous", "monsters", "plants")); + + public HeadDatabaseManager(Main plugin) { + this.plugin = plugin; + try(Scanner scanner = new Scanner(requestHeadFetch(null), "UTF-8").useDelimiter("\\A")) { + String data = scanner.hasNext() ? scanner.next() : ""; + File file = new File(plugin.getDataFolder().getPath() + "/heads/database/head_data.yml"); + if(!file.exists()) { + new File(plugin.getDataFolder().getPath() + "/heads/").mkdir(); + new File(plugin.getDataFolder().getPath() + "/heads/database/").mkdir(); + if(!file.createNewFile()) { + plugin.getDebugger().debug(Level.WARNING, "Couldn't create heads folder! We must disable heads support."); + return; + } + } + Files.write(file.toPath(), data.getBytes()); + plugin.getDebugger().debug(Level.WARNING, "Fetched latest heads file from repository."); + } catch(IOException ignored) { + //ignore exceptions + plugin.getDebugger().debug(Level.WARNING, "Couldn't access heads fetcher service or there is other problem! You should notify author!"); + } + } + + public DownloadStatus getDatabase(String databaseName) { + if(!headCatalog.contains(databaseName)) { + return DownloadStatus.FAIL; + } + return download(plugin, databaseName); + } + + public ArrayList getHeadCatalog() { + return headCatalog; + } + + private DownloadStatus download(Main plugin, String name) { + DownloadStatus status = demandHeadDownload(name); + if(status == DownloadStatus.FAIL) { + plugin.getDebugger().debug(Level.WARNING, "&cHeads service couldn't download latest heads for plugin! Reduced heads will be used instead!"); + } else if(status == DownloadStatus.SUCCESS) { + plugin.getDebugger().debug(Level.WARNING, "&aDownloaded heads " + name + " properly!"); + } else if(status == DownloadStatus.LATEST) { + plugin.getDebugger().debug(Level.WARNING, "&aHeads " + name + " is latest! Awesome!"); + } + return status; + } + + + private InputStream requestHeadFetch(String head) { + try { + URL url = new URL("https://api.plugily.xyz/onlineservices/v1/fetch.php"); + HttpsURLConnection conn = (HttpsURLConnection) url.openConnection(); + conn.setRequestMethod("POST"); + conn.setRequestProperty("User-Agent", "PlugilyProjectsOnlineServices/1.0"); + conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); + conn.setRequestProperty("Accept-Charset", "UTF-8"); + conn.setDoOutput(true); + + OutputStream os = conn.getOutputStream(); + if(head == null) { + os.write(("pass=onlineservice").getBytes("UTF-8")); + } else { + os.write(("pass=onlineservice&head=" + head).getBytes("UTF-8")); + } + os.flush(); + os.close(); + return conn.getInputStream(); + } catch(IOException e) { + plugin.getDebugger().debug(Level.SEVERE, "Could not fetch heads from plugily.xyz api! Cause: {0} ({1})", new Object[]{e.getCause(), e.getMessage()}); + return new InputStream() { + @Override + public int read() { + return -1; + } + }; + } + } + + private DownloadStatus demandHeadDownload(String head) { + File headFile = new File(plugin.getDataFolder() + "/heads/database/" + head + ".yml"); + if(!headFile.exists() || !isExact(head, headFile)) { + return writeFile(head); + } + return DownloadStatus.LATEST; + } + + private boolean isExact(String head, File file) { + try(Scanner scanner = new Scanner(requestHeadFetch(head), "UTF-8").useDelimiter("\\A"); + Scanner localScanner = new Scanner(file, "UTF-8").useDelimiter("\\A")) { + String onlineData = scanner.hasNext() ? scanner.next() : ""; + String localData = localScanner.hasNext() ? localScanner.next() : ""; + + return onlineData.equals(localData); + } catch(IOException ignored) { + return false; + } + } + + private DownloadStatus writeFile(String head) { + try(Scanner scanner = new Scanner(requestHeadFetch(head), "UTF-8").useDelimiter("\\A")) { + String data = scanner.hasNext() ? scanner.next() : ""; + try(OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(plugin.getDataFolder().getPath() + "/heads/database/" + head + ".yml"), "UTF-8")) { + writer.write(data); + } + return DownloadStatus.SUCCESS; + } catch(IOException ignored) { + plugin.getDebugger().debug(Level.WARNING, "Demanded head " + head + " cannot be downloaded! You should notify author!"); + return DownloadStatus.FAIL; + } + } + +/* + [ARCHIVE] Convert Heads with Json to YML Code + private void loadFileFromJSONde(String input) { + long start = System.currentTimeMillis(); + JsonElement element = getJsonElement("https://raw.githubusercontent.com/Plugily-Projects/online-services/refs/heads/master/buildbattle/headdatabase/raw/" + input + ".yml"); + or + JsonElement element = getJsonElement("https://minecraft-heads.com/scripts/api.php?cat=decoration"); + if(element == null) { + return; + } + JsonArray outputJson = element.getAsJsonArray(); + AtomicInteger i = new AtomicInteger(); + i.set(0); + outputJson.forEach(categoryElement -> { + JsonObject category = categoryElement.getAsJsonObject(); + if(category.get("name") == null) { + return; + } + if(category.get("value") == null) { + return; + } + String name = category.get("name").getAsString(); + String value = category.get("value").getAsString(); + if(heads.get(name) != null) { + heads.put(name + " (dup) " + i.get(), value); + i.getAndIncrement(); + } else + heads.put(name, value); + }); + System.out.println(heads); + FileConfiguration categoryConfig = ConfigUtils.getConfig(plugin, "heads/menus/hd/" + input); + for(Map.Entry entry : heads.entrySet()) { + // System.out.println("Trying to save -> " + entry.getKey() + " "+ entry.getValue()); + categoryConfig.set(entry.getKey().replace(".", " "), entry.getValue()); + } + ConfigUtils.saveConfig(plugin, categoryConfig, "heads/menus/hd/" + input); + System.out.println("[System] [Plugin] Head finished took ms" + (System.currentTimeMillis() - start)); + heads.clear(); + } + + private final String USER_AGENT = "Plugily Projects Converter v1"; + + public JsonElement getJsonElement(String fullURL) { + try { + URL url = new URL(fullURL); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.addRequestProperty("User-Agent", USER_AGENT); + InputStream inputStream = connection.getInputStream(); + InputStreamReader reader = new InputStreamReader(inputStream); + return new JsonParser().parse(reader); + } catch(IOException e) { + e.printStackTrace(); + return null; + } + } + + */ + + public enum DownloadStatus { + SUCCESS, FAIL, LATEST + } + + +} diff --git a/src/main/java/plugily/projects/buildbattle/handlers/setup/SpecificCategory.java b/src/main/java/plugily/projects/buildbattle/handlers/setup/SpecificCategory.java index 9ccdf6c2..42a5f1fc 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/setup/SpecificCategory.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/setup/SpecificCategory.java @@ -23,6 +23,7 @@ import org.bukkit.entity.Player; import plugily.projects.buildbattle.arena.BaseArena; import plugily.projects.buildbattle.arena.GuessArena; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.handlers.setup.categories.PluginSpecificCategory; import plugily.projects.minigamesbox.classic.handlers.setup.items.category.CountItem; import plugily.projects.minigamesbox.classic.handlers.setup.items.category.MultiLocationItem; @@ -52,8 +53,20 @@ public void addItems(NormalFastInv gui) { getItemList().add(gamePlot); MultiLocationItem floorNPC = new MultiLocationItem(getSetupInventory(), new ItemBuilder(XMaterial.VILLAGER_SPAWN_EGG.parseMaterial()), "Floor Changer NPC", "Add floor changer NPC to your plot.\nRequires Citizens plugin! Runs addnpc command", "floornpc", 0, event -> { - ((Player) event.getWhoClicked()).performCommand("bba addnpc"); + switch (event.getClick()) { + case LEFT: + ((Player) event.getWhoClicked()).performCommand("bba addnpc"); + } }, interactEvent -> { + switch (interactEvent.getAction()) { + case PHYSICAL: + case LEFT_CLICK_AIR: + interactEvent.getPlayer().performCommand("bba addnpc"); + (new MessageBuilder("&cPlease keep in mind to use blocks instead of player location for precise coordinates!")).prefix().send(interactEvent.getPlayer()); + break; + case LEFT_CLICK_BLOCK: + interactEvent.getPlayer().performCommand("bba addnpc"); + } }); gui.setItem((getInventoryLine() * 9) + 2, floorNPC); getItemList().add(floorNPC); diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index c1b646e3..a538a37d 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -251,7 +251,7 @@ Items: # Enable another Head menu instead of our Head-Menu: Custom: false - # The command that should be executed on the player + # The command that should be executed on the player if Head-Menu.Custom = true Command: heads diff --git a/src/main/resources/heads/mainmenu.yml b/src/main/resources/heads/mainmenu.yml index 9d619b65..91c81580 100644 --- a/src/main/resources/heads/mainmenu.yml +++ b/src/main/resources/heads/mainmenu.yml @@ -1,13 +1,13 @@ -animals: - displayname: '&6Animal heads' +simple-animals: + displayname: '&6Simple Animal heads' texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjIxNjY4ZWY3Y2I3OWRkOWMyMmNlM2QxZjNmNGNiNmUyNTU5ODkzYjZkZjRhNDY5NTE0ZTY2N2MxNmFhNCJ9fX0=" lore: - "Click to open" - - "animal heads menu" + - "simple animal heads menu" enabled: true config: animalheads permission: buildbattle.heads - menuname: "Animal heads" + menuname: "Simple Animal heads" miniblocks: displayname: '&6Mini block heads' texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzI4YTE4MTU2ODlkNzE5NGNmN2RiMDYxYjU5ZjYzMTA2MjY0YjUxMzg3OTc2YTdmYjc0YWI3OWI1NjQxIn19fQ==" @@ -28,3 +28,138 @@ info: config: info permission: buildbattle.heads menuname: "Info blocks" + +# Use HeadDatabase in addition to the configured ones +# You can remove categories from the catalog which shouldn't be loaded! +# Catalog: +# - alphabet +# - animals +# - blocks +# - decoration +# - food-drinks +# - humanoid +# - humans +# - miscellaneous +# - monsters +# - plants +database-alphabet: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzI1MDhlMmNhNjUwMGJjZTMwNTM5YzM4ODg0MmE1NjcyYjdiYzI5YTY4NzZkZDZhNTAyNTY3MmUyNTJkMjVkYSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: alphabet + permission: buildbattle.heads + menuname: "%value% blocks" +database-animals: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTQyYjllYzM0OTYwNjRiMDg1ZjdkMzBjZTkwYTBjOGY3NjM2YzhlZjUzMDNiMjBjMjVjYTEwYTk5N2JkNzQzMyJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: animals + permission: buildbattle.heads + menuname: "%value% blocks" +database-blocks: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzViNDQ4ZmQ5NWM4NzRjOTVmZTc0ODQ0NDFhNDM5NGQ2NDZiNzJiYzgyYTUyNzQ4M2ZkYzcwY2E3OTg2ZmNhNSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: blocks + permission: buildbattle.heads + menuname: "%value% blocks" +database-decoration: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjNhZjk0YTUwZmFmNTBhZTAyMzZjNzExZWMxMzZiMjgwOGFjODJiYjE3MWQ0MmIzOGQxNjc2MGQyMjBmMjU4MiJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: decoration + permission: buildbattle.heads + menuname: "%value% blocks" +database-food-drinks: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDUxMzdmYzBjZDUxMjAyNjcyMzgyYmZhZTAxZmViM2UxZTJiNzMxMDdlOThkMmM2YzhmNzE5ZjFkYTUzMGU2OCJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: food-drinks + permission: buildbattle.heads + menuname: "%value% blocks" +database-humanoid: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTc5Yzc3ZjEyYzg2NzM5OGE0MTgxMDgxZmI1YmY3MGM1ZmYzMjcxNWM2ODk3NTBjNmU3MTdkMDY5ZTgxMzFhOSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: humanoid + permission: buildbattle.heads + menuname: "%value% blocks" +database-humans: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDQ5MmRmZTNjZThjYjYxYjkwODYwZWZmOTM4Y2I4M2UxOWMxNmU5Y2IyZDliZjJhZDc4OTZjOTBmNWIyZTFmMCJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: humans + permission: buildbattle.heads + menuname: "%value% blocks" +database-miscellaneous: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDQ3OTE3MTkzZTlmYjdjYjk2OGZiYTAzYTJlMjg0YTA0NjEyMWIyZGMwMTU0MWNhY2RiYTUzYTRmOWJiZjcwOCJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: miscellaneous + permission: buildbattle.heads + menuname: "%value% blocks" +database-monsters: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTgyYjQxZjY3YjMzNzE0NWM1ZWI4M2I5ZTAwMTU1NzQ4MDE2MGE1NWU5MWVmODYzZWIwYmYwNTU3Mzg0MmNlMSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: monsters + permission: buildbattle.heads + menuname: "%value% blocks" +database-plants: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDA4MzY2YjgxMWM0MzU5YWVhNjY4NjMwMGNmZDQ1MGQ5ZWFhNDYxNGMzYWYwOGExN2YxNTEzZjVkMmY0OGM0YSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: plants + permission: buildbattle.heads + menuname: "%value% blocks" +database-search: + displayname: '&6%value% heads' + texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjViOTVkYTEyODE2NDJkYWE1ZDAyMmFkYmQzZTdjYjY5ZGMwOTQyYzgxY2Q2M2JlOWMzODU3ZDIyMmUxYzhkOSJ9fX0=" + lore: + - "Click to open" + - "%value% menu" + enabled: true + database: true + config: search + permission: buildbattle.heads + menuname: "%value% blocks" \ No newline at end of file diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index 5a76024a..d133970d 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -377,6 +377,8 @@ Menu: Item: Name: "&bGet player heads" Lore: "Click to get heads" + Database: + Lore: "Get Head %value%" Floor: Item: Name: "&bChange floor material" @@ -571,5 +573,5 @@ Leaderboard: # Really, don't edit ;p # You edited it, huh? Next time hurt yourself! Do-Not-Edit: - File-Version: 1 + File-Version: 2 Core-Version: 2 From 344ad0757111d90e6ee8c66ce9f6d4319e3f227c Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 10 Jul 2025 18:39:16 +0000 Subject: [PATCH 42/53] Bump version from 5.0.15-SNAPSHOT12 to 5.0.15-SNAPSHOT13 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1e7ff3cb..842156ca 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT12 + 5.0.15-SNAPSHOT13 BuildBattle From 23a37ff9aaf2c211e1f81bddd292cfaf6c315f21 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Thu, 10 Jul 2025 23:57:33 +0200 Subject: [PATCH 43/53] Fixed Vehicles such as Boats could drive outside plot Fixed Flower Pots couldn't be destroyed on plot --- .github/CHANGELOG.md | 5 ++- .../buildbattle/arena/ArenaEvents.java | 38 +++++++++++++++---- src/main/resources/language.yml | 2 +- 3 files changed, 36 insertions(+), 9 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 33306e76..df9ec3df 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -10,7 +10,7 @@ deploy webhooks to print changelog successfully That's all, matcher will stop when detects next line started with `###` match -### 5.1.0 Release (22.05.2025) +### 5.1.0 Release (10.07.2025) * TODO MAKE LANGUAGE:YML UPDATE BEFORE RELEASE! * Added Heads from HeadDatabase (selected on each server start 200 per category) * Added Heads Search function @@ -31,6 +31,9 @@ That's all, matcher will stop when detects next line started with `###` match * Fixed Player Outside Plot interaction with blocks were possible * Fixed NPE AddGoBackButton * Fixed Water Flow on Ground +* Fixed Vehicles such as Boats could drive outside plot +* Fixed Flower Pots couldn't be destroyed on plot +* Fixed placeholder on message Changed-Theme * Changed Allow Plot selection also if ArenaState is FULL_GAME * Changed (for API usage) renamed BBTheme to GuessTheme * Changed Hide guessing players from builder in gtb mode diff --git a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java index 94370a1e..8319227c 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java +++ b/src/main/java/plugily/projects/buildbattle/arena/ArenaEvents.java @@ -53,6 +53,7 @@ import plugily.projects.minigamesbox.classic.utils.version.events.api.PlugilyPlayerInteractEntityEvent; import plugily.projects.minigamesbox.classic.utils.version.events.api.PlugilyPlayerInteractEvent; import plugily.projects.minigamesbox.classic.utils.version.events.api.PlugilyPlayerPickupArrow; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XEntityType; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; /** @@ -198,6 +199,26 @@ public void onHangingBreakEvent(HangingBreakByEntityEvent event) { } } + @EventHandler(priority = EventPriority.HIGHEST) + public void onPaintandFlowerInteraction(PlugilyPlayerInteractEvent event) { + Player player = event.getPlayer(); + BaseArena arena = plugin.getArenaRegistry().getArena(player); + if(arena == null || event.getClickedBlock() == null) { + return; + } + if(arena.getArenaState() != IArenaState.IN_GAME) { + return; + } + Plot buildPlot = arena.getPlotManager().getPlot(player); + if(event.getClickedBlock().getType() != XMaterial.PAINTING.parseMaterial() && event.getClickedBlock().getType() != XMaterial.FLOWER_POT.parseMaterial()) { + return; + } + if(buildPlot != null && buildPlot.getCuboid() != null && buildPlot.getCuboid().isIn(event.getClickedBlock().getLocation())) { + //need to cancel with highest as minigamescore is blocking it! + event.setCancelled(false); + } + } + @EventHandler public void onNPCClick(PlugilyPlayerInteractEntityEvent event) { if(VersionUtils.checkOffHand(event.getHand()) || event.getRightClicked().getType() != EntityType.VILLAGER) { @@ -270,25 +291,28 @@ public void onEnderchestClick(PlugilyPlayerInteractEvent event) { return; } - if(arena.getArenaState() != IArenaState.IN_GAME || event.getClickedBlock().getType() == XMaterial.ENDER_CHEST.parseMaterial()) { + if(event.getClickedBlock().getType() == XMaterial.ENDER_CHEST.parseMaterial()) { event.setCancelled(true); } } + //TODO recognise plot by location should be added, as current check will go through all plots... + //Alternative use filter!! @EventHandler - public void onMinecartMove(VehicleMoveEvent event) { + public void onVehicleMove(VehicleMoveEvent event) { Vehicle vehicle = event.getVehicle(); - if(vehicle.getType() != EntityType.MINECART) { - return; - } for(IPluginArena arena : plugin.getArenaRegistry().getArenas()) { if(!(arena instanceof BaseArena)) { continue; } for(Plot buildPlot : ((BaseArena) arena).getPlotManager().getPlots()) { - if(buildPlot.getCuboid() != null && !buildPlot.getCuboid().isInWithMarge(event.getTo(), -1) && buildPlot.getCuboid().isIn(event.getTo())) { - ((Minecart) vehicle).setMaxSpeed(0); + if(buildPlot.getCuboid() != null && !buildPlot.getCuboid().isIn(event.getTo())) { vehicle.setVelocity(vehicle.getVelocity().zero()); + if(vehicle.getType() == XEntityType.MINECART.get()) { + ((Minecart) vehicle).setMaxSpeed(0); + } else { + vehicle.remove(); + } } } } diff --git a/src/main/resources/language.yml b/src/main/resources/language.yml index d133970d..a7fd890f 100644 --- a/src/main/resources/language.yml +++ b/src/main/resources/language.yml @@ -293,7 +293,7 @@ In-Game: Own: "&aYou became #%number%" Admin: Set-Starting-In-To-0: "%plugin_prefix% An admin set waiting time to 0. The game starts now!" - Changed-Theme: "%plugin_prefix% Admin has changed theme to %THEME%" + Changed-Theme: "%plugin_prefix% Admin has changed theme to %value%" Plot: Nobody: "%color_chat_issue%Nobody" Time-Left: From 317d22cc40ed6fa099a63b1b8688cd26077bf4c4 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 10 Jul 2025 21:57:48 +0000 Subject: [PATCH 44/53] Bump version from 5.0.15-SNAPSHOT13 to 5.0.15-SNAPSHOT14 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 842156ca..8ae91a86 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT13 + 5.0.15-SNAPSHOT14 BuildBattle From 9d17eca0ae366db20b9f8bf1d1f7d68b5b18b82e Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Fri, 11 Jul 2025 00:28:55 +0200 Subject: [PATCH 45/53] Added LanguageMigrator --- pom.xml | 2 +- .../plugily/projects/buildbattle/Main.java | 2 + .../handlers/LanguageMigrator.java | 131 ++++++++++++++++++ .../resources/locales/language_default.yml | 10 +- 4 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java diff --git a/pom.xml b/pom.xml index 8ae91a86..1cf5dbbe 100644 --- a/pom.xml +++ b/pom.xml @@ -86,7 +86,7 @@ plugily.projects MiniGamesBox-Classic - 1.4.2-SNAPSHOT6 + 1.4.3 compile true diff --git a/src/main/java/plugily/projects/buildbattle/Main.java b/src/main/java/plugily/projects/buildbattle/Main.java index aaef09e1..4b60491b 100644 --- a/src/main/java/plugily/projects/buildbattle/Main.java +++ b/src/main/java/plugily/projects/buildbattle/Main.java @@ -32,6 +32,7 @@ import plugily.projects.buildbattle.boot.MessageInitializer; import plugily.projects.buildbattle.boot.PlaceholderInitializer; import plugily.projects.buildbattle.commands.arguments.ArgumentsRegistry; +import plugily.projects.buildbattle.handlers.LanguageMigrator; import plugily.projects.buildbattle.handlers.menu.OptionsRegistry; import plugily.projects.buildbattle.handlers.misc.BlacklistManager; import plugily.projects.buildbattle.handlers.misc.HeadDatabaseManager; @@ -70,6 +71,7 @@ public void onEnable() { MessageInitializer messageInitializer = new MessageInitializer(this); super.onEnable(); getDebugger().debug("[System] [Plugin] Initialization start"); + new LanguageMigrator(this); arenaRegistry = new ArenaRegistry(this); new PlaceholderInitializer(this); messageInitializer.registerMessages(); diff --git a/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java b/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java new file mode 100644 index 00000000..f160ca3f --- /dev/null +++ b/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java @@ -0,0 +1,131 @@ +/* + * MiniGamesBox - Library box with massive content that could be seen as minigames core. + * Copyright (C) 2023 Plugily Projects - maintained by Tigerpanzer_02 and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + + +package plugily.projects.buildbattle.handlers; + +import org.bukkit.configuration.file.FileConfiguration; +import plugily.projects.buildbattle.Main; +import plugily.projects.minigamesbox.classic.PluginMain; +import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; +import plugily.projects.minigamesbox.classic.utils.migrator.MigratorUtils; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.logging.Level; + +/* + NOTE FOR CONTRIBUTORS - Please do not touch this class if you don't know how it works! You can break migrator modifying these values! + */ + +/** + * @author Tigerpanzer_02 + *

+ * Created at 21.09.2021 + */ +@SuppressWarnings("deprecation") +public class LanguageMigrator { + + public enum PluginFileVersion { + /*ARENA_SELECTOR(0),*/ BUNGEE(1), CONFIG(1), LANGUAGE(2), + /*LEADERBOARDS(0),*/ MYSQL(1), PERMISSIONS(1), POWERUPS(1), + /*SIGNS(0),*/ SPECIAL_ITEMS(1), SPECTATOR(1)/*, STATS(0)*/; + + private final int version; + + PluginFileVersion(int version) { + this.version = version; + } + + public int getVersion() { + return version; + } + } + + private final Main plugin; + + public LanguageMigrator(Main plugin) { + this.plugin = plugin; + updatePluginFiles(); + } + + private void updatePluginFiles() { + for(PluginFileVersion pluginFileVersion : PluginFileVersion.values()) { + String fileName = pluginFileVersion.name().toLowerCase(); + int newVersion = pluginFileVersion.getVersion(); + File file = new File(plugin.getDataFolder() + "/" + fileName + ".yml"); + FileConfiguration configuration = ConfigUtils.getConfig(plugin, fileName, false); + if(configuration == null) { + continue; + } + int oldVersion = configuration.getInt("Do-Not-Edit.File-Version", 0); + if(oldVersion == newVersion) { + continue; + } + plugin.getDebugger().debug(Level.WARNING, "[System notify] The " + fileName + " file is outdated! Updating..."); + for(int i = oldVersion; i < newVersion; i++) { + executeUpdate(file, pluginFileVersion, i); + } + + updatePluginFileVersion(file, configuration, oldVersion, newVersion); + plugin.getDebugger().debug(Level.WARNING, "[System notify] " + fileName + " updated, no comments were removed :)"); + plugin.getDebugger().debug(Level.WARNING, "[System notify] You're using latest " + fileName + " file now! Nice!"); + + } + } + + private void executeUpdate(File file, PluginFileVersion pluginFileVersion, int version) { + switch(pluginFileVersion) { + case LANGUAGE: + switch(version) { + case 1: + MigratorUtils.insertAfterLine(file, " Heads:", " Database:\n" + + " Lore: \"Get Head %value%\""); + break; + default: + break; + } + break; + default: + break; + } + } + + public void updatePluginFileVersion(File file, FileConfiguration fileConfiguration, int oldVersion, int newVersion) { + int coreVersion = fileConfiguration.getInt("Do-Not-Edit.Core-Version", 0); + updateFileVersion(file, coreVersion, coreVersion, newVersion, oldVersion); + } + + private void updateFileVersion(File file, int coreVersion, int oldCoreVersion, int fileVersion, int oldFileVersion) { + MigratorUtils.removeLineFromFile(file, "# Don't edit it. But who's stopping you? It's your server!"); + MigratorUtils.removeLineFromFile(file, "# Really, don't edit ;p"); + MigratorUtils.removeLineFromFile(file, "# You edited it, huh? Next time hurt yourself!"); + MigratorUtils.removeLineFromFile(file, "Do-Not-Edit:"); + MigratorUtils.removeLineFromFile(file, " File-Version: " + oldFileVersion + ""); + MigratorUtils.removeLineFromFile(file, " Core-Version: " + oldCoreVersion + ""); + MigratorUtils.addNewLines(file, "# Don't edit it. But who's stopping you? It's your server!\r\n" + + "# Really, don't edit ;p\r\n" + + "# You edited it, huh? Next time hurt yourself!\r\n" + + "Do-Not-Edit:\r\n" + + " File-Version: " + fileVersion + "\r\n" + + " Core-Version: " + coreVersion + "\r\n"); + } + +} diff --git a/src/main/resources/locales/language_default.yml b/src/main/resources/locales/language_default.yml index eb1b585b..2cc2141f 100644 --- a/src/main/resources/locales/language_default.yml +++ b/src/main/resources/locales/language_default.yml @@ -290,7 +290,7 @@ In-Game: Own: "&aYou became #%number%" Admin: Set-Starting-In-To-0: "%plugin_prefix% An admin set waiting time to 0. The game starts now!" - Changed-Theme: "%plugin_prefix% Admin has changed theme to %THEME%" + Changed-Theme: "%plugin_prefix% Admin has changed theme to %value%" Plot: Nobody: "%color_chat_issue%Nobody" Time-Left: @@ -374,6 +374,8 @@ Menu: Item: Name: "&bGet player heads" Lore: "Click to get heads" + Database: + Lore: "Get Head %value%" Floor: Item: Name: "&bChange floor material" @@ -390,7 +392,7 @@ Menu: Noon: "Noon (6000 ticks)" Sunset: "Sunset (12000 ticks)" Night: "Night (13000 ticks)" - MidNight: "MidNight (18000 ticks)" + MidNight: "Midnight (18000 ticks)" Sunrise: "Sunrise (23000 ticks)" Changed: "%plugin_prefix% Time has been changed to %value%" Biome: @@ -568,5 +570,5 @@ Leaderboard: # Really, don't edit ;p # You edited it, huh? Next time hurt yourself! Do-Not-Edit: - File-Version: 1 - Core-Version: 1 + File-Version: 2 + Core-Version: 2 From 88805f459e0f7797478149a911381782688ad624 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Thu, 10 Jul 2025 22:29:11 +0000 Subject: [PATCH 46/53] Bump version from 5.0.15-SNAPSHOT14 to 5.0.15-SNAPSHOT15 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 1cf5dbbe..d09a8853 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT14 + 5.0.15-SNAPSHOT15 BuildBattle From b1025d404d60c2b452483dcb614360365872edf4 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 14 Jul 2025 22:06:13 +0200 Subject: [PATCH 47/53] Fixed LanguageMigrator needed twice a boot. Added mainmenu.yml migrator. --- .github/CHANGELOG.md | 2 +- .../plugily/projects/buildbattle/Main.java | 2 +- .../handlers/LanguageMigrator.java | 162 ++++++++++++++++-- .../playerheads/PlayerHeadsRegistry.java | 3 + src/main/resources/heads/mainmenu.yml | 4 +- 5 files changed, 158 insertions(+), 15 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index df9ec3df..a03f495c 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -11,7 +11,6 @@ deploy webhooks to print changelog successfully That's all, matcher will stop when detects next line started with `###` match ### 5.1.0 Release (10.07.2025) -* TODO MAKE LANGUAGE:YML UPDATE BEFORE RELEASE! * Added Heads from HeadDatabase (selected on each server start 200 per category) * Added Heads Search function * Added paginated Heads menu to support more than one site of heads @@ -37,6 +36,7 @@ That's all, matcher will stop when detects next line started with `###` match * Changed Allow Plot selection also if ArenaState is FULL_GAME * Changed (for API usage) renamed BBTheme to GuessTheme * Changed Hide guessing players from builder in gtb mode +* Changed LanguageMigrator on plugin level to update file versions * Updated Minigamesbox to 1.4.2 ### 5.0.15 Release (03.05.2025) diff --git a/src/main/java/plugily/projects/buildbattle/Main.java b/src/main/java/plugily/projects/buildbattle/Main.java index 4b60491b..79a775b0 100644 --- a/src/main/java/plugily/projects/buildbattle/Main.java +++ b/src/main/java/plugily/projects/buildbattle/Main.java @@ -68,10 +68,10 @@ public Main() { @Override public void onEnable() { long start = System.currentTimeMillis(); + new LanguageMigrator(this); MessageInitializer messageInitializer = new MessageInitializer(this); super.onEnable(); getDebugger().debug("[System] [Plugin] Initialization start"); - new LanguageMigrator(this); arenaRegistry = new ArenaRegistry(this); new PlaceholderInitializer(this); messageInitializer.registerMessages(); diff --git a/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java b/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java index f160ca3f..da36308a 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/LanguageMigrator.java @@ -19,17 +19,13 @@ package plugily.projects.buildbattle.handlers; +import org.bukkit.Bukkit; import org.bukkit.configuration.file.FileConfiguration; import plugily.projects.buildbattle.Main; -import plugily.projects.minigamesbox.classic.PluginMain; import plugily.projects.minigamesbox.classic.utils.configuration.ConfigUtils; import plugily.projects.minigamesbox.classic.utils.migrator.MigratorUtils; import java.io.File; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Paths; -import java.util.logging.Level; /* NOTE FOR CONTRIBUTORS - Please do not touch this class if you don't know how it works! You can break migrator modifying these values! @@ -38,7 +34,7 @@ /** * @author Tigerpanzer_02 *

- * Created at 21.09.2021 + * Created at 07.2025 */ @SuppressWarnings("deprecation") public class LanguageMigrator { @@ -46,7 +42,8 @@ public class LanguageMigrator { public enum PluginFileVersion { /*ARENA_SELECTOR(0),*/ BUNGEE(1), CONFIG(1), LANGUAGE(2), /*LEADERBOARDS(0),*/ MYSQL(1), PERMISSIONS(1), POWERUPS(1), - /*SIGNS(0),*/ SPECIAL_ITEMS(1), SPECTATOR(1)/*, STATS(0)*/; + /*SIGNS(0),*/ SPECIAL_ITEMS(1), SPECTATOR(1)/*, STATS(0)*/, + MAIN_MENU(1); private final int version; @@ -69,6 +66,9 @@ public LanguageMigrator(Main plugin) { private void updatePluginFiles() { for(PluginFileVersion pluginFileVersion : PluginFileVersion.values()) { String fileName = pluginFileVersion.name().toLowerCase(); + if(fileName.equalsIgnoreCase(PluginFileVersion.MAIN_MENU.name())) { + fileName = "heads/mainmenu"; + } int newVersion = pluginFileVersion.getVersion(); File file = new File(plugin.getDataFolder() + "/" + fileName + ".yml"); FileConfiguration configuration = ConfigUtils.getConfig(plugin, fileName, false); @@ -79,15 +79,14 @@ private void updatePluginFiles() { if(oldVersion == newVersion) { continue; } - plugin.getDebugger().debug(Level.WARNING, "[System notify] The " + fileName + " file is outdated! Updating..."); + Bukkit.getLogger().info("[System notify] The " + fileName + " file is outdated! Updating..."); for(int i = oldVersion; i < newVersion; i++) { executeUpdate(file, pluginFileVersion, i); } updatePluginFileVersion(file, configuration, oldVersion, newVersion); - plugin.getDebugger().debug(Level.WARNING, "[System notify] " + fileName + " updated, no comments were removed :)"); - plugin.getDebugger().debug(Level.WARNING, "[System notify] You're using latest " + fileName + " file now! Nice!"); - + Bukkit.getLogger().info("[System notify] " + fileName + " updated, no comments were removed :)"); + Bukkit.getLogger().info("[System notify] You're using latest " + fileName + " file now! Nice!"); } } @@ -102,6 +101,147 @@ private void executeUpdate(File file, PluginFileVersion pluginFileVersion, int v default: break; } + case MAIN_MENU: + switch(version) { + case 0: + MigratorUtils.addNewLines(file, "# Use HeadDatabase in addition to the configured ones\n" + + "# You can remove categories from the catalog which shouldn't be loaded!\n" + + "# Catalog:\n" + + "# - alphabet\n" + + "# - animals\n" + + "# - blocks\n" + + "# - decoration\n" + + "# - food-drinks\n" + + "# - humanoid\n" + + "# - humans\n" + + "# - miscellaneous\n" + + "# - monsters\n" + + "# - plants\n" + + "database-alphabet:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzI1MDhlMmNhNjUwMGJjZTMwNTM5YzM4ODg0MmE1NjcyYjdiYzI5YTY4NzZkZDZhNTAyNTY3MmUyNTJkMjVkYSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: alphabet\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-animals:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTQyYjllYzM0OTYwNjRiMDg1ZjdkMzBjZTkwYTBjOGY3NjM2YzhlZjUzMDNiMjBjMjVjYTEwYTk5N2JkNzQzMyJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: animals\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-blocks:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvYzViNDQ4ZmQ5NWM4NzRjOTVmZTc0ODQ0NDFhNDM5NGQ2NDZiNzJiYzgyYTUyNzQ4M2ZkYzcwY2E3OTg2ZmNhNSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: blocks\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-decoration:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMjNhZjk0YTUwZmFmNTBhZTAyMzZjNzExZWMxMzZiMjgwOGFjODJiYjE3MWQ0MmIzOGQxNjc2MGQyMjBmMjU4MiJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: decoration\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-food-drinks:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDUxMzdmYzBjZDUxMjAyNjcyMzgyYmZhZTAxZmViM2UxZTJiNzMxMDdlOThkMmM2YzhmNzE5ZjFkYTUzMGU2OCJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: food-drinks\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-humanoid:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTc5Yzc3ZjEyYzg2NzM5OGE0MTgxMDgxZmI1YmY3MGM1ZmYzMjcxNWM2ODk3NTBjNmU3MTdkMDY5ZTgxMzFhOSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: humanoid\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-humans:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDQ5MmRmZTNjZThjYjYxYjkwODYwZWZmOTM4Y2I4M2UxOWMxNmU5Y2IyZDliZjJhZDc4OTZjOTBmNWIyZTFmMCJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: humans\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-miscellaneous:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDQ3OTE3MTkzZTlmYjdjYjk2OGZiYTAzYTJlMjg0YTA0NjEyMWIyZGMwMTU0MWNhY2RiYTUzYTRmOWJiZjcwOCJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: miscellaneous\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-monsters:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTgyYjQxZjY3YjMzNzE0NWM1ZWI4M2I5ZTAwMTU1NzQ4MDE2MGE1NWU5MWVmODYzZWIwYmYwNTU3Mzg0MmNlMSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: monsters\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-plants:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNDA4MzY2YjgxMWM0MzU5YWVhNjY4NjMwMGNmZDQ1MGQ5ZWFhNDYxNGMzYWYwOGExN2YxNTEzZjVkMmY0OGM0YSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: plants\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\"\n" + + "database-search:\n" + + " displayname: '&6%value% heads'\n" + + " texture: \"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjViOTVkYTEyODE2NDJkYWE1ZDAyMmFkYmQzZTdjYjY5ZGMwOTQyYzgxY2Q2M2JlOWMzODU3ZDIyMmUxYzhkOSJ9fX0=\"\n" + + " lore:\n" + + " - \"Click to open\"\n" + + " - \"%value% menu\"\n" + + " enabled: true\n" + + " database: true\n" + + " config: search\n" + + " permission: buildbattle.heads\n" + + " menuname: \"%value% blocks\""); + break; + default: + break; + } break; default: break; diff --git a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java index e728d286..4c6d73e6 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/menu/registry/playerheads/PlayerHeadsRegistry.java @@ -67,6 +67,9 @@ private void registerCategories() { if(!config.getBoolean(str + ".enabled", true)) { continue; } + if(str.equalsIgnoreCase("Do-Not-Edit")) { + continue; + } if(config.getBoolean(str + ".database", false)) { String categoryName = config.getString(str + ".config", "fail"); if(categoryName.equalsIgnoreCase("search")) { diff --git a/src/main/resources/heads/mainmenu.yml b/src/main/resources/heads/mainmenu.yml index 91c81580..ecf26fe3 100644 --- a/src/main/resources/heads/mainmenu.yml +++ b/src/main/resources/heads/mainmenu.yml @@ -156,8 +156,8 @@ database-search: displayname: '&6%value% heads' texture: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNjViOTVkYTEyODE2NDJkYWE1ZDAyMmFkYmQzZTdjYjY5ZGMwOTQyYzgxY2Q2M2JlOWMzODU3ZDIyMmUxYzhkOSJ9fX0=" lore: - - "Click to open" - - "%value% menu" + - "Click to search" + - "for a head (english only!)" enabled: true database: true config: search From 84965c76e1c955f7d9ab4cb8d90c963454a103b5 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 14 Jul 2025 22:13:01 +0200 Subject: [PATCH 48/53] Fixed LanguageMigrator needed twice a boot. Added mainmenu.yml migrator. --- .github/CHANGELOG.md | 1 + .../plugily/projects/buildbattle/arena/BaseArena.java | 11 ++++++----- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index a03f495c..65486a3b 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -33,6 +33,7 @@ That's all, matcher will stop when detects next line started with `###` match * Fixed Vehicles such as Boats could drive outside plot * Fixed Flower Pots couldn't be destroyed on plot * Fixed placeholder on message Changed-Theme +* Fixed sendBuildLeftTimeMessage is not handled by MessageBuilder correctly * Changed Allow Plot selection also if ArenaState is FULL_GAME * Changed (for API usage) renamed BBTheme to GuessTheme * Changed Hide guessing players from builder in gtb mode diff --git a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java index 9f935ee9..39980f10 100644 --- a/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java +++ b/src/main/java/plugily/projects/buildbattle/arena/BaseArena.java @@ -34,6 +34,7 @@ import plugily.projects.minigamesbox.classic.handlers.language.TitleBuilder; import plugily.projects.minigamesbox.classic.handlers.reward.RewardType; import plugily.projects.minigamesbox.classic.handlers.reward.RewardsFactory; +import plugily.projects.minigamesbox.classic.utils.actionbar.ActionBar; import plugily.projects.minigamesbox.classic.utils.items.HandlerItem; import plugily.projects.minigamesbox.classic.utils.version.VersionUtils; @@ -159,11 +160,11 @@ public void setTheme(String arenaTheme) { public void sendBuildLeftTimeMessage() { new TitleBuilder("IN_GAME_MESSAGES_PLOT_TIME_LEFT_TITLE").asKey().arena(this).sendArena(); - String message = new MessageBuilder("IN_GAME_MESSAGES_PLOT_TIME_LEFT_CHAT").asKey().arena(this).build(); - for(Player p : getPlayers()) { - VersionUtils.sendActionBar(p, message); - p.sendMessage(message); - } + MessageBuilder message = new MessageBuilder("IN_GAME_MESSAGES_PLOT_TIME_LEFT_CHAT").asKey().arena(this); + message.sendArena(); + getPlayers().forEach(player -> + getPlugin().getActionBarManager().addActionBar(player, new ActionBar(message, + ActionBar.ActionBarType.DISPLAY))); } public final void checkPlayerOutSidePlot() { From 0428ec30616f55e39765aca73a77d521e660da60 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 14 Jul 2025 22:45:16 +0200 Subject: [PATCH 49/53] Added /bba forceplay --- .github/CHANGELOG.md | 1 + .../commands/arguments/ArgumentsRegistry.java | 3 + .../admin/arena/ForcePlayArgument.java | 99 +++++++++++++++++++ .../handlers/themes/vote/VoteMenu.java | 3 +- 4 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java diff --git a/.github/CHANGELOG.md b/.github/CHANGELOG.md index 65486a3b..89e2a82a 100644 --- a/.github/CHANGELOG.md +++ b/.github/CHANGELOG.md @@ -18,6 +18,7 @@ That's all, matcher will stop when detects next line started with `###` match * Added a lot of new default themes at themes.yml (+140) * Added possibility to add same meaning words for gtb themes by using ", " in themes.yml * Added /bba settheme for Console use +* Added /bba forceplay which moves all online players into arena and sets the theme * Fixed Floor NPC spawns on any actions * Fixed NPE if OptionsMenu Particles are opened as none builder whileas in gtb * Fixed on first time setup without restart the NPE getArenaInGameState is null diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/ArgumentsRegistry.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/ArgumentsRegistry.java index 4512098d..d48983a6 100644 --- a/src/main/java/plugily/projects/buildbattle/commands/arguments/ArgumentsRegistry.java +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/ArgumentsRegistry.java @@ -20,12 +20,14 @@ package plugily.projects.buildbattle.commands.arguments; +import org.checkerframework.checker.units.qual.Force; import plugily.projects.buildbattle.Main; import plugily.projects.buildbattle.arena.BaseArena; import plugily.projects.buildbattle.arena.BuildArena; import plugily.projects.buildbattle.arena.GuessArena; import plugily.projects.buildbattle.commands.arguments.admin.ThemeArgument; import plugily.projects.buildbattle.commands.arguments.admin.arena.AddNpcArgument; +import plugily.projects.buildbattle.commands.arguments.admin.arena.ForcePlayArgument; import plugily.projects.buildbattle.commands.arguments.admin.arena.SetThemeArgument; import plugily.projects.buildbattle.commands.arguments.admin.plot.AddPlotArgument; import plugily.projects.buildbattle.commands.arguments.admin.plot.RemovePlotArgument; @@ -48,6 +50,7 @@ public class ArgumentsRegistry extends PluginArgumentsRegistry { public ArgumentsRegistry(Main plugin) { super(plugin); new AddNpcArgument(this); + new ForcePlayArgument(this); new SetThemeArgument(this); new AddPlotArgument(this); new RemovePlotArgument(this); diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java new file mode 100644 index 00000000..693ccb14 --- /dev/null +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java @@ -0,0 +1,99 @@ +/* + * + * BuildBattle - Ultimate building competition minigame + * Copyright (C) 2022 Plugily Projects - maintained by Tigerpanzer_02 and contributors + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + */ + +package plugily.projects.buildbattle.commands.arguments.admin.arena; + +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import plugily.projects.buildbattle.arena.BaseArena; +import plugily.projects.buildbattle.arena.BuildArena; +import plugily.projects.buildbattle.commands.arguments.ArgumentsRegistry; +import plugily.projects.minigamesbox.api.arena.IArenaState; +import plugily.projects.minigamesbox.classic.commands.arguments.data.CommandArgument; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabelData; +import plugily.projects.minigamesbox.classic.commands.arguments.data.LabeledCommandArgument; +import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; + +import java.util.StringJoiner; + +/** + * @author Plajer + *

+ * Created at 11.01.2019 + */ +public class ForcePlayArgument { + + public ForcePlayArgument(ArgumentsRegistry registry) { + registry.mapArgument("buildbattleadmin", new LabeledCommandArgument("forceplay", "buildbattle.admin.forceplay", CommandArgument.ExecutorType.BOTH, + new LabelData("/bba forceplay ", "/bba forceplay ", + "&7Start a arena by command \n&6Permission: &7buildbattle.admin.forceplay\n&cNOT FOR PRODUCTION!")) { + @Override + public void execute(CommandSender sender, String[] args) { + if(args.length == 1) { + //todo translatable + new MessageBuilder("&cPlease type arena theme!").prefix().send(sender); + return; + } + BaseArena arena; + int themeArgStart = 1; + if(!(sender instanceof Player)) { + if(args.length == 2) { + //todo translatable + new MessageBuilder("&cPlease type arena name!").prefix().send(sender); + return; + } + arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena(args[1]); + themeArgStart = 2; + } else { + arena = (BaseArena) registry.getPlugin().getArenaRegistry().getArena((Player) sender); + } + if(arena == null) { + new MessageBuilder("COMMANDS_NOT_PLAYING").asKey().send(sender); + return; + } + if(!(arena instanceof BuildArena)) { + //todo translatable + new MessageBuilder("&cCan't set theme on this arena type!").prefix().send(sender); + return; + } + StringJoiner themeName = new StringJoiner(" "); + + for(int i = themeArgStart; i < args.length; i++) + themeName.add(args[i]); + if(arena.getArenaInGameState() == BaseArena.ArenaInGameState.BUILD_TIME || arena.getArenaState() == IArenaState.STARTING || arena.getArenaState() == IArenaState.FULL_GAME || arena.getArenaInGameState() == BaseArena.ArenaInGameState.THEME_VOTING) { + if(arena.getPlugin().getThemeManager().isThemeBlacklisted(themeName.toString())) { + new MessageBuilder("COMMANDS_THEME_BLACKLISTED").asKey().prefix().send(sender); + return; + } + Bukkit.getOnlinePlayers().forEach(player -> { + registry.getPlugin().getArenaManager().joinAttempt(player, arena); + }); + arena.setForceStart(true); + arena.setTheme(themeName.toString()); + new MessageBuilder("IN_GAME_MESSAGES_ADMIN_CHANGED_THEME").asKey().prefix().value(themeName.toString()).arena(arena).sendArena(); + } else { + new MessageBuilder("&cWrong state to force theme!").prefix().send(sender); + } + } + }); + } + +} diff --git a/src/main/java/plugily/projects/buildbattle/handlers/themes/vote/VoteMenu.java b/src/main/java/plugily/projects/buildbattle/handlers/themes/vote/VoteMenu.java index 8d62726b..f46eafd8 100644 --- a/src/main/java/plugily/projects/buildbattle/handlers/themes/vote/VoteMenu.java +++ b/src/main/java/plugily/projects/buildbattle/handlers/themes/vote/VoteMenu.java @@ -37,6 +37,7 @@ import plugily.projects.minigamesbox.classic.handlers.language.MessageBuilder; import plugily.projects.minigamesbox.classic.utils.helper.ItemBuilder; import plugily.projects.minigamesbox.classic.utils.version.xseries.XEnchantment; +import plugily.projects.minigamesbox.classic.utils.version.xseries.XItemFlag; import plugily.projects.minigamesbox.classic.utils.version.xseries.XMaterial; import plugily.projects.minigamesbox.inventory.common.item.ClickableItem; import plugily.projects.minigamesbox.inventory.common.item.SimpleClickableItem; @@ -183,7 +184,7 @@ public void updatePlayerGui(Player player, NormalFastInv gui) { ItemBuilder itemBuilder = new ItemBuilder(clickableSignItem.getItem()).removeLore(); itemBuilder.lore(new MessageBuilder("MENU_THEME_ITEM_LORE").asKey().arena(arena).value(theme).integer((int) percent).build().split(";")); if(theme.equals(playerVote)) { - itemBuilder.enchantment(XEnchantment.UNBREAKING.get(), 1).flags(ItemFlag.HIDE_ENCHANTS); + itemBuilder.enchantment(XEnchantment.UNBREAKING.get(), 1).flags(XItemFlag.HIDE_ENCHANTS.get()); } else { itemBuilder.removeEnchants().removeFlags(); } From fb0a2960522243efa90c99de2354fd9734d83b7c Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 14 Jul 2025 20:45:27 +0000 Subject: [PATCH 50/53] Bump version from 5.0.15-SNAPSHOT15 to 5.0.15-SNAPSHOT16 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index d09a8853..66354c3b 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT15 + 5.0.15-SNAPSHOT16 BuildBattle From f931279065e62e9bdf6f2832cb5f08a150949a99 Mon Sep 17 00:00:00 2001 From: Tigerpanzer_02 <37453987+Tigerpanzer02@users.noreply.github.com> Date: Mon, 14 Jul 2025 23:06:43 +0200 Subject: [PATCH 51/53] Fixed wrong game state if no players in arena on ForcePlayArgument use --- .../commands/arguments/admin/arena/ForcePlayArgument.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java index 693ccb14..a16cf5f9 100644 --- a/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java +++ b/src/main/java/plugily/projects/buildbattle/commands/arguments/admin/arena/ForcePlayArgument.java @@ -78,7 +78,7 @@ public void execute(CommandSender sender, String[] args) { for(int i = themeArgStart; i < args.length; i++) themeName.add(args[i]); - if(arena.getArenaInGameState() == BaseArena.ArenaInGameState.BUILD_TIME || arena.getArenaState() == IArenaState.STARTING || arena.getArenaState() == IArenaState.FULL_GAME || arena.getArenaInGameState() == BaseArena.ArenaInGameState.THEME_VOTING) { + if(arena.getArenaInGameState() == BaseArena.ArenaInGameState.BUILD_TIME || arena.getArenaState() == IArenaState.WAITING_FOR_PLAYERS || arena.getArenaState() == IArenaState.STARTING || arena.getArenaState() == IArenaState.FULL_GAME || arena.getArenaInGameState() == BaseArena.ArenaInGameState.THEME_VOTING) { if(arena.getPlugin().getThemeManager().isThemeBlacklisted(themeName.toString())) { new MessageBuilder("COMMANDS_THEME_BLACKLISTED").asKey().prefix().send(sender); return; From c5dc1be766fe772a76f29175514aa67b9b9f302c Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 14 Jul 2025 21:06:49 +0000 Subject: [PATCH 52/53] Bump version from 5.0.15-SNAPSHOT16 to 5.0.15-SNAPSHOT17 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 66354c3b..c4c04e3e 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT16 + 5.0.15-SNAPSHOT17 BuildBattle From 5482b8230b6507e114b230acb51b828ff5b86ad9 Mon Sep 17 00:00:00 2001 From: "version-bump[github-action]" <41898282+version-bump[github-action]@users.noreply.github.com> Date: Mon, 14 Jul 2025 21:17:57 +0000 Subject: [PATCH 53/53] Bump version from 5.0.15-SNAPSHOT17 to 5.0.15-SNAPSHOT18 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c4c04e3e..9302fbf7 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ plugily.projects buildbattle - 5.0.15-SNAPSHOT17 + 5.0.15-SNAPSHOT18 BuildBattle