raven-bs-v2/src/main/java/keystrokesmod/module/impl/movement/NoSlow.java

340 lines
13 KiB
Java

package keystrokesmod.module.impl.movement;
import keystrokesmod.Raven;
import keystrokesmod.event.*;
import keystrokesmod.mixin.impl.accessor.IAccessorItemFood;
import keystrokesmod.module.Module;
import keystrokesmod.module.ModuleManager;
import keystrokesmod.module.impl.player.Safewalk;
import keystrokesmod.module.setting.impl.ButtonSetting;
import keystrokesmod.module.setting.impl.DescriptionSetting;
import keystrokesmod.module.setting.impl.SliderSetting;
import keystrokesmod.utility.*;
import net.minecraft.block.*;
import net.minecraft.client.settings.KeyBinding;
import net.minecraft.enchantment.Enchantment;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.init.Items;
import net.minecraft.item.*;
import net.minecraft.network.play.client.C02PacketUseEntity;
import net.minecraft.network.play.client.C07PacketPlayerDigging;
import net.minecraft.network.play.client.C08PacketPlayerBlockPlacement;
import net.minecraft.network.play.client.C09PacketHeldItemChange;
import net.minecraft.potion.PotionEffect;
import net.minecraft.util.BlockPos;
import net.minecraftforge.client.event.MouseEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import org.lwjgl.input.Mouse;
public class NoSlow extends Module {
public SliderSetting mode;
public static SliderSetting slowed;
public static ButtonSetting disableBow;
public static ButtonSetting disablePotions;
public static ButtonSetting swordOnly;
public static ButtonSetting vanillaSword;
public static ButtonSetting groundSpeedOption;
private String[] modes = new String[]{"Vanilla", "Pre", "Post", "Alpha", "Float"};
private boolean postPlace;
public static boolean canFloat;
private boolean reSendConsume, requireJump;
public static boolean noSlowing, offset, fix;
private int ticksOffStairs = 30;
private boolean setCancelled, didC;
private int grounded;
public NoSlow() {
super("NoSlow", category.movement, 0);
this.registerSetting(new DescriptionSetting("Default is 80% motion reduction."));
this.registerSetting(mode = new SliderSetting("Mode", 0, modes));
this.registerSetting(slowed = new SliderSetting("Slow %", 80.0D, 0.0D, 80.0D, 1.0D));
this.registerSetting(disableBow = new ButtonSetting("Disable bow", false));
this.registerSetting(disablePotions = new ButtonSetting("Disable potions", false));
this.registerSetting(swordOnly = new ButtonSetting("Sword only", false));
this.registerSetting(vanillaSword = new ButtonSetting("Vanilla sword", false));
this.registerSetting(groundSpeedOption = new ButtonSetting("Ground Speed", false));
}
@Override
public void onDisable() {
resetFloat();
}
public void onUpdate() {
if (ModuleManager.bedAura.stopAutoblock) {
return;
}
postPlace = false;
if (vanillaSword.isToggled() && Utils.holdingSword()) {
return;
}
boolean apply = getSlowed() != 0.2f;
if (!apply || !mc.thePlayer.isUsingItem()) {
return;
}
switch ((int) mode.getInput()) {
case 1:
if (mc.thePlayer.ticksExisted % 3 == 0 && !Raven.packetsHandler.C07.get()) {
mc.thePlayer.sendQueue.addToSendQueue(new C08PacketPlayerBlockPlacement(mc.thePlayer.getHeldItem()));
}
break;
case 2:
postPlace = true;
break;
case 3:
if (mc.thePlayer.ticksExisted % 3 == 0 && !Raven.packetsHandler.C07.get()) {
mc.thePlayer.sendQueue.addToSendQueue(new C08PacketPlayerBlockPlacement(new BlockPos(-1, -1, -1), 1, null, 0, 0, 0));
}
break;
case 4:
//
break;
}
}
@SubscribeEvent
public void onPostMotion(PostMotionEvent e) {
if (postPlace && mode.getInput() == 2) {
if (mc.thePlayer.ticksExisted % 3 == 0 && !Raven.packetsHandler.C07.get()) {
mc.thePlayer.sendQueue.addToSendQueue(new C08PacketPlayerBlockPlacement(mc.thePlayer.getHeldItem()));
}
postPlace = false;
}
}
@SubscribeEvent
public void onPostPlayerInput(PostPlayerInputEvent e) {
if (canFloat && noSlowing && offset && mc.thePlayer.onGround) {
if (groundSpeedOption.isToggled() && !Utils.jumpDown() && !ModuleManager.bhop.isEnabled() && Utils.keysDown() && !Utils.bowBackwards()) {
Utils.setSpeed(getFloatSpeed(getSpeedLevel()));
//Utils.print("ground speed");
}
}
handleFloatSetup();
}
@SubscribeEvent(priority = EventPriority.HIGHEST)
public void onMouse(MouseEvent e) {
handleFloatSetup();
if (setCancelled && e.button == 1) {
setCancelled = false;
e.setCanceled(true);
}
}
private void handleFloatSetup() {
if (mode.getInput() != 4 || canFloat || reSendConsume || requireJump || getSlowed() == 0.2f || BlockUtils.isInteractable(mc.objectMouseOver) || !Utils.tabbedIn()) {
return;
}
if (!Mouse.isButtonDown(1) || (mc.thePlayer.getHeldItem() == null || !holdingConsumable(mc.thePlayer.getHeldItem()))) {
return;
}
if (!mc.thePlayer.onGround) {
canFloat = true;
}
else {
KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), false);
setCancelled = true;
if (!Utils.jumpDown() && !ModuleManager.bhop.isEnabled()) {
mc.thePlayer.jump();
}
reSendConsume = true;
canFloat = false;
}
}
@SubscribeEvent
public void onSendPacket(SendPacketEvent e) {
if (!Utils.nullCheck()) {
return;
}
if (e.getPacket() instanceof C08PacketPlayerBlockPlacement) {
if (mode.getInput() != 4 || canFloat || reSendConsume || requireJump || getSlowed() == 0.2f || BlockUtils.isInteractable(mc.objectMouseOver) || !Utils.tabbedIn()) {
return;
}
if (!Mouse.isButtonDown(1) || (mc.thePlayer.getHeldItem() == null || !holdingConsumable(mc.thePlayer.getHeldItem()))) {
return;
}
e.setCanceled(true);
}
}
@SubscribeEvent
public void onPreMotion(PreMotionEvent e) {
/*Block blockBelow = BlockUtils.getBlock(new BlockPos(mc.thePlayer.posX, mc.thePlayer.posY - 1, mc.thePlayer.posZ));
Block block = BlockUtils.getBlock(new BlockPos(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ));
if (block instanceof BlockStairs || block instanceof BlockSlab && ModuleUtils.lastTickOnGround && ModuleUtils.lastTickPos1) {
ticksOffStairs = 0;
}
else {
ticksOffStairs++;
}*/
if (ModuleUtils.inAirTicks > 1) {
requireJump = false;
}
if (ModuleManager.bedAura.stopAutoblock || mode.getInput() != 4) {
resetFloat();
return;
}
postPlace = false;
if (!Mouse.isButtonDown(1) || (mc.thePlayer.getHeldItem() == null || !holdingConsumable(mc.thePlayer.getHeldItem()))) {
if (mc.thePlayer.getHeldItem() != null && holdingConsumable(mc.thePlayer.getHeldItem())) {
KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), false);
}
resetFloat();
return;
}
if (!floatConditions()) {
grounded = 0;
didC = true;
}
else if (didC) {
grounded++;
if (grounded > 30) {
fix = true;
}
}
if (reSendConsume) {
if (ModuleUtils.inAirTicks > 1) {
KeyBinding.setKeyBindState(mc.gameSettings.keyBindUseItem.getKeyCode(), true);
reSendConsume = false;
canFloat = true;
}
}
noSlowing = true;
if (!floatConditions() || requireJump) {
requireJump = true;
offset = false;
return;
}
e.setPosY(e.getPosY() + ModuleUtils.offsetValue);
offset = true;
if (groundSpeedOption.isToggled()) {
if (!ModuleManager.killAura.isTargeting && !Utils.noSlowingBackWithBow() && !Utils.jumpDown() && mc.thePlayer.moveForward <= -0.5 && mc.thePlayer.moveStrafing == 0 && offset && Utils.isMoving() && mc.thePlayer.onGround) {
float yaw = mc.thePlayer.rotationYaw;
e.setYaw(yaw - 55);
}
}
}
@SubscribeEvent(priority = EventPriority.LOWEST) // called last in order to apply fix
public void onMoveInput(PrePlayerInputEvent e) {
if (mode.getInput() == 4 && getSlowed() != 0.2f && !canFloat) {
mc.thePlayer.movementInput.jump = false;
}
}
public static float getSlowed() {
float val = (100.0F - (float) slowed.getInput()) / 100.0F;
if (mc.thePlayer.getHeldItem() == null || ModuleManager.noSlow == null || !ModuleManager.noSlow.isEnabled()) {
return 0.2f;
}
else {
if (swordOnly.isToggled() && !(mc.thePlayer.getHeldItem().getItem() instanceof ItemSword)) {
return 0.2f;
}
if (mc.thePlayer.getHeldItem().getItem() instanceof ItemBow && disableBow.isToggled()) {
return 0.2f;
}
else if (mc.thePlayer.getHeldItem().getItem() instanceof ItemPotion && !ItemPotion.isSplash(mc.thePlayer.getHeldItem().getItemDamage()) && disablePotions.isToggled()) {
return 0.2f;
}
else if (fix) {
return 0.2f;
}
else if (ModuleManager.killAura.blocked) {
return val;
}
}
return val;
}
private boolean floatConditions() {
Block block = BlockUtils.getBlock(new BlockPos(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ));
int edgeY = (int) Math.round((mc.thePlayer.posY % 1.0D) * 100.0D);
if (mc.thePlayer.posY % 1 == 0) {
return true;
}
if (edgeY < 10) {
return true;
}
if (!mc.thePlayer.onGround) {
return true;
}
if (block instanceof BlockSnow) {
return true;
}
if (block instanceof BlockCarpet) {
return true;
}
if (block instanceof BlockSlab) {
return true;
}
return false;
}
public static boolean groundSpeed() {
return groundSpeedOption.isToggled() && noSlowing && canFloat && offset && Utils.isMoving() && !Utils.jumpDown() && !Utils.noSlowingBackWithBow();
}
@Override
public String getInfo() {
return modes[(int) mode.getInput()];
}
private void resetFloat() {
reSendConsume = canFloat = noSlowing = offset = didC = fix = requireJump = false;
grounded = 0;
}
public static boolean hasArrows(ItemStack stack) {
final boolean flag = mc.thePlayer.capabilities.isCreativeMode || EnchantmentHelper.getEnchantmentLevel(Enchantment.infinity.effectId, stack) > 0;
return flag || mc.thePlayer.inventory.hasItem(Items.arrow);
}
double[] floatSpeedLevels = {0.2, 0.23, 0.28, 0.32, 0.37};
double getFloatSpeed(int speedLevel) {
double min = 0;
if (mc.thePlayer.moveStrafing != 0 && mc.thePlayer.moveForward != 0) min = 0.003;
if (speedLevel >= 0) {
return floatSpeedLevels[speedLevel] - min;
}
return floatSpeedLevels[0] - min;
}
private int getSpeedLevel() {
for (PotionEffect potionEffect : mc.thePlayer.getActivePotionEffects()) {
if (potionEffect.getEffectName().equals("potion.moveSpeed")) {
return potionEffect.getAmplifier() + 1;
}
return 0;
}
return 0;
}
private boolean holdingConsumable(ItemStack itemStack) {
Item heldItem = itemStack.getItem();
if (heldItem instanceof ItemFood || heldItem instanceof ItemBow && hasArrows(itemStack) || (heldItem instanceof ItemPotion && !ItemPotion.isSplash(mc.thePlayer.getHeldItem().getItemDamage())) || (heldItem instanceof ItemSword && !vanillaSword.isToggled())) {
return true;
}
return false;
}
public static boolean holdingEdible(ItemStack stack) {
if (stack.getItem() instanceof ItemFood && mc.thePlayer.getFoodStats().getFoodLevel() == 20) {
ItemFood food = (ItemFood) stack.getItem();
return ((IAccessorItemFood) food).getAlwaysEdible();
}
return true;
}
}