From ef3ee7e141643d2fa641bf58442f5025bbfeebf0 Mon Sep 17 00:00:00 2001 From: XeContrast <1683481541@qq.com> Date: Fri, 6 Dec 2024 23:57:58 +0800 Subject: [PATCH] BackTrack && FakeLag Fix --- .../liquidbounce/event/EventManager.kt | 37 +-- .../module/modules/combat/BackTrack.kt | 5 + .../features/module/modules/combat/FakeLag.kt | 5 + .../module/modules/visual/BlockOverlay.kt | 2 +- .../module/modules/visual/SuperheroFX.kt | 2 +- .../module/modules/world/scaffold/Scaffold.kt | 3 +- .../modules/world/scaffold/Scaffold2.kt | 2 +- .../ui/client/hud/element/elements/Radar.kt | 19 +- .../ccbluex/liquidbounce/utils/PacketUtils.kt | 2 +- .../liquidbounce/utils/block/BlockUtils.kt | 41 ++- .../liquidbounce/utils/block/PlaceInfo.kt | 258 +----------------- .../utils/item/ArmorComparator.kt | 59 ++-- 12 files changed, 106 insertions(+), 329 deletions(-) diff --git a/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt b/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt index 7709852..3ab7d4d 100644 --- a/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt +++ b/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt @@ -9,7 +9,7 @@ import net.ccbluex.liquidbounce.utils.MinecraftInstance class EventManager : MinecraftInstance() { - private val registry = HashMap, MutableList>() + private val registry = hashMapOf, MutableList>() // private val counter = HashMap, Int>() // private var lastSyncTime = System.currentTimeMillis() @@ -38,13 +38,10 @@ class EventManager : MinecraftInstance() { * * @param listenable for unregister */ - fun unregisterListener(listenable: Listenable) { - for ((key, targets) in registry) { + fun unregisterListener(listenable: Listenable) = + registry.forEach { (_, targets) -> targets.removeIf { it.eventClass == listenable } - - registry[key] = targets } - } // private fun printProfiler() { // println("--- Event Profiler(${Date()}) ---") @@ -65,29 +62,17 @@ class EventManager : MinecraftInstance() { * @param event to call */ fun callEvent(event: Event) { -// if(System.currentTimeMillis() - lastSyncTime > 1000) { -// printProfiler() -// lastSyncTime = System.currentTimeMillis() -// } -// counter[event.javaClass] = counter.getOrDefault(event.javaClass, 0) + 1 - val targets = registry[event.javaClass] ?: return - try { - for (invokableEventTarget in targets) { - try { - if (!invokableEventTarget.eventClass.handleEvents() && !invokableEventTarget.isIgnoreCondition) { - continue - } - invokableEventTarget.method.invoke(invokableEventTarget.eventClass, event) - } catch (nullPointerException: NullPointerException) { - nullPointerException.printStackTrace() - } catch (throwable: Throwable) { - throwable.printStackTrace() - } + for (invokableEventTarget in targets) { + try { + if (!invokableEventTarget.eventClass.handleEvents() && !invokableEventTarget.isIgnoreCondition) + continue + + invokableEventTarget.method.invoke(invokableEventTarget.eventClass, event) + } catch (throwable: Throwable) { + throwable.printStackTrace() } - }catch (e :Exception){ - e.printStackTrace() } } } diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/BackTrack.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/BackTrack.kt index 97d7097..3c34769 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/BackTrack.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/BackTrack.kt @@ -186,6 +186,11 @@ object Backtrack : Module() { } "modern" -> { + if (mc.isSingleplayer || mc.currentServerData == null) { + clearPackets() + return + } + // Prevent cancelling packets when not needed if (isPacketQueueEmpty && areQueuedPacketsEmpty && !shouldBacktrack()) return diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/FakeLag.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/FakeLag.kt index f7657b6..e7ff208 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/FakeLag.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/FakeLag.kt @@ -178,6 +178,11 @@ object FakeLag : Module() { if (!resetTimer.hasTimePassed(recoilTime.get().toLong())) return + if (mc.isSingleplayer || mc.currentServerData == null) { + blink() + return + } + if (event.eventType == EventState.SEND) { event.cancelEvent() if (packet is C03PacketPlayer && packet.isMoving) { diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/BlockOverlay.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/BlockOverlay.kt index 64ad55c..8c688e8 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/BlockOverlay.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/BlockOverlay.kt @@ -40,7 +40,7 @@ object BlockOverlay : Module() { get() { val blockPos = mc.objectMouseOver?.blockPos ?: return null - if (canBeClicked(blockPos) && mc.theWorld.worldBorder.contains(blockPos)) { + if (blockPos.canBeClicked() && mc.theWorld.worldBorder.contains(blockPos)) { return blockPos } diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/SuperheroFX.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/SuperheroFX.kt index 391f791..45dab58 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/SuperheroFX.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/SuperheroFX.kt @@ -55,7 +55,7 @@ class SuperheroFX : Module() { fun onRender3D(event: Render3DEvent) { val removeList = mutableListOf() for (particle in textParticles) { - if (particle.canRemove) { + if (particle.canRemove && !removeList.contains(particle)) { removeList.add(particle) continue } diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold.kt index 93c1b71..854edcf 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold.kt @@ -21,6 +21,7 @@ import net.ccbluex.liquidbounce.ui.font.Fonts import net.ccbluex.liquidbounce.ui.i18n.LanguageManager import net.ccbluex.liquidbounce.utils.* import net.ccbluex.liquidbounce.utils.block.BlockUtils +import net.ccbluex.liquidbounce.utils.block.BlockUtils.canBeClicked import net.ccbluex.liquidbounce.utils.block.BlockUtils.isReplaceable import net.ccbluex.liquidbounce.utils.block.PlaceInfo import net.ccbluex.liquidbounce.utils.block.PlaceInfo.Companion.get @@ -1236,7 +1237,7 @@ class Scaffold : Module() { } for (side in StaticStorage.facings()) { val neighbor = hypixelBlockPos.offset(side) - if (!BlockUtils.canBeClicked(neighbor)) continue + if (!neighbor.canBeClicked()) continue val dirVec = Vec3(side.directionVec) var xSearch = 0.1 while (xSearch < 0.9) { diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold2.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold2.kt index 0a528a6..69564af 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold2.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/world/scaffold/Scaffold2.kt @@ -1559,7 +1559,7 @@ class Scaffold2 : Module() { } else { for (facingType in EnumFacing.entries) { val neighbor = blockPosition.offset(facingType) - if (!canBeClicked(neighbor)) continue + if (!neighbor.canBeClicked()) continue val dirVec = Vec3(facingType.directionVec) val auto = (if (towerState) towerSearchMode else searchMode).get().equals("Auto", true) val center = (if (towerState) towerSearchMode else searchMode).get().equals("AutoCenter", true) diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/elements/Radar.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/elements/Radar.kt index 98b2283..529b7a5 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/elements/Radar.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/elements/Radar.kt @@ -23,10 +23,7 @@ import net.ccbluex.liquidbounce.features.value.ListValue import net.ccbluex.liquidbounce.ui.client.hud.element.Border import net.ccbluex.liquidbounce.ui.client.hud.element.Element import net.ccbluex.liquidbounce.ui.client.hud.element.ElementInfo -import net.ccbluex.liquidbounce.utils.EntityUtils -import net.ccbluex.liquidbounce.utils.MiniMapRegister -import net.ccbluex.liquidbounce.utils.RainbowShader -import net.ccbluex.liquidbounce.utils.SafeVertexBuffer +import net.ccbluex.liquidbounce.utils.* import net.ccbluex.liquidbounce.utils.render.RenderUtils import net.minecraft.client.renderer.GlStateManager import net.minecraft.client.renderer.Tessellator @@ -75,16 +72,12 @@ class Radar(x: Double = 5.0, y: Double = 130.0) : Element(x, y) { private var lastFov = 0f override fun drawElement(partialTicks: Float): Border { - MiniMapRegister.updateChunks() - - val fovAngle = fovAngleValue.get() - - if (lastFov != fovAngle || fovMarkerVertexBuffer == null) { + if (lastFov != fovAngleValue.get() || fovMarkerVertexBuffer == null) { // Free Memory fovMarkerVertexBuffer?.deleteGlBuffers() - fovMarkerVertexBuffer = createFovIndicator(fovAngle) - lastFov = fovAngle + fovMarkerVertexBuffer = createFovIndicator(fovAngleValue.get()) + lastFov = fovAngleValue.get() } val renderViewEntity = mc.renderViewEntity!! @@ -313,8 +306,8 @@ class Radar(x: Double = 5.0, y: Double = 130.0) : Element(x, y) { worldRenderer.begin(GL11.GL_TRIANGLE_FAN, DefaultVertexFormats.POSITION) - val start = (90.0f - (angle * 0.5f)) / 180.0f * Math.PI.toFloat() - val end = (90.0f + (angle * 0.5f)) / 180.0f * Math.PI.toFloat() + val start = (90f - (angle * 0.5f)).toRadians() + val end = (90f + (angle * 0.5f)).toRadians() var curr = end val radius = 1.0 diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt index 8567a53..e6d94d9 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt @@ -52,7 +52,7 @@ object PacketUtils : MinecraftInstance(), Listenable { } is S14PacketEntity -> { - val entity = packet.getEntity(world) + val entity = packet.getEntity(world) ?: return val mixinEntity = entity as? IMixinEntity mixinEntity?.apply { diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/block/BlockUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/block/BlockUtils.kt index 1dea45d..f1a2c05 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/block/BlockUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/block/BlockUtils.kt @@ -7,14 +7,30 @@ package net.ccbluex.liquidbounce.utils.block import net.ccbluex.liquidbounce.utils.MinecraftInstance import net.minecraft.block.Block +import net.minecraft.block.BlockContainer +import net.minecraft.block.BlockWorkbench import net.minecraft.block.material.Material import net.minecraft.block.state.IBlockState +import net.minecraft.client.Minecraft +import net.minecraft.entity.item.EntityFallingBlock import net.minecraft.util.AxisAlignedBB import net.minecraft.util.BlockPos import net.minecraft.util.MathHelper import net.minecraft.util.Vec3 import kotlin.math.floor +val BlockPos.state: IBlockState? + get() = Minecraft.getMinecraft().theWorld?.getBlockState(this) + +val BlockPos.block: Block? + get() = this.state?.block +val BlockPos.material: Material? + get() = this.block?.material +val BlockPos.isReplaceable: Boolean + get() = this.material?.isReplaceable ?: false +val BlockPos.center: Vec3 + get() = Vec3(x + 0.5, y + 0.5, z + 0.5) + object BlockUtils : MinecraftInstance() { /** @@ -44,13 +60,6 @@ object BlockUtils : MinecraftInstance() { @JvmStatic fun getState(blockPos: BlockPos?): IBlockState = mc.theWorld.getBlockState(blockPos) - /** - * Check if [blockPos] is clickable - */ - @JvmStatic - fun canBeClicked(blockPos: BlockPos?) = getBlock(blockPos)?.canCollideCheck(getState(blockPos), false) ?: false && - mc.theWorld.worldBorder.contains(blockPos) - /** * Get block name by [id] */ @@ -154,7 +163,7 @@ object BlockUtils : MinecraftInstance() { * Check if block bounding box is full or partial (non-full) */ fun isBlockBBValid(blockPos: BlockPos, blockState: IBlockState? = null, supportSlabs: Boolean = false, supportPartialBlocks: Boolean = false): Boolean { - val state = blockState ?: getState(blockPos) ?: return false + val state = blockState ?: getState(blockPos) val box = state.block.getCollisionBoundingBox(mc.theWorld, blockPos, state) ?: return false @@ -171,4 +180,20 @@ object BlockUtils : MinecraftInstance() { @JvmStatic fun floorVec3(vec3: Vec3) = Vec3(floor(vec3.xCoord), floor(vec3.yCoord), floor(vec3.zCoord)) + + fun BlockPos.canBeClicked(): Boolean { + val state = this.state ?: return false + val block = state.block ?: return false + + return when { + this !in mc.theWorld.worldBorder -> false + !block.canCollideCheck(state, false) -> false + block.material.isReplaceable -> false + block.hasTileEntity(state) -> false + !isBlockBBValid(this, state, supportSlabs = true, supportPartialBlocks = true) -> false + mc.theWorld.loadedEntityList.any { it is EntityFallingBlock && it.position == this } -> false + block is BlockContainer || block is BlockWorkbench -> false + else -> true + } + } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/block/PlaceInfo.kt b/src/main/java/net/ccbluex/liquidbounce/utils/block/PlaceInfo.kt index 875b79d..1ba6f06 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/block/PlaceInfo.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/block/PlaceInfo.kt @@ -1,265 +1,25 @@ /* - * FDPClient Hacked Client - * A free open source mixin-based injection hacked client for Minecraft using Minecraft Forge by LiquidBounce. - * https://github.com/SkidderMC/FDPClient/ + * LiquidBounce Hacked Client + * A free open source mixin-based injection hacked client for Minecraft using Minecraft Forge. + * https://github.com/CCBlueX/LiquidBounce/ */ package net.ccbluex.liquidbounce.utils.block +import net.ccbluex.liquidbounce.utils.block.BlockUtils.canBeClicked import net.minecraft.util.BlockPos import net.minecraft.util.EnumFacing import net.minecraft.util.Vec3 -class PlaceInfo( - val blockPos: BlockPos, - val enumFacing: EnumFacing, - var vec3: Vec3 = Vec3(blockPos.x + 0.5, blockPos.y + 0.5, blockPos.z + 0.5) -) { + +class PlaceInfo(val blockPos: BlockPos, val enumFacing: EnumFacing, var vec3: Vec3 = blockPos.center) { companion object { /** * Allows you to find a specific place info for your [blockPos] */ - fun get(blockPos: BlockPos): PlaceInfo? { - return when { - BlockUtils.canBeClicked(blockPos.add(0, -1, 0)) -> - return PlaceInfo(blockPos.add(0, -1, 0), EnumFacing.UP) - BlockUtils.canBeClicked(blockPos.add(0, 0, 1)) -> - return PlaceInfo(blockPos.add(0, 0, 1), EnumFacing.NORTH) - BlockUtils.canBeClicked(blockPos.add(-1, 0, 0)) -> - return PlaceInfo(blockPos.add(-1, 0, 0), EnumFacing.EAST) - BlockUtils.canBeClicked(blockPos.add(0, 0, -1)) -> - return PlaceInfo(blockPos.add(0, 0, -1), EnumFacing.SOUTH) - BlockUtils.canBeClicked(blockPos.add(1, 0, 0)) -> - PlaceInfo(blockPos.add(1, 0, 0), EnumFacing.WEST) - else -> null - } - } - @JvmStatic - fun getPlaceInfo(pos: BlockPos): PlaceInfo? { - if (BlockUtils.canBeClicked(pos.add(0, -1, 0))) { - return PlaceInfo(pos.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos.add(-1, 0, 0))) { - return PlaceInfo(pos.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos.add(1, 0, 0))) { - return PlaceInfo(pos.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos.add(0, 0, 1))) { - return PlaceInfo(pos.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos.add(0, 0, -1))) { - return PlaceInfo(pos.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos2 = pos.add(-1, 0, 0) - if (BlockUtils.canBeClicked(pos2.add(0, -1, 0))) { - return PlaceInfo(pos2.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos2.add(-1, 0, 0))) { - return PlaceInfo(pos2.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos2.add(1, 0, 0))) { - return PlaceInfo(pos2.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos2.add(0, 0, 1))) { - return PlaceInfo(pos2.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos2.add(0, 0, -1))) { - return PlaceInfo(pos2.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos3 = pos.add(1, 0, 0) - if (BlockUtils.canBeClicked(pos3.add(0, -1, 0))) { - return PlaceInfo(pos3.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos3.add(-1, 0, 0))) { - return PlaceInfo(pos3.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos3.add(1, 0, 0))) { - return PlaceInfo(pos3.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos3.add(0, 0, 1))) { - return PlaceInfo(pos3.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos3.add(0, 0, -1))) { - return PlaceInfo(pos3.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos4 = pos.add(0, 0, 1) - if (BlockUtils.canBeClicked(pos4.add(0, -1, 0))) { - return PlaceInfo(pos4.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos4.add(-1, 0, 0))) { - return PlaceInfo(pos4.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos4.add(1, 0, 0))) { - return PlaceInfo(pos4.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos4.add(0, 0, 1))) { - return PlaceInfo(pos4.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos4.add(0, 0, -1))) { - return PlaceInfo(pos4.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos5 = pos.add(0, 0, -1) - if (BlockUtils.canBeClicked(pos5.add(0, -1, 0))) { - return PlaceInfo(pos5.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos5.add(-1, 0, 0))) { - return PlaceInfo(pos5.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos5.add(1, 0, 0))) { - return PlaceInfo(pos5.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos5.add(0, 0, 1))) { - return PlaceInfo(pos5.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos5.add(0, 0, -1))) { - return PlaceInfo(pos5.add(0, 0, -1), EnumFacing.SOUTH) - } - pos.add(-2, 0, 0) - if (BlockUtils.canBeClicked(pos2.add(0, -1, 0))) { - return PlaceInfo(pos2.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos2.add(-1, 0, 0))) { - return PlaceInfo(pos2.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos2.add(1, 0, 0))) { - return PlaceInfo(pos2.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos2.add(0, 0, 1))) { - return PlaceInfo(pos2.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos2.add(0, 0, -1))) { - return PlaceInfo(pos2.add(0, 0, -1), EnumFacing.SOUTH) - } - pos.add(2, 0, 0) - if (BlockUtils.canBeClicked(pos3.add(0, -1, 0))) { - return PlaceInfo(pos3.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos3.add(-1, 0, 0))) { - return PlaceInfo(pos3.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos3.add(1, 0, 0))) { - return PlaceInfo(pos3.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos3.add(0, 0, 1))) { - return PlaceInfo(pos3.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos3.add(0, 0, -1))) { - return PlaceInfo(pos3.add(0, 0, -1), EnumFacing.SOUTH) - } - pos.add(0, 0, 2) - if (BlockUtils.canBeClicked(pos4.add(0, -1, 0))) { - return PlaceInfo(pos4.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos4.add(-1, 0, 0))) { - return PlaceInfo(pos4.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos4.add(1, 0, 0))) { - return PlaceInfo(pos4.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos4.add(0, 0, 1))) { - return PlaceInfo(pos4.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos4.add(0, 0, -1))) { - return PlaceInfo(pos4.add(0, 0, -1), EnumFacing.SOUTH) - } - pos.add(0, 0, -2) - if (BlockUtils.canBeClicked(pos5.add(0, -1, 0))) { - return PlaceInfo(pos5.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos5.add(-1, 0, 0))) { - return PlaceInfo(pos5.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos5.add(1, 0, 0))) { - return PlaceInfo(pos5.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos5.add(0, 0, 1))) { - return PlaceInfo(pos5.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos5.add(0, 0, -1))) { - return PlaceInfo(pos5.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos6 = pos.add(0, -1, 0) - if (BlockUtils.canBeClicked(pos6.add(0, -1, 0))) { - return PlaceInfo(pos6.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos6.add(-1, 0, 0))) { - return PlaceInfo(pos6.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos6.add(1, 0, 0))) { - return PlaceInfo(pos6.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos6.add(0, 0, 1))) { - return PlaceInfo(pos6.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos6.add(0, 0, -1))) { - return PlaceInfo(pos6.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos7 = pos6.add(1, 0, 0) - if (BlockUtils.canBeClicked(pos7.add(0, -1, 0))) { - return PlaceInfo(pos7.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos7.add(-1, 0, 0))) { - return PlaceInfo(pos7.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos7.add(1, 0, 0))) { - return PlaceInfo(pos7.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos7.add(0, 0, 1))) { - return PlaceInfo(pos7.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos7.add(0, 0, -1))) { - return PlaceInfo(pos7.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos8 = pos6.add(-1, 0, 0) - if (BlockUtils.canBeClicked(pos8.add(0, -1, 0))) { - return PlaceInfo(pos8.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos8.add(-1, 0, 0))) { - return PlaceInfo(pos8.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos8.add(1, 0, 0))) { - return PlaceInfo(pos8.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos8.add(0, 0, 1))) { - return PlaceInfo(pos8.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos8.add(0, 0, -1))) { - return PlaceInfo(pos8.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos9 = pos6.add(0, 0, 1) - if (BlockUtils.canBeClicked(pos9.add(0, -1, 0))) { - return PlaceInfo(pos9.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos9.add(-1, 0, 0))) { - return PlaceInfo(pos9.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos9.add(1, 0, 0))) { - return PlaceInfo(pos9.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos9.add(0, 0, 1))) { - return PlaceInfo(pos9.add(0, 0, 1), EnumFacing.NORTH) - } - if (BlockUtils.canBeClicked(pos9.add(0, 0, -1))) { - return PlaceInfo(pos9.add(0, 0, -1), EnumFacing.SOUTH) - } - val pos10 = pos6.add(0, 0, -1) - if (BlockUtils.canBeClicked(pos10.add(0, -1, 0))) { - return PlaceInfo(pos10.add(0, -1, 0), EnumFacing.UP) - } - if (BlockUtils.canBeClicked(pos10.add(-1, 0, 0))) { - return PlaceInfo(pos10.add(-1, 0, 0), EnumFacing.EAST) - } - if (BlockUtils.canBeClicked(pos10.add(1, 0, 0))) { - return PlaceInfo(pos10.add(1, 0, 0), EnumFacing.WEST) - } - if (BlockUtils.canBeClicked(pos10.add(0, 0, 1))) { - return PlaceInfo(pos10.add(0, 0, 1), EnumFacing.NORTH) - } - return if (BlockUtils.canBeClicked(pos10.add(0, 0, -1))) { - PlaceInfo(pos10.add(0, 0, -1), EnumFacing.SOUTH) - } else null - } + fun get(pos: BlockPos) = EnumFacing.entries.find { + it != EnumFacing.UP && pos.offset(it).canBeClicked() + }?.let { side -> PlaceInfo(pos.offset(side), side.opposite) } } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/item/ArmorComparator.kt b/src/main/java/net/ccbluex/liquidbounce/utils/item/ArmorComparator.kt index 0dd1b60..fa41e83 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/item/ArmorComparator.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/item/ArmorComparator.kt @@ -33,43 +33,46 @@ object ArmorComparator: MinecraftInstance() { val inventoryStacks = stacks.indexedArmorStacks() - val armorMap = - (droppedStacks + equippedArmorWhenInChest + inventoryStacks) - .asSequence() - .sortedBy { (index, stack) -> - // Sort items by distance from player, equipped items are always preferred with distance -1 - if (index == -1) - thePlayer.getDistanceSqToEntity(entityStacksMap?.get(stack) ?: return@sortedBy -1.0) - else -1.0 - } - // Prioritise sets that are in lower parts of inventory (not in chest) or equipped, prevents stealing multiple armor duplicates. - .sortedByDescending { - if (it.second in thePlayer.inventory.armorInventory) Int.MAX_VALUE - else it.first ?: Int.MAX_VALUE - } - // Prioritise sets with more durability, enchantments - .sortedByDescending { it.second.totalDurability } - .sortedByDescending { it.second.enchantmentCount } - .sortedByDescending { it.second.enchantmentSum } - .groupBy { (it.second.item as ItemArmor).armorType } + val comparator = Comparator.comparingDouble> { (index, stack) -> + // Sort items by distance from player, equipped items are always preferred with distance -1 + if (index == -1) + thePlayer.getDistanceSqToEntity(entityStacksMap?.get(stack) ?: return@comparingDouble -1.0) + else -1.0 + }.thenComparingInt { (index, stack) -> + // Prioritise sets that are in lower parts of inventory (not in chest) or equipped, prevents stealing multiple armor duplicates. + if (stack in thePlayer.inventory.armorInventory) Int.MIN_VALUE + else index?.inv() ?: Int.MIN_VALUE + }.thenComparingInt { + if (it.second in thePlayer.inventory.armorInventory) Int.MAX_VALUE + else it.first ?: Int.MAX_VALUE + }.thenComparingInt { + // Prioritise sets with more durability, enchantments + -it.second.totalDurability + }.thenComparingInt { + -it.second.enchantmentCount + }.thenComparingInt { + -it.second.enchantmentSum + } + val armorMap = (droppedStacks + equippedArmorWhenInChest + inventoryStacks) + .sortedWith(comparator) + .groupBy { (it.second.item as ItemArmor).armorType } val helmets = armorMap[0] ?: NULL_LIST val chestplates = armorMap[1] ?: NULL_LIST val leggings = armorMap[2] ?: NULL_LIST val boots = armorMap[3] ?: NULL_LIST - val armorCombinations = - helmets.flatMap { helmet -> - chestplates.flatMap { chestplate -> - leggings.flatMap { leggings -> - boots.map { boots -> - ArmorSet(helmet, chestplate, leggings, boots) + return sequence { + helmets.forEach { helmet -> + chestplates.forEach { chestplate -> + leggings.forEach { leggings -> + boots.forEach { boots -> + yield(ArmorSet(helmet, chestplate, leggings, boots)) } } } } - - return armorCombinations.maxByOrNull { it.defenseFactor } + }.maxByOrNull { it.defenseFactor } } } @@ -85,7 +88,7 @@ object ArmorComparator: MinecraftInstance() { * and an ItemStack. Only ItemStacks where the item is an instance of ItemArmor are included in the list. * If the iterable is null, an empty list is returned. */ -private fun Iterable?.indexedArmorStacks(indexCallback: (Int) -> Int? = { it }): List> = +private inline fun Iterable?.indexedArmorStacks(indexCallback: (Int) -> Int? = { it }): List> = this?.mapIndexedNotNull { index, stack -> if (stack?.item is ItemArmor) indexCallback(index) to stack else null