Skip to content

Commit 0ecb949

Browse files
committed
check all other position blocking managers when accepting action requests
1 parent bc54d80 commit 0ecb949

File tree

4 files changed

+17
-13
lines changed

4 files changed

+17
-13
lines changed

common/src/main/kotlin/com/lambda/interaction/request/ManagerUtils.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,13 @@
1818
package com.lambda.interaction.request
1919

2020
import com.lambda.util.reflections.getInstances
21+
import net.minecraft.util.math.BlockPos
2122

2223
object ManagerUtils {
2324
val managers = getInstances<RequestHandler<*>>()
2425
val accumulatedManagerPriority = managers.map { it.stagePriority }.reduce { acc, priority -> acc + priority }
26+
val positionBlockingManagers = getInstances<PositionBlocking>()
27+
28+
fun isPosBlocked(pos: BlockPos) =
29+
positionBlockingManagers.any { manager -> manager.blockedPositions.any { blocked -> blocked == pos } }
2530
}

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ import com.lambda.event.listener.UnsafeListener.Companion.listenUnsafe
3131
import com.lambda.graphics.renderer.esp.builders.buildFilled
3232
import com.lambda.graphics.renderer.esp.builders.buildOutline
3333
import com.lambda.interaction.construction.context.BreakContext
34+
import com.lambda.interaction.request.ManagerUtils.isPosBlocked
3435
import com.lambda.interaction.request.PositionBlocking
3536
import com.lambda.interaction.request.Priority
3637
import com.lambda.interaction.request.RequestHandler
@@ -352,7 +353,7 @@ object BreakManager : RequestHandler<BreakRequest>(
352353
* @return if the break context can be accepted.
353354
*/
354355
private fun SafeContext.canAccept(ctx: BreakContext, breakConfig: BreakConfig): Boolean {
355-
if (pendingBreaks.any { it.context.blockPos == ctx.blockPos }) return false
356+
if (isPosBlocked(ctx.blockPos)) return false
356357

357358
if (breakConfig.doubleBreak) {
358359
breakInfos

common/src/main/kotlin/com/lambda/interaction/request/interacting/InteractionManager.kt

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import com.lambda.event.events.TickEvent
2525
import com.lambda.event.events.UpdateManagerEvent
2626
import com.lambda.event.listener.SafeListener.Companion.listen
2727
import com.lambda.interaction.construction.context.InteractionContext
28+
import com.lambda.interaction.request.ManagerUtils.isPosBlocked
29+
import com.lambda.interaction.request.PositionBlocking
2830
import com.lambda.interaction.request.RequestHandler
2931
import com.lambda.interaction.request.breaking.BreakManager
3032
import com.lambda.interaction.request.interacting.InteractedBlockHandler.addPendingInteract
@@ -44,13 +46,16 @@ object InteractionManager : RequestHandler<InteractionRequest>(
4446
TickEvent.Input.Post,
4547
TickEvent.Player.Post,
4648
onOpen = { activeRequest?.let { processRequest(it) } }
47-
) {
49+
), PositionBlocking {
4850
private var activeRequest: InteractionRequest? = null
4951
private var potentialInteractions = mutableListOf<InteractionContext>()
5052

5153
private var interactionsThisTick = 0
5254
private var maxInteractionsThisTick = 0
5355

56+
override val blockedPositions
57+
get() = pendingInteractions.map { it.context.blockPos }
58+
5459
init {
5560
listen<TickEvent.Post>(priority = Int.MIN_VALUE) {
5661
activeRequest = null
@@ -107,7 +112,7 @@ object InteractionManager : RequestHandler<InteractionRequest>(
107112
private fun populateFrom(request: InteractionRequest) {
108113
setPendingConfigs(request)
109114
potentialInteractions = request.contexts
110-
.filter { pendingInteractions.none { pending -> pending.context.blockPos == it.blockPos } }
115+
.filter { !isPosBlocked(it.blockPos) }
111116
.toMutableList()
112117

113118
val pendingLimit = (request.build.maxPendingInteractions - pendingPlacements.size).coerceAtLeast(0)

common/src/main/kotlin/com/lambda/interaction/request/placing/PlaceManager.kt

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import com.lambda.event.events.TickEvent
2525
import com.lambda.event.events.UpdateManagerEvent
2626
import com.lambda.event.listener.SafeListener.Companion.listen
2727
import com.lambda.interaction.construction.context.PlaceContext
28+
import com.lambda.interaction.request.ManagerUtils.isPosBlocked
2829
import com.lambda.interaction.request.PositionBlocking
2930
import com.lambda.interaction.request.Priority
3031
import com.lambda.interaction.request.RequestHandler
@@ -156,28 +157,20 @@ object PlaceManager : RequestHandler<PlaceRequest>(
156157
* Filters the [request]'s [PlaceContext]s, placing them into the [potentialPlacements] collection, and
157158
* setting the maxPlacementsThisTick value.
158159
*
159-
* @see canPlace
160+
* @see isPosBlocked
160161
*/
161162
private fun populateFrom(request: PlaceRequest) {
162163
val place = request.build.placing
163164

164165
setPendingConfigs(request)
165166
potentialPlacements = request.contexts
166-
.filter { canPlace(it) }
167+
.filter { !isPosBlocked(it.blockPos) }
167168
.toMutableList()
168169

169170
val pendingLimit = (place.maxPendingPlacements - pendingPlacements.size).coerceAtLeast(0)
170171
maxPlacementsThisTick = (place.placementsPerTick.coerceAtMost(pendingLimit))
171172
}
172173

173-
/**
174-
* @return if none of the [pendingPlacements] match positions with the [placeContext]
175-
*/
176-
private fun canPlace(placeContext: PlaceContext) =
177-
pendingPlacements.none { pending ->
178-
pending.context.blockPos == placeContext.blockPos
179-
}
180-
181174
/**
182175
* A modified version of the minecraft interactBlock method, renamed to better suit its usage.
183176
*

0 commit comments

Comments
 (0)