baritone/schematic/SchematicBuilder.java
2018-08-01 11:34:35 -04:00

70 lines
2.7 KiB
Java

/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package baritone.schematic;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Map.Entry;
import baritone.Baritone;
import baritone.pathfinding.goals.GoalComposite;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.Tuple;
/**
*
* @author leijurv
*/
public class SchematicBuilder {
ArrayList<Tuple<BlockPos, Block>> plan = new ArrayList();
BlockPos offset;
Schematic schematic;
public SchematicBuilder(Schematic schematic, BlockPos offset) {
this.schematic = schematic;
this.offset = offset;
for (Entry<BlockPos, Block> entry : schematic.getEntries()) {
plan.add(new Tuple(offset(entry.getKey()), entry.getValue()));
}
}
public void tick() {
HashSet<BlockPos> goal = getAllBlocksToPlaceShiftedUp();
//Out.log("Ticking " + goal);
if (goal != null) {
Baritone.goal = new GoalComposite(goal);
if (Baritone.currentPath == null && !Baritone.isThereAnythingInProgress) {
Baritone.findPathInNewThread(false);
}
} else {
//Out.gui("done building", Out.Mode.Standard);
}
}
public HashSet<BlockPos> getAllBlocksToPlaceShiftedUp() {
HashSet<BlockPos> toPlace = new HashSet<BlockPos>();
Block air = Block.getBlockById(0);
for (int y = 0; y < schematic.getHeight(); y++) {
for (int x = 0; x < schematic.getWidth(); x++) {
for (int z = 0; z < schematic.getLength(); z++) {
BlockPos inSchematic = new BlockPos(x, y, z);
BlockPos inWorld = offset(inSchematic);
Block current = Minecraft.getMinecraft().world.getBlockState(inWorld).getBlock();
Block desired = schematic.getBlockFromBlockPos(inSchematic);
//Out.log(inSchematic + " " + current + " " + desired);
boolean currentlyAir = air.equals(current);
boolean shouldBeAir = desired == null || air.equals(desired);
if (currentlyAir && !shouldBeAir) {
toPlace.add(inWorld.up());
}
}
}
}
return toPlace.isEmpty() ? null : toPlace;
}
private BlockPos offset(BlockPos original) {
return new BlockPos(original.getX() + offset.getX(), original.getY() + offset.getY(), original.getZ() + offset.getZ());
}
}