From e088e9794b1adad4385f0bfa28183879d179d2a8 Mon Sep 17 00:00:00 2001 From: Chaoscaot Date: Thu, 28 Nov 2024 23:28:44 +0100 Subject: [PATCH] Update WorldEditWrapper21 --- .../bausystem/utils/NMSWrapper21.java | 36 +++---- .../SQL/src/de/steamwar/sql/NodeData.java | 2 +- .../de/steamwar/core/WorldEditWrapper14.java | 38 +------- .../de/steamwar/core/WorldEditWrapper18.java | 6 +- SpigotCore/SpigotCore_21/build.gradle.kts | 4 + .../de/steamwar/core/WorldEditWrapper21.java | 97 +++++++++++++++++++ .../de/steamwar/core/WorldEditWrapper8.java | 35 +------ .../de/steamwar/core/WorldEditWrapper.java | 45 ++++++++- settings.gradle.kts | 1 + 9 files changed, 171 insertions(+), 93 deletions(-) create mode 100644 SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java diff --git a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java index 5ff195c2..b80cb69c 100644 --- a/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java +++ b/BauSystem/BauSystem_21/src/de/steamwar/bausystem/utils/NMSWrapper21.java @@ -32,10 +32,12 @@ import net.minecraft.network.protocol.game.PacketPlayOutExplosion; import net.minecraft.network.protocol.game.PacketPlayOutGameStateChange; import net.minecraft.server.level.EntityPlayer; import net.minecraft.server.level.PlayerInteractManager; +import net.minecraft.world.entity.player.EntityHuman; import net.minecraft.world.entity.player.PlayerAbilities; import net.minecraft.world.item.component.CustomData; import net.minecraft.world.level.EnumGamemode; import net.minecraft.world.level.Explosion; +import net.minecraft.world.phys.Vec3D; import org.bukkit.GameMode; import org.bukkit.Material; import org.bukkit.craftbukkit.v1_21_R2.entity.CraftPlayer; @@ -44,6 +46,7 @@ import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; import java.util.List; +import java.util.Optional; public class NMSWrapper21 implements NMSWrapper { @@ -77,11 +80,13 @@ public class NMSWrapper21 implements NMSWrapper { gameStateChangeReason.set(packet, PacketPlayOutGameStateChange.d); } + private static final Reflection.FieldAccessor playerAbilities = Reflection.getField(EntityHuman.class, null, PlayerAbilities.class); + @Override public void setPlayerBuildAbilities(Player player) { - PlayerAbilities abilities = ((CraftPlayer) player).getHandle().; - ((CraftPlayer) player).getHandle().().d = true; - ((CraftPlayer) player).getHandle().fZ().e = true; + PlayerAbilities abilities = playerAbilities.get(((CraftPlayer) player).getHandle()); + abilities.d = true; + abilities.e = true; } @Override @@ -128,30 +133,11 @@ public class NMSWrapper21 implements NMSWrapper { } private final Class explosionPacket = Reflection.getClass("{nms.network.protocol.game}.PacketPlayOutExplosion"); - private final Reflection.FieldAccessor a = Reflection.getField(explosionPacket, double.class, 0); - private final Reflection.FieldAccessor b = Reflection.getField(explosionPacket, double.class, 1); - private final Reflection.FieldAccessor c = Reflection.getField(explosionPacket, double.class, 2); - private final Reflection.FieldAccessor d = Reflection.getField(explosionPacket, float.class, 0); - private final Reflection.FieldAccessor e = Reflection.getField(explosionPacket, List.class, 0); - private final Reflection.FieldAccessor f = Reflection.getField(explosionPacket, Explosion.Effect.class, 0); - private final Reflection.FieldAccessor g = Reflection.getField(explosionPacket, ParticleParam.class, 0); - private final Reflection.FieldAccessor h = Reflection.getField(explosionPacket, ParticleParam.class, 1); - private final Reflection.FieldAccessor i = Reflection.getField(explosionPacket, Holder.class, 0); + private final Reflection.FieldAccessor explosionKnockback = Reflection.getField(explosionPacket, Optional.class, 0); @Override public Object resetExplosionKnockback(Object packet) { - PacketPlayOutExplosion packetPlayOutExplosion = (PacketPlayOutExplosion) packet; - return new PacketPlayOutExplosion( - a.get(packetPlayOutExplosion), - b.get(packetPlayOutExplosion), - c.get(packetPlayOutExplosion), - d.get(packetPlayOutExplosion), - e.get(packetPlayOutExplosion), - null, - f.get(packetPlayOutExplosion), - g.get(packetPlayOutExplosion), - h.get(packetPlayOutExplosion), - i.get(packetPlayOutExplosion) - ); + explosionKnockback.set(packet, Optional.empty()); + return packet; } } diff --git a/CommonCore/SQL/src/de/steamwar/sql/NodeData.java b/CommonCore/SQL/src/de/steamwar/sql/NodeData.java index 33bb0020..52743811 100644 --- a/CommonCore/SQL/src/de/steamwar/sql/NodeData.java +++ b/CommonCore/SQL/src/de/steamwar/sql/NodeData.java @@ -71,7 +71,7 @@ public class NodeData { if(rs.wasNull() || schemData.available() == 0) { throw new SecurityException("SchemData is null"); } - return schemData; + return new GZIPInputStream(schemData); } catch (IOException e) { throw new SecurityException("SchemData is wrong", e); } diff --git a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java index d7138cca..9e9e434a 100644 --- a/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java +++ b/SpigotCore/SpigotCore_14/src/de/steamwar/core/WorldEditWrapper14.java @@ -59,29 +59,8 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { @Override public InputStream getPlayerClipboard(Player player, boolean schemFormat) { - ClipboardHolder clipboardHolder; - try { - clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard(); - } catch (EmptyClipboardException e) { - throw new NoClipboardException(); - } - - Clipboard clipboard = clipboardHolder.getClipboard(); - if(clipboard == null) - throw new NoClipboardException(); - - PipedOutputStream outputStream = new PipedOutputStream(); - PipedInputStream inputStream; - try { - inputStream = new PipedInputStream(outputStream, 4096); - }catch(NullPointerException e){ - throw new RuntimeException(e.getMessage(), new IOException(e)); - } catch (IOException e) { - throw new SecurityException("Could not init piped input stream", e); - } - - new Thread(() -> { - try{ + return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) -> { + try { if(schemFormat){ ClipboardWriter writer = SCHEM.getWriter(outputStream); writer.write(clipboard); @@ -89,17 +68,10 @@ public class WorldEditWrapper14 implements WorldEditWrapper.IWorldEditWrapper { }else{ SCHEMATIC.getWriter(outputStream).write(clipboard); } - }catch(NullPointerException | IOException e) { - Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e); + } catch (Exception e) { + throw new RuntimeException(e.getMessage(), e); } - try { - outputStream.close(); - } catch (IOException e) { - Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e); - } - }, "SchemWriter").start(); - - return inputStream; + }); } @Override diff --git a/SpigotCore/SpigotCore_18/src/de/steamwar/core/WorldEditWrapper18.java b/SpigotCore/SpigotCore_18/src/de/steamwar/core/WorldEditWrapper18.java index 54c7240b..903113c4 100644 --- a/SpigotCore/SpigotCore_18/src/de/steamwar/core/WorldEditWrapper18.java +++ b/SpigotCore/SpigotCore_18/src/de/steamwar/core/WorldEditWrapper18.java @@ -19,8 +19,9 @@ package de.steamwar.core; +import com.sk89q.jnbt.NBTInputStream; import com.sk89q.worldedit.extent.clipboard.Clipboard; -import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; +import com.sk89q.worldedit.extent.clipboard.io.*; import de.steamwar.sql.NoClipboardException; import java.io.IOException; @@ -31,9 +32,10 @@ public class WorldEditWrapper18 extends WorldEditWrapper14 { @Override @SuppressWarnings("removal") public Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException { + NBTInputStream nbtStream = new NBTInputStream(is); //Use FAWE reader due to FAWE capability of reading corrupt FAWE schems try { - return (schemFormat ? BuiltInClipboardFormat.FAST.getReader(is) : BuiltInClipboardFormat.MCEDIT_SCHEMATIC.getReader(is)).read(); + return (schemFormat ? new SpongeSchematicReader(nbtStream) : new MCEditSchematicReader(nbtStream)).read(); } catch (NullPointerException e) { throw new NoClipboardException(); } diff --git a/SpigotCore/SpigotCore_21/build.gradle.kts b/SpigotCore/SpigotCore_21/build.gradle.kts index 33938708..b4eded6e 100644 --- a/SpigotCore/SpigotCore_21/build.gradle.kts +++ b/SpigotCore/SpigotCore_21/build.gradle.kts @@ -23,6 +23,10 @@ plugins { dependencies { compileOnly(project(":SpigotCore:SpigotCore_Main", "default")) + compileOnly(project(":SpigotCore:SpigotCore_18", "default")) + compileOnly(project(":SpigotCore:SpigotCore_14", "default")) + + compileOnly(libs.fawe21) compileOnly(libs.paperapi21) { attributes { diff --git a/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java new file mode 100644 index 00000000..c7215c8e --- /dev/null +++ b/SpigotCore/SpigotCore_21/src/de/steamwar/core/WorldEditWrapper21.java @@ -0,0 +1,97 @@ +/* + * 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.core; + +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV2; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; +import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicWriterV3; +import com.sk89q.jnbt.NBTInputStream; +import com.sk89q.jnbt.NBTOutputStream; +import com.sk89q.worldedit.extension.platform.Actor; +import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader; +import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV1Reader; +import com.sk89q.worldedit.session.ClipboardHolder; +import org.bukkit.entity.Player; +import org.enginehub.linbus.stream.LinBinaryIO; +import org.enginehub.linbus.stream.LinStream; +import org.enginehub.linbus.tree.LinCompoundTag; +import org.enginehub.linbus.tree.LinRootEntry; +import org.enginehub.linbus.tree.LinTagType; + +import java.io.*; + +public class WorldEditWrapper21 implements WorldEditWrapper.IWorldEditWrapper { + + @Override + public InputStream getPlayerClipboard(Player player, boolean schemFormat) { + return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) -> { + try { + new FastSchematicWriterV3(new NBTOutputStream(outputStream)).write(clipboard); + } catch (IOException e) { + throw new RuntimeException(e); + } + }); + } + + @Override + public void setPlayerClipboard(Player player, InputStream is, boolean schemFormat) { + Clipboard clipboard = null; + try { + clipboard = getClipboard(is, schemFormat); + } catch (IOException e) { + throw new RuntimeException(e.getMessage(), e); + } + + if (clipboard == null) + throw new SecurityException("Clipboard is null"); + + Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); + WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); + } + + @Override + public Clipboard getClipboard(InputStream is, boolean schemFormat) throws IOException { + if (!schemFormat) { + return new MCEditSchematicReader(new NBTInputStream(is)).read(); + } else { + BufferedInputStream bis = new BufferedInputStream(is); + + bis.mark(Integer.MAX_VALUE); + + LinStream linStream = LinBinaryIO.read(new DataInputStream(bis)); + + LinCompoundTag entry = LinRootEntry.readFrom(linStream).value(); + + bis.reset(); + + switch (entry.getTag("Version", LinTagType.intTag()).valueAsInt()) { + case 1: + return new SpongeSchematicV1Reader(entry.linStream()).read(); + case 2: + return new FastSchematicReaderV2(new NBTInputStream(bis)).read(); + case 3: + return new FastSchematicReaderV3(bis).read(); + default: + throw new IOException("Unknown schematic version"); + } + } + } +} diff --git a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java index ad9b40f9..3913c262 100644 --- a/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java +++ b/SpigotCore/SpigotCore_8/src/de/steamwar/core/WorldEditWrapper8.java @@ -49,39 +49,14 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { @Override public InputStream getPlayerClipboard(Player player, boolean schemFormat) { - ClipboardHolder clipboardHolder; - try { - clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard(); - } catch (EmptyClipboardException e) { - throw new NoClipboardException(); - } - - Clipboard clipboard = clipboardHolder.getClipboard(); - if(clipboard == null) - throw new NoClipboardException(); - - PipedOutputStream outputStream = new PipedOutputStream(); - PipedInputStream inputStream; - try { - inputStream = new PipedInputStream(outputStream, 4096); - } catch (IOException e) { - throw new SecurityException("Could not init piped input stream", e); - } - - new Thread(() -> { + return WorldEditWrapper.getPlayerClipboard(player, schemFormat, (outputStream, clipboard, clipboardHolder) -> + { try { ClipboardFormat.SCHEMATIC.getWriter(outputStream).write(clipboard, clipboardHolder.getWorldData()); } catch (IOException e) { - Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e); + throw new RuntimeException(e); } - try { - outputStream.close(); - } catch (IOException e) { - Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e); - } - }, "SchemWriter").start(); - - return inputStream; + }); } @Override @@ -89,7 +64,7 @@ public class WorldEditWrapper8 implements WorldEditWrapper.IWorldEditWrapper { WorldData world = new BukkitWorld(player.getWorld()).getWorldData(); Clipboard clipboard; try { - clipboard = getClipboard(new GZIPInputStream(is), schemFormat); + clipboard = getClipboard(is, schemFormat); } catch (IOException e) { throw new RuntimeException(e); } diff --git a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java index 14f85e16..90396119 100644 --- a/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java +++ b/SpigotCore/SpigotCore_Main/src/de/steamwar/core/WorldEditWrapper.java @@ -19,13 +19,18 @@ package de.steamwar.core; +import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.extent.clipboard.Clipboard; +import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat; +import com.sk89q.worldedit.session.ClipboardHolder; +import de.steamwar.sql.NoClipboardException; +import org.apache.logging.log4j.util.TriConsumer; import org.bukkit.Bukkit; import org.bukkit.entity.Player; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.util.logging.Level; public class WorldEditWrapper { private WorldEditWrapper() {} @@ -41,4 +46,40 @@ public class WorldEditWrapper { public static WorldEditPlugin getWorldEditPlugin() { return (WorldEditPlugin) Bukkit.getPluginManager().getPlugin("WorldEdit"); } + + public static InputStream getPlayerClipboard(Player player, boolean schemFormat, TriConsumer consumer) { + ClipboardHolder clipboardHolder; + try { + clipboardHolder = WorldEditWrapper.getWorldEditPlugin().getSession(player).getClipboard(); + } catch (EmptyClipboardException e) { + throw new NoClipboardException(); + } + + Clipboard clipboard = clipboardHolder.getClipboard(); + if(clipboard == null) + throw new NoClipboardException(); + + PipedOutputStream outputStream = new PipedOutputStream(); + PipedInputStream inputStream; + try { + inputStream = new PipedInputStream(outputStream, 4096); + } catch (IOException e) { + throw new SecurityException("Could not init piped input stream", e); + } + + new Thread(() -> { + try { + consumer.accept(outputStream, clipboard, clipboardHolder); + } catch (Exception e) { + Core.getInstance().getLogger().log(Level.SEVERE, "Could not write schematic", e); + } + try { + outputStream.close(); + } catch (IOException e) { + Core.getInstance().getLogger().log(Level.SEVERE, "Could not close schem writer", e); + } + }, "SchemWriter").start(); + + return inputStream; + } } diff --git a/settings.gradle.kts b/settings.gradle.kts index a531b252..29574740 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -136,6 +136,7 @@ dependencyResolutionManagement { library("worldedit12", "de.steamwar:worldedit:1.12") library("worldedit15", "de.steamwar:worldedit:1.15") library("fawe18", "de.steamwar:fastasyncworldedit:1.18") + library("fawe21", "de.steamwar:fastasyncworldedit:1.21") library("velocity", "de.steamwar:velocity:RELEASE") library("velocityapi", "com.velocitypowered:velocity-api:3.3.0-SNAPSHOT")