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
+177 -15
View File
@@ -1,6 +1,6 @@
// Code generated by strom. DO NOT EDIT.
// source: minecraft-data/pc/1.8/protocol.json (sha256:79fe774bfc255dd281899c004fbb9c7adc40fb107de9353da1dd0371ea4b53af)
// version: (devel) (go1.26.2)
// version: v0.6.6-0.20260805154326-fa70ea36c6f5+dirty (go1.26.2)
package v1_8
import (
@@ -45,7 +45,7 @@ type EntityMetadata struct {
Type uint8
Key uint8
}
Value EntityMetadataItem
Value any
}
}
@@ -55,7 +55,7 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
Type uint8
Key uint8
}
Value EntityMetadataItem
Value any
})
var id uint8
for {
@@ -75,7 +75,7 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
Type uint8
Key uint8
}
Value EntityMetadataItem
Value any
}
var EntityMetadataInnerAnonPacked uint8
err = binary.Read(r, binary.BigEndian, &EntityMetadataInnerAnonPacked)
@@ -84,10 +84,6 @@ func (ret *EntityMetadata) Decode(r io.ReadSeeker) (err error) {
}
entry.Anon.Type = EntityMetadataInnerAnonPacked << 0 >> 5
entry.Anon.Key = EntityMetadataInnerAnonPacked << 3 >> 3
err = entry.Value.Decode(r)
if err != nil {
return
}
ret.Val[id] = entry
}
return
@@ -101,11 +97,6 @@ func (ret *EntityMetadata) Encode(w io.Writer) (err error) {
if err != nil {
return
}
EntityMetadataValueEncTmp := v.Value
err = EntityMetadataValueEncTmp.Encode(w)
if err != nil {
return
}
}
err = binary.Write(w, binary.BigEndian, uint8(127))
if err != nil {
@@ -7105,11 +7096,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
}