运维一个服务器,加物品、调等级、刷怪、开关活动是日常。第一代形态是手敲命令字符串:@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 实战帖,语法、参数与示例一篇讲透。进入文章地图 · 查看全部 →
实战应用:用在哪里 战士的烈火剑法一击熄火后要等八秒冷却,连招断档感强烈。疾风烈火斩在烈火剑法命中后给一次连击窗口:三秒内再…
实战应用:用在哪里 阵营对抗打到中期容易疲软:打赢没有额外好处,输掉也没有代价。阵营声望体系给阵营战装上荣誉刻度:个人与阵营…
实战应用:用在哪里 拿下沙巴克之后呢?城主除了名字挂在城墙上,对城市毫无影响。城主施政玩法让占领变成治理:城主每周获得市政令…
实战应用:用在哪里 主线路光缆被挖断的深夜,全服掉线 20 分钟,玩家以为游戏倒闭。备用线路方案给接入层配第二条出口:主线路…
实战应用:用在哪里 行会官员由帮主任命的老模式弊端明显:任人唯亲、能上不能下。行会选举接口把官员换届做成投票制:每两个月一次…
实战应用:用在哪里 烈火剑法的伤害加成、冷却时间、下一级提升,全靠玩家记忆或去官网查。技能说明悬浮卡片在鼠标悬停技能图标零点…