diff --git a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java index a56a2e35..ab279d45 100644 --- a/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java +++ b/BauSystem/BauSystem_15/src/de/steamwar/bausystem/utils/TickManager15.java @@ -19,7 +19,7 @@ package de.steamwar.bausystem.utils; -import de.steamwar.bausystem.region.GlobalRegion; +import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.utils.bossbar.BossBarService; import de.steamwar.bausystem.utils.tps.TPSFreezeUtils; import de.steamwar.bausystem.utils.tps.TPSLimitUtils; @@ -46,7 +46,7 @@ public class TickManager15 implements TickManager, Listener { if (currentlyStepping) { currentlyStepping = false; Bukkit.getOnlinePlayers().forEach(player -> { - BossBarService.instance.remove(player, GlobalRegion.getInstance(), "TickStep"); + BossBarService.instance.remove(player, Region.getGlobalRegion(), "TickStep"); }); } TPSWarpUtils.warp(tickRate); diff --git a/BauSystem/BauSystem_Main/src/BauSystem.properties b/BauSystem/BauSystem_Main/src/BauSystem.properties index 61c95dc7..7ae8298b 100644 --- a/BauSystem/BauSystem_Main/src/BauSystem.properties +++ b/BauSystem/BauSystem_Main/src/BauSystem.properties @@ -403,6 +403,7 @@ KILLCHECKER_INFO=§7Shows the overlaps of cannon kills in your build area. KILLCHECKER_INFO2=§7Only colorable blocks like Wool, Terractotta, Stained Glass and Concrete are counted. KILLCHECKER_ENABLE=§aKillchecker activated KILLCHECKER_DISABLE=§cKillchecker deactivated +KILLCHECKER_NO_BUILD=§cThere is no Build Area in this Region KILLCHECKER_BOSSBAR=§e§l{0} §7(§e{1}%§7) §e§l{2}§7 cannons # BlockCounter BLOCK_COUNTER_HELP_TOGGLE=§8/§eblockcounter §8- §7Toggle on/off @@ -737,12 +738,10 @@ REGION_ITEM_RESET=§eReset REGION_ITEM_TESTBLOCK=§eDummy REGION_ITEM_TNT_OFF=§7TNT: §eDeactivated REGION_ITEM_TNT_ONLY_TB=§7TNT: §eonly dummy -REGION_ITEM_TNT_ONLY_BUILD=§7TNT: §eonly build REGION_ITEM_TNT_ON=§7TNT: §eActivated REGION_ITEM_SELECTOR_TITLE=Tnt Mode REGION_ITEM_SELECTOR_ON=§eActivate REGION_ITEM_SELECTOR_ONLY_TB=§eonly dummy -REGION_ITEM_SELECTOR_ONLY_BUILD=§eonly build REGION_ITEM_SELECTOR_OFF=§eDeactivate #Region REGION_COLOR_HELP_COLOR=§8/§ecolor §8[§7Color§8] §8- §7Sets the color of the region @@ -939,7 +938,6 @@ SELECT_HELP=§8/§eselect §8[§7RegionsTyp§8] §8- §7Select a region type SELECT_EXTENSION_HELP=§8/§eselect §8[§7RegionsTyp§8] §8[§7Extension§8] §8- §7Select a region type with or without extension SELECT_GLOBAL_REGION=§cThe global region cannot be selected SELECT_NO_TYPE=§cThis region has no {0} -SELECT_NO_EXTENSION=§cThis region has no extension SELECT_MESSAGE=§7WorldEdit selection set to {0}, {1}, {2} and {3}, {4}, {5} SKULL_HELP=§8/§eskull §8[§eplayer§8] §8-§7 Receive a player head SKULL_INVALID=§cInvalid player name diff --git a/BauSystem/BauSystem_Main/src/BauSystem_de.properties b/BauSystem/BauSystem_Main/src/BauSystem_de.properties index 3acad9fe..1bcce497 100644 --- a/BauSystem/BauSystem_Main/src/BauSystem_de.properties +++ b/BauSystem/BauSystem_Main/src/BauSystem_de.properties @@ -362,6 +362,7 @@ KILLCHECKER_INFO=§7Zeigt Überlappungen der Kanonen Kills im Baubereich an. KILLCHECKER_INFO2=§7Nur farbige Blöcke wie Wolle, Terracotta, Stained Glass und Concrete wird gezählt. KILLCHECKER_ENABLE=§aKillchecker aktiviert KILLCHECKER_DISABLE=§cKillchecker deaktiviert +KILLCHECKER_NO_BUILD=§cEs gibt keinen Baubereich in dieser Region KILLCHECKER_BOSSBAR=§e§l{0} §7(§e{1}%§7) §e§l{2}§7 Kanonnen # BlockCounter BLOCK_COUNTER_HELP_TOGGLE=§8/§eblockcounter §8- §7Wechsel zwischen an und aus @@ -680,12 +681,10 @@ REGION_ITEM_RESET=§eReset REGION_ITEM_TESTBLOCK=§eTestblock REGION_ITEM_TNT_OFF=§7TNT: §eAusgeschaltet REGION_ITEM_TNT_ONLY_TB=§7TNT: §enur Testblock -REGION_ITEM_TNT_ONLY_BUILD=§7TNT: §enur Baubereich REGION_ITEM_TNT_ON=§7TNT: §eEingeschaltet REGION_ITEM_SELECTOR_TITLE=Tnt Modus REGION_ITEM_SELECTOR_ON=§eEinschalten REGION_ITEM_SELECTOR_ONLY_TB=§enur Testblock -REGION_ITEM_SELECTOR_ONLY_BUILD=§enur Baubereich REGION_ITEM_SELECTOR_OFF=§eAusschalten #Region REGION_COLOR_HELP_COLOR=§8/§ecolor §8[§7Color§8] §8- §7Setze die Farbe der Region @@ -877,7 +876,6 @@ SELECT_HELP=§8/§eselect §8[§7RegionsTyp§8] §8- §7Wähle einen RegionsTyp SELECT_EXTENSION_HELP=§8/§eselect §8[§7RegionsTyp§8] §8[§7Extension§8] §8- §7Wähle einen RegionsTyp aus mit oder ohne Extension SELECT_GLOBAL_REGION=§cDie globale Region kannst du nicht auswählen SELECT_NO_TYPE=§cDiese Region hat keinen {0} -SELECT_NO_EXTENSION=§cDiese Region hat keine Ausfahrmaße SELECT_MESSAGE=§7WorldEdit auswahl auf {0}, {1}, {2} und {3}, {4}, {5} gesetzt SKULL_HELP=§8/§eskull §8[§eSpieler§8] §8-§7 Gibt einen SpielerKopf SKULL_INVALID=§cUngültiger Spieler diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 1d47beb8..af84b780 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -32,9 +32,7 @@ import de.steamwar.bausystem.features.tracer.TraceManager; import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.features.world.BauScoreboard; import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.bausystem.region.loader.PrototypeLoader; -import de.steamwar.bausystem.region.loader.RegionLoader; -import de.steamwar.bausystem.region.loader.Updater; +import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.TickListener; import de.steamwar.bausystem.utils.TickManager; @@ -42,6 +40,7 @@ import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.command.AbstractValidator; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; +import de.steamwar.core.CRIUSleepEvent; import de.steamwar.core.Core; import de.steamwar.core.WorldEditRendererCUIEditor; import de.steamwar.linkage.LinkedInstance; @@ -56,6 +55,7 @@ import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.plugin.Plugin; @@ -74,7 +74,7 @@ import java.util.function.Consumer; import java.util.logging.Level; import java.util.stream.Collectors; -public class BauSystem extends JavaPlugin { +public class BauSystem extends JavaPlugin implements Listener { // This should be treated as final! public static Message MESSAGE; @@ -95,6 +95,8 @@ public class BauSystem extends JavaPlugin { instance = this; SWUtils.setBausystem(instance); + RegionSystem.INSTANCE.load(); + /* try { PrototypeLoader.load(); RegionLoader.load(); @@ -107,6 +109,7 @@ public class BauSystem extends JavaPlugin { new Updater(PrototypeLoader.file, PrototypeLoader::load); new Updater(RegionLoader.file, RegionLoader::load); + */ SWCommandUtils.addValidator(Player.class, validator(Permission.BUILD)); SWCommandUtils.addValidator(CommandSender.class, validator(Permission.BUILD)); @@ -211,6 +214,11 @@ public class BauSystem extends JavaPlugin { new WorldEditRendererCUIEditor(); } + @EventHandler + public void onCRIUSleep(CRIUSleepEvent event) { + RegionSystem.INSTANCE.save(); + } + @Override public void onDisable() { instances.forEach((aClass, o) -> { @@ -223,6 +231,7 @@ public class BauSystem extends JavaPlugin { }); WorldData.write(); + RegionSystem.INSTANCE.save(); Config.getInstance().saveAll(); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java index 0985a62d..a4cefb9a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/Permission.java @@ -21,11 +21,9 @@ package de.steamwar.bausystem; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.features.world.BauMemberUpdate; -import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.sql.BauweltMember; import de.steamwar.sql.SteamwarUser; import lombok.AllArgsConstructor; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import java.util.HashSet; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/attributescopy/AttributeRemoveCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/attributescopy/AttributeRemoveCommand.java index 689be980..eb621256 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/attributescopy/AttributeRemoveCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/attributescopy/AttributeRemoveCommand.java @@ -24,7 +24,6 @@ import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; import de.steamwar.linkage.Linked; -import de.steamwar.linkage.MinVersion; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/autostart/AutostartListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/autostart/AutostartListener.java index 28126ec5..fbc6430f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/autostart/AutostartListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/autostart/AutostartListener.java @@ -24,8 +24,6 @@ import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; @@ -33,8 +31,6 @@ import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.block.data.type.Chest; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -43,9 +39,9 @@ import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; -import java.io.File; -import java.text.SimpleDateFormat; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; @Linked public class AutostartListener implements Listener { @@ -106,11 +102,11 @@ public class AutostartListener implements Listener { public void activate(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player); return; } - if (!region.hasType(RegionType.TESTBLOCK)) { + if (region.getTestblockArea().isEmpty()) { BauSystem.MESSAGE.send("AUTOSTART_MESSAGE_NO_REGION", player); return; } @@ -131,20 +127,12 @@ public class AutostartListener implements Listener { event.blockList().forEach(block -> { Region region = Region.getRegion(block.getLocation()); if (!regionStartTime.containsKey(region)) return; - if (!region.hasType(RegionType.TESTBLOCK)) return; - if (!region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return; + if (!region.getTestblockArea().inRegion(block.getLocation(), true)) return; long tickDiff = TPSUtils.currentRealTick.get() - regionStartTime.remove(region); - long preFightDurationInSeconds = getPreFightDurationInSeconds(region); + long preFightDurationInSeconds = region.getGameModeConfig().getTimes().getPreFightDuration(); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT1", tickDiff); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT2", preFightDurationInSeconds, ((preFightDurationInSeconds * 20) - tickDiff)); RegionUtils.message(region, "AUTOSTART_MESSAGE_RESULT3"); }); } - - private int getPreFightDurationInSeconds(Region region) { - File file = region.gameModeConfig(); - if (file == null) return 30; - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - return config.getInt("Times.PreFightDuration", 30); - } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/backup/BackupCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/backup/BackupCommand.java index b7911275..6c7708c9 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/backup/BackupCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/backup/BackupCommand.java @@ -19,31 +19,23 @@ package de.steamwar.bausystem.features.backup; -import com.sk89q.worldedit.EditSession; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.region.Color; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionBackups; +import de.steamwar.bausystem.region.flags.ChangedMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; -import de.steamwar.bausystem.region.tags.Tag; -import de.steamwar.bausystem.utils.PasteBuilder; +import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; -import de.steamwar.command.SWCommandUtils; import de.steamwar.command.TypeMapper; -import de.steamwar.command.TypeValidator; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; import de.steamwar.linkage.Linked; import net.md_5.bungee.api.chat.ClickEvent; import org.bukkit.Material; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; +import java.util.*; import java.util.stream.Collectors; @Linked @@ -54,7 +46,7 @@ public class BackupCommand extends SWCommand { } static boolean checkGlobalRegion(Region region, Player p) { - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("BACKUP_REGION_NO_REGION", p); return true; } @@ -67,11 +59,12 @@ public class BackupCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - if (!region.get(Tag.CHANGED)) { + if (region.getFlags().get(Flag.CHANGED).isWithDefault(ChangedMode.NO_CHANGE)) { BauSystem.MESSAGE.send("BACKUP_CREATE_NO_CHANGE", p); return; } - if (region.backup()) { + Optional backup = region.getBackups().create(RegionBackups.BackupType.MANUAL); + if (backup.isPresent()) { BauSystem.MESSAGE.send("BACKUP_CREATE_SUCCESS", p); } else { BauSystem.MESSAGE.send("BACKUP_CREATE_FAILURE", p); @@ -79,25 +72,12 @@ public class BackupCommand extends SWCommand { } @Register(value = "load", description = "BACKUP_HELP_LOAD") - public void backupLoad(@Validator("owner") Player p, @Mapper("backupName") String backupName) { - Region region = Region.getRegion(p.getLocation()); - if (checkGlobalRegion(region, p)) { - return; - } - - File backupFile = region.getBackupFile(backupName.replace('_', ' ')); - if (backupFile == null) { + public void backupLoad(@Validator("owner") Player p, @Mapper("backup") @ErrorMessage("BACKUP_LOAD_FAILURE") RegionBackups.Backup backup) { + if (backup.load()) { + BauSystem.MESSAGE.send("BACKUP_LOAD", p); + } else { BauSystem.MESSAGE.send("BACKUP_LOAD_FAILURE", p); - return; } - EditSession editSession = new PasteBuilder(new PasteBuilder.FileProvider(backupFile)) - .pastePoint(region.getMinPoint().add(region.getPrototype().getSizeX() / 2, 0, region.getPrototype().getSizeZ() / 2)) - .minPoint(region.getMinPoint()) - .maxPoint(region.getMaxPoint()) - .waterLevel(region.getWaterLevel()) - .run(); - region.remember(editSession); - BauSystem.MESSAGE.send("BACKUP_LOAD", p); } @Register(value = "list", description = "BACKUP_HELP_LIST") @@ -106,10 +86,10 @@ public class BackupCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - List backups = listBackup(p); + List backups = listBackup(p); BauSystem.MESSAGE.send("BACKUP_LIST_HEAD", p, backups.size()); - backups.forEach(s -> { - BauSystem.MESSAGE.send("BACKUP_LIST_ENTRY", p, "/backup load " + s, new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/backup load " + s), s); + backups.forEach(backup -> { + BauSystem.MESSAGE.send("BACKUP_LIST_ENTRY", p, "/backup load " + backup.getName(), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/backup load " + backup.getName()), backup.getName()); }); } @@ -119,34 +99,44 @@ public class BackupCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - List backups = listBackup(p); - List> swListEntries = new ArrayList<>(); + List backups = listBackup(p); + List> swListEntries = new ArrayList<>(); List lore = Arrays.asList(BauSystem.MESSAGE.parse("BACKUP_LORE", p)); for (int i = 0; i < backups.size(); i++) { - String s = backups.get(i); - SWItem swItem = new SWItem(Material.BRICK, BauSystem.MESSAGE.parse("BACKUP_ITEM_NAME", p, s), lore, false, clickType -> {}); + RegionBackups.Backup backup = backups.get(i); + SWItem swItem = new SWItem(Material.BRICK, BauSystem.MESSAGE.parse("BACKUP_ITEM_NAME", p, backup.getName()), lore, false, clickType -> {}); swItem.getItemStack().setAmount(i + 1); - swListEntries.add(new SWListInv.SWListEntry<>(swItem, s)); + swListEntries.add(new SWListInv.SWListEntry<>(swItem, backup)); } - SWListInv swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> { + SWListInv swListInv = new SWListInv<>(p, BauSystem.MESSAGE.parse("BACKUP_INV_NAME", p), swListEntries, (clickType, s) -> { p.getOpenInventory().close(); p.performCommand("backup load " + s); }); swListInv.open(); } - @Mapper(value = "backupName", local = true) - public TypeMapper backupMapper() { - return SWCommandUtils.createMapper(s -> s, (commandSender, s) -> listBackup((Player) commandSender)); + @Mapper(value = "backup", local = true) + public TypeMapper backupMapper() { + return new TypeMapper() { + @Override + public RegionBackups.Backup map(CommandSender commandSender, String[] previousArguments, String s) { + return Region.getRegion(((Player) commandSender).getLocation()).getBackups().get(s); + } + + @Override + public Collection tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { + return listBackup((Player) sender).stream().map(RegionBackups.Backup::getName).collect(Collectors.toList()); + } + }; } - private List listBackup(Player p) { + private List listBackup(Player p) { Region region = Region.getRegion(p.getLocation()); if (checkGlobalRegion(region, p)) { return Collections.emptyList(); } try { - return region.listBackup().stream().map(s -> s.substring(0, s.length() - 6).replace(' ', '_')).collect(Collectors.toList()); + return region.getBackups().list(); } catch (NullPointerException e) { return Collections.emptyList(); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauInfoBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauInfoBauGuiItem.java index d8ba9171..8a3cffb4 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauInfoBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/BauInfoBauGuiItem.java @@ -23,6 +23,7 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.linkage.specific.BauGuiItem; +import de.steamwar.bausystem.region.FlagOptional; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.core.Core; @@ -56,15 +57,10 @@ public class BauInfoBauGuiItem extends BauGuiItem { Region region = Region.getRegion(player.getLocation()); List stringList = new ArrayList<>(); for (Flag flag : Flag.getFlags()) { - if (flag == Flag.PROTECT && region.getFloorLevel() == 0) { - continue; - } - if (flag == Flag.ITEMS && Core.getVersion() < 19) { - continue; - } - Flag.Value value = region.get(flag); - if (value != null) { - stringList.add(BauSystem.MESSAGE.parse("BAU_INFO_ITEM_LORE_" + flag.name(), player, BauSystem.MESSAGE.parse(value.getChatValue(), player))); + if (!region.getFlags().has(flag).isApplicable()) continue; + FlagOptional value = region.getFlags().get(flag); + if (value.isPresent()) { + stringList.add(BauSystem.MESSAGE.parse("BAU_INFO_ITEM_LORE_" + flag.name(), player, BauSystem.MESSAGE.parse(value.getWithDefault().getChatValue(), player))); } } itemStack.setLore(stringList); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java index 7bef91df..a192fec5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/ForceSpectatorCommand.java @@ -19,13 +19,11 @@ package de.steamwar.bausystem.features.bau; -import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; import de.steamwar.linkage.Linked; -import de.steamwar.techhider.TechHider; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/InfoCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/InfoCommand.java index 2d638888..6b3a1d85 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/InfoCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/bau/InfoCommand.java @@ -3,6 +3,7 @@ package de.steamwar.bausystem.features.bau; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.config.BauServer; +import de.steamwar.bausystem.region.FlagOptional; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.command.SWCommand; @@ -30,12 +31,10 @@ public class InfoCommand extends SWCommand { BauSystem.MESSAGE.send("BAU_INFO_COMMAND_OWNER", p, SteamwarUser.get(bauServer.getOwnerID()).getUserName()); Region region = Region.getRegion(p.getLocation()); for (Flag flag : Flag.getFlags()) { - if (flag == Flag.PROTECT && region.getFloorLevel() == 0) { - continue; - } - Flag.Value value = region.get(flag); - if (value != null) { - BauSystem.MESSAGE.send("BAU_INFO_COMMAND_FLAG", p, BauSystem.MESSAGE.parse(flag.getChatValue(), p), BauSystem.MESSAGE.parse(value.getChatValue(), p)); + if (!region.getFlags().has(flag).isApplicable()) continue; + FlagOptional value = region.getFlags().get(flag); + if (value.isPresent()) { + BauSystem.MESSAGE.send("BAU_INFO_COMMAND_FLAG", p, BauSystem.MESSAGE.parse(flag.getChatValue(), p), BauSystem.MESSAGE.parse(value.getWithDefault().getChatValue(), p)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonDetector.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonDetector.java index 3ab4fe70..7c73888d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonDetector.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonDetector.java @@ -23,7 +23,6 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.cannon.depth.Depth; import de.steamwar.bausystem.features.cannon.depth.DepthManager; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; import org.bukkit.entity.TNTPrimed; @@ -85,8 +84,8 @@ public class CannonDetector implements Listener { grouped.forEach((cannonKey, tntPrimeds) -> { if (tntPrimeds.size() <= 5) return; Region region = Region.getRegion(tntPrimeds.get(0).getLocation()); - if (region.isGlobal()) return; - if (!region.hasType(RegionType.TESTBLOCK)) return; + if (region.getType().isGlobal()) return; + if (region.getTestblockArea().isEmpty()) return; Depth depth = new Depth(region); DepthManager.init(tntPrimeds, depth); }); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonKey.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonKey.java index c260e8a9..08912f6f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonKey.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/CannonKey.java @@ -22,7 +22,6 @@ package de.steamwar.bausystem.features.cannon; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; -import org.bukkit.entity.TNTPrimed; import org.bukkit.util.Vector; import java.util.Set; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/depth/Depth.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/depth/Depth.java index 22ce7fde..4cfacb98 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/depth/Depth.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/cannon/depth/Depth.java @@ -23,8 +23,6 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import net.md_5.bungee.api.chat.BaseComponent; import net.md_5.bungee.api.chat.HoverEvent; import net.md_5.bungee.api.chat.TextComponent; @@ -50,7 +48,7 @@ public class Depth { public void update(List blocks) { List blocksList = blocks.stream() - .filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) + .filter(block -> region.getTestblockArea().inRegion(block.getLocation(), true)) .collect(Collectors.toList()); tntCount++; for (Block block : blocksList) { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java index f04fd5e9..129ebe71 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStone.java @@ -29,12 +29,11 @@ import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; +import java.util.stream.Collectors; public class DesignEndStone { @@ -44,18 +43,26 @@ public class DesignEndStone { private REntityServer entityServer = new REntityServer(); private List entities = new ArrayList<>(); private Set locations = new HashSet<>(); - private boolean wsOrAs; - private double maxBlastResistance; + private Set limited; + private boolean calculateFromBottom; public DesignEndStone(Region region) { - this.minX = region.getMinPointBuild().getX(); - this.minY = region.getMinPointBuild().getY(); - this.minZ = region.getMinPointBuild().getZ(); - this.maxX = region.getMaxPointBuild().getX(); - this.maxY = region.getMaxPointBuild().getY(); - this.maxZ = region.getMaxPointBuild().getZ(); - wsOrAs = region.getName().startsWith("ws") || region.getName().startsWith("as"); - maxBlastResistance = wsOrAs ? 6.1 : 9.0; + this.minX = region.getBuildArea().getMinPoint(false).getX(); + this.minY = region.getBuildArea().getMinPoint(false).getY(); + this.minZ = region.getBuildArea().getMinPoint(false).getZ(); + this.maxX = region.getBuildArea().getMaxPoint(false).getX(); + this.maxY = region.getBuildArea().getMaxPoint(false).getY(); + this.maxZ = region.getBuildArea().getMaxPoint(false).getZ(); + + limited = region.getGameModeConfig() + .getSchematic() + .getLimited() + .entrySet() + .stream() + .filter(entry -> entry.getValue() == 0) + .flatMap(entry -> entry.getKey().stream()) + .collect(Collectors.toSet()); + calculateFromBottom = region.getGameModeConfig().getArena().isNoFloor(); entityServer.setCallback((player, rEntity, entityAction) -> { if (entityAction != REntityServer.EntityAction.ATTACK) return; @@ -76,7 +83,7 @@ public class DesignEndStone { calc(minX, minY, maxZ, maxX, maxY, maxZ, 0, 0, -1, maxZ - minZ); calc(minX, minY, minZ, minX, maxY, maxZ, 1, 0, 0, maxX - minX); calc(maxX, minY, minZ, maxX, maxY, maxZ, -1, 0, 0, maxX - minX); - if (wsOrAs) { + if (calculateFromBottom) { calc(minX, minY, minZ, maxX, minY, maxZ, 0, 1, 0, maxY - minY + 1); } else { int airBlocks = 0; @@ -106,7 +113,7 @@ public class DesignEndStone { int cz = z + step * dirZ; Material material = WORLD.getBlockAt(cx, cy, cz).getType(); - if (material != Material.WATER && material != Material.LAVA && material.getBlastResistance() >= maxBlastResistance) { + if (material != Material.WATER && material != Material.LAVA && limited.contains(material)) { Location location = new Location(WORLD, cx + 0.5, cy, cz + 0.5); if (!locations.add(location)) break; RFallingBlockEntity entity = new RFallingBlockEntity(entityServer, location, Material.RED_STAINED_GLASS); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStoneCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStoneCommand.java index 92934c23..6d10d479 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStoneCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/design/endstone/DesignEndStoneCommand.java @@ -21,7 +21,6 @@ package de.steamwar.bausystem.features.design.endstone; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; @@ -49,7 +48,11 @@ public class DesignEndStoneCommand extends SWCommand implements Listener { @Register(description = "DESIGN_ENDSTONE_COMMAND_HELP") public void genericCommand(@Validator Player player) { Region region = Region.getRegion(player.getLocation()); - if (!region.hasType(RegionType.BUILD)) { + if (region.getBuildArea().isEmpty()) { + BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player); + return; + } + if (!region.getGameModeConfig().isLoaded()) { BauSystem.MESSAGE.send("DESIGN_ENDSTONE_REGION_ERROR", player); return; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerCommand.java index 9ca7a480..1c6a3b41 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerCommand.java @@ -38,7 +38,6 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.util.HashMap; import java.util.HashSet; import java.util.Map; -import java.util.Set; @Linked public class KillcheckerCommand extends SWCommand implements Listener { @@ -57,6 +56,10 @@ public class KillcheckerCommand extends SWCommand implements Listener { @Register(value = "enable", description = "KILLCHECKER_HELP_ENABLE") public void genericCommand(@Validator Player player, @OptionalValue("-outline") @StaticValue(value = {"-area", "-outline"}, allowISE = true) boolean onlyOutline) { Region region = Region.getRegion(player.getLocation()); + if (region.getBuildArea().isEmpty()) { + BauSystem.MESSAGE.send("KILLCHECKER_NO_BUILD", player); + return; + } KillcheckerVisualizer killcheckerVisualizer = visualizers.computeIfAbsent(region, region1 -> new KillcheckerVisualizer(region1, bossBarService)); killcheckerVisualizer.recalc(); killcheckerVisualizer.show(player, onlyOutline); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerVisualizer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerVisualizer.java index 04822aa8..52eae2b6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerVisualizer.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/killchecker/KillcheckerVisualizer.java @@ -22,8 +22,6 @@ package de.steamwar.bausystem.features.killchecker; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import de.steamwar.bausystem.utils.bossbar.BossBarService; import de.steamwar.entity.REntity; @@ -75,8 +73,8 @@ public class KillcheckerVisualizer { public KillcheckerVisualizer(Region region, BossBarService bossBarService) { this.region = region; - this.minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.NORMAL); - this.maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.NORMAL); + this.minPoint = region.getBuildArea().getMinPoint(false); + this.maxPoint = region.getBuildArea().getMaxPoint(false); yArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getZ() - minPoint.getZ()); zArea = (maxPoint.getX() - minPoint.getX()) * (maxPoint.getY() - minPoint.getY()); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/LoaderRecorder.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/LoaderRecorder.java index cc3dce23..d3e2fcfb 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/LoaderRecorder.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loader/LoaderRecorder.java @@ -44,7 +44,6 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.BiConsumer; -import java.util.function.Consumer; public class LoaderRecorder implements Listener { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/Loadtimer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/Loadtimer.java index 116edba5..12a4d867 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/Loadtimer.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/Loadtimer.java @@ -22,8 +22,6 @@ package de.steamwar.bausystem.features.loadtimer; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import lombok.Getter; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -158,7 +156,7 @@ public class Loadtimer implements Listener { } public void onTntExplode(EntityExplodeEvent event) { - if (region.inRegion(event.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION) && stage == Stage.IGNITION) { + if (region.getBuildArea().inRegion(event.getLocation(), true) && stage == Stage.IGNITION) { stage = Stage.END; explode = TPSUtils.currentRealTick.get(); print(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerCommand.java index 503c1b47..b0dcba38 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerCommand.java @@ -39,7 +39,7 @@ public class LoadtimerCommand extends SWCommand { @Register(value = "start", description = {"LOADTIMER_HELP_START_2", "LOADTIMER_HELP_START_3"}) public void start(@Validator Player p, TimerMode mode) { Region r = Region.getRegion(p.getLocation()); - if (r.isGlobal()) return; + if (r.getType().isGlobal()) return; if (!Loadtimer.hasTimer(r)) Loadtimer.createLoadtimer(r, mode == TimerMode.HALF); } @@ -47,7 +47,7 @@ public class LoadtimerCommand extends SWCommand { @Register(value = "stop", description = "LOADTIMER_HELP_STOP") public void stop(@Validator Player p) { Region r = Region.getRegion(p.getLocation()); - if (r.isGlobal()) return; + if (r.getType().isGlobal()) return; if (Loadtimer.hasTimer(r)) Loadtimer.getTimer(r).delete(); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerGuiItem.java index f190d9f0..1df6c898 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/loadtimer/LoadtimerGuiItem.java @@ -46,7 +46,7 @@ public class LoadtimerGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { Region r = Region.getRegion(player.getLocation()); - if (r.isGlobal()) + if (r.getType().isGlobal()) return new SWItem(Material.BOWL, BauSystem.MESSAGE.parse("LOADTIMER_GUI_GLOBAL", player)).getItemStack(); if (Loadtimer.hasTimer(r)) { return new SWItem(Material.BOW, BauSystem.MESSAGE.parse("LOADTIMER_GUI_STOP", player)).getItemStack(); @@ -58,7 +58,7 @@ public class LoadtimerGuiItem extends BauGuiItem { @Override public boolean click(ClickType click, Player p) { Region r = Region.getRegion(p.getLocation()); - if (r.isGlobal()) return false; + if (r.getType().isGlobal()) return false; if (Loadtimer.hasTimer(r)) { p.performCommand("lt stop"); } else { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracerCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracerCommand.java index 531eda68..c09d3c18 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracerCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/observer/ObserverTracerCommand.java @@ -20,7 +20,6 @@ package de.steamwar.bausystem.features.observer; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ColorCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ColorCommand.java index 545219a2..6c086ded 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ColorCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ColorCommand.java @@ -23,8 +23,8 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; +import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.PasteBuilder; @@ -52,22 +52,24 @@ public class ColorCommand extends SWCommand { @Register(description = "REGION_COLOR_HELP_COLOR_TYPE") public void genericColorSet(@Validator Player p, ColorMode color, ColorizationType colorizationType) { if (colorizationType == ColorizationType.GLOBAL) { - Region.setGlobal(Flag.COLOR, color); + Region.getRegions().forEach(region -> { + region.getFlags().set(Flag.COLOR, color); + }); BauSystem.MESSAGE.send("REGION_COLOR_GLOBAL", p, BauSystem.MESSAGE.parse(color.getChatValue(), p)); return; } Region region = Region.getRegion(p.getLocation()); - if (region.isGlobal()) { + if (!region.getFlags().has(Flag.COLOR).isWritable()) { BauSystem.MESSAGE.send("REGION_COLOR_NO_REGION", p); return; } - region.set(Flag.COLOR, color); + region.getFlags().set(Flag.COLOR, color); try { - PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL))) + PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getArea().getResetFile())) .ignoreAir(true) .onlyColors(true) - .color(color.getColor()); - region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL); + .color(color); + region.getArea().reset(pasteBuilder, false); RegionUtils.message(region, "REGION_REGION_COLORED"); RegionUtils.message(region, "REGION_REGION_COLORED_FAILED"); } catch (SecurityException e) { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireCommand.java index 3a0d4403..e694f19a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireCommand.java @@ -19,13 +19,11 @@ package de.steamwar.bausystem.features.region; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; +import de.steamwar.bausystem.region.flags.FireMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FireMode; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -55,14 +53,12 @@ public class FireCommand extends SWCommand { } private boolean toggle(Region region) { - switch (region.getPlain(Flag.FIRE, FireMode.class)) { - case ALLOW: - region.set(Flag.FIRE, FireMode.DENY); - return true; - default: - case DENY: - region.set(Flag.FIRE, FireMode.ALLOW); - return false; + if (region.getFlags().get(Flag.FIRE).isWithDefault(FireMode.ALLOW)) { + region.getFlags().set(Flag.FIRE, FireMode.DENY); + return true; + } else { + region.getFlags().set(Flag.FIRE, FireMode.ALLOW); + return false; } } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireListener.java index 3cf4d1dc..7c65f00d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FireListener.java @@ -2,8 +2,8 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.FireMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FireMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -17,12 +17,12 @@ public class FireListener implements Listener, ScoreboardElement { @EventHandler public void onFireDamage(BlockBurnEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).getPlain(Flag.FIRE, FireMode.class) == FireMode.DENY) e.setCancelled(true); + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FIRE).isWithDefault(FireMode.DENY)) e.setCancelled(true); } @EventHandler public void onFireSpread(BlockSpreadEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).getPlain(Flag.FIRE, FireMode.class) == FireMode.DENY) e.setCancelled(true); + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FIRE).isWithDefault(FireMode.DENY)) e.setCancelled(true); } @Override @@ -37,7 +37,7 @@ public class FireListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - if (region.get(Flag.FIRE) == Flag.FIRE.getDefaultValue()) return null; - return "§e" + BauSystem.MESSAGE.parse(Flag.FIRE.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.FIRE).getChatValue(), p); + if (region.getFlags().get(Flag.FIRE).isWithDefault(FireMode.DENY)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.FIRE.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.FIRE).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeCommand.java index d154ce66..ceba317d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeCommand.java @@ -19,13 +19,11 @@ package de.steamwar.bausystem.features.region; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; +import de.steamwar.bausystem.region.flags.FreezeMode; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -55,14 +53,12 @@ public class FreezeCommand extends SWCommand { } private boolean toggle(Region region) { - switch (region.getPlain(Flag.FREEZE, FreezeMode.class)) { - case ACTIVE: - region.set(Flag.FREEZE, FreezeMode.INACTIVE); - return false; - default: - case INACTIVE: - region.set(Flag.FREEZE, FreezeMode.ACTIVE); - return true; + if (region.getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { + region.getFlags().set(Flag.FREEZE, FreezeMode.INACTIVE); + return false; + } else { + region.getFlags().set(Flag.FREEZE, FreezeMode.ACTIVE); + return true; } } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java index 673867e7..c83b1561 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/FreezeListener.java @@ -3,7 +3,7 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; +import de.steamwar.bausystem.region.flags.FreezeMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.core.Core; import de.steamwar.core.TrickyTrialsWrapper; @@ -29,9 +29,7 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onEntitySpawn(EntitySpawnEvent e) { - if (Region.getRegion(e.getLocation()).get(Flag.FREEZE) == FreezeMode.INACTIVE) { - return; - } + if (Region.getRegion(e.getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.INACTIVE)) return; e.setCancelled(true); if (e.getEntityType() == TrickyTrialsWrapper.impl.getTntEntityType()) { Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> { @@ -43,8 +41,7 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onBlockCanBuild(BlockCanBuildEvent e) { if (!e.isBuildable()) return; - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.INACTIVE) - return; + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.INACTIVE)) return; if (e.getMaterial() == Material.TNT) { e.setBuildable(false); e.getBlock().setType(Material.TNT, false); @@ -53,14 +50,14 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onEntityChangeBlock(EntityChangeBlockEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onPhysicsEvent(BlockPhysicsEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { if (e.getSourceBlock().getType() == Material.NOTE_BLOCK) { BlockState state = e.getSourceBlock().getState(); NoteBlock noteBlock = (NoteBlock) state.getBlockData(); @@ -85,143 +82,44 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onPistonExtend(BlockPistonExtendEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } - @EventHandler - public void onNotePlay(NotePlayEvent event) { - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=45, z=98},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=44, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=45, z=97},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=45, z=99},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=custom_head,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=45, z=97},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=96},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=45, z=99},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-108, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=45, z=98},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-104, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=45, z=98},type=CYAN_TERRACOTTA,data=Block{minecraft:cyan_terracotta},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=BARRIER,data=Block{minecraft:barrier},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=harp,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@78078831} - - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=45, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=46, z=100},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=49, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=99},type=SMOOTH_STONE,data=Block{minecraft:smooth_stone},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - ////[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=true],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=102},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-108, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=46, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-107, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=100},type=STONE_SLAB,data=Block{minecraft:stone_slab}[type=bottom,waterlogged=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-104, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=46, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=48, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-105, y=47, z=100},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=101},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-107, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-105, y=47, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=46, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=48, z=98},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=97},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=99},type=AIR,data=Block{minecraft:air},fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - //[STDOUT] CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} -> CraftBlock{pos=BlockPosition{x=-106, y=47, z=98},type=NOTE_BLOCK,data=Block{minecraft:note_block}[instrument=basedrum,note=9,powered=false],fluid=net.minecraft.world.level.material.FluidTypeEmpty@1531ed7b} - } - - @EventHandler public void onPistonRetract(BlockPistonRetractEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onBlockGrow(BlockGrowEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onRedstoneEvent(BlockRedstoneEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setNewCurrent(e.getOldCurrent()); } } @EventHandler public void onBlockDispense(BlockDispenseEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onInventoryMoveEvent(InventoryMoveItemEvent e) { - if (e.getDestination().getLocation() != null && Region.getRegion(e.getDestination().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (e.getDestination().getLocation() != null && Region.getRegion(e.getDestination().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); - } else if (e.getSource().getLocation() != null && Region.getRegion(e.getSource().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + } else if (e.getSource().getLocation() != null && Region.getRegion(e.getSource().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @@ -230,7 +128,7 @@ public class FreezeListener implements Listener, ScoreboardElement { public void onBlockBreak(BlockBreakEvent e) { if (Core.getVersion() < 19) return; if (e.getPlayer().getInventory().getItemInMainHand().getType() == Material.DEBUG_STICK) return; - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); e.getBlock().setType(Material.BARRIER, false); e.getBlock().setType(Material.AIR, false); @@ -253,35 +151,35 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onFluidLevelChange(FluidLevelChangeEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onBlockSpread(BlockSpreadEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onBlockFromTo(BlockFromToEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onSpongeAbsorb(SpongeAbsorbEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @EventHandler public void onBlockForm(BlockFormEvent e) { - if (Region.getRegion(e.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { e.setCancelled(true); } } @@ -289,7 +187,7 @@ public class FreezeListener implements Listener, ScoreboardElement { @EventHandler public void onPlayerInteract(PlayerInteractEvent e) { if (e.getAction() != Action.RIGHT_CLICK_BLOCK) return; - if (Region.getRegion(e.getClickedBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { + if (Region.getRegion(e.getClickedBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { Block block = e.getClickedBlock(); if (block.getType() == Material.LEVER) { Switch data = ((Switch) block.getBlockData()); @@ -300,9 +198,9 @@ public class FreezeListener implements Listener, ScoreboardElement { } @EventHandler - public void onBlockFade(BlockFadeEvent event) { - if (Region.getRegion(event.getBlock().getLocation()).get(Flag.FREEZE) == FreezeMode.ACTIVE) { - event.setCancelled(true); + public void onBlockFade(BlockFadeEvent e) { + if (Region.getRegion(e.getBlock().getLocation()).getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { + e.setCancelled(true); } } @@ -318,7 +216,7 @@ public class FreezeListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - if (region.get(Flag.FREEZE) == Flag.FREEZE.getDefaultValue()) return null; - return "§e" + BauSystem.MESSAGE.parse(Flag.FREEZE.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.FREEZE).getChatValue(), p); + if (region.getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.INACTIVE)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.FREEZE.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.FREEZE).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsCommand.java index 8c4452cb..7a8c108a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsCommand.java @@ -19,14 +19,11 @@ package de.steamwar.bausystem.features.region; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ItemMode; +import de.steamwar.bausystem.region.flags.ItemMode; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.linkage.MinVersion; import org.bukkit.entity.Player; @@ -58,14 +55,12 @@ public class ItemsCommand extends SWCommand { } private boolean toggle(Region region) { - switch (region.getPlain(Flag.ITEMS, ItemMode.class)) { - case ACTIVE: - region.set(Flag.ITEMS, ItemMode.INACTIVE); - return false; - default: - case INACTIVE: - region.set(Flag.ITEMS, ItemMode.ACTIVE); - return true; + if (region.getFlags().get(Flag.ITEMS).isWithDefault(ItemMode.ACTIVE)) { + region.getFlags().set(Flag.ITEMS, ItemMode.INACTIVE); + return false; + } else { + region.getFlags().set(Flag.ITEMS, ItemMode.ACTIVE); + return true; } } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsListener.java index 66e1fdb7..47fd27c8 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ItemsListener.java @@ -22,7 +22,7 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ItemMode; +import de.steamwar.bausystem.region.flags.ItemMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import de.steamwar.linkage.MinVersion; @@ -35,13 +35,9 @@ import org.bukkit.event.entity.ItemSpawnEvent; @MinVersion(19) public class ItemsListener implements Listener, ScoreboardElement { - private static ItemMode getMode(Region region) { - return region.getPlain(Flag.ITEMS, ItemMode.class); - } - @EventHandler public void onItemSpawn(ItemSpawnEvent event) { - if (getMode(Region.getRegion(event.getLocation())) == ItemMode.INACTIVE) { + if (Region.getRegion(event.getLocation()).getFlags().get(Flag.ITEMS).isWithDefault(ItemMode.INACTIVE)) { event.setCancelled(true); } } @@ -58,7 +54,7 @@ public class ItemsListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - if (region.get(Flag.ITEMS) == Flag.ITEMS.getDefaultValue()) return null; - return "§e" + BauSystem.MESSAGE.parse(Flag.ITEMS.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.ITEMS).getChatValue(), p); + if (region.getFlags().get(Flag.ITEMS).isWithDefault(ItemMode.INACTIVE)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.ITEMS.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.ITEMS).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityCommand.java index aeeaf588..6ef0b428 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityCommand.java @@ -22,7 +22,7 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode; +import de.steamwar.bausystem.region.flags.NoGravityMode; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -53,14 +53,12 @@ public class NoGravityCommand extends SWCommand { } private boolean toggle(Region region) { - switch (region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class)) { - case ACTIVE: - region.set(Flag.NO_GRAVITY, NoGravityMode.INACTIVE); - return false; - default: - case INACTIVE: - region.set(Flag.NO_GRAVITY, NoGravityMode.ACTIVE); - return true; + if (region.getFlags().get(Flag.NO_GRAVITY).isWithDefault(NoGravityMode.ACTIVE)) { + region.getFlags().set(Flag.NO_GRAVITY, NoGravityMode.INACTIVE); + return false; + } else { + region.getFlags().set(Flag.NO_GRAVITY, NoGravityMode.ACTIVE); + return true; } } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityListener.java index f86403f9..f874fb41 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/NoGravityListener.java @@ -22,7 +22,7 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.NoGravityMode; +import de.steamwar.bausystem.region.flags.NoGravityMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import org.bukkit.entity.EntityType; @@ -34,14 +34,10 @@ import org.bukkit.event.entity.EntitySpawnEvent; @Linked public class NoGravityListener implements Listener, ScoreboardElement { - private static NoGravityMode getMode(Region region) { - return region.getPlain(Flag.NO_GRAVITY, NoGravityMode.class); - } - @EventHandler public void onEntitySpawn(EntitySpawnEvent event) { if (event.getEntityType() == EntityType.PLAYER) return; - if (getMode(Region.getRegion(event.getLocation())) == NoGravityMode.ACTIVE) { + if (Region.getRegion(event.getLocation()).getFlags().get(Flag.NO_GRAVITY).isWithDefault(NoGravityMode.ACTIVE)) { event.getEntity().setGravity(false); } } @@ -58,7 +54,7 @@ public class NoGravityListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - if (region.get(Flag.NO_GRAVITY) == Flag.NO_GRAVITY.getDefaultValue()) return null; - return "§e" + BauSystem.MESSAGE.parse(Flag.NO_GRAVITY.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.NO_GRAVITY).getChatValue(), p); + if (region.getFlags().get(Flag.NO_GRAVITY).isWithDefault(NoGravityMode.INACTIVE)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.NO_GRAVITY.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.NO_GRAVITY).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java index 4fc33cf0..a390bddd 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectCommand.java @@ -20,13 +20,11 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; +import de.steamwar.bausystem.region.flags.ProtectMode; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -41,22 +39,18 @@ public class ProtectCommand extends SWCommand { public void genericProtectCommand(@Validator Player p) { Region region = regionCheck(p); if (region == null) return; - switch (region.getPlain(Flag.PROTECT, ProtectMode.class)) { - case ACTIVE: - region.set(Flag.PROTECT, ProtectMode.INACTIVE); - RegionUtils.actionBar(region, "REGION_PROTECT_DISABLE"); - break; - default: - case INACTIVE: - region.set(Flag.PROTECT, ProtectMode.ACTIVE); - RegionUtils.actionBar(region, "REGION_PROTECT_ENABLE"); - break; + if (region.getFlags().get(Flag.PROTECT).isWithDefault(ProtectMode.ACTIVE)) { + region.getFlags().set(Flag.PROTECT, ProtectMode.INACTIVE); + RegionUtils.actionBar(region, "REGION_PROTECT_DISABLE"); + } else { + region.getFlags().set(Flag.PROTECT, ProtectMode.ACTIVE); + RegionUtils.actionBar(region, "REGION_PROTECT_ENABLE"); } } private Region regionCheck(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.getFloorLevel() == 0) { + if (!region.getFlags().has(Flag.PROTECT).isApplicable()) { BauSystem.MESSAGE.send("REGION_PROTECT_FALSE_REGION", player); return null; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java index 65ec30de..2abe5569 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ProtectListener.java @@ -1,9 +1,10 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; +import de.steamwar.bausystem.region.flags.ProtectMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import org.bukkit.Location; @@ -21,13 +22,11 @@ public class ProtectListener implements Listener, ScoreboardElement { private void explode(List blockList, Location location) { Region region = Region.getRegion(location); - if (region.getFloorLevel() == 0) { - return; - } - if (region.getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.INACTIVE) { - return; - } - blockList.removeIf(block -> block.getY() < region.getFloorLevel()); + if (region.getFlags().get(Flag.PROTECT).isWithDefault(ProtectMode.INACTIVE)) return; + Point p1 = region.getBuildArea().getMinPoint(true); + Point p2 = region.getTestblockArea().getMinPoint(true); + int floorLevel = Math.min(p1.getY(), p2.getY()); + blockList.removeIf(block -> block.getY() < floorLevel); } @EventHandler @@ -52,8 +51,7 @@ public class ProtectListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - if (region.getFloorLevel() == 0) return null; - if (region.get(Flag.PROTECT) != Flag.PROTECT.getDefaultValue()) return null; - return "§e" + BauSystem.MESSAGE.parse(Flag.PROTECT.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.PROTECT).getChatValue(), p); + if (region.getFlags().get(Flag.PROTECT).isWithDefault(ProtectMode.INACTIVE)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.PROTECT.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.PROTECT).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionCommand.java index 6d8d6f4d..54337983 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionCommand.java @@ -32,30 +32,20 @@ import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.FlatteningWrapper; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.bausystem.utils.WorldEditUtils; -import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeMapper; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; import de.steamwar.sql.SchematicNode; -import net.md_5.bungee.api.chat.ClickEvent; import org.bukkit.Bukkit; import org.bukkit.Location; -import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.player.PlayerTeleportEvent; -import java.util.Collections; -import java.util.List; import java.util.logging.Level; -import java.util.stream.Collectors; @Linked public class RegionCommand extends SWCommand { @@ -71,7 +61,7 @@ public class RegionCommand extends SWCommand { } static boolean checkGlobalRegion(Region region, Player p) { - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("REGION_REGION_NO_REGION", p); return true; } @@ -83,7 +73,7 @@ public class RegionCommand extends SWCommand { Region region = Region.getRegion(p.getLocation()); if (checkGlobalRegion(region, p)) return; - if (region.undo()) { + if (region.getHistory().undo()) { RegionUtils.message(region, "REGION_REGION_UNDID"); } else { BauSystem.MESSAGE.send("REGION_REGION_NOTHING_UNDO", p); @@ -97,7 +87,7 @@ public class RegionCommand extends SWCommand { return; } - if (region.redo()) { + if (region.getHistory().redo()) { RegionUtils.message(region, "REGION_REGION_REDID"); } else { BauSystem.MESSAGE.send("REGION_REGION_NOTHING_REDO", p); @@ -110,10 +100,10 @@ public class RegionCommand extends SWCommand { if(checkGlobalRegion(region, p)) return; try { - PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL))) + PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getArea().getResetFile())) .ignoreAir(true) - .color(region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL); + .color(region.getFlags().get(Flag.COLOR).getWithDefault()); + region.getArea().reset(pasteBuilder, true); RegionUtils.message(region, "REGION_REGION_RESTORED"); } catch (SecurityException e) { BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p); @@ -134,8 +124,8 @@ public class RegionCommand extends SWCommand { try { PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.SchematicProvider(node)) .ignoreAir(true) - .color(region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL); + .color(region.getFlags().get(Flag.COLOR).getWithDefault()); + region.getArea().reset(pasteBuilder, true); RegionUtils.message(region, "REGION_REGION_RESTORED"); } catch (SecurityException e) { BauSystem.MESSAGE.send("REGION_REGION_FAILED_RESTORE", p); @@ -149,11 +139,11 @@ public class RegionCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - if (region.getCopyPoint() == null) { + if (region.getBuildArea().isEmpty()) { BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p); return; } - p.teleport(region.getCopyPoint().toLocation(p, 0.5, 0, 0.5), PlayerTeleportEvent.TeleportCause.COMMAND); + p.teleport(region.getBuildArea().getCopyPoint().toLocation(p, 0.5, 0, 0.5), PlayerTeleportEvent.TeleportCause.COMMAND); BauSystem.MESSAGE.send("REGION_REGION_TP_COPY", p); } @@ -164,70 +154,33 @@ public class RegionCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - if (region.getTestBlockPoint() == null) { + if (region.getTestblockArea().isEmpty()) { BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p); return; } - p.teleport(region.getTestBlockPoint().toLocation(p, 0.5, 0, 0.5), PlayerTeleportEvent.TeleportCause.COMMAND); + p.teleport(region.getTestblockArea().getCopyPoint().toLocation(p, 0.5, 0, 0.5), PlayerTeleportEvent.TeleportCause.COMMAND); BauSystem.MESSAGE.send("REGION_REGION_TP_TEST_BLOCK", p); } - @Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN_INFO") - @Register("skin") - public void changeSkinCommand(Player p) { - Region region = Region.getRegion(p.getLocation()); - if (checkGlobalRegion(region, p)) { - return; - } - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO", p, region.getSkin()); - String creator = region.getPrototype().getSkinMap().get(region.getSkin()).getCreator(); - if (creator != null) { - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INFO_CREATOR", p, creator); - } - } - - @Register(value = "changeskin", description = "REGION_REGION_HELP_CHANGESKIN") - @Register("skin") - public void changeSkinCommand(@Validator Player p, @Mapper("skinTypeMapper") String s) { - Region region = Region.getRegion(p.getLocation()); - if (checkGlobalRegion(region, p)) { - return; - } - if (!region.getPrototype().getSkinMap().containsKey(s)) { - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_UNKNOWN", p); - } else { - if (region.setSkin(s)) { - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE", p, s); - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_CHANGE_UPDATE", p, BauSystem.MESSAGE.parse("REGION_REGION_CHANGESKIN_CHANGE_UPDATE_HOVER", p), new ClickEvent(ClickEvent.Action.RUN_COMMAND, "/reset")); - } else { - BauSystem.MESSAGE.send("REGION_REGION_CHANGESKIN_INVALID", p); - } - } - } - @Register(value = "copy", description = "REGION_REGION_HELP_COPY") public void copyCommand(@Validator Player p, @OptionalValue("") @StaticValue(value = {"", "-e", "-s"}, allowISE = true) int option) { Region region = Region.getRegion(p.getLocation()); if (checkGlobalRegion(region, p)) { return; } - if (!region.hasType(RegionType.BUILD)) { + if (region.getBuildArea().isEmpty()) { BauSystem.MESSAGE.send("REGION_REGION_NO_BUILD", p); return; } - if (region.getCopyPoint() == null) { - BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p); - return; - } - Point minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.NORMAL); - Point maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.NORMAL); + Point minPoint = region.getBuildArea().getMinPoint(false); + Point maxPoint = region.getBuildArea().getMaxPoint(false); switch (option) { case 0: break; case 1: - minPoint = region.getMinPoint(RegionType.BUILD, RegionExtensionType.EXTENSION); - maxPoint = region.getMaxPoint(RegionType.BUILD, RegionExtensionType.EXTENSION); + minPoint = region.getBuildArea().getMinPoint(true); + maxPoint = region.getBuildArea().getMaxPoint(true); break; case 2: Pair selection = WorldEditUtils.getSelection(p); @@ -238,7 +191,7 @@ public class RegionCommand extends SWCommand { break; } - Clipboard clipboard = FlatteningWrapper.impl.copy(minPoint, maxPoint, region.getCopyPoint()); + Clipboard clipboard = FlatteningWrapper.impl.copy(minPoint, maxPoint, region.getBuildArea().getCopyPoint()); WorldEdit.getInstance() .getSessionManager() .get(BukkitAdapter.adapt(p)) @@ -252,14 +205,10 @@ public class RegionCommand extends SWCommand { if (checkGlobalRegion(region, p)) { return; } - if (!region.hasType(RegionType.BUILD)) { + if (region.getBuildArea().isEmpty()) { BauSystem.MESSAGE.send("REGION_REGION_NO_BUILD", p); return; } - if (region.getCopyPoint() == null) { - BauSystem.MESSAGE.send("REGION_REGION_TP_UNKNOWN", p); - return; - } ClipboardHolder clipboardHolder = WorldEdit.getInstance() .getSessionManager() @@ -287,13 +236,13 @@ public class RegionCommand extends SWCommand { } try (EditSession e = WorldEditUtils.getEditSession(p)) { - Operations.completeBlindly(clipboardHolder.createPaste(e).ignoreAirBlocks(ignoreAir).to(toBlockVector3(region.getCopyPoint())).build()); + Operations.completeBlindly(clipboardHolder.createPaste(e).ignoreAirBlocks(ignoreAir).to(toBlockVector3(region.getBuildArea().getCopyPoint())).build()); WorldEditUtils.addToPlayer(p, e); if (selectPasted) { Clipboard clipboard = clipboardHolder.getClipboards().get(0); - BlockVector3 minPointSelection = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getCopyPoint())); - BlockVector3 maxPointSelection = clipboard.getRegion().getMaximumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getCopyPoint())); + BlockVector3 minPointSelection = clipboard.getRegion().getMinimumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getBuildArea().getCopyPoint())); + BlockVector3 maxPointSelection = clipboard.getRegion().getMaximumPoint().subtract(clipboard.getOrigin()).add(toBlockVector3(region.getBuildArea().getCopyPoint())); FlatteningWrapper.impl.setSelection(p, Point.fromBlockVector3(minPointSelection), Point.fromBlockVector3(maxPointSelection)); } BauSystem.MESSAGE.send("REGION_REGION_PASTE_DONE", p); @@ -303,25 +252,4 @@ public class RegionCommand extends SWCommand { private BlockVector3 toBlockVector3(Point point) { return BlockVector3.at(point.getX(), point.getY(), point.getZ()); } - - - @Mapper(value = "skinTypeMapper", local = true) - private TypeMapper skinTypeMapper() { - return new TypeMapper() { - @Override - public List tabCompletes(CommandSender commandSender, PreviousArguments previousArguments, String s) { - Player p = (Player) commandSender; - Region region = Region.getRegion(p.getLocation()); - if (region.isGlobal()) { - return Collections.emptyList(); - } - return region.getPrototype().getSkinMap().keySet().stream().map(c -> c.replace(' ', '_')).collect(Collectors.toList()); - } - - @Override - public String map(CommandSender commandSender, PreviousArguments previousArguments, String s) { - return s.replace('_', ' '); - } - }; - } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionListener.java index 38b6532e..78c917c1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionListener.java @@ -21,7 +21,8 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.tags.Tag; +import de.steamwar.bausystem.region.flags.ChangedMode; +import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.linkage.Linked; import org.bukkit.Location; import org.bukkit.event.EventHandler; @@ -185,7 +186,7 @@ public class RegionListener implements Listener { new BukkitRunnable() { @Override public void run() { - Region.getRegion(location).set(Tag.CHANGED); + Region.getRegion(location).getFlags().set(Flag.CHANGED, ChangedMode.HAS_CHANGE); } }.runTaskAsynchronously(BauSystem.getInstance()); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionScoreboardElement.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionScoreboardElement.java index 246b9a01..b810bb1e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionScoreboardElement.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/RegionScoreboardElement.java @@ -20,12 +20,16 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; +import java.io.File; +import java.util.List; +import java.util.Optional; + @Linked public class RegionScoreboardElement implements ScoreboardElement { @@ -41,7 +45,10 @@ public class RegionScoreboardElement implements ScoreboardElement { @Override public String get(Region region, Player p) { - if (GlobalRegion.getInstance() == region) return null; - return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_REGION", p) + "§8: §7" + region.getDisplayName(); + if (region.getType().isGlobal()) return null; + if (!region.getGameModeConfig().isLoaded()) return null; + List names = region.getGameModeConfig().getServer().getChatNames(); + if (names.isEmpty()) return null; + return "§e" + BauSystem.MESSAGE.parse("SCOREBOARD_REGION", p) + "§8: §7" + names.get(0); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ResetCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ResetCommand.java index 4490a146..49893d1d 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ResetCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/ResetCommand.java @@ -21,13 +21,10 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.config.BauServer; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; @@ -55,12 +52,10 @@ public class ResetCommand extends SWCommand { Region region = regionCheck(p); if (region == null) return; try { - PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getResetFile(RegionType.NORMAL))) - .color(region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL); - for (Flag value : Flag.getResetFlags()) { - region.set(value, value.getDefaultValue()); - } + PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.FileProvider(region.getArea().getResetFile())) + .color(region.getFlags().get(Flag.COLOR).getWithDefault()); + region.getArea().reset(pasteBuilder, false); + region.getFlags().clear(); RegionUtils.message(region, "REGION_RESET_RESETED"); } catch (SecurityException e) { BauSystem.MESSAGE.send("REGION_RESET_ERROR", p); @@ -88,8 +83,8 @@ public class ResetCommand extends SWCommand { } try { PasteBuilder pasteBuilder = new PasteBuilder(new PasteBuilder.SchematicProvider(node)) - .color(region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - region.reset(pasteBuilder, RegionType.NORMAL, RegionExtensionType.NORMAL); + .color(region.getFlags().get(Flag.COLOR).getWithDefault()); + region.getArea().reset(pasteBuilder, true); RegionUtils.message(region, "REGION_RESET_RESETED"); } catch (SecurityException e) { BauSystem.MESSAGE.send("REGION_RESET_ERROR", p); @@ -99,7 +94,7 @@ public class ResetCommand extends SWCommand { private Region regionCheck(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region == GlobalRegion.getInstance()) { + if (region == RegionSystem.INSTANCE.getGlobalRegion()) { BauSystem.MESSAGE.send("REGION_RESET_NO_REGION", player); return null; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTCommand.java index 27dcbe8f..97abf0bc 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTCommand.java @@ -20,16 +20,14 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; -import de.steamwar.bausystem.region.utils.RegionType; +import de.steamwar.bausystem.region.flags.TNTMode; +import de.steamwar.bausystem.region.flags.TestblockMode; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -74,9 +72,6 @@ public class TNTCommand extends SWCommand { case ONLY_TB: requestedMessage = getTestblockEnableMessage(); break; - case ONLY_BUILD: - requestedMessage = getBuildEnableMessage(); - break; } tntToggle(region, tntMode, requestedMessage); } @@ -92,13 +87,12 @@ public class TNTCommand extends SWCommand { Map tntModeMap = new HashMap<>(tntModeMapReduced); tntModeMap.put("testblock", TNTMode.ONLY_TB); tntModeMap.put("tb", TNTMode.ONLY_TB); - tntModeMap.put("build", TNTMode.ONLY_BUILD); - return new TypeMapper() { + return new TypeMapper<>() { @Override public List tabCompletes(CommandSender sender, PreviousArguments previousArguments, String s) { Region region = Region.getRegion(((Player) sender).getLocation()); - if (region.hasType(RegionType.TESTBLOCK) && region.hasType(RegionType.BUILD)) { + if (region.getFlags().get(Flag.TESTBLOCK).isNotWithDefault(TestblockMode.NO_VALUE)) { return new ArrayList<>(tntModeMap.keySet()); } else { return new ArrayList<>(tntModeMapReduced.keySet()); @@ -108,7 +102,7 @@ public class TNTCommand extends SWCommand { @Override public TNTMode map(CommandSender sender, PreviousArguments previousArguments, String s) { Region region = Region.getRegion(((Player) sender).getLocation()); - if (region.hasType(RegionType.TESTBLOCK) && region.hasType(RegionType.BUILD)) { + if (region.getFlags().get(Flag.TESTBLOCK).isNotWithDefault(TestblockMode.NO_VALUE)) { return tntModeMap.getOrDefault(s, null); } else { return tntModeMapReduced.getOrDefault(s, null); @@ -134,24 +128,23 @@ public class TNTCommand extends SWCommand { } private void tntToggle(Region region, TNTMode requestedMode, String requestedMessage) { - if (requestedMode != null && region.hasType(RegionType.TESTBLOCK) && region.hasType(RegionType.BUILD)) { - region.set(Flag.TNT, requestedMode); + if (requestedMode != null && region.getFlags().get(Flag.TESTBLOCK).isNotWithDefault(TestblockMode.NO_VALUE)) { + region.getFlags().set(Flag.TNT, requestedMode); RegionUtils.actionBar(region, requestedMessage); return; } - switch (region.getPlain(Flag.TNT, TNTMode.class)) { + switch (region.getFlags().get(Flag.TNT).getWithDefault()) { case ALLOW: case ONLY_TB: - case ONLY_BUILD: - region.set(Flag.TNT, TNTMode.DENY); + region.getFlags().set(Flag.TNT, TNTMode.DENY); RegionUtils.actionBar(region, getDisableMessage()); break; case DENY: - if (region.hasType(RegionType.TESTBLOCK) && region.hasType(RegionType.BUILD)) { - region.set(Flag.TNT, TNTMode.ONLY_TB); + if (region.getFlags().get(Flag.TESTBLOCK).isNotWithDefault(TestblockMode.NO_VALUE)) { + region.getFlags().set(Flag.TNT, TNTMode.ONLY_TB); RegionUtils.actionBar(region, getTestblockEnableMessage()); } else { - region.set(Flag.TNT, TNTMode.ALLOW); + region.getFlags().set(Flag.TNT, TNTMode.ALLOW); RegionUtils.actionBar(region, getEnableMessage()); } break; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTListener.java index a8d34de5..285b2a7f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TNTListener.java @@ -23,9 +23,7 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; +import de.steamwar.bausystem.region.flags.TNTMode; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import org.bukkit.block.Block; @@ -37,7 +35,6 @@ import org.bukkit.event.block.BlockExplodeEvent; import org.bukkit.event.entity.EntityExplodeEvent; import java.util.List; -import java.util.concurrent.atomic.AtomicBoolean; @Linked public class TNTListener implements Listener, ScoreboardElement { @@ -45,27 +42,14 @@ public class TNTListener implements Listener, ScoreboardElement { private void explode(List blockList) { blockList.removeIf(block -> { Region region = Region.getRegion(block.getLocation()); - TNTMode value = region.getPlain(Flag.TNT); + TNTMode value = region.getFlags().get(Flag.TNT).getWithDefault(); if (value == TNTMode.ALLOW) { return false; } else if (value == TNTMode.ONLY_TB) { - if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.NORMAL)) { + if (region.getBuildArea().inRegion(block.getLocation(), true)) { RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY"); return true; } - if (region.hasType(RegionType.BUILD) && region.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION)) { - RegionUtils.actionBar(region, "REGION_TNT_BUILD_DESTROY"); - return true; - } - } else if (value == TNTMode.ONLY_BUILD) { - if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.NORMAL)) { - RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY"); - return true; - } - if (region.hasType(RegionType.TESTBLOCK) && region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) { - RegionUtils.actionBar(region, "REGION_TNT_TB_DESTROY"); - return true; - } } return value == TNTMode.DENY; }); @@ -93,6 +77,7 @@ public class TNTListener implements Listener, ScoreboardElement { @Override public String get(Region region, Player p) { - return "§e" + BauSystem.MESSAGE.parse(Flag.TNT.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.get(Flag.TNT).getChatValue(), p); + if (region.getFlags().get(Flag.TNT).isWithDefault(TNTMode.ALLOW)) return null; + return "§e" + BauSystem.MESSAGE.parse(Flag.TNT.getChatValue(), p) + "§8: " + BauSystem.MESSAGE.parse(region.getFlags().get(Flag.TNT).getWithDefault().getChatValue(), p); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TestblockCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TestblockCommand.java index 6b319062..7e4abc4b 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TestblockCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/TestblockCommand.java @@ -20,19 +20,16 @@ package de.steamwar.bausystem.features.region; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.config.BauServer; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; import de.steamwar.sql.Punishment; @@ -43,10 +40,8 @@ import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; -import java.io.IOException; import java.util.*; import java.util.concurrent.atomic.AtomicReference; -import java.util.function.Consumer; import java.util.function.Supplier; import java.util.logging.Level; import java.util.stream.Collectors; @@ -99,14 +94,14 @@ public class TestblockCommand extends SWCommand { } try { - PasteBuilder.ClipboardProvider clipboardProvider = node == null ? new PasteBuilder.FileProvider(region.getResetFile(RegionType.TESTBLOCK)) : new PasteBuilder.SchematicProvider(node); + PasteBuilder.ClipboardProvider clipboardProvider = node == null ? new PasteBuilder.FileProvider(region.getTestblockArea().getResetFile()) : new PasteBuilder.SchematicProvider(node); PasteBuilder pasteBuilder = new PasteBuilder(clipboardProvider) .ignoreAir(ignoreAir) .onlyColors(onlyColors) .removeTNT(removeTNT) .removeWater(removeWater) - .color(region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - region.reset(pasteBuilder, RegionType.TESTBLOCK, regionExtensionType); + .color(region.getFlags().get(Flag.COLOR).getWithDefault()); + region.getTestblockArea().reset(pasteBuilder, regionExtensionType == RegionExtensionType.EXTENSION); RegionUtils.message(region, "REGION_TB_DONE"); } catch (SecurityException e) { BauSystem.MESSAGE.send("REGION_TB_ERROR", p); @@ -159,7 +154,7 @@ public class TestblockCommand extends SWCommand { private Region regionCheck(Player player) { Region region = Region.getRegion(player.getLocation()); - if (!region.hasType(RegionType.TESTBLOCK)) { + if (region.getTestblockArea().isEmpty()) { BauSystem.MESSAGE.send("REGION_TB_NO_REGION", player); return null; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ColorBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ColorBauGuiItem.java index a38c397f..ae633edd 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ColorBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ColorBauGuiItem.java @@ -22,10 +22,9 @@ package de.steamwar.bausystem.features.region.items; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.bausystem.region.Color; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; import de.steamwar.linkage.Linked; @@ -45,7 +44,7 @@ public class ColorBauGuiItem extends BauGuiItem { super(2); } - private static Material mapColor(Color color) { + private static Material mapColor(ColorMode color) { switch (color) { case RED: return Material.RED_CONCRETE; @@ -85,17 +84,17 @@ public class ColorBauGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { Region region = Region.getRegion(player.getLocation()); - ColorMode mode = region.getPlain(Flag.COLOR, ColorMode.class); - return new SWItem(mapColor(mode.getColor()), BauSystem.MESSAGE.parse("REGION_ITEM_COLOR", player, BauSystem.MESSAGE.parse(mode.getChatValue(), player))).getItemStack(); + ColorMode mode = region.getFlags().get(Flag.COLOR).orElse(ColorMode.PINK); + return new SWItem(mapColor(mode), BauSystem.MESSAGE.parse("REGION_ITEM_COLOR", player, BauSystem.MESSAGE.parse(mode.getChatValue(), player))).getItemStack(); } @Override public boolean click(ClickType click, Player p) { p.closeInventory(); - ColorMode current = Region.getRegion(p.getLocation()).getPlain(Flag.COLOR, ColorMode.class); + ColorMode current = Region.getRegion(p.getLocation()).getFlags().get(Flag.COLOR).orElse(ColorMode.PINK); List> items = new ArrayList<>(); for (ColorMode value : ColorMode.values()) { - items.add(new SWListInv.SWListEntry<>(new SWItem(mapColor(value.getColor()), (byte) 0, "§f" + BauSystem.MESSAGE.parse(value.getChatValue(), p), Collections.emptyList(), value == current, clickType -> { + items.add(new SWListInv.SWListEntry<>(new SWItem(mapColor(value), (byte) 0, "§f" + BauSystem.MESSAGE.parse(value.getChatValue(), p), Collections.emptyList(), value == current, clickType -> { }), value)); } SWListInv inv = new SWListInv<>(p, BauSystem.MESSAGE.parse("REGION_ITEM_COLOR_CHOOSE", p), items, (clickType, colorMode) -> { diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FireBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FireBauGuiItem.java index 79101ee9..e41be46b 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FireBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FireBauGuiItem.java @@ -23,8 +23,8 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.FireMode; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FireMode; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import org.bukkit.Material; @@ -42,7 +42,10 @@ public class FireBauGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.getPlain(Flag.FIRE, FireMode.class) == FireMode.ALLOW) { + if (!region.getFlags().has(Flag.FIRE).isApplicable()) { + return new SWItem(Material.BARRIER, "").getItemStack(); + } + if (region.getFlags().get(Flag.FIRE).isWithDefault(FireMode.ALLOW)) { return new SWItem(Material.FIRE_CHARGE, BauSystem.MESSAGE.parse("REGION_ITEM_FIRE_ALLOW", player)).getItemStack(); } else { return new SWItem(Material.FIREWORK_STAR, BauSystem.MESSAGE.parse("REGION_ITEM_FIRE_DISALLOW", player)).getItemStack(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FreezeBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FreezeBauGuiItem.java index 1406638c..13f1f9eb 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FreezeBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/FreezeBauGuiItem.java @@ -24,7 +24,7 @@ import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; +import de.steamwar.bausystem.region.flags.FreezeMode; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import org.bukkit.Material; @@ -42,7 +42,10 @@ public class FreezeBauGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE) { + if (!region.getFlags().has(Flag.FREEZE).isApplicable()) { + return new SWItem(Material.BARRIER, "").getItemStack(); + } + if (region.getFlags().get(Flag.FREEZE).isWithDefault(FreezeMode.ACTIVE)) { return new SWItem(Material.GUNPOWDER, BauSystem.MESSAGE.parse("REGION_ITEM_FREEZE_ALLOW", player)).getItemStack(); } else { return new SWItem(Material.REDSTONE, BauSystem.MESSAGE.parse("REGION_ITEM_FREEZE_DISALLOW", player)).getItemStack(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ProtectBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ProtectBauGuiItem.java index a11e508d..75bf4eb0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ProtectBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/ProtectBauGuiItem.java @@ -25,7 +25,7 @@ import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; +import de.steamwar.bausystem.region.flags.ProtectMode; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import org.bukkit.Material; @@ -43,7 +43,10 @@ public class ProtectBauGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.ACTIVE) { + if (!region.getFlags().has(Flag.PROTECT).isApplicable()) { + return new SWItem(Material.BARRIER, "").getItemStack(); + } + if (region.getFlags().get(Flag.PROTECT).isWithDefault(ProtectMode.ACTIVE)) { return SWUtils.setCustomModelData(new SWItem(Material.OBSIDIAN, BauSystem.MESSAGE.parse("REGION_ITEM_PROTECT_ALLOW", player)), 1).getItemStack(); } else { return SWUtils.setCustomModelData(new SWItem(Material.STONE, BauSystem.MESSAGE.parse("REGION_ITEM_PROTECT_DISALLOW", player)), 1).getItemStack(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/TntBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/TntBauGuiItem.java index 38f1b04a..2205cf10 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/TntBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/region/items/TntBauGuiItem.java @@ -24,8 +24,7 @@ import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.linkage.specific.BauGuiItem; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; -import de.steamwar.bausystem.region.utils.RegionType; +import de.steamwar.bausystem.region.flags.TNTMode; import de.steamwar.inventory.SWInventory; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; @@ -43,13 +42,11 @@ public class TntBauGuiItem extends BauGuiItem { @Override public ItemStack getItem(Player player) { - switch (Region.getRegion(player.getLocation()).getPlain(Flag.TNT, TNTMode.class)) { + switch (Region.getRegion(player.getLocation()).getFlags().get(Flag.TNT).getWithDefault()) { case DENY: return new SWItem(Material.MINECART, BauSystem.MESSAGE.parse("REGION_ITEM_TNT_OFF", player)).getItemStack(); case ONLY_TB: return new SWItem(Material.TNT_MINECART, BauSystem.MESSAGE.parse("REGION_ITEM_TNT_ONLY_TB", player)).getItemStack(); - case ONLY_BUILD: - return new SWItem(Material.OBSIDIAN, BauSystem.MESSAGE.parse("REGION_ITEM_TNT_ONLY_BUILD", player)).getItemStack(); default: return new SWItem(Material.TNT, BauSystem.MESSAGE.parse("REGION_ITEM_TNT_ON", player)).getItemStack(); } @@ -58,12 +55,12 @@ public class TntBauGuiItem extends BauGuiItem { @Override public boolean click(ClickType click, Player p) { if (click == ClickType.LEFT) { - switch (Region.getRegion(p.getLocation()).getPlain(Flag.TNT, TNTMode.class)) { + switch (Region.getRegion(p.getLocation()).getFlags().get(Flag.TNT).getWithDefault()) { case DENY: updateTntMode(TNTMode.ALLOW, p); break; case ALLOW: - if (Region.getRegion(p.getLocation()).hasType(RegionType.BUILD) && Region.getRegion(p.getLocation()).hasType(RegionType.TESTBLOCK)) { + if (!Region.getRegion(p.getLocation()).getBuildArea().isEmpty() && !Region.getRegion(p.getLocation()).getTestblockArea().isEmpty()) { updateTntMode(TNTMode.ONLY_TB, p); break; } @@ -77,15 +74,11 @@ public class TntBauGuiItem extends BauGuiItem { updateTntMode(TNTMode.ALLOW, p); p.closeInventory(); })); - if (Region.getRegion(p.getLocation()).hasType(RegionType.BUILD) && Region.getRegion(p.getLocation()).hasType(RegionType.TESTBLOCK)) { + if (!Region.getRegion(p.getLocation()).getBuildArea().isEmpty() && !Region.getRegion(p.getLocation()).getTestblockArea().isEmpty()) { selector.setItem(3, new SWItem(Material.TNT_MINECART, BauSystem.MESSAGE.parse("REGION_ITEM_SELECTOR_ONLY_TB", p), clickType -> { updateTntMode(TNTMode.ONLY_TB, p); p.closeInventory(); })); - selector.setItem(5, new SWItem(Material.OBSIDIAN, BauSystem.MESSAGE.parse("REGION_ITEM_SELECTOR_ONLY_BUILD", p), clickType -> { - updateTntMode(TNTMode.ONLY_BUILD, p); - p.closeInventory(); - })); } selector.setItem(7, new SWItem(Material.MINECART, BauSystem.MESSAGE.parse("REGION_ITEM_SELECTOR_OFF", p), clickType -> { updateTntMode(TNTMode.DENY, p); @@ -101,9 +94,6 @@ public class TntBauGuiItem extends BauGuiItem { case ONLY_TB: p.performCommand("tnt tb"); break; - case ONLY_BUILD: - p.performCommand("tnt build"); - break; case ALLOW: p.performCommand("tnt on"); break; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptGUI.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptGUI.java index add7ad81..fd6fd3f2 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptGUI.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/ScriptGUI.java @@ -22,7 +22,6 @@ package de.steamwar.bausystem.features.script; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.features.script.lua.SteamWarPlatform; -import de.steamwar.bausystem.utils.ItemUtils; import de.steamwar.inventory.SWAnvilInv; import de.steamwar.inventory.SWItem; import de.steamwar.inventory.SWListInv; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java index da5f1f21..7cf88d1e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/CommandListener.java @@ -28,7 +28,6 @@ import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.luaj.vm2.LuaValue; import java.util.HashMap; import java.util.HashSet; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/EventListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/EventListener.java index 4c5feada..54ddac4e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/EventListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/event/EventListener.java @@ -153,7 +153,7 @@ public class EventListener implements Listener { for (Player player : Bukkit.getOnlinePlayers()) { if(!Permission.BUILD.hasPermission(player)) continue; - if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) { + if (tntRegion.getArea().inRegion(player.getLocation(), false)) { ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTSpawn, LuaValue.NIL, event); } } @@ -171,11 +171,11 @@ public class EventListener implements Listener { table.set("y", event.getLocation().getY()); table.set("z", event.getLocation().getZ()); - boolean inBuild = event.blockList().stream().anyMatch(block -> tntRegion.inRegion(block.getLocation(), RegionType.BUILD, RegionExtensionType.EXTENSION)); + boolean inBuild = event.blockList().stream().anyMatch(block -> tntRegion.getBuildArea().inRegion(block.getLocation(), true)); for (Player player : Bukkit.getOnlinePlayers()) { if(!Permission.BUILD.hasPermission(player)) continue; - if (tntRegion.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) { + if (tntRegion.getArea().inRegion(player.getLocation(), false)) { ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTExplode, table, event); if (inBuild) { ScriptRunner.callEvent(player, SteamWarGlobalLuaPlugin.EventType.TNTExplodeInBuild, table, event); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java index c3370904..a17943a9 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/SteamWarLuaPlugin.java @@ -22,19 +22,14 @@ package de.steamwar.bausystem.features.script.lua; import com.sk89q.worldedit.EditSession; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.bukkit.BukkitAdapter; -import com.sk89q.worldedit.bukkit.BukkitPlayer; -import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.event.platform.CommandEvent; import com.sk89q.worldedit.extension.platform.Actor; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.configplayer.Config; import de.steamwar.bausystem.features.script.ScriptRunner; import de.steamwar.bausystem.features.script.lua.libs.LuaLib; import de.steamwar.bausystem.features.world.WorldEditListener; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.inventory.SWAnvilInv; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.BaseComponent; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; @@ -47,8 +42,6 @@ import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; import org.luaj.vm2.lib.*; -import java.lang.reflect.Proxy; -import java.net.InetSocketAddress; import java.util.*; import java.util.logging.Level; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/RegionLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/RegionLib.java index f615dad3..474a5b1f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/RegionLib.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/RegionLib.java @@ -20,19 +20,16 @@ package de.steamwar.bausystem.features.script.lua.libs; import de.steamwar.bausystem.features.loader.Loader; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FireMode; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; -import de.steamwar.bausystem.region.flags.flagvalues.ProtectMode; -import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; +import de.steamwar.bausystem.region.RegionSystem; +import de.steamwar.bausystem.region.flags.*; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; import org.luaj.vm2.LuaTable; import org.luaj.vm2.LuaValue; import org.luaj.vm2.lib.OneArgFunction; +import java.util.UUID; import java.util.function.Supplier; @Linked @@ -46,27 +43,25 @@ public class RegionLib implements LuaLib { private LuaTable create(Supplier region, Player player) { LuaTable table = LuaValue.tableOf(); - table.set("name", getter(() -> region.get().getName())); + table.set("name", getter(() -> region.get().getID().toString())); + table.set("id", getter(() -> region.get().getID().toString())); table.set("type", getter(() -> { Region region1 = region.get(); - if (region1 instanceof GlobalRegion) { + if (region1.getType().isGlobal()) { return "global"; - } else { - return region1.getPrototype().getName(); } + return region1.getType().name().toLowerCase(); })); LuaValue tntLib = LuaValue.tableOf(); - tntLib.set("mode", getter(() -> region.get().getPlain(Flag.TNT, TNTMode.class).name())); - tntLib.set("enabled", getter(() -> region.get().getPlain(Flag.TNT, TNTMode.class) != TNTMode.DENY)); - tntLib.set("onlyTb", getter(() -> region.get().getPlain(Flag.TNT, TNTMode.class) == TNTMode.ONLY_TB)); - tntLib.set("onlyBuild", getter(() -> region.get().getPlain(Flag.TNT, TNTMode.class) == TNTMode.ONLY_BUILD)); - + tntLib.set("mode", getter(() -> region.get().getFlags().get(Flag.TNT).nameWithDefault())); + tntLib.set("enabled", getter(() -> region.get().getFlags().get(Flag.TNT).orElse(null) != TNTMode.DENY)); + tntLib.set("onlyTb", getter(() -> region.get().getFlags().get(Flag.TNT).orElse(null) == TNTMode.ONLY_TB)); table.set("tnt", tntLib); - table.set("fire", getter(() -> region.get().getPlain(Flag.FIRE, FireMode.class) == FireMode.ALLOW)); - table.set("freeze", getter(() -> region.get().getPlain(Flag.FREEZE, FreezeMode.class) == FreezeMode.ACTIVE)); - table.set("protect", getter(() -> region.get().getPlain(Flag.PROTECT, ProtectMode.class) == ProtectMode.ACTIVE)); + table.set("fire", getter(() -> region.get().getFlags().get(Flag.FIRE).orElse(null) == FireMode.ALLOW)); + table.set("freeze", getter(() -> region.get().getFlags().get(Flag.FREEZE).orElse(null) == FreezeMode.ACTIVE)); + table.set("protect", getter(() -> region.get().getFlags().get(Flag.PROTECT).orElse(null) == ProtectMode.ACTIVE)); //LuaValue traceLib = LuaValue.tableOf(); //traceLib.set("active", getter(() -> !region.get().isGlobal() && Recorder.INSTANCE.get(region.get()) instanceof ActiveTracer)); @@ -79,16 +74,16 @@ public class RegionLib implements LuaLib { Loader loader = Loader.getLoader(player); table.set("loader", getter(() -> loader == null ? "OFF" : loader.getStage().name())); - table.set("copyPoint", getter(() -> toPos(region.get().getCopyPoint()))); - table.set("minPointBuild", getter(() -> toPos(region.get().getMinPointBuild()))); - table.set("maxPointBuild", getter(() -> toPos(region.get().getMaxPointBuild()))); - table.set("minPointBuildExtension", getter(() -> toPos(region.get().getMinPointBuildExtension()))); - table.set("maxPointBuildExtension", getter(() -> toPos(region.get().getMaxPointBuildExtension()))); - table.set("testblockPoint", getter(() -> toPos(region.get().getTestBlockPoint()))); - table.set("minPointTestblock", getter(() -> toPos(region.get().getMinPointTestblock()))); - table.set("maxPointTestblock", getter(() -> toPos(region.get().getMaxPointTestblock()))); - table.set("minPointTestblockExtension", getter(() -> toPos(region.get().getMinPointTestblockExtension()))); - table.set("maxPointTestblockExtension", getter(() -> toPos(region.get().getMaxPointTestblockExtension()))); + table.set("copyPoint", getter(() -> toPos(region.get().getBuildArea().getCopyPoint()))); + table.set("minPointBuild", getter(() -> toPos(region.get().getBuildArea().getMinPoint(false)))); + table.set("maxPointBuild", getter(() -> toPos(region.get().getBuildArea().getMinPoint(false)))); + table.set("minPointBuildExtension", getter(() -> toPos(region.get().getBuildArea().getMinPoint(true)))); + table.set("maxPointBuildExtension", getter(() -> toPos(region.get().getBuildArea().getMinPoint(true)))); + table.set("testblockPoint", getter(() -> toPos(region.get().getTestblockArea().getCopyPoint()))); + table.set("minPointTestblock", getter(() -> toPos(region.get().getTestblockArea().getMinPoint(false)))); + table.set("maxPointTestblock", getter(() -> toPos(region.get().getTestblockArea().getMinPoint(false)))); + table.set("minPointTestblockExtension", getter(() -> toPos(region.get().getTestblockArea().getMinPoint(true)))); + table.set("maxPointTestblockExtension", getter(() -> toPos(region.get().getTestblockArea().getMinPoint(true)))); return table; } @@ -99,11 +94,11 @@ public class RegionLib implements LuaLib { table.set("get", new OneArgFunction() { @Override public LuaValue call(LuaValue arg) { - return create(() -> Region.getREGION_MAP().get(arg.checkjstring()), player); + return create(() -> RegionSystem.INSTANCE.getRegion(UUID.fromString(arg.checkjstring())).orElse(RegionSystem.INSTANCE.getGlobalRegion()), player); } }); - table.set("list", getter(() -> LuaValue.listOf(Region.getREGION_MAP().values().stream().map(region -> create(() -> region, player)).toArray(LuaTable[]::new)))); + table.set("list", getter(() -> LuaValue.listOf(RegionSystem.INSTANCE.getRegions().map(region -> create(() -> region, player)).toArray(LuaTable[]::new)))); return table; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java index af9c67ae..ff09ac9a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ScoreboardLib.java @@ -24,9 +24,7 @@ import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; import org.luaj.vm2.LuaTable; -import org.luaj.vm2.LuaValue; import org.luaj.vm2.Varargs; -import org.luaj.vm2.lib.TwoArgFunction; import org.luaj.vm2.lib.VarArgFunction; @Linked diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ServerLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ServerLib.java index 10a41830..039b849f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ServerLib.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/ServerLib.java @@ -21,7 +21,6 @@ package de.steamwar.bausystem.features.script.lua.libs; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.features.loader.Loader; import de.steamwar.bausystem.features.loader.LoaderRecorder; import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.inventory.SWItem; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/StorageLib.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/StorageLib.java index 898b68a7..37454427 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/StorageLib.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/script/lua/libs/StorageLib.java @@ -21,6 +21,7 @@ package de.steamwar.bausystem.features.script.lua.libs; import com.google.gson.*; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.core.Core; import de.steamwar.linkage.Linked; import de.steamwar.linkage.api.Disable; @@ -74,7 +75,7 @@ public class StorageLib implements LuaLib, Enable, Disable { jsonObject.keySet().forEach(key -> { map.put(key, fromJson(jsonObject.get(key))); }); - Region region = Region.getREGION_MAP().get(regionStorage.getName().substring(0, regionStorage.getName().length() - ".json".length())); + Region region = RegionSystem.INSTANCE.getRegion(UUID.fromString(regionStorage.getName().substring(0, regionStorage.getName().length() - ".json".length()))).orElse(null); REGION_STORAGE.put(region, map); } catch (Exception e) {} } @@ -143,7 +144,7 @@ public class StorageLib implements LuaLib, Enable, Disable { regionStorageDirectory.mkdirs(); for (Map.Entry> entry : REGION_STORAGE.entrySet()) { try { - FileWriter fileWriter = new FileWriter(new File(regionStorageDirectory, entry.getKey().getName() + ".json")); + FileWriter fileWriter = new FileWriter(new File(regionStorageDirectory, entry.getKey().getID().toString() + ".json")); gson.toJson(toJson(entry.getValue()), fileWriter); fileWriter.close(); } catch (IOException e) {} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/ShieldPrintingCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/ShieldPrintingCommand.java index 5bb60219..b09259fb 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/ShieldPrintingCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/ShieldPrintingCommand.java @@ -54,7 +54,7 @@ public class ShieldPrintingCommand extends SWCommand implements Listener { @Register public void genericCommand(@Validator Player player, ShieldPrintingState shieldPrintingState) { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("SHIELD_PRINTING_NO_REGION", player); return; } @@ -90,7 +90,7 @@ public class ShieldPrintingCommand extends SWCommand implements Listener { @Register("stop") public void stopCommand(@Validator Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("SHIELD_PRINTING_NO_REGION", player); return; } @@ -111,7 +111,7 @@ public class ShieldPrintingCommand extends SWCommand implements Listener { return false; } Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { messageSender.send("SHIELD_PRINTING_NO_REGION", player); return false; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/impl/PistonConfiguration.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/impl/PistonConfiguration.java index dab77b8e..c3efb459 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/impl/PistonConfiguration.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/shieldprinting/impl/PistonConfiguration.java @@ -23,7 +23,6 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.shieldprinting.BlockDataConfiguration; import de.steamwar.inventory.SWItem; import org.bukkit.Material; -import org.bukkit.block.data.BlockData; import org.bukkit.block.data.type.Piston; import org.bukkit.entity.Player; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java index 119143db..88aaaa96 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorElement.java @@ -33,7 +33,6 @@ import yapion.hierarchy.types.YAPIONObject; import java.util.ArrayList; import java.util.Comparator; import java.util.List; -import java.util.Map; import java.util.function.BiConsumer; @Getter diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java index b226d124..f69977a6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/SimulatorPhase.java @@ -25,8 +25,6 @@ import lombok.Setter; import org.bukkit.util.Vector; import yapion.hierarchy.types.YAPIONObject; -import java.util.List; -import java.util.Map; import java.util.function.BiConsumer; @Getter diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java index 29f59d93..0ac9d0e9 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/data/tnt/TNTPhase.java @@ -23,7 +23,6 @@ import de.steamwar.bausystem.features.simulator.data.SimulatorPhase; import de.steamwar.bausystem.features.simulator.execute.SimulatorAction; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.FreezeMode; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter; @@ -65,7 +64,7 @@ public final class TNTPhase extends SimulatorPhase { @Override public void accept(World world) { Location location = position.toLocation(world); - if (Region.getRegion(location).get(Flag.FREEZE) == FreezeMode.ACTIVE) return; + if (Region.getRegion(location).getFlags().get(Flag.FREEZE).isPresent()) return; TNTPrimed tnt = world.spawn(location, TNTPrimed.class); if (!xJump) tnt.setVelocity(tnt.getVelocity().setX(0)); if (!yJump) tnt.setVelocity(tnt.getVelocity().setY(0)); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabDirection.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabDirection.java index 4be5284b..9adeaaaf 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabDirection.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabDirection.java @@ -45,7 +45,7 @@ public class StabDirection extends StabStep { @Override protected void start() { try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) { - e.setBlocks((com.sk89q.worldedit.regions.Region) new CuboidRegion(data.region.getMinPointTestblockExtension().toBlockVector3(), data.region.getMaxPointTestblockExtension().toBlockVector3()), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock()); + e.setBlocks((com.sk89q.worldedit.regions.Region) new CuboidRegion(data.region.getTestblockArea().getMinPoint(true).toBlockVector3(), data.region.getTestblockArea().getMaxPoint(true).toBlockVector3()), Objects.requireNonNull(BlockTypes.AIR).getDefaultState().toBaseBlock()); } Trace trace = TraceRecorder.instance.startRecording(data.region); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabFinalizer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabFinalizer.java index 5c0d77aa..daa8876a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabFinalizer.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabFinalizer.java @@ -19,12 +19,8 @@ package de.steamwar.bausystem.features.simulator.execute; -import de.steamwar.bausystem.features.tracer.Trace; import de.steamwar.bausystem.features.tracer.TraceRecorder; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; @@ -38,9 +34,11 @@ public class StabFinalizer extends StabStep { protected void start() { try { PasteBuilder.ClipboardProvider clipboardProvider = new PasteBuilder.ClipboardProviderImpl(data.clipboard); - PasteBuilder pasteBuilder = new PasteBuilder(clipboardProvider) - .color(data.region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - data.region.reset(pasteBuilder, RegionType.TESTBLOCK, RegionExtensionType.EXTENSION); + PasteBuilder pasteBuilder = new PasteBuilder(clipboardProvider); + if (data.region.getFlags().has(Flag.COLOR).isReadable()) { + pasteBuilder.color(data.region.getFlags().get(Flag.COLOR).getWithDefault()); + } + data.region.getTestblockArea().reset(pasteBuilder, true); } catch (SecurityException e) { stop(); throw e; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabGenerator.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabGenerator.java index 4a15ebcb..3a598c1e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabGenerator.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabGenerator.java @@ -22,9 +22,6 @@ package de.steamwar.bausystem.features.simulator.execute; import de.steamwar.bausystem.features.simulator.data.tnt.TNTPhase; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.ColorMode; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.PasteBuilder; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import org.bukkit.Bukkit; @@ -56,7 +53,8 @@ public class StabGenerator extends StabStep implements Listener { public void onEntityExplode(EntityExplodeEvent event) { if (Region.getRegion(event.getEntity().getLocation()) == data.region) { event.blockList().forEach(block -> { - if (!data.region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) return; + if (!data.region.getTestblockArea().inRegion(block.getLocation(), true)) + return; int component = data.direction.component.apply(block.getLocation().toVector()); destroyedBlocksPerSlice.computeIfAbsent(component, __ -> new HashSet<>()) .add(block.getLocation()); @@ -72,9 +70,11 @@ public class StabGenerator extends StabStep implements Listener { protected void start() { try { PasteBuilder.ClipboardProvider clipboardProvider = new PasteBuilder.ClipboardProviderImpl(data.clipboard); - PasteBuilder pasteBuilder = new PasteBuilder(clipboardProvider) - .color(data.region.getPlain(Flag.COLOR, ColorMode.class).getColor()); - data.region.reset(pasteBuilder, RegionType.TESTBLOCK, RegionExtensionType.EXTENSION); + PasteBuilder pasteBuilder = new PasteBuilder(clipboardProvider); + if (data.region.getFlags().has(Flag.COLOR).isReadable()) { + pasteBuilder.color(data.region.getFlags().get(Flag.COLOR).getWithDefault()); + } + data.region.getTestblockArea().reset(pasteBuilder, true); } catch (SecurityException e) { stop(); throw e; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabSetup.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabSetup.java index 9662a638..78f89d8a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabSetup.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/simulator/execute/StabSetup.java @@ -72,7 +72,7 @@ public class StabSetup extends StabStep { if (TraceRecorder.instance.isAutoTraceEnabledInRegion(data.region)) { TraceRecorder.instance.removeAutoTraceRegion(data.region); } - data.clipboard = FlatteningWrapper.impl.copy(data.region.getMinPointTestblockExtension(), data.region.getMaxPointTestblockExtension(), data.region.getTestBlockPoint()); + data.clipboard = FlatteningWrapper.impl.copy(data.region.getTestblockArea().getMinPoint(true), data.region.getTestblockArea().getMaxPoint(true), data.region.getTestblockArea().getCopyPoint()); new StabDirection(data); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java index daff9d87..34beeee7 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java @@ -20,12 +20,10 @@ package de.steamwar.bausystem.features.slaves.laufbau; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/panzern/PanzernCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/panzern/PanzernCommand.java index cca7a266..6c983358 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/panzern/PanzernCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/panzern/PanzernCommand.java @@ -20,14 +20,12 @@ package de.steamwar.bausystem.features.slaves.panzern; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; import org.bukkit.Location; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java.txt similarity index 94% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java rename to BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java.txt index 8394691e..b97127b1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/SkinCommand.java.txt @@ -19,11 +19,10 @@ package de.steamwar.bausystem.features.team; +import com.sk89q.worldedit.EditSession; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.team.boundary.BoundaryViewer; -import de.steamwar.bausystem.region.Prototype; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.command.PreviousArguments; import de.steamwar.command.SWCommand; import de.steamwar.command.TypeMapper; @@ -69,14 +68,14 @@ public class SkinCommand extends SWCommand { return; } Region region = Region.getRegion(p.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("SKIN_NO_REGION", p); return; } String name = String.join(" ", names); File arenaFile = new File("sections19/" + name + "/" + typeKuerzel + "Arena.schem"); - File testblockFile = region.hasType(RegionType.TESTBLOCK) ? new File("sections19/" + name + "/" + typeKuerzel + "Testblock.schem") : null; + File testblockFile = !region.getTestblockArea().isEmpty() ? new File("sections19/" + name + "/" + typeKuerzel + "Testblock.schem") : null; arenaFile.getParentFile().mkdirs(); if (testblockFile != null) { @@ -91,9 +90,11 @@ public class SkinCommand extends SWCommand { return; } - Region.copy(region.getMinPoint(), region.getMaxPoint(), arenaFile); + EditSession editSession = region.getArea().copy(false); + // TODO: Save editSession to file if (testblockFile != null) { - Region.copy(region.getMinPointTestblock(), region.getMaxPointTestblock(), testblockFile); + editSession = region.getTestblockArea().copy(false); + // TODO: Save editSession to file } YAPIONObject yapionObject = new YAPIONObject(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/boundary/BoundaryViewer.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/boundary/BoundaryViewer.java index 51bef65c..3994eee8 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/boundary/BoundaryViewer.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/team/boundary/BoundaryViewer.java @@ -22,9 +22,7 @@ package de.steamwar.bausystem.features.team.boundary; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.core.TrickyParticleWrapper; -import de.steamwar.core.TrickyTrialsWrapper; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; import org.bukkit.Particle; @@ -48,22 +46,19 @@ public class BoundaryViewer implements Listener { } viewers.forEach(player -> { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) return; + if (region.getType().isGlobal()) return; showRegion(region, player); - if (region.getLinkedRegion() != null) { - showRegion(region.getLinkedRegion(), player); - } }); }, 20, 20); } private void showRegion(Region region, Player player) { - drawCuboid(player, TrickyParticleWrapper.impl.getVillagerHappy(), region.getMinPoint(), region.getMaxPoint()); - if (region.hasType(RegionType.TESTBLOCK)) { - drawCuboid(player, Particle.END_ROD, region.getMinPointTestblockExtension(), region.getMaxPointTestblockExtension()); + drawCuboid(player, TrickyParticleWrapper.impl.getVillagerHappy(), region.getArea().getMinPoint(false), region.getArea().getMaxPoint(false)); + if (!region.getTestblockArea().isEmpty()) { + drawCuboid(player, Particle.END_ROD, region.getTestblockArea().getMinPoint(true), region.getTestblockArea().getMaxPoint(true)); } - if (region.hasType(RegionType.BUILD)) { - drawCuboid(player, Particle.END_ROD, region.getMinPointBuildExtension(), region.getMaxPointBuildExtension()); + if (!region.getBuildArea().isEmpty()) { + drawCuboid(player, Particle.END_ROD, region.getBuildArea().getMinPoint(true), region.getBuildArea().getMaxPoint(true)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java index 38725cf0..5f205e79 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/techhider/TechHiderCommand.java @@ -63,32 +63,22 @@ public class TechHiderCommand extends SWCommand implements Listener, ScoreboardE @Register(description = "TECHHIDER_HELP") public void toggleHider(@Validator Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("TECHHIDER_GLOBAL", player); return; } Optional techHider = techHiders.computeIfAbsent(region, rg -> { - File file = rg.gameModeConfig(); - if (file == null) { - return Optional.empty(); - } - - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - if (!config.getBoolean("Techhider.Active", false)) { + if (!region.getGameModeConfig().getTechhider().isActive()) { return Optional.empty(); } hidden.put(rg, new HashSet<>()); - String obfuscateWith = config.getString("Techhider.ObfuscateWith", "end_stone"); - Set hiddenBlocks = Collections.unmodifiableSet(new HashSet<>(config.getStringList("Techhider.HiddenBlocks"))); - Set hiddenBlockEntities = Collections.unmodifiableSet(new HashSet<>(config.getStringList("Techhider.HiddenBlockEntities"))); - - TechHider current = new TechHider((TechHider.LocationEvaluator) (p, cX, cY) -> { - if (rg.buildChunkOutside(cX, cY)) return true; + TechHider current = new TechHider((p, cX, cY) -> { + if (rg.getBuildArea().isChunkOutside(cX, cY)) return true; return !hidden.get(rg).contains(p); - }, Material.valueOf(obfuscateWith.toUpperCase()), hiddenBlocks.stream().map(String::toUpperCase).map(Material::valueOf).collect(Collectors.toSet()), hiddenBlockEntities); + }, region.getGameModeConfig().getTechhider().getObfuscateWith(), region.getGameModeConfig().getTechhider().getHiddenBlocks(), region.getGameModeConfig().getTechhider().getHiddenBlockEntities()); current.enable(); return Optional.of(current); @@ -105,7 +95,7 @@ public class TechHiderCommand extends SWCommand implements Listener, ScoreboardE hidden.get(region).add(player); BauSystem.MESSAGE.sendPrefixless("TECHHIDER_ON", player, ChatMessageType.ACTION_BAR); } - region.forEachChunk((x, z) -> { + region.getBuildArea().forEachChunk((x, z) -> { CraftbukkitWrapper.impl.sendChunk(player, x, z); }); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCount.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCount.java index 84853b8c..e0e79f77 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCount.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCount.java @@ -24,7 +24,6 @@ import de.steamwar.bausystem.features.tpslimit.TPSUtils; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; import lombok.ToString; -import org.bukkit.Bukkit; import org.bukkit.block.Block; import org.bukkit.scheduler.BukkitTask; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCounterListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCounterListener.java index 979e5fe3..a891b76f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCounterListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/blockcounter/BlockCounterListener.java @@ -20,8 +20,6 @@ package de.steamwar.bausystem.features.testblock.blockcounter; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.linkage.Linked; import org.bukkit.block.Block; import org.bukkit.event.EventHandler; @@ -37,11 +35,13 @@ public class BlockCounterListener implements Listener { @EventHandler public void onEntityExplode(EntityExplodeEvent event) { Region region = Region.getRegion(event.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { return; } List blockList = event.blockList(); - blockList = blockList.stream().filter(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)).collect(Collectors.toList()); + blockList = blockList.stream() + .filter(block -> region.getTestblockArea().inRegion(block.getLocation(), true)) + .collect(Collectors.toList()); if (blockList.isEmpty()) { return; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java index f84ab72e..bb03ae0a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tpslimit/TPSSystem.java @@ -23,7 +23,6 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.bausystem.utils.TickEndEvent; @@ -85,14 +84,14 @@ public class TPSSystem implements Listener { private void bossbar() { if ((TickManager.impl.isStepping() || TickManager.impl.isSprinting()) && TickManager.impl.getRemainingTicks() > 0) { Bukkit.getOnlinePlayers().forEach(player -> { - BauSystemBossbar bossbar = BossBarService.instance.get(player, GlobalRegion.getInstance(), "TickStep"); + BauSystemBossbar bossbar = BossBarService.instance.get(player, Region.getGlobalRegion(), "TickStep"); bossbar.setColor(BarColor.YELLOW); bossbar.setTitle(BauSystem.MESSAGE.parse("TICK_BOSSBAR", player, TickManager.impl.getDoneTicks(), TickManager.impl.getTotalTicks())); bossbar.setProgress(TickManager.impl.getDoneTicks() / (double) TickManager.impl.getTotalTicks()); }); } else { Bukkit.getOnlinePlayers().forEach(player -> { - BossBarService.instance.remove(player, GlobalRegion.getInstance(), "TickStep"); + BossBarService.instance.remove(player, Region.getGlobalRegion(), "TickStep"); }); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java index a33c52f0..73315d9a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TNTPoint.java @@ -20,8 +20,6 @@ package de.steamwar.bausystem.features.tracer; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.core.Core; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -39,7 +37,7 @@ import java.util.Optional; */ @AllArgsConstructor(access = AccessLevel.PACKAGE) @Getter -public class TNTPoint{ +public class TNTPoint { /** * Unique number to identify records being of the same tnt */ @@ -99,7 +97,7 @@ public class TNTPoint{ * Constructor for object creation in trace recording */ protected TNTPoint(int tntId, TNTPrimed tnt, boolean explosion, boolean afterFirstExplosion, long ticksSinceStart, - List history, List destroyedBlocks) { + List history, List destroyedBlocks) { this.tntId = tntId; this.explosion = explosion; if (Core.getVersion() > 15) { @@ -117,12 +115,10 @@ public class TNTPoint{ boolean buildDestroy = false; boolean testblockDestroy = false; for (Block destroyedBlock : destroyedBlocks) { - if (Region.getRegion(destroyedBlock.getLocation()).inRegion(destroyedBlock.getLocation(), RegionType.BUILD, - RegionExtensionType.EXTENSION)) { + if (Region.getRegion(destroyedBlock.getLocation()).getBuildArea().inRegion(destroyedBlock.getLocation(), true)) { buildDestroy = true; } - if (Region.getRegion(destroyedBlock.getLocation()).inRegion(destroyedBlock.getLocation(), - RegionType.TESTBLOCK, RegionExtensionType.EXTENSION)) { + if (Region.getRegion(destroyedBlock.getLocation()).getTestblockArea().inRegion(destroyedBlock.getLocation(), true)) { testblockDestroy = true; } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java index 060db33b..a61ed1f6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceManager.java @@ -25,12 +25,10 @@ import de.steamwar.bausystem.features.tracer.rendering.dynamicflags.AtFlag; import de.steamwar.bausystem.features.tracer.rendering.dynamicflags.IsolateFlag; import de.steamwar.bausystem.region.Region; import de.steamwar.linkage.Linked; -import org.bukkit.Bukkit; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.event.server.PluginEnableEvent; import java.io.File; import java.util.*; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java index 899ea5f1..209dee9a 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/tracer/TraceRepository.java @@ -1,6 +1,7 @@ package de.steamwar.bausystem.features.tracer; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionSystem; import lombok.Cleanup; import lombok.SneakyThrows; import org.bukkit.Bukkit; @@ -17,7 +18,7 @@ public class TraceRepository { /** * Increment this when changing serialisation format */ - public static final int SERIALISATION_VERSION = 2; + public static final int SERIALISATION_VERSION = 3; public static final int WRITE_TICK_DATA = 0b00000001; public static final int EXPLOSION = 0b00000010; public static final int IN_WATER = 0b00000100; @@ -31,7 +32,8 @@ public class TraceRepository { @Cleanup ObjectInputStream reader = new ObjectInputStream(new GZIPInputStream(new FileInputStream(recordsFile))); UUID uuid = UUID.fromString(reader.readUTF()); - Region region = Region.getREGION_MAP().get(reader.readUTF()); + Region region = RegionSystem.INSTANCE.getRegion(UUID.fromString(reader.readUTF())).orElse(null); + if (region == null) return null; Date date = (Date) reader.readObject(); int serialisationVersion = reader.readInt(); if (serialisationVersion != SERIALISATION_VERSION) { @@ -46,7 +48,7 @@ public class TraceRepository { protected static void writeTrace(Trace trace, List records) { ObjectOutputStream outputStream = new ObjectOutputStream(new GZIPOutputStream(new FileOutputStream(trace.getRecordsSaveFile()))); outputStream.writeUTF(trace.getUuid().toString()); - outputStream.writeUTF(trace.getRegion().getName()); + outputStream.writeUTF(trace.getRegion().getID().toString()); outputStream.writeObject(trace.getDate()); outputStream.writeInt(SERIALISATION_VERSION); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java index 9a93977e..c71c8400 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/BindCommand.java @@ -8,7 +8,6 @@ import com.sk89q.worldedit.extension.platform.Actor; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.features.script.ScriptCommand; import de.steamwar.bausystem.features.script.ScriptRunner; import de.steamwar.bausystem.features.world.WorldEditListener; import de.steamwar.bausystem.utils.WorldEditUtils; @@ -28,10 +27,12 @@ import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; -import org.luaj.vm2.LuaValue; import java.lang.reflect.Field; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Objects; import java.util.logging.Level; import java.util.stream.Collectors; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/ClearCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/ClearCommand.java index 1df08e5d..f1e64ce5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/ClearCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/ClearCommand.java @@ -20,9 +20,7 @@ package de.steamwar.bausystem.features.util; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.Material; import org.bukkit.entity.Player; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/KillAllCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/KillAllCommand.java index e08b40c0..d82448a0 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/KillAllCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/KillAllCommand.java @@ -21,12 +21,8 @@ package de.steamwar.bausystem.features.util; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.SWUtils; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.RegionUtils; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionSelectionType; -import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.command.SWCommand; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; @@ -53,7 +49,7 @@ public class KillAllCommand extends SWCommand { public void genericCommand(@Validator Player player, RegionSelectionType regionSelectionType) { Region region = Region.getRegion(player.getLocation()); AtomicLong count = new AtomicLong(0); - if (regionSelectionType == RegionSelectionType.GLOBAL || GlobalRegion.getInstance() == region) { + if (regionSelectionType == RegionSelectionType.GLOBAL || region.getType().isGlobal()) { WORLD.getEntities() .stream() .filter(e -> !(e instanceof Player)) @@ -66,7 +62,7 @@ public class KillAllCommand extends SWCommand { WORLD.getEntities() .stream() .filter(e -> !(e instanceof Player)) - .filter(e -> region.inRegion(e.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) + .filter(e -> region.getArea().inRegion(e.getLocation(), false)) .forEach(entity -> { entity.remove(); count.incrementAndGet(); @@ -74,5 +70,4 @@ public class KillAllCommand extends SWCommand { RegionUtils.actionBar(region, "OTHER_KILLALL_REGION", count.get()); } } - } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/RegionSelectionType.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/RegionSelectionType.java new file mode 100644 index 00000000..4103dd42 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/RegionSelectionType.java @@ -0,0 +1,7 @@ +package de.steamwar.bausystem.features.util; + +public enum RegionSelectionType { + LOCAL, + GLOBAL, + ; +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/SelectCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/SelectCommand.java index e9c2c09a..73739e40 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/SelectCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/SelectCommand.java @@ -1,14 +1,12 @@ package de.steamwar.bausystem.features.util; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.region.Point; import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.region.utils.RegionExtensionType; import de.steamwar.bausystem.region.utils.RegionType; import de.steamwar.bausystem.utils.FlatteningWrapper; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import org.bukkit.entity.Player; @@ -23,19 +21,15 @@ public class SelectCommand extends SWCommand { public void baurahmenCommand(@Validator Player p, RegionType regionType, @OptionalValue("NORMAL") RegionExtensionType regionExtensionType) { Region region = Region.getRegion(p.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("SELECT_GLOBAL_REGION", p); return; } - if (!region.hasType(regionType)) { + if (!regionType.getHasType().test(region)) { BauSystem.MESSAGE.send("SELECT_NO_TYPE", p, BauSystem.MESSAGE.parse(regionType.getChatValue(), p)); return; } - if (regionExtensionType == RegionExtensionType.EXTENSION && !region.hasExtensionType(regionType)) { - BauSystem.MESSAGE.send("SELECT_NO_EXTENSION", p); - return; - } setSelection(regionType, regionExtensionType, region, p); } @@ -46,8 +40,8 @@ public class SelectCommand extends SWCommand { } private void setSelection(RegionType regionType, RegionExtensionType regionExtensionType, Region region, Player p) { - Point minPoint = region.getMinPoint(regionType, regionExtensionType); - Point maxPoint = region.getMaxPoint(regionType, regionExtensionType); + Point minPoint = regionType.getToMinPoint().apply(region, regionExtensionType.isExtension()); + Point maxPoint = regionType.getToMaxPoint().apply(region, regionExtensionType.isExtension()); FlatteningWrapper.impl.setSelection(p, minPoint, maxPoint); BauSystem.MESSAGE.send("SELECT_MESSAGE", p, minPoint.getX(), minPoint.getY(), minPoint.getZ(), maxPoint.getX(), maxPoint.getY(), maxPoint.getZ()); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/TimeCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/TimeCommand.java index 249f4072..ea38d446 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/TimeCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/TimeCommand.java @@ -20,8 +20,9 @@ package de.steamwar.bausystem.features.util; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.command.*; +import de.steamwar.command.SWCommand; +import de.steamwar.command.SWCommandUtils; +import de.steamwar.command.TypeMapper; import de.steamwar.linkage.Linked; import org.bukkit.Bukkit; import org.bukkit.entity.Player; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java index a5f76346..a4dd4882 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/util/items/KillAllBauGuiItem.java @@ -23,7 +23,7 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.features.util.KillAllCommand; import de.steamwar.bausystem.linkage.specific.BauGuiItem; -import de.steamwar.bausystem.region.utils.RegionSelectionType; +import de.steamwar.bausystem.features.util.RegionSelectionType; import de.steamwar.inventory.SWItem; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java index a1392917..8b1b1ee7 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/Warp.java @@ -19,8 +19,8 @@ package de.steamwar.bausystem.features.warp; +import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.bausystem.worlddata.WorldData; -import de.steamwar.core.Core; import lombok.Getter; import org.bukkit.*; import org.bukkit.entity.Player; @@ -36,7 +36,7 @@ public class Warp { public static void enable() { Warp worldSpawn = new Warp("WorldSpawn"); - worldSpawn.setLocation(Bukkit.getWorlds().get(0).getSpawnLocation().clone().add(0.5, Core.getVersion() >= 20 ? 124 : 1, 0.5)); + worldSpawn.setLocation(RegionSystem.INSTANCE.getWorldSpawn()); worldSpawn.setMat(Material.NETHER_STAR); warpMap.put("WorldSpawn", worldSpawn); } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java index aad07fcb..4b35cef7 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpCommand.java @@ -20,13 +20,11 @@ package de.steamwar.bausystem.features.warp; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.utils.ListChatView; import de.steamwar.bausystem.worlddata.WorldData; import de.steamwar.command.SWCommand; import de.steamwar.command.SWCommandUtils; import de.steamwar.command.TypeMapper; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.linkage.api.Disable; import de.steamwar.linkage.api.Enable; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java index 8940b1ee..1d06c9e4 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/warp/WarpListener.java @@ -91,11 +91,11 @@ public class WarpListener implements Listener { locations.put(warp.getName(), warp.getLocation()); }); Region region = Region.getRegion(p.getLocation()); - if (region.getCopyPoint() != null) { - locations.put("Copy", region.getCopyPoint().toLocation(p).add(0.5, 0, 0.5)); + if (!region.getBuildArea().isEmpty()) { + locations.put("Copy", region.getBuildArea().getCopyPoint().toLocation(p).add(0.5, 0, 0.5)); } - if (region.getTestBlockPoint() != null) { - locations.put("TestBlock", region.getTestBlockPoint().toLocation(p).add(0.5, 0, 0.5)); + if (!region.getTestblockArea().isEmpty()) { + locations.put("TestBlock", region.getTestblockArea().getCopyPoint().toLocation(p).add(0.5, 0, 0.5)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java index d5aa97d5..7077cd56 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauMemberUpdate.java @@ -21,7 +21,7 @@ package de.steamwar.bausystem.features.world; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.region.GlobalRegion; +import de.steamwar.bausystem.region.RegionSystem; import de.steamwar.bausystem.utils.BauMemberUpdateEvent; import de.steamwar.bausystem.utils.bossbar.BauSystemBossbar; import de.steamwar.bausystem.utils.bossbar.BossBarService; @@ -75,7 +75,7 @@ public class BauMemberUpdate extends PacketHandler implements Listener { SPECTATORS.remove(player); newBuilder.add(player); player.removePotionEffect(PotionEffectType.GLOWING); - BossBarService.instance.remove(player, GlobalRegion.getInstance(), "spectator"); + BossBarService.instance.remove(player, RegionSystem.INSTANCE.getGlobalRegion(), "spectator"); } } }); @@ -94,7 +94,7 @@ public class BauMemberUpdate extends PacketHandler implements Listener { } private static void showSpectatorNotice(Player player) { - BauSystemBossbar bossbar = BossBarService.instance.get(player, GlobalRegion.getInstance(), "spectator"); + BauSystemBossbar bossbar = BossBarService.instance.get(player, RegionSystem.INSTANCE.getGlobalRegion(), "spectator"); bossbar.setTitle(BauSystem.MESSAGE.parse("SPECTATOR", player)); bossbar.setColor(BarColor.WHITE); bossbar.setStyle(BarStyle.SOLID); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java index 5bd1e06d..b53f48c8 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/BauScoreboard.java @@ -1,8 +1,7 @@ package de.steamwar.bausystem.features.world; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.bausystem.utils.ScoreboardElement; import de.steamwar.linkage.Linked; @@ -101,8 +100,11 @@ public class BauScoreboard implements Listener { @Override public String getTitle() { Region region = Region.getRegion(player.getLocation()); - if (GlobalRegion.getInstance() == region) return "§eSteam§8War"; - String colorCode = BauSystem.MESSAGE.parse(region.get(Flag.COLOR).getChatValue(), player).substring(0, 2); + if (region.getType().isGlobal()) return "§eSteam§8War"; + String colorCode = "§e"; + if (region.getFlags().has(Flag.COLOR).isReadable()) { + colorCode = "§" + region.getFlags().get(Flag.COLOR).orElse(ColorMode.PINK).getColorCode(); + } return colorCode + "■ §eSteam§8War " + colorCode + "■"; // ■ } }); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/KickallCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/KickallCommand.java index d4e5d3f7..44bdb818 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/KickallCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/KickallCommand.java @@ -22,7 +22,6 @@ package de.steamwar.bausystem.features.world; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.config.BauServer; import de.steamwar.command.SWCommand; -import de.steamwar.command.TypeValidator; import de.steamwar.linkage.Linked; import de.steamwar.linkage.LinkedInstance; import org.bukkit.Bukkit; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java index 1d989226..85351f06 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java @@ -32,7 +32,6 @@ import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.checkerframework.checker.units.qual.min; import java.io.*; import java.util.List; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/ColorReplaceCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/ColorReplaceCommand.java index 6b6659ba..f3efca4b 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/ColorReplaceCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/worldedit/ColorReplaceCommand.java @@ -28,7 +28,7 @@ import com.sk89q.worldedit.util.formatting.text.TextComponent; import com.sk89q.worldedit.util.formatting.text.TranslatableComponent; import de.steamwar.bausystem.features.world.WorldEditListener; import de.steamwar.bausystem.features.worldedit.utils.SpecialReplace; -import de.steamwar.bausystem.region.Color; +import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.command.PreviousArguments; @@ -63,7 +63,7 @@ public class ColorReplaceCommand extends SWCommand { @Register(description = "COLORREPLACE_HELP") @SneakyThrows - public void genericCommand(@Validator Player player, Pair from, Color to) { + public void genericCommand(@Validator Player player, Pair from, ColorMode to) { if (from.getValue() == to) { BukkitAdapter.adapt(player).printInfo(TranslatableComponent.of("worldedit.replace.replaced", new Component[]{TextComponent.of(0)})); return; @@ -89,23 +89,23 @@ public class ColorReplaceCommand extends SWCommand { } @ClassMapper(value = Pair.class, local = true) - public TypeMapper> typeMapper() { - return new TypeMapper>() { + public TypeMapper> typeMapper() { + return new TypeMapper>() { @Override - public Pair map(CommandSender commandSender, PreviousArguments previousArguments, String s) { + public Pair map(CommandSender commandSender, PreviousArguments previousArguments, String s) { if (s.contains("%")) { String[] split = s.split("%"); if (split.length != 2) { return null; } - Color color = Color.valueOf(split[1].toUpperCase()); + ColorMode color = ColorMode.valueOf(split[1].toUpperCase()); try { return new Pair<>(Integer.parseInt(split[0]), color); } catch (NumberFormatException e) { return null; } } - return new Pair<>(100, Color.valueOf(s.toUpperCase())); + return new Pair<>(100, ColorMode.valueOf(s.toUpperCase())); } @Override @@ -113,12 +113,12 @@ public class ColorReplaceCommand extends SWCommand { if (s.matches("[0-9].*")) { if (s.contains("%")) { String sub = s.substring(0, s.indexOf("%") + 1); - return Arrays.stream(Color.values()).map(Color::name).map(t -> sub + t.toLowerCase()).collect(Collectors.toSet()); + return Arrays.stream(ColorMode.values()).map(ColorMode::name).map(t -> sub + t.toLowerCase()).collect(Collectors.toSet()); } else { return Arrays.asList(s); } } else { - return Arrays.stream(Color.values()).map(Color::name).map(String::toLowerCase).collect(Collectors.toSet()); + return Arrays.stream(ColorMode.values()).map(ColorMode::name).map(String::toLowerCase).collect(Collectors.toSet()); } } }; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java index cad5b633..19f0a390 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/xray/XrayCommand.java @@ -19,8 +19,8 @@ package de.steamwar.bausystem.features.xray; -import de.steamwar.Reflection; import com.comphenix.tinyprotocol.TinyProtocol; +import de.steamwar.Reflection; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.techhider.TechHiderCommand; import de.steamwar.bausystem.region.Region; @@ -34,8 +34,6 @@ import de.steamwar.techhider.TechHider; import net.md_5.bungee.api.ChatMessageType; import org.bukkit.Bukkit; import org.bukkit.Material; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -43,7 +41,6 @@ import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerInteractEvent; import org.bukkit.event.player.PlayerQuitEvent; -import java.io.File; import java.util.*; import java.util.function.BiFunction; @@ -64,30 +61,20 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen @Register(description = "XRAY_HELP") public void toggleHider(@Validator Player player) { Region region = Region.getRegion(player.getLocation()); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { BauSystem.MESSAGE.send("XRAY_GLOBAL", player); return; } Optional techHider = techHiders.computeIfAbsent(region, rg -> { - File file = rg.gameModeConfig(); - if (file == null) { + if (!region.getGameModeConfig().getTechhider().isActive()) { return Optional.empty(); } - FileConfiguration config = YamlConfiguration.loadConfiguration(file); - if (!config.getBoolean("Techhider.Active", false)) { - Set blocks = new HashSet<>(Arrays.asList(Material.END_STONE, Material.IRON_BLOCK)); - xrayedBlocks.put(region, blocks); - return Optional.of(createXray(rg, blocks)); - } - hidden.put(rg, new HashSet<>()); - String obfuscateWith = config.getString("Techhider.ObfuscateWith", "end_stone"); - - Set blocks = new HashSet<>(Arrays.asList(Material.getMaterial(obfuscateWith.toUpperCase()))); - if (obfuscateWith.equals("end_stone")) blocks.add(Material.END_STONE_BRICKS); + Set blocks = new HashSet<>(Arrays.asList(region.getGameModeConfig().getTechhider().getObfuscateWith())); + if (blocks.contains(Material.END_STONE)) blocks.add(Material.END_STONE_BRICKS); xrayedBlocks.put(region, blocks); return Optional.of(createXray(rg, blocks)); }); @@ -103,7 +90,7 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen hidden.get(region).add(player); BauSystem.MESSAGE.sendPrefixless("XRAY_ON", player, ChatMessageType.ACTION_BAR); } - region.forEachChunk((x, z) -> { + region.getBuildArea().forEachChunk((x, z) -> { CraftbukkitWrapper.impl.sendChunk(player, x, z); }); } @@ -149,7 +136,7 @@ public class XrayCommand extends SWCommand implements Listener, ScoreboardElemen private TechHider createXray(Region rg, Set obfuscate) { TechHider current = new TechHider((TechHider.LocationEvaluator) (p, cX, cY) -> { - if (rg.buildChunkOutside(cX, cY)) return true; + if (rg.getBuildArea().isChunkOutside(cX, cY)) return true; return !hidden.get(rg).contains(p); }, Material.STRUCTURE_VOID, obfuscate, new HashSet<>()); current.enable(); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java index 44b57332..902d4a6c 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/BackupScheduler.java @@ -1,32 +1,14 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package de.steamwar.bausystem.region; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.tags.Tag; +import de.steamwar.bausystem.region.flags.ChangedMode; +import de.steamwar.bausystem.region.flags.Flag; import de.steamwar.linkage.Linked; import de.steamwar.linkage.api.Enable; import org.bukkit.scheduler.BukkitRunnable; import java.util.Iterator; - +import java.util.Optional; @Linked public class BackupScheduler implements Enable { @@ -39,26 +21,32 @@ public class BackupScheduler implements Enable { new BukkitRunnable() { @Override public void run() { - final Iterator regions = Region.getREGION_MAP().values().stream().filter(region -> region.get(Tag.CHANGED)).iterator(); - BackupScheduler.this.doBackup(regions); + Iterator regionsToBackup = RegionSystem.INSTANCE.getRegions() + .filter(region -> region.getFlags().has(Flag.CHANGED).isReadable()) + .filter(region -> region.getFlags().get(Flag.CHANGED).get() == ChangedMode.HAS_CHANGE) + .iterator(); + if (!regionsToBackup.hasNext()) return; + doBackup(regionsToBackup); } }.runTaskTimer(BauSystem.getInstance(), INITIAL, PERIOD); } - public void doBackup(final Iterator regionIterator) { + private void doBackup(Iterator regionsToBackup) { new BukkitRunnable() { @Override public void run() { - if (!regionIterator.hasNext()) { + if (!regionsToBackup.hasNext()) { this.cancel(); return; } - final Region region = regionIterator.next(); - if (region.backup()) { - region.remove(Tag.CHANGED); + Region region = regionsToBackup.next(); + Optional backup = region.getBackups() + .create(RegionBackups.BackupType.AUTOMATIC); + if (backup.isPresent()) { + region.getFlags().set(Flag.CHANGED, ChangedMode.NO_CHANGE); } } }.runTaskTimer(BauSystem.getInstance(), 0, 20 * 60); } -} \ No newline at end of file +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Color.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Color.java deleted file mode 100644 index a50c7cb0..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Color.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region; - -public enum Color { - WHITE, - ORANGE, - MAGENTA, - LIGHT_BLUE, - YELLOW, - LIME, - PINK, - GRAY, - LIGHT_GRAY, - CYAN, - PURPLE, - BLUE, - BROWN, - GREEN, - RED, - BLACK; -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagOptional.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagOptional.java new file mode 100644 index 00000000..e3e725fc --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagOptional.java @@ -0,0 +1,105 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import de.steamwar.bausystem.region.flags.Flag; +import lombok.AccessLevel; +import lombok.AllArgsConstructor; + +import java.util.NoSuchElementException; +import java.util.Optional; + +@AllArgsConstructor(access = AccessLevel.PRIVATE) +public class FlagOptional & Flag.Value> { + + private final Flag flag; + private final T value; + + public static & Flag.Value> FlagOptional of(Flag flag) { + return new FlagOptional<>(flag, null); + } + + public static & Flag.Value> FlagOptional of(Flag flag, T value) { + return new FlagOptional<>(flag, value); + } + + public boolean isPresent() { + return value != null; + } + + public boolean isEmpty() { + return value == null; + } + + public boolean is(T value) { + if (isEmpty()) return false; + return this.value.equals(value); + } + + public boolean isNot(T value) { + return !is(value); + } + + public boolean isWithDefault(T value) { + if (isEmpty()) { + return flag.getDefaultValue().equals(value); + } else { + return this.value.equals(value); + } + } + + public boolean isNotWithDefault(T value) { + return !isWithDefault(value); + } + + public T get() { + if (isEmpty()) { + throw new NoSuchElementException("No value present"); + } + return value; + } + + public T getWithDefault() { + if (isEmpty()) { + return flag.getDefaultValue(); + } else { + return value; + } + } + + public T orElse(T defaultValue) { + if (isEmpty()) { + return defaultValue; + } else { + return value; + } + } + + public Optional name() { + if (isEmpty()) { + return Optional.empty(); + } + return Optional.of(value.name()); + } + + public String nameWithDefault() { + return getWithDefault().name(); + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java index e0ee43a5..72e80301 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/FlagStorage.java @@ -1,107 +1,40 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2024 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * 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 Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.region; import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.tags.Tag; -import yapion.hierarchy.types.YAPIONObject; +import lombok.NonNull; -import java.util.EnumMap; -import java.util.HashSet; import java.util.Map; -import java.util.Set; -/** - * Tags and Flags are not allowed to have overlaping names. - */ -public class FlagStorage { +public interface FlagStorage { - public static FlagStorage createStorage(YAPIONObject yapionObject) { - FlagStorage flagStorage = new FlagStorage(); - for (final Flag flag : Flag.getFlags()) { - try { - String s = yapionObject.getPlainValue(flag.name()); - flagStorage.set(flag, flag.getFlagValueOf(s)); - } catch (Exception e) { - flagStorage.set(flag, flag.getDefaultValue()); - } - } - for (final Tag tag : Tag.values()) { - if (yapionObject.containsKey(tag.name())) { - flagStorage.set(tag); - } - } - return flagStorage; - } + @NonNull + & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag); - public static YAPIONObject toYAPION(FlagStorage flagStorage) { - YAPIONObject yapionObject = new YAPIONObject(); - for (final Flag flag : Flag.getFlags()) { - if (flag.getDefaultValue() == flagStorage.flags.getOrDefault(flag, flag.getDefaultValue())) { - yapionObject.remove(flag.name()); - } else { - yapionObject.add(flag.name(), flagStorage.get(flag).getValue().name()); - } - } - for (Tag tag : Tag.values()) { - if (flagStorage.tagSet.contains(tag)) { - yapionObject.add(tag.name(), ""); - } else { - yapionObject.remove(tag.name()); - } - } - return yapionObject; - } + & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value); - protected Map> flags; - protected Set tagSet; + @NonNull + & Flag.Value> FlagOptional get(@NonNull Flag flag); - public FlagStorage() { - flags = new EnumMap<>(Flag.class); - tagSet = new HashSet<>(); - readKeys(); - } + void clear(); - public boolean set(final Flag flagType, final Flag.Value value) { - return flags.put(flagType, value) != value; - } - - public Flag.Value get(final Flag flagType) { - return flags.getOrDefault(flagType, flagType.getDefaultValue()); - } - - public boolean set(final Tag tag) { - return tagSet.add(tag); - } - - public boolean remove(final Tag tag) { - return tagSet.remove(tag); - } - - public boolean is(final Tag tag) { - return tagSet.contains(tag); - } - - private void readKeys() { - for (final Flag flag : Flag.getFlags()) { - flags.put(flag, flag.getDefaultValue()); - } - } -} \ No newline at end of file + Map, Flag.Value> getBackedMap(); +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GameModeConfig.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GameModeConfig.java new file mode 100644 index 00000000..e0197661 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GameModeConfig.java @@ -0,0 +1,128 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import de.steamwar.core.FlatteningWrapper; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.bukkit.Material; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.FileConfiguration; +import org.bukkit.configuration.file.YamlConfiguration; + +import java.io.File; +import java.util.*; +import java.util.stream.Collectors; + +@Getter +public class GameModeConfig { + + private final boolean loaded; + + /** + * See gamemode config Times key + */ + private Times Times = new Times(); + private Schematic Schematic = new Schematic(); + private Arena Arena = new Arena(); + private Server Server = new Server(); + private Techhider Techhider = new Techhider(); + + public GameModeConfig(File file) { + if (file == null || !file.exists()) { + loaded = false; + return; + } + loaded = true; + + FileConfiguration config = YamlConfiguration.loadConfiguration(file); + + Times.load(config.getConfigurationSection("Times")); + Schematic.load(config.getConfigurationSection("Schematic")); + Arena.load(config.getConfigurationSection("Arena")); + Server.load(config.getConfigurationSection("Server")); + Techhider.load(config.getConfigurationSection("Techhider")); + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public static class Times { + private int PreFightDuration = 30; + + private void load(ConfigurationSection section) { + PreFightDuration = section.getInt("PreFightDuration", 30); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public static class Schematic { + private Map, Integer> Limited = new HashMap<>(); + + private void load(ConfigurationSection section) { + for(Map entry : section.getMapList("Limited")) { + int amount = (Integer) entry.get("Amount"); + Set materials = new HashSet<>((List) entry.get("Materials")); + if (amount == 0) { + materials.forEach(material -> Limited.put(Collections.singleton(Material.getMaterial(material)), 0)); + } else { + Limited.put(materials.stream().map(Material::getMaterial).collect(Collectors.toSet()), amount); + } + } + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public static class Arena { + private boolean NoFloor = false; + + private void load(ConfigurationSection section) { + NoFloor = section.getBoolean("NoFloor", false); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public static class Server { + private List ChatNames; + + private void load(ConfigurationSection section) { + ChatNames = section.getStringList("ChatNames"); + } + } + + @NoArgsConstructor(access = AccessLevel.PRIVATE) + @Getter + public static class Techhider { + private boolean Active = false; + private Material ObfuscateWith = Material.END_STONE; + private Set HiddenBlocks = new HashSet<>(); + private Set HiddenBlockEntities = new HashSet<>(); + + private void load(ConfigurationSection section) { + Active = section.getBoolean("Active", false); + ObfuscateWith = Material.getMaterial(section.getString("ObfuscateWith", "END_STONE")); + HiddenBlocks = section.getStringList("HiddenBlocks").stream().map(FlatteningWrapper.impl::getMaterial).filter(Objects::nonNull).collect(Collectors.toUnmodifiableSet()); + HiddenBlockEntities = Collections.unmodifiableSet(new HashSet<>(section.getStringList("HiddenBlockEntities"))); + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GlobalRegion.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GlobalRegion.java deleted file mode 100644 index 83623989..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/GlobalRegion.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region; - -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; -import lombok.Getter; -import org.bukkit.Location; -import yapion.hierarchy.types.YAPIONObject; - -public class GlobalRegion extends Region { - - @Getter - static GlobalRegion instance; - - public GlobalRegion(FlagStorage flagStorage, YAPIONObject regionData) { - super("global", null, new YAPIONObject(), flagStorage, regionData); - instance = this; - } - - @Override - public boolean inRegion(Location location, RegionType regionType, RegionExtensionType regionExtensionType) { - return true; - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Point.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Point.java index 6f8c5929..da8b68c5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Point.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Point.java @@ -1,20 +1,20 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2024 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * 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 Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.region; @@ -34,6 +34,8 @@ import org.bukkit.entity.Player; @AllArgsConstructor public class Point { + public static final Point ZERO = new Point(0, 0, 0); + private final int x; private final int y; private final int z; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java index c6f8b5c7..d00cb4e1 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Region.java @@ -1,584 +1,176 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2024 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * 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 Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.region; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.WorldEdit; -import com.sk89q.worldedit.bukkit.BukkitWorld; -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.flags.Flag; -import de.steamwar.bausystem.region.flags.flagvalues.TNTMode; -import de.steamwar.bausystem.region.tags.Tag; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; -import de.steamwar.bausystem.shared.SizedStack; +import com.sk89q.worldedit.extent.clipboard.Clipboard; import de.steamwar.bausystem.utils.FlatteningWrapper; import de.steamwar.bausystem.utils.PasteBuilder; -import de.steamwar.core.Core; -import de.steamwar.sql.SchematicType; -import lombok.AccessLevel; -import lombok.Getter; import lombok.NonNull; -import org.bukkit.Bukkit; import org.bukkit.Location; -import yapion.hierarchy.types.YAPIONObject; -import yapion.hierarchy.types.YAPIONType; -import yapion.hierarchy.types.YAPIONValue; +import javax.annotation.Nullable; import java.io.File; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.*; -import java.util.function.ObjIntConsumer; -import java.util.function.Predicate; -import java.util.stream.Collectors; +import java.util.UUID; +import java.util.function.BiConsumer; +import java.util.stream.Stream; -@Getter -public class Region { +public interface Region { - @Getter - private static final Map REGION_MAP = new HashMap<>(); - private static final File backupFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "backup"); - private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd' 'HH:mm:ss"); - - public static Region getRegion(Location location) { - return REGION_MAP.values().stream() - .filter(r -> r.inRegion(location, r.minPoint, r.maxPoint)) - .findFirst() - .orElse(GlobalRegion.instance); + static Stream getRegions() { + return RegionSystem.INSTANCE.getRegions(); } - public static Set getRegion(Prototype prototype) { - return REGION_MAP.values().stream() - .filter(r -> r.getPrototype() == prototype) - .collect(Collectors.toSet()); + static Region getRegion(Location location) { + return RegionSystem.INSTANCE.get(location); } - public static void setGlobal(Flag flagType, Flag.Value value) { - REGION_MAP.values().forEach(region -> region.set(flagType, value)); + static Region getGlobalRegion() { + return RegionSystem.INSTANCE.getGlobalRegion(); } - YAPIONObject regionData; + @NonNull + UUID getID(); - private String name; - private Prototype prototype; - private Set prototypes; - private String skin; + @NonNull + RegionType getType(); - private Point minPoint; - private Point maxPoint; + @NonNull + FlagStorage getFlags(); - private Point minPointTestblock; - private Point maxPointTestblock; + @NonNull + Area getArea(); - private Point minPointTestblockExtension; - private Point maxPointTestblockExtension; + @NonNull + Area getBuildArea(); - private Point minPointBuild; - private Point maxPointBuild; + @NonNull + Area getTestblockArea(); - private Point minPointBuildExtension; - private Point maxPointBuildExtension; + @NonNull + GameModeConfig getGameModeConfig(); - private int floorLevel; - private int waterLevel; + @NonNull + RegionHistory getHistory(); - private Point copyPoint; // Nullable - private Point testBlockPoint; // Nullable + @NonNull + RegionBackups getBackups(); - private String linkedRegionName = null; // Nullable - private Region linkedRegion = null; // Nullable + interface Area { - private FlagStorage flagStorage; - - @Getter(AccessLevel.PRIVATE) - private SizedStack undoSessions; - - @Getter(AccessLevel.PRIVATE) - private SizedStack redoSessions; - - public Region(String name, Prototype prototype, YAPIONObject regionConfig, FlagStorage flagStorage, YAPIONObject regionData) { - this.name = name; - this.regionData = regionData; - if (prototype != null) { - REGION_MAP.put(name, this); - } - - linkedRegionName = regionConfig.getPlainValueOrDefault("optionsLinkedWith", null); - - prototypes = new HashSet<>(); - if (regionConfig.containsKey("prototypes", YAPIONType.ARRAY)) { - regionConfig.getArray("prototypes").forEach(yapionAnyType -> { - if (yapionAnyType instanceof YAPIONValue) { - prototypes.add(((YAPIONValue) yapionAnyType).get()); - } - }); - } - if (regionConfig.containsKey("prototype")) { - prototypes.add(regionConfig.getPlainValue("prototype")); - } - - this.flagStorage = flagStorage; - Point point = null; - if (regionConfig.containsKey("minX", Integer.class) && regionConfig.containsKey("minY", Integer.class) && regionConfig.containsKey("minZ", Integer.class)) { - point = new Point(regionConfig.getPlainValue("minX"), regionConfig.getPlainValue("minY"), regionConfig.getPlainValue("minZ")); - } - if (prototype != null && prototypes.contains(prototype.getName())) { - generatePrototypeData(prototype, point); - } else if (regionConfig.containsKey("prototype")) { - generatePrototypeData(Prototype.getByName(regionConfig.getPlainValue("prototype")), point); - } - if (prototype != null) { - skin = regionData.getPlainValueOrDefault("skin", prototype.getDefaultSkin()); - if (!prototype.getSkinMap().containsKey(skin)) { - skin = prototype.getDefaultSkin(); - } - } - regionData.add("skin", skin); - - if (!hasType(RegionType.BUILD) || !hasType(RegionType.TESTBLOCK)) { - flagStorage.set(Flag.TNT, TNTMode.DENY); - } - } - - private void generatePrototypeData(Prototype prototype, Point point) { - if (prototype == null) { - return; - } - - this.prototype = prototype; - this.skin = prototype.getDefaultSkin(); - - this.minPoint = point; - this.maxPoint = point.add(prototype.getSizeX() - 1, prototype.getSizeY() - 1, prototype.getSizeZ() - 1); - - if (prototype.getTestblock() != null) { - this.minPointTestblock = point.add(prototype.getTestblock().getOffsetX(), prototype.getTestblock().getOffsetY(), prototype.getTestblock().getOffsetZ()); - this.maxPointTestblock = this.minPointTestblock.add(prototype.getTestblock().getSizeX() - 1, prototype.getTestblock().getSizeY() - 1, prototype.getTestblock().getSizeZ() - 1); - - this.minPointTestblockExtension = this.minPointTestblock.subtract(prototype.getTestblock().getExtensionNegativeX(), prototype.getTestblock().getExtensionNegativeY(), prototype.getTestblock().getExtensionNegativeZ()); - this.maxPointTestblockExtension = this.maxPointTestblock.add(prototype.getTestblock().getExtensionPositiveX(), prototype.getTestblock().getExtensionPositiveY(), prototype.getTestblock().getExtensionPositiveZ()); - - if (prototype.getTestblock().getCopyOffsetX() != 0 || prototype.getTestblock().getCopyOffsetY() != 0 || prototype.getTestblock().getCopyOffsetZ() != 0) { - this.testBlockPoint = this.minPointTestblock.add(prototype.getTestblock().getCopyOffsetX(), prototype.getTestblock().getCopyOffsetY(), prototype.getTestblock().getCopyOffsetZ()); - } else { - this.testBlockPoint = this.minPointTestblock.add(prototype.getTestblock().getSizeX() / 2, 0, -1); - } - } - - if (prototype.getBuild() != null) { - this.minPointBuild = point.add(prototype.getBuild().getOffsetX(), prototype.getBuild().getOffsetY(), prototype.getBuild().getOffsetZ()); - this.maxPointBuild = this.minPointBuild.add(prototype.getBuild().getSizeX() - 1, prototype.getBuild().getSizeY() - 1, prototype.getBuild().getSizeZ() - 1); - - this.minPointBuildExtension = this.minPointBuild.subtract(prototype.getBuild().getExtensionNegativeX(), prototype.getBuild().getExtensionNegativeY(), prototype.getBuild().getExtensionNegativeZ()); - this.maxPointBuildExtension = this.maxPointBuild.add(prototype.getBuild().getExtensionPositiveX(), prototype.getBuild().getExtensionPositiveY(), prototype.getBuild().getExtensionPositiveZ()); - - if (!prototype.getBuild().isHasCopyPoint() && (prototype.getCopyPointOffsetX() != 0 || prototype.getCopyPointOffsetY() != 0 || prototype.getCopyPointOffsetZ() != 0)) { - this.copyPoint = minPoint.add(prototype.getCopyPointOffsetX(), prototype.getCopyPointOffsetY(), prototype.getCopyPointOffsetZ()); - } else if (prototype.getBuild().getCopyOffsetX() != 0 || prototype.getBuild().getCopyOffsetY() != 0 || prototype.getBuild().getCopyOffsetZ() != 0) { - this.copyPoint = this.minPointBuild.add(prototype.getBuild().getCopyOffsetX(), prototype.getBuild().getCopyOffsetY(), prototype.getBuild().getCopyOffsetZ()); - } else { - this.copyPoint = this.minPointBuild.add(prototype.getBuild().getSizeX() / 2, 0, prototype.getBuild().getSizeZ()); - } - } else if (prototype.getCopyPointOffsetX() != 0 || prototype.getCopyPointOffsetY() != 0 || prototype.getCopyPointOffsetZ() != 0) { - this.copyPoint = minPoint.add(prototype.getCopyPointOffsetX(), prototype.getCopyPointOffsetY(), prototype.getCopyPointOffsetZ()); - } - - if (prototype.getFloorOffset() != 0) { - floorLevel = minPoint.getY() + prototype.getFloorOffset(); - } else { - floorLevel = 0; - } - - if (prototype.getWaterOffset() != 0) { - waterLevel = minPoint.getY() + prototype.getWaterOffset(); - } else { - waterLevel = 0; - } - } - - public boolean inRegion(Location location, RegionType regionType, RegionExtensionType regionExtensionType) { - if (!hasType(regionType)) { - return false; - } - switch (regionType) { - case BUILD: - Point minBPoint = regionExtensionType == RegionExtensionType.EXTENSION ? minPointBuildExtension : minPointBuild; - Point maxBPoint = regionExtensionType == RegionExtensionType.EXTENSION ? maxPointBuildExtension : maxPointBuild; - return inRegion(location, minBPoint, maxBPoint); - case TESTBLOCK: - Point minTBPoint = regionExtensionType == RegionExtensionType.EXTENSION ? minPointTestblockExtension : minPointTestblock; - Point maxTBPoint = regionExtensionType == RegionExtensionType.EXTENSION ? maxPointTestblockExtension : maxPointTestblock; - return inRegion(location, minTBPoint, maxTBPoint); - default: - case NORMAL: - return inRegion(location, minPoint, maxPoint); - } - } - - private boolean inRegion(Location location, Point minPoint, Point maxPoint) { - int blockX = location.getBlockX(); - int blockY = location.getBlockY(); - int blockZ = location.getBlockZ(); - return blockX >= minPoint.getX() && blockX <= maxPoint.getX() && - blockY >= minPoint.getY() && blockY <= maxPoint.getY() && - blockZ >= minPoint.getZ() && blockZ <= maxPoint.getZ(); - } - - public boolean hasType(RegionType regionType) { - if (prototype == null) { - return false; - } - if (regionType == null) { - return false; - } - switch (regionType) { - case BUILD: - return prototype.getBuild() != null; - case TESTBLOCK: - return prototype.getTestblock() != null; - default: - case NORMAL: + Area EMPTY = new Area() { + @Override + public boolean isEmpty() { return true; - } - } + } - public boolean hasExtensionType(RegionType regionType) { - if (!hasType(regionType)) { - return false; - } - switch (regionType) { - case BUILD: - return prototype.getBuild().isExtensionRegistered(); - case TESTBLOCK: - return prototype.getTestblock().isExtensionRegistered(); - default: - case NORMAL: + @Override + public Point getMinPoint(boolean extension) { + return Point.ZERO; + } + + @Override + public Point getMaxPoint(boolean extension) { + return Point.ZERO; + } + + @Override + public Point getCopyPoint() { + return Point.ZERO; + } + + @Override + public boolean inRegion(Location location, boolean extension) { return false; - } - } - - public String getDisplayName() { - return prototype != null ? prototype.getSkinMap().get(skin).getName() : ""; - } - - private void setLinkedRegion(Predicate regionConsumer) { - if (linkedRegionName == null) { - return; - } - if (linkedRegion != null) { - if (regionConsumer.test(linkedRegion)) { - RegionUtils.save(linkedRegion); } - return; - } - for (Region region : REGION_MAP.values()) { - if (region.name.equals(linkedRegionName)) { - linkedRegion = region; - if (regionConsumer.test(linkedRegion)) { - RegionUtils.save(linkedRegion); - } - return; + + @Override + public Clipboard copy(boolean extension) { + return null; } - } - } - public Region getLinkedRegion() { - if (linkedRegion == null && linkedRegionName != null) { - setLinkedRegion(region -> false); - } - return linkedRegion; - } + @Override + public File getResetFile() { + return null; + } - public boolean setPrototype(@NonNull Prototype prototype) { - if (!prototypes.contains(prototype.getName())) { + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + } + + @Override + public void forEachChunk(BiConsumer executor) { + } + + @Override + public boolean isChunkOutside(int chunkX, int chunkZ) { + return false; + } + }; + + default boolean isEmpty() { return false; } - return _setPrototype(prototype); - } - boolean _setPrototype(@NonNull Prototype prototype) { - generatePrototypeData(prototype, minPoint); - RegionUtils.save(this); - return true; - } + @NonNull + Point getMinPoint(boolean extension); - public boolean setSkin(@NonNull String skinName) { - if (!prototype.getSkinMap().containsKey(skinName)) { - return false; - } - this.skin = skinName; - setLinkedRegion(region -> { - region.skin = skinName; + @NonNull + Point getMaxPoint(boolean extension); + + @NonNull + Point getCopyPoint(); + + default boolean inRegion(Location location, boolean extension) { + Point minPoint = getMinPoint(extension); + Point maxPoint = getMaxPoint(extension); + if (location.getBlockX() < minPoint.getX() || location.getBlockX() > maxPoint.getX()) return false; + if (location.getBlockY() < minPoint.getY() || location.getBlockY() > maxPoint.getY()) return false; + if (location.getBlockZ() < minPoint.getZ() || location.getBlockZ() > maxPoint.getZ()) return false; return true; - }); - regionData.add("skin", skin); - return true; - } - - public void set(Flag flagType, Flag.Value value) { - if (flagStorage.set(flagType, value)) { - RegionUtils.save(this); - } - setLinkedRegion(region -> region.flagStorage.set(flagType, value)); - } - - public void set(Tag tag) { - if (flagStorage.set(tag)) { - RegionUtils.save(this); - } - setLinkedRegion(region -> region.flagStorage.set(tag)); - } - - public void remove(Tag tag) { - if (flagStorage.remove(tag)) { - RegionUtils.save(this); - } - } - - public Flag.Value get(Flag flagType) { - return flagStorage.get(flagType); - } - - public boolean get(Tag tagType) { - return flagStorage.is(tagType); - } - - public & Flag.Value> T getPlain(Flag flagType) { - return (T) flagStorage.get(flagType).getValue(); - } - - public & Flag.Value> T getPlain(Flag flagType, Class type) { - return (T) flagStorage.get(flagType).getValue(); - } - - public Point getMinPoint(RegionType regionType, RegionExtensionType regionExtensionType) { - switch (regionType) { - case TESTBLOCK: - return (regionExtensionType == null || regionExtensionType == RegionExtensionType.NORMAL) ? minPointTestblock : minPointTestblockExtension; - case BUILD: - return (regionExtensionType == null || regionExtensionType == RegionExtensionType.NORMAL) ? minPointBuild : minPointBuildExtension; - default: - case NORMAL: - return minPoint; - } - } - - public Point getMaxPoint(RegionType regionType, RegionExtensionType regionExtensionType) { - switch (regionType) { - case TESTBLOCK: - return (regionExtensionType == null || regionExtensionType == RegionExtensionType.NORMAL) ? maxPointTestblock : maxPointTestblockExtension; - case BUILD: - return (regionExtensionType == null || regionExtensionType == RegionExtensionType.NORMAL) ? maxPointBuild : maxPointBuildExtension; - default: - case NORMAL: - return maxPoint; - } - } - - boolean hasReset(RegionType regionType) { - if (!hasType(regionType)) { - return false; - } - switch (regionType) { - case TESTBLOCK: - return prototype.getSkinMap().get(skin).getTestblockSchematicFile() != null; - case BUILD: - return prototype.getSkinMap().get(skin).getBuildSchematicFile() != null; - default: - case NORMAL: - return prototype.getSkinMap().get(skin).getSchematicFile() != null; - } - } - - public File getResetFile(RegionType regionType) { - if (!hasReset(regionType)) { - return null; - } - switch (regionType) { - case TESTBLOCK: - return prototype.getSkinMap().get(skin).getTestblockSchematicFile(); - case BUILD: - return prototype.getSkinMap().get(skin).getBuildSchematicFile(); - default: - case NORMAL: - return prototype.getSkinMap().get(skin).getSchematicFile(); - } - } - - public void reset(PasteBuilder pasteBuilder, RegionType regionType, RegionExtensionType regionExtensionType) { - if (!hasReset(regionType)) { - return; - } - if (regionExtensionType == RegionExtensionType.EXTENSION && !hasExtensionType(regionType)) { - regionExtensionType = RegionExtensionType.NORMAL; } - pasteBuilder.reset(regionExtensionType == RegionExtensionType.EXTENSION) - .minPoint(getMinPoint(regionType, regionExtensionType)) - .maxPoint(getMaxPoint(regionType, regionExtensionType)) - .waterLevel(waterLevel); - if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { - SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); - pasteBuilder.rotate(schematicType.fightType() || schematicType.check()); + @Nullable + default Clipboard copy(boolean extension) { + return FlatteningWrapper.impl.copy(getMinPoint(extension), getMaxPoint(extension), getCopyPoint()); } - switch (regionType) { - case BUILD: - pasteBuilder.pastePoint(minPointBuild.add(prototype.getBuild().getSizeX() / 2, 0, prototype.getBuild().getSizeZ() / 2)); - break; - case TESTBLOCK: - Point pastePoint = minPointTestblock.add(prototype.getTestblock().getSizeX() / 2, 0, prototype.getTestblock().getSizeZ() / 2); - if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { - SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); - if (schematicType.getKuerzel().equalsIgnoreCase("wg")) { - pastePoint = pastePoint.add(0, 0, 1); - } - if (schematicType.getKuerzel().equalsIgnoreCase("ws")) { - pastePoint = pastePoint.add(-1, 0, 1); - } - if (schematicType.getKuerzel().equalsIgnoreCase("as")) { - pastePoint = pastePoint.add(-1, 0, 1); - } + @Nullable + File getResetFile(); + + void reset(PasteBuilder pasteBuilder, boolean extension); + + default void forEachChunk(BiConsumer executor) { + Point minPoint = getMinPoint(false); + Point maxPoint = getMaxPoint(false); + for (int x = (int) Math.floor(minPoint.getX() / 16.0); x <= (int) Math.ceil(maxPoint.getX() / 16.0); x++) { + for (int z = (int) Math.floor(minPoint.getZ() / 16.0); z <= (int) Math.ceil(maxPoint.getZ() / 16.0); z++) { + executor.accept(x, z); } - pasteBuilder.pastePoint(pastePoint); - break; - default: - case NORMAL: - pasteBuilder.pastePoint(minPoint.add(prototype.getSizeX() / 2, 0, prototype.getSizeZ() / 2)); - break; - } - - initSessions(); - undoSessions.push(pasteBuilder.run()); - } - - public void remember(EditSession editSession) { - initSessions(); - undoSessions.push(editSession); - } - - public boolean isGlobal() { - return this == GlobalRegion.getInstance(); - } - - private void initSessions() { - if (undoSessions == null) { - undoSessions = new SizedStack<>(20); - redoSessions = new SizedStack<>(20); - } - } - - public boolean undo() { - initSessions(); - EditSession session = undoSessions.pop(); - if (session == null) - return false; - - try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) { - session.undo(e); - redoSessions.push(e); - } - return true; - } - - public boolean redo() { - initSessions(); - EditSession session = redoSessions.pop(); - if (session == null) - return false; - - try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) { - session.redo(e); - undoSessions.push(e); - } - return true; - } - - public boolean backup() { - final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name); - //noinspection ResultOfMethodCallIgnored - definedBackupFolder.mkdirs(); - - File[] currentBackups = definedBackupFolder.listFiles(); - if (currentBackups != null && currentBackups.length >= 20) { - List files = new ArrayList<>(Arrays.asList(currentBackups)); - files.sort(Comparator.comparingLong(File::lastModified)); - while (files.size() >= 20) files.remove(0).delete(); - } - - final File backupFile = new File(definedBackupFolder, LocalDateTime.now().format(formatter) + ".schem"); - return FlatteningWrapper.impl.backup(minPoint, maxPoint, backupFile); - } - - public static boolean copy(Point minPoint, Point maxPoint, File file) { - return FlatteningWrapper.impl.backup(minPoint, maxPoint, file); - } - - public List listBackup() { - final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name); - //noinspection ResultOfMethodCallIgnored - definedBackupFolder.mkdirs(); - - File[] currentBackups = definedBackupFolder.listFiles(); - List files = new ArrayList<>(Arrays.asList(currentBackups)); - files.sort(Comparator.comparingLong(File::lastModified)); - return files.stream().map(File::getName).collect(Collectors.toList()); - } - - public File getBackupFile(String backupName) { - final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name); - //noinspection ResultOfMethodCallIgnored - definedBackupFolder.mkdirs(); - File[] files = definedBackupFolder.listFiles((dir, name) -> name.equals(backupName + ".schem")); - if (files == null || files.length == 0) return null; - return files[0]; - } - - public void forEachChunk(ObjIntConsumer executor) { - for (int x = (int) Math.floor(minPoint.getX() / 16.0); x <= (int) Math.ceil(maxPoint.getX() / 16.0); x++) { - for (int z = (int) Math.floor(minPoint.getZ() / 16.0); z <= (int) Math.ceil(maxPoint.getZ() / 16.0); z++) { - executor.accept(x, z); } } - } - public boolean buildChunkOutside(int chunkX, int chunkY) { - if (!hasType(RegionType.BUILD)) { + default boolean isChunkOutside(int chunkX, int chunkZ) { + Point minPoint = getMinPoint(true); + Point maxPoint = getMaxPoint(true); return Math.floor(minPoint.getX() / 16.0) > chunkX || chunkX >= Math.ceil(maxPoint.getX() / 16.0) || - Math.floor(minPoint.getZ() / 16.0) > chunkY || chunkY >= Math.ceil(maxPoint.getZ() / 16.0); + Math.floor(minPoint.getZ() / 16.0) > chunkZ || chunkZ >= Math.ceil(maxPoint.getZ() / 16.0); } - if (!hasExtensionType(RegionType.BUILD)) { - return Math.floor(minPointBuild.getX() / 16.0) > chunkX || chunkX >= Math.ceil(maxPointBuild.getX() / 16.0) || - Math.floor(minPointBuild.getZ() / 16.0) > chunkY || chunkY >= Math.ceil(maxPointBuild.getZ() / 16.0); - } - return Math.floor(minPointBuildExtension.getX() / 16.0) > chunkX || chunkX >= Math.ceil(maxPointBuildExtension.getX() / 16.0) || - Math.floor(minPointBuildExtension.getZ() / 16.0) > chunkY || chunkY >= Math.ceil(maxPointBuildExtension.getZ() / 16.0); } - - public File gameModeConfig() { - File baseFile = new File(BauSystem.getInstance().getDataFolder().getParentFile(), "FightSystem"); - for (int version = Core.getVersion(); version >= 15; version--) { - File specific = new File(baseFile, prototype.getDisplayName() + version + ".yml"); - if (specific.exists()) return specific; - } - return null; - } -} \ No newline at end of file +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java new file mode 100644 index 00000000..b49e949a --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionBackups.java @@ -0,0 +1,86 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import lombok.Getter; +import lombok.NonNull; +import lombok.RequiredArgsConstructor; + +import javax.annotation.CheckReturnValue; +import javax.annotation.Nullable; +import java.util.List; +import java.util.Optional; + +public interface RegionBackups { + + @RequiredArgsConstructor + enum BackupType { + MANUAL(5), + AUTOMATIC(20), + ; + + public final int maxBackups; + } + + @RequiredArgsConstructor + @Getter + abstract class Backup { + @NonNull + private final BackupType type; + + @NonNull + private final String name; + + @NonNull + private final FlagStorage flags; + + @CheckReturnValue + public abstract boolean load(); + + public abstract void delete(); + } + + @CheckReturnValue + Optional create(BackupType backupType); + + @NonNull + List list(); + + @Nullable + Backup get(String name); + + RegionBackups EMPTY = new RegionBackups() { + @Override + public Optional create(BackupType backupType) { + return Optional.empty(); + } + + @Override + public @NonNull List list() { + return List.of(); + } + + @Nullable + @Override + public Backup get(String name) { + return null; + } + }; +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionFlagPolicy.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionFlagPolicy.java new file mode 100644 index 00000000..ecc3d136 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionFlagPolicy.java @@ -0,0 +1,38 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum RegionFlagPolicy { + NOT_APPLICABLE(false, false), + READ_ONLY(true, false), + WRITABLE(true, true); + + private final boolean readable; + private final boolean writable; + + public boolean isApplicable() { + return readable || writable; + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionHistory.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionHistory.java new file mode 100644 index 00000000..ef597cd2 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionHistory.java @@ -0,0 +1,92 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.WorldEdit; +import com.sk89q.worldedit.bukkit.BukkitWorld; +import de.steamwar.bausystem.shared.SizedStack; +import lombok.NonNull; +import org.bukkit.Bukkit; + +public interface RegionHistory { + + void remember(@NonNull EditSession editSession); + + boolean undo(); + + boolean redo(); + + RegionHistory EMPTY = new RegionHistory() { + @Override + public void remember(@NonNull EditSession editSession) { + } + + @Override + public boolean undo() { + return false; + } + + @Override + public boolean redo() { + return false; + } + }; + + class Impl implements RegionHistory { + + private SizedStack undoSessions; + private SizedStack redoSessions; + + public Impl(int size) { + this.undoSessions = new SizedStack<>(size); + this.redoSessions = new SizedStack<>(size); + } + + @Override + public void remember(@NonNull EditSession editSession) { + undoSessions.push(editSession); + if (redoSessions.empty()) return; + redoSessions.clear(); + } + + @Override + public boolean undo() { + EditSession session = undoSessions.pop(); + if (session == null) return false; + try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) { + session.undo(e); + redoSessions.push(e); + } + return true; + } + + @Override + public boolean redo() { + EditSession session = redoSessions.pop(); + if (session == null) return false; + try (EditSession e = WorldEdit.getInstance().getEditSessionFactory().getEditSession(new BukkitWorld(Bukkit.getWorlds().get(0)), -1)) { + session.redo(e); + undoSessions.push(e); + } + return true; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java new file mode 100644 index 00000000..5d967f1a --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionSystem.java @@ -0,0 +1,120 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import lombok.NonNull; +import org.bukkit.Location; + +import javax.annotation.CheckReturnValue; +import java.lang.reflect.InvocationTargetException; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +public interface RegionSystem { + + RegionSystem INSTANCE = init(); + + /** + * Loads and initializes the Regions and anything that should be loaded on startup. + */ + void load(); + + /** + * Saves anything that should be written to file on either CRIUSleepEvent or plugin disable. + */ + void save(); + + /** + * Returns the Location to teleport players to when they first join or Warp to "WorldSpawn" + */ + @NonNull + Location getWorldSpawn(); + + /** + * Returns the GlobalRegion. This Region should have their {@link Region#getID()} return the + * '00000000-0000-0000-0000-000000000000' UUID for easier retrieval with {@link #getRegion(UUID)}. + */ + @NonNull + Region getGlobalRegion(); + + /** + * Should return a Region that is present at the specific Location or the {@link #getGlobalRegion()} + * if none are present. + */ + @NonNull + Region get(@NonNull Location location); + + /** + * Should return the Region by their UUID. + */ + @CheckReturnValue + Optional getRegion(@NonNull UUID id); + + /** + * Does and should not contain the GlobalRegion returned by {@link #getGlobalRegion()}. + */ + @NonNull + Stream getRegions(); + + private static RegionSystem init() { + try { + return (RegionSystem) Class.forName("de.steamwar.bausystem.region.FixedRegionSystem").getConstructor().newInstance(); + } catch (ClassNotFoundException | NoSuchMethodException | InstantiationException | IllegalAccessException | + InvocationTargetException e) { + return new RegionSystem() { + @Override + public void load() { + throw new UnsupportedOperationException(); + } + + @Override + public void save() { + throw new UnsupportedOperationException(); + } + + @Override + public @NonNull Location getWorldSpawn() { + throw new UnsupportedOperationException(); + } + + @Override + public Region getGlobalRegion() { + throw new UnsupportedOperationException(); + } + + @Override + public Region get(Location location) { + throw new UnsupportedOperationException(); + } + + @Override + public Optional getRegion(UUID id) { + throw new UnsupportedOperationException(); + } + + @Override + public Stream getRegions() { + throw new UnsupportedOperationException(); + } + }; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionType.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionType.java new file mode 100644 index 00000000..dda01029 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionType.java @@ -0,0 +1,34 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter +public enum RegionType { + + GLOBAL(true), + NORMAL(false), + ; + + private final boolean global; +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java index e30c3ed9..be9b0887 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java @@ -1,92 +1,48 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package de.steamwar.bausystem.region; -import com.sk89q.worldedit.EditSession; -import com.sk89q.worldedit.extent.clipboard.Clipboard; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; -import de.steamwar.bausystem.utils.FlatteningWrapper; -import de.steamwar.bausystem.worlddata.WorldData; import lombok.experimental.UtilityClass; import net.md_5.bungee.api.ChatMessageType; import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.io.File; import java.util.function.Consumer; import java.util.function.Function; - @UtilityClass public class RegionUtils { public void actionBar(Region region, String s, Object... objects) { + forEachInRegion(region, player -> { + player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(BauSystem.MESSAGE.parse(s, player, objects))); + }); + } + + public void message(Region region, String s, Object... objects) { + forEachInRegion(region, player -> BauSystem.MESSAGE.send(s, player, objects)); + } + + public void message(Region region, Function function) { + forEachInRegion(region, player -> { + String message = function.apply(player); + if (message == null) { + return; + } + + player.sendMessage(message); + }); + } + + public void message(Region region, Consumer consumer) { + forEachInRegion(region, consumer); + } + + public void forEachInRegion(Region region, Consumer consumer) { Bukkit.getOnlinePlayers() .stream() - .filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) - .filter(player -> !region.isGlobal() || Region.getRegion(player.getLocation()).isGlobal()) - .forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(BauSystem.MESSAGE.parse(s, player, objects)))); + .filter(player -> region.getArea().inRegion(player.getLocation(), false)) + .filter(player -> !region.getType().isGlobal() || Region.getRegion(player.getLocation()).getType().isGlobal()) + .forEach(consumer); } - - public static void message(Region region, String message, Object... objects) { - Bukkit.getOnlinePlayers() - .stream() - .filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) - .filter(player -> !region.isGlobal() || Region.getRegion(player.getLocation()).isGlobal()) - .forEach(player -> BauSystem.MESSAGE.send(message, player, objects)); - } - - public static void message(Region region, Function function) { - Bukkit.getOnlinePlayers() - .stream() - .filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) - .filter(player -> !region.isGlobal() || Region.getRegion(player.getLocation()).isGlobal()) - .forEach(player -> { - String message = function.apply(player); - if (message == null) { - return; - } - - player.sendMessage(message); - }); - } - - public static void message(Region region, Consumer function) { - Bukkit.getOnlinePlayers() - .stream() - .filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)) - .filter(player -> !region.isGlobal() || Region.getRegion(player.getLocation()).isGlobal()) - .forEach(player -> { - function.accept(player); - }); - } - - static void save(Region region) { - if (region.getPrototype() != null) { - region.regionData.add("prototype", region.getPrototype().getName()); - } - region.regionData.add("flagStorage", FlagStorage.toYAPION(region.getFlagStorage())); - WorldData.write(); - } - } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ChangedMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ChangedMode.java new file mode 100644 index 00000000..07b054b7 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ChangedMode.java @@ -0,0 +1,60 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * ChangedMode defines that a Region has changed or not + */ +@Getter +@AllArgsConstructor +public enum ChangedMode implements Flag.Value { + + NO_CHANGE("FLAG_CHANGED_NO_CHANGE", false), + HAS_CHANGE("FLAG_CHANGED_HAS_CHANGE", true); + + private static ChangedMode[] values; + private final String chatValue; + private final Boolean changed; + + @Override + public ChangedMode[] getValues() { + if (ChangedMode.values == null) { + ChangedMode.values = ChangedMode.values(); + } + return ChangedMode.values; + } + + @Override + public ChangedMode getValue() { + return this; + } + + @Override + public ChangedMode getValueOf(final String name) { + try { + return ChangedMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return NO_CHANGE; + } + } +} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ColorMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ColorMode.java new file mode 100644 index 00000000..60d8abfa --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ColorMode.java @@ -0,0 +1,73 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * ColorMode defines the colors a Region can have + */ +@Getter +@AllArgsConstructor +public enum ColorMode implements Flag.Value { + WHITE("FLAG_COLOR_WHITE", 'f'), + ORANGE("FLAG_COLOR_ORANGE", '6'), + MAGENTA("FLAG_COLOR_MAGENTA", '5'), + LIGHT_BLUE("FLAG_COLOR_LIGHT_BLUE", 'b'), + YELLOW("FLAG_COLOR_YELLOW", 'e'), + LIME("FLAG_COLOR_LIME", 'a'), + PINK("FLAG_COLOR_PINK", 'd'), + GRAY("FLAG_COLOR_GRAY", '8'), + LIGHT_GRAY("FLAG_COLOR_LIGHT_GRAY", '7'), + CYAN("FLAG_COLOR_CYAN", '3'), + PURPLE("FLAG_COLOR_PURPLE", '5'), + BLUE("FLAG_COLOR_BLUE", '9'), + BROWN("FLAG_COLOR_BROWN", 'e'), + GREEN("FLAG_COLOR_GREEN", '2'), + RED("FLAG_COLOR_RED", 'c'), + BLACK("FLAG_COLOR_BLACK", '1'); + + private static ColorMode[] values; + private final String chatValue; + private final char colorCode; + + @Override + public ColorMode[] getValues() { + if (ColorMode.values == null) { + ColorMode.values = ColorMode.values(); + } + return ColorMode.values; + } + + @Override + public ColorMode getValue() { + return this; + } + + @Override + public ColorMode getValueOf(final String name) { + try { + return ColorMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return ColorMode.YELLOW; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FireMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FireMode.java new file mode 100644 index 00000000..1c48b649 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FireMode.java @@ -0,0 +1,62 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * FireMode defines if fire should be enabled or disabled in a Region + */ +@Getter +@AllArgsConstructor +public enum FireMode implements Flag.Value { + + ALLOW("FLAG_FIRE_ALLOW"), + DENY("FLAG_FIRE_DENY"); + + private static FireMode[] values; + private final String chatValue; + + @Override + public FireMode[] getValues() { + if (FireMode.values == null) { + FireMode.values = FireMode.values(); + } + return FireMode.values; + } + + @Override + public FireMode getValue() { + return this; + } + + @Override + public FireMode getValueOf(final String name) { + try { + return FireMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + if (name.equalsIgnoreCase("false")) { + return FireMode.DENY; + } + return FireMode.ALLOW; + } + } +} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/Flag.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/Flag.java index 3c9f3173..19a5082f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/Flag.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/Flag.java @@ -1,85 +1,130 @@ /* - * This file is a part of the SteamWar software. + * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2025 SteamWar.de-Serverteam * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * 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 Affero General Public License for more details. * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . */ package de.steamwar.bausystem.region.flags; -import de.steamwar.bausystem.region.flags.flagvalues.*; import de.steamwar.bausystem.shared.EnumDisplay; -import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NonNull; -import java.util.EnumSet; +import java.util.HashSet; import java.util.Set; -import java.util.stream.Collectors; +import java.util.concurrent.atomic.AtomicInteger; -@Getter -@AllArgsConstructor -public enum Flag implements EnumDisplay { +public final class Flag & Flag.Value> implements EnumDisplay { - COLOR("FLAG_COLOR", ColorMode.class, ColorMode.YELLOW, false), - TNT("FLAG_TNT", TNTMode.class, TNTMode.ONLY_TB, true), - FIRE("FLAG_FIRE", FireMode.class, FireMode.ALLOW, true), - FREEZE("FLAG_FREEZE", FreezeMode.class, FreezeMode.INACTIVE, true), - PROTECT("FLAG_PROTECT", ProtectMode.class, ProtectMode.ACTIVE, true), - ITEMS("FLAG_ITEMS", ItemMode.class, ItemMode.INACTIVE, true), - NO_GRAVITY("FLAG_NO_GRAVITY", NoGravityMode.class, NoGravityMode.INACTIVE, true), - ; + @Getter + private static final Set flags = new HashSet<>(); - @Getter - private static final Set flags; - @Getter - private static final Set resetFlags; + private static AtomicInteger counter = new AtomicInteger(0); - static { - flags = EnumSet.allOf(Flag.class); - resetFlags = flags.stream().filter(flag -> flag.reset).collect(Collectors.toUnmodifiableSet()); - } + public static final Flag COLOR = new Flag<>("COLOR", "FLAG_COLOR", ColorMode.class, ColorMode.YELLOW); + public static final Flag TNT = new Flag<>("TNT", "FLAG_TNT", TNTMode.class, TNTMode.ONLY_TB); + public static final Flag FIRE = new Flag<>("FIRE", "FLAG_FIRE", FireMode.class, FireMode.DENY); + public static final Flag FREEZE = new Flag<>("FREEZE", "FLAG_FREEZE", FreezeMode.class, FreezeMode.INACTIVE); + public static final Flag PROTECT = new Flag<>("PROTECT", "FLAG_PROTECT", ProtectMode.class, ProtectMode.ACTIVE); + public static final Flag ITEMS = new Flag<>("ITEMS", "FLAG_ITEMS", ItemMode.class, ItemMode.INACTIVE); + public static final Flag NO_GRAVITY = new Flag<>("NO_GRAVITY", "FLAG_NO_GRAVITY", NoGravityMode.class, NoGravityMode.INACTIVE); + public static final Flag TESTBLOCK = new Flag<>("TESTBLOCK", "FLAG_TESTBLOCK", TestblockMode.class, TestblockMode.NO_VALUE); + public static final Flag CHANGED = new Flag<>("CHANGED", "FLAG_CHANGED", ChangedMode.class, ChangedMode.NO_CHANGE); - private final String chatValue; - private final Class> valueType; - private final Flag.Value defaultValue; - private final boolean reset; + private String name; + private int ordinal; - public Value getFlagValueOf(final String name) { - return this.defaultValue.getValueOf(name); - } + @Getter + private String chatValue; - @Override - public String toString() { - return this.name().toLowerCase(); - } + @Getter + private final Class> valueType; - @Override - public String getChatValue() { - return chatValue; - } + @Getter + private final T defaultValue; - public interface Value & Value> extends EnumDisplay { + @Getter + private final Flag.Value[] values; - T getValue(); + private Flag(String name, String chatValue, Class> valueType, T defaultValue) { + flags.add(this); - T getValueOf(final String name); + this.name = name; + this.ordinal = counter.getAndIncrement(); + this.chatValue = chatValue; - T[] getValues(); + this.valueType = valueType; + this.defaultValue = defaultValue; + this.values = defaultValue.getValues(); + } - default String getName() { - return this.getValue().name().toLowerCase(); - } - } -} \ No newline at end of file + public static Flag valueOf(@NonNull String name) { + for (Flag flag : flags) { + if (flag.name.equalsIgnoreCase(name)) { + return flag; + } + } + throw new IllegalArgumentException("No enum constant Flag." + name); + } + + public Flag.Value valueOfValue(@NonNull String name) { + for (Flag.Value value : values) { + if (value.name().equalsIgnoreCase(name)) { + return value; + } + } + throw new IllegalArgumentException("No enum constant Flag." + this.name + "." + name); + } + + public String name() { + return name; + } + + public int ordinal() { + return ordinal; + } + + public boolean oneOf(Flag... flags) { + for (Flag flag : flags) { + if (flag == this) { + return true; + } + } + return false; + } + + @Override + public String toString() { + return name; + } + + public interface Value & Value> extends EnumDisplay { + + String name(); + + int ordinal(); + + T getValue(); + + T getValueOf(final String name); + + T[] getValues(); + + default String getName() { + return this.getValue().name().toLowerCase(); + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FreezeMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FreezeMode.java new file mode 100644 index 00000000..ad3f0d09 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/FreezeMode.java @@ -0,0 +1,63 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * FreezeMode defines if freeze should be enabled or disabled in a Region + */ +@Getter +@AllArgsConstructor +public enum FreezeMode implements Flag.Value { + + ACTIVE("FLAG_FREEZE_ACTIVE"), + INACTIVE("FLAG_FREEZE_INACTIVE"); + + private static FreezeMode[] values; + private final String chatValue; + + @Override + public FreezeMode[] getValues() { + if (FreezeMode.values == null) { + FreezeMode.values = FreezeMode.values(); + } + return FreezeMode.values; + } + + @Override + public FreezeMode getValue() { + return this; + } + + @Override + public FreezeMode getValueOf(final String name) { + try { + return FreezeMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + if (name.equalsIgnoreCase("false")) { + return FreezeMode.INACTIVE; + } + return FreezeMode.INACTIVE; + } + } +} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ItemMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ItemMode.java new file mode 100644 index 00000000..60235e4f --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ItemMode.java @@ -0,0 +1,62 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * ItemMode defines if items should be droppable or deleted in a Region + */ +@Getter +@AllArgsConstructor +public enum ItemMode implements Flag.Value { + + ACTIVE("FLAG_ITEMS_ACTIVE"), + INACTIVE("FLAG_ITEMS_INACTIVE"); + + private static ItemMode[] values; + private final String chatValue; + + @Override + public ItemMode[] getValues() { + if (ItemMode.values == null) { + ItemMode.values = ItemMode.values(); + } + return ItemMode.values; + } + + @Override + public ItemMode getValue() { + return this; + } + + @Override + public ItemMode getValueOf(final String name) { + try { + return ItemMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + if (name.equalsIgnoreCase("false")) { + return ItemMode.INACTIVE; + } + return ItemMode.ACTIVE; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/NoGravityMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/NoGravityMode.java new file mode 100644 index 00000000..98bd0b5f --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/NoGravityMode.java @@ -0,0 +1,62 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * NoGravityMode defines if entities and items should have gravity or not in a Region + */ +@Getter +@AllArgsConstructor +public enum NoGravityMode implements Flag.Value { + + ACTIVE("FLAG_NO_GRAVITY_ACTIVE"), + INACTIVE("FLAG_NO_GRAVITY_INACTIVE"); + + private static NoGravityMode[] values; + private final String chatValue; + + @Override + public NoGravityMode[] getValues() { + if (NoGravityMode.values == null) { + NoGravityMode.values = NoGravityMode.values(); + } + return NoGravityMode.values; + } + + @Override + public NoGravityMode getValue() { + return this; + } + + @Override + public NoGravityMode getValueOf(final String name) { + try { + return NoGravityMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + if (name.equalsIgnoreCase("false")) { + return NoGravityMode.INACTIVE; + } + return NoGravityMode.ACTIVE; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ProtectMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ProtectMode.java new file mode 100644 index 00000000..7805d49b --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/ProtectMode.java @@ -0,0 +1,62 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * ProtectMode defines if the floor should be protected inside a Region + */ +@Getter +@AllArgsConstructor +public enum ProtectMode implements Flag.Value { + + ACTIVE("FLAG_PROTECT_ACTIVE"), + INACTIVE("FLAG_PROTECT_INACTIVE"); + + private static ProtectMode[] values; + private final String chatValue; + + @Override + public ProtectMode[] getValues() { + if (ProtectMode.values == null) { + ProtectMode.values = ProtectMode.values(); + } + return ProtectMode.values; + } + + @Override + public ProtectMode getValue() { + return this; + } + + @Override + public ProtectMode getValueOf(final String name) { + try { + return ProtectMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + if (name.equalsIgnoreCase("false")) { + return ProtectMode.INACTIVE; + } + return ProtectMode.ACTIVE; + } + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TNTMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TNTMode.java new file mode 100644 index 00000000..8c7d61f5 --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TNTMode.java @@ -0,0 +1,60 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * TNTMode defines what TNT Explosions should destroy in a Region + */ +@Getter +@AllArgsConstructor +public enum TNTMode implements Flag.Value { + + ALLOW("FLAG_TNT_ALLOW"), + DENY("FLAG_TNT_DENY"), + ONLY_TB("FLAG_TNT_ONLY_TB"); + + private static TNTMode[] values; + private final String chatValue; + + @Override + public TNTMode[] getValues() { + if (TNTMode.values == null) { + TNTMode.values = TNTMode.values(); + } + return TNTMode.values; + } + + @Override + public TNTMode getValue() { + return this; + } + + @Override + public TNTMode getValueOf(final String name) { + try { + return TNTMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return TNTMode.ALLOW; + } + } +} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TestblockMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TestblockMode.java new file mode 100644 index 00000000..e89ab19f --- /dev/null +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/TestblockMode.java @@ -0,0 +1,61 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.flags; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +/** + * TestblockMode defines where the Testblock should be inside a Region + */ +@Getter +@AllArgsConstructor +public enum TestblockMode implements Flag.Value { + + NO_VALUE("FLAG_TESTBLOCK_NO_VALUE", false), + NORTH("FLAG_TESTBLOCK_NORTH", true), + SOUTH("FLAG_TESTBLOCK_SOUTH", false); + + private static TestblockMode[] values; + private final String chatValue; + private final boolean north; + + @Override + public TestblockMode[] getValues() { + if (TestblockMode.values == null) { + TestblockMode.values = TestblockMode.values(); + } + return TestblockMode.values; + } + + @Override + public TestblockMode getValue() { + return this; + } + + @Override + public TestblockMode getValueOf(final String name) { + try { + return TestblockMode.valueOf(name.toUpperCase()); + } catch (IllegalArgumentException e) { + return NO_VALUE; + } + } +} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ColorMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ColorMode.java deleted file mode 100644 index 6902a2fb..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ColorMode.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.Color; -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ColorMode implements Flag.Value { - WHITE("FLAG_COLOR_WHITE", Color.WHITE), - ORANGE("FLAG_COLOR_ORANGE", Color.ORANGE), - MAGENTA("FLAG_COLOR_MAGENTA", Color.MAGENTA), - LIGHT_BLUE("FLAG_COLOR_LIGHT_BLUE", Color.LIGHT_BLUE), - YELLOW("FLAG_COLOR_YELLOW", Color.YELLOW), - LIME("FLAG_COLOR_LIME", Color.LIME), - PINK("FLAG_COLOR_PINK", Color.PINK), - GRAY("FLAG_COLOR_GRAY", Color.GRAY), - LIGHT_GRAY("FLAG_COLOR_LIGHT_GRAY", Color.LIGHT_GRAY), - CYAN("FLAG_COLOR_CYAN", Color.CYAN), - PURPLE("FLAG_COLOR_PURPLE", Color.PURPLE), - BLUE("FLAG_COLOR_BLUE", Color.BLUE), - BROWN("FLAG_COLOR_BROWN", Color.BROWN), - GREEN("FLAG_COLOR_GREEN", Color.GREEN), - RED("FLAG_COLOR_RED", Color.RED), - BLACK("FLAG_COLOR_BLACK", Color.BLACK); - - private static ColorMode[] values; - private final String chatValue; - private final Color color; - - @Override - public ColorMode[] getValues() { - if (ColorMode.values == null) { - ColorMode.values = ColorMode.values(); //NOSONAR - } - return ColorMode.values; - } - - @Override - public ColorMode getValue() { - return this; - } - - @Override - public ColorMode getValueOf(final String name) { - try { - return ColorMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - return ColorMode.YELLOW; - } - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FireMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FireMode.java deleted file mode 100644 index cf0fab31..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FireMode.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum FireMode implements Flag.Value { - - ALLOW("FLAG_FIRE_ALLOW"), - DENY("FLAG_FIRE_DENY"); - - private static FireMode[] values; - private final String chatValue; - - @Override - public FireMode[] getValues() { - if (FireMode.values == null) { - FireMode.values = FireMode.values(); //NOSONAR - } - return FireMode.values; - } - - @Override - public FireMode getValue() { - return this; - } - - @Override - public FireMode getValueOf(final String name) { - try { - return FireMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - if (name.equalsIgnoreCase("false")) { - return FireMode.DENY; - } - return FireMode.ALLOW; - } - } -} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FreezeMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FreezeMode.java deleted file mode 100644 index 1b1774c7..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/FreezeMode.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum FreezeMode implements Flag.Value { - - ACTIVE("FLAG_FREEZE_ACTIVE"), - INACTIVE("FLAG_FREEZE_INACTIVE"); - - private static FreezeMode[] values; - private final String chatValue; - - @Override - public FreezeMode[] getValues() { - if (FreezeMode.values == null) { - FreezeMode.values = FreezeMode.values(); //NOSONAR - } - return FreezeMode.values; - } - - @Override - public FreezeMode getValue() { - return this; - } - - @Override - public FreezeMode getValueOf(final String name) { - try { - return FreezeMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - if (name.equalsIgnoreCase("false")) { - return FreezeMode.INACTIVE; - } - return FreezeMode.INACTIVE; - } - } -} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ItemMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ItemMode.java deleted file mode 100644 index c0cefa38..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ItemMode.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ItemMode implements Flag.Value { - - ACTIVE("FLAG_ITEMS_ACTIVE"), - INACTIVE("FLAG_ITEMS_INACTIVE"); - - private static ItemMode[] values; - private final String chatValue; - - @Override - public ItemMode[] getValues() { - if (ItemMode.values == null) { - ItemMode.values = ItemMode.values(); //NOSONAR - } - return ItemMode.values; - } - - @Override - public ItemMode getValue() { - return this; - } - - @Override - public ItemMode getValueOf(final String name) { - try { - return ItemMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - if (name.equalsIgnoreCase("false")) { - return ItemMode.INACTIVE; - } - return ItemMode.ACTIVE; - } - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/NoGravityMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/NoGravityMode.java deleted file mode 100644 index 33368a35..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/NoGravityMode.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum NoGravityMode implements Flag.Value { - - ACTIVE("FLAG_NO_GRAVITY_ACTIVE"), - INACTIVE("FLAG_NO_GRAVITY_INACTIVE"); - - private static NoGravityMode[] values; - private final String chatValue; - - @Override - public NoGravityMode[] getValues() { - if (NoGravityMode.values == null) { - NoGravityMode.values = NoGravityMode.values(); //NOSONAR - } - return NoGravityMode.values; - } - - @Override - public NoGravityMode getValue() { - return this; - } - - @Override - public NoGravityMode getValueOf(final String name) { - try { - return NoGravityMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - if (name.equalsIgnoreCase("false")) { - return NoGravityMode.INACTIVE; - } - return NoGravityMode.ACTIVE; - } - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ProtectMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ProtectMode.java deleted file mode 100644 index 18ea897b..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/ProtectMode.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum ProtectMode implements Flag.Value { - - ACTIVE("FLAG_PROTECT_ACTIVE"), - INACTIVE("FLAG_PROTECT_INACTIVE"); - - private static ProtectMode[] values; - private final String chatValue; - - @Override - public ProtectMode[] getValues() { - if (ProtectMode.values == null) { - ProtectMode.values = ProtectMode.values(); //NOSONAR - } - return ProtectMode.values; - } - - @Override - public ProtectMode getValue() { - return this; - } - - @Override - public ProtectMode getValueOf(final String name) { - try { - return ProtectMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - if (name.equalsIgnoreCase("false")) { - return ProtectMode.INACTIVE; - } - return ProtectMode.ACTIVE; - } - } -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/TNTMode.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/TNTMode.java deleted file mode 100644 index 9b05d6b5..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/flags/flagvalues/TNTMode.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.flags.flagvalues; - -import de.steamwar.bausystem.region.flags.Flag; -import lombok.AllArgsConstructor; -import lombok.Getter; - -@Getter -@AllArgsConstructor -public enum TNTMode implements Flag.Value { - - ALLOW("FLAG_TNT_ALLOW"), - DENY("FLAG_TNT_DENY"), - ONLY_TB("FLAG_TNT_ONLY_TB"), - ONLY_BUILD("FLAG_TNT_ONLY_BUILD"); - - private static TNTMode[] values; - private final String chatValue; - - @Override - public TNTMode[] getValues() { - if (TNTMode.values == null) { - TNTMode.values = TNTMode.values(); //NOSONAR - } - return TNTMode.values; - } - - @Override - public TNTMode getValue() { - return this; - } - - @Override - public TNTMode getValueOf(final String name) { - try { - return TNTMode.valueOf(name.toUpperCase()); - } catch (IllegalArgumentException e) { - return TNTMode.ALLOW; - } - } -} \ No newline at end of file diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/Updater.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/Updater.java deleted file mode 100644 index 5e33350a..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/Updater.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.loader; - -import de.steamwar.bausystem.BauSystem; -import org.bukkit.Bukkit; - -import java.io.File; -import java.util.logging.Level; - -public class Updater { - - private long lastUpdate; - - public Updater(File file, Runnable updaterCode) { - this.lastUpdate = file.lastModified(); - Bukkit.getScheduler().runTaskTimer(BauSystem.getInstance(), () -> { - if (file.lastModified() > lastUpdate + 10) { - try { - updaterCode.run(); - Bukkit.getLogger().log(Level.INFO, "Update complete of " + file.getAbsolutePath()); - } catch (Exception e) { - Bukkit.getLogger().log(Level.INFO, "Error while loading file " + file.getAbsolutePath() + " for config: " + e.getMessage(), e); - } - lastUpdate = file.lastModified(); - } - }, 20, 20); - } - -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/tags/Tag.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/tags/Tag.java deleted file mode 100644 index e37751d9..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/tags/Tag.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2021 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package de.steamwar.bausystem.region.tags; - -public enum Tag { - CHANGED, -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionExtensionType.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionExtensionType.java index 446e0d97..b28031f5 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionExtensionType.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionExtensionType.java @@ -1,25 +1,14 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package de.steamwar.bausystem.region.utils; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Getter public enum RegionExtensionType { - NORMAL, - EXTENSION + NORMAL(false), + EXTENSION(true), + ; + + private final boolean extension; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionSelectionType.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionSelectionType.java deleted file mode 100644 index aeac38eb..00000000 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionSelectionType.java +++ /dev/null @@ -1,6 +0,0 @@ -package de.steamwar.bausystem.region.utils; - -public enum RegionSelectionType { - LOCAL, - GLOBAL -} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionType.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionType.java index a618c644..27412cec 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionType.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/utils/RegionType.java @@ -1,34 +1,39 @@ -/* - * This file is a part of the SteamWar software. - * - * Copyright (C) 2020 SteamWar.de-Serverteam - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero 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 Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - package de.steamwar.bausystem.region.utils; +import de.steamwar.bausystem.region.Point; +import de.steamwar.bausystem.region.Region; import de.steamwar.bausystem.shared.EnumDisplay; import lombok.AllArgsConstructor; import lombok.Getter; -@AllArgsConstructor -public enum RegionType implements EnumDisplay { - NORMAL("REGION_TYPE_NORMAL"), - BUILD("REGION_TYPE_BUILD"), - TESTBLOCK("REGION_TYPE_ONLY_TB"); +import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.function.Predicate; + +@AllArgsConstructor +@Getter +public enum RegionType implements EnumDisplay { + NORMAL("REGION_TYPE_NORMAL", + region -> true, + Region::getArea, + (region, extension) -> region.getArea().getMinPoint(false), + (region, extension) -> region.getArea().getMaxPoint(false)), + BUILD("REGION_TYPE_BUILD", + region -> !region.getBuildArea().isEmpty(), + Region::getBuildArea, + (region, extension) -> region.getBuildArea().getMinPoint(extension), + (region, extension) -> region.getBuildArea().getMaxPoint(extension)), + TESTBLOCK("REGION_TYPE_ONLY_TB", + region -> !region.getTestblockArea().isEmpty(), + Region::getTestblockArea, + (region, extension) -> region.getTestblockArea().getMinPoint(extension), + (region, extension) -> region.getTestblockArea().getMaxPoint(extension)), + ; - @Getter private String chatValue; + + private Predicate hasType; + private Function toInner; + private BiFunction toMinPoint; + private BiFunction toMaxPoint; } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/shared/SizedStack.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/shared/SizedStack.java index 7d503b2e..6aa7b619 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/shared/SizedStack.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/shared/SizedStack.java @@ -130,6 +130,12 @@ public class SizedStack { return size; } + public void clear() { + this.data = (T[]) new Object[this.maxSize]; + this.head = 0; + this.size = 0; + } + @Override public String toString() { final StringBuilder result = new StringBuilder("["); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PasteBuilder.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PasteBuilder.java index a4a74e17..0622bb11 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PasteBuilder.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PasteBuilder.java @@ -26,8 +26,8 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockType; import com.sk89q.worldedit.world.block.BlockTypes; -import de.steamwar.bausystem.region.Color; import de.steamwar.bausystem.region.Point; +import de.steamwar.bausystem.region.flags.ColorMode; import de.steamwar.sql.SchematicData; import de.steamwar.sql.SchematicNode; import lombok.Getter; @@ -102,8 +102,8 @@ public class PasteBuilder { return this; } - public PasteBuilder color(Color color) { - if (color == Color.PINK) return this; + public PasteBuilder color(ColorMode color) { + if (color == ColorMode.PINK) return this; Map blockCache = new HashMap<>(); return map((clipboard, blockVector3) -> { @@ -122,7 +122,7 @@ public class PasteBuilder { } /** - * Can only be used before {@link #color(Color)}. + * Can only be used before {@link #color(ColorMode)}. */ public PasteBuilder onlyColors(boolean onlyColors) { if (!onlyColors) return this; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java index 3202c88e..6ada6d86 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/PlaceItemUtils.java @@ -27,7 +27,6 @@ import org.bukkit.*; import org.bukkit.block.*; import org.bukkit.block.data.*; import org.bukkit.block.data.type.Hopper; -import org.bukkit.block.data.type.Observer; import org.bukkit.block.data.type.*; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockCanBuildEvent; @@ -38,7 +37,9 @@ import org.bukkit.inventory.meta.*; import org.bukkit.util.RayTraceResult; import org.bukkit.util.Vector; -import java.util.*; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.stream.Collectors; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/BossBarService.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/BossBarService.java index e6ea2c16..7bb57c78 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/BossBarService.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/BossBarService.java @@ -51,7 +51,7 @@ public class BossBarService implements Listener { .computeIfAbsent(key, k -> { BossBar bossBar = Bukkit.createBossBar("", BarColor.WHITE, BarStyle.SOLID); bossBar.addPlayer(player); - if (region.isGlobal()) { + if (region.getType().isGlobal()) { return new GlobalBossbar(bossBar); } else { return new RegionedBossbar(bossBar, region, player); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/GlobalBossbar.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/GlobalBossbar.java index a5aaf9fe..47f57907 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/GlobalBossbar.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/GlobalBossbar.java @@ -19,8 +19,8 @@ package de.steamwar.bausystem.utils.bossbar; -import de.steamwar.bausystem.region.GlobalRegion; import de.steamwar.bausystem.region.Region; +import de.steamwar.bausystem.region.RegionSystem; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; @@ -101,7 +101,7 @@ public class GlobalBossbar implements BauSystemBossbar { @Override public Region getRegion() { - return GlobalRegion.getInstance(); + return RegionSystem.INSTANCE.getGlobalRegion(); } @Override diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/RegionedBossbar.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/RegionedBossbar.java index 5fb1cc99..0df1ca4c 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/RegionedBossbar.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/bossbar/RegionedBossbar.java @@ -21,8 +21,6 @@ package de.steamwar.bausystem.utils.bossbar; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Region; -import de.steamwar.bausystem.region.utils.RegionExtensionType; -import de.steamwar.bausystem.region.utils.RegionType; import org.bukkit.Bukkit; import org.bukkit.boss.BarColor; import org.bukkit.boss.BarFlag; @@ -120,7 +118,7 @@ public class RegionedBossbar implements BauSystemBossbar, Listener { @EventHandler public void onPlayerMove(PlayerMoveEvent event) { if (event.getPlayer() != player) return; - if (region.inRegion(event.getTo(), RegionType.NORMAL, RegionExtensionType.NORMAL)) { + if (region.getArea().inRegion(event.getTo(), false)) { bossBar.addPlayer(player); } else { bossBar.removePlayer(player); diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java index 36a5297d..bfbca11e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/worlddata/WorldData.java @@ -19,7 +19,6 @@ package de.steamwar.bausystem.worlddata; -import de.steamwar.sql.SteamwarUser; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import yapion.hierarchy.output.FileOutput; @@ -59,25 +58,11 @@ public class WorldData { if (optionsFile.length() != 0) { try (BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream(optionsFile))) { worldData = YAPIONParser.parse(bufferedInputStream, new StreamOptions().charset(InputStreamCharsets.UTF_8)); - if (!worldData.containsKey("regions")) { - YAPIONObject yapionObject = new YAPIONObject(); - yapionObject.add("regions", worldData); - worldData = yapionObject; - write(); - } } catch (IOException e) { // Ignored } - } - - // Conversion from old simulator saving to new one - if (worldData.containsKey("simulators")) { - YAPIONObject yapionObject = worldData.getObject("simulators"); - worldData.remove("simulators"); - yapionObject.forEach((s, yapionAnyType) -> { - SteamwarUser steamwarUser = SteamwarUser.get(Integer.parseInt(s)); - SimulatorData.saveSimulator(steamwarUser, new YAPIONObject().add("", yapionAnyType)); - }); + } else { + write(); } } diff --git a/BauSystem/BauSystem_RegionFixed/build.gradle.kts b/BauSystem/BauSystem_RegionFixed/build.gradle.kts new file mode 100644 index 00000000..b33f5f0a --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/build.gradle.kts @@ -0,0 +1,47 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +plugins { + steamwar.java +} + +tasks.compileJava { + options.isWarnings = false +} + +java { + sourceCompatibility = JavaVersion.VERSION_17 + targetCompatibility = JavaVersion.VERSION_17 +} + +dependencies { + compileOnly(project(":BauSystem:BauSystem_Main", "default")) + compileOnly(project(":SpigotCore", "default")) + + compileOnly(libs.spigotapi) + compileOnly(libs.axiom) + compileOnly(libs.authlib) + compileOnly(libs.viaapi) + + compileOnly(libs.nms20) + compileOnly(libs.fawe18) + + implementation(libs.luaj) + implementation(files("$projectDir/../libs/YAPION-SNAPSHOT.jar")) +} diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java new file mode 100644 index 00000000..df41ac6f --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/FixedRegionSystem.java @@ -0,0 +1,82 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2024 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region; + +import de.steamwar.bausystem.region.fixed.FixedGlobalRegion; +import de.steamwar.bausystem.region.fixed.loader.PrototypeLoader; +import de.steamwar.bausystem.region.fixed.loader.RegionLoader; +import lombok.NonNull; +import org.bukkit.Bukkit; +import org.bukkit.Location; + +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; +import java.util.stream.Stream; + +public class FixedRegionSystem implements RegionSystem { + + private static final Map REGION_MAP = new HashMap<>(); + + public static void addRegion(Region region) { + REGION_MAP.put(region.getID(), region); + } + + @Override + public void load() { + PrototypeLoader.load(); + RegionLoader.load(); + } + + @Override + public void save() { + } + + @Override + public @NonNull Location getWorldSpawn() { + Location spawnLocation = Bukkit.getWorlds().get(0).getSpawnLocation(); + Location spawnPoint = Bukkit.getWorlds().get(0).getHighestBlockAt(spawnLocation).getLocation(); + return spawnPoint.add(0.5, 1, 0.5); + } + + @Override + public Region getGlobalRegion() { + return FixedGlobalRegion.INSTANCE; + } + + @Override + public Region get(Location location) { + return REGION_MAP.values().stream() + .filter(region -> region.getArea().inRegion(location, false)) + .findFirst() + .orElse(FixedGlobalRegion.INSTANCE); + } + + @Override + public Optional getRegion(@NonNull UUID id) { + return Optional.ofNullable(REGION_MAP.get(id)); + } + + @Override + public Stream getRegions() { + return REGION_MAP.values().stream(); + } +} diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java new file mode 100644 index 00000000..c860f903 --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedFlagStorage.java @@ -0,0 +1,98 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.fixed; + +import de.steamwar.bausystem.region.FlagOptional; +import de.steamwar.bausystem.region.FlagStorage; +import de.steamwar.bausystem.region.RegionFlagPolicy; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.worlddata.WorldData; +import de.steamwar.core.Core; +import lombok.NonNull; +import yapion.hierarchy.types.YAPIONObject; + +import java.util.HashMap; +import java.util.Map; + +public class FixedFlagStorage implements FlagStorage { + + private Map, Flag.Value> flagMap = new HashMap<>(); + private YAPIONObject data; + + public FixedFlagStorage(YAPIONObject data) { + this.data = data; + for (final Flag flag : Flag.getFlags()) { + if (!has(flag).isWritable()) continue; + try { + String s = data.getPlainValue(flag.name()); + flagMap.put(flag, flag.valueOfValue(s)); + } catch (Exception e) { + flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); + } + } + } + + @Override + public @NonNull & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag) { + if (flag.oneOf(Flag.COLOR, Flag.TNT, Flag.FIRE, Flag.FREEZE, Flag.PROTECT, Flag.NO_GRAVITY, Flag.CHANGED)) { + return RegionFlagPolicy.WRITABLE; + } + if (flag.oneOf(Flag.ITEMS) && Core.getVersion() >= 20) { + return RegionFlagPolicy.WRITABLE; + } + if (flag.oneOf(Flag.TESTBLOCK)) { + return RegionFlagPolicy.READ_ONLY; + } + return RegionFlagPolicy.NOT_APPLICABLE; + } + + @Override + public & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { + if (has(flag).isWritable()) { + data.put(flag.name(), value.name()); + WorldData.write(); + return flagMap.put(flag, value) != value; + } else { + return false; + } + } + + @Override + public @NonNull & Flag.Value> FlagOptional get(@NonNull Flag flag) { + return FlagOptional.of(flag, (T) flagMap.get(flag)); + } + + @Override + public void clear() { + flagMap.clear(); + } + + @Override + public Map, Flag.Value> getBackedMap() { + return flagMap; + } + + @Override + public String toString() { + return "FixedFlagStorage{" + + "flagMap=" + flagMap + + '}'; + } +} diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java new file mode 100644 index 00000000..d699eb08 --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalFlagStorage.java @@ -0,0 +1,108 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.fixed; + +import de.steamwar.bausystem.region.FlagOptional; +import de.steamwar.bausystem.region.FlagStorage; +import de.steamwar.bausystem.region.RegionFlagPolicy; +import de.steamwar.bausystem.region.flags.ColorMode; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.ProtectMode; +import de.steamwar.bausystem.region.flags.TNTMode; +import de.steamwar.bausystem.worlddata.WorldData; +import de.steamwar.core.Core; +import lombok.NonNull; +import yapion.hierarchy.types.YAPIONObject; + +import java.util.HashMap; +import java.util.Map; + +public class FixedGlobalFlagStorage implements FlagStorage { + + private Map, Flag.Value> flagMap = new HashMap<>(); + private YAPIONObject data; + + public FixedGlobalFlagStorage(YAPIONObject data) { + flagMap.put(Flag.TNT, TNTMode.DENY); + this.data = data; + for (final Flag flag : Flag.getFlags()) { + if (!has(flag).isWritable()) continue; + try { + String s = data.getPlainValue(flag.name()); + flagMap.put(flag, flag.valueOfValue(s)); + } catch (Exception e) { + flagMap.put(flag, (Flag.Value) flag.getDefaultValue()); + } + } + } + + @Override + public @NonNull & Flag.Value> RegionFlagPolicy has(@NonNull Flag flag) { + if (flag.oneOf(Flag.COLOR)) { + return RegionFlagPolicy.READ_ONLY; + } + if (flag.oneOf(Flag.ITEMS) && Core.getVersion() >= 20) { + return RegionFlagPolicy.WRITABLE; + } + if (flag.oneOf(Flag.TNT, Flag.FIRE, Flag.FREEZE)) { + return RegionFlagPolicy.WRITABLE; + } + return RegionFlagPolicy.NOT_APPLICABLE; + } + + @Override + public & Flag.Value> boolean set(@NonNull Flag flag, @NonNull T value) { + if (has(flag).isWritable()) { + data.put(flag.name(), value.name()); + WorldData.write(); + return flagMap.put(flag, value) != value; + } else { + return false; + } + } + + @Override + public @NonNull & Flag.Value> FlagOptional get(@NonNull Flag flag) { + if (flag.oneOf(Flag.COLOR)) { + return FlagOptional.of((Flag) flag, ColorMode.YELLOW); + } + if (flag.oneOf(Flag.PROTECT)) { + return FlagOptional.of((Flag) flag, ProtectMode.INACTIVE); + } + return FlagOptional.of(flag, (T) flagMap.get(flag)); + } + + @Override + public void clear() { + flagMap.clear(); + } + + @Override + public Map, Flag.Value> getBackedMap() { + return flagMap; + } + + @Override + public String toString() { + return "FixedGlobalFlagStorage{" + + "flagMap=" + flagMap + + '}'; + } +} diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalRegion.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalRegion.java new file mode 100644 index 00000000..39e8ca1f --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedGlobalRegion.java @@ -0,0 +1,142 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.fixed; + +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import de.steamwar.bausystem.region.*; +import de.steamwar.bausystem.utils.PasteBuilder; +import lombok.NonNull; +import lombok.Setter; +import org.bukkit.Location; + +import javax.annotation.Nullable; +import java.io.File; +import java.util.UUID; +import java.util.function.BiConsumer; + +public final class FixedGlobalRegion implements Region { + + public static final FixedGlobalRegion INSTANCE = new FixedGlobalRegion(); + + private static final Point MIN_POINT = new Point(Integer.MIN_VALUE, Integer.MIN_VALUE, Integer.MIN_VALUE); + private static final Point MAX_POINT = new Point(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE); + + @Setter + private static FlagStorage FLAG_STORAGE; + + private static final UUID GLOBAL_REGION_ID = new UUID(0, 0); + + private static final Area GLOBAL_AREA = new Area() { + @Override + public @NonNull Point getMinPoint(boolean extension) { + return MIN_POINT; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return MAX_POINT; + } + + @Override + public @NonNull Point getCopyPoint() { + return Point.ZERO; + } + + @Override + public boolean inRegion(Location location, boolean extension) { + return true; + } + + @Nullable + @Override + public Clipboard copy(boolean extension) { + return null; + } + + @Nullable + @Override + public File getResetFile() { + return null; + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + } + + @Override + public void forEachChunk(BiConsumer executor) { + } + + @Override + public boolean isChunkOutside(int chunkX, int chunkZ) { + return false; + } + }; + + private static final GameModeConfig GLOBAL_CONFIG = new GameModeConfig(null); + + private FixedGlobalRegion() { + } + + @Override + public RegionType getType() { + return RegionType.GLOBAL; + } + + @Override + public @NonNull UUID getID() { + return GLOBAL_REGION_ID; + } + + @Override + public @NonNull FlagStorage getFlags() { + return FLAG_STORAGE; + } + + @Override + public @NonNull Area getArea() { + return GLOBAL_AREA; + } + + @Override + public @NonNull Area getBuildArea() { + return Area.EMPTY; + } + + @Override + public @NonNull Area getTestblockArea() { + return Area.EMPTY; + } + + @Override + public @NonNull GameModeConfig getGameModeConfig() { + return GLOBAL_CONFIG; + } + + @Override + public @NonNull RegionHistory getHistory() { + return RegionHistory.EMPTY; + } + + @Override + public @NonNull RegionBackups getBackups() { + return RegionBackups.EMPTY; + } +} diff --git a/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java new file mode 100644 index 00000000..ab6ae1cb --- /dev/null +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/FixedRegion.java @@ -0,0 +1,386 @@ +/* + * This file is a part of the SteamWar software. + * + * Copyright (C) 2020 SteamWar.de-Serverteam + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero 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 Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package de.steamwar.bausystem.region.fixed; + +import com.sk89q.worldedit.EditSession; +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.region.*; +import de.steamwar.bausystem.region.flags.Flag; +import de.steamwar.bausystem.region.flags.TestblockMode; +import de.steamwar.bausystem.utils.FlatteningWrapper; +import de.steamwar.bausystem.utils.PasteBuilder; +import de.steamwar.core.Core; +import de.steamwar.sql.SchematicType; +import lombok.NonNull; +import org.bukkit.Bukkit; +import yapion.hierarchy.types.YAPIONObject; + +import javax.annotation.Nullable; +import java.io.File; +import java.nio.charset.StandardCharsets; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.*; +import java.util.stream.Collectors; + +public class FixedRegion implements Region { + + private static final File backupFolder = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "backup"); + private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy.MM.dd' 'HH:mm:ss"); + + private final String name; + private final UUID uuid; + private final FixedFlagStorage flagStorage; + private final Prototype prototype; + private final String skin; + + private final Area area; + private final Area build; + private final Area testblock; + private final int floorLevel; + private final int waterLevel; + private final GameModeConfig gameModeConfig; + private final RegionHistory regionHistory = new RegionHistory.Impl(20); + + private final RegionBackups regionBackups = new RegionBackups() { + @Override + public Optional create(BackupType backupType) { + final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name); + //noinspection ResultOfMethodCallIgnored + definedBackupFolder.mkdirs(); + + File[] currentBackups = definedBackupFolder.listFiles(); + if (currentBackups != null && currentBackups.length >= 20) { + List files = new ArrayList<>(Arrays.asList(currentBackups)); + files.sort(Comparator.comparingLong(File::lastModified)); + while (files.size() >= 20) files.remove(0).delete(); + } + + final File backupFile = new File(definedBackupFolder, LocalDateTime.now().format(formatter) + ".schem"); + Point minPoint = area.getMinPoint(false); + Point maxPoint = area.getMaxPoint(false); + if (!FlatteningWrapper.impl.backup(minPoint, maxPoint, backupFile)) { + return Optional.empty(); + } + return Optional.of(new BackupImpl(backupFile)); + } + + @Override + public @NonNull List list() { + final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), name); + //noinspection ResultOfMethodCallIgnored + definedBackupFolder.mkdirs(); + + File[] currentBackups = definedBackupFolder.listFiles(); + if (currentBackups == null || currentBackups.length == 0) { + return Collections.emptyList(); + } + List files = new ArrayList<>(Arrays.asList(currentBackups)); + files.sort(Comparator.comparingLong(File::lastModified)); + return files.stream().map(BackupImpl::new).collect(Collectors.toList()); + } + + @Nullable + @Override + public Backup get(String name) { + final File definedBackupFolder = new File(new File(backupFolder, prototype.getName()), FixedRegion.this.name); + //noinspection ResultOfMethodCallIgnored + definedBackupFolder.mkdirs(); + File[] files = definedBackupFolder.listFiles((dir, s) -> s.equals(name.replace('_', ' ') + ".schem")); + if (files == null || files.length == 0) return null; + return new BackupImpl(files[0]); + } + }; + + private class BackupImpl extends RegionBackups.Backup { + + private final File file; + + public BackupImpl(File file) { + super(RegionBackups.BackupType.AUTOMATIC, file.getName().replace(' ', '_'), flagStorage); + this.file = file; + } + + @Override + public boolean load() { + if (!file.exists()) return false; + EditSession editSession = new PasteBuilder(new PasteBuilder.FileProvider(file)) + .pastePoint(area.getMinPoint(false).add(prototype.getSizeX() / 2, 0, prototype.getSizeZ() / 2)) + .minPoint(area.getMinPoint(false)) + .maxPoint(area.getMaxPoint(false)) + .waterLevel(waterLevel) + .run(); + regionHistory.remember(editSession); + return true; + } + + @Override + public void delete() { + file.delete(); + } + } + + public FixedRegion(String name, FixedFlagStorage flagStorage, Prototype prototype, YAPIONObject regionConfig, YAPIONObject regionData) { + this.name = name; + uuid = UUID.nameUUIDFromBytes(name.getBytes(StandardCharsets.UTF_8)); + this.flagStorage = flagStorage; + this.prototype = prototype; + this.skin = prototype.getDefaultSkin(); + + Point minPoint; + if (regionConfig.containsKey("minX", Integer.class) && regionConfig.containsKey("minY", Integer.class) && regionConfig.containsKey("minZ", Integer.class)) { + minPoint = new Point(regionConfig.getInt("minX"), regionConfig.getInt("minY"), regionConfig.getInt("minZ")); + } else { + throw new IllegalArgumentException("minX and minY and minZ are required"); + } + Point maxPoint = minPoint.add(prototype.getSizeX() - 1, prototype.getSizeY() - 1, prototype.getSizeZ() - 1); + + area = new Area() { + @Override + public @NonNull Point getMinPoint(boolean extension) { + return minPoint; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return maxPoint; + } + + @Override + public @NonNull Point getCopyPoint() { + return minPoint; + } + + @Nullable + @Override + public File getResetFile() { + return prototype.getSkinMap().get(skin).getSchematicFile(); + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + pasteBuilder.reset(extension) + .minPoint(getMinPoint(extension)) + .maxPoint(getMaxPoint(extension)) + .waterLevel(waterLevel); + if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { + SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); + pasteBuilder.rotate(schematicType.fightType() || schematicType.check()); + } + pasteBuilder.pastePoint(minPoint.add(prototype.getSizeX() / 2, 0, prototype.getSizeY() / 2)); + regionHistory.remember(pasteBuilder.run()); + } + }; + + if (prototype.getBuild() != null) { + Point minPointBuild = minPoint.add(prototype.getBuild().getOffsetX(), prototype.getBuild().getOffsetY(), prototype.getBuild().getOffsetZ()); + Point maxPointBuild = minPointBuild.add(prototype.getBuild().getSizeX() - 1, prototype.getBuild().getSizeY() - 1, prototype.getBuild().getSizeZ() - 1); + + Point minPointBuildExtension = minPointBuild.subtract(prototype.getBuild().getExtensionNegativeX(), prototype.getBuild().getExtensionNegativeY(), prototype.getBuild().getExtensionNegativeZ()); + Point maxPointBuildExtension = maxPointBuild.add(prototype.getBuild().getExtensionPositiveX(), prototype.getBuild().getExtensionPositiveY(), prototype.getBuild().getExtensionPositiveZ()); + + Point copyPoint; + if (!prototype.getBuild().isHasCopyPoint() && (prototype.getCopyPointOffsetX() != 0 || prototype.getCopyPointOffsetY() != 0 || prototype.getCopyPointOffsetZ() != 0)) { + copyPoint = minPoint.add(prototype.getCopyPointOffsetX(), prototype.getCopyPointOffsetY(), prototype.getCopyPointOffsetZ()); + } else if (prototype.getBuild().getCopyOffsetX() != 0 || prototype.getBuild().getCopyOffsetY() != 0 || prototype.getBuild().getCopyOffsetZ() != 0) { + copyPoint = minPointBuild.add(prototype.getBuild().getCopyOffsetX(), prototype.getBuild().getCopyOffsetY(), prototype.getBuild().getCopyOffsetZ()); + } else { + copyPoint = minPointBuild.add(prototype.getBuild().getSizeX() / 2, 0, prototype.getBuild().getSizeZ()); + } + + build = new Area() { + @Override + public @NonNull Point getMinPoint(boolean extension) { + return extension ? minPointBuildExtension : minPointBuild; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return extension ? maxPointBuildExtension : maxPointBuild; + } + + @Override + public @NonNull Point getCopyPoint() { + return copyPoint; + } + + @Nullable + @Override + public File getResetFile() { + return prototype.getSkinMap().get(skin).getBuildSchematicFile(); + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + pasteBuilder.reset(extension) + .minPoint(getMinPoint(extension)) + .maxPoint(getMaxPoint(extension)) + .waterLevel(waterLevel); + if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { + SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); + pasteBuilder.rotate(schematicType.fightType() || schematicType.check()); + } + pasteBuilder.pastePoint(minPointBuild.add(prototype.getBuild().getSizeX() / 2, 0, prototype.getBuild().getSizeZ() / 2)); + regionHistory.remember(pasteBuilder.run()); + } + }; + } else { + build = Area.EMPTY; + } + + if (prototype.getTestblock() != null) { + Point minPointTestblock = minPoint.add(prototype.getTestblock().getOffsetX(), prototype.getTestblock().getOffsetY(), prototype.getTestblock().getOffsetZ()); + Point maxPointTestblock = minPointTestblock.add(prototype.getTestblock().getSizeX() - 1, prototype.getTestblock().getSizeY() - 1, prototype.getTestblock().getSizeZ() - 1); + + Point minPointTestblockExtension = minPointTestblock.subtract(prototype.getTestblock().getExtensionNegativeX(), prototype.getTestblock().getExtensionNegativeY(), prototype.getTestblock().getExtensionNegativeZ()); + Point maxPointTestblockExtension = maxPointTestblock.add(prototype.getTestblock().getExtensionPositiveX(), prototype.getTestblock().getExtensionPositiveY(), prototype.getTestblock().getExtensionPositiveZ()); + + Point copyPoint; + if (!prototype.getTestblock().isHasCopyPoint() && (prototype.getCopyPointOffsetX() != 0 || prototype.getCopyPointOffsetY() != 0 || prototype.getCopyPointOffsetZ() != 0)) { + copyPoint = minPoint.add(prototype.getCopyPointOffsetX(), prototype.getCopyPointOffsetY(), prototype.getCopyPointOffsetZ()); + } else if (prototype.getTestblock().getCopyOffsetX() != 0 || prototype.getTestblock().getCopyOffsetY() != 0 || prototype.getTestblock().getCopyOffsetZ() != 0) { + copyPoint = minPointTestblock.add(prototype.getTestblock().getCopyOffsetX(), prototype.getTestblock().getCopyOffsetY(), prototype.getTestblock().getCopyOffsetZ()); + } else { + copyPoint = minPointTestblock.add(prototype.getTestblock().getSizeX() / 2, 0, prototype.getTestblock().getSizeZ()); + } + + testblock = new Area() { + @Override + public @NonNull Point getMinPoint(boolean extension) { + return extension ? minPointTestblockExtension : minPointTestblock; + } + + @Override + public @NonNull Point getMaxPoint(boolean extension) { + return extension ? maxPointTestblockExtension : maxPointTestblock; + } + + @Override + public @NonNull Point getCopyPoint() { + return copyPoint; + } + + @Nullable + @Override + public File getResetFile() { + return prototype.getSkinMap().get(skin).getTestblockSchematicFile(); + } + + @Override + public void reset(PasteBuilder pasteBuilder, boolean extension) { + pasteBuilder.reset(extension) + .minPoint(getMinPoint(extension)) + .maxPoint(getMaxPoint(extension)) + .waterLevel(waterLevel); + if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { + SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); + pasteBuilder.rotate(schematicType.fightType() || schematicType.check()); + } + Point pastePoint = minPointTestblock.add(prototype.getTestblock().getSizeX() / 2, 0, prototype.getTestblock().getSizeZ() / 2); + if (pasteBuilder.getClipboardProvider().is(PasteBuilder.SchematicProvider.class)) { + SchematicType schematicType = pasteBuilder.getClipboardProvider().as(PasteBuilder.SchematicProvider.class).getSchematic().getSchemtype(); + if (schematicType.getKuerzel().equalsIgnoreCase("wg")) { + pastePoint = pastePoint.add(0, 0, 1); + } + if (schematicType.getKuerzel().equalsIgnoreCase("ws")) { + pastePoint = pastePoint.add(-1, 0, 1); + } + if (schematicType.getKuerzel().equalsIgnoreCase("as")) { + pastePoint = pastePoint.add(-1, 0, 1); + } + } + pasteBuilder.pastePoint(pastePoint); + regionHistory.remember(pasteBuilder.run()); + } + }; + } else { + testblock = Area.EMPTY; + } + + if (!testblock.isEmpty() && !build.isEmpty()) { + if (testblock.getMinPoint(false).getZ() > build.getMinPoint(false).getZ()) { + flagStorage.getBackedMap().put(Flag.TESTBLOCK, TestblockMode.SOUTH); + } else { + flagStorage.getBackedMap().put(Flag.TESTBLOCK, TestblockMode.NORTH); + } + } else { + flagStorage.getBackedMap().put(Flag.TESTBLOCK, TestblockMode.NO_VALUE); + } + + floorLevel = prototype.getFloorOffset() != 0 ? minPoint.getY() + prototype.getFloorOffset() : 0; + waterLevel = prototype.getWaterOffset() != 0 ? minPoint.getX() + prototype.getWaterOffset() : 0; + + File found = null; + File baseFile = new File(BauSystem.getInstance().getDataFolder().getParentFile(), "FightSystem"); + for (int version = Core.getVersion(); version >= 15; version--) { + File specific = new File(baseFile, prototype.getDisplayName() + version + ".yml"); + if (specific.exists()) { + found = specific; + break; + } + } + this.gameModeConfig = new GameModeConfig(found); + } + + @Override + public @NonNull UUID getID() { + return uuid; + } + + @Override + public @NonNull RegionType getType() { + return RegionType.NORMAL; + } + + @Override + public @NonNull FlagStorage getFlags() { + return flagStorage; + } + + @Override + public @NonNull Area getArea() { + return area; + } + + @Override + public @NonNull Area getBuildArea() { + return build; + } + + @Override + public @NonNull Area getTestblockArea() { + return testblock; + } + + @Override + public @NonNull GameModeConfig getGameModeConfig() { + return gameModeConfig; + } + + @Override + public @NonNull RegionHistory getHistory() { + return regionHistory; + } + + @Override + public @NonNull RegionBackups getBackups() { + return regionBackups; + } +} diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Prototype.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java similarity index 92% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Prototype.java rename to BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java index f4aefc56..3e4a7248 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/Prototype.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/Prototype.java @@ -1,7 +1,7 @@ /* * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -17,8 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.region; +package de.steamwar.bausystem.region.fixed; +import de.steamwar.bausystem.region.FixedRegionSystem; import lombok.AllArgsConstructor; import lombok.Getter; import yapion.hierarchy.types.YAPIONObject; @@ -125,11 +126,11 @@ public class Prototype { skinMap.put(displayName, new Skin(defaultSkin, null, schematicFile, testblockSchematicFile, buildSchematicFile)); } - if (PROTOTYPE_MAP.containsKey(name)) { - Region.getRegion(PROTOTYPE_MAP.remove(name)).forEach(region -> { - region._setPrototype(this); - }); - } + // if (PROTOTYPE_MAP.containsKey(name)) { + // Region.getRegion(PROTOTYPE_MAP.remove(name)).forEach(region -> { + // region._setPrototype(this); + // }); + // } PROTOTYPE_MAP.put(name, this); } @@ -208,19 +209,14 @@ public class Prototype { } } - public static Region generateRegion(String name, YAPIONObject regionConfig, YAPIONObject regionData) { + public static void generateRegion(String name, YAPIONObject regionConfig, YAPIONObject regionData) { Prototype prototype; if (regionData.containsKey("prototype", String.class)) { prototype = PROTOTYPE_MAP.get(regionData.getPlainValue("prototype")); } else { prototype = PROTOTYPE_MAP.get(regionConfig.getPlainValue("prototype")); } - FlagStorage flagStorage; - if (regionData.containsKey("flagStorage", YAPIONType.OBJECT)) { - flagStorage = FlagStorage.createStorage(regionData.getObject("flagStorage")); - } else { - flagStorage = new FlagStorage(); - } - return new Region(name, prototype, regionConfig, flagStorage, regionData); + FixedFlagStorage flagStorage = new FixedFlagStorage(regionData.getObjectOrSetDefault("flagStorage", new YAPIONObject())); + FixedRegionSystem.addRegion(new FixedRegion(name, flagStorage, prototype, regionConfig, regionData)); } } diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/PrototypeLoader.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/PrototypeLoader.java similarity index 93% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/PrototypeLoader.java rename to BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/PrototypeLoader.java index 851cdcfd..3bcdefff 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/PrototypeLoader.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/PrototypeLoader.java @@ -1,7 +1,7 @@ /* * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -17,9 +17,9 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.region.loader; +package de.steamwar.bausystem.region.fixed.loader; -import de.steamwar.bausystem.region.Prototype; +import de.steamwar.bausystem.region.fixed.Prototype; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; import yapion.hierarchy.diff.DiffDelete; diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/RegionLoader.java b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java similarity index 84% rename from BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/RegionLoader.java rename to BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java index 7a66dbba..e88c24e6 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/region/loader/RegionLoader.java +++ b/BauSystem/BauSystem_RegionFixed/src/de/steamwar/bausystem/region/fixed/loader/RegionLoader.java @@ -1,7 +1,7 @@ /* * This file is a part of the SteamWar software. * - * Copyright (C) 2021 SteamWar.de-Serverteam + * Copyright (C) 2020 SteamWar.de-Serverteam * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -17,11 +17,11 @@ * along with this program. If not, see . */ -package de.steamwar.bausystem.region.loader; +package de.steamwar.bausystem.region.fixed.loader; -import de.steamwar.bausystem.region.FlagStorage; -import de.steamwar.bausystem.region.GlobalRegion; -import de.steamwar.bausystem.region.Prototype; +import de.steamwar.bausystem.region.fixed.FixedGlobalFlagStorage; +import de.steamwar.bausystem.region.fixed.FixedGlobalRegion; +import de.steamwar.bausystem.region.fixed.Prototype; import de.steamwar.bausystem.worlddata.WorldData; import lombok.experimental.UtilityClass; import org.bukkit.Bukkit; @@ -80,12 +80,6 @@ public class RegionLoader { globalOptions = new YAPIONObject(); optionsYapionObject.add("global", globalOptions); } - FlagStorage flagStorage; - if (globalOptions.containsKey("flagStorage", YAPIONType.OBJECT)) { - flagStorage = FlagStorage.createStorage(globalOptions.getObject("flagStorage")); - } else { - flagStorage = new FlagStorage(); - } - new GlobalRegion(flagStorage, globalOptions); + FixedGlobalRegion.setFLAG_STORAGE(new FixedGlobalFlagStorage(globalOptions.getObjectOrSetDefault("flagStorage", new YAPIONObject()))); } } diff --git a/BauSystem/build.gradle.kts b/BauSystem/build.gradle.kts index ebb9422d..5c1f2608 100644 --- a/BauSystem/build.gradle.kts +++ b/BauSystem/build.gradle.kts @@ -27,6 +27,7 @@ tasks.build { } dependencies { + implementation(project(":BauSystem:BauSystem_RegionFixed")) implementation(project(":BauSystem:BauSystem_Main")) implementation(project(":BauSystem:BauSystem_15")) implementation(project(":BauSystem:BauSystem_18")) diff --git a/settings.gradle.kts b/settings.gradle.kts index 6665697f..3bb2a9d8 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -177,7 +177,8 @@ include( "BauSystem:BauSystem_19", "BauSystem:BauSystem_20", "BauSystem:BauSystem_21", - "BauSystem:BauSystem_Main" + "BauSystem:BauSystem_Main", + "BauSystem:BauSystem_RegionFixed" ) include("CommandFramework")