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 net.lerariemann.infinity.util.InfinityMethods;
6import net.minecraft.core.BlockPos;
7import net.minecraft.core.Direction;
8import net.minecraft.util.RandomSource;
9import net.minecraft.world.level.WorldGenLevel;
10import net.minecraft.world.level.block.Blocks;
11import net.minecraft.world.level.block.DoorBlock;
12import net.minecraft.world.level.block.NoteBlock;
13import net.minecraft.world.level.block.piston.PistonBaseBlock;
14import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
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;
18
19public class NotesHouseFeature extends Feature<NotesHouseFeature.Config> {
20 public NotesHouseFeature(Codec<Config> codec) {
21 super(codec);
22 }
23
24 @Override
25 public boolean place(FeaturePlaceContext<Config> context) {
26 RandomSource random = context.random();
27 WorldGenLevel level = context.level();
28 BlockPos origin = context.origin();
29 int r = context.config().radius;
30 for (int i = -r; i <= r; i++) for (int j = -r; j <= r; j++) {
31 BlockPos local = origin.offset(i, 0, j);
32 if (!Blocks.IRON_DOOR.defaultBlockState().canSurvive(level, local)) continue;
33 boolean open = random.nextBoolean();
34 Direction dir = InfinityMethods.getRandomHorizontalDirection(random);
35 setBlock(level, local, Blocks.IRON_DOOR.defaultBlockState()
36 .setValue(DoorBlock.FACING, dir)
37 .setValue(DoorBlock.OPEN, open)
38 .setValue(DoorBlock.HALF, DoubleBlockHalf.LOWER));
39 setBlock(level, local.above(), Blocks.IRON_DOOR.defaultBlockState()
40 .setValue(DoorBlock.FACING, dir)
41 .setValue(DoorBlock.OPEN, open)
42 .setValue(DoorBlock.HALF, DoubleBlockHalf.UPPER));
43 setBlock(level, local.above(2), Blocks.STICKY_PISTON.defaultBlockState()
44 .setValue(PistonBaseBlock.FACING, Direction.UP)
45 .setValue(PistonBaseBlock.EXTENDED, false));
46 setBlock(level, local.above(3), Blocks.NOTE_BLOCK.defaultBlockState()
47 .setValue(NoteBlock.INSTRUMENT, InfinityMethods.getRandomInstrument())
48 .setValue(NoteBlock.NOTE, random.nextInt(24)));
49 }
50 return true;
51 }
52
53 public record Config(int radius) implements FeatureConfiguration {
54 public static final Codec<NotesHouseFeature.Config> CODEC = RecordCodecBuilder.create(instance -> instance.group(
55 (Codec.INT.fieldOf("radius")).forGetter(a -> a.radius)).apply(
56 instance, NotesHouseFeature.Config::new));
57 }
58}