From 007f0796aecf5ce8865cf63cf0dfe2a144681d87 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 21 Aug 2024 10:59:09 +0200 Subject: [PATCH 1/4] 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() From f375aa68b508dfd66550761e5ab3876338623f4f Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 21 Aug 2024 18:26:33 +0200 Subject: [PATCH 2/4] Fix things --- .../features/world/WorldEditSelectionSaver.java | 10 +++++++--- .../de/steamwar/bausystem/utils/WorldEditUtils.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) 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 index efd987d0..7a1e2f4e 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java @@ -20,6 +20,7 @@ package de.steamwar.bausystem.features.world; import com.sk89q.worldedit.regions.RegionSelector; +import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.shared.Pair; import de.steamwar.bausystem.utils.WorldEditUtils; import de.steamwar.linkage.Linked; @@ -33,6 +34,7 @@ import org.bukkit.event.player.PlayerQuitEvent; import java.io.*; import java.util.List; +import java.util.logging.Level; import java.util.stream.Collectors; @Linked @@ -47,7 +49,7 @@ public class WorldEditSelectionSaver implements Listener { @EventHandler public void onPlayerJoin(PlayerJoinEvent event) { SteamwarUser steamwarUser = SteamwarUser.get(event.getPlayer().getUniqueId()); - File file = new File(WORLD_EDIT_SELECTIONS, steamwarUser.getId() + ""); + File file = new File(WORLD_EDIT_SELECTIONS, Integer.toString(steamwarUser.getId())); if (!file.exists()) return; try { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(file))); @@ -58,6 +60,7 @@ public class WorldEditSelectionSaver implements Listener { .collect(Collectors.toList()); WorldEditUtils.setVertices(event.getPlayer(), clazz, locations); } catch (IOException | ClassNotFoundException e) { + BauSystem.getInstance().getLogger().log(Level.SEVERE, e.getMessage(), e); file.delete(); } } @@ -69,12 +72,13 @@ public class WorldEditSelectionSaver implements Listener { 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"); + bufferedWriter.write(data.getKey().getTypeName()); for (Location location : data.getValue()) { - bufferedWriter.write(location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ() + "\n"); + bufferedWriter.write("\n" + location.getBlockX() + " " + location.getBlockY() + " " + location.getBlockZ()); } bufferedWriter.close(); } catch (IOException e) { + BauSystem.getInstance().getLogger().log(Level.SEVERE, e.getMessage(), 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 2d104e9e..ba47c1ed 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java @@ -105,7 +105,7 @@ public class WorldEditUtils { 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); + regionSelector.selectSecondary(BukkitAdapter.adapt(vertices.get(i)).toBlockPoint(), selectorLimits); } } From 42fd35077b79cf20750423bec003312b889328a1 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 21 Aug 2024 20:31:21 +0200 Subject: [PATCH 3/4] Fix PR stuff --- .../bausystem/features/world/WorldEditSelectionSaver.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 index 7a1e2f4e..397f7d5f 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/features/world/WorldEditSelectionSaver.java @@ -69,7 +69,7 @@ public class WorldEditSelectionSaver implements Listener { 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() + ""); + File file = new File(WORLD_EDIT_SELECTIONS, Integer.toString(steamwarUser.getId())); try { BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file))); bufferedWriter.write(data.getKey().getTypeName()); From fde70029c5cea2386525f767c4574d21aa5e7c92 Mon Sep 17 00:00:00 2001 From: YoyoNow Date: Wed, 21 Aug 2024 20:55:03 +0200 Subject: [PATCH 4/4] Fix WorldEditUtils.setVertices --- .../src/de/steamwar/bausystem/utils/WorldEditUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 ba47c1ed..81fe6723 100644 --- a/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java +++ b/BauSystem/BauSystem_Main/src/de/steamwar/bausystem/utils/WorldEditUtils.java @@ -97,7 +97,8 @@ public class WorldEditUtils { .getSessionManager() .get(BukkitAdapter.adapt(player)); - RegionSelector regionSelector = (RegionSelector) Reflection.newInstance(clazz); + Reflection.ConstructorInvoker constructorInvoker = Reflection.getConstructor(clazz, com.sk89q.worldedit.world.World.class); + RegionSelector regionSelector = (RegionSelector) constructorInvoker.invoke(BukkitAdapter.adapt(player.getWorld())); localSession.setRegionSelector(BukkitAdapter.adapt(player.getWorld()), regionSelector); if (vertices.isEmpty()) return;