diff --git a/build.gradle b/build.gradle index f688d65..c1a5b18 100644 --- a/build.gradle +++ b/build.gradle @@ -18,7 +18,7 @@ apply plugin: 'net.minecraftforge.gradle' def previousVersion = '1.3.1' def baseVersion = '1.4.0' -def minecraftVersion = '1.18.1' +def minecraftVersion = '1.18.2' version = "${minecraftVersion}-${baseVersion}" as Object group = 'io.github.samarium150' archivesBaseName = 'structures_compass' @@ -73,7 +73,7 @@ minecraft { // sourceSets.main.resources { srcDir 'src/generated/resources' } dependencies { - minecraft 'net.minecraftforge:forge:1.18.1-39.0.88' + minecraft 'net.minecraftforge:forge:1.18.2-40.0.12' } compileJava { diff --git a/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/item/StructuresCompassItem.java b/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/item/StructuresCompassItem.java index 305f422..764d39e 100644 --- a/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/item/StructuresCompassItem.java +++ b/src/main/java/io/github/samarium150/minecraft/mod/structures_compass/item/StructuresCompassItem.java @@ -1,5 +1,6 @@ package io.github.samarium150.minecraft.mod.structures_compass.item; +import com.mojang.datafixers.util.Pair; import io.github.samarium150.minecraft.mod.structures_compass.config.StructuresCompassConfig; import io.github.samarium150.minecraft.mod.structures_compass.network.StructuresCompassNetwork; import io.github.samarium150.minecraft.mod.structures_compass.network.packet.CompassSearchPacket; @@ -9,9 +10,13 @@ import io.github.samarium150.minecraft.mod.structures_compass.util.StructureUtils; import net.minecraft.client.resources.language.I18n; import net.minecraft.core.BlockPos; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.core.Registry; import net.minecraft.nbt.*; import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerLevel; import net.minecraft.world.InteractionHand; @@ -22,6 +27,8 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Rarity; import net.minecraft.world.level.Level; +import net.minecraft.world.level.chunk.ChunkGenerator; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; @@ -160,18 +167,26 @@ public static boolean isSkip(@Nonnull ItemStack stack) { * @see ServerLevel#findNearestMapFeature */ public static void search(@Nonnull ServerLevel world, Player player, @Nonnull StructureFeature structure, ItemStack stack) { - ResourceLocation registry = structure.getRegistryName(); - assert registry != null; - setStructureName(registry.toString(), stack); + ResourceLocation structureRegistryName = structure.getRegistryName(); + assert structureRegistryName != null; + setStructureName(structureRegistryName.toString(), stack); sendTranslatedMessage(GeneralUtils.prefix + "msg_searching", player); - BlockPos pos = world.findNearestMapFeature( - structure, player.blockPosition(), StructuresCompassConfig.radius.get(), isSkip(stack) + ChunkGenerator generator = world.getChunkSource().getGenerator(); + HolderSet> holderSet = world + .registryAccess() + .registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY) + .getHolder(ResourceKey.create(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY, structureRegistryName)) + .map(HolderSet::direct) + .orElseThrow(); + Pair>> result = generator.findNearestMapFeature( + world, holderSet, player.blockPosition(), StructuresCompassConfig.radius.get(), isSkip(stack) ); sendTranslatedMessage(GeneralUtils.prefix + "msg_done", player); - if (pos == null) { + if (result == null) { ItemUtils.removeTag(stack, DIM_TAG); ItemUtils.removeTag(stack, POS_TAG); } else { + BlockPos pos = result.getFirst(); Vec3 dis = StructureUtils.getDistance(pos, player); double distance = (double) Math.round(dis.length() * 100) / 100; if (distance > StructuresCompassConfig.maxDistance.get()) { @@ -222,7 +237,8 @@ public InteractionResultHolder use( sendMessage(I18n.get(GeneralUtils.prefix + "msg_no_target"), player); return super.use(world, player, hand); } - StructureFeature structure = StructureFeature.STRUCTURES_REGISTRY.get(name.replace("minecraft:", "")); + @SuppressWarnings("deprecation") + StructureFeature structure = Registry.STRUCTURE_FEATURE.get(ResourceLocation.tryParse(name)); if (structure == null) { sendMessage(I18n.get(GeneralUtils.prefix + "msg_error_name") + name, player); return super.use(world, player, hand); 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 4374db1..511159c 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,15 +3,12 @@ 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.core.Registry; 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.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.phys.Vec3; import net.minecraftforge.api.distmarker.Dist; @@ -22,8 +19,10 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; -import java.util.*; -import java.util.stream.Collectors; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Optional; /** * Utilities related to structures @@ -154,18 +153,26 @@ public static List getDimensions(@Nonnull ServerLevel world, StructureFe */ @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; + List> configured = world.registryAccess() + .registryOrThrow(Registry.CONFIGURED_STRUCTURE_FEATURE_REGISTRY) + .stream() + .filter(configuredStructureFeature -> configuredStructureFeature.feature == structure) + .toList(); + if (!configured.isEmpty()) { + List biomeSet = world.getChunkSource().getGenerator() + .getBiomeSource() + .possibleBiomes() + .stream() + .map(holder -> holder.unwrapKey().orElseThrow().location()) + .toList(); + for (ResourceLocation biome : configured.stream() + .flatMap(configuredStructureFeature -> configuredStructureFeature.biomes.stream() + .map(holder -> holder.unwrapKey().orElseThrow().location())) + .distinct().toList() + ) { + if (biomeSet.contains(biome)) + return true; + } } return false; } diff --git a/src/main/resources/META-INF/mods.toml b/src/main/resources/META-INF/mods.toml index cf01653..9391fe0 100644 --- a/src/main/resources/META-INF/mods.toml +++ b/src/main/resources/META-INF/mods.toml @@ -1,5 +1,5 @@ modLoader="javafml" -loaderVersion="[38,)" +loaderVersion="[40,)" issueTrackerURL="https://github.com/Samarium150/StructuresCompass/issues" license="GNU GENERAL PUBLIC LICENSE Version 3" diff --git a/src/main/resources/pack.mcmeta b/src/main/resources/pack.mcmeta index 1a93296..2481d75 100644 --- a/src/main/resources/pack.mcmeta +++ b/src/main/resources/pack.mcmeta @@ -1,6 +1,6 @@ { "pack": { "description": "Structures' Compass mod resources", - "pack_format": 8 + "pack_format": 9 } }