【问题标题】:Get "Custom id" for ItemStack in bukkit在 bukkit 中获取 ItemStack 的“自定义 ID”
【发布时间】:2021-09-06 05:43:15
【问题描述】:

首先,我想为我糟糕的英语 xD 道歉。所以,我正在开发一个经济插件来学习,在这个插件中,我正在创建一个标志商店。一切都很顺利,但是当我尝试我的商店时,我被附魔物品卡住了,例如,因为我无法获得 ID:

ItemStack item = player.getItemInHand();
item.getTypeId();

这只会返回真实物品的 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();
}

【问题讨论】:

  • 这个问题对我来说是模棱两可的,你到底想做什么?添加一种方法来识别特定物品或从特定物品中获得附魔?
  • 是的,类似的。更具体地说,我想做一些类似 ChestShop 插件的 /iinfo 命令,你知道吗?但我想用一些附魔来识别物品,例如,从标志中取出它来制作商店标志。

标签: java minecraft bukkit


【解决方案1】:

您不能拥有这样的唯一 ID。

但是,有两种方法:

  1. 存储完整对象。例如,创建一个 json,其中包含项目 ID、项目名称、附魔...然后将其存储为您要保存的 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 引用到您想要的位置。而且您只需要在两者之间建立联系(例如 SQL 数据库有效)。

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

【讨论】:

  • 所以,我试图做第一个,但是,我不知道我是否可以为附魔物品“设置一个 id”,这可能吗?或者我必须做出……我不知道,某种无形的传说,以便以后识别这个项目?第二种方法我认为我也可以,但是,与第一种方法相同,我可以稍后使用 Material.GetMaterial(); 等方法在标志中获取此项目 id;???感谢您的帮助:)
  • 我会尽快测试它,然后我会回来提供消息
  • 天哪,非常感谢,它成功了。这还不是我需要的,因为现在我需要识别标志中的项目,但我认为我可以使用它。 ps:不需要添加“item.addEnchantment”,只需添加“meta.addEnchant”和next:item.setItemMeta(meta);。再次,非常感谢兄弟;P
  • 是的,也许我稍后会问一个新问题,我很累,两天试图解决这个问题。我的想法是做类似 /iinfo 的 ChestShop 插件,你知道吗?我不想这样做,只是为了学习,因为我想我可以使用其他方法来获得它。
  • 是的,我可以,但我想知道它是如何理解逻辑和方法的:P
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 2015-04-02
  • 1970-01-01
相关资源
最近更新 更多