implement initial packet parse conditionals
This commit is contained in:
parent
7a2bfc13f8
commit
7af6e70d8b
158
defs/gen/main.go
158
defs/gen/main.go
@ -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
Loading…
x
Reference in New Issue
Block a user