Tree Menu#

Overview#

在魔兽世界自定义功能中, 用层级菜单来展示玩家可以互动的选项是一个非常常见且重要的功能. 例如你希望有一个 NPC, 可以让玩家传送到不同的地方, 而这些地方我们希望用一个层级菜单来展示. 例如:

  1. 第一层是大陆, 例如 东部王国, 卡利姆多, 外域, 诺森德.

  2. 第二层是地图, 例如 艾尔文森林, 地狱火半岛, 嚎风峡湾.

  3. 第三层是具体地点, 例如 北京修道院, 军团前线, 乌特加德城堡.

那么你的菜单看起来就像是这样:

东部王国 (这是个菜单)
    艾尔文森林 (这是个菜单)
        北境修道院 (点击既可传送)
        闪金镇 (点击既可传送)
        ...
        返回上一级菜单 (这是个返回按钮)
        返回顶级菜单 (这是个返回按钮)
    西部荒野 (这是个菜单)
        哨兵岭 (点击既可传送)
        匕首岭 (点击既可传送)
        ...
        返回上一级菜单 (这是个返回按钮)
        返回顶级菜单 (这是个返回按钮)
    ...
    返回上一级菜单 (这是个返回按钮)
    返回顶级菜单 (这是个返回按钮)
卡利姆多 (这是个菜单)
    杜隆塔尔 (这是个菜单)
        ...
    贫瘠之地 (这是个菜单)
        ...
    ...
    返回上一级菜单 (这是个返回按钮)
    返回顶级菜单 (这是个返回按钮)
...

正确编写实现这一功能的 lua 脚本并不是很容易. 而这个 Python 库可以简化你开发这样的脚本的工作. 你只需要按照规范在一个 Google Sheet 表格中填写数据, 然后这个库就能自动生成你的 eluna 脚本中的数据. 同时配合配套的 lua 脚本模板, 你只需要写非常少的代码 (不超过 10 行) 就能实现一个层级菜单. 而至于用什么方式触发这个菜单, 例如是在聊天框中打命令, 还是跟特定 NPC 互动, 你可以自己决定. 而至于点击菜单项后的具体操作, 例如传送玩家到指定地点, 还是给玩家物品, 还是给玩家加 Buff 等等, 你也可以自己决定.

How it Work#

  1. 首先参考这个 Google Sheet 中的 README 和 Data tab, 了解如何编辑你的数据. 简单来说就是业务逻辑相关的数据放在左边, 例如你的业务逻辑是传送玩家到不同地点, 那么这些 xyz 坐标就放在左边. 而跟 tree menu 相关的 _icon, _h1, _h2, … 放在右边 (你必须有 _icon 列, 可以空着, 但必须有).

  2. 然后参考 11-CPI-MultiVendor-Lua/cpi_multivendor.lua.jinja2 学习如何编写你的 lua 脚本. 你可以根据你的需求调整如何触发这个菜单, 以及点击菜单选项后的效果.

  3. 然后参考 11-CPI-MultiVendor-Lua/gen_lua.py 这个脚本, 了解如何用 Python 来生成最终的 lua 脚本. (你需要将 Google Sheet 中的数据复制粘贴到 TSV 文件中去)

  4. 最后建议你 阅读 CPI MultiVendor Lua, 一个用这个库实现的真实例子来了解用这个库开发的完整流程.

Reference:

  • acore_eluna.tree_menu.impl: tree_menu 源代码.