Skip to content

Commit 232c217

Browse files
committed
move re break checks to the processRequest function and decouple checks for if a break info can be re broken and the act of re breaking
1 parent d6601c4 commit 232c217

File tree

3 files changed

+58
-42
lines changed

3 files changed

+58
-42
lines changed

common/src/main/kotlin/com/lambda/interaction/request/breaking/BreakInfo.kt

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ package com.lambda.interaction.request.breaking
1919

2020
import com.lambda.interaction.construction.context.BreakContext
2121
import com.lambda.interaction.request.ActionInfo
22+
import com.lambda.threading.runSafe
2223
import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
2324
import net.minecraft.client.network.ClientPlayerEntity
2425
import net.minecraft.client.network.ClientPlayerInteractionManager
@@ -41,6 +42,12 @@ data class BreakInfo(
4142
var progressedThisTick = false
4243
var serverBreakTicks = 0
4344

45+
var couldReBreak = lazy {
46+
runSafe {
47+
ReBreakManager.couldReBreak(this@BreakInfo, player, world)
48+
} == true
49+
}
50+
4451
var breaking = false
4552
var abandoned = false
4653
var breakingTicks = 0
@@ -100,7 +107,9 @@ data class BreakInfo(
100107
val breakProgress = breakDelta * ((breakingTicks + 1) - breakConfig.fudgeFactor).let {
101108
if (isSecondary) it + 1 else it
102109
}
103-
return when (breakConfig.swapMode) {
110+
return if (couldReBreak.value)
111+
breakConfig.swapMode.isEnabled()
112+
else when (breakConfig.swapMode) {
104113
BreakConfig.SwapMode.None -> false
105114
BreakConfig.SwapMode.Start -> !breaking
106115
BreakConfig.SwapMode.End -> breakProgress >= getBreakThreshold()

common/src/main/kotlin/com/lambda/interaction/request/breaking/BreakManager.kt

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -329,6 +329,28 @@ object BreakManager : RequestHandler<BreakRequest>(
329329
if (tickStage !in info.breakConfig.breakStageMask) return@forEach
330330
if (!rotated && info.isPrimary) return@run
331331

332+
if (info.couldReBreak.value) when (val reBreakResult = ReBreakManager.handleUpdate(info.context, info.request)) {
333+
is ReBreakResult.StillBreaking -> {
334+
primaryBreak = reBreakResult.breakInfo.apply {
335+
type = Primary
336+
ReBreakManager.clearReBreak()
337+
request.onStart?.invoke(info.context.blockPos)
338+
}
339+
340+
primaryBreak?.let { primary ->
341+
updateBreakProgress(primary)
342+
}
343+
return@forEach
344+
}
345+
is ReBreakResult.ReBroke -> {
346+
info.type = ReBreak
347+
info.nullify()
348+
info.request.onReBreak?.invoke(info.context.blockPos)
349+
return@forEach
350+
}
351+
else -> {}
352+
}
353+
332354
updateBreakProgress(info)
333355
}
334356
}
@@ -649,26 +671,6 @@ object BreakManager : RequestHandler<BreakRequest>(
649671
}
650672

651673
if (!info.breaking) {
652-
when (val reBreakResult = ReBreakManager.handleUpdate(info.context, info.request)) {
653-
is ReBreakResult.StillBreaking -> {
654-
primaryBreak = reBreakResult.breakInfo.apply {
655-
type = Primary
656-
ReBreakManager.clearReBreak()
657-
request.onStart?.invoke(ctx.blockPos)
658-
}
659-
660-
return primaryBreak?.let { primary ->
661-
updateBreakProgress(primary)
662-
} == true
663-
}
664-
is ReBreakResult.ReBroke -> {
665-
info.type = ReBreak
666-
info.nullify()
667-
info.request.onReBreak?.invoke(info.context.blockPos)
668-
return true
669-
}
670-
else -> {}
671-
}
672674
if (!startBreaking(info)) {
673675
info.nullify()
674676
info.request.onCancel?.invoke(info.context.blockPos)

common/src/main/kotlin/com/lambda/interaction/request/breaking/ReBreakManager.kt

Lines changed: 26 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,11 @@ import com.lambda.event.listener.UnsafeListener.Companion.listenUnsafe
2424
import com.lambda.interaction.construction.context.BreakContext
2525
import com.lambda.interaction.request.breaking.BrokenBlockHandler.destroyBlock
2626
import com.lambda.threading.runSafe
27-
import com.lambda.util.BlockUtils.isEmpty
27+
import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
2828
import com.lambda.util.player.swingHand
29+
import net.minecraft.client.network.ClientPlayerEntity
2930
import net.minecraft.util.Hand
31+
import net.minecraft.world.BlockView
3032

3133
object 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

Comments
 (0)