Minecraft Forge 1.16.5中替代onBlockActivated的方法及右键方块无响应问题求助
Minecraft Forge 1.16.5中替代onBlockActivated的方法及右键方块无响应问题求助
嘿,看你在做一个能传送去新维度的方块,但右键完全没反应,加了调试消息也没触发,这事儿确实闹心!我之前折腾Forge模组时也碰到过类似的坑,给你梳理下可能的问题和解决办法:
首先得明确:在1.16.5版本里,原来的onBlockActivated方法已经被**use方法**替代了,方法签名也有不少变化,这大概率是你右键没反应的核心原因之一。正确的方法签名应该是这样的:
@Override public ActionResultType use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { // 你的交互逻辑写在这里 return super.use(state, worldIn, pos, player, handIn, hit); }
注意这里的World改成了Level,BlockRayTraceResult换成了BlockHitResult,别写错参数类型哦。
接下来给你拆解几个常见的排查点:
- 方法重写是否正确:一定要加
@Override注解,这样如果方法签名写错了,编译器会直接提示你,不至于默默失效。 - 客户端与服务端的逻辑区分:你提到只在客户端加了调试消息,但传送维度这种操作必须在服务端执行,得分开处理:
- 客户端可以用来显示提示,比如用
player.displayClientMessage(Component.literal("准备传送!"), true); - 服务端逻辑要先判断
!worldIn.isClientSide,再执行传送,比如player.teleportTo(...)
- 客户端可以用来显示提示,比如用
- 方块属性设置:在方块的构造方法里,要确保属性允许交互,比如别误加了阻止右键的设置,常规的属性可以这么写:
BlockBehaviour.Properties.of(Material.STONE).strength(2.0f).noOcclusion() - 调试消息是否有效:客户端的调试消息可以用
player.sendSystemMessage(Component.literal("右键触发啦!")),服务端的话可以用LOGGER.info("右键方块被触发"),两边日志都要看看,说不定消息已经输出只是你没注意到。
给你贴个简单的示例代码,你可以参考着调整:
@Override public ActionResultType use(BlockState state, Level worldIn, BlockPos pos, Player player, InteractionHand handIn, BlockHitResult hit) { // 客户端显示提示 if (worldIn.isClientSide) { player.displayClientMessage(Component.literal("右键触发成功!"), true); return ActionResultType.SUCCESS; } // 服务端执行传送逻辑 if (!player.isPassenger() && !player.isVehicle()) { // 这里替换成你新维度的目标坐标 Level targetDimension = worldIn.dimension() == Level.OVERWORLD ? Level.NETHER : Level.OVERWORLD; player.teleportTo(targetDimension, player.getX(), player.getY(), player.getZ(), player.getYRot(), player.getXRot()); player.sendSystemMessage(Component.literal("已传送至新维度!")); } return ActionResultType.CONSUME; }
最后再提醒下,测试时要同时查看客户端和服务端的日志,很多时候问题就藏在日志的报错信息里哦。
内容来源于stack exchange
相关产品推荐
相关产品推荐

