@@ -54,10 +54,8 @@ import com.lambda.interaction.request.breaking.BreakManager.breaks
5454import com.lambda.interaction.request.breaking.BreakManager.canAccept
5555import com.lambda.interaction.request.breaking.BreakManager.checkForCancels
5656import com.lambda.interaction.request.breaking.BreakManager.initNewBreak
57- import com.lambda.interaction.request.breaking.BreakManager.instantBreaks
5857import com.lambda.interaction.request.breaking.BreakManager.maxBreaksThisTick
59- import com.lambda.interaction.request.breaking.BreakManager.performInstantBreaks
60- import com.lambda.interaction.request.breaking.BreakManager.processNewBreaks
58+ import com.lambda.interaction.request.breaking.BreakManager.processNewBreak
6159import com.lambda.interaction.request.breaking.BreakManager.processRequest
6260import com.lambda.interaction.request.breaking.BreakManager.simulateAbandoned
6361import com.lambda.interaction.request.breaking.BreakManager.updateBreakProgress
@@ -154,7 +152,6 @@ object BreakManager : RequestHandler<BreakRequest>(
154152 private var maxBreaksThisTick = 0
155153
156154 private var breaks = mutableListOf<BreakContext >()
157- private var instantBreaks = mutableListOf<BreakContext >()
158155
159156 var lastPosStarted: BlockPos ? = null
160157 set(value) {
@@ -184,7 +181,6 @@ object BreakManager : RequestHandler<BreakRequest>(
184181 }
185182 activeRequest = null
186183 breaks = mutableListOf ()
187- instantBreaks = mutableListOf ()
188184 breaksThisTick = 0
189185 }
190186
@@ -312,37 +308,45 @@ object BreakManager : RequestHandler<BreakRequest>(
312308 * or the player needs to swap to a different hotbar slot.
313309 *
314310 * @see performInstantBreaks
315- * @see processNewBreaks
311+ * @see processNewBreak
316312 * @see updateBreakProgress
317313 */
318314 private fun SafeContext.processRequest (breakRequest : BreakRequest ? ) {
319315 breakRequest?.let { request ->
320316 if (request.fresh) populateFrom(request)
321317 }
322318
323- repeat(2 ) {
324- breakRequest?.let { request ->
325- if (performInstantBreaks(request)) {
326- processNewBreaks(request)
327- }
328- }
319+ var noNew = false
320+ var noProgression = false
321+
322+ while (true ) {
323+ noNew = breakRequest?.let { request ->
324+ ! processNewBreak(request)
325+ } != false
329326
330327 // Reversed so that the breaking order feels natural to the user as the primary break is always the
331328 // last break to be started
332- if (handlePreProcessing()) {
329+ noProgression = if (handlePreProcessing()) {
333330 activeInfos
334- .filter { it.updatedThisTick }
331+ .filter { it.updatedThisTick && it.shouldProgress }
335332 .asReversed()
336- .forEach { info ->
337- if (info.shouldProgress)
338- updateBreakProgress(info)
333+ .run {
334+ if (isEmpty()) {
335+ true
336+ } else {
337+ forEach { info ->
338+ updateBreakProgress(info)
339+ }
340+ false
341+ }
339342 }
340- }
341- }
343+ } else true
342344
343- if (instantBreaks.isEmpty() && breaks.isEmpty()) {
344- activeRequest = null
345+ if (noNew && noProgression) break
345346 }
347+
348+ if (breaks.isEmpty()) activeRequest = null
349+
346350 if (breaksThisTick > 0 || activeInfos.isNotEmpty()) {
347351 activeThisTick = true
348352 }
@@ -383,12 +387,8 @@ object BreakManager : RequestHandler<BreakRequest>(
383387 }
384388 }
385389
386- instantBreaks = newBreaks
387- .filter { it.instantBreak }
388- .toMutableList()
389-
390390 breaks = newBreaks
391- .filter { ! it.instantBreak }
391+ .sortedByDescending { it.instantBreak }
392392 .toMutableList()
393393
394394 val breakConfig = request.config
@@ -450,48 +450,22 @@ object BreakManager : RequestHandler<BreakRequest>(
450450 return true
451451 }
452452
453- /* *
454- * Attempts to break as many [BreakContext]'s as possible from the [instantBreaks] collection within this tick.
455- *
456- * @return false if a break could not be performed.
457- */
458- private fun SafeContext.performInstantBreaks (request : BreakRequest ): Boolean {
459- val iterator = instantBreaks.iterator()
460- while (iterator.hasNext()) {
461- if (breaksThisTick + 1 > maxBreaksThisTick) return false
462-
463- val ctx = iterator.next()
464-
465- if (! canAccept(ctx)) continue
466-
467- val breakInfo = initNewBreak(ctx, request) ? : return false
468- iterator.remove()
469- if (! handlePreProcessing()) return false
470- if (! rotated || tickStage !in request.config.breakStageMask) return false
471-
472- updateBreakProgress(breakInfo)
473- }
474- return true
475- }
476-
477453 /* *
478454 * Attempts to start breaking as many [BreakContext]'s from the [breaks] collection as possible.
479455 *
480456 * @return false if a context cannot be started or the maximum active breaks has been reached.
481457 *
482458 * @see initNewBreak
483459 */
484- private fun SafeContext.processNewBreaks (request : BreakRequest ): Boolean {
485- val iterator = breaks.iterator()
486- while (iterator.hasNext()) {
487- val ctx = iterator.next()
488-
489- if (! canAccept(ctx)) continue
460+ private fun SafeContext.processNewBreak (request : BreakRequest ): Boolean {
461+ breaks.forEach { ctx ->
462+ if (! canAccept(ctx)) return @forEach
490463
491464 initNewBreak(ctx, request) ? : return false
492- iterator.remove()
465+ breaks.remove(ctx)
466+ return true
493467 }
494- return true
468+ return false
495469 }
496470
497471 /* *
0 commit comments