找回密码
 registerss
搜索
查看: 32|回复: 0

洱海月 v0-07-0300 封包解析:ID 115 CGLockTarget(锁定目标)

[复制链接]
  • 打卡等级:本地老炮
  • 打卡总天数:603
  • 打卡月天数:1
  • 打卡总奖励:600
  • 最近打卡:2026-10-03 06:32:28
Waylee 发表于 2026-4-12 17:00 | 显示全部楼层 |阅读模式 | Google Chrome | Windows 10

马上注册,查看网站隐藏内容!!

您需要 登录 才可以下载或查看,没有账号?registerss

×

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 在当前旧版项目里的结论很直接:

  1. 这条包的 ID 是 115,固定长度 4。
  2. 包体只有一个字段:target_id。
  3. 当前服务端收到后只会更新角色内部 locked_target 状态。
  4. 这条链没有专用回包,也没有额外场景对象合法性校验。
  5. 当前 human:on_lock_target() 里的脚本任务联动已被注释掉,因此现状主要是“记录锁定目标”,而不是立即触发额外业务效果。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

QQ|手机版|雪舞知识库 ( 浙ICP备15015590号-1 | 萌ICP备20232229号|浙公网安备33048102000118号 )|天天打卡

GMT+8, 2026-10-4 11:26 , Processed in 0.066021 second(s), 26 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表