Fix WorldEditWrapper not loading schematics in 1.21
All checks were successful
SteamWarCI Build successful

This commit is contained in:
2026-03-29 12:53:55 +02:00
parent 612254296c
commit c0b192e2bf
8 changed files with 82 additions and 102 deletions

View File

@@ -88,8 +88,6 @@ class NodeData(id: EntityID<CompositeID>): CompositeEntity(id) {
schemData.inputStream.let { if(decompress) GZIPInputStream(it) else it } schemData.inputStream.let { if(decompress) GZIPInputStream(it) else it }
} }
fun schemData() = schemData(true)
override fun delete() = useDb { super.delete() } override fun delete() = useDb { super.delete() }
enum class SchematicFormat(val fileEnding: String) { enum class SchematicFormat(val fileEnding: String) {

View File

@@ -36,7 +36,6 @@ import de.steamwar.fightsystem.fight.FreezeWorld;
import de.steamwar.fightsystem.listener.FightScoreboard; import de.steamwar.fightsystem.listener.FightScoreboard;
import de.steamwar.fightsystem.states.FightState; import de.steamwar.fightsystem.states.FightState;
import de.steamwar.fightsystem.utils.*; import de.steamwar.fightsystem.utils.*;
import de.steamwar.sql.SchematicData;
import de.steamwar.sql.SchematicNode; import de.steamwar.sql.SchematicNode;
import de.steamwar.sql.SteamwarUser; import de.steamwar.sql.SteamwarUser;
import de.steamwar.sql.Team; import de.steamwar.sql.Team;
@@ -520,12 +519,12 @@ public class PacketProcessor implements Listener {
private void pasteEmbeddedSchem(FightTeam team) throws IOException { private void pasteEmbeddedSchem(FightTeam team) throws IOException {
int schemId = source.readInt(); int schemId = source.readInt();
Clipboard clipboard = SchematicData.clipboardFromStream(new FilterInputStream(source) { Clipboard clipboard = WorldEditWrapper.impl.getClipboard(new FilterInputStream(source) {
@Override @Override
public void close() { public void close() {
// FAWE 1.12 calls close... // FAWE 1.12 calls close...
} }
}, WorldEditWrapper.impl.getNativeFormat()); });
execSync(() -> team.pasteSchem(schemId, clipboard)); execSync(() -> team.pasteSchem(schemId, clipboard));
} }

View File

@@ -283,7 +283,7 @@ public interface Recorder {
ByteArrayOutputStream buffer = new ByteArrayOutputStream(); ByteArrayOutputStream buffer = new ByteArrayOutputStream();
try{ try{
copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(), buffer); copy(NodeData.getLatest(SchematicNode.getSchematicNode(schemId)).schemData(true), buffer);
}catch (EOFException e) { }catch (EOFException e) {
Bukkit.getLogger().log(Level.INFO, "EOFException ignored"); Bukkit.getLogger().log(Level.INFO, "EOFException ignored");
} catch (IOException e) { } catch (IOException e) {

View File

@@ -67,36 +67,31 @@ public class WorldEditWrapper14 implements WorldEditWrapper {
} }
@Override @Override
public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { public void setPlayerClipboard(Player player, Clipboard clipboard) {
Clipboard clipboard = null;
try {
clipboard = getClipboard(is, schemFormat);
} catch (IOException e) {
throw new RuntimeException(e.getMessage(), e);
}
if (clipboard == null)
throw new NoClipboardException();
Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player);
WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard));
} }
@Override @Override
public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { public Clipboard getClipboard(NodeData data) throws IOException {
try { InputStream is = data.schemData(true);
return readClipboard(is, data.getNodeFormat());
}
switch (schemFormat) { @Override
case SPONGE_V2: public Clipboard getClipboard(InputStream inputStream) throws IOException {
case SPONGE_V3: return readClipboard(inputStream, getNativeFormat());
return new SpongeSchematicReader(new NBTInputStream(is), this).read(); }
case MCEDIT:
return new MCEditSchematicReader(new NBTInputStream(is)).read(); private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException {
default: switch (format) {
throw new IOException("This schematic format is currently not supported"); case SPONGE_V2:
} case SPONGE_V3:
} catch (NullPointerException e) { return new SpongeSchematicReader(new NBTInputStream(is), this).read();
throw new NoClipboardException(); case MCEDIT:
return new MCEditSchematicReader(new NBTInputStream(is)).read();
default:
throw new IOException("This schematic format is currently not supported");
} }
} }

View File

@@ -20,15 +20,12 @@
package de.steamwar.core; package de.steamwar.core;
import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3; import com.fastasyncworldedit.core.extent.clipboard.io.FastSchematicReaderV3;
import com.fastasyncworldedit.core.jnbt.NBTException;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.worldedit.extension.platform.Actor; import com.sk89q.worldedit.extension.platform.Actor;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat; import com.sk89q.worldedit.extent.clipboard.io.BuiltInClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormat;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardFormats;
import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter; import com.sk89q.worldedit.extent.clipboard.io.ClipboardWriter;
import com.sk89q.worldedit.extent.clipboard.io.MCEditSchematicReader;
import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV2Reader;
import com.sk89q.worldedit.extent.clipboard.io.sponge.SpongeSchematicV3Reader;
import com.sk89q.worldedit.math.Vector3; import com.sk89q.worldedit.math.Vector3;
import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
@@ -36,13 +33,13 @@ import com.sk89q.worldedit.session.ClipboardHolder;
import de.steamwar.sql.NodeData; import de.steamwar.sql.NodeData;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.enginehub.linbus.stream.LinBinaryIO;
import java.io.DataInputStream; import java.io.FilterInputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.zip.GZIPInputStream;
public class WorldEditWrapper21 implements WorldEditWrapper { public class WorldEditWrapper21 implements WorldEditWrapper {
@@ -56,57 +53,48 @@ public class WorldEditWrapper21 implements WorldEditWrapper {
} }
@Override @Override
public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { public void setPlayerClipboard(Player player, Clipboard clipboard) {
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); Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player);
WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard)); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard));
} }
@Override @Override
public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat directFormat) throws IOException { public Clipboard getClipboard(NodeData data) throws IOException {
ResetableInputStream ris = new ResetableInputStream(is); ResetableInputStream is = new ResetableInputStream(data.schemData(false));
try { for (ClipboardFormat clipboardFormat : ClipboardFormats.getAll()) {
return loadSchematic(ris, directFormat); FilterInputStream fis = new FilterInputStream(is) {
} catch (Exception e) { @Override
ris.reset(); public void close() throws IOException {
} // Ignore close call!
for (NodeData.SchematicFormat schemFormat : NodeData.SchematicFormat.values()) { }
if (schemFormat == directFormat) continue; };
try { boolean canBeRead = clipboardFormat.isFormat(fis);
return loadSchematic(ris, schemFormat); is.reset();
} catch (Exception e) { if (!canBeRead) continue;
ris.reset(); return clipboardFormat.load(is);
}
}
try {
return new SpongeSchematicV3Reader(LinBinaryIO.read(new DataInputStream(ris))).read();
} catch (Exception e) {
ris.close();
} }
throw new IOException("No clipboard found"); throw new IOException("No clipboard found");
} }
@SuppressWarnings("removal") @Override
private Clipboard loadSchematic(ResetableInputStream ris, NodeData.SchematicFormat format) throws IOException { public Clipboard getClipboard(InputStream inputStream) throws IOException {
Clipboard clipboard = switch (format) { // Only supports getNativeFormat() both with GZIP as well as without!
case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(ris)).read(); ResetableInputStream is = new ResetableInputStream(inputStream);
case SPONGE_V2 -> new SpongeSchematicV2Reader(LinBinaryIO.read(new DataInputStream(ris))).read(); try {
case SPONGE_V3 -> new FastSchematicReaderV3(ris).read(); return new FastSchematicReaderV3(inputStream).read();
}; } catch (Exception e) {
ris.close(); is.reset();
return clipboard; }
try {
return new FastSchematicReaderV3(new GZIPInputStream(is)).read();
} catch (Exception e) {
is.reset();
}
is.close();
throw new IOException("No clipboard found");
} }
private class ResetableInputStream extends InputStream { private static class ResetableInputStream extends InputStream {
private InputStream inputStream; private InputStream inputStream;
private int pointer = 0; private int pointer = 0;

View File

@@ -22,7 +22,10 @@ package de.steamwar.core;
import com.google.common.base.Preconditions; import com.google.common.base.Preconditions;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
import com.sk89q.jnbt.*; import com.sk89q.jnbt.*;
import com.sk89q.worldedit.*; import com.sk89q.worldedit.BlockVector;
import com.sk89q.worldedit.Vector;
import com.sk89q.worldedit.WorldEdit;
import com.sk89q.worldedit.WorldEditException;
import com.sk89q.worldedit.blocks.BaseBlock; import com.sk89q.worldedit.blocks.BaseBlock;
import com.sk89q.worldedit.bukkit.BukkitWorld; import com.sk89q.worldedit.bukkit.BukkitWorld;
import com.sk89q.worldedit.extension.input.ParserContext; import com.sk89q.worldedit.extension.input.ParserContext;
@@ -57,22 +60,25 @@ public class WorldEditWrapper8 implements WorldEditWrapper {
} }
@Override @Override
public void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat) { public void setPlayerClipboard(Player player, Clipboard clipboard) {
WorldData world = new BukkitWorld(player.getWorld()).getWorldData(); WorldData world = new BukkitWorld(player.getWorld()).getWorldData();
Clipboard clipboard;
try {
clipboard = getClipboard(is, schemFormat);
} catch (IOException e) {
throw new RuntimeException(e);
}
Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player); Actor actor = WorldEditWrapper.getWorldEditPlugin().wrapCommandSender(player);
WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world)); WorldEditWrapper.getWorldEditPlugin().getWorldEdit().getSessionManager().get(actor).setClipboard(new ClipboardHolder(clipboard, world));
} }
@Override @Override
public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException { public Clipboard getClipboard(NodeData data) throws IOException {
switch (schemFormat) { InputStream is = data.schemData(true);
return readClipboard(is, data.getNodeFormat());
}
@Override
public Clipboard getClipboard(InputStream inputStream) throws IOException {
return readClipboard(inputStream, getNativeFormat());
}
private Clipboard readClipboard(InputStream is, NodeData.SchematicFormat format) throws IOException {
switch (format) {
case MCEDIT: case MCEDIT:
return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData()); return new SchematicReader(new NBTInputStream(is)).read(WorldEdit.getInstance().getServer().getWorlds().get(0).getWorldData());
case SPONGE_V2: case SPONGE_V2:

View File

@@ -22,10 +22,10 @@ package de.steamwar.core;
import com.sk89q.worldedit.EmptyClipboardException; import com.sk89q.worldedit.EmptyClipboardException;
import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.WorldEditPlugin;
import com.sk89q.worldedit.extent.clipboard.Clipboard; import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.session.ClipboardHolder;
import de.steamwar.sql.NoClipboardException;
import com.sk89q.worldedit.math.transform.Transform; import com.sk89q.worldedit.math.transform.Transform;
import com.sk89q.worldedit.regions.Region; import com.sk89q.worldedit.regions.Region;
import com.sk89q.worldedit.session.ClipboardHolder;
import de.steamwar.sql.NoClipboardException;
import de.steamwar.sql.NodeData; import de.steamwar.sql.NodeData;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@@ -38,8 +38,10 @@ public interface WorldEditWrapper {
WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance()); WorldEditWrapper impl = VersionDependent.getVersionImpl(Core.getInstance());
InputStream getPlayerClipboard(Player player); InputStream getPlayerClipboard(Player player);
void setPlayerClipboard(Player player, InputStream is, NodeData.SchematicFormat schemFormat);
Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException; void setPlayerClipboard(Player player, Clipboard clipboard);
Clipboard getClipboard(NodeData data) throws IOException;
Clipboard getClipboard(InputStream inputStream) throws IOException;
Vector getOrigin(Clipboard clipboard); Vector getOrigin(Clipboard clipboard);
Vector getMinimum(Region region); Vector getMinimum(Region region);

View File

@@ -29,14 +29,6 @@ import java.io.InputStream;
public class SchematicData { public class SchematicData {
public static Clipboard clipboardFromStream(InputStream is, NodeData.SchematicFormat schemFormat) {
try {
return WorldEditWrapper.impl.getClipboard(is, schemFormat);
} catch (IOException e) {
throw new SecurityException("Could not read schem", e);
}
}
private final NodeData data; private final NodeData data;
public SchematicData(SchematicNode node) { public SchematicData(SchematicNode node) {
@@ -60,11 +52,11 @@ public class SchematicData {
} }
public Clipboard load() throws IOException, NoClipboardException { public Clipboard load() throws IOException, NoClipboardException {
return WorldEditWrapper.impl.getClipboard(data.schemData(), data.getNodeFormat()); return WorldEditWrapper.impl.getClipboard(data);
} }
public void loadToPlayer(Player player) throws IOException, NoClipboardException { public void loadToPlayer(Player player) throws IOException, NoClipboardException {
WorldEditWrapper.impl.setPlayerClipboard(player, data.schemData(), data.getNodeFormat()); WorldEditWrapper.impl.setPlayerClipboard(player, WorldEditWrapper.impl.getClipboard(data));
} }
public static void saveFromPlayer(Player player, SchematicNode node) throws IOException, NoClipboardException { public static void saveFromPlayer(Player player, SchematicNode node) throws IOException, NoClipboardException {