@@ -19,69 +19,67 @@ package com.lambda.interaction.request.breaking
1919
2020import com.lambda.interaction.construction.context.BreakContext
2121import com.lambda.interaction.request.ActionInfo
22- import com.lambda.threading.runSafe
2322import com.lambda.util.BlockUtils.calcItemBlockBreakingDelta
24- import com.lambda.util.collections.updatableLazy
23+ import com.lambda.util.OneSetPerTick
2524import net.minecraft.client.network.ClientPlayerEntity
2625import net.minecraft.client.network.ClientPlayerInteractionManager
2726import net.minecraft.client.world.ClientWorld
2827import net.minecraft.entity.ItemEntity
2928import net.minecraft.entity.player.PlayerEntity
29+ import net.minecraft.item.ItemStack
3030import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket
3131import net.minecraft.network.packet.c2s.play.PlayerActionC2SPacket.Action
32- import net.minecraft.world.WorldView
32+ import net.minecraft.world.BlockView
3333
3434data class BreakInfo (
3535 override var context : BreakContext ,
3636 var type : BreakType ,
3737 var request : BreakRequest
3838) : ActionInfo {
39+ // Delegates
3940 val breakConfig get() = request.build.breaking
4041 override val pendingInteractionsList get() = request.pendingInteractions
4142
42- var updatedThisTick = true
43- var progressedThisTick = false
43+ // Pre Processing
44+ var shouldProgress = false
45+ var couldReBreak by OneSetPerTick (false , true )
46+ var shouldSwap by OneSetPerTick (false , true )
47+ var swapStack: ItemStack by OneSetPerTick (ItemStack .EMPTY , true )
48+ var minSwapTicks by OneSetPerTick (0 , true )
4449 var serverBreakTicks = 0
4550
46- var couldReBreak = updatableLazy {
47- runSafe {
48- ReBreakManager .couldReBreak(this @BreakInfo, player, world)
49- } == true
50- }
51+ // BreakInfo Specific
52+ var updatedThisTick by OneSetPerTick (false , resetAfterTick = true ).apply { set(true ) }
53+ var updatedPreProcessingThisTick by OneSetPerTick (false , true , true )
54+ var progressedThisTick by OneSetPerTick (false , true , true )
5155
52- var shouldProgress = false
56+ // Processing
5357 var breaking = false
5458 var abandoned = false
55- var breakingTicks = 0
56- var soundsCooldown = 0.0f
57-
59+ var breakingTicks by OneSetPerTick (0 , true )
60+ var soundsCooldown by OneSetPerTick (0f , true )
5861 var vanillaInstantBreakable = false
59- val reBreakable get() = ! vanillaInstantBreakable && isPrimary
60-
61- val isPrimary get() = type == BreakType .Primary
62- val isSecondary get() = type == BreakType .Secondary
63- val isRedundant get() = type == BreakType .RedundantSecondary
64- val isReBreaking get() = type == BreakType .ReBreak
62+ val reBreakable get() = ! vanillaInstantBreakable && type == BreakType .Primary
6563
64+ // Post Processing
6665 @Volatile
6766 var broken = false ; private set
6867 private var item: ItemEntity ? = null
69-
7068 val callbacksCompleted
7169 @Synchronized get() = broken && (request.onItemDrop == null || item != null )
7270
7371 @Synchronized
7472 fun internalOnBreak () {
75- if (! isReBreaking ) broken = true
73+ if (type != BreakType . ReBreak ) broken = true
7674 item?.let { item ->
7775 request.onItemDrop?.invoke(item)
7876 }
7977 }
8078
8179 @Synchronized
8280 fun internalOnItemDrop (item : ItemEntity ) {
83- if (! isReBreaking ) this .item = item
84- if (broken || isReBreaking ) {
81+ if (type != BreakType . ReBreak ) this .item = item
82+ if (broken || type == BreakType . ReBreak ) {
8583 request.onItemDrop?.invoke(item)
8684 }
8785 }
@@ -90,25 +88,19 @@ data class BreakInfo(
9088 updatedThisTick = true
9189 this .context = context
9290 request?.let { this .request = it }
93- if (isRedundant) type = BreakType .Secondary
94- }
95-
96- fun tickStats () {
97- updatedThisTick = false
98- progressedThisTick = false
91+ if (type == BreakType .RedundantSecondary ) type = BreakType .Secondary
9992 }
10093
10194 fun resetCallbacks () {
10295 broken = false
10396 item = null
10497 }
10598
106- fun shouldSwap (player : ClientPlayerEntity , world : WorldView ): Boolean {
107- if (! shouldProgress) return false
99+ fun shouldSwap (player : ClientPlayerEntity , world : BlockView ): Boolean {
108100 val item = player.inventory.getStack(context.hotbarIndex)
109101 val breakDelta = context.cachedState.calcItemBlockBreakingDelta(player, world, context.blockPos, item)
110102 val breakProgress = breakDelta * (breakingTicks + 1 )
111- return if (couldReBreak.value == true )
103+ return if (couldReBreak)
112104 breakConfig.swapMode.isEnabled()
113105 else when (breakConfig.swapMode) {
114106 BreakConfig .SwapMode .None -> false
0 commit comments