@@ -24,9 +24,11 @@ import com.lambda.event.listener.UnsafeListener.Companion.listenUnsafe
2424import com.lambda.interaction.construction.context.BreakContext
2525import com.lambda.interaction.request.breaking.BrokenBlockHandler.destroyBlock
2626import com.lambda.threading.runSafe
27- import com.lambda.util.BlockUtils.isEmpty
27+ import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
2828import com.lambda.util.player.swingHand
29+ import net.minecraft.client.network.ClientPlayerEntity
2930import net.minecraft.util.Hand
31+ import net.minecraft.world.BlockView
3032
3133object ReBreakManager {
3234 var reBreak: BreakInfo ? = null
@@ -65,35 +67,38 @@ object ReBreakManager {
6567 reBreak = null
6668 }
6769
70+ fun couldReBreak (info : BreakInfo , player : ClientPlayerEntity , world : BlockView ) =
71+ reBreak?.let { reBreak ->
72+ val stack = if (info.breakConfig.swapMode.isEnabled())
73+ player.inventory.getStack(info.context.hotbarIndex)
74+ else player.mainHandStack
75+ val breakDelta = info.context.cachedState.calcItemBlockBreakingDelta(player, world, info.context.blockPos, stack)
76+ reBreak.breakConfig.reBreak &&
77+ info.context.blockPos == reBreak.context.blockPos &&
78+ ! reBreak.updatedThisTick &&
79+ ((reBreak.breakingTicks - info.breakConfig.fudgeFactor) * breakDelta >= info.breakConfig.breakThreshold)
80+ } == true
81+
6882 fun handleUpdate (ctx : BreakContext , breakRequest : BreakRequest ) =
6983 runSafe {
70- val info = reBreak ? : return @runSafe ReBreakResult .Ignored
71-
72- if (info.context.blockPos != ctx.blockPos || ! info.breakConfig.reBreak) {
73- return @runSafe ReBreakResult .Ignored
74- }
75- if (info.updatedThisTick) return @runSafe ReBreakResult .ReBroke
76- info.updateInfo(ctx, breakRequest)
84+ val reBreak = this @ReBreakManager.reBreak ? : return @runSafe ReBreakResult .Ignored
7785
78- val context = info.context
86+ reBreak.updateInfo(ctx, breakRequest)
7987
80- val breakProgress = context.cachedState.calcBlockBreakingDelta(player, world, context.blockPos)
81- return @runSafe if ((info.breakingTicks - info.breakConfig.fudgeFactor) * breakProgress >= info.breakConfig.breakThreshold) {
82- if (context.cachedState.isEmpty) {
83- return @runSafe ReBreakResult .Ignored
84- }
85- if (info.breakConfig.breakConfirmation != BreakConfig .BreakConfirmationMode .AwaitThenBreak ) {
86- destroyBlock(info)
88+ val context = reBreak.context
89+ val breakDelta = context.cachedState.calcBlockBreakingDelta(player, world, context.blockPos)
90+ return @runSafe if ((reBreak.breakingTicks - reBreak.breakConfig.fudgeFactor) * breakDelta >= reBreak.breakConfig.breakThreshold) {
91+ if (reBreak.breakConfig.breakConfirmation != BreakConfig .BreakConfirmationMode .AwaitThenBreak ) {
92+ destroyBlock(reBreak)
8793 }
88- info.stopBreakPacket(world, interaction)
89- val swing = info.breakConfig.swing
90- if (swing.isEnabled() && swing != BreakConfig .SwingMode .Start ) {
91- swingHand(info.breakConfig.swingType, Hand .MAIN_HAND )
94+ reBreak.stopBreakPacket(world, interaction)
95+ if (reBreak.breakConfig.swing.isEnabled()) {
96+ swingHand(reBreak.breakConfig.swingType, Hand .MAIN_HAND )
9297 }
9398 BreakManager .breaksThisTick++
9499 ReBreakResult .ReBroke
95100 } else {
96- ReBreakResult .StillBreaking (info )
101+ ReBreakResult .StillBreaking (reBreak )
97102 }
98103 }
99104}
0 commit comments