TrMenu 站内最新教程(V3) |
您所在的位置:网站首页 › 我的世界rpg插件教程视频 › TrMenu 站内最新教程(V3) |
本文全篇采用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元,有则显示 NBTNBT标签,不懂得人具体可看(支持变量) 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 |