本帖最后由 tdiant 于 2023-3-31 10:52 编辑
我给自己写的一个新实体加上自己的nbt,在不退出存档的情况下这个nbt一切正常,但是一退出存档再重进这个nbt就恢复默认值了,而且好像实体没有markdirty的方法,不能像方块实体那样保存。我的nbt代码如下:
复制代码
我给自己写的一个新实体加上自己的nbt,在不退出存档的情况下这个nbt一切正常,但是一退出存档再重进这个nbt就恢复默认值了,而且好像实体没有markdirty的方法,不能像方块实体那样保存。我的nbt代码如下:
- @Override
- public void writeCustomDataToNbt(NbtCompound nbt) {
- super.writeCustomDataToNbt(nbt);
- NbtList inventory = new NbtList();
- IntStream.range(0, this.inventory.size()).mapToObj(i -> this.inventory.getStack(i).writeNbt(new NbtCompound())).forEach(inventory::add);
- nbt.put("Inventory", inventory);
- nbt.putBoolean("HasLodestone", this.hasLodestone);
- }
- @Override
- public void readCustomDataFromNbt(NbtCompound nbt) {
- super.readCustomDataFromNbt(nbt);
- if (nbt.contains("Inventory")) {
- Inventory inventory = new SimpleInventory(27);
- nbt.getList("Inventory", NbtElement.COMPOUND_TYPE).stream().map(nbtElement -> (NbtCompound) nbtElement).forEach(nbtCompound -> IntStream.range(0, inventory.size()).forEach(i -> inventory.setStack(i, ItemStack.fromNbt(nbtCompound))));
- this.inventory = inventory;
- }
- if (nbt.contains("HasLodestone")) {
- this.hasLodestone = nbt.getBoolean("HasLodestone");
- }
- }
在不退出存档的情况下这个nbt一切正常
还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时间来初始化类,而相同功能的命令式代码只需要0毫秒来初始化。
Ph-苯 发表于 2023-3-18 14:44
你是怎么知道的?data指令吗?
还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时 ...
已经搞定了,是我多循环了一次,导致之前的nbt被覆盖了。
你说的表达式是指foreach还是哪个地方的?
iMoonDay 发表于 2023-3-18 18:11
已经搞定了,是我多循环了一次,导致之前的nbt被覆盖了。
你说的表达式是指foreach还是哪个地方的? ...
整个Stream。如果你用的是idea,可以用idea帮你把stream转换成循环。
Ph-苯 发表于 2023-3-18 14:44
你是怎么知道的?data指令吗?
还有,尽量少用lambda表达式,每个lambda表达式都需要花十几到几十毫秒的时 ...
Lambda的初始化时间根本不算啥,只是在加载类的时候用Core ASM 跑一遍Lambda类而已,并非每次运行的时候都要Re-initialize一遍。
Mixin 使用的Tree ASM 以及各种繁琐的 Mixin 类加载等工作也发生在类加载期间,这一耗时一定是比 LambdaMetaFactory 要长的。
所以还请抓大放小,Stream和lambda存在即合理
teddyxlandlee 发表于 2023-3-19 10:58
Lambda的初始化时间根本不算啥,只是在加载类的时候用Core ASM 跑一遍Lambda类而已,并非每次运行的时候 ...
我指的就是类加载时。Mixin是没有办法替代的,但是lambda可以替代。另一方面,lambda会把调试变得非常困难,因为任何一个微小的改动都可能触及lambda表达式,从而阻止热重载。