为 bukkit 中的 ItemStack 获取 "Custom id"
Get "Custom id" for ItemStack in bukkit
首先我要为我的英语很糟糕xD道歉。所以,我正在开发一个经济插件来学习,在这个插件中,我正在创建一个标牌店。一切都很顺利,但是当我尝试我的商店时,我被附魔物品卡住了,例如,因为我无法通过以下方式获得 ID:
ItemStack item = player.getItemInHand();
item.getTypeId();
这只是returns我真实物品的id,没有附魔。
有人可以告诉我是否有一种方法可以设置一些 自定义 id,例如,在物品的传说中,我以后可以用它来制作招牌店?
编辑:
现在可以很好地保存项目数据,但仍然报错。
我现在使用的是:
public static void saveItem(Player player){
ItemStack item = player.getItemInHand();
//config.createSection("eco.sell.aFirstItem");
ConfigurationSection configToEdit = config.createSection("eco.sell.aFirstItem");
configToEdit.set("type", item.getType().name());
configToEdit.set("amount", item.getAmount());
if(item.hasItemMeta()){
ItemMeta meta = item.getItemMeta();
configToEdit.set("meta.name", meta.getDisplayName());
List<String> enchants = new ArrayList<>();
meta.getEnchants().forEach((en, lvl) -> enchants.add(en.getName() + ":" + lvl));
configToEdit.set("meta.enchant", enchants);
save();
}
}
所以,要恢复我正在使用的数据:
public static void restoreData(Player player){
//config.getConfigurationSection("eco.sell.aFirstItem");
ConfigurationSection configToEdit = config.createSection("eco.sell.aFirstItem");
ItemStack item = new ItemStack(Material.valueOf(configToEdit.getString("type")), configToEdit.getInt("amount"));
if(configToEdit.contains("meta")) {
player.sendMessage("Contains( Meta )");
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(configToEdit.getString("meta.name"));
List<String> enchants = configToEdit.getStringList("meta.enchants");
enchants.forEach(line -> {
String[] split = line.split(":");
item.addEnchantment(Enchantment.getByName(split[0]), Integer.parseInt(split[1]));
});
}
player.getInventory().addItem(item);
player.updateInventory();
}
你不能有那样的唯一 ID。
但是,有两种方法:
- 存储完整对象。例如,创建一个包含物品 ID、物品名称、附魔...的 json,然后将其存储为您想要保存的 ID。
例如,我们将保存一个项目并将其恢复。我们将使用 spigot 的默认配置。
保存项目
Configuration objConfig = plugin.getConfig().createSection("eco.sell.aFirstItem"); // create new section in plugin config
// now we will add all content from item to config
objConfig.set("type", item.getType().name()); // item type
objConfig.set("amount", item.getAmount()); // amount of item
if(item.hasMetadata()) {
ItemMeta meta = item.getItemMeta();
objConfig.set("meta.name", meta.getDisplayName()); // item name
List<String> enchants = new ArrayList<>(); // create hashmap that will be saved
meta.getEnchants().forEach((en, lvl) -> enchants.add(en.name() + ":" + lvl));
objConfig.set("meta.enchants", enchants); // all items enchants
}
plugin.saveConfig();
现在,我们将从配置恢复数据:
Configuration objConfig = plugin.getConfig().getConfigurationSection("eco.sell.aFirstItem"); // retrieve section
ItemStack item = new ItemStack(Material.valueOf(objConfig.getString("type")), objConfig.getInt("amount")); // here we have an item that we can edit
if(objConfig.contains("meta")) {
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(objConfig.getString("meta.name"));
List<String> enchants = objConfig.getStringList("meta.enchants"); // get all enchants
enchants.forEach(line -> {
String[] split = line.split(":"); // split enchantName:enchantLevel
item.addEnchant(Enchantement.valueOf(split[0]), Integer.parse(split[1])); // get spigot objects
});
}
警告:有几行不能工作,因为我没有测试这个确切的代码,但这就是它应该工作的方式。
- 创建一个具有 ID 的项目列表,然后在需要的地方引用此 ID。你只需要在两者之间设置 link(例如 SQL 数据库)。
如果您总是销售相同的商品,第二个可能会有用。我认为在你的情况下第一个解决方案会更好。
首先我要为我的英语很糟糕xD道歉。所以,我正在开发一个经济插件来学习,在这个插件中,我正在创建一个标牌店。一切都很顺利,但是当我尝试我的商店时,我被附魔物品卡住了,例如,因为我无法通过以下方式获得 ID:
ItemStack item = player.getItemInHand();
item.getTypeId();
这只是returns我真实物品的id,没有附魔。 有人可以告诉我是否有一种方法可以设置一些 自定义 id,例如,在物品的传说中,我以后可以用它来制作招牌店?
编辑:
现在可以很好地保存项目数据,但仍然报错。 我现在使用的是:
public static void saveItem(Player player){
ItemStack item = player.getItemInHand();
//config.createSection("eco.sell.aFirstItem");
ConfigurationSection configToEdit = config.createSection("eco.sell.aFirstItem");
configToEdit.set("type", item.getType().name());
configToEdit.set("amount", item.getAmount());
if(item.hasItemMeta()){
ItemMeta meta = item.getItemMeta();
configToEdit.set("meta.name", meta.getDisplayName());
List<String> enchants = new ArrayList<>();
meta.getEnchants().forEach((en, lvl) -> enchants.add(en.getName() + ":" + lvl));
configToEdit.set("meta.enchant", enchants);
save();
}
}
所以,要恢复我正在使用的数据:
public static void restoreData(Player player){
//config.getConfigurationSection("eco.sell.aFirstItem");
ConfigurationSection configToEdit = config.createSection("eco.sell.aFirstItem");
ItemStack item = new ItemStack(Material.valueOf(configToEdit.getString("type")), configToEdit.getInt("amount"));
if(configToEdit.contains("meta")) {
player.sendMessage("Contains( Meta )");
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(configToEdit.getString("meta.name"));
List<String> enchants = configToEdit.getStringList("meta.enchants");
enchants.forEach(line -> {
String[] split = line.split(":");
item.addEnchantment(Enchantment.getByName(split[0]), Integer.parseInt(split[1]));
});
}
player.getInventory().addItem(item);
player.updateInventory();
}
你不能有那样的唯一 ID。
但是,有两种方法:
- 存储完整对象。例如,创建一个包含物品 ID、物品名称、附魔...的 json,然后将其存储为您想要保存的 ID。
例如,我们将保存一个项目并将其恢复。我们将使用 spigot 的默认配置。
保存项目
Configuration objConfig = plugin.getConfig().createSection("eco.sell.aFirstItem"); // create new section in plugin config
// now we will add all content from item to config
objConfig.set("type", item.getType().name()); // item type
objConfig.set("amount", item.getAmount()); // amount of item
if(item.hasMetadata()) {
ItemMeta meta = item.getItemMeta();
objConfig.set("meta.name", meta.getDisplayName()); // item name
List<String> enchants = new ArrayList<>(); // create hashmap that will be saved
meta.getEnchants().forEach((en, lvl) -> enchants.add(en.name() + ":" + lvl));
objConfig.set("meta.enchants", enchants); // all items enchants
}
plugin.saveConfig();
现在,我们将从配置恢复数据:
Configuration objConfig = plugin.getConfig().getConfigurationSection("eco.sell.aFirstItem"); // retrieve section
ItemStack item = new ItemStack(Material.valueOf(objConfig.getString("type")), objConfig.getInt("amount")); // here we have an item that we can edit
if(objConfig.contains("meta")) {
ItemMeta meta = item.getItemMeta();
meta.setDisplayName(objConfig.getString("meta.name"));
List<String> enchants = objConfig.getStringList("meta.enchants"); // get all enchants
enchants.forEach(line -> {
String[] split = line.split(":"); // split enchantName:enchantLevel
item.addEnchant(Enchantement.valueOf(split[0]), Integer.parse(split[1])); // get spigot objects
});
}
警告:有几行不能工作,因为我没有测试这个确切的代码,但这就是它应该工作的方式。
- 创建一个具有 ID 的项目列表,然后在需要的地方引用此 ID。你只需要在两者之间设置 link(例如 SQL 数据库)。
如果您总是销售相同的商品,第二个可能会有用。我认为在你的情况下第一个解决方案会更好。