本帖最后由 AzureHanChen 于 2020-3-10 15:46 编辑




手把手教你写一个完美的DeluxeMenus菜单





1  前言

写本帖的原因是我看到现在大部分小白服主比较尴尬

大多数人都吹爆TrMenu,但又太过于复杂,看不懂

但是用CC菜单,功能太少,不支持PAPI变量... (省略1w字)

这时候我认为DeluxeMenus是个特别不错的用来过渡的插件

但既然是过渡了,所以我认为本贴不欢迎以下几种服主

  1. * 还在使用CatServer(Pro),Mohist等核心的服主 (DM不支持Forge服务端)
  2. * 认为CC是「天下最强」菜单插件的服主
  3. * 没有YAML语法基础 && 开服基础,不思进取的服主
  4. * 觉得自己基础很"厚",看完了之后一脸懵的服主
  5. * 「那你能帮帮我吗」,「我不会就要问啊」,「求一个菜单模板」,「你爱答不答」
  6. * 认为这个教程没用 (那您现在可以点击右上角的 × )
复制代码

本帖子使用Markdown编写,感谢4z大佬的MM2BC

(*) 觉得太丑了?那你去物管啊(怒吼

(*) 下文读起来可能有些啰嗦,不过既然是「手把手」了吗..





2  准备工作

下文教程的环境

  1. * Spigot 1.12.2
  2. * PlaceholderAPI 2.10.4
  3. * DeluxeMenus 1.12.0 (最新)
复制代码

不过请注意,DeluxeMenus 1.10.6及以后的版本

不支持1.8.X及更低的核心版本 (例如 Paper 1.8.8 )

如需使用DM的话,请使用1.10.5及以前的版本

因为金钱,点券等变量,都要依靠PAPI作为中继,

所以我会在每一个菜单开始,讲清楚要从云端(ecloud)下载什么拓展





3  一些你可能会用到的网址

PAPI变量大全


物品Material大全


*: 会随着最新版本的Spigot而更新

附魔ID大全 (*)


*:请务必注意,部分物品是不能附任何魔的,部分物品只能附一部分的魔

用来做自定义旗帜的材料


MC音效ID大全






4  DM插件的命令与权限

*本来以为命令和权限只有原搬运贴中的那一点,结果打开plugin.yml后...

*下文提到的任何权限,OP都默认拥有

  1. /dm* reload
  2. 重载插件配置文件&所有菜单
  3. 在重载过程中会为所有玩家关闭菜单,不必担心刷物品问题
  4. deluxemenus.admin

  5. *:也可以是deluxemenus/deluxemenu/dmenu

  6. /dm list
  7. 查看所有已经加载的菜单
  8. deluxemenus.admin

  9. /dm open <菜单名字> (玩家)
  10. 为(玩家)打开一个菜单
  11. 不填玩家则是自己
  12. 不指明玩家: deluxemenus.open
  13. 指明玩家: deluxemenus.open.others

  14. deluxemenus.open.bypass
  15. 拥有此权限可以无视任何菜单的打开条件
复制代码





5  下载&安装DM

如果没有特殊情况,那我建议您去原帖下载并且给予一个5星review ()

不过如果您「懒」亦或者其他原因,我在这里准备了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

  1. debug: false
  2. check_updates: true
  3. gui_menus:
  4.   example:
  5.   #注册的名字,可以通过/dm open 注册的名字 打开菜单
  6.     file: example.yml
  7.     #该菜单在gui_menus文件夹中的名字
复制代码

修改完成后点击保存(*),然后使用/dm reload

*:我在这里建议使用VS Code(更美观),而不是憨憨记事板

重置完插件配置后,您应该可以在plugins/DeluxeMenus中找到一个gui_menus菜单

打开后发现自动生成了一个菜单,跟刚才在config.yml中修改前一模一样





7  了解一个菜单结构

有心的服主应该都发现了,为什么每一行之间还有空格呢

如果了解过YAML语法的话,这种形式叫做「缩进」

就好比父子关系一样 (雾 , 从整个菜单层面到菜单中的一个物品

下面是DM的结构关系

  1. 菜单设置1: ''
  2. 菜单设置2: false
  3. 物品:
  4.   物品1:
  5.     物品1的Material: STONE
  6.     物品1的Slot: 0
  7.   物品2:
  8.   ...
复制代码





8  了解一些代名词

WARNING 我建议仔细阅读本章 在下面会用到

  1. String
  2. 字符串
  3. 可以在这里填写任意
  4. 中/英文字符和一部分特殊符号
  5. 在DM中支持往里填写PAPI变量
  6. 需要用引号标注开头和结尾
复制代码
  1. Int
  2. "阿拉伯数字"*
  3. 可以在这里填写
  4. -2147483648 ~ 2147483647
  5. 不需要带引号
复制代码

(*)官方译名:向下取整函数

  1. abcd
  2. 在这里填写中/英文字符,不可以有空格
  3. 不可以有PAPI变量
复制代码
  1. Action
  2. 动作,也称操作,附属于String,
  3. 所以要用引号标注开头结尾.
  4. ↓一般长这样↓
  5. a:
  6. - 'Action'
  7. - 'Action'

  8. 动作类型[空格]动作参数[空格]附加参数
  9. 组成
复制代码
  1. 动作类型大全
  2. !区分大小写!

  3. * [player]
  4. * 从玩家的角度执行一个命令
  5. * 动作参数不需要带/
  6. * (例) [player] spawn

  7. * [console]
  8. * 从控制台角度执行一个命令
  9. * 动作参数不需要带/,一般需要指明玩家
  10. * (例) [console] points give %player_name% 2020

  11. * [commandevent]
  12. * 从玩家角度执行一个未在plugin.yml注册过的"快捷"命令
  13. * 动作参数不需要带/

  14. * [message]
  15. * 为该玩家发送一条消息,支持颜色代码(&)和PAPI变量
  16. * (例) [message] C.P.S小组诚招打字员,加入q球群⑨Ⅴ六⑨零⑥四⑦Ⅷ

  17. * [connect]
  18. * 为该玩家连接到另一个服务器,
  19. * 命令参数必须是在Bungee的config.yml中注册的服务器名
  20. * (例) [connect] BedWars①_恰豆豆

  21. * [json]
  22. * 为该玩家发送一条JSON格式编译后的消息
  23. * (错例) [json] &e123456%player_name%
  24. * (例) [json] {"text":"&7你收到了来自CPS可爱萌妹兔子的一封信 <<<点击查看","clickEvent":{"action":"open_url","value":"https://shang.qq.com/wpa/qunwpa?idkey=f946c3ce841c66409bac42facfab5ecce20df454ac96f4181279cfb928e39d93"}}

  25. * [sound]
  26. * 为该玩家发送一段MC中的音效
  27. * (例) [sound] ENTITY_VILLAGER_YES
  28. * 用心看帖子的人都知道操作参数(音效ID)在哪里找#run

  29. * [broadcastsound]
  30. * 为该服务器里的所有玩家播放一段MC中的音效
  31. * 不支持跨服!
  32. * (例) [sound] ENTITY_VILLAGER_NO

  33. * [refresh]
  34. * 关闭再重新打开这个菜单
  35. * 你也可以理解为变相刷新菜单
  36. * 不需要

  37. * [takemoney]
  38. * 扣除玩家在与Vault挂钩的经济系统中的余额
  39. * 例如Essentials自带的经济系统就与Vault挂钩
  40. * 但PlayerPoints并不
  41. * 操作参数是Int
  42. * (例) [takemoney] 2020

  43. * [openguimenu]
  44. * 打开另一个菜单 (必须是DeluxeMenus中的菜单)
  45. * 操作参数是菜单在DM的config.yml中注册的名字
  46. * (例) [openguimenu] example

  47. * [close]
  48. * 关闭这个菜单
  49. * 不需要跟操作参数
复制代码
  1. 附加参数大全

  2. * <delay=Int>
  3. * 上方Int的单位是Ticks
  4. * 1Ticks = 0.05 s
  5. * 1s = 20Ticks

  6. * <chance=Int>
  7. * 上方Int必须在0~100之间
  8. * 即执行前面操作的概率是 Int/100
复制代码





9  教你写一个条件

为了更符合正常的学习流程,我先在这里讲如何写一个条件

注意 这里也许需要一定的Java基础,不过没有也无妨

你下面所看到的

  • open_requirement:
  • left_click_requirement:
  • right_click_requirement:
  • view_requirement:
  • 等结尾是 requirement 的选项
    即为条件选项

条件选项配合多个物品的优先级

可以做到一些譬如

在同一个物品位置上,如果玩家有100点券就可以看到钻石,没有则看到泥土

的一类操作

接下来由我讲解一下如何写一个条件(requirement)

下面是两个例子,用来解释到底条件写在哪里

  1. view_requirement:
  2.   requirements:
  3.   #表示下面所有的每一子项都是条件
  4.     one:
  5.     #条件1
  6.       ......
  7.     cps:
  8.     #条件2
  9.       ......
复制代码
  1. left_click_requirement:
  2.   requirement:
  3.   #表示下面所有的每一子项都是条件
  4.     one:
  5.     #条件1
  6.       type: ......
  7.     two:
  8.     #条件2
  9.       type: ......
  10.   deny_commands:
  11.   #如果无法全部满足上面的条件,将会执行下面的操作
  12.   - 'Action'
  13.   - 'Action'
复制代码

那么就来了解下每个条件是怎么写的吧

  1. type: has permission
  2. permission: 'abcd.abcd'

  3. * 检测玩家是否拥有这个权限
复制代码
  1. type: has money
  2. amount: Int

  3. * 检测玩家是否拥有一定的金钱 (即≥)
  4. * 从与Vault挂钩的经济系统获取数据进行比对
复制代码
  1. type: string equals
  2. input: 'String'
  3. output: 'String'

  4. * 检测输入与输出是否完全一致(大小写也相同)

  5. * 例子
  6. type: string equals
  7. input: '%player_name%'
  8. output: 'AzureHanChen'

  9. * 检测玩家的ID是不是AzureHanChen
复制代码
  1. type: string equals igonecase
  2. input: 'String'
  3. output: 'String'

  4. * 检测输入与输出是否完全一致(忽略大小写)

  5. * 例子
  6. type: string equals igonecase
  7. input: '%player_name%'
  8. output: 'azurehanchen'

  9. *检测玩家的ID是否是azurehanchen (忽略大小写)
复制代码
  1. type: has item
  2. material: 物品ID(全英文)大写
  3. data: 子ID
  4. amount: Int
  5. name: 'String'
  6. lore:
  7. - 'String'
  8. - 'String'

  9. * 需要玩家的背包里含有amount个material+data物品
  10. * 且名字是name,lore必须逐行对应

  11. * material,amount是必选的,其他看情况删减
复制代码
  1. type: javascript
  2. expression: 'JS'

  3. 用过老版DM或者在用TrMenu的服主应该会比较明白
  4. 就是填写一些JS表达式,使用&&表并列,使用||表其一,使用!表(如果)不
  5. 其实上面的所有简化条件都是由这个转来的

  6. 下面是一些格式

  7. * (String[A]).equals(String[B])
  8. * 输入A与输出B是否完全一致
  9. * (例) (%player_name%).equals.("AzureHanChen")
  10. * 玩家的名字是否是AzureHanChen

  11. * (String[A]).equalsIgoneCase(String[B])
  12. * 输入A与输入B除大小写外是否完全一致
  13. * (例) (%player_name%).equalsIgoneCase.("AzureHanChen")
  14. * 玩家的名字在忽略的大小写的情况下是否是AzureHanChen

  15. * A (符号) B
  16. * A 是否 (符号) B
  17. * 只能用于A和B都是Int的场景中

  18. * 符号列表
  19. * == 等于
  20. * > 大于
  21. * >= 大于或等于
  22. * <= 小于或等于
  23. * < 小于

  24. * (错例) %player_name% == AzureHanChen
  25. * (错例) "%playerpoints_points" >= 233
  26. * 那肯定有人要问了,为什么这个不对呢
  27. * 首先,如果按照上面写,那么写出来是这样的
  28. * expression: '"%playerpoints_points%" >= 233'
  29. * 首先'里面可以套"是对的,但是结合前面的内容
  30. * 这样%playerpoints_points%就成了一个个体,而且还存在一个"
  31. * 那么无疑就成了String了,拿String和Int作比较,这个结果可想而知
  32. * 另外也肯定有人问: 那我将错就错,我把233也套上"不就行了吗?
  33. * 首先,我敢肯定这是个迷惑行为,拿String和String作比较,这样不就违反了
  34. * 我一开始讲到的 "只能是Int和Int做对比" 原则了吗

  35. * 说了一大堆,总结: Int外面莫套壳,Int就和Int比

  36. * 那么怎么表达一个反向条件呢
  37. * 例如一开始讲到的 "如果玩家的名字是AzureHanChen,那么此条件通过"
  38. * 那么怎么实现如果 "如果玩家的名字不是AzureHanChen,那么此条件通过"呢?

  39. * !+一个JS格式
  40. * 例如expression: '!(%player_name%).equals("AzureHanChen")'
  41. * 就可以实现"如果玩家的名字不是AzureHanChen,那么此条件通过"

  42. * 那么如何实现两个JS都通过此javascript条件才通过呢
  43. * JS1 && JS2
  44. * 例如
  45. * expression: '(%player_name%).equals("AzureHanChen") && %playerpoints_points% >= 1'
  46. * 玩家的名字必须是AzureHanChen*且*玩家的%playerpoints_points%≥1

  47. * 那如何实现二者其一通过,此条件就通过呢
  48. * JS1 || JS2
  49. * 例如
  50. * expression: ' %vault_eco_balance% >=233 && %playerpoints_points% >= 1'
  51. * 玩家的Vault经济系统金额必须≥233*也或者*玩家的%playerpoints_points%≥1

  52. (*) 憋说我啰嗦,不同的货币在不同的服务器有不同的命名,因此我用代名词来指认
  53. (*) 如果在你服的PlayerPoints是金币,我说点券你会明白?
复制代码





10  了解DM的菜单层面的一些设置

  1. menu_title: String
  2. #菜单的标题,打开菜单(GUI)后最顶上的名字
  3. #也可以理解为容器的名字
  4. [必有]
复制代码
  1. open_command: abcd
  2. 打开菜单的快捷指令
复制代码
  1. open_command:
  2. - abcd
  3. - abcd
  4. 与上方一样,打开菜单的多个快捷指令
  5. 但与上方只能二选一
复制代码
  1. open_commands:
  2. - 'Action'
  3. - 'Action'
  4. 成功打开菜单后的操作
  5. (如果不满足所有打开条件将不会执行)
复制代码
  1. inventory_tyepe: 见下方
  2. GUI界面的类型,支持
  3. * CHEST (箱子) (默认)
  4. * ANVIL (铁砧)
  5. * WORKBENCH (工作台)
  6. * DISPENSER (发射器)
  7. * FURNACE (熔炉)
  8. * HOPPER (漏斗)
复制代码
  1. size: Int
  2. 菜单能容纳物品的个数
  3. 俗称菜单大小
  4. 必须是9的倍数,并且在9~54之间
  5. 只有上方的inventory_type忽略或填CHEST时才有效
  6. 如果inventory_type填写的不是CHEST,那么无论这里设置多少都没用
  7. (必须||在上方显示)
复制代码
  1. args:
  2.   abcd: Int
  3.   abcd: Int
  4. args_usage_message: String

  5. 打开菜单时传入的参数
  6. 比如我输入/菜单的快捷指令 first second third
  7. 那么first,second,third均是传入菜单的参数
  8. 你可以使用{abcd}来作为变量
  9. 如果玩家少参数或者多参数,则会发送args_usage_message的提示信息

  10. * 下面举个例子

  11. args:
  12.   first: 1
  13.   second: 1
  14.   third -1
  15. args_usage_message: "你的参数不正确"

  16. 当玩家输入/example azurehanchen wohaotua wohaonana zapic时
  17. 菜单里的{first}变量将会被解析为azurehanchen
  18. 同理,{second}将会被解析为wohaotua
  19. {third}将会被解析为wohaonana zapic
  20. 此时-1的意思时第三个及以后的所有参数都作为变量
  21. 也就是参数可以≥3个

  22. * 另一个例子

  23. args:
  24.   first: 1
  25.   second: 1
  26.   third 1
  27. args_usage_message: "你的参数不正确"

  28. 当玩家输入/example a b时,因为没传入third变量,所以会提示玩家"你的参数不正确"
  29. 当玩家输入/example a b c d时,因为多了一个变量,所以也会提示玩家"你的参数不正确"
  30. 这是因为刚才的-1变成了1,因此参数必须==3个

  31. 注: args_usage_message是可选参数,但如果没有且玩家输入的参数不正确,就不会有反应

  32. (可选)
复制代码
  1. update_interval: Int

  2. 更新菜单内变量的频率
  3. 单位为"ticks" , 1s=20ticks
  4. 注意,并不等于刷新菜单

  5. 比如更新前玩家没达到条件,看到了物品A
  6. 那么更新后,即使玩家满足了条件,也仍然只能看到物品A
  7. 此时需要在某些地方添加[fresh]动作参数,就可以破阵了
  8. (可选)
复制代码
  1. items:

  2. 后面什么都不用写
  3. 只是告诉插件下面该写物品了
复制代码





11 物品部分

一个菜单里当然有很多物品

那么一个物品可以有什么参数呢

  1. material: ABCD
  2. data: Int

  3. 物品的ID,必须是全英文大写(?)字符
  4. 例如STONE
  5. 而一些特殊的物品,例如羊毛等存在子ID的物品
  6. 则可以通过data实现
  7. 但是如果没有子ID的物品请勿设置,否则可能会抛出空指针错误

  8. 比如橙色羊毛

  9. material: WOOL
  10. data: 1

  11. 而如果是想显示一个子ID为0的物品
  12. 则可以忽略data参数,例如白色羊毛

  13. material: WOOL

  14. (material必选)
复制代码

  1. TIPS - material里可以填写什么

  2. - 物品ID (例如STONE)
  3. - 某个返回值是物品ID的变量 (placeholder-变量)
  4. - 头颅-某个玩家的ID (head;玩家ID)
  5. - 头颅-某个返回值是玩家的变量 (head;%player_name%)
  6. - 头颅-传入参数 (head;{某个传入参数})
  7. - 头颅-纹理ID (basehead-纹理ID)
  8.   -你可以在 https://minecraft-heads.com/ 中
  9.   - 找到一个CustomHead 然后他的Value值就是纹理ID
  10. - EpicHeads插件提供的头颅 (heads-ID)
  11. - HeadDatabase插件提供的头颅 (hdb-ID) (见图1&2)
复制代码



  • 图1



  • 图2

  1. amount: Int

  2. 显示的物品数量
  3. 必须≤对应物品的最大堆叠
  4. 例如末影珍珠,最大不能设置超过16

  5. 不支持填写变量来实现动态数量

  6. (可选)
复制代码
  1. dynamic_amount: 'PAPI变量'

  2. 动态物品数量
  3. 与上方的amount二选一
  4. 支持填写一些返回值是数字的变量
  5. 不过仍然需≤最大堆叠数量

  6. (可选)
复制代码
  1. banner_meta:
  2. - 染料颜色;旗帜图案
  3. - 染料颜色;旗帜图案

  4. 旗帜参数,只有当material为BANNER时才可以
  5. 你可以同时堆叠多个参数,以达到你想要的结果

  6. 注: 染料颜色和旗帜图案可以在上方提到的网址找到

  7. (可选)
复制代码


  1. rgb: Int,Int,Int

  2. 某些物品的"颜色"
  3. 例如皮革盔甲,

  4. 例如
  5. rgb: 38,192,210
复制代码



  1. display_name: String

  2. 物品显示的名字
  3. 支持PAPI变量以及颜色样式代码
  4. 如果忽略该参数
  5. 就会自动根据客户端语言返回对应物品的名字

  6. (可选)
复制代码
  1. lore:
  2.   - String
  3.   - String

  4. 物品的Lore
  5. 支持PAPI变量以及颜色样式代码
  6. 但最好请指明颜色
  7. 如果直接上字会变成极为憨憨的斜体紫色字

  8. (可选)
复制代码
  1. slot: Int
  2. slots:
  3. - Int
  4. - Int

  5. 物品的位置

  6. 以上两个二选一,
  7. slots支持一个物品在多个位置出现
  8. 但与slot必须二选一,两者必须出现一个,但也不能同时出现
复制代码
  1. priority: Int

  2. 该物品在所在位置上的优先级

  3. 建议配合条件一起使用,否则跟没用一样
复制代码
  1. view_requirement:
  2.   requirements:
  3.     条件1:
  4.       type: xxx
  5.     条件2:
  6.       type: xxx

  7. 看到这个物品的前提条件
复制代码
  1. 比如在0位置上有两个物品:
  2. 物品A 优先级为1 条件是拥有test.test权限
  3. 物品B 优先级为2 没有条件

  4. 那么没有test.test权限的玩家只能看到物品B
  5. 反之,则可以看到物品A
复制代码
  1. enchantments:
  2.   - 附魔ID;等级
  3.   - 附魔ID;等级

  4. 附魔选项
  5. ! 部分物品不能被附魔
  6. ! 部分物品只能附部分魔
  7. 你可以给物品附多个魔,前提是它支持 (见图1)

  8. 当然如果你不想看见那犯人的附魔提示
  9. (Protection I)

  10. 您可以使用
  11. hide_enchantments: true
  12. 来隐藏附魔提示
  13. (使用后见图2)
复制代码



  • 图1



  • 图2

  1. hide_attributes: true / false

  2. 隐藏物品属性提示
  3. 比如上图中的 +8 Armor
  4. (使用后见图3)
复制代码



  • 图3

  1. hide_effects: true / false

  2. 隐藏药水效果
  3. 比如No Effects
  4. (使用前[或false] 见图4)
  5. (使用后见图5)
复制代码



  • 图4



  • 图5

  1. update: true / false

  2. 是否更新该物品显示名字,Lore中的变量
  3. 如果是(true),那么将按照GUI设置的(update_interval)频率进行更新
  4. 不会重新计算优先级
复制代码
  1. left_click_commands:
  2. #左键单击执行的操作
  3.   - "Action"
  4.   - "Action"
  5. right_click_commands:
  6. #右键单击执行的操作
  7.   - "Action"
  8.   - "Action"
  9. middle_click_commands:
  10. #中键单击执行的操作
  11.   - "Action"
  12.   - "Action"
  13. shift_left_click_commands:
  14. #Shift+左键点击执行的操作
  15.   - "Action"
  16.   - "Action"
  17. shift_right_click_commands:
  18. #Shift+右键点击执行的操作
  19.   - "Action"
  20.   - "Action"
复制代码
  1. left_click_requirement:
  2. #左键单击的前提条件
  3.   requirements:
  4.     条件1:
  5.       type: xxx
  6.     条件2:
  7.       type: xxx
  8.   deny_commands:
  9.   #如果无法全部达到,那么执行的操作
  10.     - "Action"
  11.     - "Action"
  12. right_click_requirement:
  13. #右键单击的前提条件
  14.   requirements:
  15.     条件1:
  16.       type: xxx
  17.     条件2:
  18.       type: xxx
  19.   deny_commands:
  20.   #如果无法全部达到,那么执行的操作
  21.     - "Action"
  22.     - "Action"
  23. middle_click_requirement:
  24. #中键单击的前提条件
  25.   requirements:
  26.     条件1:
  27.       type: xxx
  28.     条件2:
  29.       type: xxx
  30.   deny_commands:
  31.   #如果无法全部达到,那么执行的操作
  32.     - "Action"
  33.     - "Action"
  34. shift_left_click_requirement:
  35. #Shift+左键点击的前提条件
  36.   requirements:
  37.     条件1:
  38.       type: xxx
  39.     条件2:
  40.       type: xxx
  41.   deny_commands:
  42.   #如果无法全部达到,那么执行的操作
  43.     - "Action"
  44.     - "Action"
  45. shift_right_click_requirement:
  46. #Shift+右键点击的前提条件
  47.   requirements:
  48.     条件1:
  49.       type: xxx
  50.     条件2:
  51.       type: xxx
  52.   deny_commands:
  53.   #如果无法全部达到,那么执行的操作
  54.     - "Action"
  55.     - "Action"
复制代码





12-1  配合Essentials(X)做个物品礼包菜单

在这里我想用Essential(X)自带的Firework(烟花)礼包 配合DeluxeMenus做一个礼包菜单 冷却时间是24小时

(plugins/Essentials/kits.yml)

  1.   firework:
  2.     delay: 86400
  3.     items:
  4.       - fireworkrocket 1 name:Angry_Creeper color:red fade:green type:creeper power:1
  5.       - fireworkrocket 1 name:Starry_Night color:yellow,orange fade:blue type:star effect:trail,twinkle power:1
  6.       - 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
这两个权限
  1. menu_title: '&fComplex Studio'
  2. open_command: libao
  3. update_interval: 5
  4. size: 9
  5. items:
  6.   firework-yes:
  7.     material: hdb-34571
  8.     slot: 0
  9.     display_name: '&a烟花礼包'
  10.     lore:
  11.     - '&f状态 &8| &a可用'
  12.     - ''
  13.     - '&e左键单击领取'
  14.     priority: 1
  15.     view_requirement:
  16.       requirements:
  17.         lengque:
  18.           type: string equals
  19.           input: "%essentials_kit_is_available_Firework%"
  20.           output: "yes"
  21.     left_click_commands:
  22.     - '[close]'
  23.     - '[player] kits Firework'
  24.     - '[message] 领取成功咯,过24小时后再来吧'
  25.   firework-no:
  26.     material: hdb-34571
  27.     slot: 0
  28.     update: true
  29.     display_name: '&a烟花礼包'
  30.     lore:
  31.     - '&f状态 &8| &a冷却中'
  32.     - '&f冷却 &8| &a%essentials_kit_time_until_available_Firework%'
  33.     - ''
  34.     - '&c暂不可用'
  35.     priority: 2
复制代码





12-2  配合CMI做个物品礼包菜单

当然仍然有一大部分服主在使用CMI作为基础插件
下面是一个CMI配合DM做一个物品礼包菜单的例子


思路是利用CMI自带的Advanced礼包(只有一个石头)
做一个1周领取一次的礼包菜单


(plugins/CMI/kits.yml)

  1. Advanced:
  2.   CommandName: Advanced
  3.   Enabled: true
  4.   DropOnGround: true
  5.   ShowDespiteWeight: false
  6.   Delay: 604800
  7.   MaxUsages: -1
  8.   Items:
  9.     '1':
  10.       type: STONE
复制代码

图片展示



菜单配置

请先给予玩家
cmi.kit.advanced
权限
  1. menu_title: '&fComplex Studio'
  2. open_command: libao
  3. update_interval: 5
  4. size: 9
  5. items:
  6.   firework-yes:
  7.     material: hdb-34571
  8.     slot: 0
  9.     display_name: '&a烟花礼包'
  10.     lore:
  11.     - '&f状态 &8| &a可用'
  12.     - ''
  13.     - '&e左键单击领取'
  14.     priority: 1
  15.     view_requirement:
  16.       requirements:
  17.         lengque:
  18.           type: string equals
  19.           input: "%cmi_user_kitcd_Advanced%"
  20.           output: "-"
  21.     left_click_commands:
  22.     - '[close]'
  23.     - '[player] cmi kit Advanced'
  24.     - '[message] 领取成功咯,过7天后再来吧'
  25.   firework-no:
  26.     material: hdb-34571
  27.     slot: 0
  28.     update: true
  29.     display_name: '&a烟花礼包'
  30.     lore:
  31.     - '&f状态 &8| &a冷却中'
  32.     - '&f冷却 &8| &a%cmi_user_kitcd_Advanced%'
  33.     - ''
  34.     - '&c暂不可用'
  35.     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拓展无需下载
  1. menu_title: '&fComplex Studio'
  2. open_command: libao
  3. update_interval: 1
  4. size: 9
  5. items:
  6.   cooldown-vip:
  7.     material: hdb-9166
  8.     slot: 0
  9.     update: true
  10.     display_name: '&a礼包'
  11.     lore:
  12.     - ''
  13.     - '&f内容 &8| &a1*钻石块,10*点券'
  14.     - '&f状态 &8| &a冷却中'
  15.     - '&f剩余 &8| %luckperms_expiry_time_test.cooldown%'
  16.     - ''
  17.     - '&e&oVIP加成'
  18.     - ''
  19.     - '&c冷却中'
  20.     priority: 1
  21.     view_requirement:
  22.       requirements:
  23.         vip:
  24.           type: has permission
  25.           permission: 'test.vip'
  26.         cooldown:
  27.           type: has permission
  28.           permission: 'test.cooldown'
  29.   cooldown:
  30.     material: hdb-9274
  31.     slot: 0
  32.     display_name: '&a礼包'
  33.     update: true
  34.     lore:
  35.     - ''
  36.     - '&f内容 &8| &a1*铁块'
  37.     - '&f状态 &8| &a冷却中'
  38.     - '&f剩余 &8| %luckperms_expiry_time_test.cooldown%'
  39.     - ''
  40.     - '&c冷却中'
  41.     priority: 2
  42.     view_requirement:
  43.       requirements:
  44.         cooldown:
  45.           type: has permission
  46.           permission: 'test.cooldown'
  47.   vip:
  48.     material: hdb-9132
  49.     slot: 0
  50.     display_name: '&a礼包'
  51.     lore:
  52.     - ''
  53.     - '&f内容 &8| &a1*钻石块,10*点券'
  54.     - '&f状态 &8| &a可领取'
  55.     - ''
  56.     - '&e&oVIP加成'
  57.     - ''
  58.     - '&b点击领取'
  59.     priority: 3
  60.     view_requirement:
  61.       requirements:
  62.         vip:
  63.           type: has permission
  64.           permission: 'test.vip'
  65.     left_click_commands:
  66.     - '[close]'
  67.     - '[message] 尊贵的VIP用户: 您已领取成功礼包,冷却3小时'
  68.     - '[console] points give %player_name% 10'
  69.     - '[console] give %player_name% DIAMOND_BLOCK 1'
  70.     - '[console] lp user %player_name% permission settemp test.cooldown true 3h'
  71.   player:
  72.     material: hdb-9240
  73.     slot: 0
  74.     display_name: '&a礼包'
  75.     lore:
  76.     - ''
  77.     - '&f内容 &8| &a1*铁块'
  78.     - '&f状态 &8| &a可领取'
  79.     - ''
  80.     - '&b点击领取'
  81.     priority: 4
  82.     left_click_commands:
  83.     - '[close]'
  84.     - '[message] 已领取成功礼包,冷却3小时'
  85.     - '[console] give %player_name% IRON_BLOCK 1'
  86.     - '[console] lp user %player_name% permission settemp test.cooldown true 3h'
复制代码





12-3-2  仅配合权限组插件(PEX)做个高级点的礼包菜单

! PEX不支持PAPI变量,因此无法查看剩余冷却时间

思路同上

菜单配置

请先下载Player拓展
/papi ecloud download Player
  1. menu_title: '&fComplex Studio'
  2. open_command: libao
  3. update_interval: 1
  4. size: 9
  5. items:
  6.   cooldown-vip:
  7.     material: hdb-9166
  8.     slot: 0
  9.     update: true
  10.     display_name: '&a礼包'
  11.     lore:
  12.     - ''
  13.     - '&f内容 &8| &a1*钻石块,10*点券'
  14.     - '&f状态 &8| &a冷却中'
  15.     - ''
  16.     - '&e&oVIP加成'
  17.     - ''
  18.     - '&c冷却中'
  19.     priority: 1
  20.     view_requirement:
  21.       requirements:
  22.         vip:
  23.           type: has permission
  24.           permission: 'test.vip'
  25.         cooldown:
  26.           type: has permission
  27.           permission: 'test.cooldown'
  28.   cooldown:
  29.     material: hdb-9274
  30.     slot: 0
  31.     display_name: '&a礼包'
  32.     update: true
  33.     lore:
  34.     - ''
  35.     - '&f内容 &8| &a1*铁块'
  36.     - '&f状态 &8| &a冷却中'
  37.     - ''
  38.     - '&c冷却中'
  39.     priority: 2
  40.     view_requirement:
  41.       requirements:
  42.         cooldown:
  43.           type: has permission
  44.           permission: 'test.cooldown'
  45.   vip:
  46.     material: hdb-9132
  47.     slot: 0
  48.     display_name: '&a礼包'
  49.     lore:
  50.     - ''
  51.     - '&f内容 &8| &a1*钻石块,10*点券'
  52.     - '&f状态 &8| &a可领取'
  53.     - ''
  54.     - '&e&oVIP加成'
  55.     - ''
  56.     - '&b点击领取'
  57.     priority: 3
  58.     view_requirement:
  59.       requirements:
  60.         vip:
  61.           type: has permission
  62.           permission: 'test.vip'
  63.     left_click_commands:
  64.     - '[close]'
  65.     - '[message] 尊贵的VIP用户: 您已领取成功礼包,冷却3小时'
  66.     - '[console] points give %player_name% 10'
  67.     - '[console] give %player_name% DIAMOND_BLOCK 1'
  68.     - '[console] pex user %player_name% timed add test.cooldown 10800'
  69.   player:
  70.     material: hdb-9240
  71.     slot: 0
  72.     display_name: '&a礼包'
  73.     lore:
  74.     - ''
  75.     - '&f内容 &8| &a1*铁块'
  76.     - '&f状态 &8| &a可领取'
  77.     - ''
  78.     - '&b点击领取'
  79.     priority: 4
  80.     left_click_commands:
  81.     - '[close]'
  82.     - '[message] 已领取成功礼包,冷却3小时'
  83.     - '[console] give %player_name% IRON_BLOCK 1'
  84.     - '[console] pex user %player_name% timed add test.cooldown 10800'
复制代码





13  做一个收购&出售商店菜单

思路是如果玩家左键点击这个物品
那么需要10点券,如果满足条件(<-)将给予1个钻石
如果玩家右键点击这个物品
那么需要1个钻石,如果满足条件(<-)将给予9点券  


图片展示



图片加载可能有些慢,谅解

菜单配置

/papi ecloud download Player
/papi ecloud download PlayerPoints
  1. menu_title: '&fComplex Studio'
  2. open_command: shop
  3. update_interval: 1
  4. size: 9
  5. items:
  6.   diamond:
  7.     material: hdb-106
  8.     slot: 0
  9.     display_name: '&b钻石'
  10.     lore:
  11.     - '&a左键 &8| &f花费10*点券,购买1*钻石'
  12.     - '&a右键 &8| &f出手1*钻石,获得10*点券'
  13.     left_click_commands:
  14.     - '[message] 成功购买钻石*1,共花费10*点券'
  15.     - '[console] points take %player_name% 10'
  16.     - '[console] give %player_name% DIAMOND 1'
  17.     left_click_requirement:
  18.       requirements:
  19.         points:
  20.           type: '>='
  21.           input: '%playerpoints_points%'
  22.           output: '10'
  23.       deny_commands:
  24.       - '[close]'
  25.       - '[message] 抱歉,您没有足够多的点券'
  26.     right_click_commands:
  27.     - '[message] 成功出手钻石*1,共获得9*点券'
  28.     - '[console] points give %player_name% 9'
  29.     - '[console] clear %player_name% DIAMOND 0 1'
  30.     right_click_requirement:
  31.       requirements:
  32.         points:
  33.           type: has item
  34.           material: DIAMOND
  35.           amount: 1
  36.       deny_commands:
  37.       - '[close]'
  38.       - '[message] 抱歉,您没有足够多的钻石'
复制代码





14  利用传入参数做一个简单的菜单

思路:
输入/player <玩家ID>后会打开一个菜单
可以在这个菜单里自由选择如何惩罚或者奖励这位玩家  


图片展示



菜单配置

  1. menu_title: '&f撒币菜单: {player}'
  2. open_command: player
  3. update_interval: 1
  4. size: 27
  5. args:
  6.   player: -1
  7. args_usage_message: "使用方式不对,/player <玩家ID>"
  8. items:
  9.   zhuangshi:
  10.     material: STAINED_GLASS_PANE
  11.     slots:
  12.     - 0
  13.     - 1
  14.     - 2
  15.     - 3
  16.     - 4
  17.     - 5
  18.     - 6
  19.     - 7
  20.     - 8
  21.     - 18
  22.     - 19
  23.     - 20
  24.     - 21
  25.     - 22
  26.     - 23
  27.     - 24
  28.     - 25
  29.     - 26
  30.     display_name: '&e我只是个装饰物'
  31.   1pointsplus:
  32.     material: hdb-106
  33.     slot: 9
  34.     display_name: '&e给他1点券'
  35.     left_click_commands:
  36.     - '[message] 你给予了{player} 1点券'
  37.     - '[console] points give {player} 1'
  38.   10points:
  39.     material: hdb-106
  40.     slot: 10
  41.     display_name: '&e给他10点券'
  42.     left_click_commands:
  43.     - '[message] 你给予了 {player} 10点券'
  44.     - '[console] points give {player} 10'
  45.   100points:
  46.     material: hdb-106
  47.     slot: 11
  48.     display_name: '&e给他100点券'
  49.     left_click_commands:
  50.     - '[message] 你给予了 {player} 100点券'
  51.     - '[console] points give {player} 100'
  52.   1000points:
  53.     material: hdb-106
  54.     slot: 12
  55.     display_name: '&e给他1000点券'
  56.     left_click_commands:
  57.     - '[message] 你给予了 {player} 1000点券'
  58.     - '[console] points give {player} 1000'
  59.   kou1points:
  60.     material: hdb-25850
  61.     slot: 13
  62.     display_name: '&e扣除他1点券'
  63.     left_click_commands:
  64.     - '[message] 你扣除了 {player} 1点券'
  65.     - '[console] points take {player} 1'
  66.   kou10points:
  67.     material: hdb-25850
  68.     slot: 14
  69.     display_name: '&e扣除他10点券'
  70.     left_click_commands:
  71.     - '[message] 你扣除了 {player} 10点券'
  72.     - '[console] points take {player} 10'
  73.   kou100points:
  74.     material: hdb-25850
  75.     slot: 15
  76.     display_name: '&e扣除他100点券'
  77.     left_click_commands:
  78.     - '[message] 你扣除了 {player} 100点券'
  79.     - '[console] points take {player} 100'
  80.   kou1000points:
  81.     material: hdb-25850
  82.     slot: 16
  83.     display_name: '&e扣除他1000点券'
  84.     left_click_commands:
  85.     - '[message] 你扣除了 {player} 1000点券'
  86.     - '[console] points take {player} 1000'
  87.   close:
  88.     material: hdb-187
  89.     slot: 17
  90.     display_name: '&c关闭'
  91.     left_click_commands:
  92.     - '[close]'
复制代码





15  听说你想加点声音?

哪个男孩不想给自己的菜单加点声音呢?
首先得找到一段声音


在原版MC中,你可以使用"/playsound"
来寻找一段符合菜单/物品设定的声音


比如我想在礼包冷却时给玩家放一段末影人传送的声音
先分析一下
末影人属于生物 entity
而末影人则是 endermen
传送则是 teleport  


  1. /playsound minecraft:entity.endermen.teleport ambient @a
复制代码

但是在菜单中可不能直接这样写
要全大写并且将.改为_   也就是
ENTITY_ENDERMEN_MEN


  1. - '[sound] ENTITY_ENDERMEN_MEN'
复制代码





16  总结

本教程到这里就告一段落了
字数统计


5368个汉字 18350个字母

[groupid=1701]Complex Studio[/groupid]