diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java
new file mode 100644
index 00000000..efd987d0
--- /dev/null
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java
@@ -0,0 +1,81 @@
+/*
+ * This file is a part of the SteamWar software.
+ *
+ * Copyright (C) 2024 SteamWar.de-Serverteam
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see .
+ */
+
+package de.steamwar.bausystem.features.world;
+
+import com.sk89q.worldedit.regions.RegionSelector;
+import de.steamwar.bausystem.shared.Pair;
+import de.steamwar.bausystem.utils.WorldEditUtils;
+import de.steamwar.linkage.Linked;
+import de.steamwar.sql.SteamwarUser;
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerJoinEvent;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.io.*;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Linked
+public class WorldEditSelectionSaver implements Listener {
+
+ private File WORLD_EDIT_SELECTIONS = new File(Bukkit.getWorlds().get(0).getWorldFolder(), "world_edit_selections");
+
+ {
+ WORLD_EDIT_SELECTIONS.mkdir();
+ }
+
+ @EventHandler
+ public void onPlayerJoin(PlayerJoinEvent event) {
+ SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId());
+ File file = new File(WORLD_EDIT_SELECTIONS, steamwarUser.getId() + "");
+ if (!file.exists()) return;
+ try {
+ BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
+ Class extends RegionSelector> clazz = (Class extends RegionSelector>) Class.forName(bufferedReader.readLine());
+ List locations = bufferedReader.lines()
+ .map(s -> s.split(" "))
+ .map(strings -> new Location(event.getPlayer().getWorld(), Integer.parseInt(strings[0]), Integer.parseInt(strings[1]), Integer.parseInt(strings[2])))
+ .collect(Collectors.toList());
+ WorldEditUtils.setVertices(event.getPlayer(), clazz, locations);
+ } catch (IOException | ClassNotFoundException e) {
+ file.delete();
+ }
+ }
+
+ @EventHandler
+ public void onPlayerQuit(PlayerQuitEvent event) {
+ SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId());
+ Pair, List> data = WorldEditUtils.getVertices(event.getPlayer());
+ File file = new File(WORLD_EDIT_SELECTIONS, steamwarUser.getId() + "");
+ try {
+ BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)));
+ bufferedWriter.write(data.getKey().getTypeName() + "\n");
+ for (Location location : data.getValue()) {
+ bufferedWriter.write(location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ() + "\n");
+ }
+ bufferedWriter.close();
+ } catch (IOException e) {
+ file.delete();
+ }
+ }
+}
diff --git a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
index ec464ef4..2d104e9e 100644
--- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
+++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java
@@ -19,17 +19,21 @@
package de.steamwar.bausystem.utils;
+import com.comphenix.tinyprotocol.Reflection;
import com.sk89q.worldedit.EditSession;
import com.sk89q.worldedit.IncompleteRegionException;
+import com.sk89q.worldedit.LocalSession;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.bukkit.BukkitAdapter;
import com.sk89q.worldedit.extension.factory.PatternFactory;
+import com.sk89q.worldedit.extension.platform.permission.ActorSelectorLimits;
import com.sk89q.worldedit.function.mask.Mask;
import com.sk89q.worldedit.function.pattern.Pattern;
import com.sk89q.worldedit.internal.registry.InputParser;
import com.sk89q.worldedit.math.BlockVector3;
import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.regions.RegionSelector;
+import com.sk89q.worldedit.regions.selector.limit.SelectorLimits;
import de.steamwar.bausystem.shared.Pair;
import lombok.SneakyThrows;
import lombok.experimental.UtilityClass;
@@ -37,6 +41,9 @@ import org.bukkit.Location;
import org.bukkit.World;
import org.bukkit.entity.Player;
+import java.util.List;
+import java.util.stream.Collectors;
+
@UtilityClass
public class WorldEditUtils {
@@ -77,6 +84,31 @@ public class WorldEditUtils {
return WorldEdit.getInstance().getPatternFactory();
}
+ public Pair, List> getVertices(Player player) {
+ RegionSelector regionSelector = WorldEdit.getInstance()
+ .getSessionManager()
+ .get(BukkitAdapter.adapt(player))
+ .getRegionSelector(BukkitAdapter.adapt(player.getWorld()));
+ return new Pair<>(regionSelector.getClass(), regionSelector.getVertices().stream().map(blockVector3 -> adapt(player.getWorld(), blockVector3)).collect(Collectors.toList()));
+ }
+
+ public void setVertices(Player player, Class extends RegionSelector> clazz, List vertices) {
+ LocalSession localSession = WorldEdit.getInstance()
+ .getSessionManager()
+ .get(BukkitAdapter.adapt(player));
+
+ RegionSelector regionSelector = (RegionSelector) Reflection.newInstance(clazz);
+ localSession.setRegionSelector(BukkitAdapter.adapt(player.getWorld()), regionSelector);
+
+ if (vertices.isEmpty()) return;
+
+ SelectorLimits selectorLimits = ActorSelectorLimits.forActor(BukkitAdapter.adapt(player));
+ regionSelector.selectPrimary(BukkitAdapter.adapt(vertices.get(0)).toBlockPoint(), selectorLimits);
+ for (int i = 1; i < vertices.size(); i++) {
+ regionSelector.selectSecondary(BukkitAdapter.adapt(vertices.get(0)).toBlockPoint(), selectorLimits);
+ }
+ }
+
public Pair getSelection(Player player) {
RegionSelector regionSelector = WorldEdit.getInstance()
.getSessionManager()