= 创作分享 =
编程开发
forge1.20.1 方块实体数据同步相关问题
Strange_Smell

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

Strange_Smell 于 2024-3-8 14:44 ( 8月前 ) [复制链接] [只看楼主] [打印]
1221 8
66RF
本帖最后由 QQ酱277476 于 2024-3-8 15:03 编辑

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

发表于 2024-3-8 14:44:28 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式

回复 | 举报

该帖共收到 8 条回复!
Strange_Smell
MBYL_InkAndSoul 发表于 2024-3-25 04:48
因为原版没有把箱子的容器数据同步到客户端,除非打开;;;
取出物品貌似调用的是 removeItemNoUpdate(? ...

虽然说我继承的是原版箱子,但是我没有用原版的物品增减的方法,自己写了个。
而且就算更新了,如果不修改8楼说的问题,那依旧会出现这个问题orz。
发表于 2024-6-24 12:56:38 | 只看该作者

回复 | 举报

Strange_Smell
  1.    public static CompoundTag saveAllItems(CompoundTag p_18977_, NonNullList<ItemStack> p_18978_, boolean p_18979_) {
  2.       ListTag listtag = new ListTag();

  3.       for(int i = 0; i < p_18978_.size(); ++i) {
  4.          ItemStack itemstack = p_18978_.get(i);
  5.          if (!itemstack.isEmpty()) {
  6.             CompoundTag compoundtag = new CompoundTag();
  7.             compoundtag.putByte("Slot", (byte)i);
  8.             itemstack.save(compoundtag);
  9.             listtag.add(compoundtag);
  10.          }
  11.       }

  12.       if (!listtag.isEmpty() || p_18979_) {
  13.          p_18977_.put("Items", listtag);
  14.       }

  15.       return p_18977_;
  16.    }

  17.    public static void loadAllItems(CompoundTag p_18981_, NonNullList<ItemStack> p_18982_) {
  18.       ListTag listtag = p_18981_.getList("Items", 10);

  19.       for(int i = 0; i < listtag.size(); ++i) {
  20.          CompoundTag compoundtag = listtag.getCompound(i);
  21.          int j = compoundtag.getByte("Slot") & 255;
  22.          if (j >= 0 && j < p_18982_.size()) {
  23.             p_18982_.set(j, ItemStack.of(compoundtag));
  24.          }
  25.       }

  26.    }
复制代码

突然想起来这个帖子,原因已经明白辽,
这是因为mj在save的时候只存入有物品的格子,但在load的时候不会帮我们清空物品列表,需要我们自己清理,如果不清理,则原来有物品现在没物品的格子在客户端就会继续存在。
发表于 2024-6-24 12:52:03 | 只看该作者

回复 | 举报

是墨靈不是墨白
因为原版没有把箱子的容器数据同步到客户端,除非打开;;;
取出物品貌似调用的是 removeItemNoUpdate(?),所以没有更新到。
发表于 2024-3-25 04:48:22 | 只看该作者

回复 | 举报

Strange_Smell
最后还是手动发包解决,但是不明白为什么按照forge官方文档上说的方块实体同步消息为何不行,猜测是因为我继承的原版箱子,而原版箱子做了什么我不知道的操作?
发表于 2024-3-17 20:01:15 | 只看该作者

回复 | 举报

C江秋
QQ酱277476 发表于 2024-3-9 22:30
我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新 ...

这样看应该是你的状态没更新我想了想可以通过网络消息检测箱子中物品种类是否发生变化,然后标记需要更新,接下来再次调用渲染代码更新全部需要更新的方块,这样做比较暴力且可能在多人游戏里卡顿比较明显,不过我能想到就这样了其他的方法我就不知道了。
始终在征程上。
发表于 2024-3-9 23:43:14 | 只看该作者

回复 | 举报

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

emmm,看了一下,我继承的是原版的箱子,原版中removeItem()和这个逻辑是一样的,还是不行
发表于 2024-3-9 22:44:28 | 只看该作者

回复 | 举报

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

我试试,但渲染是没问题的,只是渲染的时候获取的容器内的items在取出时不能更新,而放入时就可以更新
发表于 2024-3-9 22:30:28 | 只看该作者

回复 | 举报

C江秋
本帖最后由 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的“物品槽内容改变时的”代码改的,不知道能不能成功
始终在征程上。
发表于 2024-3-9 21:00:58 | 只看该作者

回复 | 举报

百科目前不允许匿名发帖哦~ 请先 [ 登陆 ][ 注册 ] 吧~

本版积分规则

发新帖
  • 回复
  • 点评
  • 评分

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

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