ESs4Cg6M
该如何做到将net.minecraft.item.ItemStack序列化存储到本地 然后再反序列化读取

比巴卜c
插件的直接通过ConfigurationSection接口set和get就可以实现读存

MiaoLio
  1. // 从 NbtCompound 对象中读一个 ItemStack
  2. static net.minecraft.item.ItemStack#fromNbt

  3. // ItemStack 写入 Nbt
  4. net.minecraft.item.ItemStack#writeNbt         

  5. // 从文件读取nbt数据
  6. static net.minecraft.nbt.NbtIo#readCompressed(java.io.File)

  7. // 写入nbt数据刀文件
  8. static net.minecraft.nbt.NbtIo#writeCompressed(net.minecraft.nbt.NbtCompound, java.io.File)
复制代码



teddyxlandlee
我不知道你写的是mod还是插件,大概率是插件。
ItemStack无非就三样东西:item, count, nbt
item和count好说
nbt这玩意,可以用某种DynamicOps转换一下,比如给它干成json,但是json会损失int long等数据
所以为啥不自己造个轮子呢

Rothes
[数据删除]

秦千久
nbt:读取:

  1. ItemStack#fromNbt
复制代码


写入:

  1. ItemStack#writeNbt
复制代码



json:

读取:
  1. CraftingHelper.getItemStack(json.getAsJsonObject(), true);
复制代码
写入(因为 forge 和 mc 都没提供现成的,所以选择自己写,代码为 1.18 的,低版本 Java 可能没有 var,需要手动换为对应类型):
  1. JsonObject result = new JsonObject();
  2. CompoundTag allTag = src.serializeNBT();
  3. String item = src.getItem().getRegistryName().toString();
  4. result.addProperty("item", item);
  5. var tag = allTag.getCompound("tag");
  6. if (allTag.contains("ForgeCaps")) {
  7.     var fCap = allTag.getCompound("ForgeCaps");
  8.     tag.put("ForgeCaps", fCap);
  9. }
  10. if (!tag.isEmpty()) {
  11.     JsonPrimitive nbt = new JsonPrimitive(tag.toString());
  12.     result.add("nbt", nbt);
  13. }
  14. result.addProperty("count", src.getCount());
复制代码