将Minecraft模组从1.17.1移植到1.18.2的结构API变更问题
解决Minecraft 1.17.1→1.18.2移植中
getStructureAt参数不匹配问题 问题核心是1.18.2版本中StructureFeatureManager.getStructureAt()的方法签名发生了变更:原1.17.1的三参数重载(getStructureAt(pos, false, structure))被移除,仅保留接收BlockPos和布尔值的两参数版本,直接传入三个参数会触发编译错误。
修改方案
调整代码逻辑,先通过两参数方法获取结构实例,再判断该实例是否属于目标结构类型,具体修改如下:
private boolean isTower(ServerLevel level, BlockPos pos) { LOGGER.info("Checking for tower..."); StructureFeature<?> structure; StructureStart<?> structurePos; for (String s : Arrays.asList("tower", "ice_tower", "jungle_tower", "derelict_tower", "derelict_grass_tower", "ocean_tower", "ocean_warm_tower")) { structure = ForgeRegistries.STRUCTURE_FEATURES.getValue(ResourceLocation.tryParse(TOWERS_MODID + ":" + s)); if (structure == null) { continue; } // 调用两参数版本的getStructureAt structurePos = level.structureFeatureManager().getStructureAt(pos, false); // 先判空,再检查结构有效性与匹配性 if (structurePos != null && structurePos.isValid() && structurePos.getStructureFeature() == structure) { // Manhattan distance without Y coord float f = (float) Math.abs(pos.getX() - structurePos.getLocatePos().getX()); float f1 = (float) Math.abs(pos.getZ() - structurePos.getLocatePos().getZ()); if (f + f1 <= 30) { return true; } } } // 补充方法默认返回值,覆盖所有代码路径 return false; }
关键修改点说明
- 移除
getStructureAt的第三个structure参数,调用两参数重载方法 - 新增
structurePos != null空判断,避免空指针异常 - 通过
structurePos.getStructureFeature()获取当前结构实例,与遍历的目标结构做匹配 - 补充方法末尾的
return false,修复原代码未覆盖所有返回路径的编译问题
内容的提问来源于stack exchange,提问作者arizona440
相关产品推荐
相关产品推荐

