★★★ 重要修正(2026-09-16 21:04,用户游戏实测确认)★★★
A440(一)不是名字定界符! 之前误把抓包首尾的A4 40当成固定包裹。
实测真相:你抓的两条包角色名本身就叫「一至尊霸王花一」「一至尊一美美一」,
那两个A4 40是名字自带的「一」字的 BIG5 编码,属于名字内容。
正确结构 = 固定头 + 名字本身的 BIG5(不加任何 A440 包裹)+00 00+ 补零到 40。
已用 Python 验证:用新结构拼「一至尊霸王花一」逐字节 = 抓包1、拼「一至尊一美美一」逐字节 = 抓包2(完全吻合)。来源:用户抓到的两条
组队-邀请(按名字)发包样本
- 包1 名字一至尊霸王花一(名字本身含首尾「一」)
- 包2 名字一至尊一美美一
工具:analyze_team_packet.py(BIG5 解码 + 字节差分)
偏移 包1(一至尊霸王花一) 包2(一至尊一美美一) 说明
00 00 00 00 00 ┐
02 00 00 00 00 │ 固定头(14字节)
04 30 00 30 00 │ 两包完全相同
06 14 00 14 00 │
08 01 00 01 00 │
0A 01 00 01 00 │
0C FF FF FF FF ┘ 名字区起始标记
0E(14) A4 40 一 A4 40 一 ┐
10(16) A6 DC 至 A6 DC 至 │
12(18) B4 4C 尊 B4 4C 尊 │ 这是「名字本身的 BIG5」
14(20) C5 51 霸 A4 40 一 ★差异 │ (首/尾 A440 是名字自带的「一」字,
16(22) A4 FD 王 AC FC 美 ★差异 │ 不是定界符!)
18(24) AA E1 花 AC FC 美 ★差异 │
1A(26) A4 40 一 A4 40 一 ┘
1C(28) 00 00 00 00 名字 null 终止
1E.. 00 00 00 ...(补零到 40 字节) 填充
两包 总长均 = 40 字节,唯一差异在名字区(offset 20–25)。固定头 14 字节 + 名字区(含自带「一」) + 00 00 终止 + 补零。
| 项目 | 结论 |
|---|---|
| 包类型 | SEND(客户端→服务器)组队邀请/建队-按名字 |
| 名字编码 | BIG5(每汉字 2 字节),与内存中角色名编码一致 |
| 名字区 | 角色名本身的 BIG5 字节,两端不加任何 A440 包裹(名字自带「一」时才含 A440,它是名字内容) |
| 名字终止 | 紧跟 00 00(null 终止) |
| 固定头 | 00 00 00 00 30 00 14 00 01 00 01 00 FF FF(14 字节,常量) |
| 长度 | 两样本首 4 字节为 00 00 00 00 → 长度/占位字段,发送前由发包函数填实际长度(抓的是填长度之前的模板) |
| 校验 | 尾部全 0,无附加 CRC/校验 |
BIG5 对照(已用 big5 解码验证):
一=A440 至=A6DC 尊=B44C 霸=C551 王=A4FD 花=AAE1 美=ACFC 没=A853 有=A6B3 男=A86B 朋=AA42 友=A4CD
[00..03] 00 00 00 00 长度/占位(发送时填实际长度,小端)
[04..05] 30 00 疑似 opcode = 0x0030(组队相关;用你 发包.static.e.txt 比对确认)
[06..07] 14 00 0x0014=20,疑似子命令/模式
[08..09] 01 00 计数/类别 = 1
[0A..0B] 01 00 标志 = 1("按名字"模式)
[0C..0D] FF FF 名字区起始标记
[0E.. ] NAME(本身BIG5) 名字(可变长, 以 00 00 结束);名字若含「一」则自然带 A440
[ ..] 00 ... 补零到 40 字节
⚠ opcode/长度字段含义仅凭两条同类型样本推断,建议用你
发包.static.e.txt里已有的组队发包函数交叉核对 opcode,或抓一条"长度已填"的活包确认[00..03]是不是长度。固定头、名字编码、以及"不加 A440 定界"是 100% 确定的。
关键:简体名 → BIG5 → 直接拼名字本身 → 拼固定头 → 补零到 40。不要再手动包 A440。
若角色名本身带「一」(如「一至尊霸王花一」),编码_简体到BIG5 会自动把「一」编成 A440,自然包含,无需额外处理。
.版本 2
.子程序 构造_按名字组队发包, 字节集, , 返回完整发包字节集,交给你的发包函数发送
.参数 玩家名简体, 文本型, , 角色真实名字,例如 "没有男朋友" / "LOADING" / "一至尊霸王花一"
.局部变量 名包裹, 字节集
.局部变量 包头, 字节集
.局部变量 结果, 字节集
' 1) 固定包头(14字节,已验证两包完全一致)
包头 = { 0x00, 0x00, 0x00, 0x00, 0x30, 0x00, 0x14, 0x00, 0x01, 0x00, 0x01, 0x00, 0xFF, 0xFF }
' 2) 名字:直接 BIG5(名) + 00 00(★不加 A440 包裹)
名包裹 = 编码_简体到BIG5_字节集 (玩家名简体) + { 0x00, 0x00 }
' 3) 拼包并补零到 40 字节
结果 = 字节集_合并 (包头, 名包裹)
.如果 (取字节集长度 (结果) < 40)
结果 = 结果 + 取重复字节集 (40 - 取字节集长度 (结果), 0)
.如果结束
返回 (结果)
注:
编码_简体到BIG5_字节集换成你模块里实际的「简体→BIG5 字节集」函数名(常见编码_简体到BIG5返回文本,再用到字节集)。简体"没/有"在 BIG5 无对应单字,该模块是 GBK→BIG5 转换,会自动转成繁体「沒/有」,这正是游戏需要的。
调试输出 (字节集_到十六进制 (构造_按名字组队发包 ("没有男朋友")))
' 应输出: 000000003000140001000100FFFFA853A6B3A86BAA42A4CD00000000000000000000000000000000
| 名字 | 完整 40 字节包(名字区=纯 BIG5) |
|---|---|
| 没有男朋友 | 000000003000140001000100FFFFA853A6B3A86BAA42A4CD00000000000000000000000000000000 |
| 没男朋友 | 000000003000140001000100FFFFA853A86BAA42A4CD000000000000000000000000000000000000 |
| LOADING(ASCII) | 000000003000140001000100FFFF4C4F4144494E4700000000000000000000000000000000000000 |
| 一至尊霸王花一(名字自带一) | 000000003000140001000100FFFFA440A6DCB44CC551A4FDAAE1A440000000000000000000000000 |
| 一至尊一美美一 | 000000003000140001000100FFFFA440A6DCB44CA440ACFCACFCA440000000000000000000000000 |
后两条即你原始抓包,用「名字本身 BIG5」拼法逐字节吻合,证明 A440 确为名字内容、非定界符。
队员基址 难点。人物对象 名字(BIG5,offset +0x18)作为目标,遍历 怪物基址值 0x03BE3E68(类型 0x31=人物)取名字。构造_按名字组队发包 / 发包名字组队(见 发包名字组队_子程序.e.txt)接进组队逻辑,游戏内实测能否拉人进队。