Fix schematic v3 converter: expect list type COMPOUND but END_TYPE

This commit is contained in:
iceBear67 committed 2025-01-07 16:25:06 +08:00
1 parent 555d7a781c
commit 1d2a49025e
4 files changed
+45 -8

No files matched your search

@@ -5,6 +5,7 @@ import com.mojang.brigadier.Command;
import com.mojang.brigadier.CommandDispatcher;
import com.mojang.brigadier.context.CommandContext;
import io.ib67.sfcraft.config.SFConfig;
import io.ib67.sfcraft.inject.MinecraftServerSupplier;
import io.ib67.sfcraft.module.SignatureService;
import io.ib67.sfcraft.module.supervisor.WebHandler;
import io.ib67.sfcraft.util.Helper;
@@ -43,6 +44,8 @@ public class SchematicUploader extends WebHandler {
SFConfig config;
@Inject
SignatureService signatureService;
@Inject
MinecraftServerSupplier serverSupplier;
@Override
@SneakyThrows
@@ -103,12 +106,19 @@ public class SchematicUploader extends WebHandler {
return;
}
var signRaw = Base64.getUrlDecoder().decode(context.queryParam("sign"));
try {
var verifiedSign = signatureService.readSignature(Unpooled.wrappedBuffer(signRaw));
if ((verifiedSign.permission() & PERMISSION_UPLOAD_SCHEMATICS) == 0) {
context.result("Permission denied!");
context.status(403);
return;
}
context.attribute("sign", verifiedSign);
} catch (Exception e) {
context.result("Invalid signature. Please re-run /upload schematic in game.");
context.status(400);
return;
}
var files = context.uploadedFileMap();
var name = context.pathParam("name");
files.forEach((k, v) -> handleUploadSchematic(context, name, v));
@@ -128,24 +138,23 @@ public class SchematicUploader extends WebHandler {
if (fileName.length() <= 10) return;
var baseFileName = Helper.cleanFileName(fileName.substring(0, fileName.length() - 10));
var sign = context.<SignatureService.Signature>attribute("sign");
//var player = serverSupplier.get().getPlayerManager().getPlayer(sign.issuer());
ServerPlayerEntity player = null;
var player = serverSupplier.get().getPlayerManager().getPlayer(sign.issuer());
log.info("Handling file {} from player {}", fileName, sign.issuer());
if (fileName.endsWith(".schematic") || fileName.endsWith(".schem")) {
Files.write(SCHEMATIC_DIR.resolve(baseFileName + ".schematic"), file.content().readAllBytes());
log.info("Saved " + fileName + " as a schematic.");
if (player != null) {
player.sendMessage(Text.literal("Schematic " + baseFileName + " has been saved!").withColor(Color.GREEN.getRGB()));
player.sendMessage(Text.literal(sign.issuer()+": Schematic " + baseFileName + " has been saved! Use //schem list to find it").withColor(Color.GREEN.getRGB()));
}
} else if (fileName.endsWith(".litematic")) {
log.info("Handling new litematic: {}", fileName);
try (var converter = new LitematicConverterV3(file.content(), new NbtSizeTracker(config.maxSchematicSize, 16))) {
try (var converter = new LitematicConverterV3(file.content(), new NbtSizeTracker(config.maxSchematicSize, 64))) {
converter.read((name, nbt) -> {
name = baseFileName + "-" + name + ".schematic";
try {
NbtIo.writeCompressed(nbt, SCHEMATIC_DIR.resolve(name));
log.info("Schematic " + name + " has been saved!");
log.info(sign.issuer()+": Schematic " + name + " has been saved!");
if (player != null) {
player.sendMessage(Text.literal("Schematic " + name + " has been saved!").withColor(Color.GREEN.getRGB()));
player.sendMessage(Text.literal("Schematic " + name + " has been saved! Use //schem list to find it").withColor(Color.GREEN.getRGB()));
}
context.result("Success!");
} catch (Exception e) {
@@ -0,0 +1,24 @@
package io.ib67.sfcraft.util;
import net.minecraft.nbt.NbtElement;
import net.minecraft.nbt.NbtList;
import java.io.DataOutput;
import java.io.IOException;
import java.util.List;
public class TypedNbtList extends NbtList {
public TypedNbtList(List<NbtElement> list, byte type) {
super(list, type);
}
@Override
public void write(DataOutput output) throws IOException {
output.writeByte(this.getHeldType());
output.writeInt(this.size());
for (NbtElement nbtElement : this) {
nbtElement.write(output);
}
}
}
@@ -1,9 +1,11 @@
package io.ib67.sfcraft.util.litematic;
import io.ib67.sfcraft.util.TypedNbtList;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import lombok.SneakyThrows;
import net.minecraft.nbt.*;
import org.apache.commons.compress.utils.Lists;
import java.io.InputStream;
import java.util.ArrayList;
@@ -76,7 +78,8 @@ public class LitematicConverter implements AutoCloseable {
}
protected NbtList convertToWETileEntities(NbtList tileEntities) {
var weTEs = new NbtList();
var weTEs = new TypedNbtList(Lists.newArrayList(), NbtElement.COMPOUND_TYPE);
for (NbtElement _tileEntity : tileEntities) {
var weTE = new NbtCompound();
var tE = (NbtCompound) _tileEntity;
+1
View File
@@ -1,2 +1,3 @@
accessWidener v2 named
mutable field net/minecraft/item/Item registryEntry Lnet/minecraft/registry/entry/RegistryEntry$Reference;
accessible method net/minecraft/nbt/NbtList <init> (Ljava/util/List;B)V