diff --git a/src/main/java/carpet/commands/DrawCommand.java b/src/main/java/carpet/commands/DrawCommand.java index 9dd11be3..fe25bc44 100644 --- a/src/main/java/carpet/commands/DrawCommand.java +++ b/src/main/java/carpet/commands/DrawCommand.java @@ -71,7 +71,7 @@ public class DrawCommand { ) ) .then(literal("pyramid") - .then(literal("cone") + .then(literal("circular") .then(argument("center", BlockPosArgumentType.blockPos()) .then(argument("radius", IntegerArgumentType.integer(1)) .then(argument("height",IntegerArgumentType.integer(1)) @@ -159,6 +159,94 @@ public class DrawCommand { ) ) ) + .then(literal("square") + .then(argument("center", BlockPosArgumentType.blockPos()) + .then(argument("radius", IntegerArgumentType.integer(1)) + .then(argument("height",IntegerArgumentType.integer(1)) + .then(argument("pointing up?",BoolArgumentType.bool()) + .then(literal("x") + .then(argument("block", BlockStateArgumentType.blockState()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"x", + BlockStateArgumentType.getBlockState(c, "block"), null) + ) + .then(literal("replace") + .then(argument("filter", BlockPredicateArgumentType.blockPredicate()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"x", + BlockStateArgumentType.getBlockState(c, "block"), + BlockPredicateArgumentType.getBlockPredicate(c,"filter") + ) + ) + ) + ) + ) + ) + .then(literal("y") + .then(argument("block", BlockStateArgumentType.blockState()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"y", + BlockStateArgumentType.getBlockState(c, "block"), null) + ) + .then(literal("replace") + .then(argument("filter", BlockPredicateArgumentType.blockPredicate()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"y", + BlockStateArgumentType.getBlockState(c, "block"), + BlockPredicateArgumentType.getBlockPredicate(c,"filter") + ) + ) + ) + ) + ) + ) + .then(literal("z") + .then(argument("block", BlockStateArgumentType.blockState()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"z", + BlockStateArgumentType.getBlockState(c, "block"), null) + ) + .then(literal("replace") + .then(argument("filter", BlockPredicateArgumentType.blockPredicate()) + .executes((c) -> drawPyramid(c.getSource(), + BlockPosArgumentType.getBlockPos(c, "center"), + "square", + IntegerArgumentType.getInteger(c, "radius"), + IntegerArgumentType.getInteger(c, "height"), + BoolArgumentType.getBool(c,"pointing up?"),"z", + BlockStateArgumentType.getBlockState(c, "block"), + BlockPredicateArgumentType.getBlockPredicate(c,"filter") + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) + ) ); dispatcher.register(command); @@ -330,7 +418,7 @@ public class DrawCommand { return 1; } - private static int drawCircle(ServerCommandSource source, BlockPos pos, int offset, int radius, int height, boolean pointup, BlockStateArgument block, String orientation, + private static int drawCircle(ServerCommandSource source, BlockPos pos, int offset, int radius,BlockStateArgument block, String orientation, Predicate replacement, List list, BlockPos.Mutable mbpos){ int successes=0; if(orientation=="x"){ @@ -371,13 +459,35 @@ public class DrawCommand { return successes; } + + private static int drawSquare(ServerCommandSource source, BlockPos pos, int offset, int radius, BlockStateArgument block, String orientation, + Predicate replacement, List list, BlockPos.Mutable mbpos){ + int success=0; + + for(int axis1=-radius;axis1<=radius;++axis1){ + + for(int axis2=-radius;axis2<=radius;++axis2){ + if(orientation=="x"){ + success+=blockset(source, pos.getX()+offset, pos.getY()+axis1, pos.getZ()+axis2,replacement, list, mbpos, block); + } + if(orientation=="y"){ + success+=blockset(source, pos.getX()+axis1, pos.getY()+offset, pos.getZ()+axis2,replacement, list, mbpos, block); + } + if(orientation=="z"){ + success+=blockset(source, pos.getX()+axis2, pos.getY()+axis1, pos.getZ()+offset,replacement, list, mbpos, block); + } + } + } + + return success; + } private static int drawPyramid(ServerCommandSource source, BlockPos pos, String shape, int radius, int height, boolean pointup, String orientation, BlockStateArgument block, Predicate replacement) { return (int) drawPyramid(source, pos, radius, height, block, replacement, pointup, orientation, false, shape); } - private static double drawPyramid(ServerCommandSource source, BlockPos pos, int radius, int height,BlockStateArgument block, + private static double drawPyramid(ServerCommandSource source, BlockPos pos, int radius, int height, BlockStateArgument block, Predicate replacement, boolean pointup, String orientation, boolean solid, String shape) { int affected = 0; BlockPos.Mutable mbpos = new BlockPos.Mutable(pos); @@ -397,8 +507,13 @@ public class DrawCommand { if(pointup==false){ r=radius*i/height; } - affected+=drawCircle(source, pos, i, (int) Math.round(r), height, pointup, block, orientation, replacement, list, mbpos); - //circle(cx+_,cy,cz,'x',ceil(r),block) in scarpet implementation, _ is i here, and is added in offset parameter + if(shape=="circle"){ + affected+=drawCircle(source, pos, i, (int) Math.round(r), block, orientation, replacement, list, mbpos); + //circle(cx+_,cy,cz,'x',ceil(r),block) in scarpet implementation, _ is i here, and is added in offset parameter + } + if(shape=="square"){ + affected+=drawSquare(source, pos, i, (int) Math.round(r), block, orientation, replacement, list, mbpos); + } } CarpetSettings.impendingFillSkipUpdates = false;