十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

4步写出你的魔兽世界GM指令:AzerothCore自定义GM指令实战

4步写出你的魔兽世界GM指令:AzerothCore自定义GM指令实战 4步写出你的魔兽世界GM指令AzerothCore自定义GM指令实战【免费下载链接】azerothcore-wotlkComplete Open Source and Modular solution for MMO项目地址: https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk深夜世界频道里有人喊角色位置错了GM快来挪一下。作为 WoW 私服管理员你最希望的是敲一行指令就解决。AzerothCore 的 ChatCommand 框架就是干这个的——自定义GM指令从函数到上线全程只需要四步。下面直接动手。核心概念速览命令表如何长成一棵命令树先给结论所谓命令树就是表里套表。ChatCommandTable本质上是一行一行的节点向量using ChatCommandTable std::vectorChatCommandBuilder;每个节点只有两种长相挂一个处理函数叶子或者挂另一张ChatCommandTable枝干。玩家每输入一个 token系统就往下钻一层节点四要素记牢名称、处理函数或子表、权限等级、是否允许控制台执行Console::Yes/No。源码定义在 src/server/game/Chat/ChatCommands/ChatCommand.h。源码拆解/teleport 从输入到处理函数的完整时序拿仓库里真实存在的 src/server/scripts/Commands/cs_tele.cpp 走一遍。GM 在聊天框输入/teleport name npc id 12345背后发生的事按时间排TryExecuteCommand按空格切开字符串从根表commandTable开始查token teleport 命中该节点的数据是子表 → 下钻到teleCommandTablename 命中 → 进入teleNameCommandTablenpc 命中 → 进入teleNameNpcCommandTableid 命中叶子节点。框架用HandlerToTuple把HandleTeleNameNpcIdCommand的函数签名拆成std::tuple再由ConsumeFromOffset逐个把 12345 按参数类型转换好调用处理函数剩下的活才轮到你的业务逻辑。原文之外的两个细节值得注意表里那个空串节点是缺省分支——没写子命令时剩余参数直接交给它消费。teleport 表里的{ , HandleTeleCommand, ... }就是只给传送点名字、直接飞的路径权限这一格新代码填的是rbac::RBAC_PERM_COMMAND_TELE_NAME这类 RBAC 常量在管理后台映射成安全等级老写法直接填SEC_GAMEMASTER、SEC_ADMINISTRATOR字面量同一格、同一机制只是颗粒度不同。实战四步注册你的第一条GM命令 目标写一条/customheal 目标 百分比给指定玩家回血。文件建在src/server/scripts/Commands/下命名cs_customheal.cpp。第1步写处理函数签名定生死第一个参数永远是ChatHandler*返回booltrue 表示成功。后面的参数就是你要的输入框架负责解析static bool HandleRestoreHealthCommand(ChatHandler* handler, PlayerIdentifier target, uint32 percent) { if (percent 100) { handler-SendErrorMessage(LANG_COMMAND_INVALID_PERCENT); return false; } if (Player* player target.GetConnectedPlayer()) { uint32 newHealth player-GetMaxHealth() * percent / 100; player-SetHealth(newHealth); handler-PSendSysMessage(LANG_RESTORED_HEALTH, player-GetName(), percent); return true; } handler-SendErrorMessage(LANG_PLAYER_NOT_FOUND); return false; }关键提示参数用PlayerIdentifier而不是裸Player*后面接离线玩家时能省不少事。第2步建命令表把函数挂到节点上两张表——内层挂函数外层挂子表using namespace Acore::ChatCommands; static ChatCommandTable healCommandTable { { , HandleRestoreHealthCommand, SEC_GAMEMASTER, Console::Yes }, }; static ChatCommandTable commandTable { { customheal, healCommandTable }, };关键提示内层那张表的节点就是缺省分支/customheal 某玩家 80的三个 token 会全部落进HandleRestoreHealthCommand。第3步挂脚本命令注册流程的最后一环命令表不会自己生效得用CommandScript子类把它交出去class customheal_commandscript : public CommandScript { public: customheal_commandscript() : CommandScript(customheal_commandscript) { } ChatCommandTable GetCommands() const override { return commandTable; } }; void AddSC_customheal_commandscript() { new customheal_commandscript(); }关键提示AddSC_前缀函数是脚本加载器识别的约定名字和类名保持一致写错一个字母就是命令凭空消失。第4步跑起来编译 重启把cs_customheal.cpp加进src/server/scripts/Commands/的 CMake 收集范围重编 worldserver然后完整重启不是/reload——命令表在进程启动时通过LoadCommandMap()一次性装入。上线用 GM 号敲/customheal 角色名 80验证控制台里同样能跑因为Console::Yes。进阶三招权限收紧、离线操作、多语言报错权限精细化处理函数开头加if (handler-HasLowerSecurity(target, ObjectGuid::Empty)) return false;防止 GM 动比自己等级高的账号——teleport 的在线/离线两条路径都做了这道闸。离线玩家PlayerIdentifier::GetConnectedPlayer()取不到在线对象时转数据库路线例如 cs_tele.cpp 里用CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_HOMEBIND)查出家园坐标后写回位置。多语言报错统一走handler-SendErrorMessage(LANG_COMMAND_TELE_NOTFOUND)这类LANG_*宏文案集中在 Language.h 字符串表维护英文服玩家看到的也是通顺的提示。上线前自检清单命令不生效、不显示、解析失败对号入座✅ 三类症状逐条打勾命令不生效AddSC_*注册函数存在且拼写与脚本类一致当前账号的安全等级 / RBAC 权限盖得住节点要求worldserver 已完整重启命令表不在/reload范围内命令不显示子表确实挂进了父表且挂在正确的父级节点下节点要求的权限等级不超过当前 GM 自己的等级逐级路径拼写正确匹配不分大小写但层级不能跳参数解析失败参数顺序与处理函数签名完全一致含空格的字符串参数已用引号包裹token 数量对得上——多出来的部分需要缺省节点兜住延伸资源src/server/scripts/Commands/cs_item.cpp复杂参数解析Variant、Hyperlink的完整样板src/server/game/Miscellaneous/Language.hLANG_*多语言字符串定义src/server/scripts/Commands/cs_server.cpp控制台侧Console::Yes命令的参考实现回到那个深夜现在再遇到角色位置不对你不用再开后台改库——一行/teleport name 玩家 点位解决下次再有玩家提的怪需求照着四步走一小时内你的私服就多一条别人没有的指令。这套 ChatCommand 框架的表里套表结构看着朴素撑起来的正是 WoW 私服管理里所有一个指令顶十次手工的体验。【免费下载链接】azerothcore-wotlkComplete Open Source and Modular solution for MMO项目地址: https://gitcode.com/GitHub_Trending/az/azerothcore-wotlk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表