forked from TheBrokenRail/EnergonRelics
133 lines
5.6 KiB
Java
133 lines
5.6 KiB
Java
package com.thebrokenrail.energonrelics.block.structure;
|
|
|
|
import com.thebrokenrail.energonrelics.EnergonRelics;
|
|
import com.thebrokenrail.energonrelics.block.entity.structure.StructureGeneratorBlockEntity;
|
|
import com.thebrokenrail.energonrelics.block.util.SimpleBlockWithEntity;
|
|
import com.thebrokenrail.energonrelics.structure.researchcomplex.ResearchComplexStartPart;
|
|
import com.thebrokenrail.energonrelics.structure.researchcomplex.ResearchComplexState;
|
|
import net.earthcomputer.libstructure.LibStructure;
|
|
import net.fabricmc.fabric.api.object.builder.v1.block.FabricBlockSettings;
|
|
import net.minecraft.block.Block;
|
|
import net.minecraft.block.BlockState;
|
|
import net.minecraft.block.Blocks;
|
|
import net.minecraft.block.entity.BlockEntity;
|
|
import net.minecraft.block.entity.BlockEntityType;
|
|
import net.minecraft.server.world.ServerWorld;
|
|
import net.minecraft.state.StateManager;
|
|
import net.minecraft.state.property.DirectionProperty;
|
|
import net.minecraft.state.property.Properties;
|
|
import net.minecraft.structure.StructurePieceType;
|
|
import net.minecraft.util.BlockMirror;
|
|
import net.minecraft.util.BlockRotation;
|
|
import net.minecraft.util.Identifier;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.util.math.Direction;
|
|
import net.minecraft.util.registry.Registry;
|
|
import net.minecraft.world.World;
|
|
import net.minecraft.world.biome.Biome;
|
|
import net.minecraft.world.gen.GenerationStep;
|
|
import net.minecraft.world.gen.chunk.StructureConfig;
|
|
import net.minecraft.world.gen.feature.DefaultFeatureConfig;
|
|
import net.minecraft.world.gen.feature.FeatureConfig;
|
|
import net.minecraft.world.gen.feature.StructureFeature;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.Map;
|
|
import java.util.Random;
|
|
import java.util.function.Function;
|
|
|
|
@SuppressWarnings("deprecation")
|
|
public class StructureGeneratorBlock extends SimpleBlockWithEntity {
|
|
public static final DirectionProperty HORIZONTAL_FACING = Properties.HORIZONTAL_FACING;
|
|
|
|
private static final Map<String, StructureGeneratorBlock> blocks = new HashMap<>();
|
|
|
|
private final StructureGeneratorBlockEntity.StructurePartFactory structureFactory;
|
|
private final StructureConfig structureConfig;
|
|
|
|
private final StructureFeature<DefaultFeatureConfig> feature = new StructureGeneratorFeature(this);
|
|
final StructurePieceType piece = (structureManager, tag) -> new StructureGeneratorPiece(this, tag);
|
|
|
|
private StructureGeneratorBlock(StructureGeneratorBlockEntity.StructurePartFactory structureFactory, StructureConfig structureConfig) {
|
|
super(FabricBlockSettings.copy(Blocks.BEDROCK));
|
|
setDefaultState(getDefaultState().with(HORIZONTAL_FACING, Direction.NORTH));
|
|
this.structureFactory = structureFactory;
|
|
this.structureConfig = structureConfig;
|
|
}
|
|
|
|
@Override
|
|
public BlockState rotate(BlockState state, BlockRotation rotation) {
|
|
return state.with(HORIZONTAL_FACING, rotation.rotate(state.get(HORIZONTAL_FACING)));
|
|
}
|
|
|
|
@Override
|
|
public BlockState mirror(BlockState state, BlockMirror mirror) {
|
|
return state.rotate(mirror.getRotation(state.get(HORIZONTAL_FACING)));
|
|
}
|
|
|
|
@Override
|
|
protected boolean addToItemGroup() {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
protected void appendProperties(StateManager.Builder<Block, BlockState> builder) {
|
|
super.appendProperties(builder);
|
|
builder.add(HORIZONTAL_FACING);
|
|
}
|
|
|
|
@Override
|
|
protected Function<BlockEntityType<BlockEntity>, BlockEntity> getFactory() {
|
|
return type -> new StructureGeneratorBlockEntity(type, structureFactory);
|
|
}
|
|
|
|
@Override
|
|
public void scheduledTick(BlockState state, ServerWorld world, BlockPos pos, Random random) {
|
|
super.scheduledTick(state, world, pos, random);
|
|
BlockEntity entity = world.getBlockEntity(pos);
|
|
if (entity instanceof StructureGeneratorBlockEntity) {
|
|
((StructureGeneratorBlockEntity) entity).generate();
|
|
}
|
|
}
|
|
|
|
@Override
|
|
public void onBlockAdded(BlockState state, World world, BlockPos pos, BlockState oldState, boolean notify) {
|
|
super.onBlockAdded(state, world, pos, oldState, notify);
|
|
schedule(world, pos);
|
|
}
|
|
|
|
public void schedule(World world, BlockPos pos) {
|
|
world.getBlockTickScheduler().schedule(pos, this, 0);
|
|
}
|
|
|
|
@Override
|
|
public void register(String name) {
|
|
super.register(name + "_generator");
|
|
}
|
|
|
|
@SuppressWarnings("SameParameterValue")
|
|
private static void create(String name, StructureGeneratorBlockEntity.StructurePartFactory factory, StructureConfig config) {
|
|
StructureGeneratorBlock block = new StructureGeneratorBlock(factory, config);
|
|
blocks.put(name, block);
|
|
|
|
Registry.register(Registry.STRUCTURE_PIECE, new Identifier(EnergonRelics.NAMESPACE, name + "_piece"), block.piece);
|
|
LibStructure.registerStructure(new Identifier(EnergonRelics.NAMESPACE, name), block.feature, GenerationStep.Feature.UNDERGROUND_STRUCTURES, block.structureConfig, block.feature.configure(FeatureConfig.DEFAULT));
|
|
}
|
|
|
|
public static void register() {
|
|
for (Map.Entry<String, StructureGeneratorBlock> entry : blocks.entrySet()) {
|
|
entry.getValue().register(entry.getKey());
|
|
}
|
|
}
|
|
|
|
public static void addToBiome(Biome biome) {
|
|
for (Map.Entry<String, StructureGeneratorBlock> entry : blocks.entrySet()) {
|
|
biome.addStructureFeature(entry.getValue().feature.configure(DefaultFeatureConfig.INSTANCE));
|
|
}
|
|
}
|
|
|
|
static {
|
|
create("research_complex", (world, random, transformations) -> new ResearchComplexStartPart(new ResearchComplexState(world, random), transformations), new StructureConfig(32, 8, 14357618));
|
|
}
|
|
}
|