diff --git a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java index 9a7276b..96bde54 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/BauSystem.java @@ -82,6 +82,7 @@ public class BauSystem extends JavaPlugin implements Listener { getCommand("reset").setExecutor(new CommandReset()); getCommand("speed").setExecutor(new CommandSpeed()); getCommand("tnt").setExecutor(new CommandTNT()); + getCommand("tnt").setTabCompleter(new CommandTNTTabComplete()); getCommand("fire").setExecutor(new CommandFire()); getCommand("freeze").setExecutor(new CommandFreeze()); getCommand("testblock").setExecutor(new CommandTestblock()); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java index 0b506d9..c6810f7 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandInfo.java @@ -34,7 +34,7 @@ public class CommandInfo implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String label, String[] args) { sender.sendMessage(BauSystem.PREFIX + "Besitzer: §e" + SteamwarUser.get(BauSystem.getOwnerID()).getUserName()); - sender.sendMessage(BauSystem.PREFIX + "TNT-Schaden: " + (CommandTNT.getInstance().isOn() ? "§aAUS" : "§cAN")); + 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")); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java index 7298c9b..23ab3b6 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java @@ -19,34 +19,148 @@ 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.EventHandler; +import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityExplodeEvent; -public class CommandTNT extends ToggleCommand { +public class CommandTNT implements CommandExecutor, Listener { - public CommandTNT(){ - super(true); + private static TNTMode tntMode = TNTMode.OFF; + + public static TNTMode getTntMode() { + return tntMode; } - public static ToggleCommand getInstance(){ - return getInstance(CommandTNT.class); + public enum TNTMode { + ON("§aan"), + ONLY_TB("§7nur §eTestblock"), + OFF("§caus"); + + private String name; + + TNTMode(String name) { + this.name = name; + } + + public String getName() { + return name; + } + } - @Override - String getNoPermMessage() { + public CommandTNT() { + Bukkit.getPluginManager().registerEvents(this, BauSystem.getPlugin()); + } + + private String getNoPermMessage() { return "§cDu darfst hier nicht TNT-Schaden (de-)aktivieren"; } - @Override - String getEnableMessage(){ - return "§cTNT-Schaden deaktiviert"; - } - @Override - String getDisableMessage(){ + + private String getEnableMessage() { return "§aTNT-Schaden aktiviert"; } - @EventHandler - public void onExplode(EntityExplodeEvent e) { - e.blockList().clear(); + private String getDisableMessage() { + return "§cTNT-Schaden deaktiviert"; } + + private String getTestblockEnableMessage() { + return "§aTNT-Schaden am Testblock aktiviert"; + } + + private String getDamageMessage() { + return "§cEine Explosion hätte Blöcke im Baubereich zerstört"; + } + + @Override + public boolean onCommand(CommandSender sender, Command command, String s, 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; + } + + if (args.length != 0) { + switch (args[0].toLowerCase()) { + case "an": + case "on": + tntMode = TNTMode.ON; + sendToActionBar(getEnableMessage()); + return false; + case "aus": + case "off": + tntMode = TNTMode.OFF; + sendToActionBar(getDisableMessage()); + return false; + case "testblock": + case "tb": + if (!Region.buildAreaEnabled()) break; + tntMode = TNTMode.ONLY_TB; + sendToActionBar(getTestblockEnableMessage()); + return false; + default: + break; + } + } + + switch (tntMode) { + case ON: + case ONLY_TB: + tntMode = TNTMode.OFF; + sendToActionBar(getDisableMessage()); + break; + case OFF: + if (Region.buildAreaEnabled()) { + tntMode = TNTMode.ONLY_TB; + sendToActionBar(getTestblockEnableMessage()); + } else { + tntMode = TNTMode.ON; + sendToActionBar(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))); + } + } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNTTabComplete.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNTTabComplete.java new file mode 100644 index 0000000..dbc18b1 --- /dev/null +++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNTTabComplete.java @@ -0,0 +1,67 @@ +/* + * + * 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.world.Region; +import org.bukkit.command.Command; +import org.bukkit.command.CommandSender; +import org.bukkit.command.TabCompleter; +import org.bukkit.entity.Player; + +import java.util.ArrayList; +import java.util.List; + +public class CommandTNTTabComplete implements TabCompleter { + + @Override + public List onTabComplete(CommandSender sender, Command command, String label, String[] args) { + if(!(sender instanceof Player)) return new ArrayList<>(); + return tntTabComplete(args); + } + + private List tntTabComplete(String[] args) { + List tabComplete = new ArrayList<>(); + tabComplete.add("an"); + tabComplete.add("on"); + tabComplete.add("aus"); + tabComplete.add("off"); + if (Region.buildAreaEnabled()) { + tabComplete.add("testblock"); + tabComplete.add("tb"); + } + + if (args.length >= 2) { + return new ArrayList<>(); + } + return manageList(tabComplete, args, 0); + } + + private List manageList(List strings, String[] args, int index) { + for (int i = strings.size() - 1; i >= 0; i--) { + if (!strings.get(i).startsWith(args[index])) { + strings.remove(i); + } + } + return strings; + } + +} diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java index c15abc1..8aaf994 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/BauScoreboard.java @@ -61,7 +61,7 @@ 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.getInstance().isOn() ? "§aan" : "§caus")); + strings.add("§eTNT§8: " + CommandTNT.getTntMode().getName()); strings.add("§eFreeze§8: " + (CommandFreeze.getInstance().isOn() ? "§aan" : "§caus")); 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 1a13714..82e9f96 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/Region.java @@ -37,6 +37,11 @@ import java.util.logging.Level; public class Region { private static final List regions = new ArrayList<>(); + private static boolean buildArea = false; + + public static boolean buildAreaEnabled() { + return buildArea; + } static{ YamlConfiguration config = new YamlConfiguration(); @@ -80,6 +85,14 @@ public class Region { return prototype.inRegion(this, l); } + public boolean hasBuildRegion() { + return prototype.buildArea != null; + } + + public boolean inBuildRegion(Location l) { + return prototype.buildArea.inRegion(this, l); + } + public void fastreset(){ prototype.fastreset(this); } @@ -119,6 +132,8 @@ public class Region { private final boolean rotate; private final Prototype testblock; //nullable + private final Prototype buildArea; //nullable + private final String protectSchematic; //nullable private Prototype(ConfigurationSection config){ @@ -133,9 +148,16 @@ public class Region { ConfigurationSection testblockSection = config.getConfigurationSection("testblock"); testblock = testblockSection != null ? new Prototype(testblockSection) : null; + + ConfigurationSection buildAreaSection = config.getConfigurationSection("buildArea"); + buildArea = buildAreaSection != null ? new Prototype(buildAreaSection) : null; + if (buildArea != null) { + Region.buildArea = true; + } + protectSchematic = config.getString("protection", null); - if(!config.getName().equals("testblock")) + if(!config.getName().equals("testblock") && !config.getName().equals("buildArea")) prototypes.put(config.getName(), this); } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java index 762aff6..d0f2fc8 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java @@ -284,7 +284,7 @@ public class ScriptListener implements Listener { case "trace": return RecordStateMachine.getRecordStatus().isTracing() ? 1 : 0; case "tnt": - return CommandTNT.getInstance().isOn() ? 1 : 0; + return CommandTNT.getTntMode() == CommandTNT.TNTMode.OFF ? 0 : 1; case "freeze": return CommandFreeze.getInstance().isOn() ? 1 : 0; case "fire":