Added Vein Mining
This commit is contained in:
@ -0,0 +1,133 @@
|
||||
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);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user