From e70df329b3421ceb953c8a32b57aaa7d6670bd63 Mon Sep 17 00:00:00 2001 From: Marcos Paulo Date: Wed, 19 Aug 2026 15:09:44 -0300 Subject: [PATCH] fix(chunkloader): release tickets on disable/toggle, fix BlueMap world matching, and prevent item loss on remove --- .../canalhandia/BlueMapBridge.java | 8 +++-- .../marcospaulo/canalhandia/Canalhandia.java | 5 ++++ .../canalhandia/CanalhandiaCommand.java | 29 +++++++++++++++++-- .../marcospaulo/canalhandia/ChunkLoaders.java | 5 ++++ 4 files changed, 42 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/marcospaulo/canalhandia/BlueMapBridge.java b/src/main/java/dev/marcospaulo/canalhandia/BlueMapBridge.java index 454ef21..02f4961 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/BlueMapBridge.java +++ b/src/main/java/dev/marcospaulo/canalhandia/BlueMapBridge.java @@ -147,8 +147,12 @@ final class BlueMapBridge { } String mapId = map.getId().toLowerCase(java.util.Locale.ROOT); String w = world.toLowerCase(java.util.Locale.ROOT); - if (w.contains("nether")) return mapId.contains("nether"); - if (w.contains("the_end") || w.contains("end")) return mapId.contains("end"); + if (w.endsWith("_nether") || w.equals("nether") || w.equals("world_nether")) { + return mapId.contains("nether"); + } + if (w.endsWith("_the_end") || w.equals("the_end") || w.equals("world_the_end") || w.equals("end")) { + return mapId.contains("end"); + } return !mapId.contains("nether") && !mapId.contains("end"); } diff --git a/src/main/java/dev/marcospaulo/canalhandia/Canalhandia.java b/src/main/java/dev/marcospaulo/canalhandia/Canalhandia.java index 54527ab..4598b55 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/Canalhandia.java +++ b/src/main/java/dev/marcospaulo/canalhandia/Canalhandia.java @@ -191,6 +191,11 @@ public final class Canalhandia extends JavaPlugin implements Listener { if (poll != null) { poll.hide(); } + if (chunkLoaders != null) { + chunkLoaders.unloadAllTickets(); + chunkLoaders.close(); + ChunkAnchorItem.unregisterRecipe(this); + } } Settings settings() { diff --git a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java index 983e6ce..6b18ee5 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java +++ b/src/main/java/dev/marcospaulo/canalhandia/CanalhandiaCommand.java @@ -12,6 +12,7 @@ import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; import org.bukkit.command.TabCompleter; import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Arrays; @@ -566,6 +567,16 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } boolean on = args[1].equalsIgnoreCase("on"); plugin.settings().moduleEnabled(module, on); + if (module == Module.CHUNKLOADER) { + if (on) { + plugin.chunkLoaders().loadAllTickets(); + ChunkAnchorItem.registerRecipe(plugin); + } else { + plugin.chunkLoaders().unloadAllTickets(); + ChunkAnchorItem.unregisterRecipe(plugin); + } + plugin.blueMap().syncChunkLoaders(); + } plugin.rescheduleTimer(); plugin.rescheduleMilestones(); Msg.ok(sender, "Módulo " + module.label() + " " + (on ? "ativado" : "desativado") + "."); @@ -1930,10 +1941,22 @@ final class CanalhandiaCommand implements CommandExecutor, TabCompleter { } if (sender instanceof Player player) { - player.getInventory().addItem(ChunkAnchorItem.create(plugin, 1)); + Map overflow = player.getInventory().addItem(ChunkAnchorItem.create(plugin, 1)); + for (ItemStack drop : overflow.values()) { + player.getWorld().dropItemNaturally(player.getLocation(), drop); + } + Msg.ok(sender, "Âncora de Chunk #" + id + " desativada e devolvida ao inventário."); + } else { + try { + org.bukkit.World w = Bukkit.getWorld(loader.world()); + if (w != null) { + w.dropItemNaturally(new Location(w, loader.x() + 0.5, loader.y() + 0.5, loader.z() + 0.5), + ChunkAnchorItem.create(plugin, 1)); + } + } catch (Exception ignored) { + } + Msg.ok(sender, "Âncora de Chunk #" + id + " desativada e dropada em " + loader.place() + "."); } - - Msg.ok(sender, "Âncora de Chunk #" + id + " desativada e devolvida ao inventário."); } private void chunkloaderRecipe(CommandSender sender) { diff --git a/src/main/java/dev/marcospaulo/canalhandia/ChunkLoaders.java b/src/main/java/dev/marcospaulo/canalhandia/ChunkLoaders.java index 9108429..8c1a46e 100644 --- a/src/main/java/dev/marcospaulo/canalhandia/ChunkLoaders.java +++ b/src/main/java/dev/marcospaulo/canalhandia/ChunkLoaders.java @@ -281,4 +281,9 @@ final class ChunkLoaders { } catch (Exception ignored) { } } + + void close() { + flush(); + io.shutdown(); + } }