GCCharModifyAction 是当前旧版项目仍在使用的动作时间修正包。它用于把角色当前动作的逻辑计数和时间修正量下发给客户端,现役 Lua 会在引导动作、蓄力动作以及受击导致的动作时间变化时发送它。
包信息
| 项目 |
内容 |
| 封包 ID |
134 |
| 包名 |
GCCharModifyAction |
| 方向 |
Server -> Client |
| 包长 |
12 |
| 当前 Lua 协议定义 |
已实现 bos() |
| 作用 |
同步角色当前动作的逻辑计数与时间修正量 |
包体结构
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
m_objID |
int32 |
角色对象 ID |
0x04 |
0x04 |
logic_count |
int32 |
当前动作逻辑计数 |
0x08 |
0x04 |
modify_time |
int32 |
本次动作时间修正值,单位毫秒 |
当前实际行为
- 当前
Game.exe 中,GetPacketID() 返回 134,GetPacketSize() 返回 12。
Read() / Write() 顺序固定为 m_objID -> logic_count -> modify_time。
- 当前 Lua 协议定义与
Game.exe 完全一致:
/home/ubuntu/Game2/services/game/packet.lua 只实现了 bos()
- 现役发送点有两类:
actionenginer:broadcast_unit_channel_time_changed() 与 broadcast_unit_charge_time_changed() 会把 delta_time 发给客户端
character.lua 在角色处于施法动作且被伤害打断节奏时,也会下发同结构修正
- 这条包不是“开始动作”广播,而是“当前动作时间被修正”的补丁包;真正的开始广播由其他动作包负责。
服务端落点
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 现役发送点:
/home/ubuntu/Game2/lualib/actionenginer.lua
/home/ubuntu/Game2/services/scene/obj/character.lua
关键代码
packet.GCCharModifyAction = {
bos = function(self)
local stream = bostream.new()
stream:writeint(self.m_objID)
stream:writeint(self.logic_count)
stream:writeint(self.modify_time)
return stream:get()
end
}
function actionenginer:broadcast_unit_channel_time_changed(actor, delta_time)
local msg = packet_def.GCCharModifyAction.new()
msg.m_objID = actor:get_obj_id()
msg.logic_count = actor:get_logic_count()
msg.modify_time = delta_time
actor:get_scene():send2client(actor, msg)
end
local msg = packet_def.GCCharModifyAction.new()
msg.m_objID = selfId
msg.logic_count = self:get_logic_count()
msg.modify_time = continuance
scene:send2client(self, msg)
结论
GCCharModifyAction(134) 是当前版本现役动作修正包,固定 12 字节,结构已经可以明确写成 m_objID + logic_count + modify_time。它的核心用途不是启动动作,而是在动作进行中把剩余时间变化同步给客户端。
|