package meteordevelopment.meteorclient.systems.modules.movement;
import meteordevelopment.meteorclient.events.packets.PacketEvent;
import meteordevelopment.meteorclient.events.world.TickEvent;
import meteordevelopment.meteorclient.settings.*;
import meteordevelopment.meteorclient.systems.modules.Categories;
import meteordevelopment.meteorclient.systems.modules.Module;
import meteordevelopment.orbit.EventHandler;
import net.minecraft.network.packet.c2s.play.PlayerMoveC2SPacket;
import net.minecraft.network.packet.s2c.play.PlayerPositionLookS2CPacket;
import net.minecraft.util.hit.BlockHitResult;
import net.minecraft.util.hit.HitResult;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.Direction;
public class MatrixFly extends Module {
private final SettingGroup sgGeneral = settings.getDefaultGroup();
private final Setting<Double> jumpHeight = sgGeneral.add(new DoubleSetting.Builder()
.name("jump-height")
.description("Высота прыжка.")
.defaultValue(3.5)
.min(0.5)
.max(10.0)
.build()
);
private final Setting<Boolean> requireBlock = sgGeneral.add(new BoolSetting.Builder()
.name("require-block")
.description("Требовать блок перед игроком для активации.")
.defaultValue(true)
.build()
);
private final Setting<Double> blockDistance = sgGeneral.add(new DoubleSetting.Builder()
.name("block-distance")
.description("Максимальное расстояние до блока для активации.")
.defaultValue(3.0)
.min(1.0)
.max(3.0)
.visible(requireBlock::get)
.build()
);
private final Setting<Boolean> checkBlockFace = sgGeneral.add(new BoolSetting.Builder()
.name("check-block-face")
.description("Проверять, что игрок смотрит на грань блока.")
.defaultValue(true)
.visible(requireBlock::get)
.build()
);
private int boostMotion = 0;
private double launchY = 0;
public MatrixFly() {
super(Categories.Movement, "matrix-fly", "Буст Fly под Matrix 7.16.2");
}
@Override
public void onActivate() {
boostMotion = 0;
launchY = mc.player.getY();
}
@Override
public void onDeactivate() {
}
@EventHandler
private void onTick(TickEvent.Pre event) {
if (mc.player == null || mc.world == null) return;
if (requireBlock.get() && !isBlockInFront()) {
return;
}
switch (boostMotion) {
case 0:
double yaw = Math.toRadians(mc.player.getYaw());
mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(
mc.player.getX(),
mc.player.getY(),
mc.player.getZ(),
true
));
mc.getNetworkHandler().sendPacket(new PlayerMoveC2SPacket.PositionAndOnGround(
mc.player.getX() + -Math.sin(yaw) * 1.5,
mc.player.getY() + 1,
mc.player.getZ() + Math.cos(yaw) * 1.5,
false
));
boostMotion = 1;
break;
case 1:
break;
case 2:
mc.player.setVelocity(mc.player.getVelocity().x, calculateJumpVelocity(), mc.player.getVelocity().z);
boostMotion = 3;
break;
case 3:
if (mc.player.getY() < launchY - 1.0) {
boostMotion = 0;
launchY = mc.player.getY();
}
break;
}
}
@EventHandler
private void onPacketReceive(PacketEvent.Receive event) {
if (event.packet instanceof PlayerPositionLookS2CPacket) {
if (boostMotion == 1) {
boostMotion = 2;
}
}
}
private boolean isBlockInFront() {
HitResult hit = mc.crosshairTarget;
if (hit == null || hit.getType() != HitResult.Type.BLOCK) {
return false;
}
BlockHitResult blockHit = (BlockHitResult) hit;
BlockPos blockPos = blockHit.getBlockPos();
double distance = mc.player.getPos().distanceTo(blockPos.toCenterPos());
if (distance > blockDistance.get()) {
return false;
}
if (checkBlockFace.get()) {
Direction facing = blockHit.getSide();
return facing != null;
}
return true;
}
private double calculateJumpVelocity() {
return Math.sqrt(2 * 0.08 * jumpHeight.get());
}
}