diff --git a/src/main/java/org/betterx/bclib/BCLib.java b/src/main/java/org/betterx/bclib/BCLib.java index d072ed01..c00012b2 100644 --- a/src/main/java/org/betterx/bclib/BCLib.java +++ b/src/main/java/org/betterx/bclib/BCLib.java @@ -1,6 +1,11 @@ package org.betterx.bclib; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.ai.village.poi.PoiType; +import net.minecraft.world.entity.ai.village.poi.PoiTypes; +import net.minecraft.world.level.block.Blocks; import net.fabricmc.api.EnvType; import net.fabricmc.api.ModInitializer; @@ -27,6 +32,7 @@ import org.betterx.bclib.registry.BaseRegistry; import org.betterx.bclib.util.Logger; import java.util.List; +import java.util.Set; public class BCLib implements ModInitializer { public static final String MOD_ID = "bclib"; @@ -52,18 +58,21 @@ public class BCLib implements ModInitializer { CommandRegistry.register(); DataExchangeAPI.registerDescriptors(List.of( - HelloClient.DESCRIPTOR, - HelloServer.DESCRIPTOR, - RequestFiles.DESCRIPTOR, - SendFiles.DESCRIPTOR, - Chunker.DESCRIPTOR - ) - ); + HelloClient.DESCRIPTOR, + HelloServer.DESCRIPTOR, + RequestFiles.DESCRIPTOR, + SendFiles.DESCRIPTOR, + Chunker.DESCRIPTOR + ) + ); BCLibPatch.register(); TemplatePiece.ensureStaticInitialization(); PlacementModifiers.ensureStaticInitialization(); Configs.save(); + + ResourceKey key = ResourceKey.create(Registry.POINT_OF_INTEREST_TYPE_REGISTRY, makeID("test")); + PoiTypes.register(Registry.POINT_OF_INTEREST_TYPE, key, Set.of(Blocks.RED_CONCRETE.defaultBlockState()), 0, 1); /*if (isDevEnvironment()) { Biome.BiomeBuilder builder = new Biome.BiomeBuilder() .precipitation(Biome.Precipitation.NONE) diff --git a/src/main/java/org/betterx/bclib/api/v2/poi/BCLPoiType.java b/src/main/java/org/betterx/bclib/api/v2/poi/BCLPoiType.java new file mode 100644 index 00000000..fedfd2b5 --- /dev/null +++ b/src/main/java/org/betterx/bclib/api/v2/poi/BCLPoiType.java @@ -0,0 +1,98 @@ +package org.betterx.bclib.api.v2.poi; + +import net.minecraft.core.BlockPos; +import net.minecraft.core.Registry; +import net.minecraft.resources.ResourceKey; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.entity.ai.village.poi.PoiManager; +import net.minecraft.world.entity.ai.village.poi.PoiRecord; +import net.minecraft.world.entity.ai.village.poi.PoiType; +import net.minecraft.world.entity.ai.village.poi.PoiTypes; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.BlockStateProperties; +import net.minecraft.world.level.border.WorldBorder; + +import com.google.common.collect.ImmutableSet; + +import java.util.Comparator; +import java.util.Optional; +import java.util.Set; + +public class BCLPoiType { + public final ResourceKey key; + public final PoiType type; + public final Set matchingStates; + public final int maxTickets; + public final int validRange; + + public BCLPoiType(ResourceKey key, + PoiType type, + Set matchingStates, + int maxTickets, + int validRange) { + this.key = key; + this.type = type; + this.matchingStates = matchingStates; + this.maxTickets = maxTickets; + this.validRange = validRange; + } + + public static BCLPoiType register(ResourceLocation location, + Set matchingStates, + int maxTickets, + int validRanges) { + ResourceKey key = ResourceKey.create(Registry.POINT_OF_INTEREST_TYPE_REGISTRY, location); + PoiType type = PoiTypes.register(Registry.POINT_OF_INTEREST_TYPE, key, matchingStates, maxTickets, validRanges); + return new BCLPoiType(key, type, matchingStates, maxTickets, validRanges); + } + + public static Set getBlockStates(Block block) { + return ImmutableSet.copyOf(block.getStateDefinition().getPossibleStates()); + } + + public Optional findPoiAround(ServerLevel level, + BlockPos center, + boolean wideSearch, + WorldBorder worldBorder) { + return findPoiAround(key, level, center, wideSearch, worldBorder); + } + + public Optional findPoiAround(ServerLevel level, + BlockPos center, + int radius, + WorldBorder worldBorder) { + return findPoiAround(key, level, center, radius, worldBorder); + } + + public static Optional findPoiAround( + ResourceKey key, + ServerLevel level, + BlockPos center, + boolean wideSearch, + WorldBorder worldBorder) { + return findPoiAround(key, level, center, wideSearch ? 16 : 128, worldBorder); + } + + public static Optional findPoiAround( + ResourceKey key, + ServerLevel level, + BlockPos center, + int radius, + WorldBorder worldBorder) { + PoiManager poiManager = level.getPoiManager(); + + poiManager.ensureLoadedAndValid(level, center, radius); + Optional record = poiManager + .getInSquare(holder -> holder.is(key), center, radius, PoiManager.Occupancy.ANY) + .filter(poiRecord -> worldBorder.isWithinBounds(poiRecord.getPos())) + .sorted(Comparator.comparingDouble(poiRecord -> poiRecord.getPos().distSqr(center)) + .thenComparingInt(poiRecord -> poiRecord.getPos().getY())) + .filter(poiRecord -> level.getBlockState(poiRecord.getPos()) + .hasProperty(BlockStateProperties.HORIZONTAL_AXIS)) + .findFirst(); + + return record.map(poiRecord -> poiRecord.getPos()); + } +} diff --git a/src/main/resources/bclib.accesswidener b/src/main/resources/bclib.accesswidener index 7ce04adb..673c1787 100644 --- a/src/main/resources/bclib.accesswidener +++ b/src/main/resources/bclib.accesswidener @@ -13,4 +13,5 @@ extendable class net/minecraft/world/level/levelgen/NoiseBasedChunkGenerator #Methods accessible method net/minecraft/client/gui/screens/worldselection/WorldGenSettingsComponent updateSettings (Lnet/minecraft/client/gui/screens/worldselection/WorldCreationContext$Updater;)V -accessible method net/minecraft/world/level/storage/loot/LootPool ([Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer;[Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition;[Lnet/minecraft/world/level/storage/loot/functions/LootItemFunction;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V \ No newline at end of file +accessible method net/minecraft/world/level/storage/loot/LootPool ([Lnet/minecraft/world/level/storage/loot/entries/LootPoolEntryContainer;[Lnet/minecraft/world/level/storage/loot/predicates/LootItemCondition;[Lnet/minecraft/world/level/storage/loot/functions/LootItemFunction;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;Lnet/minecraft/world/level/storage/loot/providers/number/NumberProvider;)V +accessible method net/minecraft/world/entity/ai/village/poi/PoiTypes register (Lnet/minecraft/core/Registry;Lnet/minecraft/resources/ResourceKey;Ljava/util/Set;II)Lnet/minecraft/world/entity/ai/village/poi/PoiType; \ No newline at end of file