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