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 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<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()));
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) -> {
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();
}));