本帖最后由 秋风残叶 于 2017-9-1 22:19 编辑




DeluxeMenus是一种多合一的GUI菜单,你可以创建可以用特定指令打开的GUI菜单,玩家打开后可以看到一系列可设置的属性
玩家的菜单是完全可编辑的,你可以设置让不同的玩家看到特定的物品,或者在菜单里执行已经设置好脚本的特定的指令,所有的这些都是可设置的,你可以按照你想要的把这些功能设置的相对复杂,或者相对简单
作者很活跃,正努力给插件添加更多特性来让其变得更高效易用,本Wiki包含了本插件的介绍,以及菜单及各物品属性的介绍,同样也包含了几个菜单的例子

创建更多yml菜单 [查看Wiki原文]

第一次加载插件,会自动生成一个DeluxeMenus文件夹,在这个文件夹里你可以找到一个文件 config.yml,你可以把所有菜单都放进这个文件,或者你可以新建一个文件来创建新的菜单(在另一个文件夹里)

如果你想这么做的话,请在config.yml的“gui_menus:”下面添加
  1. main:
  2.     file: main.yml
复制代码
在文件名后面添加.yml是必不可少的

你可以添加很多菜单,当你完成以后请务必重载插件,然后请查看DeluxeMenus文件夹,你会发现里面新生成了一个名叫“gui_menus”的文件夹,该文件夹内包含了所有新建的GUI菜单,你可以直接打开并编辑它们

编辑这些菜单文件和编辑主文件config格式相同,只是配置开头不是“gui_menus:”而是“menu_title:”,新建的文件包含了几行可用物品属性的介绍,同时也有菜单属性的介绍,不妨查看下面的Wiki来获得更多帮助

DeluxeMenus示例 - 菜单商店 [查看Wiki原文]

DeluxeMenus可以让你创建一个多功能的GUI菜单,你可以用这个菜单做一个子服/世界选择传送,或者做一个商店(就像下面我要展示给你看的一样),你可能需要一些别的插件,除了DeluxeMenus以外,你还需要安装PlaceholderAPI,当你安装好这两个插件之后,重启服务器以确保他们工作正常,当一切都完成后,请在游戏内输入
  1. /papi ecloud download Player
  2. /papi ecloud download Vault
复制代码
然后请稍等一会,然后重载插件
  1. /papi reload
复制代码
这样就下载好了Player玩家信息和Vault经济两个papi拓展包,做好这一切以后就可以开始制作商店了,我会给你展示一个例子,然后解释每部分的功能
  1. menu_title: '&6商店'
  2. open_command: shop
  3. open_requirement:
  4.   expression: 'BukkitPlayer.hasPermission("inventory.shop");'
  5.   deny_commands:
  6.   - '&f未知指令. 请使用 "/help" 获得帮助'
  7. size: 54
  8. items:
  9.   '1':
  10.     material: STONE
  11.     data: 1
  12.     slot: 0
  13.     display_name: '&7花岗岩'
  14.     lore:
  15.     - '&7购买价格: &a$80'
  16.     - '&7出售价格: &c$40'
  17.     left_click_commands:
  18.     - '[console] eco take %player_name% 80'
  19.     - '[console] give %player_name% stone:1 64'
  20.     - '[message] &3菜单系统 &a?&7 你成功购买了64个花岗岩.'
  21.     left_click_requirement:
  22.       expression: '%vault_eco_balance% >= 80'
  23.       deny_commands:
  24.       - '[close]'
  25.       - '[message] &3菜单系统 &a?&7 你的钱不够哦.'
  26.     right_click_commands:
  27.     - '[console] eco give %player_name% 40'
  28.     - '[console] clear %player_name% stone:1 64'
  29.     - '[message] &3菜单系统 &a?&7 你成功出售了64个花岗岩'
  30.     right_click_requirement:
  31.       expression: '"%player_hasitem-mat:STONE-amt:64-data:1%".equals("yes");'
  32.       deny_commands:
  33.       - '[close]'
  34.       - '[message] &3菜单系统 &a?&7 你的花岗岩数量不够'
复制代码
menu_title 箱子GUI界面的标题
open_command 玩家可以使用这个指令打开菜单
open_requirement 玩家打开这个菜单需要满足的条件,在此设置下:
deny_commands 当玩家不满足条件时显示的内容,在范例中我把条件设置为了权限,你可以将其设置为任何东西
size 菜单的大小,最大是 54.
items 菜单内物品的各种属性,在此标题下你还需要设置物品的名称,种类等等
'1' 这个数字代表加载菜单时第一个被加载的物品
material 物品的种类,你可以使用物品的ID或者 物品的英文名
data i物品的子ID,需要注意的是你不能把物品的种类设置成例如“1:1”之类的,你必须设置为种类1+子ID1
slot 物品在菜单的哪个格子,第一格请输入0,第二格请输入1,以此类推
display_name 物品的名称,你可以使用彩色代码
lore 物品的lore,你可以创建多行
left_click_commands 设置左键点击物品触发的指令 在范例中,我们扣除了点击者80金钱, 这个地方就是placeholderapi发挥作用的地方. %player_name% 变量代表点击者的名字. 点击者被扣除80金钱,然后获得64个花岗岩. 然后看到一条消息提示购买成功
left_click_requirement 玩家左键点击物品需要的前提 首先设置一个 expression. 它使用的是 javascript 脚本. 我们用Vault的papi变量来检查点击者的金钱是否大于或等于80 ,如果不满足条件,我们将关闭GUI并提示玩家金钱不够
right_click_commands 设置右键点击物品触发的指令 与之前扣除80金钱不同的是, 我们支付给点击者40金钱并从他的背包里扣除64个花岗岩,并使用消息提示他
right_click_requirement 与左键点击前提稍有不同. 并不是检查他们有没有40金钱, 而是检测他们有没有足够的物品来出售. 我们用另一个papi变量, %player_hasitem-mat:MATERIALNAME-amt:AMOUNT-dataATA%. 如果满足这个条件 "yes" 则成功交易反之则关闭菜单并提示背包内的花岗岩不够

建议:我建议你在重载插件之前先把编辑好的菜单保存,因为如果你编辑出了偏差,你的文件可能会被重置,当编辑出现偏差的时候,物品序号便派上用场,控制台上会显示是哪个序号的物品出现问题,来提示你修复

希望这个例子对您有帮助

DeluxeMenus示例 - 礼包菜单 [查看Wiki原文]

今天来教大家做一个礼包菜单,可以让玩家看到礼包冷却时间(使用Essentials作为前置)

在开始之前,请务必注意placeholderapi默认使用“yes/no”来做逻辑判断(而不是“true/false”,除非你自己做了更改),如果你不知道我在说什么,你就不用担心这些

我只会用一个物品做范例,ess的礼包名字为starter并且有24小时的冷却时间,让我们先从菜单名和开启指令开始
  1. menu_title: '&c&l礼包 &7[&8点击选择&7]'
  2. open_command: kits
  3. size: 9
  4. update_interval: 1
复制代码
让我们继续编辑菜单内物品,大家可以看到菜单内已经设置了两个物品
  1. menu_title: '&c&l礼包 &7[&8点击选择&7]'
  2. open_command: kits
  3. size: 9
  4. update_interval: 1
  5. items:
  6.   'starteron':
  7.     material: iron_sword
  8.     slot: 0
  9.     priority: 1
  10.     update: true
  11.     hide_attributes: true
  12.     view_requirement: '"%essentials_kit_is_available_starter%".equalsIgnoreCase("yes")'
  13.     display_name: '&c&lStarter礼包'
  14.     lore:
  15.     - '&8+---------------------+'
  16.     - '&7这是一个礼包.'
  17.     left_click_commands:
  18.     - '[player] kit starter'
  19.     - '[console] playsound mob.horse.armor %player_name% ~ ~ ~ 1 1.2 1'
  20.     - '[close]'
  21.     right_click_commands:
  22.     - '[player] kit starter'
  23.     - '[console] playsound mob.horse.armor %player_name% ~ ~ ~ 1 1.2 1'
  24.     - '[close]'
  25.   'starteroff':
  26.     material: barrier
  27.     slot: 0
  28.     priority: 2
  29.     update: true
  30.     hide_enchantments: true
  31.     enchantments:
  32.     - 'DURABILITY;1'
  33.     display_name: '&8[&7当前不可用&8] &c&lStarter礼包'
  34.     lore:
  35.     - '&8+---------------------+'
  36.     - '&7尚未过冷却时间!'
  37.     - '&7请再等待 &c%essentials_kit_time_until_available_starter%'
  38.     left_click_commands:
  39.     - '[console] playsound mob.bat.takeoff %player_name% ~ ~ ~ 1 1.5 1'
  40.     - '[console] playsound mob.horse.armor %player_name% ~ ~ ~ 1 1.5 1'
  41.     right_click_commands:
  42.     - '[console] playsound mob.bat.takeoff %player_name% ~ ~ ~ 1 1.5 1'
  43.     - '[console] playsound mob.horse.armor %player_name% ~ ~ ~ 1 1.5 1'
复制代码
我们已经设置好了两个物品,starton和startoff,我绝不会用简单的更换物品种类或者附魔来达到效果,请注意这两个变量优先级priority和浏览前提view_requirement, Startoff这个物品代表礼包正在冷却中,它的优先级priority是2而且它和另一个物品在同一个格子
Starton这个物品的优先级priority是1,所以他会“覆盖”startoff这个物品,这个物品有一个浏览前提,如果不满足这个前提的话,这个物品starton就会被隐藏,同时显示下面的startoff,startoff这个物品有一个placeholderapi变量%essentials_kit_time_until_available_starter%,会显示这个ess礼包剩下的冷却时间

让我们看一下starton的浏览前提view_requirement
  1. view_requirement: '"%essentials_kit_is_available_starter%".equalsIgnoreCase("yes")'
复制代码
这个前提以及变量会检测这个礼包当前是否是可领取状态,如果可以领取,会返回结果“yes”...所以前提就是检测这个变量是否返回“yes”,如果是,starton这个物品就会显示给打开菜单的玩家

至此我们就做好了一个礼包菜单,礼包可领取时可以点击,礼包正在冷却时会显示一个屏障,方便地告诉玩家什么时候可以领取礼包

GUI/物品属性&配置 [查看Wiki原文]

本部分包含了有关GUI菜单及物品的各项属性,每项都提供有正确的格式,并有关于它的用途进行的描述
本部分由两部分组成,GUI的相关属性和物品相关属性,GUI的相关属性排在config前面,物品相关属性是每个“items:”下面的各项设置

相关链接
需要注意的是,某些附魔不能被加到不适合该附魔的物品上

注意事项
  • TEXT = 使用任意文字,你可以使用彩色代码
  • BOOLEAN = 逻辑值,使用true/false(如果你使用的是PlaceholderAPI变量,则应该用默认yes/no来替换true/false,这是papi的默认设置)
  • EXPRESSION = Java/papi变量名称 请参考这里获得帮助
  • # = 使用任意数字



GUI菜单配置


GUI物品配置


使用/浏览前提限制 [查看Wiki原文]

DeluxeMenus可以提供检查该按钮对特定玩家是否可以使用的限制功能,我们可以给按钮添加无数种类的限制,本功能可以用于view_requirement浏览限制和click_requirement点击限制

点击限制按照字面意思很好理解,我们不会去过多叙述它,本部分我们着重介绍浏览限制view_requirement,所有浏览限制的内容同样可用于点击限制

限制的种类有两种,变量限制(使用PlaceholderAPI变量)和Java限制(也可以使用PlaceholderAPI变量,但不是必要的)以下是一个例子
  1. view_requirement: '%vaulteco_balance% > 100'
复制代码
这个限制检测的是玩家的金钱是否大于100,如果大于100,玩家就可以看到这个物品,反之,这个物品将会被隐藏,你可以在这个格子里显示其它物品(首先需要把两个物品放在同一格子中,然后给有浏览限制view_requirement的物品更高的优先级,请参考“GUI物品配置”Wiki部分)或者直接让这个格子留空

这种限制可以用于显示数字的papi变量,我们不止可以设置这种简单的限制,下面这个是检测玩家有无权限的Java限制
  1. view_requirement: 'BukkitPlayer.hasPermission("some.permission");'
复制代码
这种限制可以让VIP玩家在菜单里看到不同于普通玩家的物品,比如VIP每日礼包或者VIP奖励,你还可以制作更多,同样,你还可以把papi变量放入Java限制中来看它返回什么结果,例如:
  1. view_requirement: '"%player_world%".equalsIgnoreCase("world_nether");'
复制代码
请注意一下括在papi变量周围的引号,这比较特殊,这个限制会检测玩家的所在世界 %player_world% 是什么. 如果检测到不是 "world_nether" 的值,该物品将不会显示 你可以通过启用"chat"附属来检测一个papi变量的值 在聊天栏里输入带大括号的papi变量 (例如: {player_world}). 会显示这个变量的值

那么,上面那个例子中,该怎么设置才能让玩家只有不在world_nether世界才能看到物品呢(也就是正好反过来)请看这个例子:
  1. view_requirement: '!"%player_world%".equalsIgnoreCase("world_nether");'
复制代码
看起来很复杂吧?让我来解释一下这个限制是如何发挥作用的,要知道,浏览限制view_requirement只接受true和false两种返回结果,也就是说,浏览限制只会检测事件的返回结果是true还是false,在这个前提下,如果一个位于世界“world”的玩家打开了菜单,本限制会检测玩家所在世界,当检测到玩家所处世界是“world_nether”以外的世界时会返回结果true,这就是为什么要在前面加一个英文感叹号,如果你移除了那个感叹号,只有玩家处于世界“world_nether”的时候才会返回结果true

如果你了解了这些,你就应该知道了,当浏览限制返回结果true时会显示物品,反之,返回结果false时会隐藏物品

现在,让我们谈谈papi变量返回值是true/false的限制,例如礼包是否可用变量%essentials_kit_is_available_<礼包名>%
  1. view_requirement: '"%essentials_kit_is_available_<kitname>%".equalsIgnoreCase("yes")'
复制代码
这个限制会检测ess礼包是否可用,如果可用,这个物品就会在菜单里显示,你应该注意到了,我在指令中使用的是“yes”而不是“true”,这是因为检测是通过PlaceholderAPI进行的,在默认的papi配置中,逻辑值结果返回的是yes/no而不是true/false(如果你在papi配置里修改了这个,那么同样在这里的指令里也要修改)

再说一遍,如果你发现papi限制用不了,请在聊天里检测一下相应变量的返回值是什么

注意:指令里使用的 ".equalsIgnoreCase", 你可以将其替换为 ".equals" 本替换将会严格区分大小写. 比如说你有一个世界名叫 "WoRLd_TeSt" 你需要使用 ".equals" 严格大小写来保证返回值正确


[groupid=1330]PluginsCDTribe[/groupid]