Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.features;
2
3import com.mojang.serialization.Codec;
4import com.mojang.serialization.codecs.RecordCodecBuilder;
5import java.util.HashMap;
6import java.util.HashSet;
7import java.util.List;
8import java.util.Map;
9import net.minecraft.core.BlockPos;
10import net.minecraft.core.Vec3i;
11import net.minecraft.util.RandomSource;
12import net.minecraft.util.valueproviders.FloatProvider;
13import net.minecraft.world.level.WorldGenLevel;
14import net.minecraft.world.level.block.state.BlockState;
15import net.minecraft.world.level.levelgen.feature.Feature;
16import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext;
17import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration;
18import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
19
20public class RandomShapeFeature extends Feature<RandomShapeFeature.Config> {
21 public RandomShapeFeature(Codec<Config> codec) {
22 super(codec);
23 }
24
25 @Override
26 public boolean place(FeaturePlaceContext<Config> context) {
27 WorldGenLevel structureWorldAccess = context.level();
28 RandomSource random = context.random();
29 BlockPos blockPos = context.origin();
30 Map<Integer, BlockState> blocks = new HashMap<>();
31 int r = (int)context.config().radius().sample(random);
32 boolean bl = context.config().useBands();
33 if (bl) for (int i = -3*r; i <= 3*r; i++) blocks.put(i, context.config().blockProvider().getState(random, blockPos.east(i)));
34 double p = context.config().pow();
35 double ia = 0.0;
36 double ra = Math.pow(r, p);
37 for (int i = 0; ia < ra; i++) {
38 double ja = 0.0;
39 for (int j = 0; ia + ja < ra; j++) {
40 double ka = 0.0;
41 for (int k = 0; ia + ja + ka < ra; k++) {
42 for (Vec3i v : signs(i, j, k)) {
43 BlockPos blockPos1 = blockPos.offset(v);
44 if (structureWorldAccess.isEmptyBlock(blockPos1) || context.config().replaceable().contains(structureWorldAccess.getBlockState(blockPos1)))
45 this.setBlock(structureWorldAccess, blockPos1, bl ? blocks.get(v.getX() + v.getY() + v.getZ()) :
46 context.config().blockProvider().getState(random, blockPos1));
47 }
48 ka = Math.pow(k+1, p);
49 }
50 ja = Math.pow(j+1, p);
51 }
52 ia = Math.pow(i+1, p);
53 }
54 return true;
55 }
56
57 static HashSet<Vec3i> signs(int i, int j, int k) {
58 HashSet<Vec3i> res = new HashSet<>();
59 res.add(new Vec3i(i, j, k));
60 res.add(new Vec3i(i, j, -k));
61 res.add(new Vec3i(i, -j, k));
62 res.add(new Vec3i(i, -j, -k));
63 res.add(new Vec3i(-i, j, k));
64 res.add(new Vec3i(-i, j, -k));
65 res.add(new Vec3i(-i, -j, k));
66 res.add(new Vec3i(-i, -j, -k));
67 return res;
68 }
69
70 public record Config(BlockStateProvider blockProvider, List<BlockState> replaceable, FloatProvider radius, double pow, boolean useBands) implements FeatureConfiguration {
71 public static final Codec<Config> CODEC = RecordCodecBuilder.create(instance -> instance.group(
72 (BlockStateProvider.CODEC.fieldOf("block_provider")).forGetter(a -> a.blockProvider),
73 (Codec.list(BlockState.CODEC).fieldOf("replaceable")).forGetter(a -> a.replaceable),
74 (FloatProvider.codec(2.0f, 20.0f).fieldOf("radius")).forGetter(a -> a.radius),
75 (Codec.DOUBLE.fieldOf("power")).orElse(2.0).forGetter(a -> a.pow),
76 (Codec.BOOL.fieldOf("use_bands")).orElse(false).forGetter(a -> a.useBands)).apply(
77 instance, Config::new));
78 }
79}