一、为什么要自定义?
一般情况下,我们界面写死的话,对于一些喜欢自行排版的使用者来说,是很不友好的,所以,本章讲的是一个我自己用的“自定义Inventory槽位写法”
二、代码实例
我写自定义 Inventory 物品槽位的时候,我都会创建一个文件 gui.yml 用来读取要设定的槽位内容。
下面是一个文件例子
我一般写自定义 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槽位写法”
二、代码实例
我写自定义 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
首先,我们将 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 界面了。
最后编辑: