diff --git a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java
index 4403ec7..bd640fb 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFire.java
@@ -19,18 +19,15 @@
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 class CommandFire extends RegionToggleCommand {
- public CommandFire(){
- super(true);
- }
-
- public static ToggleCommand getInstance(){
- return getInstance(CommandFire.class);
+ public CommandFire() {
+ super();
}
@Override
@@ -45,15 +42,29 @@ public class CommandFire extends ToggleCommand {
String getDisableMessage(){
return "§aFeuerschaden aktiviert";
}
+ @Override
+ String getNoRegionMessage() {
+ return "§cDu befindest dich derzeit in keiner Region";
+ }
+
+ @Override
+ boolean toggle(Region region) {
+ region.setFire(!region.isFire());
+ return region.isFire();
+ }
@EventHandler
public void onFireDamage(BlockBurnEvent e) {
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFire()) e.setCancelled(true);
+ });
}
@EventHandler
public void onFireSpread(BlockSpreadEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFire()) 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 6443e32..9a9c80f 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandFreeze.java
@@ -1,36 +1,41 @@
-/*
- 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 .
-*/
+/*
+ *
+ * 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.world.Region;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.Material;
+import org.bukkit.entity.EntityType;
import org.bukkit.event.EventHandler;
import org.bukkit.event.block.*;
+import org.bukkit.event.entity.EntitySpawnEvent;
import org.bukkit.event.inventory.InventoryMoveItemEvent;
-public class CommandFreeze extends ToggleCommand {
+public class CommandFreeze extends RegionToggleCommand {
public CommandFreeze(){
- super(false);
- }
-
- public static ToggleCommand getInstance(){
- return getInstance(CommandFreeze.class);
+ super();
}
@Override
@@ -45,39 +50,75 @@ public class CommandFreeze extends ToggleCommand {
String getDisableMessage(){
return "§aWelt aufgetaut";
}
+ @Override
+ String getNoRegionMessage() {
+ return "§cDu befindest dich derzeit in keiner Region";
+ }
+
+ @Override
+ boolean toggle(Region region) {
+ region.setFreeze(!region.isFreeze());
+ return region.isFreeze();
+ }
+
+ @EventHandler
+ public void onEntitySpawn(EntitySpawnEvent e) {
+ Region.getRegion(e.getLocation(), region -> {
+ if (!region.isFreeze()) {
+ return;
+ }
+ if (e.getEntityType() == EntityType.FALLING_BLOCK) {
+ e.setCancelled(true);
+ }
+ });
+ }
@EventHandler
public void onPhysicsEvent(BlockPhysicsEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFreeze()) e.setCancelled(true);
+ });
}
@EventHandler
public void onPistonExtend(BlockPistonExtendEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFreeze()) e.setCancelled(true);
+ });
}
@EventHandler
public void onPistonRetract(BlockPistonRetractEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFreeze()) e.setCancelled(true);
+ });
}
@EventHandler
public void onBlockGrow(BlockGrowEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFreeze()) 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());
+ });
}
@EventHandler
public void onBlockDispense(BlockDispenseEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getBlock().getLocation(), region -> {
+ if (region.isFreeze()) e.setCancelled(true);
+ });
}
@EventHandler
public void onInventoryMoveEvent(InventoryMoveItemEvent e){
- e.setCancelled(true);
+ Region.getRegion(e.getDestination().getLocation(), region -> {
+ if (region.isFreeze()) 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..ae8960f 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,17 @@ 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.getRegion(player.getLocation(), region -> {
+ sender.sendMessage(BauSystem.PREFIX + "§eTNT§8: " + region.getTntMode().getName() + " §eFire§8: " + (region.isFire() ? "§aAUS" : "§cAN") + " §eFreeze§8: " + (region.isFreeze() ? "§aAN" : "§cAUS"));
+ }, () -> {
+ sender.sendMessage(BauSystem.PREFIX + "§7Du bist in keiner Region.");
+ });
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..6adcd6b 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);
+ 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..a75be05 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);
+ 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..c5ccad2 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/CommandTNT.java
@@ -36,12 +36,6 @@ 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"),
@@ -83,6 +77,10 @@ public class CommandTNT implements CommandExecutor, Listener {
return "§cEine Explosion hätte Blöcke im Baubereich zerstört";
}
+ private String getNoRegionMessage() {
+ return "§cDu befindest dich derzeit in keiner Region";
+ }
+
@Override
public boolean onCommand(CommandSender sender, Command command, String s, String[] args) {
if (!(sender instanceof Player)) return false;
@@ -93,74 +91,72 @@ 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) {
- 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;
- }
+ TNTMode finalRequestedMode = requestedMode;
+ String finalRequestedMessage = requestedMessage;
+ Region.getRegion(player.getLocation(), region -> {
+ if (finalRequestedMode != null) {
+ region.setTntMode(finalRequestedMode);
+ RegionToggleCommand.actionBar(region, finalRequestedMessage);
+ return;
+ }
+ switch (region.getTntMode()) {
+ case ON:
+ case ONLY_TB:
+ region.setTntMode(TNTMode.OFF);
+ RegionToggleCommand.actionBar(region, getDisableMessage());
+ break;
+ case OFF:
+ if (Region.buildAreaEnabled()) {
+ region.setTntMode(TNTMode.ONLY_TB);
+ RegionToggleCommand.actionBar(region, getTestblockEnableMessage());
+ } else {
+ region.setTntMode(TNTMode.ON);
+ RegionToggleCommand.actionBar(region, getEnableMessage());
+ }
+ break;
+ }
+ }, () -> RegionToggleCommand.actionBar(player, getNoRegionMessage()));
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 false;
+ 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..e44d889 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);
+ 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..7aaff41
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/commands/RegionToggleCommand.java
@@ -0,0 +1,83 @@
+/*
+ *
+ * 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 net.minecraft.server.v1_15_R1.BlockCactus;
+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 {
+
+ 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.getRegion(player.getLocation(), region -> {
+ if (toggle(region)) {
+ actionBar(region, getEnableMessage());
+ } else {
+ actionBar(region, getDisableMessage());
+ }
+ }, () -> actionBar(player, getNoRegionMessage()));
+ 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(Player player, String s) {
+ player.spigot().sendMessage(ChatMessageType.ACTION_BAR, TextComponent.fromLegacyText(s));
+ }
+
+ abstract String getNoRegionMessage();
+ abstract String getNoPermMessage();
+ abstract String getEnableMessage();
+ abstract String getDisableMessage();
+
+ /**
+ * {@code true} for {@link #getEnableMessage()}, {@code false} for {@link #getDisableMessage()}
+ */
+ abstract boolean toggle(Region region);
+
+}
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 extends ToggleCommand> 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..3faa945 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,12 @@ 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);
+ 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"));
+ }
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..3c170f7 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;
@@ -28,10 +29,12 @@ import org.bukkit.Location;
import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.entity.Player;
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,10 +42,6 @@ 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();
try {
@@ -64,23 +63,125 @@ public class Region {
}
}
+ public static boolean buildAreaEnabled() {
+ return buildArea;
+ }
+
+ public static Region getRegion(Player player) {
+ return getRegion(player.getLocation());
+ }
+
+ 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) {
+ getRegion(location, regionConsumer, () -> {});
+ }
+
+ 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();
+ }
+ }
+
public static List getRegions(){
return regions;
}
+ private static Region getRegionByName(String name) {
+ for (Region region : regions) {
+ if (region.name.equals(name)) return region;
+ }
+ return null;
+ }
+
+ 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);
regions.add(this);
}
+ private void link() {
+ if (optionsLinkedWith != null && linkedRegion == null) {
+ linkedRegion = getRegionByName(optionsLinkedWith);
+ }
+ }
+
+ public TNTMode getTntMode() {
+ return tntMode;
+ }
+
+ public void setTntMode(TNTMode tntMode) {
+ this.tntMode = tntMode;
+ link();
+ if (linkedRegion != null) {
+ linkedRegion.setTntModeOther(tntMode);
+ }
+ }
+
+ private void setTntModeOther(TNTMode tntMode) {
+ this.tntMode = tntMode;
+ }
+
+ public boolean isFreeze() {
+ return freeze;
+ }
+
+ public void setFreeze(boolean freeze) {
+ this.freeze = freeze;
+ link();
+ if (linkedRegion != null) {
+ linkedRegion.setFreezeOther(freeze);
+ }
+ }
+
+ public void setFreezeOther(boolean freeze) {
+ this.freeze = freeze;
+ }
+
+ public boolean isFire() {
+ return fire;
+ }
+
+ public void setFire(boolean fire) {
+ this.fire = fire;
+ link();
+ if (linkedRegion != null) {
+ linkedRegion.setFireOther(fire);
+ }
+ }
+
+ public void setFireOther(boolean fire) {
+ this.fire = fire;
+ }
+
public boolean inRegion(Location l){
return prototype.inRegion(this, l);
}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java b/BauSystem_Main/src/de/steamwar/bausystem/world/ScriptListener.java
index d0f2fc8..e50d7c4 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);
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) {