Hotfix: 1.20 Schematic Reader

This commit is contained in:
2025-01-01 14:12:38 +01:00
parent d7d6c2df7b
commit 025ec2a850
3 changed files with 18 additions and 26 deletions
@@ -54,6 +54,7 @@ import java.util.stream.Collectors;
import static com.google.common.base.Preconditions.checkNotNull;
@SuppressWarnings("removal")
public class WorldEditWrapper14 implements WorldEditWrapper {
@Override
@@ -88,7 +89,7 @@ public class WorldEditWrapper14 implements WorldEditWrapper {
switch (schemFormat) {
case SPONGE_V2:
case SPONGE_V3:
return new SpongeSchematicReader(new NBTInputStream(is)).read();
return new SpongeSchematicReader(new NBTInputStream(is), this).read();
case MCEDIT:
return new MCEditSchematicReader(new NBTInputStream(is)).read();
default:
@@ -126,6 +127,10 @@ public class WorldEditWrapper14 implements WorldEditWrapper {
return NodeData.SchematicFormat.SPONGE_V2;
}
public Map<String, Tag> applyDataFixer(DataFixer fixer, int dataVersion, Map<String, Tag> values) {
return fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values), dataVersion).getValue();
}
private static class MCEditSchematicReader extends NBTSchematicReader {
private final NBTInputStream inputStream;
@@ -396,15 +401,17 @@ public class WorldEditWrapper14 implements WorldEditWrapper {
private int schematicVersion = -1;
private int dataVersion = -1;
private boolean faweSchem = false;
private final WorldEditWrapper14 wrapper;
/**
* Create a new instance.
*
* @param inputStream the input stream to read from
*/
public SpongeSchematicReader(NBTInputStream inputStream) {
public SpongeSchematicReader(NBTInputStream inputStream, WorldEditWrapper14 wrapper) {
checkNotNull(inputStream);
this.inputStream = inputStream;
this.wrapper = wrapper;
}
@Override
@@ -572,7 +579,7 @@ public class WorldEditWrapper14 implements WorldEditWrapper {
values.remove("Id");
values.remove("Pos");
if (fixer != null) {
tileEntity = fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values), dataVersion).getValue();
tileEntity = wrapper.applyDataFixer(fixer, dataVersion, values);
} else {
tileEntity = values;
}
@@ -19,34 +19,18 @@
package de.steamwar.core;
import com.sk89q.jnbt.NBTInputStream;
import com.sk89q.worldedit.extent.clipboard.Clipboard;
import com.sk89q.worldedit.extent.clipboard.io.*;
import de.steamwar.sql.NoClipboardException;
import de.steamwar.sql.NodeData;
import com.sk89q.jnbt.AdventureNBTConverter;
import com.sk89q.jnbt.CompoundTag;
import com.sk89q.jnbt.Tag;
import com.sk89q.worldedit.world.DataFixer;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
public class WorldEditWrapper18 extends WorldEditWrapper14 {
@Override
@SuppressWarnings("removal")
public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException {
NBTInputStream nbtStream = new NBTInputStream(is);
//Use FAWE reader due to FAWE capability of reading corrupt FAWE schems
try {
switch (schemFormat) {
case MCEDIT:
return new MCEditSchematicReader(nbtStream).read();
case SPONGE_V2:
case SPONGE_V3:
return new WorldEditWrapper14.SpongeSchematicReader(nbtStream).read();
default:
throw new IllegalArgumentException("Unsupported schematic format");
}
} catch (NullPointerException e) {
throw new NoClipboardException();
}
public Map<String, Tag> applyDataFixer(DataFixer fixer, int dataVersion, Map<String, Tag> values) {
return ((CompoundTag) AdventureNBTConverter.fromAdventure(fixer.fixUp(DataFixer.FixTypes.BLOCK_ENTITY, new CompoundTag(values).asBinaryTag(), dataVersion))).getValue();
}
}
@@ -67,6 +67,7 @@ public class WorldEditWrapper21 implements WorldEditWrapper {
}
@Override
@SuppressWarnings("removal")
public Clipboard getClipboard(InputStream is, NodeData.SchematicFormat schemFormat) throws IOException {
return switch (schemFormat) {
case MCEDIT -> new MCEditSchematicReader(new NBTInputStream(is)).read();