该如何做到将net.minecraft.item.ItemStack序列化存储到本地 然后再反序列化读取
插件的直接通过ConfigurationSection接口set和get就可以实现读存
- // 从 NbtCompound 对象中读一个 ItemStack
 
- static net.minecraft.item.ItemStack#fromNbt
 
 
- // ItemStack 写入 Nbt
 
- net.minecraft.item.ItemStack#writeNbt         
 
 
- // 从文件读取nbt数据
 
- static net.minecraft.nbt.NbtIo#readCompressed(java.io.File)
 
 
- // 写入nbt数据刀文件
 
- static net.minecraft.nbt.NbtIo#writeCompressed(net.minecraft.nbt.NbtCompound, java.io.File)
我不知道你写的是mod还是插件,大概率是插件。
ItemStack无非就三样东西:item, count, nbt
item和count好说
nbt这玩意,可以用某种DynamicOps转换一下,比如给它干成json,但是json会损失int long等数据
所以为啥不自己造个轮子呢
ItemStack无非就三样东西:item, count, nbt
item和count好说
nbt这玩意,可以用某种DynamicOps转换一下,比如给它干成json,但是json会损失int long等数据
所以为啥不自己造个轮子呢
[数据删除]
nbt:读取:
复制代码
写入:
复制代码
json:
读取:
复制代码写入(因为 forge 和 mc 都没提供现成的,所以选择自己写,代码为 1.18 的,低版本 Java 可能没有 var,需要手动换为对应类型):
复制代码
- ItemStack#fromNbt
写入:
- ItemStack#writeNbt
json:
读取:
- CraftingHelper.getItemStack(json.getAsJsonObject(), true);
- JsonObject result = new JsonObject();
 
- CompoundTag allTag = src.serializeNBT();
 
- String item = src.getItem().getRegistryName().toString();
 
- result.addProperty("item", item);
 
- var tag = allTag.getCompound("tag");
 
- if (allTag.contains("ForgeCaps")) {
 
-     var fCap = allTag.getCompound("ForgeCaps");
 
-     tag.put("ForgeCaps", fCap);
 
- }
 
- if (!tag.isEmpty()) {
 
-     JsonPrimitive nbt = new JsonPrimitive(tag.toString());
 
-     result.add("nbt", nbt);
 
- }
 
- result.addProperty("count", src.getCount());