From 8d25e328d23af99e4215f2b6de443b8487fe072a Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Sun, 29 Mar 2026 17:22:51 +0200 Subject: [PATCH] Add 'Force Delete' for special regions --- .../bausystem/region/DynamicRegionEditor.java | 81 +++++++++++++++---- 1 file changed, 65 insertions(+), 16 deletions(-) diff --git a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionEditor.java b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionEditor.java index c4050b0b..9ff54adb 100644 --- a/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionEditor.java +++ b/BauSystem/BauSystem_RegionDynamic/src/de/steamwar/bausystem/region/DynamicRegionEditor.java @@ -89,7 +89,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { private final Player player; private final BukkitTask task; - private Type type = new Delete(); + private Type type = new Empty(); public DynamicRegionEditor(Player player) { this.player = player; @@ -156,7 +156,9 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { event.setCancelled(true); List> list = new ArrayList<>(); - list.add(new SWListInv.SWListEntry<>(new SWItem(Material.BARRIER, "§cDelete"), new Delete())); + list.add(new SWListInv.SWListEntry<>(new SWItem(Material.STRUCTURE_VOID, "§6Deselect"), new Empty())); + list.add(new SWListInv.SWListEntry<>(new SWItem(Material.BARRIER, "§cDelete"), new Delete(false))); + list.add(new SWListInv.SWListEntry<>(new SWItem(Material.COMMAND_BLOCK, "§4Force Delete"), new Delete(true))); list.add(new SWListInv.SWListEntry<>(new SWItem(Material.LODESTONE, "§fBig Spawn"), new Spawn())); DynamicRegionSystem.constructorDataMap.values() @@ -168,9 +170,19 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { }); SWListInv inventory = new SWListInv<>(player, "Select Region to place", list, (click, type) -> { - this.type = type; - player.closeInventory(); - showHotbar(); + if (type instanceof Delete delete) { + delete.confirmForceDelete(player, () -> { + player.closeInventory(); + this.type = delete; + area.hide(true); + showHotbar(); + }); + } else { + player.closeInventory(); + this.type = type; + area.hide(true); + showHotbar(); + } }); inventory.open(); } @@ -226,16 +238,53 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { void run(Player player, int tileX, int tileZ); } - private static class Delete implements Type { + private static class Empty implements Type { - private boolean valid = false; - - private Delete() { + private Empty() { } @Override public String title() { - return "§cDelete"; + return "§6---"; + } + + @Override + public boolean visualize(CArea area, int tileX, int tileZ) { + return false; + } + + @Override + public void run(Player player, int tileX, int tileZ) { + } + } + + private static class Delete implements Type { + + protected static final String CONFIRM_DELETE = "Confirm delete: "; + protected static final String ACCEPT_DELETE = "§cDelete: "; + + private final boolean force; + private boolean valid = false; + + private Delete(boolean force) { + this.force = force; + } + + public void confirmForceDelete(Player player, Runnable callback) { + if (force) { + confirmInventory(player, "Enable Force Delete", "§cEnable", "", callback); + } else { + callback.run(); + } + } + + @Override + public String title() { + if (force) { + return "§4Force Delete"; + } else { + return "§cDelete"; + } } private boolean isBigSpawn() { @@ -309,7 +358,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { return; } - if (region.getType().isPath()) { + if (region.getType().isPath() || (force && region.getType().isSpecial())) { region.delete(); } else { deleteRegion(player, tile, region); @@ -317,7 +366,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { } private void deleteSpawn(Player player) { - confirmInventory(player, "Big Spawn", () -> { + confirmInventory(player, CONFIRM_DELETE, ACCEPT_DELETE, "Big Spawn", () -> { checkSpawnRegionAndDelete(Tile.TILE_NN); checkSpawnRegionAndDelete(Tile.TILE_NP); checkSpawnRegionAndDelete(Tile.TILE_PN); @@ -332,18 +381,18 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener { private void deleteRegion(Player player, Tile tile, Region region) { RegionConstructorData data = DynamicRegionSystem.constructorDataMap.get(region.getClass()); - confirmInventory(player, data.name(), () -> { + confirmInventory(player, CONFIRM_DELETE, ACCEPT_DELETE, data.name(), () -> { Region checkRegion = DynamicRegionSystem.INSTANCE.get(tile); if (region == checkRegion) region.delete(); }); } - private void confirmInventory(Player player, String name, Runnable deleteCallback) { - SWInventory inventory = new SWInventory(player, 9, "Confirm delete: " + name); + private void confirmInventory(Player player, String title, String accept, String name, Runnable deleteCallback) { + SWInventory inventory = new SWInventory(player, 9, title + name); inventory.setItem(0, new SWItem(Material.GRAY_CONCRETE, "§7Cancel", click -> { player.closeInventory(); })); - inventory.setItem(8, new SWItem(Material.RED_CONCRETE, "§cDelete: " + name, click -> { + inventory.setItem(8, new SWItem(Material.RED_CONCRETE, accept + name, click -> { player.closeInventory(); deleteCallback.run(); }));