package com.thebrokenrail.energonrelics.block.structure; import com.thebrokenrail.energonrelics.block.entity.structure.StructureGeneratorBlockEntity; import net.minecraft.block.BlockState; import net.minecraft.block.entity.BlockEntity; import net.minecraft.nbt.CompoundTag; import net.minecraft.structure.StructurePiece; import net.minecraft.util.BlockRotation; import net.minecraft.util.math.BlockBox; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.StructureAccessor; import net.minecraft.world.gen.chunk.ChunkGenerator; import java.util.Random; class StructureGeneratorPiece extends StructurePiece { private final StructureGeneratorBlock block; private final BlockRotation rotation; private final BlockPos pos; private boolean placed; private StructureGeneratorPiece(StructureGeneratorBlock block, BlockRotation rotation, BlockPos pos, boolean placed) { super(block.piece, 0); this.block = block; this.rotation = rotation; this.pos = pos; this.placed = placed; boundingBox = BlockBox.create(pos.getX(), pos.getY(), pos.getZ(), pos.getX() + 1, pos.getY() + 1, pos.getZ() + 1); } StructureGeneratorPiece(StructureGeneratorBlock block, BlockRotation rotation, BlockPos pos) { this(block, rotation, pos, false); } StructureGeneratorPiece(StructureGeneratorBlock block, CompoundTag tag) { this(block, BlockRotation.valueOf(tag.getString("Rot")), new BlockPos(tag.getInt("X"), tag.getInt("Y"), tag.getInt("Z")), tag.getBoolean("Placed")); } @Override protected void toNbt(CompoundTag tag) { tag.putString("Rot", rotation.name()); tag.putInt("X", pos.getX()); tag.putInt("Y", pos.getY()); tag.putInt("Z", pos.getZ()); tag.putBoolean("Placed", placed); } @Override public boolean generate(StructureWorldAccess world, StructureAccessor structureAccessor, ChunkGenerator chunkGenerator, Random random, BlockBox boundingBox, ChunkPos chunkPos, BlockPos blockPos) { if (!placed) { BlockState state = block.getDefaultState().rotate(rotation); world.setBlockState(pos, state, 3); BlockEntity entity = world.getBlockEntity(pos); if (entity instanceof StructureGeneratorBlockEntity) { ((StructureGeneratorBlockEntity) entity).setSeed(random.nextLong()); } block.schedule(world, pos); placed = true; } return true; } }