From 3da7fef94dc1433266957977d8d96c09a8213210 Mon Sep 17 00:00:00 2001 From: Samarium <28302241+Samarium150@users.noreply.github.com> Date: Sat, 12 Feb 2022 22:32:26 +0800 Subject: [PATCH] fix: polyfill canGenerateStructure --- build.gradle | 2 +- .../util/StructureUtils.java | 52 ++++++++++++++----- 2 files changed, 41 insertions(+), 13 deletions(-) diff --git a/build.gradle b/build.gradle index aa06287..8b0a8b4 100644 --- a/build.gradle +++ b/build.gradle @@ -17,7 +17,7 @@ plugins { apply plugin: 'net.minecraftforge.gradle' def previousVersion = '1.2.2' -def baseVersion = '1.3.0-beta.1' +def baseVersion = '1.3.0' def minecraftVersion = '1.18.1' version = "${minecraftVersion}-${baseVersion}" as Object group = 'io.github.samarium150' diff --git a/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/util/StructureUtils.java b/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/util/StructureUtils.java index f5d45cd..4374db1 100644 --- a/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/util/StructureUtils.java +++ b/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/util/StructureUtils.java @@ -3,9 +3,15 @@ import io.github.samarium150.minecraft.mod.structures_compass.config.StructuresCompassConfig; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.MinecraftServer; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.entity.Entity; +import net.minecraft.world.level.Level; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.StructureSettings; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; @@ -16,10 +22,8 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Optional; +import java.util.*; +import java.util.stream.Collectors; /** * Utilities related to structures @@ -132,14 +136,38 @@ public static String getLocalizedStructureName(@Nonnull StructureFeature stru */ @Nonnull public static List getDimensions(@Nonnull ServerLevel world, StructureFeature structure) { -// final List dims = new ArrayList<>(); -// MinecraftServer server = world.getServer(); -// server.getAllLevels().forEach(w->{ -// // canGenerateStructure method doesn't exist in 1.18 -// if (w.getChunkSource().getGenerator().getBiomeSource().canGenerateStructure(structure)) -// dims.add(w.dimension().location().toString()); -// }); - return new ArrayList<>(); + final List dims = new ArrayList<>(); + MinecraftServer server = world.getServer(); + server.getAllLevels().forEach(w -> { + if (canGenerateStructure(w, structure)) + dims.add(w.dimension().location().toString()); + }); + return dims; + } + + /** + * Polyfill for native canGenerateStructure method, which doesn't exist in 1.18 + * w.getChunkSource().getGenerator().getBiomeSource().canGenerateStructure(structure) + * @param world player's server world + * @param structure the given structure + * @return can be generated or not in the given world + */ + @Nonnull + private static Boolean canGenerateStructure(@Nonnull ServerLevel world, StructureFeature structure) { + ChunkGenerator generator = world.getChunkSource().getGenerator(); + StructureSettings settings = generator.getSettings(); + if (structure == StructureFeature.STRONGHOLD) + return world.dimension() == Level.OVERWORLD; + Set biomes = generator.getBiomeSource().possibleBiomes().stream() + .map(Biome::getRegistryName) + .filter(Objects::nonNull) + .map(ResourceLocation::toString) + .collect(Collectors.toSet()); + for (ResourceKey biome : settings.structures(structure).values()) { + if (biomes.contains(biome.location().toString())) + return true; + } + return false; } /**