TrMenu3插件v3版本菜单配置文件语法教程
一、TrMenu3插件简介与配置文件概述
1.1 插件特点与优势
TrMenu3是一款基于TabooLib框架开发的现代化、高级动态菜单插件,专为Minecraft服务器设计。它提供了丰富的功能和灵活的配置选项,使服务器管理员能够轻松创建和管理各种菜单界面。
v3版本的核心优势:
极速优化:不仅专注于条件评估的改进,还重构了虚拟库存API,记录了大量模块以获得更好的性能
功能强大:几乎所有功能都经过优化和保留,同时添加了新功能
统一的函数和脚本系统:统一和标准化内联函数的使用,重构TrMenu Actions,完全支持新的Kether脚本语言
多版本支持:支持从1.8到最新版本的Minecraft,没有材质名称兼容性问题
1.2 配置文件结构概览
TrMenu3的配置文件采用YAML格式,主要包括以下几个核心文件:
/TrMenu/
├── settings.yml # 插件主配置文件
├── menus/ # 菜单配置文件夹
│ ├── example_menu.yml # 示例菜单配置文件
│ └── ...
├── lang/ # 语言文件
│ └── en_us.yml
└── items.yml # 物品存储文件1.3 配置文件基本语法规则
在深入学习TrMenu3的配置语法前,我们需要了解一些基本规则:
缩进规则:使用2个空格进行缩进,严格遵循YAML语法规范,不使用制表符
注释语法:使用#进行单行注释
键名规范:键名不区分大小写,但建议使用统一的命名风格
数组表示:使用-表示数组元素,如- item1、- item2
多行文本:使用|表示多行文本块
二、菜单基本配置语法详解
2.1 菜单基础结构
每个菜单配置文件的基本结构如下:
menus:
菜单ID:
title: 菜单标题
rows: 行数
items:
- 菜单项配置示例:创建一个基础菜单
menus:
example_menu:
title: '&aExample Menu' # 菜单标题,支持颜色代码
rows: 3 # 菜单行数(1-6)
items: [] # 菜单项列表(空列表)2.2 菜单标题配置
菜单标题支持静态标题和动态标题两种形式:
静态标题语法:
title: 菜单标题文本动态标题语法(支持多个标题循环显示):
title:
- 标题1
- 标题2
- 标题3
title-update: 40 # 标题更新间隔(单位:刻,20刻=1秒)示例:带有动态标题的菜单
menus:
dynamic_title_menu:
title:
- '&a欢迎来到'
- '&bTrMenu3教程'
- '&c菜单系统'
title-update: 40 # 每2秒切换一次标题
rows: 3
items: []2.3 菜单布局配置
TrMenu3提供了一种直观的布局配置方式,允许你通过简单的字符来定义菜单结构:
layout:
- '字符表示的菜单布局'布局配置规则:
使用任意字符表示按钮位置
字符代表按钮的标识符
使用反引号`包裹多字符按钮标识符
自动确定菜单尺寸
示例:简单菜单布局
menus:
layout_menu:
title: '&a布局示例菜单'
layout:
- '#######`Close`' # 第一行:7个#和一个Close按钮
- ' ' # 第二行:7个空格
- ' ' # 第三行:7个空格
- '#######`Next`' # 第四行:7个#和一个Next按钮示例:带玩家背包的菜单布局
menus:
player_inventory_menu:
title: '&a带玩家背包的菜单'
layout:
- '#######`Close`' # 菜单区域
- ' '
- ' * ' # *表示玩家背包位置
- ' '
- '#######`Next`'
player-inventory: true # 启用玩家背包功能2.4 菜单选项配置
菜单选项提供了各种高级功能配置:
options:
default-arguments: [] # 默认参数
default-layout: 0 # 默认布局页
hide-player-inv: false # 隐藏玩家背包
minimum-click-delay: 20 # 最小点击延迟
placeholder-requirements: [] # 所需的PlaceholderAPI扩展示例:完整的菜单选项配置
menus:
options_menu:
title: '&a菜单选项示例'
rows: 3
options:
default-arguments: ['TrMenu', 'Arasple'] # 默认参数
default-layout: 1 # 默认显示第2页
hide-player-inv: true # 隐藏玩家背包
minimum-click-delay: 10 # 最小点击延迟0.5秒
placeholder-requirements: ['money'] # 需要PlaceholderAPI的money扩展
items: []三、菜单项配置语法详解
3.1 菜单项基础结构
菜单项的基本配置结构如下:
菜单项标识符:
update: 更新策略
display: 显示配置
actions: 动作配置
conditions: 条件配置示例:基础菜单项配置
Close: # 菜单项标识符(可使用任意字符)
update: [-1, 5, -1, -1] # 更新策略
display:
material: RED_STAINED_GLASS_PANE # 材质
name: '&c关闭菜单' # 名称
actions:
left: close # 左键点击关闭菜单3.2 菜单项更新策略(update)
更新策略定义了菜单项各属性的更新频率:
update: [材质更新, 名称更新, 描述更新, 插槽更新]更新策略规则:
使用数组形式[material, name, lore, slot]
数值表示更新间隔(单位:刻)
-1表示不自动更新
可以独立设置每个属性的更新频率
示例:不同更新策略对比
# 示例1:所有属性都不自动更新
item1:
update: [-1, -1, -1, -1]
# 示例2:名称和描述每5秒更新一次
item2:
update: [-1, 100, 100, -1] # 100刻=5秒
# 示例3:所有属性都每2秒更新一次
item3:
update: [40, 40, 40, 40] # 40刻=2秒3.3 菜单项显示配置(display)
菜单项的显示配置包含多个属性:
display:
material: 材质配置
name: 名称配置
lore: 描述配置
amount: 数量
flags: 旗帜
shiny: 是否发光
nbt: NBT数据3.3.1 材质配置(material)
材质配置支持多种格式:
基础材质格式:
material: 材质名称
material: 数字ID:数据值
material: 数字ID<data:数据值>示例:材质配置示例
# 示例1:使用材质名称(不区分大小写)
material: RED_STAINED_GLASS_PANE
# 示例2:使用数字ID(1.8-1.12版本)
material: 160 # 对应Stained Clay
# 示例3:使用数字ID+数据值
material: 35:14 # 对应Red Wool
material: 35<data:14> # 等价写法高级材质特性:
- CustomModelData支持(1.14+):
material: coal<model-data:1> # 煤炭,CustomModelData=1- 玩家头颅支持:
material: '<head:玩家名称>' # 使用玩家名称
material: '<head:%player_name%>' # 使用占位符- 自定义纹理头颅:
material: '<skull:纹理数据>' # Base64编码的纹理数据- 皮革盔甲RGB颜色:
material: 'leather_chestplate<dye:255,255,0>' # 黄色皮革胸甲- JSON物品格式:
material: '{"type":"DIAMOND_SWORD","data":0,"amount":1,"meta":{"Damage":{"type":"INT","data":0}}}'3.3.2 名称配置(name)
名称配置支持静态文本和动态文本:
name: 单行文本
name: # 多行文本
- 第一行
- 第二行示例:名称配置示例
# 示例1:简单的单行名称
name: '&a按钮'
# 示例2:多行名称(支持颜色代码)
name:
- '&a第一行'
- '&b第二行'
- '&c第三行'
# 示例3:动态名称(使用变量)
name: '当前时间: %time%'3.3.3 描述配置(lore)
描述配置与名称类似,支持多行文本:
lore:
- 第一行描述
- 第二行描述
- 第三行描述示例:描述配置示例
lore:
- '&7这是一个按钮'
- '&7点击可以执行动作'
- '&7支持多行描述'3.4 菜单项动作配置(actions)
菜单项的动作配置定义了玩家点击时执行的操作:
actions:
点击类型:
- 动作1
- 动作23.4.1 支持的点击类型
TrMenu3支持22种不同的点击类型:
| 点击类型 | 描述 |
|---|---|
| LEFT | 左键点击 |
| SHIFT_LEFT | 左Shift+左键 |
| RIGHT | 右键点击 |
| SHIFT_RIGHT | 右Shift+右键 |
| MIDDLE | 中键点击(滚轮) |
| DOUBLE_CLICK | 双击 |
| DROP | 丢弃键(Q) |
| OFFHAND | 副手切换(F,1.16+) |
| CONTROL_DROP | Ctrl+丢弃键 |
| CREATIVE | 创造模式中键 |
| NUMBER_KEY | 数字键1-9 |
| NUMBER_KEY_1 | 数字键1 |
| ... | ... |
| NUMBER_KEY_9 | 数字键9 |
| WINDOW_BORDER_LEFT | 背包左边界 |
| WINDOW_BORDER_RIGHT | 背包右边界 |
| ALL | 所有点击类型 |
示例:多种点击类型配置
actions:
left: close # 左键关闭菜单
right:
- 'tell: 你点击了右键'
- 'sound: BLOCK_NOTE_BLOCK_BIT' # 播放音效
left,right: # 左键或右键都执行
- 'command: say 欢迎使用TrMenu3'
number_key_1: open:menu2 # 按数字键1打开menu23.4.2 支持的动作类型
TrMenu3支持超过50种不同的动作类型,以下是一些常用动作:
基础动作:
close:关闭菜单open:<菜单ID>:打开指定菜单command:<命令>:执行服务器命令
消息动作:
tell:<消息>:向玩家发送消息actionbar:<消息>:发送ActionBar消息title:<标题>,<副标题>,<显示时间>:发送标题消息
音效动作:
sound:<音效名称>-<音量>-<音调>:播放音效
数据操作动作:
set-meta:<键> <值>:设置玩家元数据set-data:<键> <值>:设置玩家数据(永久存储)set-gdata:<键> <值>:设置全局数据
示例:综合动作配置
actions:
left:
- close # 关闭当前菜单
- 'open:shop_menu' # 打开商店菜单
- 'command: give %player% diamond' # 给玩家钻石
- 'tell: &a你获得了一个钻石!' # 发送消息
- 'sound: BLOCK_ANVIL_USE-1-1' # 播放音效3.5 菜单项条件配置(conditions)
菜单项的条件配置决定了菜单项是否显示:
conditions:
- 条件1
- 条件2支持的条件类型:
权限条件:
hasPerm.<权限节点>经济条件:
hasMoney.<金额>元数据条件:
hasMeta.<键>数据条件:
hasData.<键>全局数据条件:
hasGData.<键>比较条件:支持>、<、>=、<=、==、!=
示例:条件配置示例
conditions:
- 'hasPerm.trmenu.admin' # 需要trmenu.admin权限
- 'hasMoney.100' # 需要至少100金币
- 'meta:vip == true' # 元数据vip为true
- 'gdata:server_time > 12' # 全局数据server_time大于123.6 菜单项继承配置(inherit)
菜单项可以继承其他菜单项的配置,简化重复配置:
继承菜单项:
inherit: 被继承菜单项
display: 覆盖显示配置
actions: 覆盖动作配置示例:继承配置示例
# 定义基础按钮
base_button:
display:
material: STONE
name: '&a基础按钮'
actions:
left: 'tell: 你点击了基础按钮'
# 继承基础按钮并修改材质
stone_button:
inherit: base_button
display:
material: STONE
# 继承基础按钮并修改名称和动作
wood_button:
inherit: base_button
display:
material: OAK_PLANKS
name: '&b木质按钮'
actions:
left: 'tell: 你点击了木质按钮'四、高级配置语法详解
4.1 变量与函数系统
TrMenu3提供了强大的变量和函数系统,支持多种表达式:
4.1.1 菜单参数函数
使用{索引}格式访问菜单参数:
参数1: {0}
参数2: {1}
参数3: {2}示例:菜单参数使用
menus:
param_menu:
title: '参数菜单'
rows: 1
items:
param_display:
display:
material: PAPER
name: '参数1: {0}'
lore:
- '参数2: {1}'
- '参数3: {2}'4.1.2 Kether函数
使用{ke:<表达式>}格式执行Kether脚本:
表达式结果: {ke:<Kether表达式>}4.1.3 JavaScript函数
使用{js:<表达式>}格式执行JavaScript:
计算结果: {js: 1 + 2 * 3}4.1.4 元数据变量
使用{meta:<键>}格式访问玩家元数据:
元数据值: {meta:key}4.1.5 数据变量
使用{data:<键>}格式访问玩家数据:
数据值: {data:key}4.1.6 全局数据变量
使用{gdata:<键>}格式访问全局数据:
全局数据值: {gdata:key}4.2 事件配置语法
菜单支持多种事件监听:
on-open: 打开事件
on-close: 关闭事件
on-update: 更新事件示例:事件配置示例
menus:
event_menu:
title: '事件菜单'
rows: 1
on-open: # 菜单打开时执行
- 'tell: &a菜单已打开!'
- 'sound: BLOCK_CHEST_OPEN'
on-close: # 菜单关闭时执行
- 'tell: &c菜单已关闭!'
- 'sound: BLOCK_CHEST_CLOSE'
on-update: # 菜单更新时执行
- 'tell: &e菜单正在更新...'
items: []4.3 周期性任务配置
使用tasks配置周期性执行的任务:
tasks:
任务ID:
interval: 间隔
actions: 执行动作示例:周期性任务配置
menus:
task_menu:
title: '任务菜单'
rows: 1
tasks:
update_time: # 任务ID
interval: 20 # 每秒执行一次(20刻)
actions:
- 'set-meta:current_time %time%' # 更新元数据
- 'refresh' # 刷新菜单
items:
time_display:
display:
material: CLOCK
name: '当前时间: {meta:current_time}'4.4 菜单绑定配置
菜单可以绑定到命令、物品或快捷方式:
bindings:
commands: 命令绑定
items: 物品绑定
shortcuts: 快捷方式绑定4.4.1 命令绑定
commands:
- 命令匹配规则示例:命令绑定示例
bindings:
commands:
- 'open menu' # 匹配"open menu"命令
- 'menu' # 匹配"menu"命令
- 'm' # 匹配"m"命令4.4.2 物品绑定
items:
物品配置: 菜单ID示例:物品绑定示例
bindings:
items:
# 配置物品属性
material: PAPER
name: '&a菜单物品'
lore:
- '点击打开菜单'
menu: example_menu # 绑定的菜单4.4.3 快捷方式绑定
shortcuts:
快捷方式类型: 动作示例:快捷方式绑定示例
bindings:
shortcuts:
offhand: open:offhand_menu # 副手物品打开菜单
sneak-offhand: close # 潜行+副手关闭菜单
right-click-player: open:player_menu # 右键点击玩家打开菜单五、综合配置示例
5.1 完整菜单系统示例
以下是一个包含几乎所有语法的综合菜单示例,展示了TrMenu3的强大功能:
menus:
main_menu: # 主菜单
title:
- '&a&lTrMenu3综合示例菜单'
- '&b&l版本: 3.3.1'
title-update: 60 # 每3秒切换标题
rows: 6 # 6行菜单(最大尺寸)
options:
default-arguments: ['Guest', '100'] # 默认参数
hide-player-inv: false # 不隐藏玩家背包
minimum-click-delay: 10 # 0.5秒冷却
layout:
- '123456789' # 第一行:1-9按钮
- 'ABCDEFGHI' # 第二行:A-I按钮
- 'JKLMNOPQR' # 第三行:J-R按钮
- 'STUVWXYZ ' # 第四行:S-Z按钮
- '123456789' # 第五行:1-9按钮
- '######`Exit`' # 第六行:退出按钮
on-open: # 菜单打开事件
- 'set-meta:login_time %time%' # 设置登录时间
- 'sound: BLOCK_CHEST_OPEN-1-1' # 播放打开音效
- 'tell: &a欢迎使用TrMenu3综合示例菜单!'
on-close: # 菜单关闭事件
- 'sound: BLOCK_CHEST_CLOSE-1-1' # 播放关闭音效
- 'tell: &c菜单已关闭,欢迎下次使用!'
# 菜单项配置
1: # 按钮1
update: [40, 20, -1, -1] # 材质2秒更新,名称1秒更新
display:
material: DIAMOND_SWORD<model-data:1> # 自定义模型钻石剑
name: '攻击力: {js: 5 + Math.floor(Math.random() * 3)}' # 随机攻击力
lore:
- '&7类型: 武器'
- '&7品质: 史诗'
- '耐久度: {meta:sword_durability}' # 显示耐久度元数据
actions:
left: # 左键点击
- 'tell: &a你拿起了钻石剑'
- 'sound: ENTITY_PLAYER_ATTACK_SWEEP'
right: # 右键点击
- 'if: {meta:sword_durability} > 0' # 条件判断
- ' tell: &b剑的耐久度: {meta:sword_durability}'
- ' sound: BLOCK_NOTE_BLOCK_BASS'
- 'else'
- ' tell: &c剑已损坏!'
2: # 按钮2(继承自按钮1)
inherit: 1
display:
material: IRON_SWORD<model-data:2>
name: '攻击力: {js: 3 + Math.floor(Math.random() * 2)}'
# 动态菜单按钮
3:
conditions:
- 'hasPerm.trmenu.admin' # 需要管理员权限
display:
material: EMERALD
name: '&a管理菜单'
actions:
left: open:admin_menu
# 经济系统按钮
4:
display:
material: GOLD_INGOT
name: '金币: {ke: economy.getBalance(player)}' # 使用Kether获取余额
lore:
- '点击充值'
- '当前余额: {ke: economy.getBalance(player)}'
actions:
left:
- 'input:请输入充值金额' # 要求玩家输入
- ' if: {input} > 0'
- ' command: economy give %player% {input}'
- ' tell: &a成功充值{input}金币!'
- ' sound: UI_TOAST_CHALLENGE_COMPLETE'
- ' else'
- ' tell: &c请输入正确的金额!'
# 背包操作按钮
5:
display:
material: PLAYER_HEAD
name: '%player_name%' # 显示玩家名称
lore:
- '背包空间: {ke: player.getInventory().getSize() - player.getInventory().firstEmpty()}/{ke: player.getInventory().getSize()}'
actions:
left:
- 'if: player.getInventory().firstEmpty() != -1'
- ' command: give %player% diamond'
- ' tell: &a获得一个钻石!'
- 'else'
- ' tell: &c背包已满!'
# 全局数据示例(限购系统)
6:
display:
material: ENCHANTED_GOLDEN_APPLE
name: '限购金苹果'
lore:
- '剩余数量: {gdata:golden_apple_stock}' # 显示全局库存
- '价格: 100金币'
conditions:
- 'gdata:golden_apple_stock > 0' # 库存大于0
- 'hasMoney.100' # 有足够金币
actions:
left:
- 'command: economy take %player% 100' # 扣除金币
- 'set-gdata:golden_apple_stock {gdata:golden_apple_stock} - 1' # 减少库存
- 'give: %player% ENCHANTED_GOLDEN_APPLE' # 给予物品
- 'tell: &a购买成功!剩余{gdata:golden_apple_stock}个'
- 'sound: ENTITY_PLAYER_LEVELUP'
# 分页菜单按钮
7:
display:
material: ARROW
name: '下一页'
actions:
left: 'set-shape:2' # 切换到第二个布局
# 时间显示按钮
8:
update: [40, 40, 40, -1] # 每秒更新
display:
material: CLOCK
name: '当前时间: {time}' # 显示当前时间
lore:
- '游戏时间: {ke: world.getTime()}'
- '登录时间: {meta:login_time}'
actions:
left: 'tell: &a当前时间: {time}'
# 音效测试按钮
9:
display:
material: NOTE_BLOCK
name: '音效测试'
lore:
- '点击播放音效'
actions:
left:
- 'sound: AMBIENT_CAVE-1-1'
- 'sound: BLOCK_ANVIL_USE-1-1'
- 'sound: ENTITY_PLAYER_LEVELUP-1-1'
# 退出按钮
Exit:
display:
material: RED_STAINED_GLASS_PANE
name: '&c退出菜单'
actions:
left: close
# 第二页布局(分页菜单)
admin_menu: # 管理员菜单
title: '&c&l管理员菜单'
rows: 3
layout:
- '`Back` 清除日志 服务器状态'
- ' 封禁玩家 踢人 发送公告'
- '`Back` 保存数据 重载配置'
items:
Back: # 返回按钮
display:
material: ARROW
name: '&a返回主菜单'
actions:
left: open:main_menu
清除日志:
conditions:
- 'hasPerm.trmenu.admin.log'
display:
material: PAPER
name: '&c清除日志'
actions:
left:
- 'command: clearlogs'
- 'tell: &a日志已清除!'
服务器状态:
conditions:
- 'hasPerm.trmenu.admin.status'
display:
material: COMPASS
name: '&b服务器状态'
actions:
left:
- 'tell: &a服务器状态:'
- 'tell: &bTPS: {ke: bukkit.getTPS()[0]}'
- 'tell: &b在线人数: {ke: bukkit.getOnlinePlayers().size()}/{ke: bukkit.getMaxPlayers()}'
# 快捷方式绑定
bindings:
commands:
- 'mainmenu'
- 'mm'
items:
material: EMERALD
name: '&a主菜单物品'
lore:
- '右键点击打开主菜单'
menu: main_menu
shortcuts:
offhand: open:main_menu # 副手物品打开主菜单
sneak-offhand: close # 潜行+副手关闭菜单5.2 示例说明与使用指南
这个综合示例包含了以下核心功能:
动态标题系统:主菜单标题每3秒切换一次
分页菜单:通过按钮7切换到第二页布局
权限控制:管理员菜单需要特定权限才能访问
经济系统集成:展示金币余额并支持充值功能
限购系统:使用全局数据实现金苹果限购
背包操作:检查背包空间并给予物品
时间显示:实时显示游戏时间和现实时间
音效系统:支持多种音效播放
事件监听:菜单打开/关闭时执行特定动作
条件判断:基于权限、经济、数据等条件显示菜单项
继承机制:按钮2继承按钮1的配置,简化代码
输入捕获:充值功能要求玩家输入金额
Kether脚本:使用Kether获取经济余额和服务器状态
JavaScript表达式:动态计算攻击力等数值
快捷方式绑定:支持副手物品、潜行操作等快捷方式
5.3 配置文件组织建议
为了更好地管理菜单配置,建议采用以下组织结构:
/TrMenu/
├── settings.yml
├── menus/
│ ├── main_menu.yml # 主菜单
│ ├── admin_menu.yml # 管理员菜单
│ ├── shop_menu.yml # 商店菜单
│ ├── player_menu.yml # 玩家菜单
│ └── ...
├── items/ # 可复用的物品配置
│ ├── buttons.yml # 按钮类物品
│ ├── weapons.yml # 武器类物品
│ └── ...
└── includes/ # 公共配置
├── permissions.yml # 权限配置
└── variables.yml # 变量配置通过这种组织方式,可以:
提高配置文件的可读性和可维护性
避免重复配置,提高开发效率
便于团队协作开发
简化版本控制和备份
六、常见问题与最佳实践
6.1 常见配置错误及解决方法
缩进错误
错误:混用空格和制表符
解决:使用2个空格进行缩进,确保一致性
语法错误
错误:缺少逗号、引号不匹配
解决:仔细检查YAML语法,使用在线验证工具
材质名称错误
错误:使用错误的材质名称(如DIAMOND_SWORLD)
解决:确保材质名称正确,可通过游戏内指令/give测试
版本兼容性问题
错误:使用了不支持的特性(如1.8服务器使用CustomModelData)
解决:根据服务器版本选择合适的特性
6.2 性能优化建议
合理使用更新策略
避免频繁更新不需要变化的属性
使用-1禁用不必要的自动更新
优化条件判断
简单条件放在前面,复杂条件放在后面
避免在循环中执行复杂计算
减少材质加载
使用材质继承减少重复定义
缓存常用的物品配置
控制菜单复杂度
避免在一个菜单中放置过多按钮
使用分页菜单来管理大量内容
6.3 调试技巧
开启调试模式
在settings.yml中设置debug: true,可以获得更多调试信息
使用日志功能
在动作中使用log: 调试信息输出日志
检查控制台错误信息
分步测试
先测试基础功能,再逐步添加复杂功能
使用简单的菜单结构进行测试
版本控制
使用Git等版本控制系统管理配置文件
定期备份重要配置
七、总结与扩展学习
通过本教程的学习,你已经掌握了TrMenu3插件v3版本菜单配置文件的核心语法。从基础的菜单结构到复杂的动态系统,TrMenu3提供了丰富的功能来满足各种菜单需求。
核心要点回顾:
菜单基础配置包括标题、行数、布局等基本属性
菜单项支持多种显示格式和22种不同的点击类型
强大的变量和函数系统支持动态内容展示
灵活的条件判断和继承机制简化配置
完善的事件系统和周期性任务支持复杂交互
下一步学习建议:
深入学习Kether脚本语言,以实现更复杂的逻辑
探索TabooLib框架的其他功能,与TrMenu3结合使用
研究其他优秀的菜单插件,学习不同的设计思路
参与TrMenu3社区,分享经验并获取帮助
TrMenu3的官方文档和社区资源:
官方Wiki:https://trmenu.trixey.cc/
GitHub仓库:https://github.com/CoderKuo/TrMenu
社区论坛:https://www.mcbbs.net/thread-918078-1-1.html
记住,实践是最好的老师。建议你根据本教程的示例,结合自己服务器的实际需求,动手创建一些菜单。在实践中不断探索和学习,你将能够充分发挥TrMenu3的强大功能,为你的服务器打造出专业、美观、高效的菜单系统。
贡献者
更新日志
24669-docs(article): 添加 TrMenu3 插件 v3 版本菜单配置文件语法教程于