基于 Bukkit 自定义 Gui 槽位写法

为什么要自定义?

因为有的时候我们界面写死的话,对于一些喜欢自行排版的使用者来说,是很不友好的,所以本章讲的是一个我自己用的“自定义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 及 槽位物品 设定。

// 创建 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 界面了。

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇