add seek-back handling in entity metadata decoding

This commit is contained in:
adman
2026-05-14 00:06:45 +02:00
parent a39999b344
commit d43ff7f83d
4 changed files with 19 additions and 4 deletions
+5 -2
View File
@@ -2,11 +2,10 @@ package v1_21_11
import ( import (
"encoding/binary" "encoding/binary"
"io"
"github.com/admin-else/strom/nbt" "github.com/admin-else/strom/nbt"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"github.com/google/uuid" "github.com/google/uuid"
"io"
) )
type ArmorTrimMaterial struct { type ArmorTrimMaterial struct {
@@ -3512,6 +3511,10 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
if id == 255 { if id == 255 {
break break
} }
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
var entry EntityMetadataEntry var entry EntityMetadataEntry
err = entry.Decode(r) err = entry.Decode(r)
if err != nil { if err != nil {
+4
View File
@@ -2446,6 +2446,10 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
if id == 255 { if id == 255 {
break break
} }
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
var entry EntityMetadataEntry var entry EntityMetadataEntry
err = entry.Decode(r) err = entry.Decode(r)
if err != nil { if err != nil {
+5 -2
View File
@@ -2,11 +2,10 @@ package v1_21_9
import ( import (
"encoding/binary" "encoding/binary"
"io"
"github.com/admin-else/strom/nbt" "github.com/admin-else/strom/nbt"
"github.com/admin-else/strom/proto_base" "github.com/admin-else/strom/proto_base"
"github.com/google/uuid" "github.com/google/uuid"
"io"
) )
type ArmorTrimMaterial struct { type ArmorTrimMaterial struct {
@@ -3381,6 +3380,10 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
if id == 255 { if id == 255 {
break break
} }
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
var entry EntityMetadataEntry var entry EntityMetadataEntry
err = entry.Decode(r) err = entry.Decode(r)
if err != nil { if err != nil {
+5
View File
@@ -578,6 +578,9 @@ func EntityMetadataLoopDecoder(g *Generator, varToSet ast.Expr, dataRaw any, nam
decodeIdStatements, err := g.VisitDecoder(Ident("id"), "u8", name) decodeIdStatements, err := g.VisitDecoder(Ident("id"), "u8", name)
endCheck := If(Equals(Ident("id"), NumLit(data.EndVal)), NewBlockEllipsis(Break())) endCheck := If(Equals(Ident("id"), NumLit(data.EndVal)), NewBlockEllipsis(Break()))
// r.Seek(-1, io.SeekCurrent)
seekBack := Assign(Exprs(Ident("_"), Ident("err")), Exprs(Call(Selector("r", "Seek"), NumLit(-1), Selector("io", "SeekCurrent"))))
declEntry := VarStmt("entry", innerType) declEntry := VarStmt("entry", innerType)
decodingEntryStmts, err := g.VisitDecoder(Ident("entry"), data.Type, name+"Inner") decodingEntryStmts, err := g.VisitDecoder(Ident("entry"), data.Type, name+"Inner")
if err != nil { if err != nil {
@@ -588,6 +591,8 @@ func EntityMetadataLoopDecoder(g *Generator, varToSet ast.Expr, dataRaw any, nam
var loopStmts []ast.Stmt var loopStmts []ast.Stmt
loopStmts = append(loopStmts, decodeIdStatements...) loopStmts = append(loopStmts, decodeIdStatements...)
loopStmts = append(loopStmts, endCheck) loopStmts = append(loopStmts, endCheck)
loopStmts = append(loopStmts, seekBack)
loopStmts = append(loopStmts, IfErrNil())
loopStmts = append(loopStmts, declEntry) loopStmts = append(loopStmts, declEntry)
loopStmts = append(loopStmts, decodingEntryStmts...) loopStmts = append(loopStmts, decodingEntryStmts...)
loopStmts = append(loopStmts, assignEntry) loopStmts = append(loopStmts, assignEntry)