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