First working version of WorldEdit-like commands(!!!)
This commit is contained in:
parent
bc0f2b59da
commit
d1a0b735d9
30
src/api/java/baritone/api/schematic/AbstractSchematic.java
Normal file
30
src/api/java/baritone/api/schematic/AbstractSchematic.java
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
|
||||||
|
public abstract class AbstractSchematic implements ISchematic {
|
||||||
|
protected int x;
|
||||||
|
protected int y;
|
||||||
|
protected int z;
|
||||||
|
|
||||||
|
public AbstractSchematic(int x, int y, int z) {
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int widthX() {
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int heightY() {
|
||||||
|
return y;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int lengthZ() {
|
||||||
|
return z;
|
||||||
|
}
|
||||||
|
}
|
61
src/api/java/baritone/api/schematic/CompositeSchematic.java
Normal file
61
src/api/java/baritone/api/schematic/CompositeSchematic.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
public class CompositeSchematic extends AbstractSchematic {
|
||||||
|
private final List<CompositeSchematicEntry> schematics;
|
||||||
|
private CompositeSchematicEntry[] schematicArr;
|
||||||
|
|
||||||
|
private void recalcArr() {
|
||||||
|
schematicArr = schematics.toArray(new CompositeSchematicEntry[0]);
|
||||||
|
|
||||||
|
for (CompositeSchematicEntry entry : schematicArr) {
|
||||||
|
this.x = Math.max(x, entry.x + entry.schematic.widthX());
|
||||||
|
this.y = Math.max(y, entry.y + entry.schematic.heightY());
|
||||||
|
this.z = Math.max(z, entry.z + entry.schematic.lengthZ());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public CompositeSchematic(int x, int y, int z) {
|
||||||
|
super(x, y, z);
|
||||||
|
schematics = new ArrayList<>();
|
||||||
|
recalcArr();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void put(ISchematic extra, int x, int y, int z) {
|
||||||
|
schematics.add(new CompositeSchematicEntry(extra, x, y, z));
|
||||||
|
recalcArr();
|
||||||
|
}
|
||||||
|
|
||||||
|
private CompositeSchematicEntry getSchematic(int x, int y, int z, IBlockState currentState) {
|
||||||
|
for (CompositeSchematicEntry entry : schematicArr) {
|
||||||
|
if (x >= entry.x && y >= entry.y && z >= entry.z &&
|
||||||
|
entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState)) {
|
||||||
|
return entry;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
||||||
|
CompositeSchematicEntry entry = getSchematic(x, y, z, currentState);
|
||||||
|
return entry != null && entry.schematic.inSchematic(x - entry.x, y - entry.y, z - entry.z, currentState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBlockState desiredState(int x, int y, int z, IBlockState current) {
|
||||||
|
CompositeSchematicEntry entry = getSchematic(x, y, z, current);
|
||||||
|
|
||||||
|
if (entry == null) {
|
||||||
|
throw new IllegalStateException("couldn't find schematic for this position");
|
||||||
|
}
|
||||||
|
|
||||||
|
return entry.schematic.desiredState(x - entry.x, y - entry.y, z - entry.z, current);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,17 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
|
||||||
|
public class CompositeSchematicEntry {
|
||||||
|
public final ISchematic schematic;
|
||||||
|
public final int x;
|
||||||
|
public final int y;
|
||||||
|
public final int z;
|
||||||
|
|
||||||
|
public CompositeSchematicEntry(ISchematic schematic, int x, int y, int z) {
|
||||||
|
this.schematic = schematic;
|
||||||
|
this.x = x;
|
||||||
|
this.y = y;
|
||||||
|
this.z = z;
|
||||||
|
}
|
||||||
|
}
|
26
src/api/java/baritone/api/schematic/FillBomSchematic.java
Normal file
26
src/api/java/baritone/api/schematic/FillBomSchematic.java
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
public class FillBomSchematic extends AbstractSchematic {
|
||||||
|
private final BlockOptionalMeta bom;
|
||||||
|
|
||||||
|
public FillBomSchematic(int x, int y, int z, BlockOptionalMeta bom) {
|
||||||
|
super(x, y, z);
|
||||||
|
this.bom = bom;
|
||||||
|
}
|
||||||
|
|
||||||
|
public BlockOptionalMeta getBom() {
|
||||||
|
return bom;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBlockState desiredState(int x, int y, int z, IBlockState current) {
|
||||||
|
if (bom.matches(current)) {
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
|
||||||
|
return bom.getAnyBlockState();
|
||||||
|
}
|
||||||
|
}
|
25
src/api/java/baritone/api/schematic/MaskSchematic.java
Normal file
25
src/api/java/baritone/api/schematic/MaskSchematic.java
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
public abstract class MaskSchematic extends AbstractSchematic {
|
||||||
|
private final ISchematic schematic;
|
||||||
|
|
||||||
|
public MaskSchematic(ISchematic schematic) {
|
||||||
|
super(schematic.widthX(), schematic.heightY(), schematic.lengthZ());
|
||||||
|
this.schematic = schematic;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected abstract boolean partOfMask(int x, int y, int z, IBlockState currentState);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean inSchematic(int x, int y, int z, IBlockState currentState) {
|
||||||
|
return schematic.inSchematic(x, y, z, currentState) && partOfMask(x, y, z, currentState);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBlockState desiredState(int x, int y, int z, IBlockState current) {
|
||||||
|
return schematic.desiredState(x, y, z, current);
|
||||||
|
}
|
||||||
|
}
|
14
src/api/java/baritone/api/schematic/ShellSchematic.java
Normal file
14
src/api/java/baritone/api/schematic/ShellSchematic.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
public class ShellSchematic extends MaskSchematic {
|
||||||
|
public ShellSchematic(ISchematic schematic) {
|
||||||
|
super(schematic);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
||||||
|
return x == 0 || y == 0 || z == 0 || x == widthX() - 1 || y == heightY() - 1 || z == lengthZ() - 1;
|
||||||
|
}
|
||||||
|
}
|
14
src/api/java/baritone/api/schematic/WallsSchematic.java
Normal file
14
src/api/java/baritone/api/schematic/WallsSchematic.java
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
package baritone.api.schematic;
|
||||||
|
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
|
import net.minecraft.block.state.IBlockState;
|
||||||
|
|
||||||
|
public class WallsSchematic extends MaskSchematic {
|
||||||
|
public WallsSchematic(ISchematic schematic) {
|
||||||
|
super(schematic);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean partOfMask(int x, int y, int z, IBlockState currentState) {
|
||||||
|
return x == 0 || z == 0 || x == widthX() - 1 || z == lengthZ() - 1;
|
||||||
|
}
|
||||||
|
}
|
@ -31,7 +31,6 @@ import net.minecraft.block.BlockDoublePlant;
|
|||||||
import net.minecraft.block.BlockFence;
|
import net.minecraft.block.BlockFence;
|
||||||
import net.minecraft.block.BlockFire;
|
import net.minecraft.block.BlockFire;
|
||||||
import net.minecraft.block.BlockGrass;
|
import net.minecraft.block.BlockGrass;
|
||||||
import net.minecraft.block.BlockHorizontal;
|
|
||||||
import net.minecraft.block.BlockLeaves;
|
import net.minecraft.block.BlockLeaves;
|
||||||
import net.minecraft.block.BlockLever;
|
import net.minecraft.block.BlockLever;
|
||||||
import net.minecraft.block.BlockLog;
|
import net.minecraft.block.BlockLog;
|
||||||
@ -323,4 +322,12 @@ public final class BlockOptionalMeta {
|
|||||||
//noinspection deprecation
|
//noinspection deprecation
|
||||||
return Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata());
|
return Block.getBlockFromItem(stack.getItem()).getStateFromMeta(stack.getMetadata());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IBlockState getAnyBlockState() {
|
||||||
|
if (blockstates.size() > 0) {
|
||||||
|
return blockstates.iterator().next();
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,15 +19,25 @@ package baritone.api.utils.command.defaults;
|
|||||||
|
|
||||||
import baritone.api.Settings;
|
import baritone.api.Settings;
|
||||||
import baritone.api.event.events.RenderEvent;
|
import baritone.api.event.events.RenderEvent;
|
||||||
|
import baritone.api.schematic.CompositeSchematic;
|
||||||
|
import baritone.api.schematic.FillBomSchematic;
|
||||||
|
import baritone.api.schematic.ShellSchematic;
|
||||||
|
import baritone.api.schematic.WallsSchematic;
|
||||||
|
import baritone.api.selection.ISelection;
|
||||||
import baritone.api.utils.BetterBlockPos;
|
import baritone.api.utils.BetterBlockPos;
|
||||||
|
import baritone.api.utils.BlockOptionalMeta;
|
||||||
import baritone.api.utils.IRenderer;
|
import baritone.api.utils.IRenderer;
|
||||||
|
import baritone.api.utils.ISchematic;
|
||||||
import baritone.api.utils.command.Command;
|
import baritone.api.utils.command.Command;
|
||||||
|
import baritone.api.utils.command.datatypes.ForBlockOptionalMeta;
|
||||||
import baritone.api.utils.command.datatypes.RelativeBlockPos;
|
import baritone.api.utils.command.datatypes.RelativeBlockPos;
|
||||||
import baritone.api.utils.command.exception.CommandInvalidStateException;
|
import baritone.api.utils.command.exception.CommandInvalidStateException;
|
||||||
import baritone.api.utils.command.exception.CommandInvalidTypeException;
|
import baritone.api.utils.command.exception.CommandInvalidTypeException;
|
||||||
import baritone.api.utils.command.helpers.arguments.ArgConsumer;
|
import baritone.api.utils.command.helpers.arguments.ArgConsumer;
|
||||||
import baritone.api.utils.command.helpers.tabcomplete.TabCompleteHelper;
|
import baritone.api.utils.command.helpers.tabcomplete.TabCompleteHelper;
|
||||||
|
import net.minecraft.init.Blocks;
|
||||||
import net.minecraft.util.math.AxisAlignedBB;
|
import net.minecraft.util.math.AxisAlignedBB;
|
||||||
|
import net.minecraft.util.math.Vec3i;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
@ -75,6 +85,46 @@ public class SelCommand extends Command {
|
|||||||
"Removed %d selections",
|
"Removed %d selections",
|
||||||
baritone.getSelectionManager().removeAllSelections().length
|
baritone.getSelectionManager().removeAllSelections().length
|
||||||
));
|
));
|
||||||
|
} else {
|
||||||
|
BlockOptionalMeta type = action == Action.CLEARAREA
|
||||||
|
? new BlockOptionalMeta(Blocks.AIR)
|
||||||
|
: args.getDatatypeFor(ForBlockOptionalMeta.class);
|
||||||
|
args.requireMax(0);
|
||||||
|
ISelection[] selections = baritone.getSelectionManager().getSelections();
|
||||||
|
|
||||||
|
if (selections.length == 0) {
|
||||||
|
throw new CommandInvalidStateException("No selections");
|
||||||
|
}
|
||||||
|
|
||||||
|
BetterBlockPos origin = selections[0].min();
|
||||||
|
CompositeSchematic composite = new CompositeSchematic(0, 0, 0);
|
||||||
|
|
||||||
|
for (ISelection selection : selections) {
|
||||||
|
BetterBlockPos min = selection.min();
|
||||||
|
origin = new BetterBlockPos(
|
||||||
|
Math.min(origin.x, min.x),
|
||||||
|
Math.min(origin.y, min.y),
|
||||||
|
Math.min(origin.z, min.z)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ISelection selection : selections) {
|
||||||
|
Vec3i size = selection.size();
|
||||||
|
BetterBlockPos min = selection.min();
|
||||||
|
|
||||||
|
ISchematic schematic = new FillBomSchematic(size.getX(), size.getY(), size.getZ(), type);
|
||||||
|
|
||||||
|
if (action == Action.WALLS) {
|
||||||
|
schematic = new WallsSchematic(schematic);
|
||||||
|
} else if (action == Action.SHELL) {
|
||||||
|
schematic = new ShellSchematic(schematic);
|
||||||
|
}
|
||||||
|
|
||||||
|
composite.put(schematic, min.x - origin.x, min.y - origin.y, min.z - origin.z);
|
||||||
|
}
|
||||||
|
|
||||||
|
baritone.getBuilderProcess().build("Fill", composite, origin);
|
||||||
|
logDirect("Filling now");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -112,7 +162,11 @@ public class SelCommand extends Command {
|
|||||||
enum Action {
|
enum Action {
|
||||||
POS1("pos1", "p1"),
|
POS1("pos1", "p1"),
|
||||||
POS2("pos2", "p2"),
|
POS2("pos2", "p2"),
|
||||||
CLEAR("clear", "c");
|
CLEAR("clear", "c"),
|
||||||
|
SET("set", "fill", "s", "f"),
|
||||||
|
WALLS("walls", "w"),
|
||||||
|
SHELL("shell", "sh"),
|
||||||
|
CLEARAREA("cleararea", "ca");
|
||||||
|
|
||||||
private final String[] names;
|
private final String[] names;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user