use of ivorius.ivtoolkit.blocks.BlockArea in project RecurrentComplex by Ivorforce.
the class CommandSelectCopy method execute.
@Override
public void execute(MockWorld world, ICommandSender commandSender, String[] args) throws CommandException {
RCEntityInfo RCEntityInfo = RCCommands.getStructureEntityInfo(commandSender, null);
SelectionOwner selectionOwner = RCCommands.getSelectionOwner(commandSender, null, true);
RCCommands.assertSize(commandSender, selectionOwner);
BlockArea area = selectionOwner.getSelection();
IvWorldData worldData = IvWorldData.capture(world, area, true);
RCEntityInfo.setWorldDataClipboard(worldData.createTagCompound());
commandSender.sendMessage(ServerTranslations.format("commands.selectCopy.success", RCTextStyle.area(area)));
}
use of ivorius.ivtoolkit.blocks.BlockArea in project RecurrentComplex by Ivorforce.
the class CommandNaturalAll method execute.
@Override
public void execute(MockWorld world, ICommandSender commandSender, String[] args) throws CommandException {
RCParameters parameters = RCParameters.of(args);
SelectionOwner selectionOwner = RCCommands.getSelectionOwner(commandSender, null, true);
RCCommands.assertSize(commandSender, selectionOwner);
BlockArea area = selectionOwner.getSelection();
double expandFloor = parameters.get("floor-expansion").doubleAt(0).optional().orElse(1.);
int floorDistance = parameters.get("space-distance-to-floor").intAt(0).optional().orElse(0) + 1;
int maxClosedSides = parameters.get("space-max-closed-sides").intAt(1).optional().orElse(3);
CommandNaturalFloor.placeNaturalFloor(world, area, expandFloor);
CommandNaturalSpace.placeNaturalAir(world, area, 3, 3);
}
use of ivorius.ivtoolkit.blocks.BlockArea in project RecurrentComplex by Ivorforce.
the class TransformerNaturalAir method transform.
@Override
public void transform(InstanceData instanceData, Phase phase, StructureSpawnContext context, IvWorldData worldData, RunTransformer transformer) {
super.transform(instanceData, phase, context, worldData, transformer);
if (phase == Phase.AFTER) {
WorldServer world = context.environment.world;
IvBlockCollection blockCollection = worldData.blockCollection;
int[] areaSize = new int[] { blockCollection.width, blockCollection.height, blockCollection.length };
BlockPos lowerCoord = StructureBoundingBoxes.min(context.boundingBox);
// Remove dying foliage
HashSet<BlockPos> check = instanceData.cloud.keySet().stream().flatMap(pos -> new BlockArea(pos.subtract(new Vec3i(2, 2, 2)), pos.add(new Vec3i(2, 2, 2))).stream()).filter(pos -> !instanceData.cloud.containsKey(pos)).map(pos -> context.transform.apply(pos, areaSize).add(lowerCoord)).collect(Collectors.toCollection(HashSet::new));
Set<BlockPos> remove = new HashSet<>();
HashSet<BlockPos> start = new HashSet<>();
// Do each one separately, since each block needs to be connected to floor separately
check.forEach(checking -> {
start.add(checking);
if (visitRecursively(start, (changed, pos) -> {
IBlockState state = world.getBlockState(pos);
boolean isFoliage = RCBlockLogic.isFoliage(state, world, pos);
if (!RCBlockLogic.canStay(state, world, pos))
context.setBlock(pos, Blocks.AIR.getDefaultState(), 2);
else if (!isFoliage && !state.getBlock().isReplaceable(world, pos))
return false;
else if (isFoliage && remove.size() < MAX_TREE_SIZE && remove.add(pos))
neighbors(pos).forEach(changed::add);
return true;
})) {
remove.forEach(pos -> context.setBlock(pos, Blocks.AIR.getDefaultState(), 2));
}
start.clear();
remove.clear();
});
}
}
use of ivorius.ivtoolkit.blocks.BlockArea in project RecurrentComplex by Ivorforce.
the class CommandSelectDuplicate method execute.
@Override
public void execute(MinecraftServer server, ICommandSender commandSender, String[] args) throws CommandException {
RCParameters parameters = RCParameters.of(args, "mirror");
SelectionOwner selectionOwner = RCCommands.getSelectionOwner(commandSender, null, true);
BlockArea area = selectionOwner.getSelection();
BlockPos pos = parameters.pos("x", "y", "z", commandSender.getPosition(), false).require();
AxisAlignedTransform2D transform = parameters.transform("rotation", "mirror").optional().orElse(AxisAlignedTransform2D.ORIGINAL);
IvWorldData worldData = IvWorldData.capture(commandSender.getEntityWorld(), area, true);
NBTTagCompound worldDataCompound = worldData.createTagCompound();
GenericStructure structureInfo = GenericStructure.createDefaultStructure();
structureInfo.worldDataCompound = worldDataCompound;
OperationRegistry.queueOperation(new OperationGenerateStructure(structureInfo, null, transform, pos, true).prepare((WorldServer) commandSender.getEntityWorld()), commandSender);
}
use of ivorius.ivtoolkit.blocks.BlockArea in project RecurrentComplex by Ivorforce.
the class CommandSelectFill method execute.
@Override
public void execute(MockWorld world, ICommandSender commandSender, String[] args) throws CommandException {
RCParameters parameters = RCParameters.of(args);
Block dstBlock = parameters.mc().block(commandSender).require();
int[] dstMeta = parameters.rc().move(1).metadatas().optional().orElse(new int[1]);
List<IBlockState> dst = IntStream.of(dstMeta).mapToObj(m -> BlockStates.fromMetadata(dstBlock, m)).collect(Collectors.toList());
SelectionOwner selectionOwner = RCCommands.getSelectionOwner(commandSender, null, true);
RCCommands.assertSize(commandSender, selectionOwner);
String shape = parameters.get("shape").first().optional().orElse("cube");
BlockArea area = selectionOwner.getSelection();
BlockPos p1 = area.getPoint1();
BlockPos p2 = area.getPoint2();
switch(shape) {
case "cube":
for (BlockPos pos : area) {
IBlockState state = dst.get(world.rand().nextInt(dst.size()));
world.setBlockState(pos, state, 2);
}
break;
case "sphere":
{
double[] spheroidOrigin = new double[] { (p1.getX() + p2.getX()) * 0.5, (p1.getY() + p2.getY()) * 0.5, (p1.getZ() + p2.getZ()) * 0.5 };
int[] areaSize = area.areaSize();
double[] spheroidSize = new double[] { areaSize[0] * 0.5, areaSize[1] * 0.5, areaSize[2] * 0.5 };
for (BlockPos coord : area) {
double[] coordPoint = new double[] { coord.getX(), coord.getY(), coord.getZ() };
if (IvShapeHelper.isPointInSpheroid(coordPoint, spheroidOrigin, spheroidSize)) {
IBlockState state = dst.get(world.rand().nextInt(dst.size()));
world.setBlockState(coord, state, 2);
}
}
break;
}
default:
throw new WrongUsageException(getUsage(commandSender));
}
}
Aggregations