diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java index 4403ec7..9c341d0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java @@ -19,19 +19,12 @@ package de.steamwar.bausystem.commands; +import de.steamwar.bausystem.world.Region; import org.bukkit.event.EventHandler; import org.bukkit.event.block.BlockBurnEvent; import org.bukkit.event.block.BlockSpreadEvent; -public class CommandFire extends ToggleCommand { - - public CommandFire(){ - super(true); - } - - public static ToggleCommand getInstance(){ - return getInstance(CommandFire.class); - } +public class CommandFire extends RegionToggleCommand { @Override String getNoPermMessage() { @@ -46,14 +39,34 @@ public class CommandFire extends ToggleCommand { return "§aFeuerschaden aktiviert"; } + @Override + boolean toggle(Region region) { + region.setFire(!region.isFire()); + return region.isFire(); + } + + @Override + boolean toggleGlobal() { + Region.NoRegion.fire = !Region.NoRegion.fire; + return Region.NoRegion.fire; + } + @EventHandler public void onFireDamage(BlockBurnEvent e) { - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFire()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.fire) e.setCancelled(true); + }); } @EventHandler public void onFireSpread(BlockSpreadEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFire()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.fire) e.setCancelled(true); + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java index c158459..4873c01 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java @@ -1,6 +1,6 @@ -/* +/* 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 @@ -20,22 +20,14 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.world.Region; -import org.bukkit.entity.EntityType; +import org.bukkit.Material; import org.bukkit.event.EventHandler; import org.bukkit.event.block.*; import org.bukkit.event.entity.EntityChangeBlockEvent; import org.bukkit.event.entity.EntitySpawnEvent; import org.bukkit.event.inventory.InventoryMoveItemEvent; -public class CommandFreeze extends ToggleCommand { - - public CommandFreeze(){ - super(false); - } - - public static ToggleCommand getInstance(){ - return getInstance(CommandFreeze.class); - } +public class CommandFreeze extends RegionToggleCommand { @Override String getNoPermMessage() { @@ -50,48 +42,118 @@ public class CommandFreeze extends ToggleCommand { return "§aWelt aufgetaut"; } + @Override + boolean toggle(Region region) { + region.setFreeze(!region.isFreeze()); + return region.isFreeze(); + } + + @Override + boolean toggleGlobal() { + Region.NoRegion.freeze = !Region.NoRegion.freeze; + return Region.NoRegion.freeze; + } + @EventHandler public void onEntitySpawn(EntitySpawnEvent e) { - e.setCancelled(true); + Region.getRegion(e.getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); + } + + @EventHandler + public void onBlockCanBuild(BlockCanBuildEvent e) { + if (!e.isBuildable()) return; + Region.getRegion(e.getBlock().getLocation(), region -> { + if (!region.isFreeze()) { + return; + } + if (e.getMaterial() == Material.TNT) { + e.setBuildable(false); + e.getBlock().setType(Material.TNT, false); + } + }, () -> { + if (!Region.NoRegion.freeze) { + return; + } + if (e.getMaterial() == Material.TNT) { + e.setBuildable(false); + e.getBlock().setType(Material.TNT, false); + } + }); } @EventHandler public void onEntityChangeBlock(EntityChangeBlockEvent e) { - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onPhysicsEvent(BlockPhysicsEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onPistonExtend(BlockPistonExtendEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onPistonRetract(BlockPistonRetractEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onBlockGrow(BlockGrowEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onRedstoneEvent(BlockRedstoneEvent e){ - e.setNewCurrent(e.getOldCurrent()); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setNewCurrent(e.getOldCurrent()); + }, () -> { + if (Region.NoRegion.freeze) e.setNewCurrent(e.getOldCurrent()); + }); } @EventHandler public void onBlockDispense(BlockDispenseEvent e){ - e.setCancelled(true); + Region.getRegion(e.getBlock().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } @EventHandler public void onInventoryMoveEvent(InventoryMoveItemEvent e){ - e.setCancelled(true); + Region.getRegion(e.getDestination().getLocation(), region -> { + if (region.isFreeze()) e.setCancelled(true); + }, () -> { + if (Region.NoRegion.freeze) e.setCancelled(true); + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java index c6810f7..fd8fc56 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java @@ -20,12 +20,14 @@ package de.steamwar.bausystem.commands; import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.world.Region; import de.steamwar.core.TPSWatcher; import de.steamwar.sql.BauweltMember; import de.steamwar.sql.SteamwarUser; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; import java.util.List; @@ -33,10 +35,18 @@ public class CommandInfo implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if (!(sender instanceof Player)) { + return false; + } + Player player = (Player) sender; + sender.sendMessage(BauSystem.PREFIX + "Besitzer: §e" + SteamwarUser.get(BauSystem.getOwnerID()).getUserName()); - sender.sendMessage(BauSystem.PREFIX + "TNT-Schaden: " + CommandTNT.getTntMode().getName()); - sender.sendMessage(BauSystem.PREFIX + "Feuerschaden: " + (CommandFire.getInstance().isOn() ? "§aAUS" : "§cAN")); - sender.sendMessage(BauSystem.PREFIX + "Eingefroren: " + (CommandFreeze.getInstance().isOn() ? "§aJA" : "§cNEIN")); + Region region = Region.getRegion(player.getLocation()); + if (region == null) { + sender.sendMessage(BauSystem.PREFIX + "§eTNT§8: " + Region.NoRegion.tnt.getName() + " §eFire§8: " + (Region.NoRegion.fire ? "§aAUS" : "§cAN") + " §eFreeze§8: " + (Region.NoRegion.freeze ? "§aAN" : "§cAUS")); + } else { + sender.sendMessage(BauSystem.PREFIX + "§eTNT§8: " + region.getTntMode().getName() + " §eFire§8: " + (region.isFire() ? "§aAUS" : "§cAN") + " §eFreeze§8: " + (region.isFreeze() ? "§aAN" : "§cAUS")); + } List members = BauweltMember.getMembers(BauSystem.getOwnerID()); StringBuilder membermessage = new StringBuilder().append(BauSystem.PREFIX).append("Mitglieder: "); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java index f12afb7..b6a34d0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandProtect.java @@ -45,28 +45,26 @@ public class CommandProtect implements CommandExecutor { return false; } - for(Region region : Region.getRegions()){ - if(region.inRegion(player.getLocation()) && region.hasProtection()){ - try { - Schematic schem = null; - if(args.length > 0){ - schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); - if(schem == null){ - player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); - return false; - } - } - region.protect(schem); - player.sendMessage(BauSystem.PREFIX + "§7Boden geschützt"); - }catch(Exception e){ - player.sendMessage(BauSystem.PREFIX + "§cFehler beim Schützen der Region"); - Bukkit.getLogger().log(Level.WARNING, "Failed protect", e); - } - return false; - } + Region region = Region.getRegion(player.getLocation()); + if (region == null || !region.hasProtection()) { + player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner (M)WG-Region"); + return false; + } + try { + Schematic schem = null; + if(args.length > 0){ + schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); + if(schem == null){ + player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); + return false; + } + } + region.protect(schem); + player.sendMessage(BauSystem.PREFIX + "§7Boden geschützt"); + }catch(Exception e){ + player.sendMessage(BauSystem.PREFIX + "§cFehler beim Schützen der Region"); + Bukkit.getLogger().log(Level.WARNING, "Failed protect", e); } - - player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner (M)WG-Region"); return false; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java index 353fd22..934a383 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandReset.java @@ -45,29 +45,27 @@ public class CommandReset implements CommandExecutor { return false; } - for(Region region : Region.getRegions()){ - if(region.inRegion(player.getLocation())){ - try { - if(args.length > 0){ - Schematic schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); - if(schem == null){ - player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); - return false; - } - region.reset(schem); - }else{ - region.fastreset(); - } - player.sendMessage(BauSystem.PREFIX + "§7Region zurückgesetzt"); - }catch(Exception e){ - player.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen der Region"); - Bukkit.getLogger().log(Level.WARNING, "Failed reset", e); - } - return false; - } + Region region = Region.getRegion(player.getLocation()); + if (region == null) { + player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region"); + return false; + } + try { + if(args.length > 0){ + Schematic schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); + if(schem == null){ + player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); + return false; + } + region.reset(schem); + }else{ + region.fastreset(); + } + player.sendMessage(BauSystem.PREFIX + "§7Region zurückgesetzt"); + }catch(Exception e){ + player.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen der Region"); + Bukkit.getLogger().log(Level.WARNING, "Failed reset", e); } - - player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region"); return false; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java index 91eb203..c976f9a 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java @@ -23,8 +23,6 @@ import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.Permission; import de.steamwar.bausystem.world.Region; import de.steamwar.bausystem.world.Welt; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; import org.bukkit.Bukkit; import org.bukkit.command.Command; import org.bukkit.command.CommandExecutor; @@ -36,15 +34,9 @@ import org.bukkit.event.entity.EntityExplodeEvent; public class CommandTNT implements CommandExecutor, Listener { - private static TNTMode tntMode = Region.buildAreaEnabled() ? TNTMode.ONLY_TB : TNTMode.OFF; - - public static TNTMode getTntMode() { - return tntMode; - } - public enum TNTMode { ON("§aan"), - ONLY_TB("§7nur §eTestblock"), + ONLY_TB("§7Kein §eBaurahmen"), OFF("§caus"); private String name; @@ -76,7 +68,7 @@ public class CommandTNT implements CommandExecutor, Listener { } private String getTestblockEnableMessage() { - return "§aTNT-Schaden am Testblock aktiviert"; + return "§aTNT-Schaden außerhalb Baurahmen aktiviert"; } private String getDamageMessage() { @@ -93,74 +85,98 @@ public class CommandTNT implements CommandExecutor, Listener { return false; } + TNTMode requestedMode = null; + String requestedMessage = null; if (args.length != 0) { switch (args[0].toLowerCase()) { case "an": case "on": - tntMode = TNTMode.ON; - sendToActionBar(getEnableMessage()); - return false; + requestedMode = TNTMode.ON; + requestedMessage = getEnableMessage(); + break; case "aus": case "off": - tntMode = TNTMode.OFF; - sendToActionBar(getDisableMessage()); - return false; + requestedMode = TNTMode.OFF; + requestedMessage = getDisableMessage(); + break; case "testblock": case "tb": if (!Region.buildAreaEnabled()) break; - tntMode = TNTMode.ONLY_TB; - sendToActionBar(getTestblockEnableMessage()); - return false; + requestedMode = TNTMode.ONLY_TB; + requestedMessage = getTestblockEnableMessage(); + break; default: break; } } - switch (tntMode) { + Region region = Region.getRegion(player.getLocation()); + if (region == null) { + tntGlobalToggle(requestedMode, requestedMessage); + return false; + } + tntToggle(region, requestedMode, requestedMessage); + return false; + } + + private void tntGlobalToggle(TNTMode requestedMode, String requestedMessage) { + if (requestedMode != null && requestedMode != TNTMode.ONLY_TB) { + Region.NoRegion.tnt = requestedMode; + RegionToggleCommand.actionBar(requestedMessage); + return; + } + switch (Region.NoRegion.tnt) { case ON: case ONLY_TB: - tntMode = TNTMode.OFF; - sendToActionBar(getDisableMessage()); + Region.NoRegion.tnt = TNTMode.OFF; + RegionToggleCommand.actionBar(getDisableMessage()); break; case OFF: - if (Region.buildAreaEnabled()) { - tntMode = TNTMode.ONLY_TB; - sendToActionBar(getTestblockEnableMessage()); + Region.NoRegion.tnt = TNTMode.ON; + RegionToggleCommand.actionBar(getEnableMessage()); + break; + } + } + + private void tntToggle(Region region, TNTMode requestedMode, String requestedMessage) { + if (requestedMode != null && region.hasTestblock()) { + region.setTntMode(requestedMode); + RegionToggleCommand.actionBar(region, requestedMessage); + return; + } + switch (region.getTntMode()) { + case ON: + case ONLY_TB: + region.setTntMode(TNTMode.OFF); + RegionToggleCommand.actionBar(region, getDisableMessage()); + break; + case OFF: + if (Region.buildAreaEnabled() && region.hasTestblock()) { + region.setTntMode(TNTMode.ONLY_TB); + RegionToggleCommand.actionBar(region, getTestblockEnableMessage()); } else { - tntMode = TNTMode.ON; - sendToActionBar(getEnableMessage()); + region.setTntMode(TNTMode.ON); + RegionToggleCommand.actionBar(region, getEnableMessage()); } break; } - return false; } @EventHandler public void onExplode(EntityExplodeEvent event) { - switch (tntMode) { - case ON: - break; - case OFF: - event.blockList().clear(); - break; - case ONLY_TB: - boolean blocksDestroyed = event.blockList().removeIf(block -> { - for (Region region : Region.getRegions()) { - if (region.hasBuildRegion() && region.inBuildRegion(block.getLocation())) { - return true; - } - } - return false; - }); - if (blocksDestroyed) { - sendToActionBar(getDamageMessage()); - } - break; - } - } - - private void sendToActionBar(String message) { - Bukkit.getOnlinePlayers().forEach(p -> p.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(message))); + event.blockList().removeIf(block -> { + Region region = Region.getRegion(block.getLocation()); + if (region == null) { + return Region.NoRegion.tnt == TNTMode.OFF; + } + if (region.getTntMode() == TNTMode.OFF) return true; + if (region.getTntMode() == TNTMode.ON) return false; + if (region.hasBuildRegion() && region.inBuildRegion(block.getLocation())) { + RegionToggleCommand.actionBar(region, getDamageMessage()); + return true; + } + return false; + }); } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java index 6859231..87ffbf3 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTestblock.java @@ -45,28 +45,26 @@ public class CommandTestblock implements CommandExecutor { return false; } - for(Region region : Region.getRegions()){ - if(region.inRegion(player.getLocation()) && region.hasTestblock()){ - try { - Schematic schem = null; - if(args.length > 0){ - schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); - if(schem == null){ - player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); - return false; - } - } - region.resetTestblock(schem); - player.sendMessage(BauSystem.PREFIX + "§7Testblock zurückgesetzt"); - }catch(Exception e){ - player.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen des Testblocks"); - Bukkit.getLogger().log(Level.WARNING, "Failed testblock", e); - } - return false; - } + Region region = Region.getRegion(player.getLocation()); + if (region == null || !region.hasTestblock()) { + player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region"); + return false; + } + try { + Schematic schem = null; + if(args.length > 0){ + schem = Schematic.getSchemFromDB(args[0], player.getUniqueId()); + if(schem == null){ + player.sendMessage(BauSystem.PREFIX + "§cSchematic nicht gefunden"); + return false; + } + } + region.resetTestblock(schem); + player.sendMessage(BauSystem.PREFIX + "§7Testblock zurückgesetzt"); + }catch(Exception e){ + player.sendMessage(BauSystem.PREFIX + "§cFehler beim Zurücksetzen des Testblocks"); + Bukkit.getLogger().log(Level.WARNING, "Failed testblock", e); } - - player.sendMessage(BauSystem.PREFIX + "§cDu befindest dich derzeit in keiner Region"); return false; } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/RegionToggleCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/RegionToggleCommand.java new file mode 100644 index 0000000..6eba349 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/RegionToggleCommand.java @@ -0,0 +1,89 @@ +/* + * + * 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.commands; + +import de.steamwar.bausystem.BauSystem; +import de.steamwar.bausystem.Permission; +import de.steamwar.bausystem.world.Region; +import de.steamwar.bausystem.world.Welt; +import net.md_5.bungee.api.ChatMessageType; +import net.md_5.bungee.api.chat.TextComponent; +import org.bukkit.Bukkit; +import org.bukkit.command.Command; +import org.bukkit.command.CommandExecutor; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.event.Listener; + +public abstract class RegionToggleCommand implements CommandExecutor, Listener { + + public RegionToggleCommand() { + Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin()); + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { + if(!(sender instanceof Player)) + return false; + Player player = (Player) sender; + + if (Welt.noPermission(player, Permission.world)){ + player.sendMessage(BauSystem.PREFIX + getNoPermMessage()); + return false; + } + + Region region = Region.getRegion(player.getLocation()); + if (region == null) { + if (toggleGlobal()) { + actionBar(getEnableMessage()); + } else { + actionBar(getDisableMessage()); + } + return false; + } + if (toggle(region)) { + actionBar(region, getEnableMessage()); + } else { + actionBar(region, getDisableMessage()); + } + return false; + } + + public static void actionBar(Region region, String s) { + Bukkit.getOnlinePlayers().stream().filter(player -> region.inRegion(player.getLocation())).forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(s))); + } + + public static void actionBar(String s) { + Bukkit.getOnlinePlayers().stream().filter(player -> Region.getRegion(player.getLocation()) == null).forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(s))); + } + + abstract String getNoPermMessage(); + abstract String getEnableMessage(); + abstract String getDisableMessage(); + + /** + * {@code true} for {@link #getEnableMessage()}, {@code false} for {@link #getDisableMessage()} + */ + abstract boolean toggle(Region region); + abstract boolean toggleGlobal(); + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/ToggleCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/ToggleCommand.java deleted file mode 100644 index 0551a80..0000000 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/ToggleCommand.java +++ /dev/null @@ -1,87 +0,0 @@ -/* - 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.commands; - -import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.Permission; -import de.steamwar.bausystem.world.Welt; -import net.md_5.bungee.api.ChatMessageType; -import net.md_5.bungee.api.chat.TextComponent; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - -import java.util.HashMap; -import java.util.Map; - -public abstract class ToggleCommand implements CommandExecutor, Listener { - - private static Map, Boolean> enabled = new HashMap<>(); - private static Map, ToggleCommand> instance = new HashMap<>(); - - ToggleCommand(boolean on){ - enabled.put(getClass(), false); - if(on) - toggle(); - instance.put(getClass(), this); - } - - @Override - public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { - if(!(sender instanceof Player)) - return false; - Player player = (Player) sender; - - if (Welt.noPermission(player, Permission.world)){ - player.sendMessage(BauSystem.PREFIX + getNoPermMessage()); - return false; - } - - toggle(); - return false; - } - - static ToggleCommand getInstance(Class clazz){ - return instance.get(clazz); - } - - abstract String getNoPermMessage(); - abstract String getEnableMessage(); - abstract String getDisableMessage(); - - public boolean isOn(){ - return enabled.get(getClass()); - } - - public void toggle(){ - enabled.compute(getClass(), (clazz, value) -> !value); - if(enabled.get(getClass())){ - Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin()); - Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(getEnableMessage()))); - }else{ - HandlerList.unregisterAll(this); - Bukkit.getOnlinePlayers().forEach(player -> player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(getDisableMessage()))); - } - } -} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java index 8aaf994..316cf00 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java @@ -19,8 +19,6 @@ package de.steamwar.bausystem.world; -import de.steamwar.bausystem.commands.CommandFreeze; -import de.steamwar.bausystem.commands.CommandTNT; import de.steamwar.bausystem.commands.CommandTPSLimiter; import de.steamwar.bausystem.tracer.record.RecordStateMachine; import de.steamwar.core.TPSWatcher; @@ -61,8 +59,16 @@ public class BauScoreboard implements Listener { strings.add("§1"); strings.add("§eUhrzeit§8: §7" + new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime())); strings.add("§2"); - strings.add("§eTNT§8: " + CommandTNT.getTntMode().getName()); - strings.add("§eFreeze§8: " + (CommandFreeze.getInstance().isOn() ? "§aan" : "§caus")); + Region region = Region.getRegion(p.getLocation()); + if (region != null) { + strings.add("§eTNT§8: " + region.getTntMode().getName()); + strings.add("§eFreeze§8: " + (region.isFreeze() ? "§aan" : "§caus")); + strings.add("§eFire§8: " + (region.isFire() ? "§aaus" : "§can")); + } else { + strings.add("§eTNT§8: " + Region.NoRegion.tnt.getName()); + strings.add("§eFreeze§8: " + (Region.NoRegion.freeze ? "§aan" : "§caus")); + strings.add("§eFire§8: " + (Region.NoRegion.fire ? "§aaus" : "§can")); + } strings.add("§eTrace§8: " + RecordStateMachine.getRecordStatus().getName()); strings.add("§eLoader§8: " + (AutoLoader.hasLoader(p) ? "§aan" : "§caus")); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java b/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java index 82e9f96..781a0b7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.world; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import de.steamwar.bausystem.commands.CommandTNT.TNTMode; import de.steamwar.core.Core; import de.steamwar.sql.NoClipboardException; import de.steamwar.sql.Schematic; @@ -32,6 +33,7 @@ import org.bukkit.configuration.file.YamlConfiguration; import java.io.File; import java.io.IOException; import java.util.*; +import java.util.function.Consumer; import java.util.logging.Level; public class Region { @@ -39,8 +41,11 @@ public class Region { private static final List regions = new ArrayList<>(); private static boolean buildArea = false; - public static boolean buildAreaEnabled() { - return buildArea; + public static class NoRegion { + private NoRegion() {} + public static TNTMode tnt = TNTMode.OFF; + public static boolean fire = false; + public static boolean freeze = false; } static{ @@ -64,23 +69,95 @@ public class Region { } } - public static List getRegions(){ - return regions; + public static boolean buildAreaEnabled() { + return buildArea; } + public static Region getRegion(Location location) { + for (Region region : regions) { + if (region.inRegion(location)) return region; + } + return null; + } + + public static void getRegion(Location location, Consumer regionConsumer, Runnable noRegion) { + boolean b = true; + for (Region region : regions) { + if (region.inRegion(location)) { + regionConsumer.accept(region); + b = false; + } + } + if (b) noRegion.run(); + } + + private final String name; private final int minX; private final int minY; private final int minZ; private final Prototype prototype; + private final String optionsLinkedWith; // nullable + private Region linkedRegion = null; // nullable + + private TNTMode tntMode = Region.buildAreaEnabled() ? TNTMode.ONLY_TB : TNTMode.OFF; + private boolean freeze = false; + private boolean fire = false; private Region(ConfigurationSection config){ + name = config.getName(); minX = config.getInt("minX"); minY = config.getInt("minY"); minZ = config.getInt("minZ"); prototype = Prototype.prototypes.get(config.getString("prototype")); + optionsLinkedWith = config.getString("optionsLinkedWith", null); + if (!hasTestblock()) tntMode = TNTMode.OFF; regions.add(this); } + private void setLinkedRegion(Consumer regionConsumer) { + if (optionsLinkedWith == null) { + return; + } + if (linkedRegion != null) { + regionConsumer.accept(linkedRegion); + return; + } + for (Region region : regions) { + if (region.name.equals(name)) { + linkedRegion = region; + regionConsumer.accept(linkedRegion); + return; + } + } + } + + public TNTMode getTntMode() { + return tntMode; + } + + public void setTntMode(TNTMode tntMode) { + this.tntMode = tntMode; + setLinkedRegion(region -> region.tntMode = tntMode); + } + + public boolean isFreeze() { + return freeze; + } + + public void setFreeze(boolean freeze) { + this.freeze = freeze; + setLinkedRegion(region -> region.freeze = freeze); + } + + public boolean isFire() { + return fire; + } + + public void setFire(boolean fire) { + this.fire = fire; + setLinkedRegion(region -> region.fire = fire); + } + public boolean inRegion(Location l){ return prototype.inRegion(this, l); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java index 691fa29..47d49c0 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/RegionListener.java @@ -40,7 +40,7 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.Action; import org.bukkit.event.block.BlockBreakEvent; -import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.block.BlockCanBuildEvent; import org.bukkit.event.block.SignChangeEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerInteractEvent; @@ -71,13 +71,13 @@ public class RegionListener implements Listener { } @EventHandler(priority = EventPriority.LOWEST) - public void onBlockPlace(BlockPlaceEvent e) { + public void onBlockCanBuild(BlockCanBuildEvent e) { Player p = e.getPlayer(); try{ if (Welt.noPermission(p, Permission.build)){ p.sendMessage(BauSystem.PREFIX + "§cDu darfst hier keine Blöcke platzieren"); - e.setCancelled(true); + e.setBuildable(false); } }catch(NullPointerException ex){ //ignored, caused by worldedit brushes diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index 3fb474c..60c3121 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -20,8 +20,6 @@ package de.steamwar.bausystem.world; import de.steamwar.bausystem.BauSystem; -import de.steamwar.bausystem.commands.CommandFire; -import de.steamwar.bausystem.commands.CommandFreeze; import de.steamwar.bausystem.commands.CommandScript; import de.steamwar.bausystem.commands.CommandTNT; import de.steamwar.bausystem.tracer.record.RecordStateMachine; @@ -153,6 +151,8 @@ public class ScriptListener implements Listener { index = ifJumpIndex; } continue; + default: + break; } PlayerCommandPreprocessEvent preprocessEvent = new PlayerCommandPreprocessEvent(player, "/" + command); @@ -235,6 +235,8 @@ public class ScriptListener implements Listener { case "--": add(scriptExecutor, args[0], -1); return; + default: + break; } setValue(scriptExecutor, args[0], args[1]); } @@ -280,17 +282,19 @@ public class ScriptListener implements Listener { } private static int getValue(ScriptExecutor scriptExecutor, String key) { + Region region = Region.getRegion(scriptExecutor.player.getLocation()); switch (key) { case "trace": return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0; case "tnt": - return CommandTNT.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; + return region == null || region.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; case "freeze": - return CommandFreeze.getInstance().isOn() ? 1 : 0; + return region == null || !region.isFreeze() ? 0 : 1; case "fire": - return CommandFire.getInstance().isOn() ? 1 : 0; + return region == null || !region.isFire() ? 0 : 1; + default: + return scriptExecutor.variables.getOrDefault(key, 0); } - return scriptExecutor.variables.getOrDefault(key, 0); } private static boolean isVariable(ScriptExecutor scriptExecutor, String key) {