Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.registry.var;
2
3import com.mojang.serialization.MapCodec;
4import dev.architectury.registry.registries.DeferredRegister;
5import dev.architectury.registry.registries.RegistrySupplier;
6import net.minecraft.core.BlockPos;
7import net.minecraft.core.registries.Registries;
8import net.minecraft.util.ExtraCodecs;
9import net.minecraft.util.RandomSource;
10import net.minecraft.world.level.levelgen.placement.PlacementContext;
11import net.minecraft.world.level.levelgen.placement.PlacementFilter;
12import net.minecraft.world.level.levelgen.placement.PlacementModifier;
13import net.minecraft.world.level.levelgen.placement.PlacementModifierType;
14import org.jspecify.annotations.NonNull;
15
16import static net.lerariemann.infinity.InfinityMod.MOD_ID;
17
18public class ModPlacementModifiers {
19 public static class CenterProximityPlacementModifier extends PlacementFilter {
20 public static final MapCodec<CenterProximityPlacementModifier> MODIFIER_CODEC = (ExtraCodecs.POSITIVE_INT.fieldOf("radius")).xmap(
21 CenterProximityPlacementModifier::new, a -> a.radius);
22 private final int radius;
23
24 private CenterProximityPlacementModifier(int radius) {
25 this.radius = radius;
26 }
27
28 public static CenterProximityPlacementModifier of(int radius) {
29 return new CenterProximityPlacementModifier(radius);
30 }
31
32 @Override
33 protected boolean shouldPlace(PlacementContext context, RandomSource random, BlockPos pos) {
34 return pos.getX()*pos.getX() + pos.getY()*pos.getY() + pos.getZ()*pos.getZ() < this.radius*this.radius;
35 }
36
37 @Override
38 public @NonNull PlacementModifierType<?> type() {
39 return PlacementModifierType.RARITY_FILTER;
40 }
41 }
42
43 public static final DeferredRegister<PlacementModifierType<?>> PLACEMENT_MODIFIER_TYPES = DeferredRegister.create(MOD_ID, Registries.PLACEMENT_MODIFIER_TYPE);
44 public static final RegistrySupplier<PlacementModifierType<?>> PROXIMITY = register("center_proximity",
45 CenterProximityPlacementModifier.MODIFIER_CODEC);
46
47 static <P extends PlacementModifier> PlacementModifierType<P> getType(MapCodec<P> codec) {
48 //? if >1.21 {
49 return () -> codec;
50 //?} else {
51 /*return codec::codec;
52 *///?}
53 }
54 static RegistrySupplier<PlacementModifierType<?>> register(String id, MapCodec<? extends PlacementModifier> codec) {
55 return PLACEMENT_MODIFIER_TYPES.register(id, () -> getType(codec));
56 }
57 public static void registerModifiers() {
58 PLACEMENT_MODIFIER_TYPES.register();
59 }
60}