TrMenu 站内最新教程(V3)

您所在的位置:网站首页 我的世界rpg插件教程视频 TrMenu 站内最新教程(V3)

TrMenu 站内最新教程(V3)

2024-07-12 01:43| 来源: 网络整理| 查看: 265

本文全篇采用MarkDown编写

首先,声明一下,因为站内有太多关于TrMenu的配置文件,但是缺乏此类教程,故(家乐)本人来撰写此教程。

顺便完成自己准备在大学完成的心愿,水点人气来着。

大家有什么想看的可以评论和我说,我会尽量满足大家的要求。

如果你在写菜单过程中遇到了任何有关问题,可以加群进行讨论(免费):

我的群: 636405733

TrMenu群: 325014486

如果觉得排版不好看,可以前往我的个人博客www.jiale233.top

1、为什么选择TrMenu

在你没学TrMenu之前,会觉得TrMenu也许和ChestCommands、BossShop、DeluxeMenus那些菜单差不了太多,当你了解了之后,你会发觉这是一个堪比BukkitAPI容器功能也许还要强上数倍的菜单插件。

它可以与ItemAdders、Oraxen、PlayerPoints、SkinsRestorer、Floodgate、Vault、FastScript、Zaphkiel、TrHologram、一切Taboolib动作支持插件等相互配合,形成一套完整的菜单体系,实现众多复杂的功能。(甚至,你可以拿他写指令组)

此外,TrMenu还有一堆其他菜单插件不能比拟的功能。

高效、可读 & 可视化配置菜单,让你省去计算菜单的slot时间

异步读取菜单,可检测菜单更改自动重载

功能强大、极具灵活拓展性

代码开源,你可以自行fork项目修改内容

                                                         自动重载样式(来自插件作者)

目前存在的问题(不影响大部分情况下的使用)

目前(2022年8月16日)的TrMenu多服务器数据同步仍然做的不完善,跨服使用仍会出现一系列问题,暂时没修复的情况下,仅仅使用一个meta来存储临时数据就好了,data存储出现问题后果自负。(你可以使用LuckPerms或者一类支持数据的拓展插件来完成数据存储)

如果你使用的是一些奇怪的触发器(比如shift+左键),那么很有可能因为发包原因卡出幽灵物品(无法使用的物品,只是看起来有),这是发包所不能避免的,待至V4发布,也许会解决此类问题。

捕获器共有四种,现在有两种捕获器(书本+铁砧)属于损坏状态(不过聊天+牌子捕获器日常用也足矣),捕获器相关配置请跳转至后面的章节查看学习。

如果你用到了节点变量,那么我强烈建议你,不要在一个菜单内使用大、小写字符作为图标ID,因为获取机制,不能正常获取到对应大小下节点的内容。(你甚至可以使用中文字符,但就是不要一起使用大、小写的ID)

如果你的Layout小于3行,触发动作类型为shift+任意键都报错,暂时搁置,等待修复

周期任务现在处于损坏状态,暂时不能使用

还有许多尚待补充,如果喜欢本文的话,请务必顶一下帖子,让更多人看见吧!

字数统计

2、准备工作

必需准备条件

一个合适的文本编辑器(这里强力推荐VsCode+YAML拓展)

PlaceholderAPI(非必须,极力推荐)(版本>=2.10.9)

TrMenu(原版)(不推荐)

TrMenu修复版(暂时推荐使用修复版)

第一次启动服务器联网(必需,TrMenu会自动联网下载依赖库)

一颗善变脑子(为了问题有更多的出路)

下列为软依赖,安装后提供更多功能,可选择不安装

Skulls

Vault

PlayerPoints

HeadDatabase

Oraxen

SkinsRestorer(只能在Bungee代理端装,如果单服则可以单独装)

ItemsAdder

floodgate-bukkit

FastScript

TrHologram

一切Taboolib动作支持类插件

相关注意事项:

若您使用的是1.8.X的服务器,则需要在运行一次TrMenu的服务器上,后打开TrMenu生成的配置文件夹,找到datasource.yml,找到其中的ConnectionTestQuery 将其的值从ConnectionTestQuery: ~改为 ConnectionTestQuery: SELECT 1

(目的是:1.8的JDBC驱动过于老旧,无法使用新的HikariCP连接池)

在BungeeCord(或是任意衍生服务端,如WaterFall、LightFall)服务器上,我们则需使用一个SkinsRestorer(安装在代理端),子服务器不需要装(否则会出现获取不到头颅材质的问题),若需使用/skins的指令,则可以使用这个插件CommandForward

若您使用的是14.2+版本的SkinsRestorer(单服),那么则需要将插件更新至最新构建。

若您安装了 LibsDisguises(兼容性不佳,报错但可正常使用) ,请将配置文件中设置为  Remove-Armor: false(没有则算)

3、工具们

一些网站

十六进制颜色网站(没错,它支持16进制颜色

HTML Color Codes

TrMenu官方的颜色文档

https://trmenu.insinuate.io/usage/colors

物品特征

Wiki

变量集群(由PlaceHolderAPI提供,也就是支持任意papi变量)(可能需要hosts修改)

https://github.com/PlaceholderAPI/PlaceholderAPI/wiki/Placeholders

变量拓展网站(下载完毕放在/plugins/PlaceHolderAPI/expansions/目录中)

https://api.extendedclip.com/all/

TrMenu官方Wiki (V3)

https://trmenu.insinuate.io/

Kether动作列表(来自坏黑大佬)

Kether — Repository

社区Wiki

https://wiki.ptms.ink/index.php?title=%E7%A4%BE%E5%8C%BA:TrMen

SpigotDoc(用于查找标准物品ID)

1.8.8

1.12.2

1.13.2

1.14.4

最新版本

提交相关反馈&BUG

ISSUES(请按模板提交)

相关的工具命令

命令操作/papi ecloud download 拓展名下载相关的变量拓展(我会标注栗子里面用到的变量拓展)/papi parse me xxx以自己身份解析变量的内容

4、TrMenu的命令&权限

命令 []代表可选参数作用权限/trmenu 或 /menu 、/trmTrMenu主命令trmenu.access/主命令 list [过滤菜单的名字]列出已加载的菜单[过滤菜单的列表]trmenu.command.list/主命令 open 名称[:页数] [玩家] [菜单参数(可多个)]打开指定菜单trmenu.command.open/主命令 reload重新载入菜单trmenu.command.reload/主命令 template [行数]模板创建功能,快速布局菜单(当前仅支持箱子容器)trmenu.command.template/主命令 action 玩家 动作测试 TrMenu 动作 (提示动作返回以及消耗)trmenu.command.action/主命令 item展开细说 ↓↓↓trmenu.command.item/主命令 item toJson转换手中物品为 JSON 文本格式上同/主命令 item fromJson 文本将文本内容转换为物品对象上同/主命令 item save ID保存物品到物品仓库上同/主命令 item get ID取得物品从物品仓库上同/主命令 item delete ID删除物品自物品仓库上同/主命令 Sounds [过滤的音效名字]预览音效 [过滤音效名字]trmenu.command.sounds/主命令 Debug调试功能trmenu.command.debug/主命令 convert 菜单 类型转换菜单类型(支持JSON、TOML 、YAML、HOCON、FAST_JSON)trmenu.command.convert

5、配置文件各文件的作用

目录/plugins/TrMenu/下存放着本插件所有的配置文件

文件(夹)作用data数据(包括物品库)lang语言(可以自定)(自动识别客户端语言)menus菜单文件夹(可套多层)settings.yml插件主要配置datasource.yml数据存储相关设置kether.ymlKether解析相关设置

有关数据库的设定(/TrMenu/settings.yml)

Database:  # Local: SQLITE  # 更多: SQL, MONGODB  Method: Local #选择存储类型  Type:    SQLite: #本地SQLite      file-name: data      table: npc    SQL: #MySQL等一类数据库      host: localhost      port: 3306      user: root      password: passhere      database: minecraft      table: trmenu_user_data    MongoDB: #MongoDB相关      client: 'mongodb://localhost:3307'      database: trixey      collection: trplugins.menu  Index:    # UUID, USERNAME    Player: UUID #数据库主键(推荐使用UUID存储)

有关捕获器的设定(/TrMenu/settings.yml)

Action:  # 捕获器  Inputer:    # 取消词(正则)    Cancel-Words:      - 'cancel|quit|end'      - 'q'  Kether:    # 开启Kether语句宽容解析(支持宽松的kether语法    Allow-Tolerance-Parser: true

有关命令注册的设定(/TrMenu/settings.yml)

RegisterCommands:    # 主命令名称    openMenus:        # 子命令名称        aliases: [ ]        # 所需权限, 无需权限设置为 null 即可        permission: null        # 动作        execute:        - 'tell: &7参数`example`缺失!'        # 参数        arguments:        # /openMenu example 实例打开方法        # 动作        example: 'open: example'

6、创建一个菜单

你可以直接在TrMenu/menus中创建一个.yml文件(json等也是可以)

目前支持的文件类型

JSON

TOML

YAML

HOCON

FAST_JSON

创建完毕之后,我们就可以在里面开始正式编写第一个菜单了。

7、开始写一个简单菜单

我们首先按照上面的步骤创建一个菜单文件,就叫做Main.yml(个人习惯驼峰命名法)。

如图所示,我们便创建了一个菜单文件。

接着我们进入菜单编辑文件,我们写一个简单的主菜单。

具体的各个东西相关的功能我们会在后面详细提及,这里只是展示怎么样写一个有用的菜单。

Title: '我是菜单标题,支持颜色代码,变量' #写在标题里了

#建议每一个之间空一行,习惯,看起来不那么乱Layout:  - '#########' #菜单的边框  - '    A    ' #菜单的主图标  - '#########' #菜单的边框  Events:  Open: #开启菜单的事件    - condition: perm *menu.admin #检测玩家是否拥有menu.admin的权限(kether的写法)      actions: #拥有执行的动作(菜单正常打开)        - 'sound: BLOCK_CHEST_OPEN-1-0'      deny: #没有执行的动作(菜单被return动作中断)        - 'tell: &c你不是管理员'        - 'sound: ENTITY_ITEM_BREAK-1-0'        - 'title: 你还不是管理员哦!'        - 'return'  Close: #菜单关闭的事件    - 'sound: BLOCK_CHEST_CLOSE-1-0'  Icons: #正式开始写图标咯  '#': # 叫做 #的图标,写在layout里面了    display: #图标显示部分      material: glass_panel #图标的材质      name: '&7我是分割线'      lore:        - ''        - '&a就不告诉你' #描述内容    action: #按钮的动作      all: #所有均可触发        - 'sound: BLOCK_NOTE_BLOCK_COW_BELL' #播放声音  A: #一个叫做A的图标    display: #一样的显示部分      material: end_portal_frame #一样的物品ID      name: '&6传送菜单' #一样的物品名字      lore: #一样的物品描述      - ''      - ' &e你想要去哪里呢!'      - ''      - ' &a点击打开传送菜单'    actions: #一样的动作部分      all: #一样的所有操作触发        - 'open: Teleport' #打开名为Teleport菜单

这样子的菜单得到的效果如图所示

                               

8、菜单的配置

我们先来了解下菜单里面可以编写什么内容。

首先是针对一整个菜单的设置,位于菜单的根节点下,是针对菜单的全局设置

注意:

标题如需根据不同页面来改变的话,我们就只能通过两种方法(一是动态标题通过函数变量判断,而是直接使用set-title动作进行设置标题)

标题(静态)

Title: '' #容器的标题(支持动态,写成数组或列表)

动态标题

Title: - ''- '' #容器的标题(支持动态,写成数组或列表)Title-Update: 20  #标题切换周期(切换,不支持刷新,刷新则可以写多行)

布局

省去了你像其它插件一样计算slot的时间,并可极大程度可视化菜单的布局。

最好用的功能之一(你也可以不用Layout,用传统的slot)

Layout: #容器的布局(可以直接使用slot(即删去此段)而不是Layout快速排版)  - '########`关闭`'  - '         '  - '########`下一页`'

PlayerInventory: #玩家物品栏的布局(可以舍弃)  - '         '

这些字符都是代表一个图标ID

如果需要多个字符代表一个图标,那么我们可以使用``括起来

特性:

支持中文字符作为图标ID

单页

我可以这么写(舍弃玩家物品栏的布局)

Layout: #容器的布局  - '#########'  - '  abc e  '  - '#########'

那么写出来就像这样(我#符号没写图标)

多页

Layout: #容器的布局  - - '#########'    - '   a '    - '#########' #第一页  - - '#########'    - '    b    '    - '#########' #第二页

我们则可以使用动作page:page或者指令(/trm open xxx:page)来达到切换页面的目的

当然菜单也提供了相应的动作来打开对应页面

page: 页数 #打开对应页面

容器类型

你可以通过这个选择菜单的类型

支持的容器类型

ANVIL

BARREL

BEACON

BLAST_FURNACE

BREWING

CARTOGRAPHY

DISPENSER

DROPPER

ENCHANTING

ENDER_CHEST

FURNACE

GRINDSTONE

HOPPER

LOOM

PLAYER

SHULKER_BOX

SMOKER

WORKBENCH

Type: CHEST

容器绑定

可以绑定命令,物品(替代部分ItemJoin的功能)

Bindings: # 绑定命令, 支持正则  Commands:    - 'command'  Items: # 绑定物品特征    - 'material:clock'

这样一来,我们可以让容器有特殊的命令打开了(没有注册,不能通过TAB补全,可查看命令注册相关章节),或者是通过特定的物品(符合物品特征的物品,详情查看Wiki)。

注意:物品特征的物品是不能像material一样宽容解析物品ID的。只能通过Spigot的Doc查找(开头有链接),或者是通过一些类似的插件:比如Essentials的/iteminfo命令

菜单选项

提供了一些菜单的选项,让你极大程度自定义可能遇到的情况。

Options:

 # 是否启用菜单传参功能 (默认开启)  Arguments: true    # 默认填充参数(不支持变量)(带变量填充建议使用菜单事件)  Default-Arguments: []    # 默认布局页码(开启菜单的默认页码)  Default-Layout: 0    # 自由槽位(不稳定) 用来让玩家在菜单开启时可以自由移动槽位的东西  Free-Slots:    - '71-73'      # 是否隐藏玩家容器物品(记得删去删去  Hi删去de-Player-Inventory: true    # 防频繁点击的间隔  Min-Click-Delay: 200    # 强制需要依赖的 PlaceholderAPI 拓展变量(没有安装则不允许打开)(一般状态下不用设置)  Depend-Expansions: ['server', 'player', 'progress']

菜单事件

在菜单开启/关闭的时候执行的相关动作(组),可以结合条件判断来判断玩家状态。(我就是用这个当作进入服务器的指令的:笑)

Events:  Open: #菜单开启事件,执行的动作(组)(可不填)    - condition: 'perm *trmenu.use'      actions:        - 'sound: BLOCK_CHEST_OPEN-1-0'      deny:        - 'sound: ENTITY_ITEM_BREAK-1-0'        - 'return'  Close: #菜单关闭事件,执行的动作(组)(可不填)    - 'sound: BLOCK_CHEST_CLOSE-1-0'

内置函数

使用 JavaScript 函数的内置自定义脚本(需要有一定的JavaScript基础)

Functions: #内置函数头部  flash: |- #函数头部,来自Wiki    function flash() {      var display = new Date().getSeconds() % 2 == 0      return display ? args[0] : "  "    }    flash()

调用格式为 ${[funcName]_[参数1]_[参数2]} 例如 ${flash_>}

默认函数上方将自动添加行 var args = new Array() 并写入参数,因此在内置函数中传入的参数可以直接通过 args 数组的形式使用。

周期任务

可自定义的周期任务,将在打开菜单后执行,关闭菜单后取消(等待修复)

Tasks:  tikTok: # 任务 Id,任意 (任务来自Wiki)    period: 20 # 周期 ( 单位tick )    task: # 反应,可写任意动作(组)      - condition: '$ sender.isOp()'        actions:          - 'sound: BLOCK_NOTE_BLOCK_BIT-1-2'

9、图标配置图标ID:

用以标识图标(你可以玩出更进阶的操作,比如拿他当作数组的序列获取数组的内容)

它在菜单的位置如图所示

Icons:  'A': #此处为图标ID   display:     xxx: xxxx    ·········

图标设置部分:更新周期:

(仅父图标可写)

重新刷新函数变量或者图标材质的时间

更新周期包括 4 个(材质,名称,Lore,槽位)

update: 时间(单位tick) #你可以写成如下的样子update: [20, 40, 50, 30] #材质,名称,Lore,槽位的单独刷新周期#或者这样update: [20, 40, 50] #材质,名称,Lore#槽位的刷新周期将选取最高的那一个

注意:

更新周期应该与父图标处于同一缩进(节点),子图标默认继承父图标的刷新周期(且不可单独调整)

插件一般会根据update后面的数值自动分配刷新时间,所以数组写法的意义几乎为零

刷新周期:

(仅父图标可写)

重新计算整个槽位的优先级的时间

refresh: 时间(单位tick)

注意:

只有存在优先级(或是子图标)才可以生效

按照优先级顺序重新计算图标的显示模式(DM做不到系列:笑)

图标槽位:

(仅父图标可写)(可不填)

类似DM菜单的图标写法,推荐非特殊需求使用Layout(布局)写法。

slots: 槽位#当然你也可以这样子写slots:- 1- 2- 3- '{js: (varInt("%player_health%")).toFixed(0)}' #这说明它支持变量填写咯#或者是动态的图标(DM又做不到系列)slots:- - 1  - 2- - 4  - 5

继承:

(仅子图标可写)(可不填)

继承父图标的lore、名称(在子图标未进行配置的情况下)(材质默认都进行继承)

默认配置文件设置的都为不继承(可以自行在配置文件设置为继承)

inherit: true (false)

子图标:

(仅父图标可写)

类似DM的优先级,就是把多个图标写进一个图标槽位方便管理

icons: xxxx

条件:

(仅子图标可写)

仅子图标可配置,当运算结果为真才显示此子图标

condition: expression#栗子condition: perm *admin.command

子图标写法栗子(引用wiki)

A:  display:   material: grass   name: xxx  icons:    - condition: xxxx      icons:      - condition: 'perm *op'        display:          material: beacon      - condition: 'perm *mvp.user'        display:          material: diamond block      - condition: 'perm *vip.user'        display:          material: gold block

优先级:

决定子图标的先后顺序(可不填)

priority: 值

注意:

优先级相同时则从上到下依次排序

若全部配置,则优先级从小到大依次计算,知道符合条件为止

显示:

决定图标的显示样式(子图标一样可以写注意缩进)

它在图标中的位置应该如图所示

A:  update: 20  display: #此处为显示头部,与上面的处于同一节点   name: xxxx

动作:

决定图标触发的内容(子图标一样可以写注意缩进)

具体请看目录10、动作部分

actions:  all: []  left: []

10、图标显示部分

这里支配的是一个图标该显示什么内容,这里的所有内容均位于ID.display节点下。

XXX:  display:    material: xxxxx

注意:

1、这里显示的所有东西除了material: source:xxxx:id的source:xxxx不可使用变量替代之外,其它均可使用变量。

材质

别名:materials、material、mat、mats

支持多个,动态更新。(一个图标的必填项)

当然,这里的ID可以模糊化(来自Xmaterial),甚至你可以写F3+H看到的那个,不用刻意追求原本BukkitAPI的material里面的ID。

1、普通材质写法(动态材质)

material: '' #单个材质的写法material: grass#多个动态材质的写法material: [grass, bedrock]#或者material:  - grass  - dirt  #另外,你也可以写一个空槽位material: air

2、特殊材质写法

#附加材质参数#data 旧版MC 1.12.2以前material: '3 {data=2}'#model-data 仅1.14.4+material: '3 {model-data=2}'#皮革颜色material: 'leather chestplate {dye=255,255,0}'#旗帜颜色material: 'white banner {banner=RED MOJANG,WHITE}'

3、变量材质写法

#当然,也支持变量material: %xxxx% #PAPI变量material: {ke: xxx} #kether表达式material: {js: xxx} #Javascript表达式

4、头颅材质写法

#或者你想写点头颅?(支持异步获取头颅,不卡菜单,又是DM做不到系列:笑X3)material: head:base64 #填你头颅的base64的值material: head:ID #填写连接id https://textures.minecraft.net/textures/idmaterial: head:%player_name% #获取玩家的头颅,可通过配置skinrestetor来获取离线玩家的头颅

#兴许你会遇到头颅无法正常显示的情况(部分存在的问题#你可以试试这样写material: '' #获取玩家的头颅,可通过配置skinrestetor来获取离线玩家的头颅material: '' #填你头颅的base64的值

5、物品仓库写法

你也可以调用trmenu的物品仓库,就是前面指令介绍里面的

/trm item save ID

material: 'repo:仓库内物品ID'material: 'repo:%xxxx%' #PAPI变量的写法

6、JSON物品写法(NBT标签)

JSON格式的物品(也就是NBT标签),你可以通过/trm item tojson得到文本。

这里支持变量,并且支持英文ID加data值的设定。

material: '{"type":"DIAMOND_SWORD","data":0,"amount":1,"meta":{"Damage":{"type":"INT","data":0}}}'

7、挂钩材质写法

与TrMenu挂钩的关于材质的插件的写法

material: 'source:HeadDatabase:ID' #填写HDB的头颅IDmaterial: 'source:HDB:random' #随机头颅样式 (简化插件名字写法)material: 'source:ORAXEN:itemId' #Oraxen的材质IDmaterial: 'source:ITEMADDER:itemId' #ItemAdder的IDmaterial: 'source:IA:anotherItemId' #ItemAdder的ID(简化插件名字写法)material: 'source:ZAPHKIEL:itemId' #Zaphkiel的IDmaterial: 'source:ZL:itemId' #Zaphkiel的ID(简化插件名字写法)#当然,也支持变量咯(仅仅是ID,不支持源名称,这是楼主发的ISSUE提交的特性)material: 'source:HDB:%xxxxx%'

名称

别名:name、names

物品的名称,这个我不多说。(支持动态)

name: 'xxx' #静态名称name: [XXX, xxx, xxxx] #动态名称name: #或  - 'xxx'  - 'xxxxx'  - 'xxxxxxx'

描述

别名:lores、lore

说白了就是物品的lore。(支持动态)

lore: 'xxxx' #单行lore:  - ''  - 'xxx' #多行lore: #动态描述  - - ''   - 'xxx'  - - ''   - 'xxxxxxx'lore: #条件lore - '&a点击购买' - '&c金钱不足 {condition= money *100}' #是否有100元,有则显示

NBT

NBT标签,不懂得人具体可看(支持变量)

nbt:  key: value

标签

通过一些标签来隐藏材质本省拥有的性质。

flags:  - HI删去DE_UNBREAKABLE #隐藏不可破坏lore(记得删去删去  - HI删去DE_POTION_EFFECTS #隐藏药水的效果(记得删去删去

可用标签:

数量

别名:amt、amount

对于可堆叠物品而言。

amount: '1' #普通的样子amount: '%player_health%' #支持变量amount: {ke: xxx} #kether表达式amount: {js: xxx} #Javascript表达式

发光

实质上是添加了个附魔效果并隐去了附魔属性(so,不适用不支持附魔的物品(建议大家偷懒这样写)。

shiny: 'true' #手动方式shiny: 'all [perm *vip.user money *100]' #条件表达

11、动作写法

这里支配的是一个图标该执行什么内容,这里的所有内容均位于ID.actions节点下。

XXX:  display:    material: xxxxx  actions:   触发类型:     actions:       - 'xxxxx'

写在前面,动作是用来控制相关触发之后,菜单帮助玩家/控制台执行的某些命令、声音、消息,等等,这是一个十分强大的功能。当然,TrMenu不限制动作的写法,不像其他的某些插件,只能按照规定的格式来写动作,导致了可配置空间极小。TrMenu甚至支持Kether动作(组),JavaScript语句,还有,如果你要是一个开发者,那么你就可以自己结合API写出动作扩展插件(像某某拓展插件)。

注意:

1、另外,除了动作头之外,全程支持函数/变量(也就是你可以配合ke/js或者papi把命令玩出花来)。

2、动作组没有什么具体格式,除了第一个包含触发类型的动作组之外,其他均可参照动作组写法中写。

触发类型

TrMenu支持以下触发类型

ID对应事件ALL全部(任意操作此图标)LEFT左键RIGHT右键SHIFT_LEFTShift+左键SHIFT_RIGHTShift+右键OFFHAND副手(原为F键)NUMBER_KEY数字键(全触发)NUMBER_KEY_#数字键1-9(#为对应的序号)(改键就不一定了)MIDDLE中间DROP丢弃CONTROL_DROP全丢(CTRL+Q)ABROAD_LEFT_EMPTY边缘左键空点击(具体不大好描述)ABROAD_RIGHT_EMPTY边缘右键空点击(具体不大好描述)ABROAD_LEFT_ITEM边缘左键点击(具体不大好描述)ABROAD_RIGHT_ITEM边缘右键点击(具体不大好描述)LEFT_MOUSE_DRAG_ADD左键拖动图标加(具体不大好描述)RIGHT_MOUSE_DRAG_ADD右键拖动图标加(具体不大好描述)MIDDLE_MOUSE_DRAG_ADD中键拖动图标加(具体不大好描述)DOUBLE_CLICK双击

动作类型

这里是TrMenu自带的一些动作的写法,用来控制一些东西。

1、消息相关

#聊天消息- 'tell: message' #可以使用\n换行#与他人聊天- 'chat: message' #以玩家身份聊天#标题消息- 'title: 主标题 副标题 淡入 停留 淡出' #对应位置写法- 'title: 主标题 副标题 20 30 10' #时间单位tick- 'title: 主标题' #光主标题- 'title:   副标题' #光副标题- 'title: `带 空 格 的 主 标 题` `带 空 格 的 副 标 题`' #带空格括起#物品栏上方消息- 'actionbar: Hello There' #物品栏上方信息#json消息- 'json: {"text":"Hello World!"}' #原版json消息,生成器https://www.minecraftjson.com/- 'json: Hello World! &6系统商店'

Layout:- '#########'- ''- '  ABCDE  '- ''- '#########'

Bindings:  Commands:    - 'shop'

Icons:  A:    display:      material: apple #材质      name: '&e食物商店'      lore:      - ''      - ' &a点击跳转到食物商店'    actions:      all:        - 'open: Food' #用于跳转到一个叫做Food的菜单

商店主体

那么这样写完了之后,我们就可以开始写食物商店的菜单了。

首先创建一个叫Food.yml的菜单文件,打开编辑

我们这里使用的是参数来作为菜单的数量选择跳板

Title: '&7> &6食物商店'

Layout:  - 'A        ' #上面这个A是用来显示卖的东西的  - '         '  - '         '  - '         '  - '    0    ' #底下的这个O是用来调整购买物品的数量的

Events:  Open:    - 'set-arguments: 1' #在打开菜单的时候重置参数的值为1  Close:    - 'reset'Options:  # 防频繁点击的间隔,这里建议调整小点,方便进行数量切换  Min-Click-Delay: 10Icons:

数量选择器

那么这样一来菜单的头就写好了,接下来写数量选择器,图中已经进行注释解释了

0:    update: 20 #平时一秒刷新一次    display:      material: BOOK      name: '&e数量切换'      lore:      - ' '      - ' &a左键点击 +1'      - ' &ashift+左键 +16'      - ' &a右键 -1'      - ' &ashift+右键 -16'      - ' &a中键 自定义' #操作方法,自己修改咯      amount: '%trmenu_args_0%' #数量是Tr的第一个(序列为0)参数    actions:      left:      #如果加完了数量超过64就设置为64,如果没有,就设置成原来的        - 'set-arguments: {ke: if check math add [ papi *%trmenu_args_0% *1 ] *0 then math sub [ papi *%trmenu_args_0% *1 ] else *1}'        - 'update' #及时刷新数量      shift_left:      #如果加完了数量超过64就设置为64,如果没有,就设置成原来的        - 'set-arguments: {ke: if check math add [ papi *%trmenu_args_0% *1 ] *0 then math sub [ papi *%trmenu_args_0% *16 ] else *1}'        - 'update' #及时刷新数量      MIDDLE:        - catcher: #捕获器,这里写个简单的栗子,详细介绍            amount:              type: CHAT #聊天类型的捕获器              start: #捕获器开始动作组              - 'close'              - 'actionbar: &b&l请输入数量'              cancel: 'tell: &8取消' #捕获器取消动作组,前面的配置文件写过取消的字符              end: #捕获器结束动作组                - condition: check meta get *input > *0 #检测输入的是否为大于0的数字                  actions:                    - 'set-arguments: {ke: if check meta get *input = (varInt("%trmenu_args_0%") * varInt("{node: Icons.@[email protected]\}")).toFixed(2)'        #还是和上面一样咯          actions:            - 'close'            - 'tell: &a购买成功!'            - 'take-money: {js: (varInt("%trmenu_args_0%") * varInt("{node: Icons.@[email protected]\}")).toFixed(2)}'            - 'console: give %player_name% apple %trmenu_args_0%'          deny:              - 'tell: &c无法购买!钱不够.'      right:        - condition: check papi *%checkitem_mat:apple,amt:{trmenu_args_0}% == *yes         #这里就不用改了          actions:            - 'close'            - 'tell: &a出售成功!'            - 'console: clear %player_name% apple %trmenu_args_0%'            - 'give-money: {js: (varInt("%trmenu_args_0%") * varInt("{node: Icons.@[email protected]\}")).toFixed(2)}'            #给玩家相应的钱          deny:            - 'tell: &c数量不足!'      shift_right:        - condition: check papi *%checkitem_mat:apple% == *yes        #这里一样不用改          actions:            - 'close'            - 'tell: &a出售成功!'            - 'give-money: {js: (varInt("%checkitem_amount_mat:"+vars("{node: Icons.@[email protected]\}")+"%") * varInt("{node: Icons.@[email protected]\}")).toFixed(2)}'            #还是一样,给钱            - 'console: clear %player_name% apple %checkitem_amount_mat:apple%'          deny:            - 'tell: &c数量不足!'

那么经过这样一修改,那我们大量写这个菜单的速度是不是高了很多了呢,

我们只需在每个图标的开头,修改下面的东西,即可完成对这个图标的修制。

 A:   shop: #节点使用     sell: 20  #卖出的价格     buy: 5  #收购的价格     id: apple #物品的ID



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3