手把手教你写一个完美的DeluxeMenus菜单
1 前言
写本帖的原因是我看到现在大部分小白服主比较尴尬
大多数人都吹爆TrMenu,但又太过于复杂,看不懂
但是用CC菜单,功能太少,不支持PAPI变量... (省略1w字)
这时候我认为DeluxeMenus是个特别不错的用来过渡的插件
但既然是过渡了,所以我认为本贴不欢迎以下几种服主
- * 还在使用CatServer(Pro),Mohist等核心的服主 (DM不支持Forge服务端)
- * 认为CC是「天下最强」菜单插件的服主
- * 没有YAML语法基础 && 开服基础,不思进取的服主
- * 觉得自己基础很"厚",看完了之后一脸懵的服主
- * 「那你能帮帮我吗」,「我不会就要问啊」,「求一个菜单模板」,「你爱答不答」
- * 认为这个教程没用 (那您现在可以点击右上角的 × )
本帖子使用Markdown编写,感谢4z大佬的MM2BC
(*) 觉得太丑了?
(*) 下文读起来可能有些啰嗦,不过既然是「手把手」了吗..
2 准备工作
下文教程的环境
- * Spigot 1.12.2
- * PlaceholderAPI 2.10.4
- * DeluxeMenus 1.12.0 (最新)
不过请注意,DeluxeMenus 1.10.6及以后的版本
不支持1.8.X及更低的核心版本 (例如 Paper 1.8.8 )
如需使用DM的话,请使用1.10.5及以前的版本
因为金钱,点券等变量,都要依靠PAPI作为中继,
所以我会在每一个菜单开始,讲清楚要从云端(ecloud)下载什么拓展
3 一些你可能会用到的网址
PAPI变量大全
物品Material大全
- https://helpch.at/docs/1.8.8/org/bukkit/Material.html
- https://helpch.at/docs/1.12.2/org/bukkit/Material.html
- https://helpch.at/docs/1.13.2/org/bukkit/Material.html
- https://helpch.at/docs/1.14.4/org/bukkit/Material.html
- https://hub.spigotmc.org/javadocs/spigot/org/bukkit/Material.html (*)
*: 会随着最新版本的Spigot而更新
附魔ID大全 (*)
*:请务必注意,部分物品是不能附任何魔的,部分物品只能附一部分的魔
用来做自定义旗帜的材料
- 染料颜色 https://hub.spigotmc.org/javadocs/spigot/org/bukkit/DyeColor.html
- 旗帜类型 https://hub.spigotmc.org/javadocs/spigot/org/bukkit/block/banner/PatternType.html
MC音效ID大全
4 DM插件的命令与权限
*本来以为命令和权限只有原搬运贴中的那一点,结果打开plugin.yml后...
*下文提到的任何权限,OP都默认拥有
- /dm* reload
- 重载插件配置文件&所有菜单
- 在重载过程中会为所有玩家关闭菜单,不必担心刷物品问题
- deluxemenus.admin
- *:也可以是deluxemenus/deluxemenu/dmenu
- /dm list
- 查看所有已经加载的菜单
- deluxemenus.admin
- /dm open <菜单名字> (玩家)
- 为(玩家)打开一个菜单
- 不填玩家则是自己
- 不指明玩家: deluxemenus.open
- 指明玩家: deluxemenus.open.others
- deluxemenus.open.bypass
- 拥有此权限可以无视任何菜单的打开条件
5 下载&安装DM
如果没有特殊情况,那我建议您去原帖下载
不过如果您「懒」亦或者其他原因,我在这里准备了1.12.0版本的DM插件
同样,既然都有DeluxeMenus了,肯定也少不了PAPI(PlaceholderAPI)
PAPI下载地址 (2.10.4)
下载下来后无脑拖进plugins即可
6 怎么不把所有菜单都挤进config.yml?
接上面,当你启动完毕服务器后 (看到 Done! )
应该可以在plugins/DeluxeMenus中找到config.yml
打开后,发现了clip大鸽送给你的一个模板菜单
但是把所有的菜单都挤到一个config.yml里既不美观,也没有秩序
那么你可以参照下面修改下config.yml
- debug: false
- check_updates: true
- gui_menus:
- example:
- #注册的名字,可以通过/dm open 注册的名字 打开菜单
- file: example.yml
- #该菜单在gui_menus文件夹中的名字
修改完成后点击保存(*),然后使用/dm reload
*:我在这里建议使用VS Code(更美观),而不是憨憨记事板
重置完插件配置后,您应该可以在plugins/DeluxeMenus中找到一个gui_menus菜单
打开后发现自动生成了一个菜单,跟刚才在config.yml中修改前一模一样
7 了解一个菜单结构
有心的服主应该都发现了,为什么每一行之间还有空格呢
如果了解过YAML语法的话,这种形式叫做「缩进」
就好比父子关系一样 (雾 , 从整个菜单层面到菜单中的一个物品
下面是DM的结构关系
- 菜单设置1: ''
- 菜单设置2: false
- 物品:
- 物品1:
- 物品1的Material: STONE
- 物品1的Slot: 0
- 物品2:
- ...
8 了解一些代名词
WARNING 我建议仔细阅读本章 在下面会用到
- String
- 字符串
- 可以在这里填写任意
- 中/英文字符和一部分特殊符号
- 在DM中支持往里填写PAPI变量
- 需要用引号标注开头和结尾
- Int
- "阿拉伯数字"*
- 可以在这里填写
- -2147483648 ~ 2147483647
- 不需要带引号
(*)官方译名:向下取整函数
- abcd
- 在这里填写中/英文字符,不可以有空格
- 不可以有PAPI变量
- Action
- 动作,也称操作,附属于String,
- 所以要用引号标注开头结尾.
- ↓一般长这样↓
- a:
- - 'Action'
- - 'Action'
- 由
- 动作类型[空格]动作参数[空格]附加参数
- 组成
- 动作类型大全
- !区分大小写!
- * [player]
- * 从玩家的角度执行一个命令
- * 动作参数不需要带/
- * (例) [player] spawn
- * [console]
- * 从控制台角度执行一个命令
- * 动作参数不需要带/,一般需要指明玩家
- * (例) [console] points give %player_name% 2020
- * [commandevent]
- * 从玩家角度执行一个未在plugin.yml注册过的"快捷"命令
- * 动作参数不需要带/
- * [message]
- * 为该玩家发送一条消息,支持颜色代码(&)和PAPI变量
- * (例) [message] C.P.S小组诚招打字员,加入q球群⑨Ⅴ六⑨零⑥四⑦Ⅷ
- * [connect]
- * 为该玩家连接到另一个服务器,
- * 命令参数必须是在Bungee的config.yml中注册的服务器名
- * (例) [connect] BedWars①_恰豆豆
- * [json]
- * 为该玩家发送一条JSON格式编译后的消息
- * (错例) [json] &e123456%player_name%
- * (例) [json] {"text":"&7你收到了来自CPS可爱萌妹兔子的一封信 <<<点击查看","clickEvent":{"action":"open_url","value":"https://shang.qq.com/wpa/qunwpa?idkey=f946c3ce841c66409bac42facfab5ecce20df454ac96f4181279cfb928e39d93"}}
- * [sound]
- * 为该玩家发送一段MC中的音效
- * (例) [sound] ENTITY_VILLAGER_YES
- * 用心看帖子的人都知道操作参数(音效ID)在哪里找#run
- * [broadcastsound]
- * 为该服务器里的所有玩家播放一段MC中的音效
- * 不支持跨服!
- * (例) [sound] ENTITY_VILLAGER_NO
- * [refresh]
- * 关闭再重新打开这个菜单
- * 你也可以理解为变相刷新菜单
- * 不需要
- * [takemoney]
- * 扣除玩家在与Vault挂钩的经济系统中的余额
- * 例如Essentials自带的经济系统就与Vault挂钩
- * 但PlayerPoints并不
- * 操作参数是Int
- * (例) [takemoney] 2020
- * [openguimenu]
- * 打开另一个菜单 (必须是DeluxeMenus中的菜单)
- * 操作参数是菜单在DM的config.yml中注册的名字
- * (例) [openguimenu] example
- * [close]
- * 关闭这个菜单
- * 不需要跟操作参数
- 附加参数大全
- * <delay=Int>
- * 上方Int的单位是Ticks
- * 1Ticks = 0.05 s
- * 1s = 20Ticks
- * <chance=Int>
- * 上方Int必须在0~100之间
- * 即执行前面操作的概率是 Int/100
9 教你写一个条件
为了更符合正常的学习流程,我先在这里讲如何写一个条件
注意 这里也许需要一定的Java基础,不过没有也无妨
你下面所看到的
- open_requirement:
- left_click_requirement:
- right_click_requirement:
- view_requirement:
- 等结尾是 requirement 的选项
即为条件选项
条件选项配合多个物品的优先级
可以做到一些譬如
在同一个物品位置上,如果玩家有100点券就可以看到钻石,没有则看到泥土
的一类操作
接下来由我讲解一下如何写一个条件(requirement)
下面是两个例子,用来解释到底条件写在哪里
- view_requirement:
- requirements:
- #表示下面所有的每一子项都是条件
- one:
- #条件1
- ......
- cps:
- #条件2
- ......
- left_click_requirement:
- requirement:
- #表示下面所有的每一子项都是条件
- one:
- #条件1
- type: ......
- two:
- #条件2
- type: ......
- deny_commands:
- #如果无法全部满足上面的条件,将会执行下面的操作
- - 'Action'
- - 'Action'
那么就来了解下每个条件是怎么写的吧
- type: has permission
- permission: 'abcd.abcd'
- * 检测玩家是否拥有这个权限
- type: has money
- amount: Int
- * 检测玩家是否拥有一定的金钱 (即≥)
- * 从与Vault挂钩的经济系统获取数据进行比对
- type: string equals
- input: 'String'
- output: 'String'
- * 检测输入与输出是否完全一致(大小写也相同)
- * 例子
- type: string equals
- input: '%player_name%'
- output: 'AzureHanChen'
- * 检测玩家的ID是不是AzureHanChen
- type: string equals igonecase
- input: 'String'
- output: 'String'
- * 检测输入与输出是否完全一致(忽略大小写)
- * 例子
- type: string equals igonecase
- input: '%player_name%'
- output: 'azurehanchen'
- *检测玩家的ID是否是azurehanchen (忽略大小写)
- type: has item
- material: 物品ID(全英文)大写
- data: 子ID
- amount: Int
- name: 'String'
- lore:
- - 'String'
- - 'String'
- * 需要玩家的背包里含有amount个material+data物品
- * 且名字是name,lore必须逐行对应
- * material,amount是必选的,其他看情况删减
- type: javascript
- expression: 'JS'
- 用过老版DM或者在用TrMenu的服主应该会比较明白
- 就是填写一些JS表达式,使用&&表并列,使用||表其一,使用!表(如果)不
- 其实上面的所有简化条件都是由这个转来的
- 下面是一些格式
- * (String[A]).equals(String[B])
- * 输入A与输出B是否完全一致
- * (例) (%player_name%).equals.("AzureHanChen")
- * 玩家的名字是否是AzureHanChen
- * (String[A]).equalsIgoneCase(String[B])
- * 输入A与输入B除大小写外是否完全一致
- * (例) (%player_name%).equalsIgoneCase.("AzureHanChen")
- * 玩家的名字在忽略的大小写的情况下是否是AzureHanChen
- * A (符号) B
- * A 是否 (符号) B
- * 只能用于A和B都是Int的场景中
- * 符号列表
- * == 等于
- * > 大于
- * >= 大于或等于
- * <= 小于或等于
- * < 小于
- * (错例) %player_name% == AzureHanChen
- * (错例) "%playerpoints_points" >= 233
- * 那肯定有人要问了,为什么这个不对呢
- * 首先,如果按照上面写,那么写出来是这样的
- * expression: '"%playerpoints_points%" >= 233'
- * 首先'里面可以套"是对的,但是结合前面的内容
- * 这样%playerpoints_points%就成了一个个体,而且还存在一个"
- * 那么无疑就成了String了,拿String和Int作比较,这个结果可想而知
- * 另外也肯定有人问: 那我将错就错,我把233也套上"不就行了吗?
- * 首先,我敢肯定这是个迷惑行为,拿String和String作比较,这样不就违反了
- * 我一开始讲到的 "只能是Int和Int做对比" 原则了吗
- * 说了一大堆,总结: Int外面莫套壳,Int就和Int比
- * 那么怎么表达一个反向条件呢
- * 例如一开始讲到的 "如果玩家的名字是AzureHanChen,那么此条件通过"
- * 那么怎么实现如果 "如果玩家的名字不是AzureHanChen,那么此条件通过"呢?
- * !+一个JS格式
- * 例如expression: '!(%player_name%).equals("AzureHanChen")'
- * 就可以实现"如果玩家的名字不是AzureHanChen,那么此条件通过"
- * 那么如何实现两个JS都通过此javascript条件才通过呢
- * JS1 && JS2
- * 例如
- * expression: '(%player_name%).equals("AzureHanChen") && %playerpoints_points% >= 1'
- * 玩家的名字必须是AzureHanChen*且*玩家的%playerpoints_points%≥1
- * 那如何实现二者其一通过,此条件就通过呢
- * JS1 || JS2
- * 例如
- * expression: ' %vault_eco_balance% >=233 && %playerpoints_points% >= 1'
- * 玩家的Vault经济系统金额必须≥233*也或者*玩家的%playerpoints_points%≥1
- (*) 憋说我啰嗦,不同的货币在不同的服务器有不同的命名,因此我用代名词来指认
- (*) 如果在你服的PlayerPoints是金币,我说点券你会明白?
10 了解DM的菜单层面的一些设置
- menu_title: String
- #菜单的标题,打开菜单(GUI)后最顶上的名字
- #也可以理解为容器的名字
- [必有]
- open_command: abcd
- 打开菜单的快捷指令
- open_command:
- - abcd
- - abcd
- 与上方一样,打开菜单的多个快捷指令
- 但与上方只能二选一
- open_commands:
- - 'Action'
- - 'Action'
- 成功打开菜单后的操作
- (如果不满足所有打开条件将不会执行)
- inventory_tyepe: 见下方
- GUI界面的类型,支持
- * CHEST (箱子) (默认)
- * ANVIL (铁砧)
- * WORKBENCH (工作台)
- * DISPENSER (发射器)
- * FURNACE (熔炉)
- * HOPPER (漏斗)
- size: Int
- 菜单能容纳物品的个数
- 俗称菜单大小
- 必须是9的倍数,并且在9~54之间
- 只有上方的inventory_type忽略或填CHEST时才有效
- 如果inventory_type填写的不是CHEST,那么无论这里设置多少都没用
- (必须||在上方显示)
- args:
- abcd: Int
- abcd: Int
- args_usage_message: String
- 打开菜单时传入的参数
- 比如我输入/菜单的快捷指令 first second third
- 那么first,second,third均是传入菜单的参数
- 你可以使用{abcd}来作为变量
- 如果玩家少参数或者多参数,则会发送args_usage_message的提示信息
- * 下面举个例子
- args:
- first: 1
- second: 1
- third -1
- args_usage_message: "你的参数不正确"
- 当玩家输入/example azurehanchen wohaotua wohaonana zapic时
- 菜单里的{first}变量将会被解析为azurehanchen
- 同理,{second}将会被解析为wohaotua
- {third}将会被解析为wohaonana zapic
- 此时-1的意思时第三个及以后的所有参数都作为变量
- 也就是参数可以≥3个
- * 另一个例子
- args:
- first: 1
- second: 1
- third 1
- args_usage_message: "你的参数不正确"
- 当玩家输入/example a b时,因为没传入third变量,所以会提示玩家"你的参数不正确"
- 当玩家输入/example a b c d时,因为多了一个变量,所以也会提示玩家"你的参数不正确"
- 这是因为刚才的-1变成了1,因此参数必须==3个
- 注: args_usage_message是可选参数,但如果没有且玩家输入的参数不正确,就不会有反应
- (可选)
- update_interval: Int
- 更新菜单内变量的频率
- 单位为"ticks" , 1s=20ticks
- 注意,并不等于刷新菜单
- 比如更新前玩家没达到条件,看到了物品A
- 那么更新后,即使玩家满足了条件,也仍然只能看到物品A
- 此时需要在某些地方添加[fresh]动作参数,就可以破阵了
- (可选)
- items:
- 后面什么都不用写
- 只是告诉插件下面该写物品了
11 物品部分
一个菜单里当然有很多物品
那么一个物品可以有什么参数呢
- material: ABCD
- data: Int
- 物品的ID,必须是全英文大写(?)字符
- 例如STONE
- 而一些特殊的物品,例如羊毛等存在子ID的物品
- 则可以通过data实现
- 但是如果没有子ID的物品请勿设置,否则可能会抛出空指针错误
- 比如橙色羊毛
- material: WOOL
- data: 1
- 而如果是想显示一个子ID为0的物品
- 则可以忽略data参数,例如白色羊毛
- material: WOOL
- (material必选)
- TIPS - material里可以填写什么
- - 物品ID (例如STONE)
- - 某个返回值是物品ID的变量 (placeholder-变量)
- - 头颅-某个玩家的ID (head;玩家ID)
- - 头颅-某个返回值是玩家的变量 (head;%player_name%)
- - 头颅-传入参数 (head;{某个传入参数})
- - 头颅-纹理ID (basehead-纹理ID)
- -你可以在 https://minecraft-heads.com/ 中
- - 找到一个CustomHead 然后他的Value值就是纹理ID
- - EpicHeads插件提供的头颅 (heads-ID)
- - HeadDatabase插件提供的头颅 (hdb-ID) (见图1&2)
- 图1
- 图2
- amount: Int
- 显示的物品数量
- 必须≤对应物品的最大堆叠
- 例如末影珍珠,最大不能设置超过16
- 不支持填写变量来实现动态数量
- (可选)
- dynamic_amount: 'PAPI变量'
- 动态物品数量
- 与上方的amount二选一
- 支持填写一些返回值是数字的变量
- 不过仍然需≤最大堆叠数量
- (可选)
- banner_meta:
- - 染料颜色;旗帜图案
- - 染料颜色;旗帜图案
- 旗帜参数,只有当material为BANNER时才可以
- 你可以同时堆叠多个参数,以达到你想要的结果
- 注: 染料颜色和旗帜图案可以在上方提到的网址找到
- (可选)
- rgb: Int,Int,Int
- 某些物品的"颜色"
- 例如皮革盔甲,
- 例如
- rgb: 38,192,210
- display_name: String
- 物品显示的名字
- 支持PAPI变量以及颜色样式代码
- 如果忽略该参数
- 就会自动根据客户端语言返回对应物品的名字
- (可选)
- lore:
- - String
- - String
- 物品的Lore
- 支持PAPI变量以及颜色样式代码
- 但最好请指明颜色
- 如果直接上字会变成极为憨憨的斜体紫色字
- (可选)
- slot: Int
- slots:
- - Int
- - Int
- 物品的位置
- 以上两个二选一,
- slots支持一个物品在多个位置出现
- 但与slot必须二选一,两者必须出现一个,但也不能同时出现
- priority: Int
- 该物品在所在位置上的优先级
- 建议配合条件一起使用,否则跟没用一样
- view_requirement:
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- 看到这个物品的前提条件
- 比如在0位置上有两个物品:
- 物品A 优先级为1 条件是拥有test.test权限
- 物品B 优先级为2 没有条件
- 那么没有test.test权限的玩家只能看到物品B
- 反之,则可以看到物品A
- enchantments:
- - 附魔ID;等级
- - 附魔ID;等级
- 附魔选项
- ! 部分物品不能被附魔
- ! 部分物品只能附部分魔
- 你可以给物品附多个魔,前提是它支持 (见图1)
- 当然如果你不想看见那犯人的附魔提示
- (Protection I)
- 您可以使用
- hide_enchantments: true
- 来隐藏附魔提示
- (使用后见图2)
- 图1
- 图2
- hide_attributes: true / false
- 隐藏物品属性提示
- 比如上图中的 +8 Armor
- (使用后见图3)
- 图3
- hide_effects: true / false
- 隐藏药水效果
- 比如No Effects
- (使用前[或false] 见图4)
- (使用后见图5)
- 图4
- 图5
- update: true / false
- 是否更新该物品显示名字,Lore中的变量
- 如果是(true),那么将按照GUI设置的(update_interval)频率进行更新
- 不会重新计算优先级
- left_click_commands:
- #左键单击执行的操作
- - "Action"
- - "Action"
- right_click_commands:
- #右键单击执行的操作
- - "Action"
- - "Action"
- middle_click_commands:
- #中键单击执行的操作
- - "Action"
- - "Action"
- shift_left_click_commands:
- #Shift+左键点击执行的操作
- - "Action"
- - "Action"
- shift_right_click_commands:
- #Shift+右键点击执行的操作
- - "Action"
- - "Action"
- left_click_requirement:
- #左键单击的前提条件
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- deny_commands:
- #如果无法全部达到,那么执行的操作
- - "Action"
- - "Action"
- right_click_requirement:
- #右键单击的前提条件
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- deny_commands:
- #如果无法全部达到,那么执行的操作
- - "Action"
- - "Action"
- middle_click_requirement:
- #中键单击的前提条件
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- deny_commands:
- #如果无法全部达到,那么执行的操作
- - "Action"
- - "Action"
- shift_left_click_requirement:
- #Shift+左键点击的前提条件
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- deny_commands:
- #如果无法全部达到,那么执行的操作
- - "Action"
- - "Action"
- shift_right_click_requirement:
- #Shift+右键点击的前提条件
- requirements:
- 条件1:
- type: xxx
- 条件2:
- type: xxx
- deny_commands:
- #如果无法全部达到,那么执行的操作
- - "Action"
- - "Action"
12-1 配合Essentials(X)做个物品礼包菜单
在这里我想用Essential(X)自带的Firework(烟花)礼包 配合DeluxeMenus做一个礼包菜单 冷却时间是24小时
(plugins/Essentials/kits.yml)
- firework:
- delay: 86400
- items:
- - fireworkrocket 1 name:Angry_Creeper color:red fade:green type:creeper power:1
- - fireworkrocket 1 name:Starry_Night color:yellow,orange fade:blue type:star effect:trail,twinkle power:1
- - fireworkrocket 2 name:Solar_Wind color:yellow,orange fade:red shape:large effect:twinkle color:yellow,orange fade:red shape:ball effect:trail color:red,purple fade:pink shape:star effect:trail power:1
首先,Essentials(X)自带的Firework(烟花)礼包
并非24小时的冷却,所以要修改礼包中的delay参数
在这里,单位是秒,24x60x60=86400,
因此在delay处填写86400
图片展示
后半段的聊天栏没**,不过不影响观看
菜单配置
OP可以无视冷却时间领取,请知晓
本菜单不需要下载任何PAPI拓展
但请先给予玩家
essentials.kit
essentials.kit.firework
这两个权限
- menu_title: '&fComplex Studio'
- open_command: libao
- update_interval: 5
- size: 9
- items:
- firework-yes:
- material: hdb-34571
- slot: 0
- display_name: '&a烟花礼包'
- lore:
- - '&f状态 &8| &a可用'
- - ''
- - '&e左键单击领取'
- priority: 1
- view_requirement:
- requirements:
- lengque:
- type: string equals
- input: "%essentials_kit_is_available_Firework%"
- output: "yes"
- left_click_commands:
- - '[close]'
- - '[player] kits Firework'
- - '[message] 领取成功咯,过24小时后再来吧'
- firework-no:
- material: hdb-34571
- slot: 0
- update: true
- display_name: '&a烟花礼包'
- lore:
- - '&f状态 &8| &a冷却中'
- - '&f冷却 &8| &a%essentials_kit_time_until_available_Firework%'
- - ''
- - '&c暂不可用'
- priority: 2
12-2 配合CMI做个物品礼包菜单
当然仍然有一大部分服主在使用CMI作为基础插件
下面是一个CMI配合DM做一个物品礼包菜单的例子
思路是利用CMI自带的Advanced礼包(只有一个石头)
做一个1周领取一次的礼包菜单
(plugins/CMI/kits.yml)
- Advanced:
- CommandName: Advanced
- Enabled: true
- DropOnGround: true
- ShowDespiteWeight: false
- Delay: 604800
- MaxUsages: -1
- Items:
- '1':
- type: STONE
图片展示
菜单配置
请先给予玩家
cmi.kit.advanced
权限
- menu_title: '&fComplex Studio'
- open_command: libao
- update_interval: 5
- size: 9
- items:
- firework-yes:
- material: hdb-34571
- slot: 0
- display_name: '&a烟花礼包'
- lore:
- - '&f状态 &8| &a可用'
- - ''
- - '&e左键单击领取'
- priority: 1
- view_requirement:
- requirements:
- lengque:
- type: string equals
- input: "%cmi_user_kitcd_Advanced%"
- output: "-"
- left_click_commands:
- - '[close]'
- - '[player] cmi kit Advanced'
- - '[message] 领取成功咯,过7天后再来吧'
- firework-no:
- material: hdb-34571
- slot: 0
- update: true
- display_name: '&a烟花礼包'
- lore:
- - '&f状态 &8| &a冷却中'
- - '&f冷却 &8| &a%cmi_user_kitcd_Advanced%'
- - ''
- - '&c暂不可用'
- priority: 2
12-3-1 仅配合权限组插件(LP)做个高级点的礼包菜单
注意,下文所述的"权限组插件"均是LuckPerms
一些小游戏等类型服务器可能并不会用到基础插件
这时候就可以配合权限插件做一个礼包菜单
思路:
如果玩家有test.vip权限且不在冷却内
则可以领取10点券(PlayerPoints)和1个钻石块
如果玩家没有test.vip权限但也不在冷却内
则只能领取1个铁块
冷却时间为3小时
解析:
物品A:
- 优先级1
- 条件:拥有test.vip权限和test.cooldown权限
- 点击后什么也不会发生 物品B:
- 优先级2
- 条件:拥有test.cooldown权限
- 点击后什么也不会发生 物品C:
- 优先级3
- 条件:拥有test.vip权限
- 点击后给予10点券和1个钻石块
- 另外给予3小时的test.cooldown权限 物品C:
- 优先级4
- 无条件
- 点击后给予1个铁块
- 另外给予3小时的test.cooldown权限
图片展示
- 无test.vip权限
- 有test.vip权限
菜单配置
请先下载Player拓展
/papi ecloud download Player
LuckPerms拓展无需下载
- menu_title: '&fComplex Studio'
- open_command: libao
- update_interval: 1
- size: 9
- items:
- cooldown-vip:
- material: hdb-9166
- slot: 0
- update: true
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*钻石块,10*点券'
- - '&f状态 &8| &a冷却中'
- - '&f剩余 &8| %luckperms_expiry_time_test.cooldown%'
- - ''
- - '&e&oVIP加成'
- - ''
- - '&c冷却中'
- priority: 1
- view_requirement:
- requirements:
- vip:
- type: has permission
- permission: 'test.vip'
- cooldown:
- type: has permission
- permission: 'test.cooldown'
- cooldown:
- material: hdb-9274
- slot: 0
- display_name: '&a礼包'
- update: true
- lore:
- - ''
- - '&f内容 &8| &a1*铁块'
- - '&f状态 &8| &a冷却中'
- - '&f剩余 &8| %luckperms_expiry_time_test.cooldown%'
- - ''
- - '&c冷却中'
- priority: 2
- view_requirement:
- requirements:
- cooldown:
- type: has permission
- permission: 'test.cooldown'
- vip:
- material: hdb-9132
- slot: 0
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*钻石块,10*点券'
- - '&f状态 &8| &a可领取'
- - ''
- - '&e&oVIP加成'
- - ''
- - '&b点击领取'
- priority: 3
- view_requirement:
- requirements:
- vip:
- type: has permission
- permission: 'test.vip'
- left_click_commands:
- - '[close]'
- - '[message] 尊贵的VIP用户: 您已领取成功礼包,冷却3小时'
- - '[console] points give %player_name% 10'
- - '[console] give %player_name% DIAMOND_BLOCK 1'
- - '[console] lp user %player_name% permission settemp test.cooldown true 3h'
- player:
- material: hdb-9240
- slot: 0
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*铁块'
- - '&f状态 &8| &a可领取'
- - ''
- - '&b点击领取'
- priority: 4
- left_click_commands:
- - '[close]'
- - '[message] 已领取成功礼包,冷却3小时'
- - '[console] give %player_name% IRON_BLOCK 1'
- - '[console] lp user %player_name% permission settemp test.cooldown true 3h'
12-3-2 仅配合权限组插件(PEX)做个高级点的礼包菜单
! PEX不支持PAPI变量,因此无法查看剩余冷却时间
思路同上
菜单配置
请先下载Player拓展
/papi ecloud download Player
- menu_title: '&fComplex Studio'
- open_command: libao
- update_interval: 1
- size: 9
- items:
- cooldown-vip:
- material: hdb-9166
- slot: 0
- update: true
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*钻石块,10*点券'
- - '&f状态 &8| &a冷却中'
- - ''
- - '&e&oVIP加成'
- - ''
- - '&c冷却中'
- priority: 1
- view_requirement:
- requirements:
- vip:
- type: has permission
- permission: 'test.vip'
- cooldown:
- type: has permission
- permission: 'test.cooldown'
- cooldown:
- material: hdb-9274
- slot: 0
- display_name: '&a礼包'
- update: true
- lore:
- - ''
- - '&f内容 &8| &a1*铁块'
- - '&f状态 &8| &a冷却中'
- - ''
- - '&c冷却中'
- priority: 2
- view_requirement:
- requirements:
- cooldown:
- type: has permission
- permission: 'test.cooldown'
- vip:
- material: hdb-9132
- slot: 0
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*钻石块,10*点券'
- - '&f状态 &8| &a可领取'
- - ''
- - '&e&oVIP加成'
- - ''
- - '&b点击领取'
- priority: 3
- view_requirement:
- requirements:
- vip:
- type: has permission
- permission: 'test.vip'
- left_click_commands:
- - '[close]'
- - '[message] 尊贵的VIP用户: 您已领取成功礼包,冷却3小时'
- - '[console] points give %player_name% 10'
- - '[console] give %player_name% DIAMOND_BLOCK 1'
- - '[console] pex user %player_name% timed add test.cooldown 10800'
- player:
- material: hdb-9240
- slot: 0
- display_name: '&a礼包'
- lore:
- - ''
- - '&f内容 &8| &a1*铁块'
- - '&f状态 &8| &a可领取'
- - ''
- - '&b点击领取'
- priority: 4
- left_click_commands:
- - '[close]'
- - '[message] 已领取成功礼包,冷却3小时'
- - '[console] give %player_name% IRON_BLOCK 1'
- - '[console] pex user %player_name% timed add test.cooldown 10800'
13 做一个收购&出售商店菜单
思路是如果玩家左键点击这个物品
那么需要10点券,如果满足条件(<-)将给予1个钻石
如果玩家右键点击这个物品
那么需要1个钻石,如果满足条件(<-)将给予9点券
图片展示
图片加载可能有些慢,谅解
菜单配置
/papi ecloud download Player
/papi ecloud download PlayerPoints
- menu_title: '&fComplex Studio'
- open_command: shop
- update_interval: 1
- size: 9
- items:
- diamond:
- material: hdb-106
- slot: 0
- display_name: '&b钻石'
- lore:
- - '&a左键 &8| &f花费10*点券,购买1*钻石'
- - '&a右键 &8| &f出手1*钻石,获得10*点券'
- left_click_commands:
- - '[message] 成功购买钻石*1,共花费10*点券'
- - '[console] points take %player_name% 10'
- - '[console] give %player_name% DIAMOND 1'
- left_click_requirement:
- requirements:
- points:
- type: '>='
- input: '%playerpoints_points%'
- output: '10'
- deny_commands:
- - '[close]'
- - '[message] 抱歉,您没有足够多的点券'
- right_click_commands:
- - '[message] 成功出手钻石*1,共获得9*点券'
- - '[console] points give %player_name% 9'
- - '[console] clear %player_name% DIAMOND 0 1'
- right_click_requirement:
- requirements:
- points:
- type: has item
- material: DIAMOND
- amount: 1
- deny_commands:
- - '[close]'
- - '[message] 抱歉,您没有足够多的钻石'
14 利用传入参数做一个简单的菜单
思路:
输入/player <玩家ID>后会打开一个菜单
可以在这个菜单里自由选择如何惩罚或者奖励这位玩家
图片展示
菜单配置
- menu_title: '&f撒币菜单: {player}'
- open_command: player
- update_interval: 1
- size: 27
- args:
- player: -1
- args_usage_message: "使用方式不对,/player <玩家ID>"
- items:
- zhuangshi:
- material: STAINED_GLASS_PANE
- slots:
- - 0
- - 1
- - 2
- - 3
- - 4
- - 5
- - 6
- - 7
- - 8
- - 18
- - 19
- - 20
- - 21
- - 22
- - 23
- - 24
- - 25
- - 26
- display_name: '&e我只是个装饰物'
- 1pointsplus:
- material: hdb-106
- slot: 9
- display_name: '&e给他1点券'
- left_click_commands:
- - '[message] 你给予了{player} 1点券'
- - '[console] points give {player} 1'
- 10points:
- material: hdb-106
- slot: 10
- display_name: '&e给他10点券'
- left_click_commands:
- - '[message] 你给予了 {player} 10点券'
- - '[console] points give {player} 10'
- 100points:
- material: hdb-106
- slot: 11
- display_name: '&e给他100点券'
- left_click_commands:
- - '[message] 你给予了 {player} 100点券'
- - '[console] points give {player} 100'
- 1000points:
- material: hdb-106
- slot: 12
- display_name: '&e给他1000点券'
- left_click_commands:
- - '[message] 你给予了 {player} 1000点券'
- - '[console] points give {player} 1000'
- kou1points:
- material: hdb-25850
- slot: 13
- display_name: '&e扣除他1点券'
- left_click_commands:
- - '[message] 你扣除了 {player} 1点券'
- - '[console] points take {player} 1'
- kou10points:
- material: hdb-25850
- slot: 14
- display_name: '&e扣除他10点券'
- left_click_commands:
- - '[message] 你扣除了 {player} 10点券'
- - '[console] points take {player} 10'
- kou100points:
- material: hdb-25850
- slot: 15
- display_name: '&e扣除他100点券'
- left_click_commands:
- - '[message] 你扣除了 {player} 100点券'
- - '[console] points take {player} 100'
- kou1000points:
- material: hdb-25850
- slot: 16
- display_name: '&e扣除他1000点券'
- left_click_commands:
- - '[message] 你扣除了 {player} 1000点券'
- - '[console] points take {player} 1000'
- close:
- material: hdb-187
- slot: 17
- display_name: '&c关闭'
- left_click_commands:
- - '[close]'
15 听说你想加点声音?
哪个男孩不想给自己的菜单加点声音呢?
首先得找到一段声音
在原版MC中,你可以使用"/playsound"
来寻找一段符合菜单/物品设定的声音
比如我想在礼包冷却时给玩家放一段末影人传送的声音
先分析一下
末影人属于生物 entity
而末影人则是 endermen
传送则是 teleport
- /playsound minecraft:entity.endermen.teleport ambient @a
但是在菜单中可不能直接这样写
要全大写并且将.改为_ 也就是
ENTITY_ENDERMEN_MEN
- - '[sound] ENTITY_ENDERMEN_MEN'
16 总结
本教程到这里就告一段落了
字数统计
5368个汉字 18350个字母
[groupid=1701]Complex Studio[/groupid]