This repository has been archived on 2023-11-26. You can view files and clone it, but cannot push or open issues or pull requests.
EnergonRelics/src/main/java/com/thebrokenrail/energonrelics/block/entity/structure/StructureGeneratorBlockEnti...

68 lines
2.2 KiB
Java

package com.thebrokenrail.energonrelics.block.entity.structure;
import com.thebrokenrail.energonrelics.block.structure.StructureGeneratorBlock;
import com.thebrokenrail.energonrelics.structure.StructurePart;
import com.thebrokenrail.energonrelics.structure.StructurePlacer;
import net.minecraft.block.BlockState;
import net.minecraft.block.entity.BlockEntity;
import net.minecraft.block.entity.BlockEntityType;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.util.math.Direction;
import net.minecraft.world.World;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Random;
public class StructureGeneratorBlockEntity extends BlockEntity {
public interface StructurePartFactory {
StructurePart<?> create(World world, Random random, List<StructurePart.Transformation> transformations);
}
private boolean hasSeed = false;
private long seed = 0;
private boolean generated = false;
private final StructurePartFactory factory;
public StructureGeneratorBlockEntity(BlockEntityType<?> type, StructurePartFactory factory) {
super(type);
this.factory = factory;
}
public void setSeed(long seed) {
hasSeed = true;
this.seed = seed;
}
@Override
public CompoundTag toTag(CompoundTag tag) {
super.toTag(tag);
tag.putBoolean("HasSeed", hasSeed);
tag.putLong("Seed", seed);
tag.putBoolean("Generated", generated);
return tag;
}
@Override
public void fromTag(BlockState state, CompoundTag tag) {
super.fromTag(state, tag);
hasSeed = tag.getBoolean("HasSeed");
seed = tag.getLong("Seed");
generated = tag.getBoolean("Generated");
}
public void generate() {
if (hasWorld() && !Objects.requireNonNull(getWorld()).isClient() && !generated) {
if (!hasSeed) {
seed = getWorld().random.nextLong();
}
Direction facing = getCachedState().get(StructureGeneratorBlock.HORIZONTAL_FACING);
generated = true;
new StructurePlacer(factory.create(getWorld(), new Random(seed), Collections.singletonList(StructurePart.directionToTransformation(facing)))).place(getWorld(), getPos());
}
}
}