运维一个服务器,加物品、调等级、刷怪、开关活动是日常。第一代形态是手敲命令字符串:@item 玩家名 1001 5,快,但参数顺序全靠记,敲错就是事故。第二代是配置表驱动:命令与参数定义在表里,程序自动生成帮助与校验。第三代是参数化面板:配合前端界面点选执行。无论哪代,核心都是同一层——结构化的 GM 命令处理器。
把每条命令定义为数据:名称、权限等级、参数类型表、执行函数。启动时统一注册,执行时统一做权限与参数校验:
local Cmds = {}
local function reg(def) Cmds[string.lower(def.name)] = def end
reg{
name = "item", level = 3,
args = { {"玩家名","string"}, {"物品id","int"}, {"数量","int"} },
run = function(who, name, itemId, count)
giveItem(name, itemId, count)
log("GM", who, "发物品", name, itemId, count) -- 全量留痕
end
}
function ExecGM(who, level, line)
local parts = {}
for w in line:gmatch("%S+") do parts[#parts + 1] = w end
local def = Cmds[string.lower(parts[1] or "")]
if not def then return "未知命令" end
if level < def.level then return "权限不足" end
-- 逐参数按类型校验后调用 def.run
end
权限分级。 level 1 查询、2 发放、3 数值改写、4 危险操作(重载/删档),命令注册时定死,执行时强制校验,任何人不得绕过。
全量留痕。 每次执行记录:谁、何时、什么命令、什么参数、结果。GM 日志是封号与客诉的唯一凭据,这一步省不得。
参数校验前置。 int 就是 int、玩家名先验在线,错误在入口拦下并回提示,绝不带着脏参数进业务函数。
影响范围先声明。 对全服生效的命令(公告、加速倍率)在注册时标记 global=true,执行前要求二次确认参数,防手抖。
工具也要热更。 GM 处理器按模块挂表,加新命令 = 注册一条数据,不需要重启 M2——应急时刻你会感谢这个设计。
把这套处理器与文档自动生成(遍历 Cmds 输出帮助表)组合起来,一天就能搭出可持续演进的 GM 体系,比每次现写命令字符串稳妥得多。
本文由 996 技术组基于 996 引擎官方知识库与浮生梦老师课程体系整理。团队长期从事传奇类引擎 Lua 后端逻辑、客户端界面与商业版本交付,内容以官方知识库与真实项目为出处,按版本持续修订。
getgmlevel(actor)
获取玩家GM权限值,命令分发前先取权限值,权限表只在服务端
setgmlevel(actor, gmlevel)
设置玩家GM权限值,调试期改权限,比改配置文件快
regnpcmsg(msgId, NPCIndex)
给NPC注册Lua消息,把命令挂到 NPC 消息上,玩家侧只发命令字
say(actor, msg)
NPC界面文本发送,命令回执用界面文本,比系统公告更合适
openmerchantbigdlg(actor, pos, x, y, height, width, bool, closeX, closeY, isMove)
打开NPC大窗口,参数化面板类的多条命令用大窗口承载
getplayerbyname(name)
获取玩家对象 根据玩家名,按名字定位执行目标,注意重名与离线情况
全站技术干货持续更新:996 引擎 / Lua 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
设计初衷 组队打怪的经验分配是组队体验的核心:均分让划水者搭便车,纯贡献分配让辅助职业吃亏。贡献权重的设计目标:按实际贡献分…
设计初衷 坐骑系统的死穴是"买了就不用管"。坐骑长线:喂养、训练、共鸣三条培养线并行——坐骑从"一次买断"变成"持续投入"。…
业务场景 新图首杀季:一天 60 个首杀全发播报则世界频道被刷屏。限流策略:播报队列每分钟最多 3 条,积压进入队列顺延,超…
业务场景 富矿点被固定队伍霸占。矿点占领:行会发起占领后收益加成 50%,占领 4 小时到期自动易主。核心数据:Mine_I…
设计初衷 回流玩家的最大障碍不是数值落后,是社交断层:离开 90 天后,好友列表里一半人退游、行会换了会长、固定队散了。回归…
学员常见误区 把 30 份奖励分给 4 人小组,学员写 total / 4 得到 7.5,再拿 7.5 去做循环边界——Lu…