@@ -40,12 +40,14 @@ import com.lambda.util.BlockUtils.fluidState
4040import com.lambda.util.Communication.info
4141import com.lambda.util.Communication.warn
4242import com.lambda.util.collections.LimitedDecayQueue
43+ import com.lambda.util.item.ItemUtils.block
4344import com.lambda.util.player.swingHandClient
4445import net.minecraft.block.BlockState
4546import net.minecraft.block.OperatorBlock
4647import net.minecraft.client.sound.PositionedSoundInstance
4748import net.minecraft.client.sound.SoundInstance
4849import net.minecraft.client.world.ClientWorld
50+ import net.minecraft.entity.ItemEntity
4951import net.minecraft.entity.player.PlayerEntity
5052import net.minecraft.item.ItemStack
5153import net.minecraft.network.packet.c2s.play.HandSwingC2SPacket
@@ -89,13 +91,12 @@ object BreakManager : RequestHandler<BreakRequest>() {
8991 .sortedBy { it.instantBreak }
9092 .forEach { requestCtx ->
9193 if (! canAccept(requestCtx)) return @forEach
92- val breakType = handleRequestContext(
93- requestCtx,
94- request.onBreak,
95- request.buildConfig,
96- request.rotationConfig,
97- request.hotbarConfig
98- )
94+ val breakType = with (request) {
95+ handleRequestContext(requestCtx,
96+ buildConfig, rotationConfig, hotbarConfig,
97+ onBreak, onItemDrop
98+ )
99+ }
99100 if (breakType == BreakType .Null ) return @request
100101 if (requestCtx.instantBreak && instaBreaks < request.buildConfig.breakSettings.breaksPerTick) {
101102 breakingInfos.getOrNull(breakType.index)?.let { info ->
@@ -154,6 +155,24 @@ object BreakManager : RequestHandler<BreakRequest>() {
154155 info.onBreak()
155156 }
156157 }
158+
159+ // ToDo: drop callback stuff
160+ // // ToDo: Dependent on the tracked data order. When set stack is called after position it wont work
161+ // listen<EntityEvent.EntityUpdate> {
162+ // if (it.entity !is ItemEntity) return@listen
163+ // pendingInteractions
164+ // .firstOrNull { info -> matchesBlockItem(info, it.entity) }
165+ // ?.onItemDrop?.invoke(it.entity)
166+ // ?: breakingInfos
167+ // .filterNotNull()
168+ // .firstOrNull { info -> matchesBlockItem(info, it.entity) }?.onItemDrop?.invoke(it.entity)
169+ // }
170+ }
171+
172+ private fun matchesBlockItem (info : BreakInfo , entity : ItemEntity ): Boolean {
173+ val inRange = info.context.expectedPos.toCenterPos().isInRange(entity.pos, 0.5 )
174+ val correctMaterial = info.context.checkedState.block == entity.stack.item.block
175+ return inRange && correctMaterial
157176 }
158177
159178 private fun SafeContext.matchesTargetState (pos : BlockPos , targetState : TargetState , newState : BlockState ) =
@@ -165,52 +184,41 @@ object BreakManager : RequestHandler<BreakRequest>() {
165184
166185 private fun handleRequestContext (
167186 requestCtx : BreakContext ,
168- onBreak : () -> Unit ,
169187 buildConfig : BuildConfig ,
170188 rotationConfig : RotationConfig ,
171- hotbarConfig : HotbarConfig
189+ hotbarConfig : HotbarConfig ,
190+ onBreak : () -> Unit ,
191+ onItemDrop : (ItemEntity ) -> Unit
172192 ): BreakType {
193+ val breakInfo = BreakInfo (requestCtx, BreakType .Primary ,
194+ buildConfig.breakSettings, rotationConfig, hotbarConfig,
195+ onBreak, onItemDrop
196+ )
173197 primaryBreakingInfo?.let { primaryInfo ->
174198 if (! primaryInfo.breakConfig.doubleBreak) return BreakType .Null
175199 if (primaryInfo.startedWithSecondary) return BreakType .Null
176200 if (! primaryInfo.breaking) {
177- secondaryBreakingInfo = BreakInfo (
178- requestCtx,
179- BreakType .Secondary ,
180- onBreak,
181- buildConfig.breakSettings,
182- rotationConfig,
183- hotbarConfig
184- )
201+ secondaryBreakingInfo = breakInfo.apply { type = BreakType .Secondary }
185202 return BreakType .Secondary
186203 } else {
187204 primaryInfo.type = BreakType .Secondary
188205 secondaryBreakingInfo = primaryInfo
189- primaryBreakingInfo = BreakInfo (
190- requestCtx,
191- BreakType .Primary ,
192- onBreak,
193- buildConfig.breakSettings,
194- rotationConfig,
195- hotbarConfig
196- )
206+ primaryBreakingInfo = breakInfo
207+ setPendingInteractionsLimits(buildConfig)
197208 return BreakType .Primary
198209 }
199210 } ? : run {
200- primaryBreakingInfo = BreakInfo (
201- requestCtx,
202- BreakType .Primary ,
203- onBreak,
204- buildConfig.breakSettings,
205- rotationConfig,
206- hotbarConfig
207- )
208- pendingInteractions.setMaxSize(buildConfig.maxPendingInteractions)
209- pendingInteractions.setDecayTime(buildConfig.interactionTimeout * 50L )
211+ primaryBreakingInfo = breakInfo
212+ setPendingInteractionsLimits(buildConfig)
210213 return BreakType .Primary
211214 }
212215 }
213216
217+ private fun setPendingInteractionsLimits (buildConfig : BuildConfig ) {
218+ pendingInteractions.setMaxSize(buildConfig.maxPendingInteractions)
219+ pendingInteractions.setDecayTime(buildConfig.interactionTimeout * 50L )
220+ }
221+
214222 private fun SafeContext.canAccept (ctx : BreakContext ) =
215223 pendingInteractions.none { it.context.expectedPos == ctx.expectedPos }
216224 && breakingInfos.none { info -> info?.context?.expectedPos == ctx.expectedPos }
@@ -417,10 +425,11 @@ object BreakManager : RequestHandler<BreakRequest>() {
417425 data class BreakInfo (
418426 val context : BreakContext ,
419427 var type : BreakType ,
420- val onBreak : () -> Unit ,
421428 val breakConfig : BreakConfig ,
422429 val rotationConfig : RotationConfig ,
423- val hotbarConfig : HotbarConfig
430+ val hotbarConfig : HotbarConfig ,
431+ val onBreak : () -> Unit ,
432+ val onItemDrop : (ItemEntity ) -> Unit
424433 ) {
425434 var breaking = false
426435 var breakingTicks = 0
0 commit comments