Skip to content

Commit 904c16a

Browse files
committed
combine instant breaks and regular breaks for a more cohesive design
1 parent e954706 commit 904c16a

File tree

1 file changed

+32
-58
lines changed

1 file changed

+32
-58
lines changed

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

Lines changed: 32 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,8 @@ import com.lambda.interaction.request.breaking.BreakManager.breaks
5454
import com.lambda.interaction.request.breaking.BreakManager.canAccept
5555
import com.lambda.interaction.request.breaking.BreakManager.checkForCancels
5656
import com.lambda.interaction.request.breaking.BreakManager.initNewBreak
57-
import com.lambda.interaction.request.breaking.BreakManager.instantBreaks
5857
import 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
6159
import com.lambda.interaction.request.breaking.BreakManager.processRequest
6260
import com.lambda.interaction.request.breaking.BreakManager.simulateAbandoned
6361
import 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

Comments
 (0)