Inspired by 2020's April Fools' 20w14infinite Snapshot, this mod brings endless randomly generated dimensions into Minecraft.
1package net.lerariemann.infinity.structure;
2
3import net.lerariemann.infinity.util.var.TextData;
4import net.lerariemann.infinity.registry.core.ModStructureTypes;
5import net.minecraft.core.BlockPos;
6import net.minecraft.core.Direction;
7import net.minecraft.nbt.CompoundTag;
8import net.minecraft.util.RandomSource;
9import net.minecraft.world.level.ChunkPos;
10import net.minecraft.world.level.StructureManager;
11import net.minecraft.world.level.WorldGenLevel;
12import net.minecraft.world.level.block.Blocks;
13import net.minecraft.world.level.chunk.ChunkGenerator;
14import net.minecraft.world.level.levelgen.feature.stateproviders.BlockStateProvider;
15import net.minecraft.world.level.levelgen.structure.BoundingBox;
16import net.minecraft.world.level.levelgen.structure.ScatteredFeaturePiece;
17import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType;
18import org.jetbrains.annotations.NotNull;
19
20import java.util.List;
21
22public class LetterPiece extends ScatteredFeaturePiece {
23 List<Integer> letter;
24 BlockStateProvider block;
25 int ori;
26
27 protected LetterPiece(StructurePieceType type, int x, int y, int z, int width, int height, int depth,
28 int ori, List<Integer> letter, BlockStateProvider block) {
29 super(type, x, y, z, width, height, depth, Direction.SOUTH);
30 this.letter = letter;
31 this.block = block;
32 this.ori = ori;
33 }
34
35 public LetterPiece(CompoundTag nbt) {
36 super(ModStructureTypes.LETTER.get(), nbt);
37 }
38
39 static LetterPiece of(BlockPos startcorner, int ori, @NotNull List<Integer> letter, BlockStateProvider block) {
40 BlockPos dims = getDimensions(ori, letter.size());
41 BlockPos othercoord = startcorner.offset(dims);
42 return new LetterPiece(ModStructureTypes.LETTER.get(),
43 Math.min(startcorner.getX(), othercoord.getX()),
44 Math.min(startcorner.getY(), othercoord.getY()),
45 Math.min(startcorner.getZ(), othercoord.getZ()),
46 Math.abs(dims.getX()), Math.abs(dims.getY()), Math.abs(dims.getZ()), ori, letter, block);
47 }
48
49 static BlockPos getDimensions(int ori, int letterwidth) {
50 return TextData.mutate(BlockPos.ZERO, ori, 8, letterwidth+1, 8, 0, 0, 0);
51 }
52
53 @Override
54 public void postProcess(WorldGenLevel world, StructureManager structureAccessor, ChunkGenerator chunkGenerator, RandomSource random, BoundingBox chunkBox, ChunkPos chunkPos, BlockPos pivot) {
55 int j, k;
56 if (letter == null) return;
57
58 for (j = 0; j < letter.size(); j++) {
59 for (k = 0; k < 8; k++) {
60 BlockPos bp = TextData.mutate(BlockPos.ZERO, ori, k, j, 0, 8, letter.size(), 8);
61 this.placeBlock(world,
62 ((letter.get(j) >> k)%2 == 1) ? block.getState(random, bp) : Blocks.AIR.defaultBlockState(),
63 bp.getX(), bp.getY(), bp.getZ(), chunkBox);
64 }
65 }
66 }
67}