fix: resolve parameterized $compareTo types and fix array count type

- VisitNameAndData: return any instead of named struct when mergeCompareTo
  resolves $compareTo, fixing field type mismatches for switch/container types
- ContainerCompareTo: traverse anon/bitfield fields for compareTo resolution,
  fixes entityMetadata 'field not found' errors
- Array.Count: change from string to any to handle numeric count values
- ArrayEncoder: fix nil check to correctly write length prefix for arrays
- ArrayDecoder: use fmt.Sprint for safe Count conversion
This commit is contained in:
OpenCode
2026-08-05 18:33:39 +02:00
parent fa70ea36c6
commit eb83786f9a
14 changed files with 2138 additions and 101 deletions
+475 -13
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: (devel) (go1.26.2)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
package v1_12_2
import (
@@ -45,7 +45,7 @@ type EntityMetadata struct {
Key uint8
Type int8
}
Value EntityMetadataItem
Value any
}
}
@@ -55,7 +55,7 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
Key uint8
Type int8
}
Value EntityMetadataItem
Value any
})
var id uint8
for {
@@ -75,7 +75,7 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
Key uint8
Type int8
}
Value EntityMetadataItem
Value any
}
err = binary.Read(r, binary.BigEndian, &entry.Anon.Key)
if err != nil {
@@ -85,9 +85,135 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
if err != nil {
return
}
err = entry.Value.Decode(r)
if err != nil {
return
switch entry.Anon.Type {
case 0:
var EntityMetadataInnerValue0Tmp int8
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue0Tmp)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue0Tmp
case 1:
var EntityMetadataInnerValue1Tmp int32
EntityMetadataInnerValue1Tmp, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue1Tmp
case 10:
var EntityMetadataInnerValue10Tmp int32
EntityMetadataInnerValue10Tmp, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue10Tmp
case 11:
var EntityMetadataInnerValue11Tmp *uuid.UUID
var EntityMetadataInnerValue11TmpPresent bool
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue11TmpPresent)
if err != nil {
return
}
if EntityMetadataInnerValue11TmpPresent {
var EntityMetadataInnerValue11TmpPresentValue uuid.UUID
_, err = io.ReadFull(r, EntityMetadataInnerValue11TmpPresentValue[:])
if err != nil {
return
}
EntityMetadataInnerValue11Tmp = &EntityMetadataInnerValue11TmpPresentValue
}
entry.Value = EntityMetadataInnerValue11Tmp
case 12:
var EntityMetadataInnerValue12Tmp int32
EntityMetadataInnerValue12Tmp, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue12Tmp
case 13:
var EntityMetadataInnerValue13Tmp nbt.Tag
err = EntityMetadataInnerValue13Tmp.Decode(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue13Tmp
case 2:
var EntityMetadataInnerValue2Tmp float32
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue2Tmp)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue2Tmp
case 3:
var EntityMetadataInnerValue3Tmp string
EntityMetadataInnerValue3Tmp, err = proto_base.DecodeString(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue3Tmp
case 4:
var EntityMetadataInnerValue4Tmp string
EntityMetadataInnerValue4Tmp, err = proto_base.DecodeString(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue4Tmp
case 5:
var EntityMetadataInnerValue5Tmp Slot
err = EntityMetadataInnerValue5Tmp.Decode(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue5Tmp
case 6:
var EntityMetadataInnerValue6Tmp bool
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue6Tmp)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue6Tmp
case 7:
var EntityMetadataInnerValue7Tmp struct {
Pitch float32
Yaw float32
Roll float32
}
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue7Tmp.Pitch)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue7Tmp.Yaw)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue7Tmp.Roll)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue7Tmp
case 8:
var EntityMetadataInnerValue8Tmp Position
err = EntityMetadataInnerValue8Tmp.Decode(r)
if err != nil {
return
}
entry.Value = EntityMetadataInnerValue8Tmp
case 9:
var EntityMetadataInnerValue9Tmp *Position
var EntityMetadataInnerValue9TmpPresent bool
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerValue9TmpPresent)
if err != nil {
return
}
if EntityMetadataInnerValue9TmpPresent {
var EntityMetadataInnerValue9TmpPresentValue Position
err = EntityMetadataInnerValue9TmpPresentValue.Decode(r)
if err != nil {
return
}
EntityMetadataInnerValue9Tmp = &EntityMetadataInnerValue9TmpPresentValue
}
entry.Value = EntityMetadataInnerValue9Tmp
}
ret.Val[id] = entry
}
@@ -103,10 +229,175 @@ func (ret *EntityMetadata) Encode(w io.Writer) (err error) {
if err != nil {
return
}
EntityMetadataValueEncTmp := v.Value
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
switch v.Anon.Type {
case 0:
EntityMetadataValue, ok := v.Value.(int8)
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue)
if err != nil {
return
}
case 1:
EntityMetadataValue, ok := v.Value.(int32)
if !ok {
err = proto_base.BadTypeError
return
}
err = proto_base.EncodeVarInt(w, EntityMetadataValue)
if err != nil {
return
}
case 10:
EntityMetadataValue, ok := v.Value.(int32)
if !ok {
err = proto_base.BadTypeError
return
}
err = proto_base.EncodeVarInt(w, EntityMetadataValue)
if err != nil {
return
}
case 11:
EntityMetadataValue, ok := v.Value.(*uuid.UUID)
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue != nil)
if err != nil {
return
}
if EntityMetadataValue != nil {
_, err = w.Write((*EntityMetadataValue)[:])
if err != nil {
return
}
}
case 12:
EntityMetadataValue, ok := v.Value.(int32)
if !ok {
err = proto_base.BadTypeError
return
}
err = proto_base.EncodeVarInt(w, EntityMetadataValue)
if err != nil {
return
}
case 13:
EntityMetadataValue, ok := v.Value.(nbt.Tag)
if !ok {
err = proto_base.BadTypeError
return
}
EntityMetadataValueEncTmp := EntityMetadataValue
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
}
case 2:
EntityMetadataValue, ok := v.Value.(float32)
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue)
if err != nil {
return
}
case 3:
EntityMetadataValue, ok := v.Value.(string)
if !ok {
err = proto_base.BadTypeError
return
}
err = proto_base.EncodeString(w, EntityMetadataValue)
if err != nil {
return
}
case 4:
EntityMetadataValue, ok := v.Value.(string)
if !ok {
err = proto_base.BadTypeError
return
}
err = proto_base.EncodeString(w, EntityMetadataValue)
if err != nil {
return
}
case 5:
EntityMetadataValue, ok := v.Value.(Slot)
if !ok {
err = proto_base.BadTypeError
return
}
EntityMetadataValueEncTmp := EntityMetadataValue
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
}
case 6:
EntityMetadataValue, ok := v.Value.(bool)
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue)
if err != nil {
return
}
case 7:
EntityMetadataValue, ok := v.Value.(struct {
Pitch float32
Yaw float32
Roll float32
})
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue.Pitch)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue.Yaw)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue.Roll)
if err != nil {
return
}
case 8:
EntityMetadataValue, ok := v.Value.(Position)
if !ok {
err = proto_base.BadTypeError
return
}
EntityMetadataValueEncTmp := EntityMetadataValue
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
}
case 9:
EntityMetadataValue, ok := v.Value.(*Position)
if !ok {
err = proto_base.BadTypeError
return
}
err = binary.Write(w, binary.BigEndian, EntityMetadataValue != nil)
if err != nil {
return
}
if EntityMetadataValue != nil {
EntityMetadataValueEncTmp := *EntityMetadataValue
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
}
}
}
}
err = binary.Write(w, binary.BigEndian, uint8(255))
@@ -8288,11 +8579,182 @@ type PlayToClientPacketWorldParticles struct {
}
func (ret *PlayToClientPacketWorldParticles) Decode(r io.ReadSeeker) (err error) {
err = proto_base.ToDoError
err = binary.Read(r, binary.BigEndian, &ret.ParticleId)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.LongDistance)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.X)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Y)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Z)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.OffsetX)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.OffsetY)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.OffsetZ)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.ParticleData)
if err != nil {
return
}
err = binary.Read(r, binary.BigEndian, &ret.Particles)
if err != nil {
return
}
switch ret.ParticleId {
case 36:
var PlayToClientPacketWorldParticlesData36Tmp []int32
var lPlayToClientPacketWorldParticlesData36Tmp int32
lPlayToClientPacketWorldParticlesData36Tmp = 2
PlayToClientPacketWorldParticlesData36Tmp = []int32{}
for range lPlayToClientPacketWorldParticlesData36Tmp {
var PlayToClientPacketWorldParticlesData36TmpElement int32
PlayToClientPacketWorldParticlesData36TmpElement, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
PlayToClientPacketWorldParticlesData36Tmp = append(PlayToClientPacketWorldParticlesData36Tmp, PlayToClientPacketWorldParticlesData36TmpElement)
}
ret.Data = PlayToClientPacketWorldParticlesData36Tmp
case 37:
var PlayToClientPacketWorldParticlesData37Tmp []int32
var lPlayToClientPacketWorldParticlesData37Tmp int32
lPlayToClientPacketWorldParticlesData37Tmp = 1
PlayToClientPacketWorldParticlesData37Tmp = []int32{}
for range lPlayToClientPacketWorldParticlesData37Tmp {
var PlayToClientPacketWorldParticlesData37TmpElement int32
PlayToClientPacketWorldParticlesData37TmpElement, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
PlayToClientPacketWorldParticlesData37Tmp = append(PlayToClientPacketWorldParticlesData37Tmp, PlayToClientPacketWorldParticlesData37TmpElement)
}
ret.Data = PlayToClientPacketWorldParticlesData37Tmp
case 38:
var PlayToClientPacketWorldParticlesData38Tmp []int32
var lPlayToClientPacketWorldParticlesData38Tmp int32
lPlayToClientPacketWorldParticlesData38Tmp = 1
PlayToClientPacketWorldParticlesData38Tmp = []int32{}
for range lPlayToClientPacketWorldParticlesData38Tmp {
var PlayToClientPacketWorldParticlesData38TmpElement int32
PlayToClientPacketWorldParticlesData38TmpElement, err = proto_base.DecodeVarInt(r)
if err != nil {
return
}
PlayToClientPacketWorldParticlesData38Tmp = append(PlayToClientPacketWorldParticlesData38Tmp, PlayToClientPacketWorldParticlesData38TmpElement)
}
ret.Data = PlayToClientPacketWorldParticlesData38Tmp
default:
var PlayToClientPacketWorldParticlesDataTmp struct {
}
ret.Data = PlayToClientPacketWorldParticlesDataTmp
}
return
}
func (ret *PlayToClientPacketWorldParticles) Encode(w io.Writer) (err error) {
err = proto_base.ToDoError
err = binary.Write(w, binary.BigEndian, ret.ParticleId)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.LongDistance)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.X)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Y)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Z)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.OffsetX)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.OffsetY)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.OffsetZ)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.ParticleData)
if err != nil {
return
}
err = binary.Write(w, binary.BigEndian, ret.Particles)
if err != nil {
return
}
switch ret.ParticleId {
case 36:
PlayToClientPacketWorldParticlesData, ok := ret.Data.([]int32)
if !ok {
err = proto_base.BadTypeError
return
}
for iPlayToClientPacketWorldParticlesData := range len(PlayToClientPacketWorldParticlesData) {
err = proto_base.EncodeVarInt(w, PlayToClientPacketWorldParticlesData[iPlayToClientPacketWorldParticlesData])
if err != nil {
return
}
}
case 37:
PlayToClientPacketWorldParticlesData, ok := ret.Data.([]int32)
if !ok {
err = proto_base.BadTypeError
return
}
for iPlayToClientPacketWorldParticlesData := range len(PlayToClientPacketWorldParticlesData) {
err = proto_base.EncodeVarInt(w, PlayToClientPacketWorldParticlesData[iPlayToClientPacketWorldParticlesData])
if err != nil {
return
}
}
case 38:
PlayToClientPacketWorldParticlesData, ok := ret.Data.([]int32)
if !ok {
err = proto_base.BadTypeError
return
}
for iPlayToClientPacketWorldParticlesData := range len(PlayToClientPacketWorldParticlesData) {
err = proto_base.EncodeVarInt(w, PlayToClientPacketWorldParticlesData[iPlayToClientPacketWorldParticlesData])
if err != nil {
return
}
}
default:
_, ok := ret.Data.(struct {
})
if !ok {
err = proto_base.BadTypeError
return
}
}
return
}