MC百科社群

标题: forge1.20.1 方块实体数据同步相关问题 [打印本页]

作者: QQ酱277476    时间: 2024-3-8 14:44
标题: forge1.20.1 方块实体数据同步相关问题
本帖最后由 QQ酱277476 于 2024-3-8 15:03 编辑

最近想把箱子里的物品渲染出口,在方块实体数据同步上遇到了问题
放入物品可以实时更新,但是拿出物品不能更新
实体类代码在这PasteBin (fastmirror.net)
renderer类在这PasteBin (fastmirror.net)
方块类在这PasteBin (fastmirror.net)
在参考了原版的营火代码、实现了类似功能的模组(沉浸式mc,真的forge)、forge官方文档和相当些教程后依旧没找出问题。。。orz
求大佬们指点指点!!!


作者: C、江秋菌    时间: 2024-3-9 21:00
本帖最后由 C、江秋菌 于 2024-3-9 21:18 编辑

我也不是特别懂渲染的问题,但你可以试试先创建一个类:
  1. package net.mcreator.test.procedures;//不要在意Mcr(>-<)

  2. import net.minecraft.world.level.block.entity.BlockEntity;
  3. import net.minecraft.world.level.LevelAccessor;
  4. import net.minecraft.core.BlockPos;

  5. public class ShowProcedure {//这里的ShowProcedure就是你后面需要调用的
  6.     public static void execute(LevelAccessor world, double x, double y, double z) {      
  7.         BlockEntity blockEntity = world.getBlockEntity(new BlockPos((int) x, (int) y, (int) z));
  8.         if (blockEntity != null) {
  9.             // 如果 BlockEntity 存在,那么标记它需要更新
  10.             blockEntity.setChanged();
  11.         }
  12.     }
复制代码

再在你的实体类代码里加一段这个:  
  1. @Override
  2.     public ItemStack removeItem(int index, int count) {
  3.         ItemStack removedItem = super.removeItem(index, count);

  4.         // 当物品被移除时,调用一个新的方法来更新渲染
  5.         if (!removedItem.isEmpty()) {
  6.             ShowProcedure.execute(level, worldPosition.getX(), worldPosition.getY(), worldPosition.getZ());
  7.         }

  8.         return removedItem;
  9.    
复制代码

这个我拿Mcr的“物品槽内容改变时的”代码改的,不知道能不能成功

作者: QQ酱277476    时间: 2024-3-9 22:30
C、江秋菌 发表于 2024-3-9 21:00
我也不是特别懂渲染的问题,但你可以试试先创建一个类:
再在你的实体类代码里加一段这个:  

我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新
作者: QQ酱277476    时间: 2024-3-9 22:44
C、江秋菌 发表于 2024-3-9 21:00
我也不是特别懂渲染的问题,但你可以试试先创建一个类:
再在你的实体类代码里加一段这个:  

emmm,看了一下,我继承的是原版的箱子,原版中removeItem()和这个逻辑是一样的,还是不行
作者: C、江秋菌    时间: 2024-3-9 23:43
QQ酱277476 发表于 2024-3-9 22:30
我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新 ...

这样看应该是你的状态没更新我想了想可以通过网络消息检测箱子中物品种类是否发生变化,然后标记需要更新,接下来再次调用渲染代码更新全部需要更新的方块,这样做比较暴力且可能在多人游戏里卡顿比较明显,不过我能想到就这样了其他的方法我就不知道了。
作者: QQ酱277476    时间: 2024-3-17 20:01
最后还是手动发包解决,但是不明白为什么按照forge官方文档上说的方块实体同步消息为何不行,猜测是因为我继承的原版箱子,而原版箱子做了什么我不知道的操作?
作者: MBYL_InkAndSoul    时间: 2024-3-25 04:48
因为原版没有把箱子的容器数据同步到客户端,除非打开;;;
取出物品貌似调用的是 removeItemNoUpdate(?),所以没有更新到。




欢迎光临 MC百科社群 (https://bbs.mcmod.cn/) MC百科|最大的MineCraft中文模组百科