GCDiaowenFeatureSkill 是当前版本已经接入现役 Lua 的一条小型下行包,用于把某个角色对象的雕纹特性效果 ID 广播给客户端。现役 /home/ubuntu/Game2 Lua 服务端与当前 Game.exe 对它的结构完全一致,都是固定 8 字节。
包信息
| 项目 |
内容 |
| 封包 ID |
1340 |
| 包名 |
GCDiaowenFeatureSkill |
| 方向 |
GC 服务端 -> 客户端 |
| 固定包长 |
8 |
| 当前 Lua 协议定义 |
已检出 |
| 当前 Lua 发送点 |
已检出 |
| 当前用途 |
广播角色当前雕纹特性效果 ID |
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
obj_id |
uint32 |
目标角色对象 ID |
0x04 |
0x04 |
effect_id |
uint32 |
雕纹特性效果 ID;对应客户端特性配置表中的主键 |
当前实际行为
- 现役 Lua 在
human:features_effect_notify_client(id, objid) 中构造并广播这条包。
obj_id 默认取角色自身对象 ID,也允许显式指定目标对象。
- 客户端收到后会先找到目标对象,再根据
effect_id 到雕纹特性配置表查找对应效果,并应用到该对象。
- 这条包已经不需要任何
unknow 命名,当前 Lua 里的 objId 和 effect_id 已能直接对应客户端消费语义。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 发送入口:
/home/ubuntu/Game2/services/scene/obj/human.lua
当前现役发送链:
function human:features_effect_notify_client(id,objid)
objid = objid or self:get_obj_id()
local msg = packet_def.GCDiaowenFeatureSkill.new()
msg.objId = objid
msg.effect_id = id
self:get_scene():broadcast(self, msg, true)
end
关键代码
Lua 协议定义:
packet.GCDiaowenFeatureSkill = {
ctor = function(self)
self.objId = -1
self.effect_id = -1
end,
bos = function(self)
local stream = bostream.new()
stream:writeuint(self.objId)
stream:writeuint(self.effect_id)
return stream:get()
end
}
当前 Game.exe 结构:
Read() {
read_u32(obj_id);
read_u32(effect_id);
return 1;
}
GetPacketSize() {
return 8;
}
Execute() {
obj = find_obj(obj_id);
if (obj)
apply_diaowen_feature_effect(obj, effect_id);
return 2;
}
结论
GCDiaowenFeatureSkill(1340) 的当前结论非常稳定:
- 固定
8 字节。
- 字段就是
obj_id + effect_id。
- 当前 Lua 已接入真实发送链,结论直接以当前 Lua 与当前
Game.exe 对齐。
|