AzureHanChen
本帖最后由 AzureHanChen 于 2021-7-28 00:48 编辑



手把手教你写一个完美的DeluxeMenus菜单(请点击上方目录开始↑)




2021.12 数据,可能有更多内容


手把手教你写一个完美的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大全








4DM插件的命令与权限


*本来以为命令和权限只有原搬运贴中的那一点,结果打开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下载&amp;安装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)做个高级点的礼包菜单


注意,下文所述的&quot;权限组插件&quot;均是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做一个收购&amp;出售商店菜单


思路是如果玩家左键点击这个物品
那么需要10点券,如果满足条件(&lt;-)将给予1个钻石
如果玩家右键点击这个物品
那么需要1个钻石,如果满足条件(&lt;-)将给予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 &lt;玩家ID&gt;后会打开一个菜单
可以在这个菜单里自由选择如何惩罚或者奖励这位玩家


图片展示





菜单配置


代码:

  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中,你可以使用&quot;/playsound&quot;
来寻找一段符合菜单/物品设定的声音


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


代码:

  1. /playsound minecraft:entity.endermen.teleport ambient @a

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


代码:

  1. - '[sound] ENTITY_ENDERMEN_MEN'






16总结


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


5368个汉字 18350个字母



晓夜Port
建议只推荐 VSCode

Notepad++ 作者是台 毒

AzureHanChen
晓夜Port 发表于 2020-2-12 12:56
建议只推荐 VSCode

Notepad++ 作者是台 毒

这事我也知晓
不过联机教程版编辑还需要审核
我打算等全部写完之后一起改掉,然后更新到这个帖子里

ksqeib445
不觉得看这么长的教程帖子比研究vv或者trmenu值得多少

Lidocaine
蛮厉害的 带我学成归来也是一条好汉
感谢lz分享

bilibiliGAOSM
晓夜Port 发表于 2020-2-12 12:56
建议只推荐 VSCode

Notepad++ 作者是台 毒

一个好的工具不能根据作者就去定位吧?至少安装的时候有简体中文不是?

晓夜Port
bilibiliGAOSM 发表于 2020-5-7 22:36
一个好的工具不能根据作者就去定位吧?至少安装的时候有简体中文不是? ...

现在的国人都这样吗 (笑)

bilibiliGAOSM
晓夜Port 发表于 2020-5-8 18:38
现在的国人都这样吗 (笑)

随你怎么想

用户2588899
1.10.5好像声音没用

1794853466
舒舒服服舒服舒服


用户2588899
晓夜Port 发表于 2020-2-12 12:56
建议只推荐 VSCode

Notepad++ 作者是台 毒

谢谢,已卸载

酒笙清栀.
完成任务hjdhsaj

a320778963
[DeluxeMenus] Plugin DeluxeMenus v1.12.0 generated an exception while executing task 10521 java.lang.NullPointerException: null

Coldlime
找了好久也没找到教程
谢谢大佬分享

猫尾233
请问大佬,dm条件能否实现判断字符不是某个字符呢?比如%player_name%不等于abc才可以使用

AzureHanChen
Dfmaster 发表于 2021-2-12 15:46
请问大佬,dm条件能否实现判断字符不是某个字符呢?比如%player_name%不等于abc才可以使用 ...

我记得文中有提到,不过可能是我写的太啰嗦了没看出来233

  1. #我这里以左键点击条件为例子了,请务必根据实际情况更改
  2. #空格,缩进等请根据实际情况调整
  3. left_click_requirement:
  4.   requirements:
  5.     example:
  6.       type: string equals
  7.       input: '%player_name%'
  8.       output: '你想让他等于啥'
复制代码

猫尾233
AzureHanChen 发表于 2021-2-12 16:32
我记得文中有提到,不过可能是我写的太啰嗦了没看出来233

看到了,这个是需要等于某字符,我想要的是不能等于某字符....
不过我先已经解决了,弄个优先级大的把按钮堵住...用的就是这个type

caochao233
为什么dm不支持forge端?指的是不支持添加mod里的物品作为菜单item吗?

山洪jkl
感谢Azure大大

RONGYAO749
楼主对于头颅这一方面貌似有些过时
现在官方wiki上与译本有些出入
Supported material values:
Material name (STONE).
Player head (head-extended_clip).
Placeholder head (head-%player_name%).
Argument placeholder head (head-{target}).
BaseHead (basehead-<base64 (Value field in the head's give command)>).
EpicHeads (heads-<ID>).
HeadDatabase (hdb-<ID>).
Placeholder material (placeholder-%player_item_in_hand%).
Item in main hand (main_hand).
Item in off hand (off-hand).

AzureHanChen
RONGYAO749 发表于 2021-4-17 16:50
楼主对于头颅这一方面貌似有些过时
现在官方wiki上与译本有些出入

很感谢您的建议,此教程贴有一段时间没有更新了,
主要由于近期因为学业问题实在无法将更多精力放在作品上,
因此造成的问题可能还需要等到7月前后修复,
在此期间我会努力的将一些刚需内容更新至与插件同步,
向您表示诚挚的抱歉。>_>

山洪jkl
好用,虽然长,但是实用

山洪jkl
Dfmaster 发表于 2021-2-12 15:46
请问大佬,dm条件能否实现判断字符不是某个字符呢?比如%player_name%不等于abc才可以使用 ...

可以用权限插件给特定名称的玩家设置权限就能实现

传说0.2
谢谢分享!~~~

52608634
问一下,有没有铁砧的模板。

wangpeitong
喜欢喜欢 顶

冬天冬天W
挺好的一个教程!支持一下!

烤鸡肉
感谢大佬的分享呀,受益匪浅

我是莫言呀
感谢教程,学会了

ansixue
MCBBS有你更精彩~

lddan
写的挺好就是完全看不懂

AroCloud
感谢感谢正好需要

AroCloud
感觉还是有点懵..

1845807037
猫尾233 发表于 2021-2-12 15:46
请问大佬,dm条件能否实现判断字符不是某个字符呢?比如%player_name%不等于abc才可以使用 ...

在条件前面加上!即可,!可以把条件的返回值取反

励志长久开服
AzureHanChen 发表于 2020-2-12 13:00
这事我也知晓
不过联机教程版编辑还需要审核
我打算等全部写完之后一起改掉,然后更新到这个帖子里 ...

大佬请教一下


'Shop22':
    material: 349
    data: 0
    slot: 10
    amount: 16
    display_name: '&4&l出售'
    lore:
    - '&8生鱼×16'
    - '&8售价:40'
    left_click_commands:
    - '[console] eco give %player_name% 40'
    - '[console] clear %player_name% fish 16'
    left_click_requirement:
      requirements:
        anything_here1:
          type: string equals
          input: '%checkitem_mat:FISH,data:0%'
          output: 'yes'
        anything_here:
          type: has item
          material: FISH
          amount: 16


生鱼的data是0
可是这样做他不判断,该怎么做

cckt
点券购买怎么写?

DAN玖
很有帮助

好大一只艾姆硕
        神乎其技!6的飞起!

pythonQWQ
66666666666666666666666666

pythonQWQ
6666666666666666666

pythonQWQ
虽然看不懂,但是我大受震撼

pythonQWQ
我觉得cc要简单点

Zombie_23333
新手腐竹前来学习

ShellNB666
66666666666666666666666666666666666666666666

1807273747
玩家头颅调不出来,按教程写上去菜单里那个位置就变成空位了

温泽
6666666666666666

LateAutumn_Lei
slots根本没用!

BlMay
刚使用这个菜单,学习一下

voyagerlzx
完力被锁帖了