From 5cb956a0a51d55f9cab1265e49f33f4539366701 Mon Sep 17 00:00:00 2001 From: ChineseDog Date: Sat, 4 Jul 2026 13:48:30 +1200 Subject: [PATCH] add Pause When Eating to Breaking and Interact. Packet mine still progresses while your eatting but wont actually finish to your done eatting.This is because you cant eat when placing and and stuff. --- src/main/kotlin/com/lambda/config/blocks/BreakConfig.kt | 1 + src/main/kotlin/com/lambda/config/blocks/BreakSettings.kt | 1 + src/main/kotlin/com/lambda/config/blocks/InteractConfig.kt | 1 + src/main/kotlin/com/lambda/config/blocks/InteractSettings.kt | 1 + .../com/lambda/interaction/managers/breaking/BreakManager.kt | 4 +++- .../com/lambda/interaction/managers/breaking/SwapInfo.kt | 3 ++- .../interaction/managers/interacting/InteractManager.kt | 2 ++ src/main/kotlin/com/lambda/util/player/PlayerUtils.kt | 4 ++++ 8 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/com/lambda/config/blocks/BreakConfig.kt b/src/main/kotlin/com/lambda/config/blocks/BreakConfig.kt index bc89260f3..06744e525 100644 --- a/src/main/kotlin/com/lambda/config/blocks/BreakConfig.kt +++ b/src/main/kotlin/com/lambda/config/blocks/BreakConfig.kt @@ -36,6 +36,7 @@ interface BreakConfig : ActionConfig { //ToDo: Needs a more advanced player simulation implementation to predict the next ticks onGround / submerged status // abstract val desyncFix: Boolean val breakDelay: Int + val pauseWhenEating: Boolean val swapMode: SwapMode diff --git a/src/main/kotlin/com/lambda/config/blocks/BreakSettings.kt b/src/main/kotlin/com/lambda/config/blocks/BreakSettings.kt index 01b9d9a15..0eabb3e41 100644 --- a/src/main/kotlin/com/lambda/config/blocks/BreakSettings.kt +++ b/src/main/kotlin/com/lambda/config/blocks/BreakSettings.kt @@ -50,6 +50,7 @@ class BreakSettings(override val c: Config) : BreakConfig, ConfigBlock { override val serverSwapTicks by c.setting("Server Swap", 0, 0..5, 1, "The number of ticks to give the server time to recognize the player attributes on the swapped item", " tick(s)") // @Group(GeneralGroup) override val desyncFix by c.setting("Desync Fix", false, "Predicts if the players breaking will be slowed next tick as block break packets are processed using the players next position") { page == Page.General } override val breakDelay by c.setting("Break Delay", 0, 0..6, 1, "The delay between breaking blocks", " tick(s)") + override val pauseWhenEating by c.setting("Pause When Eating", false, "Keeps progressing block breaks while eating, but won't finish them until eating ends") // Timing override val tickStageMask by c.setting("Break Stage Mask", setOf(TickEvent.Input.Post), ALL_STAGES.toSet(), "The sub-tick timing at which break actions can be performed", displayClassName = true) override val swapMode by c.setting("Break Swap Mode", BreakConfig.SwapMode.End, "Decides when to swap to the best suited tool when breaking a block") diff --git a/src/main/kotlin/com/lambda/config/blocks/InteractConfig.kt b/src/main/kotlin/com/lambda/config/blocks/InteractConfig.kt index 1f7941068..669ccd739 100644 --- a/src/main/kotlin/com/lambda/config/blocks/InteractConfig.kt +++ b/src/main/kotlin/com/lambda/config/blocks/InteractConfig.kt @@ -26,6 +26,7 @@ interface InteractConfig : ActionConfig { val axisRotateSetting: Boolean val axisRotate get() = rotate && airPlace.isEnabled && axisRotateSetting val interactConfirmationMode: InteractConfirmationMode + val pauseWhenEating: Boolean val interactDelay: Int val interactionsPerTick: Int val swing: Boolean diff --git a/src/main/kotlin/com/lambda/config/blocks/InteractSettings.kt b/src/main/kotlin/com/lambda/config/blocks/InteractSettings.kt index f139432b5..950c5ff08 100644 --- a/src/main/kotlin/com/lambda/config/blocks/InteractSettings.kt +++ b/src/main/kotlin/com/lambda/config/blocks/InteractSettings.kt @@ -29,6 +29,7 @@ class InteractSettings(override val c: Config) : InteractConfig, ConfigBlock { override val sorter by c.setting("Interaction Sorter", ActionConfig.SortMode.Tool, "The order in which placements are performed") override val tickStageMask by c.setting("Interaction Stage Mask", setOf(TickEvent.Input.Post), ALL_STAGES.toSet(), "The sub-tick timing at which place actions are performed", displayClassName = true) override val interactConfirmationMode by c.setting("Interact Confirmation", InteractConfig.InteractConfirmationMode.PlaceThenAwait, "Wait for block placement confirmation") + override val pauseWhenEating by c.setting("Pause When Eating", false, "Pauses block interactions while eating") override val interactDelay by c.setting("Interact Delay", 0, 0..3, 1, "Tick delay between interacting with another block") override val interactionsPerTick by c.setting("Interactions Per Tick", 9, 1..30, 1, "Maximum instant block places per tick") override val swing by c.setting("Swing On Interact", true, "Swings the players hand when placing") diff --git a/src/main/kotlin/com/lambda/interaction/managers/breaking/BreakManager.kt b/src/main/kotlin/com/lambda/interaction/managers/breaking/BreakManager.kt index 79d8d30b2..1f52f3000 100644 --- a/src/main/kotlin/com/lambda/interaction/managers/breaking/BreakManager.kt +++ b/src/main/kotlin/com/lambda/interaction/managers/breaking/BreakManager.kt @@ -87,6 +87,7 @@ import com.lambda.util.extension.tickDelta import com.lambda.util.item.ItemUtils.block import com.lambda.util.math.lerp import com.lambda.util.player.PlayerUtils.gamemode +import com.lambda.util.player.PlayerUtils.isEating import com.lambda.util.player.PlayerUtils.swingHand import net.minecraft.block.BlockState import net.minecraft.client.sound.PositionedSoundInstance @@ -747,6 +748,7 @@ object BreakManager : Manager( val swing = breakConfig.swing if (progress >= info.getBreakThreshold()) { + if (breakConfig.pauseWhenEating && player.isEating) return if (info.swapInfo.swap && !swapped) return if (info.type == Primary && !PacketLimitHandler.canSendPackets(1, PacketType.PlayerAction)) return @@ -815,7 +817,7 @@ object BreakManager : Manager( val blockState = blockState(ctx.blockPos) val progress = blockState.calcBreakDelta(ctx.blockPos) - val instantBreakable = progress >= info.getBreakThreshold() + val instantBreakable = progress >= info.getBreakThreshold() && !(breakConfig.pauseWhenEating && player.isEating) var packetCount = 1 if (breakConfig.breakMode == BreakMode.Packet) packetCount++ diff --git a/src/main/kotlin/com/lambda/interaction/managers/breaking/SwapInfo.kt b/src/main/kotlin/com/lambda/interaction/managers/breaking/SwapInfo.kt index 390c4caa5..280f09827 100644 --- a/src/main/kotlin/com/lambda/interaction/managers/breaking/SwapInfo.kt +++ b/src/main/kotlin/com/lambda/interaction/managers/breaking/SwapInfo.kt @@ -26,6 +26,7 @@ import com.lambda.interaction.managers.breaking.BreakInfo.BreakType.Primary import com.lambda.interaction.managers.breaking.BreakInfo.BreakType.Secondary import com.lambda.interaction.managers.breaking.BreakManager.calcBreakDelta import com.lambda.threading.runSafeAutomated +import com.lambda.util.player.PlayerUtils.isEating /** * A simple data class to store info about when the [BreakManager] should swap tool. @@ -63,7 +64,7 @@ data class SwapInfo( swapTickProgress >= threshold } - val swap = when (breakConfig.swapMode) { + val swap = !(breakConfig.pauseWhenEating && player.isEating) && when (breakConfig.swapMode) { BreakConfig.SwapMode.None -> false BreakConfig.SwapMode.Start -> !breaking BreakConfig.SwapMode.End -> swapAtEnd diff --git a/src/main/kotlin/com/lambda/interaction/managers/interacting/InteractManager.kt b/src/main/kotlin/com/lambda/interaction/managers/interacting/InteractManager.kt index 442e05e38..b3884016f 100644 --- a/src/main/kotlin/com/lambda/interaction/managers/interacting/InteractManager.kt +++ b/src/main/kotlin/com/lambda/interaction/managers/interacting/InteractManager.kt @@ -54,6 +54,7 @@ import com.lambda.util.PacketUtils.sendPacket import com.lambda.util.item.ItemUtils.blockItem import com.lambda.util.player.MovementUtils.sneaking import com.lambda.util.player.PlayerUtils.gamemode +import com.lambda.util.player.PlayerUtils.isEating import com.lambda.util.player.PlayerUtils.isItemOnCooldown import com.lambda.util.player.PlayerUtils.swingHand import kotlinx.coroutines.delay @@ -155,6 +156,7 @@ object InteractManager : Manager( * @see populateFrom */ fun AutomatedSafeContext.processRequest(request: InteractRequest) { + if (interactConfig.pauseWhenEating && player.isEating) return if (request.fresh) populateFrom(request) if (potentialInteractions.isNotEmpty()) { diff --git a/src/main/kotlin/com/lambda/util/player/PlayerUtils.kt b/src/main/kotlin/com/lambda/util/player/PlayerUtils.kt index b3a2773d0..c1f2925ab 100644 --- a/src/main/kotlin/com/lambda/util/player/PlayerUtils.kt +++ b/src/main/kotlin/com/lambda/util/player/PlayerUtils.kt @@ -28,6 +28,7 @@ import net.minecraft.entity.LivingEntity import net.minecraft.entity.effect.StatusEffects import net.minecraft.entity.projectile.FireworkRocketEntity import net.minecraft.item.ItemStack +import net.minecraft.item.consume.UseAction import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket import net.minecraft.util.Hand import net.minecraft.world.GameMode @@ -45,6 +46,9 @@ object PlayerUtils { val ClientPlayerEntity.canStartGliding: Boolean get() = !isGliding && !isClimbing && !isTouchingWater && canGlide() + val ClientPlayerEntity.isEating: Boolean + get() = isUsingItem && (activeItem.useAction == UseAction.EAT || activeItem.useAction == UseAction.DRINK) + context(_: SafeContext) val ClientPlayerEntity.canTakeoff: Boolean get() = (isOnGround || !isGliding) &&