57 lines
2.0 KiB
Java
57 lines
2.0 KiB
Java
package wtf.hak.survivalfabric.features.veinminer;
|
|
|
|
import net.minecraft.block.BlockState;
|
|
import net.minecraft.entity.Entity;
|
|
import net.minecraft.server.network.ServerPlayerEntity;
|
|
import net.minecraft.server.world.ServerWorld;
|
|
import net.minecraft.util.math.BlockPos;
|
|
import net.minecraft.world.World;
|
|
import wtf.hak.survivalfabric.features.veinminer.drills.LeavesDrill;
|
|
import wtf.hak.survivalfabric.features.veinminer.drills.OreDrill;
|
|
import wtf.hak.survivalfabric.features.veinminer.drills.WoodDrill;
|
|
|
|
public class VeinMinerEvents {
|
|
|
|
public static boolean beforeBlockBreak(World world, ServerPlayerEntity player, BlockPos pos, BlockState state) {
|
|
if (world.isClient) {
|
|
return true;
|
|
}
|
|
|
|
boolean isVeinMining = VeinMinerSession.sessionForPlayer(player) != null;
|
|
boolean canVeinMine = player.isInSneakingPose();
|
|
if (canVeinMine && !isVeinMining) {
|
|
VeinMinerSession session = VeinMinerSession.start(player, (ServerWorld) world, pos);
|
|
boolean shouldContinue = !mine(session);
|
|
session.finish();
|
|
return shouldContinue;
|
|
} else {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
public static void onEntityLoad(Entity entity, ServerWorld world) {
|
|
BlockPos pos = entity.getBlockPos();
|
|
VeinMinerSession session = VeinMinerSession.sessionForPosition(pos);
|
|
if (session != null) {
|
|
entity.setPos(session.initialPos.getX(), session.initialPos.getY(), session.initialPos.getZ());
|
|
}
|
|
}
|
|
|
|
private static boolean mine(VeinMinerSession session) {
|
|
Drill[] drills = new Drill[]{
|
|
new OreDrill(session),
|
|
new WoodDrill(session),
|
|
new LeavesDrill(session)
|
|
};
|
|
|
|
BlockPos pos = session.initialPos;
|
|
BlockState blockState = session.world.getBlockState(pos);
|
|
for (Drill drill : drills) {
|
|
if (drill.canHandle(blockState) && drill.isRightTool(pos)) {
|
|
return drill.drill(pos);
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
} |