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 错误码分支选择对应提示文本,因此这条包的唯一有效载荷就是错误码本身。
结论
GCStallError 的封包 ID 是 574,固定长度 1 字节。
- 当前
Game.exe 与当前 Lua 一致确认,包体只有一个 uint8 类型的摆摊错误码字段。
- 这条包是当前摆摊系统的统一失败回包,覆盖开摊、改价、下架、购买和留言板等失败场景。
- 当前 Lua 主链已明确实际使用的错误码主要包括
ERR_ILLEGAL、ERR_NEED_NEW_COPY、ERR_NOT_ENOUGH_ROOM、ERR_NOT_ENOUGH_MONEY 和 ERR_NOT_ENOUGH_MONEY_TO_OPEN。
- 客户端虽然还保留更多历史错误提示分支,但当前 Lua 没有对应发送证据,不能直接当作当前版本最终结论。