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; } }