Porting a Minecraft MOD from 1.17.1 to 1.18.2 Structure Changes

104 Views Asked by At

As the title states I'm trying to port a mod from 1.17.1 to 1.18.2. Haven't coded in a few years and I'm currently stuck with this final issue.

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;
  }
  structurePos = level.structureFeatureManager().getStructureAt(pos, false, structure);
  if (structurePos.isValid()) {
    // 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;
    }
  }
}

The error being "Expected 2 arguments but found 3" because of the code below.

structurePos = level.structureFeatureManager().getStructureAt(pos, false, structure);
if (structurePos.isValid()) {
  // 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;
  }
}

Has anyone run into this or does anyone know what exactly to change in the code above in order to resolve the issue?

I already looked into the changes between:

but I haven't been able to figure it out.

1

There are 1 best solutions below

2
Ben On

The only method you are calling with 3 arguments is:

structurePos = level.structureFeatureManager().getStructureAt(pos, false, structure);

So, it looks like the method getStructureAt has changed.

And when reading this: https://nekoyue.github.io/ForgeJavaDocs-NG/javadoc/1.18.2/net/minecraft/world/level/StructureFeatureManager.html

The new getStructureAt is:

StructureStart getStructureAt(BlockPos p_207786_, ConfiguredStructureFeature<?,?> p_207787_)

(no more second boolean argument)

So, you need to change the call :

//from:
structurePos = level.structureFeatureManager().getStructureAt(pos, false, structure);
//to
structurePos = level.structureFeatureManager().getStructureAt(pos, structure);

Cheers!