[enhancement] Added option to Strafe to cancel player inertia

closes #1660
This commit is contained in:
Xiaro 2021-01-11 17:26:45 -05:00
parent 35bcaf8d85
commit 1facfed7e6
No known key found for this signature in database
GPG Key ID: 996D265D6E155377
7 changed files with 88 additions and 61 deletions

View File

@ -1,9 +1,10 @@
package me.zeroeightsix.kami.module.modules.combat package me.zeroeightsix.kami.module.modules.combat
import me.zeroeightsix.kami.event.SafeClientEvent
import me.zeroeightsix.kami.event.events.PacketEvent import me.zeroeightsix.kami.event.events.PacketEvent
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.MovementUtils import me.zeroeightsix.kami.util.MovementUtils.setSpeed
import me.zeroeightsix.kami.util.MovementUtils.speed import me.zeroeightsix.kami.util.MovementUtils.speed
import me.zeroeightsix.kami.util.threads.safeListener import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.EntityLivingBase
@ -11,7 +12,6 @@ import net.minecraft.network.play.client.CPacketAnimation
import net.minecraft.network.play.client.CPacketPlayer import net.minecraft.network.play.client.CPacketPlayer
import net.minecraft.network.play.client.CPacketUseEntity import net.minecraft.network.play.client.CPacketUseEntity
import net.minecraftforge.fml.common.gameevent.TickEvent import net.minecraftforge.fml.common.gameevent.TickEvent
import org.kamiblue.event.listener.listener
object Criticals : Module( object Criticals : Module(
name = "Criticals", name = "Criticals",
@ -35,15 +35,16 @@ object Criticals : Module(
delayTick = 0 delayTick = 0
} }
listener<PacketEvent.Send> { safeListener<PacketEvent.Send> {
if (mc.player == null || !(it.packet is CPacketAnimation || it.packet is CPacketUseEntity)) return@listener if (it.packet !is CPacketAnimation && it.packet !is CPacketUseEntity) return@safeListener
if (mc.player.isInWater || mc.player.isInLava || !mc.player.onGround) return@listener /* Don't run if player is sprinting or weapon is still in cooldown */
if (player.isInWater || player.isInLava || !player.onGround) return@safeListener /* Don't run if player is sprinting or weapon is still in cooldown */
if (it.packet is CPacketUseEntity && it.packet.action == CPacketUseEntity.Action.ATTACK) { if (it.packet is CPacketUseEntity && it.packet.action == CPacketUseEntity.Action.ATTACK) {
val target = it.packet.getEntityFromWorld(mc.world) val target = it.packet.getEntityFromWorld(world)
if (target == null || target !is EntityLivingBase) return@listener if (target == null || target !is EntityLivingBase) return@safeListener
mc.player.isSprinting = false player.isSprinting = false
if (mc.player.speed > 0.2) MovementUtils.setSpeed(0.2) if (player.speed > 0.2) setSpeed(0.2)
if (mode.value == CriticalMode.PACKET) { if (mode.value == CriticalMode.PACKET) {
packetMode() packetMode()
} else { } else {
@ -58,7 +59,7 @@ object Criticals : Module(
/* Sends attack packet and swing packet when falling */ /* Sends attack packet and swing packet when falling */
if (mode.value == CriticalMode.DELAY && delayTick != 0) { if (mode.value == CriticalMode.DELAY && delayTick != 0) {
player.isSprinting = false player.isSprinting = false
if (player.speed > 0.2) MovementUtils.setSpeed(0.2) if (player.speed > 0.2) setSpeed(0.2)
if (player.motionY < -0.1 && delayTick in 1..15) { if (player.motionY < -0.1 && delayTick in 1..15) {
sendingPacket = true sendingPacket = true
connection.sendPacket(attackPacket) connection.sendPacket(attackPacket)
@ -74,10 +75,10 @@ object Criticals : Module(
} }
} }
private fun packetMode() { private fun SafeClientEvent.packetMode() {
/* lol Minecraft checks for criticals if you're not on a block so just say you're not */ /* lol Minecraft checks for criticals if you're not on a block so just say you're not */
mc.player.connection.sendPacket(CPacketPlayer.Position(mc.player.posX, mc.player.posY + 0.1f, mc.player.posZ, false)) connection.sendPacket(CPacketPlayer.Position(player.posX, player.posY + 0.1f, player.posZ, false))
mc.player.connection.sendPacket(CPacketPlayer.Position(mc.player.posX, mc.player.posY, mc.player.posZ, false)) connection.sendPacket(CPacketPlayer.Position(player.posX, player.posY, player.posZ, false))
} }
private fun delayModeAttack(event: PacketEvent) { private fun delayModeAttack(event: PacketEvent) {

View File

@ -10,7 +10,7 @@ import me.zeroeightsix.kami.mixin.extension.timer
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.module.modules.player.LagNotifier import me.zeroeightsix.kami.module.modules.player.LagNotifier
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.MovementUtils import me.zeroeightsix.kami.util.MovementUtils.calcMoveYaw
import me.zeroeightsix.kami.util.MovementUtils.speed import me.zeroeightsix.kami.util.MovementUtils.speed
import me.zeroeightsix.kami.util.WorldUtils.getGroundPos import me.zeroeightsix.kami.util.WorldUtils.getGroundPos
import me.zeroeightsix.kami.util.WorldUtils.isLiquidBelow import me.zeroeightsix.kami.util.WorldUtils.isLiquidBelow
@ -312,8 +312,8 @@ object ElytraFlight : Module(
* *
* @return Yaw in radians based on player rotation yaw and movement input * @return Yaw in radians based on player rotation yaw and movement input
*/ */
private fun getYaw(): Double { private fun SafeClientEvent.getYaw(): Double {
val yawRad = MovementUtils.calcMoveYaw() val yawRad = calcMoveYaw()
packetYaw = Math.toDegrees(yawRad).toFloat() packetYaw = Math.toDegrees(yawRad).toFloat()
return yawRad return yawRad
} }

View File

@ -1,10 +1,13 @@
package me.zeroeightsix.kami.module.modules.movement package me.zeroeightsix.kami.module.modules.movement
import me.zeroeightsix.kami.event.SafeClientEvent
import me.zeroeightsix.kami.event.events.PacketEvent import me.zeroeightsix.kami.event.events.PacketEvent
import me.zeroeightsix.kami.event.events.PlayerTravelEvent import me.zeroeightsix.kami.event.events.PlayerTravelEvent
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.MovementUtils import me.zeroeightsix.kami.util.MovementUtils
import me.zeroeightsix.kami.util.MovementUtils.calcMoveYaw
import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.entity.Entity import net.minecraft.entity.Entity
import net.minecraft.entity.item.EntityBoat import net.minecraft.entity.item.EntityBoat
import net.minecraft.entity.passive.AbstractHorse import net.minecraft.entity.passive.AbstractHorse
@ -16,7 +19,6 @@ import net.minecraft.network.play.client.CPacketVehicleMove
import net.minecraft.network.play.server.SPacketMoveVehicle import net.minecraft.network.play.server.SPacketMoveVehicle
import net.minecraft.util.EnumHand import net.minecraft.util.EnumHand
import net.minecraft.world.chunk.EmptyChunk import net.minecraft.world.chunk.EmptyChunk
import org.kamiblue.event.listener.listener
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
@ -35,28 +37,30 @@ object EntitySpeed : Module(
private val interactTickDelay = setting("InteractTickDelay", 2, 1..20, 1, { forceInteract.value }) private val interactTickDelay = setting("InteractTickDelay", 2, 1..20, 1, { forceInteract.value })
init { init {
listener<PacketEvent.Send> { safeListener<PacketEvent.Send> {
val ridingEntity = mc.player?.ridingEntity val ridingEntity = player.ridingEntity
if (!forceInteract.value || ridingEntity !is EntityBoat) return@safeListener
if (!forceInteract.value || ridingEntity !is EntityBoat) return@listener
if (it.packet is CPacketPlayer.Rotation || it.packet is CPacketInput) { if (it.packet is CPacketPlayer.Rotation || it.packet is CPacketInput) {
it.cancel() it.cancel()
} }
if (it.packet is CPacketVehicleMove) { if (it.packet is CPacketVehicleMove) {
if (mc.player.ticksExisted % interactTickDelay.value == 0) { if (player.ticksExisted % interactTickDelay.value == 0) {
mc.playerController.interactWithEntity(mc.player, ridingEntity, EnumHand.MAIN_HAND) playerController.interactWithEntity(player, ridingEntity, EnumHand.MAIN_HAND)
} }
} }
} }
listener<PacketEvent.Receive> { safeListener<PacketEvent.Receive> {
if (!forceInteract.value || mc.player?.ridingEntity !is EntityBoat || it.packet !is SPacketMoveVehicle) return@listener if (!forceInteract.value || player.ridingEntity !is EntityBoat || it.packet !is SPacketMoveVehicle) return@safeListener
it.cancel() it.cancel()
} }
listener<PlayerTravelEvent> { safeListener<PlayerTravelEvent> {
mc.player?.ridingEntity?.let { player.ridingEntity?.let {
if (it is EntityPig || it is AbstractHorse || it is EntityBoat && it.controllingPassenger == mc.player) { if (it is EntityPig || it is AbstractHorse || it is EntityBoat && it.controllingPassenger == player) {
steerEntity(it) steerEntity(it)
if (flight.value) fly(it) if (flight.value) fly(it)
} }
@ -64,8 +68,8 @@ object EntitySpeed : Module(
} }
} }
private fun steerEntity(entity: Entity) { private fun SafeClientEvent.steerEntity(entity: Entity) {
val yawRad = MovementUtils.calcMoveYaw() val yawRad = calcMoveYaw()
val motionX = -sin(yawRad) * speed.value val motionX = -sin(yawRad) * speed.value
val motionZ = cos(yawRad) * speed.value val motionZ = cos(yawRad) * speed.value
@ -79,7 +83,7 @@ object EntitySpeed : Module(
} }
if (entity is EntityHorse || entity is EntityBoat) { if (entity is EntityHorse || entity is EntityBoat) {
entity.rotationYaw = mc.player.rotationYaw entity.rotationYaw = player.rotationYaw
// Make sure the boat doesn't turn etc (params: isLeftDown, isRightDown, isForwardDown, isBackDown) // Make sure the boat doesn't turn etc (params: isLeftDown, isRightDown, isForwardDown, isBackDown)
if (entity is EntityBoat) entity.updateInputs(false, false, false, false) if (entity is EntityBoat) entity.updateInputs(false, false, false, false)
@ -91,8 +95,8 @@ object EntitySpeed : Module(
if (mc.gameSettings.keyBindJump.isKeyDown) entity.motionY += upSpeed.value / 2.0 if (mc.gameSettings.keyBindJump.isKeyDown) entity.motionY += upSpeed.value / 2.0
} }
private fun isBorderingChunk(entity: Entity, motionX: Double, motionZ: Double): Boolean { private fun SafeClientEvent.isBorderingChunk(entity: Entity, motionX: Double, motionZ: Double): Boolean {
return antiStuck.value && mc.world.getChunk((entity.posX + motionX).toInt() shr 4, (entity.posZ + motionZ).toInt() shr 4) is EmptyChunk return antiStuck.value && world.getChunk((entity.posX + motionX).toInt() shr 4, (entity.posZ + motionZ).toInt() shr 4) is EmptyChunk
} }
@JvmStatic @JvmStatic

View File

@ -8,6 +8,7 @@ import me.zeroeightsix.kami.manager.managers.PlayerPacketManager
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.MovementUtils import me.zeroeightsix.kami.util.MovementUtils
import me.zeroeightsix.kami.util.MovementUtils.calcMoveYaw
import me.zeroeightsix.kami.util.threads.runSafe import me.zeroeightsix.kami.util.threads.runSafe
import me.zeroeightsix.kami.util.threads.safeListener import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.network.play.client.CPacketPlayer import net.minecraft.network.play.client.CPacketPlayer
@ -69,7 +70,7 @@ object Flight : Module(
else -0.0622 else -0.0622
} else { } else {
if (MovementUtils.isInputting) { if (MovementUtils.isInputting) {
val yaw = MovementUtils.calcMoveYaw() val yaw = calcMoveYaw()
player.motionX = -sin(yaw) * 0.2f player.motionX = -sin(yaw) * 0.2f
player.motionZ = cos(yaw) * 0.2f player.motionZ = cos(yaw) * 0.2f
} }

View File

@ -1,16 +1,20 @@
package me.zeroeightsix.kami.module.modules.movement package me.zeroeightsix.kami.module.modules.movement
import me.zeroeightsix.kami.event.SafeClientEvent import me.zeroeightsix.kami.event.SafeClientEvent
import me.zeroeightsix.kami.event.events.PlayerTravelEvent
import me.zeroeightsix.kami.mixin.extension.tickLength import me.zeroeightsix.kami.mixin.extension.tickLength
import me.zeroeightsix.kami.mixin.extension.timer import me.zeroeightsix.kami.mixin.extension.timer
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.BaritoneUtils import me.zeroeightsix.kami.util.BaritoneUtils
import me.zeroeightsix.kami.util.MovementUtils import me.zeroeightsix.kami.util.MovementUtils
import me.zeroeightsix.kami.util.MovementUtils.calcMoveYaw
import me.zeroeightsix.kami.util.MovementUtils.setSpeed
import me.zeroeightsix.kami.util.MovementUtils.speed import me.zeroeightsix.kami.util.MovementUtils.speed
import me.zeroeightsix.kami.util.TickTimer
import me.zeroeightsix.kami.util.TimeUnit
import me.zeroeightsix.kami.util.threads.safeListener import me.zeroeightsix.kami.util.threads.safeListener
import net.minecraft.client.settings.KeyBinding import net.minecraft.client.settings.KeyBinding
import net.minecraftforge.fml.common.gameevent.TickEvent
import kotlin.math.cos import kotlin.math.cos
import kotlin.math.sin import kotlin.math.sin
@ -22,9 +26,11 @@ object Strafe : Module(
private val airSpeedBoost by setting("AirSpeedBoost", true) private val airSpeedBoost by setting("AirSpeedBoost", true)
private val timerBoost by setting("TimerBoost", true) private val timerBoost by setting("TimerBoost", true)
private val autoJump by setting("AutoJump", true) private val autoJump by setting("AutoJump", true)
private val onHolding by setting("OnHoldingSprint", false) private val onHoldingSprint by setting("OnHoldingSprint", false)
private val cancelInertia by setting("CancelInertia", false)
private var jumpTicks = 0 private var jumpTicks = 0
private var strafeTimer = TickTimer(TimeUnit.TICKS)
/* If you skid this you omega gay */ /* If you skid this you omega gay */
init { init {
@ -32,39 +38,50 @@ object Strafe : Module(
reset() reset()
} }
safeListener<TickEvent.ClientTickEvent> { safeListener<PlayerTravelEvent> {
if (!shouldStrafe()) { if (!shouldStrafe()) {
reset() reset()
if (cancelInertia && !strafeTimer.tick(2L)) {
player.motionX = 0.0
player.motionZ = 0.0
}
return@safeListener return@safeListener
} }
MovementUtils.setSpeed(player.speed)
setSpeed(player.speed)
if (airSpeedBoost) player.jumpMovementFactor = 0.029f if (airSpeedBoost) player.jumpMovementFactor = 0.029f
if (timerBoost) mc.timer.tickLength = 45.87155914306640625f if (timerBoost) mc.timer.tickLength = 45.87155914306640625f
if (autoJump) jump()
if (autoJump && player.onGround && jumpTicks <= 0) { strafeTimer.reset()
KeyBinding.setKeyBindState(mc.gameSettings.keyBindJump.keyCode, false)
player.motionY = 0.41
if (player.isSprinting) {
val yaw = MovementUtils.calcMoveYaw()
player.motionX -= sin(yaw) * 0.2
player.motionZ += cos(yaw) * 0.2
}
player.isAirBorne = true
jumpTicks = 5
}
if (jumpTicks > 0) jumpTicks--
} }
} }
private fun reset() {
mc.player?.jumpMovementFactor = 0.02f
mc.timer.tickLength = 50.0f
jumpTicks = 0
}
private fun SafeClientEvent.shouldStrafe() = !BaritoneUtils.isPathing private fun SafeClientEvent.shouldStrafe() = !BaritoneUtils.isPathing
&& !player.capabilities.isFlying && !player.capabilities.isFlying
&& !player.isElytraFlying && !player.isElytraFlying
&& (mc.gameSettings.keyBindSprint.isKeyDown || !onHolding) && (!onHoldingSprint || mc.gameSettings.keyBindSprint.isKeyDown)
&& (player.moveForward != 0f || player.moveStrafing != 0f) && MovementUtils.isInputting
private fun reset() { private fun SafeClientEvent.jump() {
mc.player?.jumpMovementFactor = 0.02F if (player.onGround && jumpTicks <= 0) {
mc.timer.tickLength = 50F KeyBinding.setKeyBindState(mc.gameSettings.keyBindJump.keyCode, false)
jumpTicks = 0 player.motionY = 0.41
if (player.isSprinting) {
val yaw = calcMoveYaw()
player.motionX -= sin(yaw) * 0.2
player.motionZ += cos(yaw) * 0.2
}
player.isAirBorne = true
jumpTicks = 5
}
jumpTicks--
} }
} }

View File

@ -8,6 +8,7 @@ import me.zeroeightsix.kami.event.events.PlayerAttackEvent
import me.zeroeightsix.kami.module.Module import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.ModuleConfig.setting import me.zeroeightsix.kami.setting.ModuleConfig.setting
import me.zeroeightsix.kami.util.* import me.zeroeightsix.kami.util.*
import me.zeroeightsix.kami.util.MovementUtils.calcMoveYaw
import me.zeroeightsix.kami.util.math.RotationUtils import me.zeroeightsix.kami.util.math.RotationUtils
import me.zeroeightsix.kami.util.math.VectorUtils.toBlockPos import me.zeroeightsix.kami.util.math.VectorUtils.toBlockPos
import me.zeroeightsix.kami.util.threads.runSafe import me.zeroeightsix.kami.util.threads.runSafe
@ -194,7 +195,7 @@ object Freecam : Module(
val movementInput = calcMovementInput(forward, strafe, false to false) val movementInput = calcMovementInput(forward, strafe, false to false)
val yawDiff = player.rotationYaw - it.rotationYaw val yawDiff = player.rotationYaw - it.rotationYaw
val yawRad = MovementUtils.calcMoveYaw(yawDiff, movementInput.first, movementInput.second).toFloat() val yawRad = calcMoveYaw(yawDiff, movementInput.first, movementInput.second).toFloat()
val inputTotal = min(abs(movementInput.first) + abs(movementInput.second), 1f) val inputTotal = min(abs(movementInput.first) + abs(movementInput.second), 1f)
player.movementInput?.apply { player.movementInput?.apply {

View File

@ -1,5 +1,6 @@
package me.zeroeightsix.kami.util package me.zeroeightsix.kami.util
import me.zeroeightsix.kami.event.SafeClientEvent
import net.minecraft.client.Minecraft import net.minecraft.client.Minecraft
import net.minecraft.entity.Entity import net.minecraft.entity.Entity
import kotlin.math.cos import kotlin.math.cos
@ -9,14 +10,16 @@ import kotlin.math.sin
object MovementUtils { object MovementUtils {
private val mc = Minecraft.getMinecraft() private val mc = Minecraft.getMinecraft()
val isInputting get() = mc.player.movementInput.moveForward != 0f || mc.player.movementInput.moveStrafe != 0f val isInputting get() = mc.player?.movementInput?.let {
it.moveForward != 0f || it.moveStrafe != 0f
} ?: false
val Entity.isMoving get() = speed > 0.0001 val Entity.isMoving get() = speed > 0.0001
val Entity.speed get() = hypot(motionX, motionZ) val Entity.speed get() = hypot(motionX, motionZ)
val Entity.realSpeed get() = hypot(posX - prevPosX, posZ - prevPosZ) val Entity.realSpeed get() = hypot(posX - prevPosX, posZ - prevPosZ)
/* totally not taken from elytrafly */ /* totally not taken from elytrafly */
fun calcMoveYaw(yawIn: Float = mc.player.rotationYaw, moveForward: Float = roundedForward, moveString: Float = roundedStrafing): Double { fun SafeClientEvent.calcMoveYaw(yawIn: Float = mc.player.rotationYaw, moveForward: Float = roundedForward, moveString: Float = roundedStrafing): Double {
var strafe = 90 * moveString var strafe = 90 * moveString
strafe *= if (moveForward != 0F) moveForward * 0.5F else 1F strafe *= if (moveForward != 0F) moveForward * 0.5F else 1F
@ -35,9 +38,9 @@ object MovementUtils {
else -> 0f else -> 0f
} }
fun setSpeed(speed: Double) { fun SafeClientEvent.setSpeed(speed: Double) {
val yaw = calcMoveYaw() val yaw = calcMoveYaw()
mc.player.motionX = -sin(yaw) * speed player.motionX = -sin(yaw) * speed
mc.player.motionZ = cos(yaw) * speed player.motionZ = cos(yaw) * speed
} }
} }