【问题标题】:Spigot/Bukkit - Get Inventory of Chest - JavaSpigot/Bukkit - 获取胸部库存 - Java
【发布时间】:2016-02-11 19:00:29
【问题描述】:

我试图保存一个Chest,所以我有一个BlockState 和一个InventoryBlockState 是没问题的,但是在Inventory 里他总是把0 存为ItemStack 的金额。

if (BlockState instanceof Chest) {
    Chest chest = (Chest) bs;
    Inventory inv = chest.getBlockInventory();
    System.out.println(inv.getItem(0).getAmount());
}

在控制台中打印0,同样当Chest 是这样的:

编辑: 现在我有了这个:

BlockState nbs = bs.getBlock().getState();
System.out.println(((Chest) nbs).getBlockInventory().getItem(0).getAmount());

但现在我得到了这个错误:

[21:16:25 ERROR]: null
org.bukkit.command.CommandException: Unhandled exception executing command 'set' in plugin GlobalSystem vAlpha_0.0.1
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:46) ~[spigot.jar:git-Spigot-db6de12-07c3001]
    at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:141) ~[spigot.jar:git-Spigot-db6de12-07c3001]
    at org.bukkit.craftbukkit.v1_8_R3.CraftServer.dispatchCommand(CraftServer.java:641) ~[spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.PlayerConnection.handleCommand(PlayerConnection.java:1162) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.PlayerConnection.a(PlayerConnection.java:997) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:45) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.PacketPlayInChat.a(PacketPlayInChat.java:1) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.PlayerConnectionUtils$1.run(SourceFile:13) [spigot.jar:git-Spigot-db6de12-07c3001]
    at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source) [?:1.8.0_73]
    at java.util.concurrent.FutureTask.run(Unknown Source) [?:1.8.0_73]
    at net.minecraft.server.v1_8_R3.SystemUtils.a(SourceFile:44) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.MinecraftServer.B(MinecraftServer.java:715) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.DedicatedServer.B(DedicatedServer.java:374) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.MinecraftServer.A(MinecraftServer.java:654) [spigot.jar:git-Spigot-db6de12-07c3001]
    at net.minecraft.server.v1_8_R3.MinecraftServer.run(MinecraftServer.java:557) [spigot.jar:git-Spigot-db6de12-07c3001]
    at java.lang.Thread.run(Unknown Source) [?:1.8.0_73]
Caused by: java.lang.ClassCastException: org.bukkit.craftbukkit.v1_8_R3.block.CraftBlockState cannot be cast to org.bukkit.block.Chest
    at me.Nightfighter001.GlobalSystem.Methoden.Undo.add(Undo.java:56) ~[?:?]
    at me.Nightfighter001.GlobalSystem.Commands.setzen.onCommand(setzen.java:53) ~[?:?]
    at org.bukkit.command.PluginCommand.execute(PluginCommand.java:44) ~[spigot.jar:git-Spigot-db6de12-07c3001]
    ... 15 more

但是我没有CraftBlockState,我也从来没有导入过!

如果我再解释一下,也许你会更容易理解: 我正在开发类似 WorldEdit 的东西,所以我可以选择块并更改它们。对于自己的/undo- 和/redo-Command,我需要保存旧块。我在 HashMap 中执行此操作。我将 BlockStates 保存在 HashMap 的 ArrayList 中。

感谢您的帮助,并为我的英语不好感到抱歉;)

【问题讨论】:

  • 我无法重现您的问题。使用您的代码时,我的控制台会打印出“2”,这是胸部第一项的正确数量(索引 0 处的项目)。您使用的是哪个版本的 Spigot/Bukkit?您确定您使用的是最新版本的插件吗?
  • 我使用的是我用 BuildTool 创建的 1.8.8。是的,我使用最新版本的插件。明天我会尝试一些东西,也许会重写一些方法,然后告诉你它是否有效。但是当然很有趣的是它可以在你的插件中工作......:D
  • 是的,索引 0 处的物品绝对是箱子库存中的第一个物品。据我所知,唯一的可能性是你得到一个 NPE,因为第一个插槽中没有 ItemStack,否则我看不出项目数量应该为 0 的任何原因,除非你正在操纵 @ 987654338@ 在某种程度上。
  • 好吧,它仍然不起作用:/这里是另一行:System.out.println(((Chest) main.selectedLocs.get(p.getName()).iterator().next().getBlock().getState()).getInventory().getItem(0).getAmount());selectedLocs 是一个HashMap,我保存了由指定Player 选择的Locations (selectedLocs = new HashMap<String, Set<Location>>(listSize);)。正如你所看到的,我也没有操纵BlockState...我不知道我做错了什么:(

标签: java minecraft bukkit


【解决方案1】:

您可以使用自定义 YAML 文件并在其中保存值,然后当您这样做时,您可以将值放入库存中

如果您不知道该怎么做,您可以创建一个HashMap,然后将项目槽的编号放在值一侧,将其类型放在另一侧,您可以使用 Microsoft Excel存储项目类型和快捷方式名称,然后您可以获得自定义配置文件,然后执行 for 循环将值存储在 HashMap

如果这是对帖子有用的评论或为帖子投票,那么我知道我帮助了:D

【讨论】:

  • 对不起,我知道!我问他为什么以ItemStack 的金额返回0。就像我描述的那样,Inventory.getItem(0).getAmount(); 为图片中显示的Inventory 返回0
  • 对不起,我不知道。但是我得到了一个提示,请您检查所有已更改的课程,然后自己阅读。这至少是我修复错误的方式。对不起:(
【解决方案2】:

我现在通过将金额保存在另一个列表中解决了我的问题......它不是很优雅,但它可以工作:D

如果其他人有更好的想法,请发表!

非常感谢:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多