diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/.gitkeep b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/.gitkeep
new file mode 100644
index 00000000..e69de29b
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/DepthCounter.java b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/DepthCounter.java
deleted file mode 100644
index 9c26831d..00000000
--- a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/DepthCounter.java
+++ /dev/null
@@ -1,101 +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.features.testblock;
-
-import de.steamwar.bausystem.BauSystem;
-import de.steamwar.bausystem.linkage.LinkageType;
-import de.steamwar.bausystem.linkage.Linked;
-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 org.bukkit.Bukkit;
-import org.bukkit.Material;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.EntityExplodeEvent;
-import org.bukkit.util.Vector;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.DoubleBinaryOperator;
-
-@Linked(LinkageType.LISTENER)
-public class DepthCounter implements Listener {
-
- private final Set current = new HashSet<>();
- private final Map minVectors = new HashMap<>();
- private final Map maxVectors = new HashMap<>();
-
- @EventHandler
- public void onEntityExplode(EntityExplodeEvent event) {
- Region region = Region.getRegion(event.getLocation());
- boolean testblock = event.blockList().stream().anyMatch(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.NORMAL));
- if (!testblock) {
- return;
- }
- Vector minVector = blockVector(event.getEntity().getLocation().toVector());
- Vector maxVector = blockVector(event.getEntity().getLocation().toVector());
- event.blockList().forEach(block -> {
- if (block.getType() == Material.AIR) {
- return;
- }
- minVector.setX(Math.min(minVector.getX(), block.getX()));
- minVector.setY(Math.min(minVector.getY(), block.getY()));
- minVector.setZ(Math.min(minVector.getZ(), block.getZ()));
-
- maxVector.setX(Math.max(maxVector.getX(), block.getX()));
- maxVector.setY(Math.max(maxVector.getY(), block.getY()));
- maxVector.setZ(Math.max(maxVector.getZ(), block.getZ()));
- });
-
- compute(minVectors.computeIfAbsent(region, region1 -> minVector), minVector, Math::min);
- compute(maxVectors.computeIfAbsent(region, region1 -> maxVector), maxVector, Math::max);
-
- if (!current.contains(region)) {
- current.add(region);
- Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
- Vector minVectorRemoved = minVectors.remove(region);
- Vector maxVectorRemoved = maxVectors.remove(region);
-
- Vector dimensions = maxVectorRemoved.subtract(minVectorRemoved);
- dimensions.setX(Math.abs(dimensions.getX()));
- dimensions.setY(Math.abs(dimensions.getY()));
- dimensions.setZ(Math.abs(dimensions.getZ()));
-
- RegionUtils.message(region, BauSystem.PREFIX + "X: " + dimensions.getBlockX() + " Y: " + dimensions.getBlockY() + " Z: " + dimensions.getBlockZ());
- current.remove(region);
- }, 10);
- }
- }
-
- private Vector blockVector(Vector vector) {
- return new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
- }
-
- private void compute(Vector v1, Vector v2, DoubleBinaryOperator function) {
- v1.setX(function.applyAsDouble(v1.getX(), v2.getX()));
- v1.setY(function.applyAsDouble(v1.getY(), v2.getY()));
- v1.setZ(function.applyAsDouble(v1.getZ(), v2.getZ()));
- }
-
-}
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/CountMode.java b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/CountMode.java
new file mode 100644
index 00000000..7971b63a
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/CountMode.java
@@ -0,0 +1,34 @@
+/*
+ * 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.features.testblock.depthcounter;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+
+
+public enum CountMode {
+
+ X,
+ Y,
+ Z;
+
+ public static final Set ALL = new HashSet<>(Arrays.asList(values()));
+}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounter.java b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounter.java
new file mode 100644
index 00000000..8b65a849
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounter.java
@@ -0,0 +1,109 @@
+/*
+ * 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.features.testblock.depthcounter;
+
+import de.steamwar.bausystem.BauSystem;
+import de.steamwar.bausystem.linkage.LinkageType;
+import de.steamwar.bausystem.linkage.Linked;
+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 java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.stream.Collectors;
+import lombok.experimental.UtilityClass;
+import org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityExplodeEvent;
+import org.bukkit.util.Vector;
+
+import java.util.function.DoubleBinaryOperator;
+
+@UtilityClass
+public class DepthCounter {
+
+ public final Set current = new HashSet<>();
+ public final Map minVectors = new HashMap<>();
+ public final Map maxVectors = new HashMap<>();
+ public final Map> playerSettings = new HashMap<>();
+
+ public void toggleMode(final Player p, final CountMode countMode) {
+ if (isActive(p, countMode)) {
+ removeMode(p, countMode);
+ } else {
+ addMode(p, countMode);
+ }
+ }
+
+ public boolean isActive(final Player p, final CountMode countMode) {
+ final Set countModes = playerSettings.get(p);
+ return countModes != null && countModes.contains(countMode);
+ }
+
+ public void addMode(final Player p, final CountMode countMode) {
+ final Set countModes = playerSettings.get(p);
+ if (countModes != null) {
+ countModes.add(countMode);
+ } else {
+ playerSettings.put(p, new HashSet<>(Collections.singletonList(countMode)));
+ }
+ }
+
+ public void removeMode(final Player p, final CountMode countMode) {
+ final Set countModes = playerSettings.get(p);
+ if (countModes != null) {
+ countModes.remove(countMode);
+ if (countModes.isEmpty()) {
+ removePlayer(p);
+ }
+ }
+ }
+
+ public void setModes(final Player p, final Set countModes) {
+ playerSettings.put(p, countModes);
+ }
+
+ public void removePlayer(final Player p) {
+ playerSettings.remove(p);
+ }
+
+ public Vector blockVector(Vector vector) {
+ return new Vector(vector.getBlockX(), vector.getBlockY(), vector.getBlockZ());
+ }
+
+ public Set getModes(Player p) {
+ final Set countModes = playerSettings.get(p);
+ return countModes == null ? Collections.emptySet() : countModes;
+ }
+
+ public boolean hasModes(Player p) {
+ return !getModes(p).isEmpty();
+ }
+
+ public void compute(Vector v1, Vector v2, DoubleBinaryOperator function) {
+ v1.setX(function.applyAsDouble(v1.getX(), v2.getX()));
+ v1.setY(function.applyAsDouble(v1.getY(), v2.getY()));
+ v1.setZ(function.applyAsDouble(v1.getZ(), v2.getZ()));
+ }
+}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterCommand.java
new file mode 100644
index 00000000..1775657a
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterCommand.java
@@ -0,0 +1,65 @@
+/*
+ * 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.features.testblock.depthcounter;
+
+import de.steamwar.bausystem.BauSystem;
+import de.steamwar.bausystem.config.ColorConfig;
+import de.steamwar.bausystem.linkage.LinkageType;
+import de.steamwar.bausystem.linkage.Linked;
+import de.steamwar.command.SWCommand;
+import org.bukkit.entity.Player;
+
+
+@Linked(LinkageType.COMMAND)
+public class DepthCounterCommand extends SWCommand {
+
+ public DepthCounterCommand() {
+ super("depthcounter", "depthcount", "dcounter", "dcount");
+ }
+
+ @Register
+ public void genericHelp(Player p, String... args) {
+ //TODO
+ }
+
+ @Register("toggle")
+ public void toggleCommand(Player p, CountMode countMode) {
+ DepthCounter.toggleMode(p, countMode);
+ p.sendMessage(BauSystem.PREFIX + "Aktive Zählmodi: " + ColorConfig.HIGHLIGHT + DepthCounter.getModes(p) + ColorConfig.BASE + ".");
+ }
+
+ @Register("enable")
+ public void enableCommand(Player p) {
+ DepthCounter.setModes(p, CountMode.ALL);
+ p.sendMessage(BauSystem.PREFIX + "Du hast den Tiefenzähler aktiviert.");
+ p.sendMessage(BauSystem.PREFIX + "Aktive Zählmodi: " + ColorConfig.HIGHLIGHT + DepthCounter.getModes(p) + ColorConfig.BASE + ".");
+ }
+
+ @Register("disable")
+ public void disableCommand(Player p) {
+ DepthCounter.removePlayer(p);
+ p.sendMessage(BauSystem.PREFIX + "Du hast den Tiefenzähler deaktiviert.");
+ }
+
+ @Register("info")
+ public void infoCommand(Player p) {
+ p.sendMessage(BauSystem.PREFIX + "Aktive Zählmodi: " + ColorConfig.HIGHLIGHT + DepthCounter.getModes(p) + ColorConfig.BASE + ".");
+ }
+}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterListener.java b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterListener.java
new file mode 100644
index 00000000..1d6227b0
--- /dev/null
+++ b/BauSystem_Main/src/de/steamwar/bausystem/features/testblock/depthcounter/DepthCounterListener.java
@@ -0,0 +1,91 @@
+/*
+ * 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.features.testblock.depthcounter;
+
+import de.steamwar.bausystem.BauSystem;
+import de.steamwar.bausystem.config.ColorConfig;
+import de.steamwar.bausystem.linkage.LinkageType;
+import de.steamwar.bausystem.linkage.Linked;
+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 org.bukkit.Bukkit;
+import org.bukkit.Material;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.entity.EntityExplodeEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+import org.bukkit.util.Vector;
+
+
+@Linked(LinkageType.LISTENER)
+public class DepthCounterListener implements Listener {
+
+ @EventHandler
+ public void onEntityExplode(EntityExplodeEvent event) {
+ Region region = Region.getRegion(event.getLocation());
+ boolean testblock = event.blockList().stream().anyMatch(block -> region.inRegion(block.getLocation(), RegionType.TESTBLOCK, RegionExtensionType.NORMAL));
+ if (!testblock) {
+ return;
+ }
+ Vector minVector = DepthCounter.blockVector(event.getEntity().getLocation().toVector());
+ Vector maxVector = DepthCounter.blockVector(event.getEntity().getLocation().toVector());
+ event.blockList().forEach(block -> {
+ if (block.getType() == Material.AIR) {
+ return;
+ }
+ minVector.setX(Math.min(minVector.getX(), block.getX()));
+ minVector.setY(Math.min(minVector.getY(), block.getY()));
+ minVector.setZ(Math.min(minVector.getZ(), block.getZ()));
+
+ maxVector.setX(Math.max(maxVector.getX(), block.getX()));
+ maxVector.setY(Math.max(maxVector.getY(), block.getY()));
+ maxVector.setZ(Math.max(maxVector.getZ(), block.getZ()));
+ });
+
+ DepthCounter.compute(DepthCounter.minVectors.computeIfAbsent(region, region1 -> minVector), minVector, Math::min);
+ DepthCounter.compute(DepthCounter.maxVectors.computeIfAbsent(region, region1 -> maxVector), maxVector, Math::max);
+
+ if (!DepthCounter.current.contains(region)) {
+ DepthCounter.current.add(region);
+ Bukkit.getScheduler().runTaskLater(BauSystem.getInstance(), () -> {
+ Vector minVectorRemoved = DepthCounter.minVectors.remove(region);
+ Vector maxVectorRemoved = DepthCounter.maxVectors.remove(region);
+
+ Vector dimensions = maxVectorRemoved.subtract(minVectorRemoved);
+ dimensions.setX(Math.abs(dimensions.getX()));
+ dimensions.setY(Math.abs(dimensions.getY()));
+ dimensions.setZ(Math.abs(dimensions.getZ()));
+
+ RegionUtils.message(region, player -> !DepthCounter.hasModes(player) ? null : (BauSystem.PREFIX
+ + (DepthCounter.isActive(player, CountMode.X) ? "X: " + dimensions.getBlockX() + " " : "")
+ + (DepthCounter.isActive(player, CountMode.Y) ? "Y: " + dimensions.getBlockY() + " " : "")
+ + (DepthCounter.isActive(player, CountMode.Z) ? "Z: " + dimensions.getBlockZ() + " " : "")));
+ DepthCounter.current.remove(region);
+ }, 10);
+ }
+ }
+
+ @EventHandler
+ public void onLeave(PlayerQuitEvent event) {
+ DepthCounter.removePlayer(event.getPlayer());
+ }
+}
\ No newline at end of file
diff --git a/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java b/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java
index 25238294..ea93ba26 100644
--- a/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java
+++ b/BauSystem_Main/src/de/steamwar/bausystem/region/RegionUtils.java
@@ -6,12 +6,15 @@ import de.steamwar.bausystem.region.loader.RegionLoader;
import de.steamwar.bausystem.region.utils.RegionExtensionType;
import de.steamwar.bausystem.region.utils.RegionType;
import de.steamwar.core.VersionedCallable;
+import java.util.function.Function;
import lombok.experimental.UtilityClass;
import net.md_5.bungee.api.ChatMessageType;
import net.md_5.bungee.api.chat.TextComponent;
import org.bukkit.Bukkit;
import java.io.File;
+import org.bukkit.entity.Player;
+
@UtilityClass
public class RegionUtils {
@@ -24,6 +27,17 @@ public class RegionUtils {
Bukkit.getOnlinePlayers().stream().filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)).forEach(player -> player.sendMessage(s));
}
+ public static void message(Region region, Function function) {
+ Bukkit.getOnlinePlayers().stream().filter(player -> region.inRegion(player.getLocation(), RegionType.NORMAL, RegionExtensionType.NORMAL)).forEach(player -> {
+ String message = function.apply(player);
+ if (message == null) {
+ return;
+ }
+
+ player.sendMessage(message);
+ });
+ }
+
static EditSession paste(File file, Point pastePoint, PasteOptions pasteOptions) {
return VersionedCallable.call(new VersionedCallable<>(() -> Region_15.paste(file, pastePoint, pasteOptions), 15));
}