fix: implement topBitSetTerminatedArray, fix nbt TAG_End, fix entity_equipment

- Implement topBitSetTerminatedArray decoder/encoder with MSB continuation
- Fix nbt.Tag.Decode to handle TAG_End at root level (fixes 1.8 slot NBT)
- Remove 228 now-passing decode failure tests, keep 10 still failing
- EntityEquipment now works correctly across all versions
This commit is contained in:
OpenCode
2026-08-05 19:30:18 +02:00
parent 1d8f70c7fd
commit ac1b298989
42 changed files with 570 additions and 535 deletions
+51 -1
View File
@@ -619,6 +619,56 @@ func EntityMetadataLoopDecoder(g *Generator, varToSet ast.Expr, dataRaw any, nam
return
}
func TopBitSetTerminatedArrayDecoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s []ast.Stmt, err error) {
var data struct {
Type any
}
err = mapstructure.Decode(dataRaw, &data)
if err != nil {
return
}
normalType, err := g.VisitType(data.Type)
if err != nil {
return
}
arrayType, err := g.VisitNameAndData("array", dataRaw)
if err != nil {
return
}
tName := name + "Element"
hasMore := name + "HasMore"
headerName := name + "Header"
peekStmts := Stmts(
VarStmt(headerName, Ident("uint8")),
Assign(Exprs(Ident("err")), Exprs(Call(Selector("binary", "Read"), Ident("r"), Selector("binary", "BigEndian"), AddrOf(Ident(headerName))))),
If(Equals(Ident("err"), Selector("io", "EOF")),
NewBlockEllipsis(Assign121(Ident("err"), Nil()), Break())),
IfErrNil(),
Assign(Exprs(Ident("_"), Ident("err")), Exprs(Call(Selector("r", "Seek"), NumLit(-1), Selector("io", "SeekCurrent")))),
IfErrNil(),
Define121(Ident(hasMore), NotEquals(BinAnd(Ident(headerName), NumLit(0x80)), NumLit(0))),
)
rangeStatements := Stmts(VarStmt(tName, normalType))
s5, err := g.VisitDecoder(Ident(tName), data.Type, tName)
if err != nil {
return
}
rangeStatements = append(rangeStatements, s5...)
rangeStatements = append(rangeStatements, Assign121(varToSet, Call(Ident("append"), varToSet, Ident(tName))))
rangeStatements = append(rangeStatements, If(Not(Ident(hasMore)), NewBlockEllipsis(Break())))
loopStmts := append(peekStmts, rangeStatements...)
s = Stmts(
Assign121(varToSet, CompLit(arrayType, Exprs())),
ForStmt(nil, nil, nil, NewBlock(loopStmts)),
)
return
}
func (g *Generator) RegisterDecoderNatives() {
g.DecoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerDecoder,
@@ -657,7 +707,7 @@ func (g *Generator) RegisterDecoderNatives() {
"registryEntryHolder": RegistryEntryHolderDecoder,
"registryEntryHolderSet": ToDoDecoder, // RegistryEntryHolderSetDecoder
"entityMetadataLoop": EntityMetadataLoopDecoder,
"topBitSetTerminatedArray": ToDoDecoder,
"topBitSetTerminatedArray": TopBitSetTerminatedArrayDecoder,
"todo": ToDoDecoder,
}
}