Fix WorldEditWrapper not loading schematics in 1.21

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