133 lines
4.1 KiB
Java
133 lines
4.1 KiB
Java
package wtf.hak.survivalfabric.veinminer.drills;
|
|
import net.minecraft.block.BlockState;
|
|
|
|
import java.util.ArrayList;
|
|
|
|
import net.minecraft.server.network.ServerPlayerEntity;
|
|
import net.minecraft.text.MutableText;
|
|
import net.minecraft.text.PlainTextContent;
|
|
import net.minecraft.text.Text;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import wtf.hak.survivalfabric.veinminer.Drill;
|
|
import wtf.hak.survivalfabric.veinminer.VeinMinerSession;
|
|
|
|
import static wtf.hak.survivalfabric.SurvivalFabric.LOGGER;
|
|
|
|
public class DrillBase implements Drill {
|
|
|
|
protected VeinMinerSession session;
|
|
|
|
public DrillBase(VeinMinerSession session) {
|
|
this.session = session;
|
|
}
|
|
|
|
@Override
|
|
public boolean canHandle(BlockState blockId) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean drill(BlockPos blockPos) {
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public boolean isRightTool(BlockPos pos) {
|
|
var blockState = session.world.getBlockState(pos);
|
|
return session.player.getMainHandStack().isSuitableFor(blockState);
|
|
}
|
|
|
|
protected interface ForXYZHandler {
|
|
public void handle(BlockPos pos);
|
|
}
|
|
|
|
protected interface ForXYZCounter {
|
|
public int handle(BlockPos pos);
|
|
}
|
|
|
|
protected void forXYZ(BlockPos pos, int max, ForXYZHandler handler) {
|
|
forXYZ(pos, max, handlerPos -> {
|
|
handler.handle(handlerPos);
|
|
return 0;
|
|
}, false);
|
|
}
|
|
|
|
protected int forXYZ(BlockPos pos, int max, ForXYZCounter handler) {
|
|
return forXYZ(pos, max, handler, false);
|
|
}
|
|
|
|
protected void forXYZ(BlockPos pos, int max, ForXYZHandler handler, boolean forceVertical) {
|
|
forXYZ(pos, max, handlerPos -> {
|
|
handler.handle(handlerPos);
|
|
return 0;
|
|
}, forceVertical);
|
|
}
|
|
|
|
protected int forXYZ(BlockPos pos, int max, ForXYZCounter handler, boolean forceVertical) {
|
|
ArrayList<Integer> offsets = new ArrayList<Integer>();
|
|
for (int d = 0; d <= max; ++d) {
|
|
offsets.add(d);
|
|
if (d != -d) {
|
|
offsets.add(-d);
|
|
}
|
|
}
|
|
|
|
String[] order = new String[] { "x", "y", "z" };
|
|
if (forceVertical) {
|
|
order = new String[] { "y", "x", "z" };
|
|
}
|
|
else {
|
|
ServerPlayerEntity player = session.player;
|
|
boolean majorPitchChange = player.getPitch() < -45.0 || player.getPitch() > 45.0;
|
|
boolean majorYawChange = (player.getYaw() > 45.0 && player.getYaw() < 135.0) || (player.getYaw() < -45.0 && player.getYaw() > -135.0);
|
|
if (majorPitchChange) {
|
|
if (majorYawChange) {
|
|
order = new String[] { "y", "z", "x" };
|
|
}
|
|
else {
|
|
order = new String[] { "y", "x", "z" };
|
|
}
|
|
}
|
|
else {
|
|
if (majorYawChange) {
|
|
order = new String[] { "z", "y", "x" };
|
|
}
|
|
}
|
|
}
|
|
|
|
int counter = 0;
|
|
for (int i1: offsets) {
|
|
for (int i2: offsets) {
|
|
for (int i3: offsets) {
|
|
int ix = order[0] == "x" ? i1 : order[1] == "x" ? i2 : i3;
|
|
int iy = order[0] == "y" ? i1 : order[1] == "y" ? i2 : i3;
|
|
int iz = order[0] == "z" ? i1 : order[1] == "z" ? i2 : i3;
|
|
|
|
int px = pos.getX() + ix;
|
|
int py = pos.getY() + iy;
|
|
int pz = pos.getZ() + iz;
|
|
|
|
counter += handler.handle(new BlockPos(px, py, pz));
|
|
}
|
|
}
|
|
}
|
|
|
|
return counter;
|
|
}
|
|
|
|
protected boolean tryBreakBlock(BlockPos blockPos) {
|
|
session.addPosition(blockPos);
|
|
boolean success = isRightTool(blockPos) && session.player.interactionManager.tryBreakBlock(blockPos);
|
|
if (!success) {
|
|
session.removePosition(blockPos);
|
|
}
|
|
return success;
|
|
}
|
|
|
|
protected void _log(String message) {
|
|
PlainTextContent literal = new PlainTextContent.Literal(message);
|
|
Text text = MutableText.of(literal);
|
|
session.player.sendMessage(text);
|
|
LOGGER.info(message);
|
|
}
|
|
} |