1
0

implement initial packet parse conditionals

This commit is contained in:
Sky Johnson 2025-09-05 16:45:12 -05:00
parent 7a2bfc13f8
commit 7af6e70d8b
3 changed files with 2220 additions and 3143 deletions

View File

@ -396,14 +396,17 @@ type {{.Name}} struct {
// Serialize writes the packet data to the provided buffer
func (p *{{.Name}}) Serialize(dest []byte) uint32 {
offset := uint32(0)
{{range .Fields}}
{{- range .Fields}}
{{- if .IfVarSet}}
if p.{{toGoName .IfVarSet}} != 0 {
{{- else if .IfVarNotSet}}
if p.{{toGoName .IfVarNotSet}} == 0 {
{{- end}}
{{- if .IsDynamicArray}}
// Write {{.GoName}} array (dynamic size)
for _, elem := range p.{{.GoName}} {
{{- template "serializeFields" .ArrayElements}}
}
{{- else if eq .Type "string"}}
// Write {{.GoName}} as {{if contains .Tag "str16"}}16-bit{{else if contains .Tag "str32"}}32-bit{{else if contains .Tag "EQ2_32Bit_String"}}32-bit{{else}}8-bit{{end}} length-prefixed string
{{- if or (contains .Tag "str16") (contains .Tag "EQ2_16Bit_String")}}
binary.LittleEndian.PutUint16(dest[offset:], uint16(len(p.{{.GoName}})))
offset += 2
@ -417,7 +420,6 @@ func (p *{{.Name}}) Serialize(dest []byte) uint32 {
copy(dest[offset:], []byte(p.{{.GoName}}))
offset += uint32(len(p.{{.GoName}}))
{{- else if .IsArray}}
// Write {{.GoName}} array
for i := 0; i < {{.Size}}; i++ {
{{- if eq (baseType .Type) "float32"}}
binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.{{.GoName}}[i]))
@ -428,7 +430,7 @@ func (p *{{.Name}}) Serialize(dest []byte) uint32 {
{{- else if (eq (baseType .Type) "int8")}}
dest[offset] = byte(p.{{.GoName}}[i])
offset++
{{- else if or (eq (baseType .Type) "uint8") (eq (baseType .Type) "byte")}}
{{- else if or (eq (baseType .Type) "uint8") (eq (baseType .Type) "byte")}}
dest[offset] = p.{{.GoName}}[i]
offset++
{{- else if or (eq (baseType .Type) "int16") (eq (baseType .Type) "uint16")}}
@ -454,7 +456,6 @@ func (p *{{.Name}}) Serialize(dest []byte) uint32 {
{{- end}}
}
{{- else}}
// Write {{.GoName}}
{{- if eq .Type "float32"}}
binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(p.{{.GoName}}))
offset += 4
@ -480,31 +481,82 @@ func (p *{{.Name}}) Serialize(dest []byte) uint32 {
offset += 8
{{- end}}
{{- end}}
{{end}}
{{- if or .IfVarSet .IfVarNotSet}}
}
{{- end}}
{{- end}}
return offset
}
// Size returns the serialized size of the packet
func (p *{{.Name}}) Size() uint32 {
return types.CalculateSize(p)
size := uint32(0)
{{- range .Fields}}
{{- if .IfVarSet}}
if p.{{toGoName .IfVarSet}} != 0 {
{{- else if .IfVarNotSet}}
if p.{{toGoName .IfVarNotSet}} == 0 {
{{- end}}
{{- if .IsDynamicArray}}
for _, elem := range p.{{.GoName}} {
_ = elem
{{- template "sizeFields" .ArrayElements}}
}
{{- else if eq .Type "string"}}
{{- if or (contains .Tag "str16") (contains .Tag "EQ2_16Bit_String")}}
size += 2 + uint32(len(p.{{.GoName}}))
{{- else if or (contains .Tag "str32") (contains .Tag "EQ2_32Bit_String")}}
size += 4 + uint32(len(p.{{.GoName}}))
{{- else}}
size += 1 + uint32(len(p.{{.GoName}}))
{{- end}}
{{- else if .IsArray}}
{{- if eq (baseType .Type) "types.EquipmentItem"}}
size += uint32({{.Size}}) * 8
{{- else if eq (baseType .Type) "types.Color"}}
size += uint32({{.Size}}) * 3
{{- else if or (eq (baseType .Type) "float32") (eq (baseType .Type) "int32") (eq (baseType .Type) "uint32")}}
size += uint32({{.Size}}) * 4
{{- else if or (eq (baseType .Type) "float64") (eq (baseType .Type) "int64") (eq (baseType .Type) "uint64")}}
size += uint32({{.Size}}) * 8
{{- else if or (eq (baseType .Type) "int16") (eq (baseType .Type) "uint16")}}
size += uint32({{.Size}}) * 2
{{- else}}
size += uint32({{.Size}})
{{- end}}
{{- else}}
{{- if eq .Type "types.Color"}}
size += 3
{{- else if or (eq .Type "float32") (eq .Type "int32") (eq .Type "uint32")}}
size += 4
{{- else if or (eq .Type "float64") (eq .Type "int64") (eq .Type "uint64")}}
size += 8
{{- else if or (eq .Type "int16") (eq .Type "uint16")}}
size += 2
{{- else}}
size += 1
{{- end}}
{{- end}}
{{- if or .IfVarSet .IfVarNotSet}}
}
{{- end}}
{{- end}}
return size
}
{{end}}
{{define "serializeFields"}}
{{- range .}}
{{- if .IsDynamicArray}}
// Write nested {{.GoName}} array
for _, nestedElem := range elem.{{.GoName}} {
{{- template "serializeNestedFields" .ArrayElements}}
}
{{- else if eq .Type "string"}}
// Write {{.GoName}} string field
dest[offset] = byte(len(elem.{{.GoName}}))
offset++
copy(dest[offset:], []byte(elem.{{.GoName}}))
offset += uint32(len(elem.{{.GoName}}))
{{- else if .IsArray}}
// Write {{.GoName}} array field
for i := 0; i < {{.Size}}; i++ {
{{- if eq (baseType .Type) "float32"}}
binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(elem.{{.GoName}}[i]))
@ -551,24 +603,21 @@ func (p *{{.Name}}) Size() uint32 {
offset++
{{- end}}
{{- end}}
{{end}}
{{- end}}
{{define "serializeNestedFields"}}
{{- range .}}
{{- if .IsDynamicArray}}
// Write deeply nested {{.GoName}} array
for _, deepNested := range nestedElem.{{.GoName}} {
// TODO: Handle deeper nesting if needed
_ = deepNested
}
{{- else if eq .Type "string"}}
// Write {{.GoName}} string field
dest[offset] = byte(len(nestedElem.{{.GoName}}))
offset++
copy(dest[offset:], []byte(nestedElem.{{.GoName}}))
offset += uint32(len(nestedElem.{{.GoName}}))
{{- else if .IsArray}}
// Write {{.GoName}} array field
for i := 0; i < {{.Size}}; i++ {
{{- if eq (baseType .Type) "float32"}}
binary.LittleEndian.PutUint32(dest[offset:], math.Float32bits(nestedElem.{{.GoName}}[i]))
@ -615,6 +664,80 @@ func (p *{{.Name}}) Size() uint32 {
offset++
{{- end}}
{{- end}}
{{- end}}
{{define "sizeFields"}}
{{- range .}}
{{- if .IsDynamicArray}}
for _, nestedElem := range elem.{{.GoName}} {
_ = nestedElem
{{- template "sizeNestedFields" .ArrayElements}}
}
{{- else if eq .Type "string"}}
size += 1 + uint32(len(elem.{{.GoName}}))
{{- else if .IsArray}}
{{- if eq (baseType .Type) "float32"}}
size += uint32({{.Size}}) * 4
{{- else if eq (baseType .Type) "uint32"}}
size += uint32({{.Size}}) * 4
{{- else if eq (baseType .Type) "uint16"}}
size += uint32({{.Size}}) * 2
{{- else}}
size += uint32({{.Size}})
{{- end}}
{{- else if eq .Type "float32"}}
size += 4
{{- else if eq .Type "types.Color"}}
size += 3
{{- else if eq .Type "uint32"}}
size += 4
{{- else if eq .Type "int32"}}
size += 4
{{- else if eq .Type "uint16"}}
size += 2
{{- else if eq .Type "int16"}}
size += 2
{{- else}}
size += 1
{{- end}}
{{- end}}
{{end}}
{{define "sizeNestedFields"}}
{{- range .}}
{{- if .IsDynamicArray}}
for _, deepNested := range nestedElem.{{.GoName}} {
// TODO: Handle deeper nesting size calculation
_ = deepNested
}
{{- else if eq .Type "string"}}
size += 1 + uint32(len(nestedElem.{{.GoName}}))
{{- else if .IsArray}}
{{- if eq (baseType .Type) "float32"}}
size += uint32({{.Size}}) * 4
{{- else if eq (baseType .Type) "uint32"}}
size += uint32({{.Size}}) * 4
{{- else if eq (baseType .Type) "uint16"}}
size += uint32({{.Size}}) * 2
{{- else}}
size += uint32({{.Size}})
{{- end}}
{{- else if eq .Type "float32"}}
size += 4
{{- else if eq .Type "types.Color"}}
size += 3
{{- else if eq .Type "uint32"}}
size += 4
{{- else if eq .Type "int32"}}
size += 4
{{- else if eq .Type "uint16"}}
size += 2
{{- else if eq .Type "int16"}}
size += 2
{{- else}}
size += 1
{{- end}}
{{- end}}
{{end}}
`
@ -622,6 +745,10 @@ func contains(s, substr string) bool {
return strings.Contains(s, substr)
}
func toGoNameInTemplate(name string) string {
return toGoName(name)
}
func baseType(arrayType string) string {
// Extract base type from array declaration like "[10]uint32"
if strings.HasPrefix(arrayType, "[") {
@ -717,6 +844,7 @@ func processFile(inputFile, outputPath, packageName string) {
tmpl.Funcs(template.FuncMap{
"contains": contains,
"baseType": baseType,
"toGoName": toGoNameInTemplate,
"sizeOf": sizeOf,
})

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff