Add 'Force Delete' for special regions

This commit is contained in:
2026-03-29 17:22:51 +02:00
parent 11056a2a8e
commit 8d25e328d2
@@ -89,7 +89,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
private final Player player; private final Player player;
private final BukkitTask task; private final BukkitTask task;
private Type type = new Delete(); private Type type = new Empty();
public DynamicRegionEditor(Player player) { public DynamicRegionEditor(Player player) {
this.player = player; this.player = player;
@@ -156,7 +156,9 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
event.setCancelled(true); event.setCancelled(true);
List<SWListInv.SWListEntry<Type>> list = new ArrayList<>(); List<SWListInv.SWListEntry<Type>> 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())); list.add(new SWListInv.SWListEntry<>(new SWItem(Material.LODESTONE, "§fBig Spawn"), new Spawn()));
DynamicRegionSystem.constructorDataMap.values() DynamicRegionSystem.constructorDataMap.values()
@@ -168,9 +170,19 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
}); });
SWListInv<Type> inventory = new SWListInv<>(player, "Select Region to place", list, (click, type) -> { SWListInv<Type> inventory = new SWListInv<>(player, "Select Region to place", list, (click, type) -> {
this.type = type; if (type instanceof Delete delete) {
player.closeInventory(); delete.confirmForceDelete(player, () -> {
showHotbar(); player.closeInventory();
this.type = delete;
area.hide(true);
showHotbar();
});
} else {
player.closeInventory();
this.type = type;
area.hide(true);
showHotbar();
}
}); });
inventory.open(); inventory.open();
} }
@@ -226,16 +238,53 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
void run(Player player, int tileX, int tileZ); 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 Empty() {
private Delete() {
} }
@Override @Override
public String title() { 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() { private boolean isBigSpawn() {
@@ -309,7 +358,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
return; return;
} }
if (region.getType().isPath()) { if (region.getType().isPath() || (force && region.getType().isSpecial())) {
region.delete(); region.delete();
} else { } else {
deleteRegion(player, tile, region); deleteRegion(player, tile, region);
@@ -317,7 +366,7 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
} }
private void deleteSpawn(Player player) { private void deleteSpawn(Player player) {
confirmInventory(player, "Big Spawn", () -> { confirmInventory(player, CONFIRM_DELETE, ACCEPT_DELETE, "Big Spawn", () -> {
checkSpawnRegionAndDelete(Tile.TILE_NN); checkSpawnRegionAndDelete(Tile.TILE_NN);
checkSpawnRegionAndDelete(Tile.TILE_NP); checkSpawnRegionAndDelete(Tile.TILE_NP);
checkSpawnRegionAndDelete(Tile.TILE_PN); checkSpawnRegionAndDelete(Tile.TILE_PN);
@@ -332,18 +381,18 @@ public class DynamicRegionEditor implements SWPlayer.Component, Listener {
private void deleteRegion(Player player, Tile tile, Region region) { private void deleteRegion(Player player, Tile tile, Region region) {
RegionConstructorData data = DynamicRegionSystem.constructorDataMap.get(region.getClass()); 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); Region checkRegion = DynamicRegionSystem.INSTANCE.get(tile);
if (region == checkRegion) region.delete(); if (region == checkRegion) region.delete();
}); });
} }
private void confirmInventory(Player player, String name, Runnable deleteCallback) { private void confirmInventory(Player player, String title, String accept, String name, Runnable deleteCallback) {
SWInventory inventory = new SWInventory(player, 9, "Confirm delete: " + name); SWInventory inventory = new SWInventory(player, 9, title + name);
inventory.setItem(0, new SWItem(Material.GRAY_CONCRETE, "§7Cancel", click -> { inventory.setItem(0, new SWItem(Material.GRAY_CONCRETE, "§7Cancel", click -> {
player.closeInventory(); 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(); player.closeInventory();
deleteCallback.run(); deleteCallback.run();
})); }));