forge1.20.1 方块实体数据同步相关问题

查看数: 551 | 评论数: 6 | 收藏 0
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2024-3-8 14:44

正文摘要:

本帖最后由 QQ酱277476 于 2024-3-8 15:03 编辑 最近想把箱子里的物品渲染出口,在方块实体数据同步上遇到了问题 放入物品可以实时更新,但是拿出物品不能更新 实体类代码在这PasteBin (fastmirror.net) renderer ...

回复

MBYL_InkAndSoul 发表于 2024-3-25 04:48:22
因为原版没有把箱子的容器数据同步到客户端,除非打开;;;
取出物品貌似调用的是 removeItemNoUpdate(?),所以没有更新到。
QQ酱277476 发表于 2024-3-17 20:01:15
最后还是手动发包解决,但是不明白为什么按照forge官方文档上说的方块实体同步消息为何不行,猜测是因为我继承的原版箱子,而原版箱子做了什么我不知道的操作?
C、江秋菌 发表于 2024-3-9 23:43:14
QQ酱277476 发表于 2024-3-9 22:30
我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新 ...

这样看应该是你的状态没更新我想了想可以通过网络消息检测箱子中物品种类是否发生变化,然后标记需要更新,接下来再次调用渲染代码更新全部需要更新的方块,这样做比较暴力且可能在多人游戏里卡顿比较明显,不过我能想到就这样了其他的方法我就不知道了。
QQ酱277476 发表于 2024-3-9 22:44:28
C、江秋菌 发表于 2024-3-9 21:00
我也不是特别懂渲染的问题,但你可以试试先创建一个类:
再在你的实体类代码里加一段这个:  

emmm,看了一下,我继承的是原版的箱子,原版中removeItem()和这个逻辑是一样的,还是不行
QQ酱277476 发表于 2024-3-9 22:30:28
C、江秋菌 发表于 2024-3-9 21:00
我也不是特别懂渲染的问题,但你可以试试先创建一个类:
再在你的实体类代码里加一段这个:  

我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新
C、江秋菌 发表于 2024-3-9 21:00:58
本帖最后由 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的“物品槽内容改变时的”代码改的,不知道能不能成功

[ MC百科(mcmod.cn) 除另有声明,所有开放公共编辑的内容均使用 BY-NC-SA 3.0 协议 ]

Minecraft百科CC协议
快速回复 返回顶部 返回列表