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

洱海月 v0-07-0300 封包解析:ID 574 GCStallError(摆摊失败回包)

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

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

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

×

GCStallError 是当前摆摊系统使用的一条统一失败回包。当前 Game.exe 与当前 Lua 协议定义都能直接确认,这条包固定长度只有 1 字节,包体只携带一个 uint8 错误码,用来提示开摊、改价、下架、购买和留言板相关操作的失败原因。

当前版本里,这条包不是某一个请求的专属回包,而是摆摊子流程共用的错误提示出口。只要服务端在摆摊链路中判定失败,就会按场景返回对应错误码。

包信息

项目 内容
封包 ID 574
包名 GCStallError
方向 GC 服务端 -> 客户端
固定包长 1
对应请求 无专用请求
当前 Lua 协议定义 /home/ubuntu/Game2/services/game/packet.lua
当前主要发送点 /home/ubuntu/Game2/services/scene/scenecore.lua、/home/ubuntu/Game2/services/scripts/scene.lua
主要作用 作为摆摊系统统一失败回包,下发 1 字节错误码给客户端提示原因

当前 Game.exe 可直接确认:

GetPacketID()   = 574;
GetPacketSize() = 1;

包体结构

按当前 Game.exe 的 Read / Write 逻辑,以及当前 Lua 的 bos() 实现,这条包固定为 1 字节。

偏移 长度 字段 类型 含义
0x00 0x01 error_code uint8 摆摊错误码

当前 Lua 协议对象里这个字段实际写作 result,但从枚举定义、客户端 handler 和服务端发送语义来看,它的最终字段含义就是“摆摊错误码”,文档中统一整理为 error_code。

当前实际行为 / 模式说明

GCStallError 是当前摆摊链路的统一失败出口,当前 Lua 主链已确认会在以下场景发出:

  • 开摊资格非法或当前状态不允许摆摊
  • 开摊税费不足
  • 改价、下架时条目不存在或客户端缓存已过期
  • 购买道具或珍兽时,背包空间不足、金额不足、条目状态已变化
  • 查看摊位留言板或同步留言信息时,目标摊位状态非法

当前 Lua 协议定义中的错误码表如下:

值 Lua 枚举名 含义 当前 Lua 主链发送情况
0 ERR_ERR 通用错误保底值 未见明确发送
1 ERR_ILLEGAL 当前状态、目标或请求上下文非法 已确认发送
2 ERR_CLOSE 摊位已关闭 未见明确发送
3 ERR_OWNER_INVALID 摊主无效 未见明确发送
4 ERR_NEED_NEW_COPY 摊位内容或 serial 已变化,需要客户端刷新后重试 已确认发送
5 ERR_NOT_ENOUGH_ROOM 背包或珍兽栏空间不足 已确认发送
6 ERR_NOT_ENOUGH_ROOM_IN_STALL 摊位内部空间不足 未见明确发送
7 ERR_NOT_ENOUGH_MONEY 金额不足,无法购买 已确认发送
8 ERR_ALREADY_LOCK 目标已被锁定或不可再次出售 未见明确发送
9 ERR_NOT_ENOUGH_MONEY_TO_OPEN 开摊税费不足 已确认发送
10 ERR_PET_LEVEL_TOO_HIGH 珍兽等级过高 未见明确发送

当前版本最常见、并且已经能从 Lua 发送链直接确认的值主要是:

  • 1 ERR_ILLEGAL
  • 4 ERR_NEED_NEW_COPY
  • 5 ERR_NOT_ENOUGH_ROOM
  • 7 ERR_NOT_ENOUGH_MONEY
  • 9 ERR_NOT_ENOUGH_MONEY_TO_OPEN

当前 Game.exe 的客户端 handler 还保留了更长的历史错误提示分支,除了 1 到 10 之外,还能识别 11、13、14、16、17、18、19、20、21 等编号。但当前 Lua 主链没有这些值的发送证据,因此这里只能说明客户端仍保留历史兼容提示,不能直接视为当前版本服务端一定会发这些错误码。

服务端落点

  • 协议定义:
    • /home/ubuntu/Game2/services/game/packet.lua
  • 当前主要发送逻辑:
    • /home/ubuntu/Game2/services/scene/scenecore.lua
    • /home/ubuntu/Game2/services/scripts/scene.lua

当前场景层会在多类摆摊失败场景中构造 GCStallError,再把枚举值写入 result 后直接发给客户端。典型触发点包括:

  • 开摊申请失败
  • 改价失败
  • 下架失败
  • 购买失败
  • 查看或同步留言板失败

这也说明 GCStallError 的定位不是“某一个操作的失败包”,而是整个摆摊系统共享的失败提示包。

关键代码

当前 Lua 协议定义

packet.GCStallError = {
    xy_id = packet.XYID_GC_STALL_ERROR,
    STALL_MSG = {
        ERR_ERR = 0,
        ERR_ILLEGAL = 1,
        ERR_CLOSE = 2,
        ERR_OWNER_INVALID = 3,
        ERR_NEED_NEW_COPY = 4,
        ERR_NOT_ENOUGH_ROOM = 5,
        ERR_NOT_ENOUGH_ROOM_IN_STALL = 6,
        ERR_NOT_ENOUGH_MONEY = 7,
        ERR_ALREADY_LOCK = 8,
        ERR_NOT_ENOUGH_MONEY_TO_OPEN = 9,
        ERR_PET_LEVEL_TOO_HIGH = 10,
    },
    bos = function(self)
        local stream = bostream.new()
        stream:writeuchar(self.result)
        return stream:get()
    end
}

当前 Lua 发送模式

local msg = packet_def.GCStallError.new()
msg.result = packet_def.GCStallError.STALL_MSG.ERR_NEED_NEW_COPY
self:send2client(me, msg)
local msg = packet_def.GCStallError.new()
msg.result = packet_def.GCStallError.STALL_MSG.ERR_NOT_ENOUGH_MONEY
self:send2client(me, msg)

当前 Game.exe 读写结论

Read(stream) {
    read(error_code, 1);
    return 1;
}

Write(stream) {
    write(error_code, 1);
    return 1;
}

客户端执行层会按这个 uint8 错误码分支选择对应提示文本,因此这条包的唯一有效载荷就是错误码本身。

结论

  1. GCStallError 的封包 ID 是 574,固定长度 1 字节。
  2. 当前 Game.exe 与当前 Lua 一致确认,包体只有一个 uint8 类型的摆摊错误码字段。
  3. 这条包是当前摆摊系统的统一失败回包,覆盖开摊、改价、下架、购买和留言板等失败场景。
  4. 当前 Lua 主链已明确实际使用的错误码主要包括 ERR_ILLEGAL、ERR_NEED_NEW_COPY、ERR_NOT_ENOUGH_ROOM、ERR_NOT_ENOUGH_MONEY 和 ERR_NOT_ENOUGH_MONEY_TO_OPEN。
  5. 客户端虽然还保留更多历史错误提示分支,但当前 Lua 没有对应发送证据,不能直接当作当前版本最终结论。
您需要登录后才可以回帖 登录 | registerss

本版积分规则

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

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

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

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