You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 03:32:49