diff --git a/src/main/java/net/ccbluex/liquidbounce/FDPClient.kt b/src/main/java/net/ccbluex/liquidbounce/FDPClient.kt index d80bf32..06ee8d3 100644 --- a/src/main/java/net/ccbluex/liquidbounce/FDPClient.kt +++ b/src/main/java/net/ccbluex/liquidbounce/FDPClient.kt @@ -31,6 +31,7 @@ import net.ccbluex.liquidbounce.ui.i18n.LanguageManager import net.ccbluex.liquidbounce.ui.sound.TipSoundManager import net.ccbluex.liquidbounce.utils.* import net.ccbluex.liquidbounce.utils.misc.HttpUtils +import net.ccbluex.liquidbounce.utils.timing.WaitTickUtils import net.minecraft.client.Minecraft import net.minecraft.client.gui.GuiScreen import net.minecraft.util.ResourceLocation @@ -136,10 +137,12 @@ object FDPClient { eventManager.registerListener(InventoryUtils) eventManager.registerListener(BungeeCordSpoof()) eventManager.registerListener(ServerSpoof) + eventManager.registerListener(WaitTickUtils) eventManager.registerListener(SessionUtils()) eventManager.registerListener(StatisticsUtils()) eventManager.registerListener(LocationCache()) eventManager.registerListener(PacketUtils) + eventManager.registerListener(MiniMapRegister) eventManager.registerListener(macroManager) eventManager.registerListener(combatManager) diff --git a/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt b/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt index 2267976..7709852 100644 --- a/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt +++ b/src/main/java/net/ccbluex/liquidbounce/event/EventManager.kt @@ -26,9 +26,10 @@ class EventManager : MinecraftInstance() { val eventClass = method.parameterTypes[0] as Class val eventTarget = method.getAnnotation(EventTarget::class.java) - val invokableEventTargets = registry.getOrDefault(eventClass, ArrayList()) - invokableEventTargets += EventHook(listener, method, eventTarget) - registry[eventClass] = invokableEventTargets.sortedByDescending { it.priority }.toMutableList() + with(registry.getOrPut(eventClass, ::ArrayList)) { + this += EventHook(listener, method, eventTarget) + this.sortByDescending { it.priority } + } } } diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/Module.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/Module.kt index 2be19d5..fe2fd8e 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/Module.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/Module.kt @@ -26,6 +26,14 @@ import java.util.ArrayList open class Module : MinecraftInstance(), Listenable { // Module information + + // List to register additional options from classes + private val configurables = mutableListOf>() + + fun addConfigurable(provider: Any) { + configurables += provider::class.java + } + var slideStep = 0F val translate = Translate(0F,0F) val tab = Translate(0f , 0f) diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Velocity.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/AntiKB.kt similarity index 91% rename from src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Velocity.kt rename to src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/AntiKB.kt index 42944eb..6e16a38 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/Velocity.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/AntiKB.kt @@ -15,11 +15,13 @@ import net.ccbluex.liquidbounce.features.value.BoolValue import net.ccbluex.liquidbounce.features.value.FloatValue import net.ccbluex.liquidbounce.features.value.IntegerValue import net.ccbluex.liquidbounce.features.value.ListValue -import net.ccbluex.liquidbounce.script.api.global.Chat import net.ccbluex.liquidbounce.utils.* import net.ccbluex.liquidbounce.utils.EntityUtils.isLookingOnEntities import net.ccbluex.liquidbounce.utils.EntityUtils.isSelected +import net.ccbluex.liquidbounce.utils.PacketUtils.sendPacket +import net.ccbluex.liquidbounce.utils.RaycastUtils.runWithModifiedRaycastResult import net.ccbluex.liquidbounce.utils.extensions.getDistanceToEntityBox +import net.ccbluex.liquidbounce.utils.misc.RandomUtils import net.ccbluex.liquidbounce.utils.misc.RandomUtils.nextInt import net.ccbluex.liquidbounce.utils.particles.Vec3 import net.ccbluex.liquidbounce.utils.timer.MSTimer @@ -46,29 +48,29 @@ import kotlin.math.atan2 import kotlin.math.floor import kotlin.math.sqrt -@ModuleInfo(name = "Velocity", category = ModuleCategory.COMBAT) -object Velocity : Module() { +@ModuleInfo(name = "AntiKB", category = ModuleCategory.COMBAT) +object AntiKB : Module() { private val mainMode = - ListValue("MainMode", arrayOf("Vanilla", "Cancel", "AAC", "Matrix","GrimAC", "Reverse", "Other"), "Vanilla") + ListValue("MainMode", arrayOf("Vanilla", "Cancel", "AAC", "Matrix","GrimAC", "Reverse", "Other").sortedArray(), "Vanilla") private val vanillaMode = ListValue( "VanillaMode", - arrayOf("Jump", "Simple", "Glitch"), + arrayOf("Jump", "Simple", "Glitch").sortedArray(), "Jump" ).displayable { mainMode.get() == "Vanilla" } private val grimMode = ListValue( "GrimACMode", - arrayOf("GrimReduce","GrimVertical"), + arrayOf("GrimReduce","GrimVertical","GrimClick").sortedArray(), "GrimReduce" ).displayable { mainMode.get() == "GrimAC" } private val cancelMode = ListValue( "CancelMode", - arrayOf("S12Cancel", "S32Cancel", "SendC0F", "HighVersion", "GrimS32Cancel", "GrimC07", "Spoof"), + arrayOf("S12Cancel", "S32Cancel", "SendC0F", "HighVersion", "GrimS32Cancel", "GrimC07", "Spoof").sortedArray(), "S12Cancel" - ).displayable { mainMode.get() in arrayOf("Cancel") } - private val matrixMode = ListValue( - "Mode", arrayOf( + ).displayable { mainMode.get() == "Cancel" } + private val matMode = ListValue( + "MatrixMode", arrayOf( "Ground", "Attack", "Reduce", @@ -77,21 +79,21 @@ object Velocity : Module() { "Simple", "Spoof", "Clip" - ), "Ground" + ).sortedArray(), "Ground" ).displayable { mainMode.get() == "Matrix" } private val aacMode = ListValue( "AACMode", - arrayOf("AAC4Reduce", "AAC5Reduce","AAC5.2Reduce", "AAC5.2.0", "AAC5Vertical", "AAC5.2.0Combat", "AACPush", "AACZero"), + arrayOf("AAC4Reduce", "AAC5Reduce","AAC5.2Reduce", "AAC5.2.0", "AAC5Vertical", "AAC5.2.0Combat", "AACPush", "AACZero").sortedArray(), "AAC4Reduce" ).displayable { mainMode.get() == "AAC" } private val reverseMode = ListValue( "ReverseMode", - arrayOf("Reverse", "SmoothReverse"), + arrayOf("Reverse", "SmoothReverse").sortedArray(), "Reverse" ).displayable { mainMode.get() == "Reverse" } private val otherMode = ListValue( "OtherMode", - arrayOf("AttackReduce", "IntaveReduce", "Karhu", "Delay", "Phase"), + arrayOf("AttackReduce","BlocksMC", "IntaveReduce", "Karhu", "Delay", "Phase").sortedArray(), "AttackReduce" ).displayable { mainMode.get() == "Other" } @@ -293,6 +295,14 @@ object Velocity : Module() { private val reduceCount = IntegerValue("ReduceCount",4,1,10).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimReduce" } private val reduceTimes = IntegerValue("ReduceTimes",1,1,5).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimReduce" } + private val minClick = IntegerValue("MinClicks",3,1,20).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val maxClick = IntegerValue("MaxClicks",3,1,20).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val hurtTimeToClick = IntegerValue("HurtTimeToClick", 10, 0,10).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val whenFacingEnemyOnly = BoolValue("WhenFacingEnemyOnly", true).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val ignoreBlocking = BoolValue("IgnoreBlocking", false).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val clickRange = FloatValue("ClickRange", 3f, 1f,6f).displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + private val swingMode = ListValue("SwingMode", arrayOf("Off", "Normal", "Packet"), "Normal").displayable { mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick"} + // private var hasReceivedVelocity = false private val velocityTimer = MSTimer() @@ -496,7 +506,7 @@ object Velocity : Module() { "matrix" -> { if (packet is S12PacketEntityVelocity) { - when (matrixMode.get().lowercase()) { + when (matMode.get().lowercase()) { "spoof" -> { event.cancelEvent() mc.netHandler.addToSendQueue( @@ -576,6 +586,18 @@ object Velocity : Module() { } } + "blocksmc" -> { + if (packet is S12PacketEntityVelocity && packet.entityID == mc.thePlayer.entityId) { + event.cancelEvent() + hasReceivedVelocity = true + + PacketUtils.sendPackets( + C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.START_SNEAKING), + C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.STOP_SNEAKING) + ) + } + } + "intavereduce", "attackreduce" -> hasReceivedVelocity = true "phase" -> { if (packet is S12PacketEntityVelocity) { @@ -782,6 +804,13 @@ object Velocity : Module() { } } } + + "blocksmc" -> if (hasReceivedVelocity) { + if (packet is C0BPacketEntityAction) { + hasReceivedVelocity = false + event.cancelEvent() + } + } } } } @@ -833,6 +862,10 @@ object Velocity : Module() { @EventTarget fun onTick(event: GameTickEvent) { + val thePlayer = mc.thePlayer ?: return + + mc.theWorld ?: return + if (mainMode.get() == "Cancel" && cancelMode.get() == "GrimC07") { if (hasReceivedVelocity || alwaysValue.get()) { // packet processed event pls val pos = BlockPos(mc.thePlayer.posX, mc.thePlayer.posY, mc.thePlayer.posZ) @@ -841,13 +874,50 @@ object Velocity : Module() { } } } + + if (mainMode.get() == "GrimAC" && grimMode.get() == "GrimClick") { + if (thePlayer.hurtTime != hurtTimeToClick.get() || ignoreBlocking.get() && (thePlayer.isBlocking || KillAura.blockingStatus)) + return + + var entity = mc.objectMouseOver?.entityHit + + if (entity == null) { + if (whenFacingEnemyOnly.get()) { + var result: Entity? = null + + runWithModifiedRaycastResult( + RotationUtils.targetRotation ?: thePlayer.rotation, + clickRange.get().toDouble(), + 0.0 + ) { it -> + result = it.entityHit?.takeIf { isSelected(it, true) } + } + + entity = result!! + } else getNearestEntityInRange(clickRange.get())?.takeIf { isSelected(it, true) } + } + + entity ?: return + + val swingHand = { + when (swingMode.get().lowercase()) { + "normal" -> thePlayer.swingItem() + "packet" -> sendPacket(C0APacketAnimation()) + } + } + val clicks = nextInt(minClick.get(), maxClick.get()) + + repeat(clicks) { + thePlayer.attackEntityWithModifiedSprint(entity, true) { swingHand() } + } + } } @EventTarget fun onAttack(event: AttackEvent) { val player = mc.thePlayer ?: return when (mainMode.get().lowercase()) { - "matrix" -> when (matrixMode.get().lowercase()) { + "matrix" -> when (matMode.get().lowercase()) { "attack" -> { if (hasReceivedVelocity) { if (player.isSprinting) { @@ -949,16 +1019,16 @@ object Velocity : Module() { when (grimMode.get().lowercase()) { "grimreduce" -> { val objectMouseOver = mc.objectMouseOver ?: return - if (unReduceTimes > 0 && mc.thePlayer.hurtTime > 0 && objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && objectMouseOver.entityHit is EntityPlayer) { + if (unReduceTimes > 0 && mc.thePlayer.hurtTime > 0 && (objectMouseOver.typeOfHit == MovingObjectPosition.MovingObjectType.ENTITY && objectMouseOver.entityHit is EntityPlayer) || (KillAura.handleEvents() && KillAura.currentTarget != null)) { if (!mc.thePlayer.serverSprintState) { - PacketUtils.sendPacket(C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.START_SPRINTING)) + sendPacket(C0BPacketEntityAction(mc.thePlayer, C0BPacketEntityAction.Action.START_SPRINTING)) mc.thePlayer.serverSprintState = true mc.thePlayer.isSprinting = true } for (i in 0 until reduceCount.get()) { mc.thePlayer.swingItem() - PacketUtils.sendPacket(C02PacketUseEntity(mc.objectMouseOver.entityHit,C02PacketUseEntity.Action.ATTACK)) + sendPacket(C02PacketUseEntity(mc.objectMouseOver.entityHit,C02PacketUseEntity.Action.ATTACK)) mc.thePlayer.motionX *= 0.6 mc.thePlayer.motionZ *= 0.6 @@ -1188,7 +1258,7 @@ object Velocity : Module() { } "matrix" -> { - when (matrixMode.get().lowercase()) { + when (matMode.get().lowercase()) { "ground" -> isMatrixOnGround = player.onGround && !mc.gameSettings.keyBindJump.isKeyDown "clip" -> { if (player.hurtTime in 1..4 && player.fallDistance > 0) { @@ -1462,10 +1532,18 @@ object Velocity : Module() { return motionNoXZ } + private fun getNearestEntityInRange(range: Float = this.range.get()): Entity? { + val player = mc.thePlayer ?: return null + + return mc.theWorld.loadedEntityList.asSequence().filter { + isSelected(it, true) && player.getDistanceToEntityBox(it) <= range + }.minByOrNull { player.getDistanceToEntityBox(it) } + } + override val tag: String get() = when (mainMode.get().lowercase()) { "cancel" -> cancelMode.get() - "matrix" -> matrixMode.get() + "matrix" -> matMode.get() "other" -> otherMode.get() "vanilla" -> vanillaMode.get() "aac" -> aacMode.get() 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 c85bd19..97d7097 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 @@ -8,17 +8,13 @@ package net.ccbluex.liquidbounce.features.module.modules.combat import kevin.utils.component1 import kevin.utils.component2 import kevin.utils.component3 -import kevin.utils.minus import net.ccbluex.liquidbounce.FDPClient import net.ccbluex.liquidbounce.event.* import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.features.module.ModuleCategory import net.ccbluex.liquidbounce.features.module.ModuleInfo import net.ccbluex.liquidbounce.features.module.modules.player.Blink -import net.ccbluex.liquidbounce.features.value.BoolValue -import net.ccbluex.liquidbounce.features.value.FloatValue -import net.ccbluex.liquidbounce.features.value.IntegerValue -import net.ccbluex.liquidbounce.features.value.ListValue +import net.ccbluex.liquidbounce.features.value.* import net.ccbluex.liquidbounce.injection.implementations.IMixinEntity import net.ccbluex.liquidbounce.utils.* import net.ccbluex.liquidbounce.utils.EntityUtils.isSelected @@ -28,6 +24,8 @@ import net.ccbluex.liquidbounce.utils.render.ColorUtils.rainbow import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawBacktrackBox import net.ccbluex.liquidbounce.utils.render.RenderUtils.glColor import net.ccbluex.liquidbounce.utils.timer.MSTimer +import net.ccbluex.liquidbounce.utils.timer.TimeUtils.randomDelay +import net.minecraft.client.renderer.GlStateManager.color import net.minecraft.entity.Entity import net.minecraft.entity.EntityLivingBase import net.minecraft.entity.player.EntityPlayer @@ -36,24 +34,28 @@ import net.minecraft.network.handshake.client.C00Handshake import net.minecraft.network.play.server.* import net.minecraft.network.status.client.C00PacketServerQuery import net.minecraft.network.status.server.S01PacketPong -import net.minecraft.util.AxisAlignedBB import net.minecraft.util.Vec3 import net.minecraft.world.WorldSettings import org.lwjgl.opengl.GL11.* import java.awt.Color import java.util.* import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentLinkedQueue -@ModuleInfo("BackTrack", category = ModuleCategory.COMBAT) +@ModuleInfo("Backtrack", category = ModuleCategory.COMBAT) object Backtrack : Module() { private val nextBacktrackDelay = IntegerValue("NextBacktrackDelay", 0, 0,2000).displayable { mode.get() == "Modern" } - private val delay = object : IntegerValue("Delay", 80, 0,700) { - override fun onChange(oldValue: Int, newValue: Int) { - if (mode.get() == "Modern") { - clearPackets() - reset() - } + private val maxDelay: IntegerValue = object : IntegerValue("MaxDelay", 80, 0,700) { + override fun onChanged(oldValue: Int, newValue: Int) { + val i = minDelay.get() + if (i > newValue) set(i) + } + } + private val minDelay: IntegerValue = object : IntegerValue("MinDelay", 80, 0,700) { + override fun onChanged(oldValue: Int, newValue: Int) { + val i = maxDelay.get() + if (i < newValue) set(i) } } @@ -75,35 +77,32 @@ object Backtrack : Module() { private val style = ListValue("Style", arrayOf("Pulse", "Smooth"), "Smooth").displayable { mode.get() == "Modern" } private val maxDistance: FloatValue = object : FloatValue("MaxDistance", 3.0f, 0.0f,3.5f) { + override fun onChanged(oldValue: Float, newValue: Float) { + val i = minDistance.get() + if (i > newValue) set(i) + } } + private val minDistance = object : FloatValue("MinDistance", 2.0f, 0.0f,3.0f) { + override fun onChanged(oldValue: Float, newValue: Float) { + val i = maxDistance.get() + if (i < newValue) set(i) + } } private val smart = BoolValue("Smart", true).displayable { mode.get() == "Modern" } // ESP - val espMode = ListValue( + private val espMode = ListValue( "ESP-Mode", - arrayOf("None", "Box", "Model"), + arrayOf("None", "Box", "Model", "Wireframe"), "Box", ).displayable { mode.get() == "Modern" } - private val rainbow = BoolValue("Rainbow", true).displayable { mode.get() == "Modern" && espMode.get() == "Box" } - private val red = IntegerValue( - "R", - 0, - 0,255, - ).displayable { !rainbow.get() && mode.get() == "Modern" && espMode.get() == "Box" } - private val green = IntegerValue( - "G", - 255, - 0,255, - ).displayable { !rainbow.get() && mode.get() == "Modern" && espMode.get() == "Box" } - private val blue = IntegerValue( - "B", - 0, - 0,255, - ).displayable { !rainbow.get() && mode.get() == "Modern" && espMode.get() == "Box" } - - private val packetQueue = LinkedHashMap, Long>() + private val wireframeWidth = FloatValue("WireFrame-Width", 1f, 0.5f,5f).displayable { espMode.get() == "WireFrame" } + + private val espColorMode = ListValue("ESP-Color", arrayOf("Custom", "Rainbow"), "Custom").displayable { espMode.get() != "Model" && mode.get() == "Modern" } + private val espColor = ColorSettingsInteger(this, "ESP", withAlpha = false) { espColorMode.get() == "Custom" && espMode.get() != "Model" && mode.get() == "Modern" }.with(0, 255, 0) + + private val packetQueue = ConcurrentLinkedQueue() private val positions = mutableListOf>() var target: EntityLivingBase? = null @@ -116,6 +115,11 @@ object Backtrack : Module() { private var delayForNextBacktrack = 0L + private var modernDelay = randomDelay(minDelay.get(), maxDelay.get()) to false + + private val supposedDelay + get() = if (mode.get() == "Modern") modernDelay.first else maxDelay.get() + // Legacy private val maximumCachedPositions = IntegerValue("MaxCachedPositions", 10, 1,20).displayable { mode.get() == "Legacy" } @@ -123,14 +127,17 @@ object Backtrack : Module() { private val nonDelayedSoundSubstrings = arrayOf("game.player.hurt", "game.player.die") + val isPacketQueueEmpty + get() = synchronized(packetQueue) { packetQueue.isEmpty() } + + val areQueuedPacketsEmpty + get() = PacketUtils.queuedPackets.run { synchronized(this) { isEmpty() } } + @EventTarget fun onPacket(event: PacketEvent) { val packet = event.packet - if (FDPClient.moduleManager[Blink::class.java]!!.state) - return - - if (event.isCancelled) + if (FDPClient.moduleManager[Blink::class.java]!!.state || event.isCancelled) return when (mode.get().lowercase()) { @@ -148,35 +155,31 @@ object Backtrack : Module() { ) } - is S14PacketEntity -> { - if (legacyPos.get() == "ServerPos") { - val entity = mc.theWorld?.getEntityByID(packet.entityId) - val entityMixin = entity as? IMixinEntity - if (entityMixin != null) { - addBacktrackData( - entity.uniqueID, - entityMixin.trueX, - entityMixin.trueY, - entityMixin.trueZ, - System.currentTimeMillis() - ) - } + is S14PacketEntity -> if (legacyPos.get() == "ServerPos") { + val entity = mc.theWorld?.getEntityByID(packet.entityId) + val entityMixin = entity as? IMixinEntity + if (entityMixin != null) { + addBacktrackData( + entity.uniqueID, + entityMixin.trueX, + entityMixin.trueY, + entityMixin.trueZ, + System.currentTimeMillis() + ) } } - is S18PacketEntityTeleport -> { - if (legacyPos.get() == "ServerPos") { - val entity = mc.theWorld?.getEntityByID(packet.entityId) - val entityMixin = entity as? IMixinEntity - if (entityMixin != null) { - addBacktrackData( - entity.uniqueID, - entityMixin.trueX, - entityMixin.trueY, - entityMixin.trueZ, - System.currentTimeMillis() - ) - } + is S18PacketEntityTeleport -> if (legacyPos.get() == "ServerPos") { + val entity = mc.theWorld?.getEntityByID(packet.entityId) + val entityMixin = entity as? IMixinEntity + if (entityMixin != null) { + addBacktrackData( + entity.uniqueID, + entityMixin.trueX, + entityMixin.trueY, + entityMixin.trueZ, + System.currentTimeMillis() + ) } } } @@ -184,84 +187,70 @@ object Backtrack : Module() { "modern" -> { // Prevent cancelling packets when not needed - if (packetQueue.isEmpty() && PacketUtils.queuedPackets.isEmpty() && !shouldBacktrack()) + if (isPacketQueueEmpty && areQueuedPacketsEmpty && !shouldBacktrack()) return when (packet) { // Ignore server related packets - is C00Handshake, is C00PacketServerQuery, is S02PacketChat, is S01PacketPong -> - return + is C00Handshake, is C00PacketServerQuery, is S02PacketChat, is S01PacketPong -> return - // Flush on teleport or disconnect - is S08PacketPlayerPosLook, is S40PacketDisconnect -> { + is S29PacketSoundEffect -> if (nonDelayedSoundSubstrings in packet.soundName) return + + // Flush on own death + is S06PacketUpdateHealth -> if (packet.health <= 0) { clearPackets() return } - is S29PacketSoundEffect -> - if (nonDelayedSoundSubstrings in packet.soundName) - return + is S13PacketDestroyEntities -> if (target != null && target!!.entityId in packet.entityIDs) { + clearPackets() + reset() + return + } - // Flush on own death - is S06PacketUpdateHealth -> - if (packet.health <= 0) { - clearPackets() - return - } + is S1CPacketEntityMetadata -> if (target?.entityId == packet.entityId) { + val metadata = packet.func_149376_c() ?: return - is S13PacketDestroyEntities -> - if (target != null && target!!.entityId in packet.entityIDs) { - clearPackets() - reset() - return - } - - is S1CPacketEntityMetadata -> - if (target?.entityId == packet.entityId) { - val metadata = packet.func_149376_c() ?: return - - metadata.forEach { - if (it.dataValueId == 6) { - val objectValue = it.getObject().toString().toDoubleOrNull() - if (objectValue != null && !objectValue.isNaN() && objectValue <= 0.0) { - clearPackets() - reset() - return - } + metadata.forEach { + if (it.dataValueId == 6) { + val objectValue = it.getObject().toString().toDoubleOrNull() + if (objectValue != null && !objectValue.isNaN() && objectValue <= 0.0) { + clearPackets() + reset() + return } } - - return } - is S19PacketEntityStatus -> - if (packet.entityId == target?.entityId) - return + return + } + + is S19PacketEntityStatus -> if (packet.entityId == target?.entityId) return } // Cancel every received packet to avoid possible server synchronization issues from random causes. if (event.eventType == EventState.RECEIVE) { when (packet) { - is S14PacketEntity -> - if (packet.entityId == target?.entityId) - (target as? IMixinEntity)?.run { - synchronized(positions) { - positions += Pair(Vec3(trueX, trueY, trueZ), System.currentTimeMillis()) - } + is S14PacketEntity -> if (packet.entityId == target?.entityId) { + (target as? IMixinEntity)?.run { + synchronized(positions) { + positions += Pair(Vec3(trueX, trueY, trueZ), System.currentTimeMillis()) } + } + } - is S18PacketEntityTeleport -> - if (packet.entityId == target?.entityId) - (target as? IMixinEntity)?.run { - synchronized(positions) { - positions += Pair(Vec3(trueX, trueY, trueZ), System.currentTimeMillis()) - } + is S18PacketEntityTeleport -> if (packet.entityId == target?.entityId) { + (target as? IMixinEntity)?.run { + synchronized(positions) { + positions += Pair(Vec3(trueX, trueY, trueZ), System.currentTimeMillis()) } + } + } } event.cancelEvent() synchronized(packetQueue) { - packetQueue[packet] = System.currentTimeMillis() + packetQueue += QueueData(packet, System.currentTimeMillis()) } } } @@ -273,7 +262,7 @@ object Backtrack : Module() { if (mode.get() == "Legacy") { backtrackedPlayer.forEach { (key, backtrackData) -> // Remove old data - backtrackData.removeAll { it.time + delay.get() < System.currentTimeMillis() } + backtrackData.removeAll { it.time + supposedDelay < System.currentTimeMillis() } // Remove player if there is no data left. This prevents memory leaks. if (backtrackData.isEmpty()) @@ -283,6 +272,7 @@ object Backtrack : Module() { val target = target val targetMixin = target as? IMixinEntity + if (mode.get() == "Modern") { if (targetMixin != null) { if (!FDPClient.moduleManager[Blink::class.java]!!.state && shouldBacktrack() && targetMixin.truePos) { @@ -290,15 +280,16 @@ object Backtrack : Module() { val dist = mc.thePlayer.getDistance(target.posX, target.posY, target.posZ) if (trueDist <= 6f && (!smart.get() || trueDist >= dist) && (style.get() == "Smooth" || !globalTimer.hasTimePassed( - delay.get().toLong() + supposedDelay.toLong() )) ) { shouldRender = true - if (mc.thePlayer.getDistanceToEntityBox(target) in minDistance.get()..maxDistance.get()) + if (mc.thePlayer.getDistanceToEntityBox(target) in minDistance.get()..maxDistance.get()) { handlePackets() - else + } else { handlePacketsRange() + } } else { clearPackets() globalTimer.reset() @@ -313,6 +304,23 @@ object Backtrack : Module() { ignoreWholeTick = false } + /** + * Priority lower than [PacketUtils] GameLoopEvent function's priority. + */ + @EventTarget(priority = -6) + fun onQueuePacketClear(event: GameLoopEvent) { + val shouldChangeDelay = isPacketQueueEmpty && areQueuedPacketsEmpty + + if (!shouldChangeDelay) { + modernDelay = modernDelay.first to false + } + + if (shouldChangeDelay && !modernDelay.second && !shouldBacktrack()) { + delayForNextBacktrack = System.currentTimeMillis() + nextBacktrackDelay.get() + modernDelay = randomDelay(minDelay.get(), maxDelay.get()) to true + } + } + @EventTarget fun onAttack(event: AttackEvent) { if (!isSelected(event.targetEntity, true)) @@ -331,6 +339,8 @@ object Backtrack : Module() { @EventTarget fun onRender3D(event: Render3DEvent) { + val manager = mc.renderManager ?: return + when (mode.get().lowercase()) { "legacy" -> { val color = Color.RED @@ -349,12 +359,8 @@ object Backtrack : Module() { glBegin(GL_LINE_STRIP) glColor(color) - val renderPosX = mc.renderManager.viewerPosX - val renderPosY = mc.renderManager.viewerPosY - val renderPosZ = mc.renderManager.viewerPosZ - loopThroughBacktrackData(entity) { - glVertex3d(entity.posX - renderPosX, entity.posY - renderPosY, entity.posZ - renderPosZ) + (entity.currPos - manager.renderPos).let { glVertex3d(it.xCoord, it.yCoord, it.zCoord) } false } @@ -370,35 +376,76 @@ object Backtrack : Module() { } "modern" -> { - if (!shouldBacktrack() || packetQueue.isEmpty() || !shouldRender) + if (!shouldBacktrack() || !shouldRender) return - if (espMode.get() != "Box") return - - val renderManager = mc.renderManager - target?.run { val targetEntity = target as IMixinEntity + val (x, y, z) = targetEntity.interpolatedPosition - manager.renderPos + if (targetEntity.truePos) { - val (x, y, z) = targetEntity.interpolatedPosition - Vec3( - renderManager.renderPosX, - renderManager.renderPosY, - renderManager.renderPosZ - ) + when (espMode.get().lowercase()) { + "box" -> { + val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) - val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) - - drawBacktrackBox( - AxisAlignedBB.fromBounds( - axisAlignedBB.minX, - axisAlignedBB.minY, - axisAlignedBB.minZ, - axisAlignedBB.maxX, - axisAlignedBB.maxY, - axisAlignedBB.maxZ - ), color - ) + drawBacktrackBox(axisAlignedBB, color) + } + + "model" -> { + glPushMatrix() + glPushAttrib(GL_ALL_ATTRIB_BITS) + color(0.6f, 0.6f, 0.6f, 1f) + manager.doRenderEntity( + this, + x, y, z, + prevRotationYaw + (rotationYaw - prevRotationYaw) * event.partialTicks, + event.partialTicks, + true + ) + + glPopAttrib() + glPopMatrix() + } + + "wireframe" -> { + val color = if (espColorMode.get() == "Rainbow") rainbow() else Color(espColor.color().rgb) + + glPushMatrix() + glPushAttrib(GL_ALL_ATTRIB_BITS) + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + glDisable(GL_TEXTURE_2D) + glDisable(GL_LIGHTING) + glDisable(GL_DEPTH_TEST) + glEnable(GL_LINE_SMOOTH) + + glEnable(GL_BLEND) + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + + glLineWidth(wireframeWidth.get()) + + glColor(color) + manager.doRenderEntity( + this, + x, y, z, + prevRotationYaw + (rotationYaw - prevRotationYaw) * event.partialTicks, + event.partialTicks, + true + ) + glColor(color) + manager.doRenderEntity( + this, + x, y, z, + prevRotationYaw + (rotationYaw - prevRotationYaw) * event.partialTicks, + event.partialTicks, + true + ) + + glPopAttrib() + glPopMatrix() + } + } } } } @@ -429,8 +476,7 @@ object Backtrack : Module() { } } - override fun onEnable() = - reset() + override fun onEnable() = reset() override fun onDisable() { clearPackets() @@ -439,66 +485,75 @@ object Backtrack : Module() { private fun handlePackets() { synchronized(packetQueue) { - packetQueue.entries.removeAll { (packet, timestamp) -> - if (timestamp <= System.currentTimeMillis() - delay.get()) { - PacketUtils.queuedPackets.add(packet) + packetQueue.removeAll { (packet, timestamp) -> + if (timestamp <= System.currentTimeMillis() - supposedDelay) { + schedulePacketProcess(packet) true } else false } } + synchronized(positions) { - positions.removeAll { (_, timestamp) -> timestamp < System.currentTimeMillis() - delay.get() } + positions.removeAll { (_, timestamp) -> timestamp < System.currentTimeMillis() - supposedDelay } } } private fun handlePacketsRange() { val time = getRangeTime() + if (time == -1L) { clearPackets() return } + synchronized(packetQueue) { - packetQueue.entries.removeAll { (packet, timestamp) -> + packetQueue.removeAll { (packet, timestamp) -> if (timestamp <= time) { - PacketUtils.queuedPackets.add(packet) + schedulePacketProcess(packet) true } else false } } + synchronized(positions) { positions.removeAll { (_, timestamp) -> timestamp < time } } } private fun getRangeTime(): Long { - if (target == null) return 0L + val target = this.target ?: return 0L + var time = 0L var found = false + synchronized(positions) { for (data in positions) { time = data.second - val targetPos = Vec3(target!!.posX, target!!.posY, target!!.posZ) + + val targetPos = target.currPos + val (dx, dy, dz) = data.first - targetPos - val targetBox = target!!.hitBox.offset(dx, dy, dz) + val targetBox = target.hitBox.offset(dx, dy, dz) + if (mc.thePlayer.getDistanceToBox(targetBox) in minDistance.get()..maxDistance.get()) { found = true break } } } + return if (found) time else -1L } private fun clearPackets(handlePackets: Boolean = true) { - if (packetQueue.isNotEmpty()) { - delayForNextBacktrack = System.currentTimeMillis() + nextBacktrackDelay.get() - } - synchronized(packetQueue) { - if (handlePackets) - PacketUtils.queuedPackets.addAll(packetQueue.keys) + packetQueue.removeAll { + if (handlePackets) { + schedulePacketProcess(it.packet) + } - packetQueue.clear() + true + } } positions.clear() @@ -618,10 +673,11 @@ object Backtrack : Module() { } val color - get() = if (rainbow.get()) rainbow() else Color(red.get(), green.get(), blue.get()) + get() = if (espColorMode.get() == "Rainbow") rainbow() else Color(espColor.color().rgb) - fun shouldBacktrack() = - mc.thePlayer != null && target != null && mc.thePlayer.health > 0 && (target!!.health > 0 || target!!.health.isNaN()) && mc.playerController.currentGameType != WorldSettings.GameType.SPECTATOR && System.currentTimeMillis() >= delayForNextBacktrack && target?.let { + private fun shouldBacktrack() = + mc.thePlayer != null && mc.theWorld != null && target != null && mc.thePlayer.health > 0 && (target!!.health > 0 || target!!.health.isNaN()) + && mc.playerController.currentGameType != WorldSettings.GameType.SPECTATOR && System.currentTimeMillis() >= delayForNextBacktrack && target?.let { isSelected(it, true) && (mc.thePlayer?.ticksExisted ?: 0) > 20 && !ignoreWholeTick } == true @@ -629,6 +685,10 @@ object Backtrack : Module() { target = null globalTimer.reset() } + + override val tag: String + get() = supposedDelay.toString() } +data class QueueData(val packet: Packet<*>, val time: Long) data class BacktrackData(val x: Double, val y: Double, val z: Double, val time: Long) diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/ForwardTrack.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/ForwardTrack.kt index e4715fe..617066d 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/ForwardTrack.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/combat/ForwardTrack.kt @@ -5,36 +5,44 @@ */ package net.ccbluex.liquidbounce.features.module.modules.combat +import kevin.utils.component1 +import kevin.utils.component2 +import kevin.utils.component3 import net.ccbluex.liquidbounce.event.EventTarget import net.ccbluex.liquidbounce.event.Render3DEvent import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.features.module.ModuleCategory import net.ccbluex.liquidbounce.features.module.ModuleInfo -import net.ccbluex.liquidbounce.features.value.BoolValue -import net.ccbluex.liquidbounce.features.value.IntegerValue +import net.ccbluex.liquidbounce.features.value.ColorSettingsInteger +import net.ccbluex.liquidbounce.features.value.FloatValue import net.ccbluex.liquidbounce.features.value.ListValue import net.ccbluex.liquidbounce.injection.implementations.IMixinEntity +import net.ccbluex.liquidbounce.utils.extensions.* import net.ccbluex.liquidbounce.utils.interpolatedPosition -import net.ccbluex.liquidbounce.utils.render.ColorUtils +import net.ccbluex.liquidbounce.utils.lerpWith +import net.ccbluex.liquidbounce.utils.render.ColorUtils.rainbow import net.ccbluex.liquidbounce.utils.render.RenderUtils.drawBacktrackBox +import net.ccbluex.liquidbounce.utils.render.RenderUtils.glColor +import net.ccbluex.liquidbounce.utils.renderPos import net.minecraft.client.entity.EntityPlayerSP +import net.minecraft.client.renderer.GlStateManager.* import net.minecraft.entity.Entity import net.minecraft.entity.EntityLivingBase -import net.minecraft.util.AxisAlignedBB import net.minecraft.util.Vec3 +import org.lwjgl.opengl.GL11.* import java.awt.Color @ModuleInfo("ForwardTrack", category = ModuleCategory.COMBAT) object ForwardTrack : Module() { - val espMode = ListValue("ESP-Mode", arrayOf("Box", "Model"), "Model") + private val espMode = ListValue("ESP-Mode", arrayOf("Box", "Model", "Wireframe"), "Model") + private val wireframeWidth = FloatValue("WireFrame-Width", 1f, 0.5f,5f).displayable { espMode.get() == "WireFrame" } - private val rainbow = BoolValue("Rainbow", true).displayable { espMode.get() == "Box" } - private val red = IntegerValue("R", 0, 0,255).displayable { !rainbow.get() && espMode.get() == "Box" } - private val green = IntegerValue("G", 255, 0,255).displayable { !rainbow.get() && espMode.get() == "Box" } - private val blue = IntegerValue("B", 0, 0,255).displayable { !rainbow.get() && espMode.get() == "Box" } + private val espColorMode = ListValue("ESP-Color", arrayOf("Custom", "Rainbow"), "Custom").displayable { espMode.get() != "Model" } + private val espColor = ColorSettingsInteger(this, "ESP", withAlpha = false) + { espColorMode.get() == "Custom" && espMode.get() != "Model" }.with(0, 255, 0) val color - get() = if (rainbow.get()) ColorUtils.rainbow() else Color(red.get(), green.get(), blue.get()) + get() = if (espColorMode.get() == "Rainbow") rainbow() else Color(espColor.color().rgb) /** * Any good anti-cheat will easily detect this module. @@ -51,7 +59,7 @@ object ForwardTrack : Module() { } } - fun usePosition(entity: Entity): Vec3 { + private fun usePosition(entity: Entity): Vec3 { entity.run { return if (!mc.isSingleplayer) { val iEntity = entity as IMixinEntity @@ -65,35 +73,85 @@ object ForwardTrack : Module() { @EventTarget fun onRender3D(event: Render3DEvent) { - if (espMode.get() != "Box") - return + val world = mc.theWorld ?: return val renderManager = mc.renderManager - for (target in mc.theWorld.loadedEntityList) { + for (target in world.loadedEntityList) { if (target is EntityPlayerSP) continue - target.run { + target?.run { val vec = usePosition(this) - val x = vec.xCoord - renderManager.renderPosX - val y = vec.yCoord - renderManager.renderPosY - val z = vec.zCoord - renderManager.renderPosZ - - val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) - - drawBacktrackBox( - AxisAlignedBB.fromBounds( - axisAlignedBB.minX, - axisAlignedBB.minY, - axisAlignedBB.minZ, - axisAlignedBB.maxX, - axisAlignedBB.maxY, - axisAlignedBB.maxZ - ), color - ) + val (x, y, z) = vec - renderManager.renderPos + + when (espMode.get().lowercase()) { + "box" -> { + val axisAlignedBB = entityBoundingBox.offset(-posX, -posY, -posZ).offset(x, y, z) + + drawBacktrackBox(axisAlignedBB, color) + } + + "model" -> { + glPushMatrix() + + color(0.6f, 0.6f, 0.6f, 1f) + renderManager.doRenderEntity( + this, + x, y, z, + (prevRotationYaw..rotationYaw).lerpWith(event.partialTicks), + event.partialTicks, + true + ) + + glPopMatrix() + } + + "wireframe" -> { + val color = if (espColorMode.get() == "Rainbow") rainbow() else Color(espColor.color().rgb) + + glPushMatrix() + glPushAttrib(GL_ALL_ATTRIB_BITS) + + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE) + glDisable(GL_TEXTURE_2D) + glDisable(GL_LIGHTING) + glDisable(GL_DEPTH_TEST) + glEnable(GL_LINE_SMOOTH) + + glEnable(GL_BLEND) + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) + + glLineWidth(wireframeWidth.get()) + + glColor(color) + renderManager.doRenderEntity( + this, + x, y, z, + (prevRotationYaw..rotationYaw).lerpWith(event.partialTicks), + event.partialTicks, + true + ) + glColor(color) + renderManager.doRenderEntity( + this, + x, y, z, + (prevRotationYaw..rotationYaw).lerpWith(event.partialTicks), + event.partialTicks, + true + ) + + glPopAttrib() + glPopMatrix() + } + } } } } -} \ No newline at end of file +} + +operator fun Vec3.plus(vec: Vec3): Vec3 = add(vec) +operator fun Vec3.minus(vec: Vec3): Vec3 = subtract(vec) +operator fun Vec3.times(number: Double) = Vec3(xCoord * number, yCoord * number, zCoord * number) +operator fun Vec3.div(number: Double) = times(1 / number) \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/NoSlow.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/NoSlow.kt index dec9124..6b84e62 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/NoSlow.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/movement/NoSlow.kt @@ -62,7 +62,7 @@ object NoSlow : Module() { //Basic settings private val modeValue = ListValue( "PacketMode", - mode, + mode.sortedArray(), "Vanilla" ) private val antiSwitchItem = BoolValue("AntiSwitchItem", false) @@ -541,10 +541,8 @@ object NoSlow : Module() { return val heldItem = mc.thePlayer.heldItem?.item - if (!consumePacketValue.equals("Bug") || shouldNoSlow) { - event.forward = getMultiplier(heldItem, true) - event.strafe = getMultiplier(heldItem, false) - } + event.forward = getMultiplier(heldItem, true) + event.strafe = getMultiplier(heldItem, false) } private fun getMultiplier(item: Item?, isForward: Boolean) = when (item) { diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/other/AntiStaff.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/other/AntiStaff.kt index b7de42e..bb0c9a2 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/other/AntiStaff.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/other/AntiStaff.kt @@ -337,28 +337,23 @@ object AntiStaff : Module() { return } - fun handlePlayer(player: Entity?) { - player ?: return - handleStaff(player) - } - when (packet) { - is S01PacketJoinGame -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S0CPacketSpawnPlayer -> handlePlayer(mc.theWorld.getEntityByID(packet.entityID)) - is S18PacketEntityTeleport -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S1CPacketEntityMetadata -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S1DPacketEntityEffect -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S1EPacketRemoveEntityEffect -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S19PacketEntityStatus -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S19PacketEntityHeadLook -> handlePlayer(packet.getEntity(mc.theWorld)) - is S49PacketUpdateEntityNBT -> handlePlayer(packet.getEntity(mc.theWorld)) - is S1BPacketEntityAttach -> handlePlayer(mc.theWorld.getEntityByID(packet.entityId)) - is S04PacketEntityEquipment -> handlePlayer(mc.theWorld.getEntityByID(packet.entityID)) + is S01PacketJoinGame -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S0CPacketSpawnPlayer -> handleStaff(mc.theWorld.getEntityByID(packet.entityID) ?: null) + is S18PacketEntityTeleport -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S1CPacketEntityMetadata -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S1DPacketEntityEffect -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S1EPacketRemoveEntityEffect -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S19PacketEntityStatus -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S19PacketEntityHeadLook -> handleStaff(packet.getEntity(mc.theWorld) ?: null) + is S49PacketUpdateEntityNBT -> handleStaff(packet.getEntity(mc.theWorld) ?: null) + is S1BPacketEntityAttach -> handleStaff(mc.theWorld.getEntityByID(packet.entityId) ?: null) + is S04PacketEntityEquipment -> handleStaff(mc.theWorld.getEntityByID(packet.entityID) ?: null) } } - private fun handleStaff(staff: Entity) { - if (mc.thePlayer == null || mc.theWorld == null) { + private fun handleStaff(staff: Entity?) { + if (mc.thePlayer == null || mc.theWorld == null || staff == null) { return } diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/CombatVisuals.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/CombatVisuals.kt index 9af9dba..345c231 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/CombatVisuals.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/CombatVisuals.kt @@ -244,7 +244,7 @@ object CombatVisuals : Module() { ) > 10) ) { val dst = mc.thePlayer.getSmoothDistanceToEntity(entityLivingBase) - val vector2f = RenderUtil.targetESPSPos(entityLivingBase, event.partialTicks) + val vector2f = RenderUtil.targetESPSPos(entityLivingBase, event.partialTicks) ?: return RenderUtil.drawTargetESP2D( vector2f.x, vector2f.y, diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/DashTrail.java b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/DashTrail.java new file mode 100644 index 0000000..1dd2347 --- /dev/null +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/DashTrail.java @@ -0,0 +1,539 @@ +//package net.ccbluex.liquidbounce.features.module.modules.visual; +// +//import net.ccbluex.liquidbounce.event.EventTarget; +//import net.ccbluex.liquidbounce.event.Render3DEvent; +//import net.ccbluex.liquidbounce.event.UpdateEvent; +//import net.ccbluex.liquidbounce.features.module.Module; +//import net.ccbluex.liquidbounce.features.module.ModuleCategory; +//import net.ccbluex.liquidbounce.features.module.ModuleInfo; +//import net.ccbluex.liquidbounce.features.value.BoolValue; +//import net.ccbluex.liquidbounce.features.value.FloatValue; +//import net.ccbluex.liquidbounce.ui.client.gui.clickgui.style.styles.Slight.RenderUtil; +//import net.ccbluex.liquidbounce.utils.FireFilesUtils; +//import net.ccbluex.liquidbounce.utils.RotationUtils; +//import net.ccbluex.liquidbounce.utils.render.ColorUtils; +//import net.ccbluex.liquidbounce.utils.render.RenderUtils; +//import net.minecraft.client.renderer.GlStateManager; +//import net.minecraft.client.renderer.Tessellator; +//import net.minecraft.client.renderer.WorldRenderer; +//import net.minecraft.client.renderer.culling.Frustum; +//import net.minecraft.client.renderer.vertex.DefaultVertexFormats; +//import net.minecraft.entity.EntityLivingBase; +//import net.minecraft.util.AxisAlignedBB; +//import net.minecraft.util.MathHelper; +//import net.minecraft.util.ResourceLocation; +//import net.minecraft.util.Vec3; +//import org.lwjgl.opengl.GL11; +// +//import javax.imageio.ImageIO; +//import java.awt.image.BufferedImage; +//import java.io.InputStream; +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Objects; +//import java.util.Random; +//import java.util.stream.Collector; +//import java.util.stream.Collectors; +// +//@ModuleInfo(name = "DashTrail", category = ModuleCategory.VISUAL) +//public class DashTrail extends Module { +// private final BoolValue motionsSmoothing = new BoolValue("MotionsSmoothing", false); +// private final BoolValue dashSegments = new BoolValue("DashSegments", false); +// private final BoolValue dashDots = new BoolValue("DashDots", true); +// private final BoolValue lighting = new BoolValue("Lighting", true); +// private final FloatValue dashLength = new FloatValue("DashLength", 0.75f, 0.5f, 2.0f); +// private static final String format = ".png"; +// private final ResourceLocation DASH_CUBIC_BLOOM_TEX = new ResourceLocation("fdpclient/dashtrail/dashbloomsample.png"); +// private final List DASH_CUBIC_TEXTURES = new ArrayList<>(); +// private final List> DASH_CUBIC_ANIMATED_TEXTURES = new ArrayList<>(); +// private final Random RANDOM = new Random(); +// private final List DASH_CUBICS = new ArrayList<>(); +// private final Tessellator tessellator = Tessellator.getInstance(); +// private final WorldRenderer buffer = this.tessellator.getWorldRenderer(); +// +// private void addAll_DASH_CUBIC_TEXTURES() { +// int dashTexturesCount = 21; +// int ct = 0; +// while (ct < dashTexturesCount) { +// this.DASH_CUBIC_TEXTURES.add(new ResourceLocationWithSizes(new ResourceLocation("fdpclient/dashtrail/dashcubics/dashcubic" + ++ct + format))); +// } +// } +// +// private void addAll_DASH_CUBIC_ANIMATED_TEXTURES() { +// int[] dashGroupsNumber = new int[]{11, 23, 32, 16, 32}; +// int packageNumber = 0; +// for (Integer dashFragsNumber : dashGroupsNumber) { +// ++packageNumber; +// ArrayList animatedTexuresList = new ArrayList<>(); +// int fragNumber = 0; +// while (fragNumber < dashFragsNumber) { +// animatedTexuresList.add(new ResourceLocationWithSizes(new ResourceLocation("fdpclient/dashtrail/dashcubics/group_dashs/group" + packageNumber + "/dashcubic" + ++fragNumber + format))); +// } +// if (animatedTexuresList.isEmpty()) continue; +// this.DASH_CUBIC_ANIMATED_TEXTURES.add(animatedTexuresList); +// } +// } +// +// public DashTrail() { +// this.addAll_DASH_CUBIC_TEXTURES(); +// this.addAll_DASH_CUBIC_ANIMATED_TEXTURES(); +// this.RANDOM.setSeed(1234567891L); +// } +// +// private int getColorDashCubic() { +// return ColorUtils.rainbow().getRGB(); +// } +// +// private int[] getTextureResolution(ResourceLocation location) { +// try { +// InputStream stream = mc.getResourceManager().getResource(location).getInputStream(); +// BufferedImage image = ImageIO.read(stream); +// return new int[]{image.getWidth(), image.getHeight()}; +// } catch (Exception e) { +// e.printStackTrace(); +// return new int[]{0, 0}; +// } +// } +// +// private int randomTextureNumber() { +// return this.RANDOM.nextInt(this.DASH_CUBIC_TEXTURES.size()); +// } +// +// private int randomAnimatedTexturesGroupNumber() { +// return this.RANDOM.nextInt(this.DASH_CUBIC_ANIMATED_TEXTURES.size()); +// } +// +// private ResourceLocationWithSizes getDashCubicTextureRandom(int random) { +// return this.DASH_CUBIC_TEXTURES.get(random); +// } +// +// private List getDashCubicAnimatedTextureGroupRandom(int random) { +// return this.DASH_CUBIC_ANIMATED_TEXTURES.get(random); +// } +// +// private boolean hasChancedAnimatedTexutreSet() { +// return this.RANDOM.nextInt(100) > 40; +// } +// +// private void setDashElementsRender(Runnable render, boolean texture2d, boolean bloom) { +// GL11.glPushMatrix(); +// GlStateManager.tryBlendFuncSeparate(770, bloom ? 32772 : 771, 1, 0); +// GL11.glEnable(3042); +// GL11.glLineWidth(1.0f); +// if (!texture2d) { +// GL11.glDisable(3553); +// } else { +// GL11.glEnable(3553); +// } +// GlStateManager.disableLight(0); +// GlStateManager.disableLight(1); +// GlStateManager.disableColorMaterial(); +// mc.entityRenderer.disableLightmap(); +// GL11.glDisable(2896); +// GL11.glShadeModel(7425); +// GL11.glDisable(3008); +// GL11.glDisable(2884); +// GL11.glDepthMask(false); +// GL11.glTexParameteri(3553, 10241, 9729); +// render.run(); +// GL11.glDepthMask(true); +// GL11.glEnable(2884); +// GL11.glEnable(3008); +// GL11.glLineWidth(1.0f); +// GL11.glShadeModel(7424); +// GL11.glEnable(3553); +// GlStateManager.resetColor(); +// GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); +// GL11.glPopMatrix(); +// } +// +// private List DASH_CUBICS_FILTERED() { +// return this.DASH_CUBICS.stream().filter(Objects::nonNull).filter(dashCubic -> dashCubic.alphaPC.getAnim() > 0.05f).collect(Collectors.toList()); +// } +// +// @EventTarget +// public void onUpdate(UpdateEvent event) { +// this.DASH_CUBICS.stream().filter(dashCubic -> dashCubic.getTimePC() >= 1.0f && dashCubic.alphaPC.to != 0.0f).forEach(dashCubic -> dashCubic.alphaPC.to = 0.0f); +// this.DASH_CUBICS.removeIf(dashCubic -> dashCubic.getTimePC() >= 1.0f && dashCubic.alphaPC.to == 0.0f && (double) dashCubic.alphaPC.getAnim() < 0.02); +// List filteredCubics = this.DASH_CUBICS_FILTERED(); +// int next = 0; +// int max = this.motionsSmoothing.get() ? filteredCubics.size() : -1; +// for (DashCubic dashCubic2 : filteredCubics) { +// dashCubic2.motionCubicProcess(++next < max ? filteredCubics.get(next) : null); +// } +// } +// +// private int getRandomTimeAnimationPerTime() { +// return (int) ((float) (550 + this.RANDOM.nextInt(300)) * this.dashLength.get()); +// } +// +// public void onEntityMove(EntityLivingBase baseIn, Vec3 prev) { +// Vec3 pos = baseIn.getPositionVector(); +// double dx = pos.xCoord - prev.xCoord; +// double dy = pos.yCoord - prev.yCoord; +// double dz = pos.zCoord - prev.zCoord; +// double entitySpeed = Math.sqrt(dx * dx + dy * dy + dz * dz); +// double entitySpeedXZ = Math.sqrt(dx * dx + dz * dz); +// if (entitySpeedXZ < (double) 0.04f) { +// return; +// } +// boolean animated = true; +// boolean[] dashDops = this.getDashPops(); +// int countMax = (int) MathHelper.clamp_float((int) (entitySpeed / 0.045), 1, 16); +// for (int count = 0; count < countMax; ++count) { +// this.DASH_CUBICS.add(new DashCubic(new DashBase(baseIn, 0.04f, new DashTexture(animated), (float) count / (float) countMax, this.getRandomTimeAnimationPerTime()), dashDops[0] || dashDops[1])); +// } +// } +// +// boolean[] getDashPops() { +// return new boolean[]{this.dashSegments.get(), this.dashDots.get()}; +// } +// +// @EventTarget +// public void onRender3D(Render3DEvent event) { +// float partialTicks = event.getPartialTicks(); +// +// Frustum frustum = new Frustum(mc.getRenderViewEntity().posX, mc.getRenderViewEntity().posY, mc.getRenderViewEntity().posZ); +// boolean[] dashDops = this.getDashPops(); +// List FILTERED_LEVEL2_CUBICS = this.DASH_CUBICS_FILTERED().stream().filter(dashCubic -> frustum.isBoundingBoxInFrustum(new AxisAlignedBB(dashCubic.getRenderPosX(partialTicks), dashCubic.getRenderPosY(partialTicks), dashCubic.getRenderPosZ(partialTicks),dashCubic.getRenderPosX(partialTicks), dashCubic.getRenderPosY(partialTicks), dashCubic.getRenderPosZ(partialTicks)).expand(0.2 * (double) dashCubic.alphaPC.getAnim(),0.2 * (double) dashCubic.alphaPC.getAnim(),0.2 * (double) dashCubic.alphaPC.getAnim()))).collect(Collectors.toList()); +// if (dashDops[0] || dashDops[1]) { +// GL11.glTranslated(-mc.getRenderManager().viewerPosX, -mc.getRenderManager().viewerPosY, -mc.getRenderManager().viewerPosZ); +// if (dashDops[1]) { +// this.setDashElementsRender(() -> { +// GL11.glEnable(2832); +// GL11.glPointSize(2.0f); +// GL11.glBegin(0); +// FILTERED_LEVEL2_CUBICS.forEach(dashCubic -> { +// double[] renderDashPos = new double[]{dashCubic.getRenderPosX(partialTicks), dashCubic.getRenderPosY(partialTicks), dashCubic.getRenderPosZ(partialTicks)}; +// dashCubic.DASH_SPARKS_LIST.forEach(spark -> { +// double[] renderSparkPos = new double[]{spark.getRenderPosX(partialTicks), spark.getRenderPosY(partialTicks), spark.getRenderPosZ(partialTicks)}; +// float aPC = (float) (spark.alphaPC() * (double) dashCubic.alphaPC.anim); +// aPC = ((double) aPC > 0.5 ? 1.0f - aPC : aPC) * 2.0f; +// aPC = Math.min(aPC, 1.0f); +// int c = ColorUtils.interpolateColor(dashCubic.color, -1, aPC); +// RenderUtils.color(ColorUtils.applyOpacity(c, (float) ColorUtils.getAlphaFromColor(c) * aPC)); +// GL11.glVertex3d(renderSparkPos[0] + renderDashPos[0], renderSparkPos[1] + renderDashPos[1], renderSparkPos[2] + renderDashPos[2]); +// GL11.glVertex3d(-renderSparkPos[0] + renderDashPos[0], -renderSparkPos[1] + renderDashPos[1], -renderSparkPos[2] + renderDashPos[2]); +// }); +// }); +// GL11.glEnd(); +// }, false, false); +// } +// if (dashDops[0]) { +// this.setDashElementsRender(() -> FILTERED_LEVEL2_CUBICS.forEach(dashCubic -> { +// double[] renderDashPos = new double[]{dashCubic.getRenderPosX(partialTicks), dashCubic.getRenderPosY(partialTicks), dashCubic.getRenderPosZ(partialTicks)}; +// GL11.glBegin(7); +// dashCubic.DASH_SPARKS_LIST.forEach(spark -> { +// double[] renderSparkPos = new double[]{spark.getRenderPosX(partialTicks), spark.getRenderPosY(partialTicks), spark.getRenderPosZ(partialTicks)}; +// float aPC = (float) spark.alphaPC() * dashCubic.alphaPC.anim * (1.0f - dashCubic.getTimePC() / 2.0f); +// aPC = (double) aPC > 0.5 ? 1.0f - aPC : aPC; +// aPC = Math.min(aPC, 1.0f); +// int c = ColorUtils.interpolateColor(dashCubic.color, -1, 1.0f - aPC); +// RenderUtils.color(ColorUtils.applyOpacity(c, (float) ColorUtils.getAlphaFromColor(c) * aPC / 2.0f)); +// GL11.glVertex3d(renderSparkPos[0] + renderDashPos[0], renderSparkPos[1] + renderDashPos[1], renderSparkPos[2] + renderDashPos[2]); +// GL11.glVertex3d(-renderSparkPos[0] + renderDashPos[0], -renderSparkPos[1] + renderDashPos[1], -renderSparkPos[2] + renderDashPos[2]); +// }); +// GL11.glEnd(); +// }), false, true); +// } +// GL11.glTranslated(mc.getRenderManager().viewerPosX, mc.getRenderManager().viewerPosY, mc.getRenderManager().viewerPosZ); +// } +// if (!FILTERED_LEVEL2_CUBICS.isEmpty()) { +// this.setDashElementsRender(() -> { +// GL11.glTranslated(-mc.getRenderManager().viewerPosX, -mc.getRenderManager().viewerPosY, -mc.getRenderManager().viewerPosZ); +// FILTERED_LEVEL2_CUBICS.forEach(dashCubic -> dashCubic.drawDash(partialTicks, false)); +// this.bindResource(this.DASH_CUBIC_BLOOM_TEX); +// FILTERED_LEVEL2_CUBICS.forEach(dashCubic -> dashCubic.drawDash(partialTicks, true)); +// }, true, true); +// } +// } +// +// private void bindResource(ResourceLocation toBind) { +// mc.getTextureManager().bindTexture(toBind); +// } +// +// private void drawBindedTexture(float x, float y, float x2, float y2, int c, int c2, int c3, int c4) { +// this.buffer.begin(9, DefaultVertexFormats.POSITION_TEX_COLOR); +// this.buffer.pos(x, y,0.0).tex(0.0, 0.0).color(ColorUtils.getRedFromColor(c),ColorUtils.getGreenFromColor(c),ColorUtils.getBlueFromColor(c),ColorUtils.getAlphaFromColor(c)).endVertex(); +// this.buffer.pos(x, y2,0.0).tex(0.0, 1.0).color(ColorUtils.getRedFromColor(c2),ColorUtils.getGreenFromColor(c2),ColorUtils.getBlueFromColor(c2),ColorUtils.getAlphaFromColor(c2)).endVertex(); +// this.buffer.pos(x2, y2,0.0).tex(1.0, 1.0).color(ColorUtils.getRedFromColor(c3),ColorUtils.getGreenFromColor(c3),ColorUtils.getBlueFromColor(c3),ColorUtils.getAlphaFromColor(c3)).endVertex(); +// this.buffer.pos(x2, y,0.0).tex(1.0, 0.0).color(ColorUtils.getRedFromColor(c4),ColorUtils.getGreenFromColor(c4),ColorUtils.getBlueFromColor(c4),ColorUtils.getAlphaFromColor(c4)).endVertex(); +// this.tessellator.draw(); +// } +// +// private void drawBindedTexture(float x, float y, float x2, float y2, int c) { +// this.drawBindedTexture(x, y, x2, y2, c, c, c, c); +// } +// +// +// private void set3dDashPos(double[] renderPos, Runnable renderPart, float[] rotateImageValues) { +// GL11.glPushMatrix(); +// GL11.glTranslated(renderPos[0], renderPos[1], renderPos[2]); +// GL11.glRotated(-rotateImageValues[0], 0.0, 1.0, 0.0); +// GL11.glRotated(rotateImageValues[1], mc.gameSettings.thirdPersonView == 2 ? -1.0 : 1.0, 0.0, 0.0); +// GL11.glScaled(-0.1f, -0.1f, 0.1f); +// renderPart.run(); +// GL11.glPopMatrix(); +// } +// +// void addDashSparks(DashCubic cubic) { +// cubic.DASH_SPARKS_LIST.add(new DashSpark()); +// } +// +// void dashSparksRemoveAuto(DashCubic cubic) { +// if (!cubic.DASH_SPARKS_LIST.isEmpty()) { +// if (cubic.addDops) { +// cubic.DASH_SPARKS_LIST.removeIf(DashSpark::toRemove); +// } else { +// cubic.DASH_SPARKS_LIST.clear(); +// } +// } +// } +// +// private class ResourceLocationWithSizes { +// private final ResourceLocation source; +// private final int[] resolution; +// +// private ResourceLocationWithSizes(ResourceLocation source) { +// this.source = source; +// this.resolution = getTextureResolution(source); +// } +// +// private ResourceLocation getResource() { +// return this.source; +// } +// +// private int[] getResolution() { +// return this.resolution; +// } +// } +// +// private class DashCubic { +// private final FireFilesUtils alphaPC = new FireFilesUtils(0.0f, 1.0f, 0.035f); +// private final long startTime = System.currentTimeMillis(); +// private final DashBase base; +// private final int color = getColorDashCubic(); +// private final float[] rotate = new float[]{0.0f, 0.0f}; +// List DASH_SPARKS_LIST = new ArrayList<>(); +// private final boolean addDops; +// +// private DashCubic(DashBase base, boolean addDops) { +// this.base = base; +// this.addDops = addDops; +// if (Math.sqrt(base.motionX * base.motionX + base.motionZ * base.motionZ) < 5.0E-4) { +// this.rotate[0] = (float) (360.0 * Math.random()); +// this.rotate[1] = Module.mc.getRenderManager().playerViewX; +// } else { +// float motionYaw = base.getMotionYaw(); +// this.rotate[0] = motionYaw - 45.0f - 15.0f - (base.entity.prevRotationYaw - base.entity.rotationYaw) * 3.0f; +// float yawDiff = RotationUtils.getAngleDifference(motionYaw + 26.3f, base.entity.rotationYaw); +// this.rotate[1] = yawDiff < 10.0f || yawDiff > 160.0f ? -90.0f : Module.mc.getRenderManager().playerViewX; +// } +// } +// +// private double getRenderPosX(float pTicks) { +// return this.base.prevPosX + (this.base.posX - this.base.prevPosX) * (double) pTicks; +// } +// +// private double getRenderPosY(float pTicks) { +// return this.base.prevPosY + (this.base.posY - this.base.prevPosY) * (double) pTicks; +// } +// +// private double getRenderPosZ(float pTicks) { +// return this.base.prevPosZ + (this.base.posZ - this.base.prevPosZ) * (double) pTicks; +// } +// +// private float getTimePC() { +// return (float) (System.currentTimeMillis() - this.startTime) / (float) this.base.rMTime; +// } +// +// private void motionCubicProcess(DashCubic nextCubic) { +// if (nextCubic != null && nextCubic.base.entity.getEntityId() != this.base.entity.getEntityId()) { +// nextCubic = null; +// } +// this.base.prevPosX = this.base.posX; +// this.base.prevPosY = this.base.posY; +// this.base.prevPosZ = this.base.posZ; +// this.base.motionX = (nextCubic != null ? nextCubic.base.motionX : this.base.motionX) / (double) 1.05f; +// this.base.posX = this.base.posX + 5.0 * this.base.motionX; +// this.base.motionY = (nextCubic != null ? nextCubic.base.motionY : this.base.motionY) / (double) 1.05f; +// this.base.posY = this.base.posY + 5.0 * this.base.motionY / (this.base.motionY < 0.0 ? 1.0 : 3.5); +// this.base.motionZ = (nextCubic != null ? nextCubic.base.motionZ : this.base.motionZ) / (double) 1.05f; +// this.base.posZ = this.base.posZ + 5.0 * this.base.motionZ; +// if (this.addDops) { +// if ((double) this.getTimePC() < 0.3 && RANDOM.nextInt(12) > 5) { +// for (int i = 0; i < (getDashPops()[0] ? 1 : 3); ++i) { +// addDashSparks(this); +// } +// } +// this.DASH_SPARKS_LIST.forEach(DashSpark::motionSparkProcess); +// } +// dashSparksRemoveAuto(this); +// } +// +// private void drawDash(float partialTicks, boolean isBloomRenderer) { +// ResourceLocationWithSizes texureSized = this.base.dashTexture.getResourceWithSizes(); +// if (texureSized == null) { +// return; +// } +// float aPC = this.alphaPC.getAnim(); +// float alphaPC = 3f; +// float scale = 0.02f * aPC; +// float extX = (float) texureSized.getResolution()[0] * scale; +// float extY = (float) texureSized.getResolution()[1] * scale; +// double[] renderPos = new double[]{this.getRenderPosX(partialTicks), this.getRenderPosY(partialTicks), this.getRenderPosZ(partialTicks)}; +// if (isBloomRenderer) { +// set3dDashPos(renderPos, () -> { +// float extXY = (float) Math.sqrt(extX * extX + extY * extY); +// float timePcOf = 1.0f - this.getTimePC(); +// timePcOf = timePcOf > 1.0f ? 1.0f : (Math.max(timePcOf, 0.0f)); +// drawBindedTexture(-extXY * 2.0f, -extXY * 2.0f, extXY * 2.0f, extXY * 2.0f, RenderUtil.swapAlpha(RenderUtil.getOverallColorFrom(this.color, -1, 0.15f), (lighting.get() ? 8.0f : 18.0f) * timePcOf * alphaPC + (lighting.get() ? 6.0f : 7.0f) * alphaPC)); +// if (lighting.get()) { +// drawBindedTexture(-(extXY *= 2.0f + 2.5f * timePcOf) * 2.0f, -extXY * 2.0f, extXY * 2.0f, extXY * 2.0f, RenderUtil.swapAlpha(RenderUtil.getOverallColorFrom(this.color, -1, 0.15f), 6.0f * timePcOf * alphaPC + 3.0f * alphaPC)); +// } +// }, new float[]{Module.mc.getRenderManager().playerViewY, Module.mc.getRenderManager().playerViewX}); +// } else { +// set3dDashPos(renderPos, () -> { +// bindResource(texureSized.getResource()); +// drawBindedTexture(-extX / 2.0f, -extY / 2.0f, extX / 2.0f, extY / 2.0f, ColorUtils.darker(ColorUtils.interpolateColor(this.color, -1, 0.7f), 1.0f)); +// }, this.rotate); +// } +// } +// } +// +// private class DashBase { +// private EntityLivingBase entity; +// private double motionX; +// private double motionY; +// private double motionZ; +// private double posX; +// private double posY; +// private double posZ; +// private double prevPosX; +// private double prevPosY; +// private double prevPosZ; +// private int rMTime; +// private DashTexture dashTexture; +// +// private double eMotionX() { +// return -(this.entity.prevPosX - this.entity.posX); +// } +// +// private double eMotionY() { +// return -(this.entity.prevPosY - this.entity.posY); +// } +// +// private double eMotionZ() { +// return -(this.entity.prevPosZ - this.entity.posZ); +// } +// +// private DashBase(EntityLivingBase entity, float speedDash, DashTexture dashTexture, float offsetTickPC, int rmTime) { +// if (entity == null) { +// return; +// } +// this.rMTime = rmTime; +// this.entity = entity; +// this.motionX = this.eMotionX(); +// this.motionY = this.eMotionY(); +// this.motionZ = this.eMotionZ(); +// this.posX = entity.lastTickPosX - this.motionX * (double) offsetTickPC + ((double) -0.0875f + (double) 0.175f * Math.random()); +// this.posY = entity.lastTickPosY - this.motionY * (double) offsetTickPC + ((double) entity.height / 1.0 / 3.0 + (double) entity.height / 1.0 / 4.0 * Math.random() * (double) 0.7f); +// this.posZ = entity.lastTickPosZ - this.motionZ * (double) offsetTickPC + ((double) -0.0875f + (double) 0.175f * Math.random()); +// this.prevPosX = this.posX; +// this.prevPosY = this.posY; +// this.prevPosZ = this.posZ; +// this.motionX *= speedDash; +// this.motionY *= speedDash; +// this.motionZ *= speedDash; +// this.dashTexture = dashTexture; +// } +// +// private int getMotionYaw() { +// int motionYaw = (int) Math.toDegrees(Math.atan2(this.motionZ, this.motionX) - 90.0); +// motionYaw = motionYaw < 0 ? motionYaw + 360 : motionYaw; +// return motionYaw; +// } +// } +// +// private class DashTexture { +// private final List TEXTURES; +// private final boolean animated; +// private long timeAfterSpawn; +// private long animationPerTime; +// +// private boolean isAnimated() { +// return this.animated; +// } +// +// private DashTexture(boolean animated) { +// boolean bl = this.animated = animated && hasChancedAnimatedTexutreSet(); +// if (this.animated) { +// this.timeAfterSpawn = System.currentTimeMillis(); +// this.TEXTURES = getDashCubicAnimatedTextureGroupRandom(randomAnimatedTexturesGroupNumber()); +// this.animationPerTime = getRandomTimeAnimationPerTime(); +// } else { +// this.TEXTURES = new ArrayList<>(); +// this.TEXTURES.add(getDashCubicTextureRandom(randomTextureNumber())); +// } +// } +// +// private ResourceLocationWithSizes getResourceWithSizes() { +// ResourceLocationWithSizes fragTexure; +// float fragCount; +// if (this.isAnimated() && (fragCount = (float) this.TEXTURES.size()) > 0.0f && (fragTexure = this.TEXTURES.get((int) MathHelper.clamp_float((float) ((int) (System.currentTimeMillis() - this.timeAfterSpawn) % (int) this.animationPerTime) / (float) this.animationPerTime * fragCount, 0.0f, fragCount))) != null) { +// return fragTexure; +// } +// return this.TEXTURES.get(0); +// } +// } +// +// private static class DashSpark { +// double posX; +// double posY; +// double posZ; +// double prevPosX; +// double prevPosY; +// double prevPosZ; +// double speed = Math.random() / 50.0; +// double radianYaw = Math.random() * 360.0; +// double radianPitch = -90.0 + Math.random() * 180.0; +// long startTime = System.currentTimeMillis(); +// +// DashSpark() { +// } +// +// double timePC() { +// return MathHelper.clamp_float((float) (System.currentTimeMillis() - this.startTime) / 1000.0f, 0.0f, 1.0f); +// } +// +// double alphaPC() { +// return 1.0 - this.timePC(); +// } +// +// boolean toRemove() { +// return this.timePC() == 1.0; +// } +// +// void motionSparkProcess() { +// double radYaw = Math.toRadians(this.radianYaw); +// this.prevPosX = this.posX; +// this.prevPosY = this.posY; +// this.prevPosZ = this.posZ; +// this.posX += Math.sin(radYaw) * this.speed; +// this.posY += Math.cos(Math.toRadians(this.radianPitch - 90.0)) * this.speed; +// this.posZ += Math.cos(radYaw) * this.speed; +// } +// +// double getRenderPosX(float partialTicks) { +// return this.prevPosX + (this.posX - this.prevPosX) * (double) partialTicks; +// } +// +// double getRenderPosY(float partialTicks) { +// return this.prevPosY + (this.posY - this.prevPosY) * (double) partialTicks; +// } +// +// double getRenderPosZ(float partialTicks) { +// return this.prevPosZ + (this.posZ - this.prevPosZ) * (double) partialTicks; +// } +// } +//} \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/Glint.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/Glint.kt index d4895db..4a3e932 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/Glint.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/Glint.kt @@ -8,24 +8,18 @@ package net.ccbluex.liquidbounce.features.module.modules.visual import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.features.module.ModuleCategory import net.ccbluex.liquidbounce.features.module.ModuleInfo -import net.ccbluex.liquidbounce.utils.render.ColorUtils +import net.ccbluex.liquidbounce.features.value.FloatValue import net.ccbluex.liquidbounce.features.value.IntegerValue import net.ccbluex.liquidbounce.features.value.ListValue -import java.awt.Color @ModuleInfo(name = "Glint", category = ModuleCategory.VISUAL) -object Glint : Module() { - - private val modeValue = ListValue("Mode", arrayOf("Rainbow", "AnotherRainbow", "Custom"), "Custom") - private val redValue = IntegerValue("Red", 255, 0, 255).displayable { modeValue.equals("Custom") } - private val greenValue = IntegerValue("Green", 0, 0, 255).displayable { modeValue.equals("Custom") } - private val blueValue = IntegerValue("Blue", 0, 0, 255).displayable { modeValue.equals("Custom") } - - fun getColor(): Color { - return when (modeValue.get().lowercase()) { - "rainbow" -> ColorUtils.rainbow() - "anotherrainbow" -> ColorUtils.skyRainbow(10, 0.9F, 1F, 1.0) - else -> Color(redValue.get(), greenValue.get(), blueValue.get()) - } - } +class Glint : Module() { + var redValue: IntegerValue = IntegerValue("Red", 255, 0, 255) + var greenValue: IntegerValue = IntegerValue("Green", 0, 0, 255) + var blueValue: IntegerValue = IntegerValue("Blue", 0, 0, 255) + var modeValue: ListValue = ListValue("Mode", arrayOf("Custom", "Rainbow", "Sky"), "Custom") + var rainbowSpeedValue: IntegerValue = IntegerValue("Seconds", 1, 1, 6) + var rainbowDelayValue: IntegerValue = IntegerValue("Delay", 5, 0, 10) + var rainbowSatValue: FloatValue = FloatValue("Saturation", 1.0f, 0.0f, 1.0f) + var rainbowBrgValue: FloatValue = FloatValue("Brightness", 1.0f, 0.0f, 1.0f) } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/TrueSight.kt b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/TrueSight.kt index 0135282..96d194b 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/TrueSight.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/module/modules/visual/TrueSight.kt @@ -5,6 +5,8 @@ */ package net.ccbluex.liquidbounce.features.module.modules.visual +import net.ccbluex.liquidbounce.event.EventTarget +import net.ccbluex.liquidbounce.event.UpdateEvent import net.ccbluex.liquidbounce.features.module.Module import net.ccbluex.liquidbounce.features.module.ModuleCategory import net.ccbluex.liquidbounce.features.module.ModuleInfo @@ -15,4 +17,13 @@ object TrueSight : Module() { val barriersValue = BoolValue("Barriers", true) val entitiesValue = BoolValue("Entities", true) + + @EventTarget + fun onUpdate(event: UpdateEvent) { + if (barriersValue.get()) { + if (mc.gameSettings.particleSetting == 2) { + mc.gameSettings.particleSetting = 1 + } + } + } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/features/value/Values.kt b/src/main/java/net/ccbluex/liquidbounce/features/value/Values.kt index 399072b..cdbf902 100644 --- a/src/main/java/net/ccbluex/liquidbounce/features/value/Values.kt +++ b/src/main/java/net/ccbluex/liquidbounce/features/value/Values.kt @@ -4,6 +4,9 @@ import com.google.gson.JsonElement import com.google.gson.JsonObject import com.google.gson.JsonPrimitive import net.ccbluex.liquidbounce.FDPClient +import net.ccbluex.liquidbounce.features.module.Module +import net.ccbluex.liquidbounce.ui.client.hud.element.Element +import net.ccbluex.liquidbounce.ui.client.hud.element.Element.Companion.MAX_GRADIENT_COLORS import net.ccbluex.liquidbounce.ui.font.Fonts import net.ccbluex.liquidbounce.utils.AnimationHelper import net.ccbluex.liquidbounce.utils.ClientUtils @@ -404,4 +407,127 @@ class FontValue(valueName: String, value: FontRenderer) : Value(va fun setByName(name: String) { set((getAllFontDetails().find { it.first.equals(name, true)} ?: return).second ) } +} + +class ColorSettingsFloat(owner: Any, name: String, val index: Int? = null, generalApply: () -> Boolean = { true }) { + private val r = FloatValue( + "$name-R${index ?: ""}", + if ((index ?: 0) % 3 == 1) 255f else 0f, + 0f,255f + ).displayable { generalApply() } + private val g = FloatValue( + "$name-G${index ?: ""}", + if ((index ?: 0) % 3 == 2) 255f else 0f, + 0f,255f + ).displayable { generalApply() } + private val b = FloatValue( + "$name-B${index ?: ""}", + if ((index ?: 0) % 3 == 0) 255f else 0f, + 0f,255f + ).displayable { generalApply() } + + fun color() = Color(r.get() / 255f, g.get() / 255f, b.get() / 255f) + + init { + when (owner) { + is Element -> owner.addConfigurable(this) + is Module -> owner.addConfigurable(this) + // Should any other class use this, add here + } + } + + companion object { + fun create( + owner: Any, name: String, colors: Int = MAX_GRADIENT_COLORS, generalApply: (Int) -> Boolean = { true }, + ): List { + return (1..colors).map { ColorSettingsFloat(owner, name, it) { generalApply(it) } } + } + } +} + +class ColorSettingsInteger( + owner: Any, name: String? = null, val index: Int? = null, withAlpha: Boolean = true, + zeroAlphaCheck: Boolean = false, + alphaApply: Boolean? = null, applyMax: Boolean = false, generalApply: () -> Boolean = { true }, +) { + private val string = if (name == null) "" else "$name-" + private val max = if (applyMax) 255 else 0 + + private var red = IntegerValue( + "${string}R${index ?: ""}", + max, + 0,255 + ).displayable { generalApply() && (!zeroAlphaCheck || a > 0) } + private var green = IntegerValue( + "${string}G${index ?: ""}", + max, + 0,255 + ).displayable { generalApply() && (!zeroAlphaCheck || a > 0) } + private var blue = IntegerValue( + "${string}B${index ?: ""}", + max, + 0,255 + ).displayable { generalApply() && (!zeroAlphaCheck || a > 0) } + private var alpha = IntegerValue( + "${string}Alpha${index ?: ""}", + 255, + 0,255 + ).displayable { alphaApply ?: generalApply() && withAlpha } + + private var r = red.get() + private var g = green.get() + private var b = blue.get() + private var a = alpha.get() + + fun color(a: Int = this.a) = Color(r, g, b, a) + + fun color() = Color(r, g, b, a) + + fun with(r: Int? = null, g: Int? = null, b: Int? = null, a: Int? = null): ColorSettingsInteger { + r?.let { red.set(it) } + g?.let { green.set(it) } + b?.let { blue.set(it) } + a?.let { alpha.set(it) } + + return this + } + + fun with(color: Color) = with(color.red, color.green, color.blue, color.alpha) + + init { + when (owner) { + is Element -> owner.addConfigurable(this) + is Module -> owner.addConfigurable(this) + // Should any other class use this, add here + } + } + + companion object { + fun create( + owner: Any, name: String, colors: Int, withAlpha: Boolean = true, zeroAlphaCheck: Boolean = true, + applyMax: Boolean = false, generalApply: (Int) -> Boolean = { true }, + ): List { + return (1..colors).map { + ColorSettingsInteger( + owner, + name, + it, + withAlpha, + zeroAlphaCheck, + applyMax = applyMax + ) { generalApply(it) } + } + } + } +} + +fun List.toColorArray(max: Int) = (0 until max).map { + val colors = this[it].color() + + floatArrayOf( + colors.red.toFloat() / 255f, + colors.green.toFloat() / 255f, + colors.blue.toFloat() / 255f, + 1f + ) } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/client/MixinMinecraft.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/client/MixinMinecraft.java index b421d89..7037dd9 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/client/MixinMinecraft.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/client/MixinMinecraft.java @@ -16,6 +16,7 @@ import net.ccbluex.liquidbounce.injection.forge.mixins.accessors.MinecraftForgeClientAccessor; import net.ccbluex.liquidbounce.utils.CPSCounter; import net.ccbluex.liquidbounce.utils.ClientUtils; +import net.ccbluex.liquidbounce.utils.MiniMapRegister; import net.ccbluex.liquidbounce.utils.render.ImageUtils; import net.ccbluex.liquidbounce.utils.render.RenderUtils; import net.minecraft.block.material.Material; @@ -264,6 +265,10 @@ private void rightClickMouse(final CallbackInfo callbackInfo) { @Inject(method = "loadWorld(Lnet/minecraft/client/multiplayer/WorldClient;Ljava/lang/String;)V", at = @At("HEAD")) private void loadWorld(WorldClient p_loadWorld_1_, String p_loadWorld_2_, final CallbackInfo callbackInfo) { + if (theWorld != null) { + MiniMapRegister.INSTANCE.unloadAllChunks(); + } + FDPClient.eventManager.callEvent(new WorldEvent(p_loadWorld_1_)); } diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayer.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayer.java index 66c6340..423f59f 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayer.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayer.java @@ -8,6 +8,8 @@ import com.mojang.authlib.GameProfile; import net.ccbluex.liquidbounce.features.module.modules.combat.KeepSprint; import net.ccbluex.liquidbounce.utils.CooldownHelper; +import net.ccbluex.liquidbounce.utils.MovementUtils; +import net.minecraft.entity.Entity; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.entity.player.InventoryPlayer; import net.minecraft.entity.player.PlayerCapabilities; @@ -20,6 +22,7 @@ import org.spongepowered.asm.mixin.injection.*; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import net.minecraft.client.Minecraft; +import org.spongepowered.asm.mixin.injection.callback.LocalCapture; @Mixin(EntityPlayer.class) public abstract class MixinEntityPlayer extends MixinEntityLivingBase { @@ -87,13 +90,34 @@ private void injectCooldown(final CallbackInfo callbackInfo) { } @ModifyConstant(method = "attackTargetEntityWithCurrentItem", constant = @Constant(doubleValue = 0.6)) private double injectKeepSprintA(double constant) { - return KeepSprint.INSTANCE.getState() ? KeepSprint.INSTANCE.getMotionAfterAttack().get() : constant; + return KeepSprint.INSTANCE.handleEvents() && isSprinting() ? KeepSprint.INSTANCE.getMotionAfterAttack().get() : constant; } @Redirect(method = "attackTargetEntityWithCurrentItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/player/EntityPlayer;setSprinting(Z)V")) private void injectKeepSprintB(EntityPlayer instance, boolean sprint) { - if (!KeepSprint.INSTANCE.getState()) { + boolean keepSprint = Boolean.FALSE.equals(MovementUtils.INSTANCE.getAffectSprintOnAttack()); + + if (!KeepSprint.INSTANCE.handleEvents() && !keepSprint) { instance.setSprinting(sprint); } + + // Only affect motion when sprinting. Knock-back modifier factor is ignored. + if (keepSprint && !KeepSprint.INSTANCE.handleEvents() && isSprinting()) { + // Reverse the motion effects done by sprinting + motionX /= 0.6; + motionZ /= 0.6; + } + } + + @Inject(method = "attackTargetEntityWithCurrentItem", at = @At(value = "INVOKE", target = "Lnet/minecraft/entity/Entity;attackEntityFrom(Lnet/minecraft/util/DamageSource;F)Z"), locals = LocalCapture.CAPTURE_FAILHARD) + private void injectSprintState(Entity entity, CallbackInfo ci, float f, int i, float f1, boolean flag, boolean flag1, int j, double d0, double d1, double d2) { + Boolean sprint = MovementUtils.INSTANCE.getAffectSprintOnAttack(); + + if (sprint == null || !sprint || isSprinting()) + return; + + // This will be used later in line 1058 + //noinspection UnusedAssignment + i++; } } diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayerSP.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayerSP.java index 9548ad4..2169b30 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayerSP.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/entity/MixinEntityPlayerSP.java @@ -9,7 +9,7 @@ import net.ccbluex.liquidbounce.event.*; import net.ccbluex.liquidbounce.features.module.modules.combat.Criticals; import net.ccbluex.liquidbounce.features.module.modules.combat.KillAura; -import net.ccbluex.liquidbounce.features.module.modules.combat.Velocity; +import net.ccbluex.liquidbounce.features.module.modules.combat.AntiKB; import net.ccbluex.liquidbounce.features.module.modules.exploit.AntiDesync; import net.ccbluex.liquidbounce.features.module.modules.movement.Flight; import net.ccbluex.liquidbounce.features.module.modules.movement.InvMove; @@ -38,7 +38,6 @@ import net.minecraft.network.play.client.C0BPacketEntityAction; import net.minecraft.potion.Potion; import net.minecraft.util.*; -import net.minecraftforge.fml.common.gameevent.TickEvent; import org.spongepowered.asm.mixin.*; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -279,7 +278,7 @@ public void onLivingUpdate() { final StrafeFix strafeFix = FDPClient.moduleManager.getModule(StrafeFix.class); final Scaffold2 scaffold2 = FDPClient.moduleManager.getModule(Scaffold2.class); final Scaffold scaffold = FDPClient.moduleManager.getModule(Scaffold.class); - final Velocity veloctiy = FDPClient.moduleManager.getModule(Velocity.class); + final AntiKB veloctiy = FDPClient.moduleManager.getModule(AntiKB.class); if (this.sprintingTicksLeft > 0) { --this.sprintingTicksLeft; diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/gui/MixinGuiButtonExt.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/gui/MixinGuiButtonExt.java index 5c3452a..644a960 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/gui/MixinGuiButtonExt.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/gui/MixinGuiButtonExt.java @@ -8,7 +8,7 @@ import org.spongepowered.asm.mixin.Overwrite; @Mixin(GuiButtonExt.class) -public abstract class MixinGuiButtonExt extends MixinGuiButton { +public abstract class MixinGuiButtonExt extends MixinGuiButton { /** * @author CCBlueX diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/network/MixinNetworkManager.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/network/MixinNetworkManager.java index 24b69a9..9290959 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/network/MixinNetworkManager.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/network/MixinNetworkManager.java @@ -26,7 +26,6 @@ private void read(ChannelHandlerContext context, Packet packet, CallbackInfo if (event.isCancelled()) { callback.cancel(); - return; } } @@ -37,7 +36,6 @@ private void send(Packet packet, CallbackInfo callback) { if (event.isCancelled()) { callback.cancel(); - return; } } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinLayerArmorBase.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinLayerArmorBase.java index 89cb911..1559342 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinLayerArmorBase.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinLayerArmorBase.java @@ -13,16 +13,4 @@ @Mixin(value={LayerArmorBase.class}) public abstract class MixinLayerArmorBase implements LayerRenderer { - - @ModifyArgs(method="renderGlint", slice=@Slice(from=@At(value="INVOKE", target="Lnet/minecraft/client/renderer/GlStateManager;disableLighting()V", ordinal=0)), at=@At(value="INVOKE", target="Lnet/minecraft/client/renderer/GlStateManager;color(FFFF)V", ordinal=0), require=1, allow=1) - private void renderGlint(Args args) { - Glint glint = FDPClient.moduleManager.getModule(Glint.class); - if (glint.getState()) { - int n = glint.getColor().getRGB(); - args.set(0, (Object) ((float) (n >> 16 & 0xFF) / 255.0f)); - args.set(1, (Object) ((float) (n >> 8 & 0xFF) / 255.0f)); - args.set(2, (Object) ((float) (n & 0xFF) / 255.0f)); - args.set(3, (Object) ((float) (n >> 24 & 0xFF) / 255.0f)); - } - } } diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderItem.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderItem.java index c194e79..632bfe8 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderItem.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderItem.java @@ -1,29 +1,95 @@ +/* + * LiquidBounce+ Hacked Client + * A free open source mixin-based injection hacked client for Minecraft using Minecraft Forge. + * https://github.com/WYSI-Foundation/LiquidBouncePlus/ + */ package net.ccbluex.liquidbounce.injection.forge.mixins.render; import net.ccbluex.liquidbounce.FDPClient; import net.ccbluex.liquidbounce.features.module.modules.visual.Glint; import net.ccbluex.liquidbounce.utils.render.RenderUtils; +import net.minecraft.client.Minecraft; +import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.entity.RenderItem; +import net.minecraft.client.renderer.texture.TextureManager; +import net.minecraft.client.renderer.texture.TextureMap; import net.minecraft.client.resources.model.IBakedModel; +import net.minecraft.util.ResourceLocation; +import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.Redirect; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.awt.*; @Mixin(RenderItem.class) + public abstract class MixinRenderItem { + @Final + @Shadow + private TextureManager textureManager; + + @Final + @Shadow + private static ResourceLocation RES_ITEM_GLINT; @Shadow protected abstract void renderModel(IBakedModel model, int color); - @Redirect(method = "renderEffect", at = @At(value="INVOKE", target="Lnet/minecraft/client/renderer/entity/RenderItem;renderModel(Lnet/minecraft/client/resources/model/IBakedModel;I)V")) - private void renderModel(RenderItem renderItem, IBakedModel model, int color) { - Glint glint = FDPClient.moduleManager.getModule(Glint.class); - this.renderModel(model, glint.getState() ? glint.getColor().getRGB() : -8372020); + @Inject(method = "renderEffect", at = @At("HEAD"), cancellable = true) + private void renderEffect(IBakedModel model, CallbackInfo callbackInfo) { + final Glint enchantEffect = FDPClient.moduleManager.getModule(Glint.class); + if (enchantEffect.getState()) { + int rainbowColour = RenderUtils.getRainbowOpaque(enchantEffect.getRainbowSpeedValue().get(), enchantEffect.getRainbowSatValue().get(), enchantEffect.getRainbowBrgValue().get(), ((int) Minecraft.getSystemTime() % 2) * (enchantEffect.getRainbowDelayValue().get() * 10)); + int skyColor = RenderUtils.SkyRainbow(0, enchantEffect.getRainbowSatValue().get(), enchantEffect.getRainbowBrgValue().get()); + int currentColor = new Color(enchantEffect.getRedValue().get(), enchantEffect.getGreenValue().get(), enchantEffect.getBlueValue().get()).getRGB(); + GlStateManager.depthMask(false); + GlStateManager.depthFunc(514); + GlStateManager.disableLighting(); + GlStateManager.blendFunc(768, 1); + this.textureManager.bindTexture(RES_ITEM_GLINT); + GlStateManager.matrixMode(5890); + GlStateManager.pushMatrix(); + GlStateManager.scale(8.0f, 8.0f, 8.0f); + float f = (float)(Minecraft.getSystemTime() % 3000L) / 3000.0f / 8.0f; + GlStateManager.translate(f, 0.0f, 0.0f); + GlStateManager.rotate(-50.0f, 0.0f, 0.0f, 1.0f); + switch (enchantEffect.getModeValue().get().toLowerCase()) { + case "custom": + this.renderModel(model, currentColor); + break; + case "rainbow": + this.renderModel(model, rainbowColour); + break; + case "sky": + this.renderModel(model, skyColor); + } + GlStateManager.popMatrix(); + GlStateManager.pushMatrix(); + GlStateManager.scale(8.0f, 8.0f, 8.0f); + float f1 = (float)(Minecraft.getSystemTime() % 4873L) / 4873.0f / 8.0f; + GlStateManager.translate(-f1, 0.0f, 0.0f); + GlStateManager.rotate(10.0f, 0.0f, 0.0f, 1.0f); + switch (enchantEffect.getModeValue().get().toLowerCase()) { + case "custom": + this.renderModel(model, currentColor); + break; + case "rainbow": + this.renderModel(model, rainbowColour); + break; + case "sky": + this.renderModel(model, skyColor); + } + GlStateManager.popMatrix(); + GlStateManager.matrixMode(5888); + GlStateManager.blendFunc(770, 771); + GlStateManager.enableLighting(); + GlStateManager.depthFunc(515); + GlStateManager.depthMask(true); + this.textureManager.bindTexture(TextureMap.locationBlocksTexture); + callbackInfo.cancel(); + } } } - diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderManager.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderManager.java index 6ae97ef..b6c7a9d 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderManager.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRenderManager.java @@ -68,62 +68,5 @@ private void renderEntityStatic(Entity entity, float tickDelta, boolean bool, Ca PacketUtilsKt.interpolatePosition(iEntity); } } - - Backtrack backtrack = Backtrack.INSTANCE; - IMixinEntity targetEntity = (IMixinEntity) backtrack.getTarget(); - - boolean shouldBacktrackRenderEntity = backtrack.handleEvents() && backtrack.getShouldRender() - && backtrack.shouldBacktrack() && backtrack.getTarget() == entity; - - if (backtrack.getEspMode().equals("Model")) { - if (shouldBacktrackRenderEntity && targetEntity != null && targetEntity.getTruePos()) { - if (entity.ticksExisted == 0) { - entity.lastTickPosX = entity.posX; - entity.lastTickPosY = entity.posY; - entity.lastTickPosZ = entity.posZ; - } - - double d0 = targetEntity.getLerpX(); - double d1 = targetEntity.getLerpY(); - double d2 = targetEntity.getLerpZ(); - float f = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * tickDelta; - int i = entity.getBrightnessForRender(tickDelta); - if (entity.isBurning()) { - i = 15728880; - } - - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j, (float) k); - // Darker color to differentiate fake player & real player. - GlStateManager.color(0.5F, 0.5F, 0.5F, 1.0F); - this.doRenderEntity(entity, d0 - this.renderPosX, d1 - this.renderPosY, d2 - this.renderPosZ, f, tickDelta, bool); - } - } - - ForwardTrack forwardTrack = ForwardTrack.INSTANCE; - - if (forwardTrack.handleEvents() && forwardTrack.getEspMode().equals("Model") && !shouldBacktrackRenderEntity) { - if (entity.ticksExisted == 0) { - entity.lastTickPosX = entity.posX; - entity.lastTickPosY = entity.posY; - entity.lastTickPosZ = entity.posZ; - } - - Vec3 pos = forwardTrack.usePosition(entity); - - float f = entity.prevRotationYaw + (entity.rotationYaw - entity.prevRotationYaw) * tickDelta; - int i = entity.getBrightnessForRender(tickDelta); - if (entity.isBurning()) { - i = 15728880; - } - - int j = i % 65536; - int k = i / 65536; - OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, (float) j, (float) k); - // Darker color to differentiate fake player & real player. - GlStateManager.color(0.5F, 0.5F, 0.5F, 1.0F); - this.doRenderEntity(entity, pos.xCoord - this.renderPosX, pos.yCoord - this.renderPosY, pos.zCoord - this.renderPosZ, f, tickDelta, bool); - } } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRendererLivingEntity.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRendererLivingEntity.java index 0a373f3..97d4629 100644 --- a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRendererLivingEntity.java +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/render/MixinRendererLivingEntity.java @@ -110,7 +110,7 @@ protected void renderModel(T p_renderModel_1_, floa if(semiVisible) { GlStateManager.pushMatrix(); - GlStateManager.color(1.0F, 1.0F, 1.0F, 0.15F); + GlStateManager.color(1.0F, 1.0F, 1.0F, 0.3F); GlStateManager.depthMask(false); GlStateManager.enableBlend(); GlStateManager.blendFunc(770, 771); diff --git a/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/world/MixinChunk.java b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/world/MixinChunk.java new file mode 100644 index 0000000..6920f06 --- /dev/null +++ b/src/main/java/net/ccbluex/liquidbounce/injection/forge/mixins/world/MixinChunk.java @@ -0,0 +1,46 @@ +/* + * 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.injection.forge.mixins.world; + +import net.ccbluex.liquidbounce.utils.MiniMapRegister; +import net.minecraft.block.state.IBlockState; +import net.minecraft.util.BlockPos; +import net.minecraft.world.chunk.Chunk; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(Chunk.class) +public class MixinChunk { + @Shadow + @Final + public int xPosition; + + @Shadow + @Final + public int zPosition; + + @Inject(method = "setBlockState", at = @At("HEAD")) + private void setProphuntBlock(BlockPos pos, IBlockState state, final CallbackInfoReturnable callbackInfo) { + //noinspection ConstantConditions + MiniMapRegister.INSTANCE.updateChunk((Chunk) ((Object) this)); + } + + @Inject(method = "onChunkUnload", at = @At("HEAD")) + private void injectFillChunk(CallbackInfo ci) { + MiniMapRegister.INSTANCE.unloadChunk(xPosition, zPosition); + } + + @Inject(method = "fillChunk", at = @At("RETURN")) + private void injectFillChunk(byte[] p_177439_1_, int p_177439_2_, boolean p_177439_3_, CallbackInfo ci) { + //noinspection ConstantConditions + MiniMapRegister.INSTANCE.updateChunk((Chunk) ((Object) this)); + } +} diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/GuiMainMenu.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/GuiMainMenu.kt index fcf7e89..08b45e3 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/GuiMainMenu.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/GuiMainMenu.kt @@ -108,11 +108,13 @@ class GuiMainMenu : GuiScreen(), GuiYesNoCallback { scaledHeight + 60 ) val j = this.height / 4 - Fonts.fontBold180.drawCenteredString(CLIENT_NAME, - 150f, - (j + 44 * -1).toFloat(), - Color(255, 255, 255).rgb, - true) + Fonts.fontBold180.drawCenteredString( + CLIENT_NAME, + width / 2F, + height / 8F, + Color.WHITE.rgb, + true + ) RenderUtils.drawQuads( floatArrayOf(scaledWidth * 0.57f - scaledWidth * 0.11f, 0f), floatArrayOf(scaledWidth * 0.43f - scaledWidth * 0.11f, scaledHeight.toFloat()), diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/clickgui/style/styles/Slight/RenderUtil.java b/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/clickgui/style/styles/Slight/RenderUtil.java index 69f597d..d5c9995 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/clickgui/style/styles/Slight/RenderUtil.java +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/gui/clickgui/style/styles/Slight/RenderUtil.java @@ -487,4 +487,19 @@ public static int getOverallColorFrom(int color1, int color2, float percentTo2) return new Color(finalRed, finalGreen, finalBlue, finalAlpha).getRGB(); } + public static int swapAlpha(int color, float alpha) { + int f = color >> 16 & 0xFF; + int f1 = color >> 8 & 0xFF; + int f2 = color & 0xFF; + return getColor(f, f1, f2, (int) alpha); + } + + public static int getColor(int red, int green, int blue, int alpha) { + int color = 0; + color |= alpha << 24; + color |= red << 16; + color |= green << 8; + return color |= blue; + } + } diff --git a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/Element.kt b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/Element.kt index 8fcf077..8dff428 100644 --- a/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/Element.kt +++ b/src/main/java/net/ccbluex/liquidbounce/ui/client/hud/element/Element.kt @@ -69,6 +69,12 @@ abstract class Element( var prevMouseX = 0F var prevMouseY = 0F + private val configurables = mutableListOf>() + + fun addConfigurable(provider: Any) { + configurables += provider::class.java + } + protected open val blurValue = FloatValue("Blur", 0f, 0f, 100f).displayable { info.blur } /** @@ -146,6 +152,10 @@ abstract class Element( */ open fun handleKey(c: Char, keyCode: Int) {} + companion object { + const val MAX_GRADIENT_COLORS = 9 + } + /** * Called when damage sound received */ 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 e1efe98..98b2283 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 @@ -75,7 +75,6 @@ class Radar(x: Double = 5.0, y: Double = 130.0) : Element(x, y) { private var lastFov = 0f override fun drawElement(partialTicks: Float): Border { - MiniMapRegister.radarEnabled = true MiniMapRegister.updateChunks() val fovAngle = fovAngleValue.get() diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/MathUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/MathUtils.kt index d0c7900..045a1e8 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/MathUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/MathUtils.kt @@ -6,6 +6,7 @@ package net.ccbluex.liquidbounce.utils import net.minecraft.block.Block +import net.minecraft.client.renderer.entity.RenderManager import net.minecraft.util.AxisAlignedBB import net.minecraft.util.Vec3 import java.math.BigDecimal @@ -25,6 +26,15 @@ fun Double.toDegrees() = this * 57.295779513 fun Double.toDegreesF() = toDegrees().toFloat() fun Vec3.toFloatTriple() = Triple(xCoord.toFloat(), yCoord.toFloat(), zCoord.toFloat()) +val RenderManager.renderPos + get() = Vec3(renderPosX, renderPosY, renderPosZ) +operator fun Vec3.plus(vec: Vec3): Vec3 = add(vec) +operator fun Vec3.minus(vec: Vec3): Vec3 = subtract(vec) +operator fun Vec3.times(number: Double) = Vec3(xCoord * number, yCoord * number, zCoord * number) +operator fun Vec3.div(number: Double) = times(1 / number) + +fun ClosedFloatingPointRange.lerpWith(t: Float) = start + (endInclusive - start) * t + object MathUtils { const val DEGREES_TO_RADIANS = 0.017453292519943295 diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/MiniMapRegister.kt b/src/main/java/net/ccbluex/liquidbounce/utils/MiniMapRegister.kt index 612db57..e896a1a 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/MiniMapRegister.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/MiniMapRegister.kt @@ -1,113 +1,91 @@ /* - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . + * 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 +import net.ccbluex.liquidbounce.event.EventTarget +import net.ccbluex.liquidbounce.event.Listenable +import net.ccbluex.liquidbounce.event.Render2DEvent import net.minecraft.client.renderer.texture.DynamicTexture import net.minecraft.util.BlockPos import net.minecraft.world.chunk.Chunk -import java.util.concurrent.atomic.AtomicBoolean +import java.util.concurrent.locks.ReentrantReadWriteLock +import kotlin.concurrent.read +import kotlin.concurrent.write -object MiniMapRegister : MinecraftInstance() { - private val chunkTextureMap = HashMap() +object MiniMapRegister : MinecraftInstance(), Listenable { + + private val chunkTextureMap = HashMap(256) private val queuedChunkUpdates = HashSet(256) private val queuedChunkDeletions = HashSet(256) - private val deleteAllChunks = AtomicBoolean(false) - // 不知道杰哥有没有想过:如果玩家不用Radar,那么储存在queuedChunkUpdates的区块可能会导致OutOfMemory - var radarEnabled = false + private var deleteAllChunks = false + + private val lock = ReentrantReadWriteLock() fun updateChunk(chunk: Chunk) { - if (!radarEnabled) return - synchronized(queuedChunkUpdates) { - queuedChunkUpdates.add(chunk) + lock.write { + queuedChunkUpdates += chunk } } - fun getChunkTextureAt(x: Int, z: Int): MiniMapTexture? { - return chunkTextureMap[ChunkLocation(x, z)] + fun getChunkTextureAt(x: Int, z: Int) = lock.read { chunkTextureMap[ChunkLocation(x, z)] } + + @EventTarget + fun onRender2D(event: Render2DEvent) { + updateChunks() } fun updateChunks() { - synchronized(queuedChunkUpdates) { - if (deleteAllChunks.get()) { - synchronized(queuedChunkDeletions) { - queuedChunkDeletions.clear() - } + lock.write { + if (deleteAllChunks) { + queuedChunkDeletions.clear() queuedChunkUpdates.clear() - chunkTextureMap.forEach { it.value.delete() } - + chunkTextureMap.values.forEach { it.delete() } chunkTextureMap.clear() - deleteAllChunks.set(false) + deleteAllChunks = false } else { - synchronized(queuedChunkDeletions) { - queuedChunkDeletions.forEach { - chunkTextureMap.remove(it)?.delete() - } - queuedChunkDeletions.clear() + queuedChunkDeletions.forEach { + chunkTextureMap.remove(it)?.delete() } + queuedChunkDeletions.clear() } queuedChunkUpdates.forEach { - chunkTextureMap.computeIfAbsent(ChunkLocation(it.xPosition, it.zPosition)) { - MiniMapTexture() - }.updateChunkData(it) + chunkTextureMap.getOrPut(it.location, MiniMapRegister::MiniMapTexture).updateChunkData(it) } queuedChunkUpdates.clear() } } - fun getLoadedChunkCount(): Int { - return chunkTextureMap.size - } + fun getLoadedChunkCount() = lock.read { chunkTextureMap.size } fun unloadChunk(x: Int, z: Int) { - synchronized(queuedChunkDeletions) { - queuedChunkDeletions.add(ChunkLocation(x, z)) + lock.write { + queuedChunkDeletions += ChunkLocation(x, z) } } - fun unloadAllChunks() { - deleteAllChunks.set(true) - if (!radarEnabled) { - synchronized(queuedChunkDeletions) { - queuedChunkDeletions.clear() - } - synchronized(queuedChunkUpdates) { - queuedChunkUpdates.clear() - } - chunkTextureMap.forEach { it.value.delete() } - chunkTextureMap.clear() - } - radarEnabled = false - } + fun unloadAllChunks() = lock.write { deleteAllChunks = true } class MiniMapTexture { val texture = DynamicTexture(16, 16) - var deleted = false + private var deleted = false fun updateChunkData(chunk: Chunk) { val rgbValues = texture.textureData + val pos = BlockPos.MutableBlockPos() for (x in 0..15) { for (z in 0..15) { - val bp = BlockPos(x, chunk.getHeightValue(x, z) - 1, z) + val bp = pos.set(x, chunk.getHeightValue(x, z) - 1, z) val blockState = chunk.getBlockState(bp) - rgbValues[rgbValues.size - (z * 16 + x + 1)] = blockState.block.getMapColor(blockState).colorValue or (0xFF shl 24) + rgbValues[rgbValues.size - 1 - (z shl 4 or x)] = blockState.block.getMapColor(blockState).colorValue or (0xFF shl 24) } } @@ -128,5 +106,9 @@ object MiniMapRegister : MinecraftInstance() { } } + private val Chunk.location: ChunkLocation + get() = ChunkLocation(xPosition, zPosition) + data class ChunkLocation(val x: Int, val z: Int) + } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/MovementUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/MovementUtils.kt index 8966420..7a809ad 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/MovementUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/MovementUtils.kt @@ -28,6 +28,8 @@ object MovementUtils : MinecraftInstance() { if(y) mc.thePlayer.motionY = 0.0 } + var affectSprintOnAttack: Boolean? = null + fun getSpeed(): Float { return sqrt(mc.thePlayer.motionX * mc.thePlayer.motionX + mc.thePlayer.motionZ * mc.thePlayer.motionZ).toFloat() } diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt index 049725d..8567a53 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/PacketUtils.kt @@ -7,7 +7,7 @@ package net.ccbluex.liquidbounce.utils import net.ccbluex.liquidbounce.event.* import net.ccbluex.liquidbounce.features.module.modules.combat.FakeLag -import net.ccbluex.liquidbounce.features.module.modules.combat.Velocity +import net.ccbluex.liquidbounce.features.module.modules.combat.AntiKB import net.ccbluex.liquidbounce.injection.implementations.IMixinEntity import net.ccbluex.liquidbounce.utils.extensions.* import net.ccbluex.liquidbounce.utils.render.RenderUtils @@ -79,7 +79,6 @@ object PacketUtils : MinecraftInstance(), Listenable { handlePacket(it) val packetEvent = PacketEvent(it, EventState.RECEIVE) FakeLag.onPacket(packetEvent) - Velocity.onPacket(packetEvent) } queuedPackets.clear() @@ -224,4 +223,24 @@ var C03PacketPlayer.rotation set(value) { yaw = value.yaw pitch = value.pitch - } \ No newline at end of file + } + +var C03PacketPlayer.pos + get() = Vec3(x, y, z) + set(value) { + x = value.xCoord + y = value.yCoord + z = value.zCoord + } + +fun schedulePacketProcess(packet: Packet<*>) { + synchronized(PacketUtils.queuedPackets) { + PacketUtils.queuedPackets.add(packet) + } +} + +fun schedulePacketProcess(packets: Collection>) { + synchronized(PacketUtils.queuedPackets) { + PacketUtils.queuedPackets.addAll(packets) + } +} \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/PlayerUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/PlayerUtils.kt index d52ae9a..d4f6318 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/PlayerUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/PlayerUtils.kt @@ -11,6 +11,7 @@ import net.ccbluex.liquidbounce.utils.block.BlockUtils.toVec import net.ccbluex.liquidbounce.utils.extensions.eyes import net.minecraft.block.BlockSlime import net.minecraft.client.entity.EntityPlayerSP +import net.minecraft.client.renderer.culling.Frustum import net.minecraft.enchantment.EnchantmentHelper import net.minecraft.entity.* import net.minecraft.entity.boss.EntityDragonPart @@ -305,3 +306,22 @@ object PlayerUtils { } } + +fun EntityPlayerSP.attackEntityWithModifiedSprint( + entity: Entity, affectMovementBySprint: Boolean? = null, swing: () -> Unit +) { + swing() + + MovementUtils.affectSprintOnAttack = affectMovementBySprint + + try { + mc.playerController?.attackEntity(this, entity) + } catch (any: Exception) { + // Unlikely to happen, but if it does, we just want to make sure affectSprintOnAttack is null. + any.printStackTrace() + } + + MovementUtils.affectSprintOnAttack = null + + CPSCounter.registerClick(CPSCounter.MouseButton.LEFT) +} diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt index 64523ad..d238383 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/RaycastUtils.kt @@ -10,14 +10,16 @@ import com.google.common.base.Predicates import net.ccbluex.liquidbounce.features.module.modules.combat.Backtrack import net.ccbluex.liquidbounce.features.module.modules.combat.Backtrack.loopThroughBacktrackData import net.ccbluex.liquidbounce.utils.RotationUtils.Companion.getVectorForRotation +import net.ccbluex.liquidbounce.utils.RotationUtils.Companion.isVisible import net.ccbluex.liquidbounce.utils.RotationUtils.Companion.serverRotation import net.ccbluex.liquidbounce.utils.extensions.eyes import net.ccbluex.liquidbounce.utils.extensions.hitBox import net.minecraft.entity.Entity +import net.minecraft.entity.EntityLivingBase +import net.minecraft.entity.item.EntityItemFrame import net.minecraft.entity.player.EntityPlayer -import net.minecraft.util.EntitySelectors -import net.minecraft.util.MathHelper -import net.minecraft.util.Vec3 +import net.minecraft.util.* +import java.util.* object RaycastUtils : MinecraftInstance() { @@ -168,4 +170,128 @@ object RaycastUtils : MinecraftInstance() { interface IEntityFilter { fun canRaycast(entity: Entity?): Boolean } + + /** + * Modified mouse object pickup + */ + fun runWithModifiedRaycastResult( + rotation: Rotation, + range: Double, + wallRange: Double, + action: (MovingObjectPosition) -> Unit + ) { + + val entity = mc.renderViewEntity + + val prevPointedEntity = mc.pointedEntity + val prevObjectMouseOver = mc.objectMouseOver + + if (entity != null && mc.theWorld != null) { + mc.pointedEntity = null + + val buildReach = if (mc.playerController.currentGameType.isCreative) 5.0 else 4.5 + + val vec3 = entity.eyes + val vec31 = getVectorForRotation(rotation) + val vec32 = vec3.addVector(vec31.xCoord * buildReach, vec31.yCoord * buildReach, vec31.zCoord * buildReach) + + mc.objectMouseOver = entity.worldObj.rayTraceBlocks(vec3, vec32, false, false, true) + + var d1 = buildReach + var flag = false + + if (mc.playerController.extendedReach()) { + d1 = 6.0 + } else if (buildReach > 3) { + flag = true + } + + if (mc.objectMouseOver != null) { + d1 = mc.objectMouseOver.hitVec.distanceTo(vec3) + } + + var pointedEntity: Entity? = null + var vec33: Vec3? = null + + val list = mc.theWorld.getEntities(EntityLivingBase::class.java) { + it != null && (it !is EntityPlayer || !it.isSpectator) && it.canBeCollidedWith() && it != entity + } + + var d2 = d1 + + for (entity1 in list) { + val f1 = entity1.collisionBorderSize + val boxes = ArrayList() + + boxes.add(entity1.entityBoundingBox.expand(f1.toDouble(), f1.toDouble(), f1.toDouble())) + + loopThroughBacktrackData(entity1) { + boxes.add(entity1.entityBoundingBox.expand(f1.toDouble(), f1.toDouble(), f1.toDouble())) + false + } + + for (box in boxes) { + val intercept = box.calculateIntercept(vec3, vec32) + + if (box.isVecInside(vec3)) { + if (d2 >= 0) { + pointedEntity = entity1 + vec33 = if (intercept == null) vec3 else intercept.hitVec + d2 = 0.0 + } + } else if (intercept != null) { + val d3 = vec3.distanceTo(intercept.hitVec) + + if (!isVisible(intercept.hitVec)) { + if (d3 <= wallRange) { + if (d3 < d2 || d2 == 0.0) { + pointedEntity = entity1 + vec33 = intercept.hitVec + d2 = d3 + } + } + + continue + } + + if (d3 < d2 || d2 == 0.0) { + if (entity1 === entity.ridingEntity && !entity.canRiderInteract()) { + if (d2 == 0.0) { + pointedEntity = entity1 + vec33 = intercept.hitVec + } + } else { + pointedEntity = entity1 + vec33 = intercept.hitVec + d2 = d3 + } + } + } + } + } + + if (pointedEntity != null && flag && vec3.distanceTo(vec33) > range) { + pointedEntity = null + mc.objectMouseOver = MovingObjectPosition( + MovingObjectPosition.MovingObjectType.MISS, + Objects.requireNonNull(vec33), + null, + BlockPos(vec33) + ) + } + + if (pointedEntity != null && (d2 < d1 || mc.objectMouseOver == null)) { + mc.objectMouseOver = MovingObjectPosition(pointedEntity, vec33) + + if (pointedEntity is EntityLivingBase || pointedEntity is EntityItemFrame) { + mc.pointedEntity = pointedEntity + } + } + + action(mc.objectMouseOver) + + mc.objectMouseOver = prevObjectMouseOver + mc.pointedEntity = prevPointedEntity + } + } } \ No newline at end of file diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/render/ColorUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/render/ColorUtils.kt index ec95396..e4afaf5 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/render/ColorUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/render/ColorUtils.kt @@ -218,6 +218,7 @@ object ColorUtils { return range } + @JvmStatic fun getColor(hueoffset: Float, saturation: Float, brightness: Float): Int { val speed = 4500f val hue = System.currentTimeMillis() % speed.toInt() / speed diff --git a/src/main/java/net/ccbluex/liquidbounce/utils/render/RenderUtils.kt b/src/main/java/net/ccbluex/liquidbounce/utils/render/RenderUtils.kt index 19a87bf..dcc2884 100644 --- a/src/main/java/net/ccbluex/liquidbounce/utils/render/RenderUtils.kt +++ b/src/main/java/net/ccbluex/liquidbounce/utils/render/RenderUtils.kt @@ -407,6 +407,7 @@ object RenderUtils : MinecraftInstance() { } } + @JvmStatic fun getRainbowOpaque(seconds: Int, saturation: Float, brightness: Float, index: Int): Int { val hue = ((System.currentTimeMillis() + index) % (seconds * 1000)) / (seconds * 1000).toFloat() return Color.HSBtoRGB(hue, saturation, brightness) @@ -3833,6 +3834,7 @@ object RenderUtils : MinecraftInstance() { return Color(r, g, b, alpha).rgb } + @JvmStatic fun SkyRainbow(var2: Int, st: Float, bright: Float): Int { var v1 = ceil((System.currentTimeMillis() + (var2 * 109L)).toDouble()) / 5 return Color.getHSBColor( diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloom.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloom.png new file mode 100644 index 0000000..ca51988 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloom.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloomsample.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloomsample.png new file mode 100644 index 0000000..80cb8ea Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashbloomsample.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic1.png new file mode 100644 index 0000000..9bc9927 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic10.png new file mode 100644 index 0000000..aa313b8 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic11.png new file mode 100644 index 0000000..62ed9b7 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic12.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic12.png new file mode 100644 index 0000000..c40ff83 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic12.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic13.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic13.png new file mode 100644 index 0000000..5c83caa Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic13.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic14.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic14.png new file mode 100644 index 0000000..4a8e953 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic14.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic15.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic15.png new file mode 100644 index 0000000..d5175e2 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic15.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic16.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic16.png new file mode 100644 index 0000000..853f211 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic16.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic17.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic17.png new file mode 100644 index 0000000..fc0f455 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic17.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic18.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic18.png new file mode 100644 index 0000000..eb9c044 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic18.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic19.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic19.png new file mode 100644 index 0000000..4507a3d Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic19.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic2.png new file mode 100644 index 0000000..7f19a8c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic20.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic20.png new file mode 100644 index 0000000..63ab801 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic20.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic21.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic21.png new file mode 100644 index 0000000..7700e95 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic21.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic3.png new file mode 100644 index 0000000..0271123 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic4.png new file mode 100644 index 0000000..8dbde59 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic5.png new file mode 100644 index 0000000..2f5339d Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic6.png new file mode 100644 index 0000000..4cc2d8e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic7.png new file mode 100644 index 0000000..0c73827 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic8.png new file mode 100644 index 0000000..66a56e3 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic9.png new file mode 100644 index 0000000..b9a8172 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/dashcubic9.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic1.png new file mode 100644 index 0000000..ba62f63 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic10.png new file mode 100644 index 0000000..05b503c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic11.png new file mode 100644 index 0000000..6884684 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic2.png new file mode 100644 index 0000000..beac53e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic3.png new file mode 100644 index 0000000..ee9a04e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic4.png new file mode 100644 index 0000000..28cf6b5 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic5.png new file mode 100644 index 0000000..4cef638 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic6.png new file mode 100644 index 0000000..3f68d83 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic7.png new file mode 100644 index 0000000..45af3bd Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic8.png new file mode 100644 index 0000000..849b6e6 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic9.png new file mode 100644 index 0000000..0fbd4a0 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group1/dashcubic9.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic1.png new file mode 100644 index 0000000..0deea97 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic10.png new file mode 100644 index 0000000..cabd10b Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic11.png new file mode 100644 index 0000000..40d76f1 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic12.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic12.png new file mode 100644 index 0000000..9f371c4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic12.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic13.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic13.png new file mode 100644 index 0000000..c10208d Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic13.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic14.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic14.png new file mode 100644 index 0000000..d1a4de4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic14.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic15.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic15.png new file mode 100644 index 0000000..e8c2e52 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic15.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic16.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic16.png new file mode 100644 index 0000000..e25cafe Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic16.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic17.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic17.png new file mode 100644 index 0000000..ca4f77c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic17.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic18.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic18.png new file mode 100644 index 0000000..83fe6f1 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic18.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic19.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic19.png new file mode 100644 index 0000000..593983e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic19.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic2.png new file mode 100644 index 0000000..9b76cef Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic20.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic20.png new file mode 100644 index 0000000..de9fdc8 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic20.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic21.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic21.png new file mode 100644 index 0000000..3126dee Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic21.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic22.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic22.png new file mode 100644 index 0000000..698d9a9 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic22.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic23.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic23.png new file mode 100644 index 0000000..5bc29b1 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic23.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic3.png new file mode 100644 index 0000000..7fd1086 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic4.png new file mode 100644 index 0000000..640b225 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic5.png new file mode 100644 index 0000000..b9d21a8 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic6.png new file mode 100644 index 0000000..7dd46f0 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic7.png new file mode 100644 index 0000000..5a76952 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic8.png new file mode 100644 index 0000000..8b4e95f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic9.png new file mode 100644 index 0000000..a0b2b7b Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group2/dashcubic9.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic1.png new file mode 100644 index 0000000..3106485 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic10.png new file mode 100644 index 0000000..a29b1e9 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic11.png new file mode 100644 index 0000000..462ae57 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic12.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic12.png new file mode 100644 index 0000000..ebe6d35 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic12.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic13.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic13.png new file mode 100644 index 0000000..04aa772 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic13.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic14.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic14.png new file mode 100644 index 0000000..89f51f1 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic14.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic15.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic15.png new file mode 100644 index 0000000..2d0cdbd Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic15.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic16.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic16.png new file mode 100644 index 0000000..4f6beea Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic16.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic17.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic17.png new file mode 100644 index 0000000..84c14cf Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic17.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic18.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic18.png new file mode 100644 index 0000000..3a441bd Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic18.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic19.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic19.png new file mode 100644 index 0000000..de55359 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic19.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic2.png new file mode 100644 index 0000000..d3bd860 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic20.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic20.png new file mode 100644 index 0000000..432f4d0 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic20.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic21.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic21.png new file mode 100644 index 0000000..6b4eaa2 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic21.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic22.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic22.png new file mode 100644 index 0000000..9556ccb Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic22.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic23.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic23.png new file mode 100644 index 0000000..ea49bb5 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic23.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic24.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic24.png new file mode 100644 index 0000000..d600d2f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic24.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic25.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic25.png new file mode 100644 index 0000000..4bf63d4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic25.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic26.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic26.png new file mode 100644 index 0000000..bbcee99 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic26.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic27.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic27.png new file mode 100644 index 0000000..00aaf1e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic27.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic28.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic28.png new file mode 100644 index 0000000..b36d392 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic28.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic29.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic29.png new file mode 100644 index 0000000..758d6d9 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic29.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic3.png new file mode 100644 index 0000000..bad20f3 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic30.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic30.png new file mode 100644 index 0000000..b51cdef Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic30.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic31.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic31.png new file mode 100644 index 0000000..a39907d Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic31.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic32.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic32.png new file mode 100644 index 0000000..b5efc79 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic32.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic4.png new file mode 100644 index 0000000..b8be0f8 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic5.png new file mode 100644 index 0000000..9c5cdf5 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic6.png new file mode 100644 index 0000000..c79ef7c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic7.png new file mode 100644 index 0000000..1912368 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic8.png new file mode 100644 index 0000000..0b49c85 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic9.png new file mode 100644 index 0000000..3cc3920 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group3/dashcubic9.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic1.png new file mode 100644 index 0000000..e2c5e5f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic10.png new file mode 100644 index 0000000..91c474a Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic11.png new file mode 100644 index 0000000..9906528 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic12.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic12.png new file mode 100644 index 0000000..b9a80ce Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic12.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic13.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic13.png new file mode 100644 index 0000000..3597292 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic13.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic14.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic14.png new file mode 100644 index 0000000..48fcd43 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic14.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic15.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic15.png new file mode 100644 index 0000000..7fa40b6 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic15.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic16.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic16.png new file mode 100644 index 0000000..1bf6c9e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic16.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic2.png new file mode 100644 index 0000000..d6aa3dc Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic3.png new file mode 100644 index 0000000..065703a Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic4.png new file mode 100644 index 0000000..a892853 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic5.png new file mode 100644 index 0000000..47e1689 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic6.png new file mode 100644 index 0000000..2b33b34 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic7.png new file mode 100644 index 0000000..76e3741 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic8.png new file mode 100644 index 0000000..3c0f6ec Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic9.png new file mode 100644 index 0000000..bc93fe4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group4/dashcubic9.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic1.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic1.png new file mode 100644 index 0000000..312b4db Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic1.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic10.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic10.png new file mode 100644 index 0000000..73a0984 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic10.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic11.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic11.png new file mode 100644 index 0000000..8430d1f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic11.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic12.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic12.png new file mode 100644 index 0000000..dda4939 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic12.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic13.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic13.png new file mode 100644 index 0000000..c94890c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic13.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic14.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic14.png new file mode 100644 index 0000000..a91e36f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic14.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic15.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic15.png new file mode 100644 index 0000000..1d03d04 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic15.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic16.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic16.png new file mode 100644 index 0000000..bc4bed4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic16.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic17.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic17.png new file mode 100644 index 0000000..05ed61c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic17.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic18.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic18.png new file mode 100644 index 0000000..26771d9 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic18.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic19.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic19.png new file mode 100644 index 0000000..a7ea426 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic19.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic2.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic2.png new file mode 100644 index 0000000..e7d8fe7 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic2.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic20.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic20.png new file mode 100644 index 0000000..5ad89d5 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic20.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic21.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic21.png new file mode 100644 index 0000000..2658df7 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic21.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic22.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic22.png new file mode 100644 index 0000000..e734ae0 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic22.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic23.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic23.png new file mode 100644 index 0000000..3622d91 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic23.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic24.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic24.png new file mode 100644 index 0000000..35cfe99 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic24.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic25.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic25.png new file mode 100644 index 0000000..fe5ab36 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic25.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic26.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic26.png new file mode 100644 index 0000000..332003c Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic26.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic27.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic27.png new file mode 100644 index 0000000..861bce3 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic27.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic28.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic28.png new file mode 100644 index 0000000..f12c430 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic28.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic29.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic29.png new file mode 100644 index 0000000..911250d Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic29.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic3.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic3.png new file mode 100644 index 0000000..90e505e Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic3.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic30.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic30.png new file mode 100644 index 0000000..b63b23a Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic30.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic31.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic31.png new file mode 100644 index 0000000..25cd0a3 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic31.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic32.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic32.png new file mode 100644 index 0000000..56829f4 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic32.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic4.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic4.png new file mode 100644 index 0000000..79faf02 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic4.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic5.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic5.png new file mode 100644 index 0000000..66b1e97 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic5.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic6.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic6.png new file mode 100644 index 0000000..8898c8f Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic6.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic7.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic7.png new file mode 100644 index 0000000..52b7594 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic7.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic8.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic8.png new file mode 100644 index 0000000..38f6081 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic8.png differ diff --git a/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic9.png b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic9.png new file mode 100644 index 0000000..d81d418 Binary files /dev/null and b/src/main/resources/assets/minecraft/fdpclient/dashtrail/dashcubics/group_dashs/group5/dashcubic9.png differ diff --git a/src/main/resources/mixins.fdpclient.json b/src/main/resources/mixins.fdpclient.json index 5d7525a..48838d4 100644 --- a/src/main/resources/mixins.fdpclient.json +++ b/src/main/resources/mixins.fdpclient.json @@ -114,6 +114,7 @@ "render.MixinTileEntitySkullRenderer", "render.MixinVisGraph", "resources.MixinDefaultResourcePack", - "resources.MixinSkinManager" + "resources.MixinSkinManager", + "world.MixinChunk" ] }