为 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。

但是,有两种方法:

  1. 存储完整对象。例如,创建一个包含物品 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
   });
}

警告:有几行不能工作,因为我没有测试这个确切的代码,但这就是它应该工作的方式。

  1. 创建一个具有 ID 的项目列表,然后在需要的地方引用此 ID。你只需要在两者之间设置 link(例如 SQL 数据库)。

如果您总是销售相同的商品,第二个可能会有用。我认为在你的情况下第一个解决方案会更好。