From 007f0796aecf5ce8865cf63cf0dfe2a144681d87 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 21 Aug 2024 10:59:09 +0200 Subject: [PATCH] Add WorldEditSelectionSaver --- .../world/WorldEditSelectionSaver.java | 81 +++++++++++++++++++ .../bausystem/utils/WorldEditUtils.java | 32 ++++++++ 2 files changed, 113 insertions(+) create mode 100644 BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java 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 clazz = (Class) 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 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()