• 游客, 欢迎您来到九域资源社区,如果您是新人,请前往 论坛公告 板块查看新人引导教程 或者 点我打开
    如果您发现没有下载许可, 请先验证邮箱再进行下载;金锭可通过每日登陆或资源出售获取,目前没有其他渠道可获取。

自用 Bukkit 自定义 Gui 槽位写法

张杰宁

Lv.1 泥土
高级创作者
2019-01-08
118
563
0
一、为什么要自定义?
一般情况下,我们界面写死的话,对于一些喜欢自行排版的使用者来说,是很不友好的,所以,本章讲的是一个我自己用的“自定义Inventory槽位写法”

二、代码实例
我写自定义 Inventory 物品槽位的时候,我都会创建一个文件 gui.yml 用来读取要设定的槽位内容。
下面是一个文件例子
代码:
# 界面标题
title: "&8通行证奖励"
# 界面大小
size: 54
# 界面物品设定
items:
  fg:
    type: STAINED_GLASS_PANE
    name: "&f"
    data: 15
    lore: []
    slots:
      - 0
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 36
      - 37
      - 38
      - 39
      - 40
      - 41
      - 42
      - 43
      - 44
  fg1:
    type: STAINED_GLASS_PANE
    name: "&f"
    data: 0
    lore: []
    slots:
      - "9"
      - "17"
      - "27"
      - "35"
  fg2:
    type: END_CRYSTAL
    name: "&b† &a下方为通行证会员栏 &b†"
    data: 0
    lore: []
    slots:
      - "18"
      - "19"
      - "20"
      - "21"
      - "22"
      - "23"
      - "24"
      - "25"
      - "26"
  up:
    type: PAPER
    data: 0
    name: "&f上一页"
    lore: []
    slot: 45
    action: up
  info:
    type: SKULL_ITEM
    data: 3
    name: "&b我的通行证信息"
    lore:
      - " "
      - " &d⊱ &a个人信息: "
      - " &f ▣ &e通行证等级: &f%level% "
      - " &f ▣ &e升级所需: &f%exp% "
      - " &f ▣ &e通行证会员: &f%vip% "
      - "  "
    slot: 49
    action: info
  down:
    type: PAPER
    data: 0
    name: "&f下一页"
    slot: 53
    action: down
我一般写自定义 Inventory 槽位都是这样子的格式,方便遍历设定。
首先,我们将 gui.yml 放置于资源目录中,我们通过 JavaPlugin 中的 saveResource 方法将其生成于插件目录下。
接下来我们在代码中读取 gui.yml,下面插件主类对象我们就叫 main

File file = new File(main.getDataFolder(), "gui.yml");
FileConfiguration data = YamlConfiguration.loadConfiguration(file);
这样子我们就读取了 gui.yml 文件了,接下来是创建 Inventory 及 槽位物品 设定。
Java:
// 创建 Inventory 对象
Inventory inv = Bukkit.createInventory(null, data.getInt("size"), data.getString("title").replace("&", "§"));
// 设置 Inventory 内的槽位物品,我们需要通过 foreach 来遍历设定
for (String key : data.getConfigurationSection("items").getKeys(false)) {
    String newKey = "items." + key + ".";
    // 创建物品
    ItemStack itemStack = new ItemStack(Material.valueOf(data.getString(newKey + "type")), 1, (short) data.getInt(newKey + "data"));
    // 获取 itemStack 的 ItemMeta
    ItemMeta itemMeta = itemStack.getItemMeta();
    // 设置物品名
    itemMeta.setDisplayName(data.getString(newKey + "name").replace("&", "§"));
    // 创建一个集合来存储 itemMeta 的 Display.Lore
    List<String> lore = new ArrayList<>();
    // 获取对应的 Display.Lore 集合, 通过 Lambda 遍历将处理后的内容加入 lore 集合内
    data.getStringList(newKey + "lore").forEach((l) -> lore.add(l.replace("&", "§")));
    // 设置 ItemMeta 的 Display.Lore
    itemMeta.setLore(lore);
    // 设置 ItemStack 的 ItemMeta
    itemStack.setItemMeta(itemMeta);
    // 判断 slots 集合是否为空 (不存在也为空)
    if (data.getStringList(newKey + "slots").isEmpty()) {
        // 如果不存在, 则设置单槽位物品
        inv.setItem(data.getInt(newKey + "slot"), itemStack);
    } else {
        // 如果存在, 则通过 Lambda 遍历 slots 集合, 设置槽位物品
        data.getIntegerList(newKey + "slots").forEach((slot) -> inv.setItem(slot, itemStack));
    }
}

三、结尾
唔,代码都在上面了,该注释的我也都加注释了,可以看看。
教程至此也结束了,你需要操作的就是让玩家打开 Inventory 界面了。
 
最后编辑: