fix(binary): 修复零值处理导致的结构体打包异常
在 binaryFallback 的 Sizeof 和 Pack 方法中增加对 IsZero 值的判断,
避免空值参与序列化计算引发错误。同时调整了 struc 包相关逻辑以正确
处理空值情况,并打印调试日志辅助排查。
feat(fight): 完善玩家 PVP 对战胜负统计逻辑
修正 PET_MELEE 与 PET_King 模式下胜利归属判定问题,确保只有实际胜出
者才累计胜利次数。此外优化了战斗邀请流程,移除冗余状态控制字段并增强
邀请有效性校验,提升 PvP 流程稳定性。
refactor(pack): 简化数据组包逻辑并提高兼容性
重构 TomeeHeader.Pack 方法,去除反射相关的复杂类型判断,统一使用 struc
进行编码,强化对 nil、interface{} 及多级指针的支持。另外更新了客户端发包
记录日志内容以便追踪调试。
style(code): 规范代码格式并清理无用注释和字段
删除多个文件中的无效或过时注释,如 PlayerID 字段标记废弃、无意义的日志输出等;
同步更新结构体字段命名一致性(如 NonoColor),并对部分函数参数及条件表达式做
可读性优化,整体提升代码整洁度和维护性。
```
89 lines
2.3 KiB
Go
89 lines
2.3 KiB
Go
package common
|
||
|
||
import (
|
||
"bytes"
|
||
"encoding/binary"
|
||
"fmt"
|
||
|
||
"github.com/lunixbochs/struc"
|
||
)
|
||
|
||
// TomeeHeader 结构体字段定义
|
||
type TomeeHeader struct {
|
||
Len uint32 `json:"len"`
|
||
Version byte `json:"version" struc:"[1]byte"`
|
||
CMD uint32 `json:"cmdId" struc:"uint32"`
|
||
UserID uint32 `json:"userId"`
|
||
//Error uint32 `json:"error" struc:"[0]pad"`
|
||
|
||
Result uint32 `json:"result"`
|
||
Data []byte `json:"data" struc:"skip"` //组包忽略此字段// struc:"[0]pad"
|
||
//Return []byte `struc:"[0]pad"` //返回记录
|
||
}
|
||
|
||
func NewTomeeHeader(cmd uint32, userid uint32) *TomeeHeader {
|
||
|
||
return &TomeeHeader{
|
||
CMD: cmd,
|
||
// Len: 0,
|
||
Version: 49,
|
||
Result: 0,
|
||
}
|
||
|
||
}
|
||
|
||
// Pack 组包方法:手动编码字节流,兼容interface{}、nil、多层指针/接口
|
||
func (h *TomeeHeader) Pack(data any) []byte {
|
||
if data == nil {
|
||
return h.packHeaderWithData([]byte{})
|
||
}
|
||
var data1 bytes.Buffer
|
||
err := struc.Pack(&data1, data)
|
||
if err != nil {
|
||
fmt.Println(err)
|
||
}
|
||
|
||
//datar = data1.Bytes()
|
||
// 4. 手动打包包头+数据体
|
||
return h.packHeaderWithData(data1.Bytes())
|
||
}
|
||
|
||
// packHeaderWithData 手动编码包头和数据体(静态指定偏移量,无自增变量)
|
||
// 包头固定结构(大端序):
|
||
// - 0-3 字节:Len (uint32)
|
||
// - 4 字节:Version (byte)
|
||
// - 5-8 字节:CMD (uint32,从uint64截断)
|
||
// - 9-12 字节:UserID (uint32)
|
||
// - 13-16 字节:Result (uint32)
|
||
// 17字节后:数据体
|
||
func (h *TomeeHeader) packHeaderWithData(data []byte) []byte {
|
||
// 计算总长度:包头17字节 + 数据体长度
|
||
dataLen := len(data)
|
||
h.Len = uint32(17 + dataLen)
|
||
|
||
// 预分配切片(总长度 = 包头 + 数据体),避免多次扩容
|
||
buf := make([]byte, h.Len)
|
||
|
||
// 1. 写入Len(固定偏移:0-3 字节,大端序)
|
||
binary.BigEndian.PutUint32(buf[0:4], h.Len)
|
||
|
||
// 2. 写入Version(固定偏移:4 字节)
|
||
buf[4] = h.Version
|
||
|
||
// 3. 写入CMD(固定偏移:5-8 字节,大端序)
|
||
binary.BigEndian.PutUint32(buf[5:9], uint32(h.CMD))
|
||
|
||
// 4. 写入UserID(固定偏移:9-12 字节,大端序)
|
||
binary.BigEndian.PutUint32(buf[9:13], h.UserID)
|
||
|
||
// 5. 写入Result(固定偏移:13-16 字节,大端序)
|
||
binary.BigEndian.PutUint32(buf[13:17], h.Result)
|
||
|
||
// 6. 写入数据体(固定起始偏移:17 字节,若有数据则拷贝)
|
||
if dataLen > 0 {
|
||
copy(buf[17:], data)
|
||
}
|
||
|
||
return buf
|
||
}
|