Search in sources :

Example 1 with ListGeneration

use of ivorius.reccomplex.world.gen.feature.structure.generic.generation.ListGeneration in project RecurrentComplex by Ivorforce.

the class WorldScriptStructureGenerator method prepareInstanceData.

@Override
public InstanceData prepareInstanceData(StructurePrepareContext context, BlockPos pos) {
    WorldScriptStructureGenerator.InstanceData instanceData = null;
    Random random = context.random;
    AxisAlignedTransform2D transform = context.transform;
    if (simpleMode) {
        if (structureNames.size() > 0) {
            String structureID = structureNames.get(random.nextInt(structureNames.size()));
            Structure<?> structure = StructureRegistry.INSTANCE.get(structureID);
            if (structure != null) {
                int rotations = structure.isRotatable() ? (structureRotation != null ? transform.getRotation() + structureRotation : random.nextInt(4)) : 0;
                boolean mirrorX = structure.isMirrorable() && (structureMirror != null ? transform.isMirrorX() != structureMirror : random.nextBoolean());
                AxisAlignedTransform2D strucTransform = AxisAlignedTransform2D.from(rotations, mirrorX);
                int[] strucSize = structure.size();
                BlockPos strucCoord = transform.apply(structureShift, new int[] { 1, 1, 1 }).subtract(transform.apply(BlockPos.ORIGIN, strucSize)).add(pos);
                instanceData = new WorldScriptStructureGenerator.InstanceData(structureID, null, strucCoord, strucTransform, new StructureGenerator<>(structure).seed(random.nextLong()).environment(context.environment).transform(strucTransform).lowerCoord(strucCoord).asSource(context.generateAsSource).instanceData().orElse(null));
            }
        }
    } else {
        Collection<Pair<Structure<?>, ListGeneration>> generationInfos = StructureRegistry.INSTANCE.getStructuresInList(structureListID, front).collect(Collectors.toList());
        if (generationInfos.size() > 0) {
            Pair<Structure<?>, ListGeneration> pair = WeightedSelector.select(random, generationInfos, item -> RCConfig.tweakedSpawnRate(StructureRegistry.INSTANCE.id(item.getLeft())) * item.getRight().getWeight());
            Structure<?> structure = pair.getLeft();
            String structureID = StructureRegistry.INSTANCE.id(structure);
            ListGeneration generationInfo = pair.getRight();
            boolean mirrorX;
            int rotations;
            if (front != null) {
                EnumFacing curFront = Directions.rotate(front, transform);
                mirrorX = structure.isMirrorable() && structure.isRotatable() && random.nextBoolean();
                Integer neededRotations = Directions.getHorizontalClockwiseRotations(curFront, generationInfo.front, mirrorX);
                rotations = neededRotations != null ? neededRotations : 0;
            } else {
                mirrorX = structure.isMirrorable() && random.nextBoolean();
                rotations = structure.isRotatable() ? random.nextInt(4) : 0;
            }
            AxisAlignedTransform2D strucTransform = AxisAlignedTransform2D.from(rotations, mirrorX);
            int[] strucSize = structure.size();
            BlockPos strucCoord = transform.apply(structureShift.add(generationInfo.shift), new int[] { 1, 1, 1 }).subtract(transform.apply(BlockPos.ORIGIN, strucSize)).add(pos);
            instanceData = new WorldScriptStructureGenerator.InstanceData(structureID, generationInfo.id(), strucCoord, strucTransform, new StructureGenerator<>(structure).seed(random.nextLong()).environment(context.environment).transform(strucTransform).asSource(context.generateAsSource).lowerCoord(strucCoord).instanceData().orElse(null));
        }
    }
    return instanceData != null ? instanceData : new WorldScriptStructureGenerator.InstanceData();
}
Also used : TableDataSourceWorldScriptStructureGenerator(ivorius.reccomplex.gui.worldscripts.structuregenerator.TableDataSourceWorldScriptStructureGenerator) AxisAlignedTransform2D(ivorius.ivtoolkit.math.AxisAlignedTransform2D) EnumFacing(net.minecraft.util.EnumFacing) NBTTagString(net.minecraft.nbt.NBTTagString) ListGeneration(ivorius.reccomplex.world.gen.feature.structure.generic.generation.ListGeneration) BlockPos(net.minecraft.util.math.BlockPos) Pair(org.apache.commons.lang3.tuple.Pair)

Aggregations

AxisAlignedTransform2D (ivorius.ivtoolkit.math.AxisAlignedTransform2D)1 TableDataSourceWorldScriptStructureGenerator (ivorius.reccomplex.gui.worldscripts.structuregenerator.TableDataSourceWorldScriptStructureGenerator)1 ListGeneration (ivorius.reccomplex.world.gen.feature.structure.generic.generation.ListGeneration)1 NBTTagString (net.minecraft.nbt.NBTTagString)1 EnumFacing (net.minecraft.util.EnumFacing)1 BlockPos (net.minecraft.util.math.BlockPos)1 Pair (org.apache.commons.lang3.tuple.Pair)1