Merge pull request #706 from kami-blue/feature/eflight#616

Feature/eflight#616
This commit is contained in:
Dominika 2020-04-15 15:24:58 -04:00 committed by GitHub
commit bbc8514bf7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 179 additions and 6 deletions

View File

@ -0,0 +1,5 @@
package me.zeroeightsix.kami.event.events;
import me.zeroeightsix.kami.event.KamiEvent;
public class PlayerTravelEvent extends KamiEvent {}

View File

@ -0,0 +1,30 @@
package me.zeroeightsix.kami.mixin.client;
import me.zeroeightsix.kami.KamiMod;
import me.zeroeightsix.kami.event.events.PlayerTravelEvent;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.MoverType;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.world.World;
import org.spongepowered.asm.mixin.Mixin;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
@Mixin(value = EntityPlayer.class, priority = Integer.MAX_VALUE)
public abstract class MixinEntityPlayer extends EntityLivingBase {
public MixinEntityPlayer(World worldIn) {
super(worldIn);
}
@Inject(method = "travel", at = @At("HEAD"), cancellable = true)
public void travel(float strafe, float vertical, float forward, CallbackInfo info) {
PlayerTravelEvent event = new PlayerTravelEvent();
KamiMod.EVENT_BUS.post(event);
if (event.isCancelled()) {
move(MoverType.SELF, motionX, motionY, motionZ);
info.cancel();
}
}
}

View File

@ -1,39 +1,169 @@
package me.zeroeightsix.kami.module.modules.movement;
import me.zero.alpine.listener.EventHandler;
import me.zero.alpine.listener.Listener;
import me.zeroeightsix.kami.event.events.PacketEvent;
import me.zeroeightsix.kami.event.events.PlayerTravelEvent;
import me.zeroeightsix.kami.module.Module;
import me.zeroeightsix.kami.setting.Setting;
import me.zeroeightsix.kami.setting.Settings;
import net.minecraft.network.play.client.CPacketEntityAction;
import net.minecraft.network.play.client.CPacketPlayer;
import net.minecraft.network.play.server.SPacketPlayerPosLook;
import net.minecraft.util.math.MathHelper;
import java.util.Objects;
import static me.zeroeightsix.kami.KamiMod.MODULE_MANAGER;
import static me.zeroeightsix.kami.util.MessageSendHelper.sendChatMessage;
import static me.zeroeightsix.kami.util.MessageSendHelper.sendErrorMessage;
/**
* Created by 086 on 11/04/2018.
* Updated by Itistheend on 28/12/19.
* Updated by S-B99 on 06/03/20
* Updated by S-B99 on 15/04/20
*/
@Module.Info(name = "ElytraFlight", description = "Modifies elytras to fly at custom velocities and fall speeds", category = Module.Category.MOVEMENT)
public class ElytraFlight extends Module {
private Setting<ElytraFlightMode> mode = register(Settings.e("Mode", ElytraFlightMode.HIGHWAY));
private Setting<Boolean> defaultSetting = register(Settings.b("Defaults", false));
private Setting<Boolean> easyTakeOff = register(Settings.booleanBuilder("Easy Takeoff").withValue(true).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Boolean> easyTakeOff = register(Settings.booleanBuilder("Easy Takeoff H").withValue(true).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Boolean> hoverControl = register(Settings.booleanBuilder("Hover").withValue(false).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private Setting<Boolean> easyTakeOffControl = register(Settings.booleanBuilder("Easy Takeoff C").withValue(false).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private Setting<Boolean> timerControl = register(Settings.booleanBuilder("Takeoff Timer").withValue(false).withVisibility(v -> easyTakeOffControl.getValue() && mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private Setting<TakeoffMode> takeOffMode = register(Settings.enumBuilder(TakeoffMode.class).withName("Takeoff Mode").withValue(TakeoffMode.PACKET).withVisibility(v -> easyTakeOff.getValue() && mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Boolean> overrideMaxSpeed = register(Settings.booleanBuilder("Over Max Speed").withValue(false).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> speedHighway = register(Settings.floatBuilder("Speed H").withValue(1.8f).withMaximum(1.8f).withVisibility(v -> !overrideMaxSpeed.getValue() && mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> speedControl = register(Settings.floatBuilder("Speed C").withValue(1.8f).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private Setting<Float> speedHighwayOverride = register(Settings.floatBuilder("Speed H O").withValue(1.8f).withVisibility(v -> overrideMaxSpeed.getValue() && mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> fallSpeedHighway = register(Settings.floatBuilder("Fall Speed H").withValue(0.000050000002f).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> fallSpeed = register(Settings.floatBuilder("Fall Speed").withValue(-.003f).withVisibility(v -> !mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> fallSpeedControl = register(Settings.floatBuilder("Fall Speed C").withValue(0.001f).withMaximum(0.3f).withMinimum(0.0f).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private Setting<Float> fallSpeed = register(Settings.floatBuilder("Fall Speed").withValue(-.003f).withVisibility(v -> !mode.getValue().equals(ElytraFlightMode.CONTROL) && !mode.getValue().equals(ElytraFlightMode.HIGHWAY)).build());
private Setting<Float> upSpeedBoost = register(Settings.floatBuilder("Up Speed B").withValue(0.08f).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.BOOST)).build());
private Setting<Float> downSpeedBoost = register(Settings.floatBuilder("Down Speed B").withValue(0.04f).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.BOOST)).build());
private Setting<Double> downSpeedControl = register(Settings.doubleBuilder("Down Speed C").withMaximum(10.0).withMinimum(0.0).withValue(2.0).withVisibility(v -> mode.getValue().equals(ElytraFlightMode.CONTROL)).build());
private ElytraFlightMode enabledMode;
private boolean hasDoneWarning;
/* Control mode states */
private double hoverTarget = -1.0;
public float packetYaw = 0.0f;
private boolean hoverState = false;
/* Control Mode */
@EventHandler
private Listener<PacketEvent.Send> sendListener = new Listener<>(event -> {
if (!mode.getValue().equals(ElytraFlightMode.CONTROL) || mc.player == null) return;
if (event.getPacket() instanceof CPacketPlayer) {
if (!mc.player.isElytraFlying()) return;
CPacketPlayer packet = (CPacketPlayer) event.getPacket();
packet.pitch = 0.0f;
packet.yaw = packetYaw;
}
if (event.getPacket() instanceof CPacketEntityAction && ((CPacketEntityAction) event.getPacket()).getAction() == CPacketEntityAction.Action.START_FALL_FLYING) {
hoverTarget = mc.player.posY + 0.35;
}
});
@EventHandler
private Listener<PacketEvent.Receive> receiveListener = new Listener<>(event -> {
if (!mode.getValue().equals(ElytraFlightMode.CONTROL) || mc.player == null || !mc.player.isElytraFlying()) return;
if (event.getPacket() instanceof SPacketPlayerPosLook) {
SPacketPlayerPosLook packet = (SPacketPlayerPosLook) event.getPacket();
packet.pitch = ElytraFlight.mc.player.rotationPitch;
}
});
@EventHandler
private Listener<PlayerTravelEvent> playerTravelListener = new Listener<>(event -> {
if (!mode.getValue().equals(ElytraFlightMode.CONTROL) || mc.player == null) return;
boolean doHover;
if (!mc.player.isElytraFlying()) {
if (easyTakeOffControl.getValue() && !mc.player.onGround && mc.player.motionY < -0.04) {
Objects.requireNonNull(mc.getConnection()).sendPacket(new CPacketEntityAction(mc.player, CPacketEntityAction.Action.START_FALL_FLYING));
if (timerControl.getValue()) mc.timer.tickLength = 200.0f;
event.cancel();
return;
}
return;
}
mc.timer.tickLength = 50.0f;
if (hoverTarget < 0.0) hoverTarget = mc.player.posY;
/* this is horrible but what other way to store these for later */
boolean moveForward = mc.gameSettings.keyBindForward.isKeyDown();
boolean moveBackward = mc.gameSettings.keyBindBack.isKeyDown();
boolean moveLeft = mc.gameSettings.keyBindLeft.isKeyDown();
boolean moveRight = mc.gameSettings.keyBindRight.isKeyDown();
boolean moveUp = mc.gameSettings.keyBindJump.isKeyDown();
boolean moveDown = mc.gameSettings.keyBindSneak.isKeyDown();
float moveForwardFactor = moveForward ? 1.0f : (float) (moveBackward ? -1 : 0);
float yawDeg = mc.player.rotationYaw;
if (moveLeft && (moveForward || moveBackward)) {
yawDeg -= 40.0f * moveForwardFactor;
} else if (moveRight && (moveForward || moveBackward)) {
yawDeg += 40.0f * moveForwardFactor;
} else if (moveLeft) {
yawDeg -= 90.0f;
} else if (moveRight) {
yawDeg += 90.0f;
}
if (moveBackward) yawDeg -= 180.0f;
packetYaw = yawDeg;
float yaw = (float) Math.toRadians(yawDeg);
double motionAmount = Math.sqrt(mc.player.motionX * mc.player.motionX + mc.player.motionZ * mc.player.motionZ);
hoverState = hoverState ? mc.player.posY < hoverTarget + 0.1 : mc.player.posY < hoverTarget + 0.0;
doHover = hoverState && hoverControl.getValue();
if (moveUp || moveForward || moveBackward || moveLeft || moveRight || MODULE_MANAGER.isModuleEnabled(AutoWalk.class)) {
if ((moveUp || doHover) && motionAmount > 1.0) {
if (mc.player.motionX == 0.0 && mc.player.motionZ == 0.0) {
mc.player.motionY = downSpeedControl.getValue();
} else {
double calcMotionDiff = motionAmount * 0.008;
mc.player.motionY += calcMotionDiff * 3.2;
mc.player.motionX -= (double) (-MathHelper.sin(yaw)) * calcMotionDiff / 1.0;
mc.player.motionZ -= (double) MathHelper.cos(yaw) * calcMotionDiff / 1.0;
mc.player.motionX *= 0.99f;
mc.player.motionY *= 0.98f;
mc.player.motionZ *= 0.99f;
}
} else { /* runs when pressing wasd */
mc.player.motionX = (double) (-MathHelper.sin(yaw)) * speedControl.getValue();
mc.player.motionY = -fallSpeedControl.getValue();
mc.player.motionZ = (double) MathHelper.cos(yaw) * speedControl.getValue();
}
} else { /* Stop moving if no inputs are pressed */
mc.player.motionX = 0.0;
mc.player.motionY = 0.0;
mc.player.motionZ = 0.0;
}
if (moveDown) {
mc.player.motionY = -downSpeedControl.getValue();
}
if (moveUp || moveDown) {
hoverTarget = mc.player.posY;
}
event.cancel();
});
/* End of Control Mode */
@Override
public void onUpdate() {
if (mc.player == null) return;
if (defaultSetting.getValue()) defaults();
if (enabledMode != mode.getValue() && !hasDoneWarning) {
sendErrorMessage("&l&cWARNING:&r Changing the mode while you're flying is not recommended. If you weren't flying you can ignore this message.");
hasDoneWarning = true;
}
if (mode.getValue().equals(ElytraFlightMode.CONTROL)) return;
takeOff();
setFlySpeed();
@ -111,12 +241,19 @@ public class ElytraFlight extends Module {
@Override
protected void onDisable() {
mc.timer.tickLength = 50.0f;
mc.player.capabilities.isFlying = false;
mc.player.capabilities.setFlySpeed(0.05f);
if (mc.player.capabilities.isCreativeMode) return;
mc.player.capabilities.allowFlying = false;
}
@Override
protected void onEnable() {
enabledMode = mode.getValue();
hoverTarget = -1.0; /* For control mode */
}
private void defaults() {
easyTakeOff.setValue(true);
takeOffMode.setValue(TakeoffMode.PACKET);
@ -128,8 +265,8 @@ public class ElytraFlight extends Module {
upSpeedBoost.setValue(0.08f);
downSpeedBoost.setValue(0.04f);
defaultSetting.setValue(false);
sendChatMessage(getChatName() + " Set to defaults!");
sendChatMessage(getChatName() + " Close and reopen the " + getName() + " settings menu to see changes");
sendChatMessage(getChatName() + "Set to defaults!");
sendChatMessage(getChatName() + "Close and reopen the " + getName() + " settings menu to see changes");
}
private float getHighwaySpeed() {
@ -140,6 +277,6 @@ public class ElytraFlight extends Module {
}
}
private enum ElytraFlightMode { BOOST, FLY, HIGHWAY }
private enum ElytraFlightMode { BOOST, FLY, CONTROL, HIGHWAY }
private enum TakeoffMode { CLIENT, PACKET }
}

View File

@ -13,6 +13,7 @@
"MixinEntity",
"MixinEntityLlama",
"MixinEntityPig",
"MixinEntityPlayer",
"MixinEntityPlayerSP",
"MixinEntityRenderer",
"MixinFrustum",