Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
at master 79 lines 3.8 kB view raw
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}