CGLockTarget 是旧版客户端里用于通知服务端“当前锁定目标对象 ID”的请求包。
当前实现里,这条包的作用非常直接:把客户端传来的目标对象 ID 写进角色的 locked_target 状态,不额外返回专用结果包。
包信息
| 项目 |
内容 |
| 封包 ID |
115 |
| 包名 |
CGLockTarget |
| 方向 |
CG 客户端 -> 场景服 |
| 固定包长 |
4 |
| 主要作用 |
设置当前角色的锁定目标对象 ID |
| 当前 Lua 入口 |
request:CGLockTarget() |
| 当前场景服处理 |
scenecore:char_lock_target() |
当前 Game.exe 的虚函数结论为:
GetPacketID() = 115;
GetPacketSize() = 4;
包体结构
这条包是固定长度包。
| 偏移 |
长度 |
字段 |
类型 |
含义 |
0x00 |
0x04 |
target_id |
int32 |
需要锁定的场景对象 ID |
当前实际行为 / 模式说明
- 当前 Lua 请求入口是
request:CGLockTarget(),请求直接发往当前场景服。
- 场景服收到后,只做一件事:
obj_me:set_locked_target(target_id)。
- 当前这条链没有专门的成功/失败回包。
- 当前场景服没有额外校验
target_id 是否真的存在于当前场景,也没有检查对象类型。
character:set_locked_target() 会把该值写进对象实例的 locked_target,随后回调 on_lock_target(target_id)。
- 当前
human:on_lock_target(target_id) 里的任务/脚本联动逻辑整体被注释掉了,所以现状不会再触发额外任务事件。
- 也就是说,当前版本里这条包的实际效果主要是更新角色内部锁定目标状态,供后续技能、自动战斗或其他逻辑读取。
服务端落点
这条包在当前项目里的关键位置如下:
- 协议定义:
/home/ubuntu/Game2/services/game/packet.lua
- 请求入口:
/home/ubuntu/Game2/services/msgagent.lua
- 场景服处理:
/home/ubuntu/Game2/services/scene/scenecore.lua
- 对象状态写入:
/home/ubuntu/Game2/services/scene/obj/character.lua
- 玩家扩展回调:
/home/ubuntu/Game2/services/scene/obj/human.lua
关键代码
当前 Lua 协议定义
packet.CGLockTarget = {
xy_id = packet.XYID_CG_LOCK_TARGET,
ctor = function(self)
self.target_id = 0
end,
bis = function(self, buffer)
local stream = bistream.new()
stream:attach(buffer)
self.target_id = stream:readint()
end
}
当前 Lua 请求入口
function request:CGLockTarget()
skynet.call(my_scene, "lua", "char_lock_target", my_obj_id, self)
end
当前 Lua 场景服处理
function scenecore:char_lock_target(me, lock)
local obj_me = self.objs[me]
if obj_me then
local target_id = lock.target_id
obj_me:set_locked_target(target_id)
end
end
当前 Lua 内部状态写入
function character:set_locked_target(obj_id)
self.locked_target = obj_id
self:on_lock_target(obj_id)
end
当前 Game.exe 的读写与执行结论
GetPacketID() = 115;
GetPacketSize() = 4;
Read(stream) {
read_i32(target_id);
}
Write(stream) {
write_i32(target_id);
}
Execute() {
return 2;
}
当前 Game.exe 这条请求包自身没有额外变长字段,也没有额外包内标志位。
结论
CGLockTarget 在当前旧版项目里的结论很直接:
- 这条包的 ID 是
115,固定长度 4。
- 包体只有一个字段:
target_id。
- 当前服务端收到后只会更新角色内部
locked_target 状态。
- 这条链没有专用回包,也没有额外场景对象合法性校验。
- 当前
human:on_lock_target() 里的脚本任务联动已被注释掉,因此现状主要是“记录锁定目标”,而不是立即触发额外业务效果。
|