[enhancement] Add dolphin mode to Jesus (#1178) (#1790)

Co-authored-by: Dominika <sokolov.dominika@gmail.com>
This commit is contained in:
scorbett123 2021-01-04 17:31:26 +00:00 committed by GitHub
parent bbd2f6b58c
commit 022ea5c1d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 43 additions and 23 deletions

View File

@ -4,6 +4,7 @@ import me.zeroeightsix.kami.event.events.AddCollisionBoxToListEvent
import me.zeroeightsix.kami.event.events.PacketEvent
import me.zeroeightsix.kami.mixin.extension.y
import me.zeroeightsix.kami.module.Module
import me.zeroeightsix.kami.setting.Settings
import me.zeroeightsix.kami.util.BaritoneUtils
import me.zeroeightsix.kami.util.EntityUtils
import me.zeroeightsix.kami.util.threads.safeListener
@ -13,18 +14,22 @@ import net.minecraft.entity.item.EntityBoat
import net.minecraft.network.play.client.CPacketPlayer
import net.minecraft.util.math.AxisAlignedBB
import net.minecraft.util.math.BlockPos
import net.minecraft.util.math.MathHelper
import net.minecraftforge.fml.common.gameevent.TickEvent
import org.kamiblue.commons.extension.ceilToInt
import org.kamiblue.commons.extension.floorToInt
import org.kamiblue.event.listener.listener
@Module.Info(
name = "Jesus",
description = "Allows you to walk on water",
category = Module.Category.MOVEMENT
name = "Jesus",
description = "Allows you to walk on water",
category = Module.Category.MOVEMENT
)
object Jesus : Module() {
private val dolphin = register(Settings.b("Dolphin", false))
private val WATER_WALK_AA = AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 0.99, 1.0)
override fun onToggle() {
BaritoneUtils.settings?.assumeWalkOnWater?.value = isEnabled
}
@ -32,18 +37,29 @@ object Jesus : Module() {
init {
safeListener<TickEvent.ClientTickEvent> {
if (isInWater(player) && !player.isSneaking) {
player.motionY = 0.1
if (player.ridingEntity != null && player.ridingEntity !is EntityBoat) {
player.ridingEntity!!.motionY = 0.3
if (dolphin.value) {
player.motionY += 0.03999999910593033 // regular jump speed
} else {
player.motionY = 0.1
if (player.ridingEntity != null && player.ridingEntity !is EntityBoat) {
player.ridingEntity?.motionY = 0.3
}
}
}
}
listener<AddCollisionBoxToListEvent> {
if (it.block !is BlockLiquid || it.entity !is EntityBoat || mc.player == null || mc.player.isSneaking || mc.player.fallDistance > 3) return@listener
if ((isDrivenByPlayer(it.entity) || it.entity === mc.player)
&& !isInWater(mc.player) && (EntityUtils.isAboveWater(mc.player, false)
|| EntityUtils.isAboveWater(mc.player.ridingEntity, false)) && isAboveBlock(mc.player, it.pos)) {
if (dolphin.value || mc.player == null || mc.player.isSneaking || mc.player.fallDistance > 3) return@listener
if (
it.block is BlockLiquid
&& it.entity is EntityBoat
&& isAboveBlock(mc.player, it.pos)
&& (isDrivenByPlayer(it.entity) || it.entity === mc.player)
&& !isInWater(mc.player)
&& (EntityUtils.isAboveWater(mc.player, false) || EntityUtils.isAboveWater(mc.player.ridingEntity, false))
) {
val axisAlignedBB = WATER_WALK_AA.offset(it.pos)
if (it.entityBox.intersects(axisAlignedBB)) it.collidingBoxes.add(axisAlignedBB)
it.cancel()
@ -51,24 +67,29 @@ object Jesus : Module() {
}
listener<PacketEvent.Send> {
if (dolphin.value) return@listener
if (it.packet is CPacketPlayer
&& EntityUtils.isAboveWater(mc.player, true)
&& !isInWater(mc.player)
&& !isAboveLand(mc.player)) {
val ticks = mc.player.ticksExisted % 2
if (ticks == 0) it.packet.y += 0.02
&& EntityUtils.isAboveWater(mc.player, true)
&& !isInWater(mc.player)
&& !isAboveLand(mc.player)
&& mc.player.ticksExisted % 2 == 0
) {
it.packet.y += 0.02
}
}
}
private val WATER_WALK_AA = AxisAlignedBB(0.0, 0.0, 0.0, 1.0, 0.99, 1.0)
private fun isAboveLand(entity: Entity): Boolean {
val y = entity.posY - 0.01
for (x in MathHelper.floor(entity.posX) until MathHelper.ceil(entity.posX)) for (z in MathHelper.floor(entity.posZ) until MathHelper.ceil(entity.posZ)) {
val pos = BlockPos(x, MathHelper.floor(y), z)
if (mc.world.getBlockState(pos).isFullBlock) return true
for (x in entity.posX.floorToInt() until entity.posX.ceilToInt()) {
for (z in entity.posZ.floorToInt() until entity.posZ.ceilToInt()) {
val pos = BlockPos(x, y.floorToInt(), z)
if (mc.world.getBlockState(pos).isFullBlock) return true
}
}
return false
}
@ -76,8 +97,7 @@ object Jesus : Module() {
return entity.posY >= pos.y
}
private fun isInWater(entity: Entity?): Boolean {
if (entity == null) return false
private fun isInWater(entity: Entity): Boolean {
val y = (entity.posY + 0.01).floorToInt()
for (x in entity.posX.floorToInt() until entity.posX.ceilToInt()) {