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
+1 -1
View File
@@ -1,4 +1,4 @@
.devres/
.idea/
.failed_packets/
.vscode/
.vscode/proto_generator
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket0C20C77EA68496BD(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x89, 0x16, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket28FE982CCA801F9B(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xdc, 0x21, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket49691467B3398296(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x95, 0x1a, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket5E9A356ECC3AA3FC(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xdd, 0x21, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket60B4CB3DC8DA7480(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x8e, 0x1c, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket66F6FC8839ACD758(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xcf, 0x1d, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket671AD113155624DD(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xc5, 0x1e, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacket9489CFFF676ABE59(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xce, 0x17, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacketA7AD1D229B209443(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xdb, 0x21, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacketD529D00D0DC17F72(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xe3, 0x15, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v1_8"
)
// Error: EOF
func TestFailedPacketFEA550AB16196B04(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x88, 0x16, 0x0, 0x0, 0x1, 0x5, 0x1, 0x0, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket1D0089BBE86A1648(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x81, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket1DF29446152D96A8(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xbd, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket202A6A9E047BE81D(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xd6, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket26190593980A0FB9(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xd3, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket565273F305C6AA41(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xff, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket5F223B84B8E3B245(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xdc, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacket62AB3B7CA4199CC4(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xf2, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketB2676FD8106C604A(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x83, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketB3E03D743AA3FD86(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xee, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketBB475636490A4F79(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x89, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketBB9B39D9752D3412(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x80, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketC737E804EE3D28B0(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xe1, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketC7C463D62C4D25DE(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xde, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketC9A0C7F85E913F13(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x85, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketDC2AC767FF974DAD(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0x82, 0x2, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketF23A07C39D21C5DC(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xd5, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
@@ -1,18 +0,0 @@
package failed_packets_test
import (
"bytes"
"testing"
generated "github.com/admin-else/strom/mc/proto_generated/v26_2"
)
// Error: to do
func TestFailedPacketF527D279CBEE95BB(t *testing.T) {
p := &generated.PlayToClientPacketEntityEquipment{}
b := bytes.NewReader([]byte{0xfe, 0x1, 0x0, 0x1, 0x9a, 0x7, 0x0, 0x0})
err := p.Decode(b)
if err == nil {
t.Fatalf("expected decode error but got nil")
}
}
+3
View File
@@ -68,6 +68,9 @@ func (s *Tag) Decode(r io.Reader) (err error) {
if err != nil {
return
}
if id == End {
return
}
var name any
name, err = readPayload(String, r)
if err != nil {
+1 -1
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.12.2/protocol.json (sha256:21c57208db654a5e14a34cb696570080df179c5c642e53b16120399eee9232be)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_12_2
import (
+1 -1
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.14.4/protocol.json (sha256:b6edff5abaaf234037b5019024d749e27e746250a23253bb4ad77d8f76e93167)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_14_4
import (
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.16.2/protocol.json (sha256:d96a3c5a7a7ddf2105e23990c2471b3aeafe4a6975e0c9d7d7943b599af9dfb3)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_16_5
import (
@@ -5564,15 +5564,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.21.11/protocol.json (sha256:97d2726cce3a39cc967a954f27f4ebf029ec3f0f655bb21942aab8745d13cdab)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_21_11
import (
@@ -16549,15 +16549,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.21.8/protocol.json (sha256:930fbb4c69fd2ecadddcee3c38d3f02908adc23b54b707cb21112e7ab1e9dba1)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_21_8
import (
@@ -15030,15 +15030,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.21.9/protocol.json (sha256:9861cee397931c678c3b1837dcdf82e3fc885442c6bd0e4a60522fbf26653e59)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_21_9
import (
@@ -16372,15 +16372,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+1 -1
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.8/protocol.json (sha256:79fe774bfc255dd281899c004fbb9c7adc40fb107de9353da1dd0371ea4b53af)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v1_8
import (
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/26.1/protocol.json (sha256:dfb6318886cd3ceab617f75ac05e24f9836a64501d60551071289b904ebfc389)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v26_1
import (
@@ -16585,15 +16585,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+68 -4
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/26.2/protocol.json (sha256:7ba66411adcc68a668f38211e1b00eeb386a345d5eb16fadd6dc1c7f94bb175f)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
// version: v0.6.6-0.20260805170503-1d8f70c7fdae+dirty (go1.26.2)
package v26_2
import (
@@ -16594,15 +16594,79 @@ func (ret *PlayToClientPacketEntityEffect) Encode(w io.Writer) (err error) {
}
type PlayToClientPacketEntityEquipment struct {
Val proto_base.ToDo
EntityId int32
Equipments []struct {
Slot int8
Item Slot
}
}
func (ret *PlayToClientPacketEntityEquipment) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
ret.EntityId, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
ret.Equipments = []struct {
Slot int8
Item Slot
}{}
for {
var PlayToClientPacketEntityEquipmentEquipmentsHeader uint8
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsHeader)
if err == io.EOF {
err = nil
break
}
if err != nil {
return
}
_, err = r.Seek(-1, io.SeekCurrent)
if err != nil {
return
}
PlayToClientPacketEntityEquipmentEquipmentsHasMore := PlayToClientPacketEntityEquipmentEquipmentsHeader&128 != 0
var PlayToClientPacketEntityEquipmentEquipmentsElement struct {
Slot int8
Item Slot
}
err = binary.Read(r, binary.BigEndian, &PlayToClientPacketEntityEquipmentEquipmentsElement.Slot)
if err != nil {
return
}
err = PlayToClientPacketEntityEquipmentEquipmentsElement.Item.Decode(r)
if err != nil {
return
}
ret.Equipments = append(ret.Equipments, PlayToClientPacketEntityEquipmentEquipmentsElement)
if !PlayToClientPacketEntityEquipmentEquipmentsHasMore {
break
}
}
return
}
func (ret *PlayToClientPacketEntityEquipment) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = proto_base.EncodeVarInt(w, ret.EntityId)
if err != nil {
return
}
for iPlayToClientPacketEntityEquipmentEquipments, PlayToClientPacketEntityEquipmentEquipmentsElem := range ret.Equipments {
if iPlayToClientPacketEntityEquipmentEquipments != len(ret.Equipments)-1 {
err = binary.Write(w, binary.BigEndian, int8(uint8(PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)|128))
if err != nil {
return
}
} else {
err = binary.Write(w, binary.BigEndian, PlayToClientPacketEntityEquipmentEquipmentsElem.Slot)
if err != nil {
return
}
}
PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp := PlayToClientPacketEntityEquipmentEquipmentsElem.Item
err = PlayToClientPacketEntityEquipmentEquipmentsItemEncTmp.Encode(w)
if err != nil {
return
}
}
return
}
+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,
}
}
+103 -1
View File
@@ -388,6 +388,108 @@ func EntityMetadataLoopEncoder(g *Generator, vts ast.Expr, dataRaw any, name str
return
}
func TopBitSetTerminatedArrayEncoder(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
}
iName := "i" + name
elemName := name + "Elem"
_, tData, err := ParseType(data.Type)
if err != nil {
return
}
var containerData protodef.Container
if err = mapstructure.Decode(tData, &containerData); err != nil || len(containerData) == 0 {
s2, err := g.VisitEncoder(SelectorExprAndStr(Ident(elemName), "Val"), data.Type, name+"Inner")
if err != nil {
return nil, err
}
s = Stmts(ForRangeKV(Ident(iName), Ident(elemName), varToSet, NewBlock(s2)))
return s, nil
}
elemExpr := Ident(elemName)
firstField := containerData[0]
firstCName := util2.CamelCase(firstField.Name)
firstVar := SelectorExprAndStr(elemExpr, firstCName)
notLast := NotEquals(Ident(iName), Sub(Call(Ident("len"), varToSet), NumLit(1)))
var firstByteExpr ast.Expr
if firstField.Anon {
firstByteExpr = SelectorExprAndStr(firstVar, "Type") // or "Key"... need to handle bitfield
} else {
firstByteExpr = firstVar
}
firstTypeName, _, _ := ParseType(firstField.Type)
var firstFieldStmts []ast.Stmt
const msb = 0x80
switch firstTypeName {
case "i8":
firstFieldStmts = Stmts(
IfElse(notLast,
NewBlock(Stmts(
Assign121(Ident("err"),
Call(Selector("binary", "Write"), Ident("w"), Selector("binary", "BigEndian"),
Call(Ident("int8"),
&ast.BinaryExpr{X: Call(Ident("uint8"), firstByteExpr), Op: token.OR, Y: NumLit(msb)}))),
IfErrNil(),
)),
NewBlock(Stmts(
Assign121(Ident("err"),
Call(Selector("binary", "Write"), Ident("w"), Selector("binary", "BigEndian"), firstByteExpr)),
IfErrNil(),
))),
)
case "u8":
firstFieldStmts = Stmts(
IfElse(notLast,
NewBlock(Stmts(
Assign121(Ident("err"),
Call(Selector("binary", "Write"), Ident("w"), Selector("binary", "BigEndian"),
&ast.BinaryExpr{X: firstByteExpr, Op: token.OR, Y: NumLit(msb)})),
IfErrNil(),
)),
NewBlock(Stmts(
Assign121(Ident("err"),
Call(Selector("binary", "Write"), Ident("w"), Selector("binary", "BigEndian"), firstByteExpr)),
IfErrNil(),
))),
)
default:
firstFieldStmts, err = g.VisitEncoder(firstByteExpr, firstField.Type, name+firstCName)
if err != nil {
return nil, err
}
}
var restStmts []ast.Stmt
for _, field := range containerData[1:] {
cName := util2.CamelCase(field.Name)
if field.Anon {
cName = "Anon"
}
fieldVar := SelectorExprAndStr(elemExpr, cName)
fieldStmts, err := g.VisitEncoder(fieldVar, field.Type, name+util2.CamelCase(cName))
if err != nil {
return nil, err
}
restStmts = append(restStmts, fieldStmts...)
}
elementStmts := append(firstFieldStmts, restStmts...)
s = Stmts(ForRangeKV(Ident(iName), Ident(elemName), varToSet, NewBlock(elementStmts)))
return
}
func (g *Generator) RegisterEncoderNatives() {
g.EncoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerEncoder,
@@ -426,7 +528,7 @@ func (g *Generator) RegisterEncoderNatives() {
"registryEntryHolder": RegistryEntryHolderEncoder,
"registryEntryHolderSet": ToDoEncoder,
"entityMetadataLoop": EntityMetadataLoopEncoder,
"topBitSetTerminatedArray": ToDoEncoder,
"topBitSetTerminatedArray": TopBitSetTerminatedArrayEncoder,
"todo": ToDoEncoder,
}
}
+1 -1
View File
@@ -225,7 +225,7 @@ func (g *Generator) RegisterNatives() {
"string": MakeIdentVisitor("string"),
"restBuffer": MakeSelectorVisitor("proto_base", "RestBuffer"),
"bitflags": VisitBitFlagsType,
"topBitSetTerminatedArray": VisitToDoType,
"topBitSetTerminatedArray": VisitArrayTypeVisitorType,
"todo": VisitToDoType,
"lpVec3": MakeSelectorVisitor("proto_base", "LpVec3d"),
}