Skip to content

Commit a0366a4

Browse files
committed
Explicit screen checks and better transaction syncing
1 parent 2536c07 commit a0366a4

File tree

10 files changed

+37
-34
lines changed

10 files changed

+37
-34
lines changed

common/src/main/kotlin/com/lambda/interaction/material/container/containers/CreativeContainer.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ data object CreativeContainer : MaterialContainer(Rank.CREATIVE) {
4949
throw NotInCreativeModeException()
5050
}
5151

52-
TransactionExecutor.transfer {
52+
TransactionExecutor.transfer(player.currentScreenHandler) {
5353
player.currentScreenHandler?.slots?.let { slots ->
5454
selection.filterSlots(slots).forEach {
5555
clickCreativeStack(ItemStack.EMPTY, it.id)
@@ -75,7 +75,7 @@ data object CreativeContainer : MaterialContainer(Rank.CREATIVE) {
7575
throw NotInCreativeModeException()
7676
}
7777

78-
TransactionExecutor.transfer {
78+
TransactionExecutor.transfer(player.currentScreenHandler) {
7979
clickCreativeStack(optimalStack, 36 + player.inventory.selectedSlot)
8080
}.finally {
8181
success()

common/src/main/kotlin/com/lambda/interaction/material/container/containers/MainHandContainer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ object MainHandContainer : MaterialContainer(Rank.MAIN_HAND) {
5454
return
5555
}
5656

57-
transfer {
57+
transfer(player.currentScreenHandler) {
5858
val stackInOffHand = moveStack.equal(player.offHandStack)
5959
if (hand == Hand.MAIN_HAND && stackInOffHand) {
6060
swapHands()

common/src/main/kotlin/com/lambda/interaction/material/transfer/SlotTransfer.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class SlotTransfer @Ta5kBuilder constructor(
7171
val nextFrom = selectedFrom.firstOrNull() ?: return@listen
7272
val nextTo = selectedTo.firstOrNull() ?: return@listen
7373

74-
transfer {
74+
transfer(screen) {
7575
// moveSlot(nextFrom.id, nextTo.id)
7676
swap(nextTo.id, 1)
7777
swap(nextFrom.id, 1)

common/src/main/kotlin/com/lambda/interaction/material/transfer/TransactionExecutor.kt

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,24 +17,21 @@
1717

1818
package com.lambda.interaction.material.transfer
1919

20-
import com.lambda.context.SafeContext
2120
import com.lambda.event.events.TickEvent
2221
import com.lambda.event.listener.SafeListener.Companion.listen
2322
import com.lambda.interaction.material.transfer.transaction.*
2423
import com.lambda.task.Task
2524
import net.minecraft.item.ItemStack
25+
import net.minecraft.screen.ScreenHandler
2626
import net.minecraft.screen.slot.SlotActionType
2727

2828
class TransactionExecutor @Ta5kBuilder constructor(
29+
private val screenHandler: ScreenHandler,
2930
private val transactions: MutableList<InventoryTransaction> = mutableListOf(),
3031
) : Task<InventoryChanges>() {
3132
override val name: String get() = "Execution of ${transactions.size} transactions left"
3233

33-
private lateinit var changes: InventoryChanges
34-
35-
override fun SafeContext.onStart() {
36-
changes = InventoryChanges(player.currentScreenHandler.slots)
37-
}
34+
private var changes = InventoryChanges(screenHandler.slots)
3835

3936
init {
4037
listen<TickEvent.Pre> {
@@ -43,6 +40,11 @@ class TransactionExecutor @Ta5kBuilder constructor(
4340
return@listen
4441
}
4542

43+
if (player.currentScreenHandler != screenHandler) {
44+
failure("Screen handler was closed")
45+
return@listen
46+
}
47+
4648
transactions.removeFirstOrNull()?.finally { change ->
4749
changes merge change
4850
}?.execute(this@TransactionExecutor)
@@ -140,8 +142,8 @@ class TransactionExecutor @Ta5kBuilder constructor(
140142

141143
companion object {
142144
@InvTransfer
143-
fun transfer(block: TransactionExecutor.() -> Unit) =
144-
TransactionExecutor().apply {
145+
fun transfer(screenHandler: ScreenHandler, block: TransactionExecutor.() -> Unit) =
146+
TransactionExecutor(screenHandler).apply {
145147
block(this)
146148
}
147149
}

common/src/main/kotlin/com/lambda/interaction/material/transfer/transaction/ClickSlotTransaction.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,12 @@ class ClickSlotTransaction @Ta5kBuilder constructor(
3232

3333
init {
3434
listen<TickEvent.Pre> {
35-
clickSlot(slotId, button, actionType)
35+
try {
36+
clickSlot(slotId, button, actionType)
37+
} catch (e: Exception) {
38+
failure(e.message ?: "Unknown error")
39+
return@listen
40+
}
3641
finish()
3742
}
3843
}

common/src/main/kotlin/com/lambda/interaction/material/transfer/transaction/DropItemInHandTransaction.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,8 @@
1717

1818
package com.lambda.interaction.material.transfer.transaction
1919

20-
import com.lambda.context.SafeContext
2120
import com.lambda.event.events.TickEvent
2221
import com.lambda.event.listener.SafeListener.Companion.listen
23-
import com.lambda.interaction.material.transfer.InventoryChanges
2422
import com.lambda.interaction.material.transfer.InventoryTransaction
2523
import net.minecraft.util.Hand
2624

@@ -29,12 +27,12 @@ class DropItemInHandTransaction @Ta5kBuilder constructor(
2927
) : InventoryTransaction() {
3028
override val name: String get() = "Dropping ${if (entireStack) "stack" else "item"} in hand"
3129

32-
override fun SafeContext.onStart() {
33-
changes = InventoryChanges(player.currentScreenHandler.slots)
34-
if (!player.isSpectator && player.dropSelectedItem(entireStack)) {
35-
player.swingHand(Hand.MAIN_HAND)
30+
init {
31+
listen<TickEvent.Pre> {
32+
if (!player.isSpectator && player.dropSelectedItem(entireStack)) {
33+
player.swingHand(Hand.MAIN_HAND)
34+
}
35+
finish()
3636
}
37-
changes.detectChanges()
38-
success(changes)
3937
}
4038
}

common/src/main/kotlin/com/lambda/interaction/material/transfer/transaction/PickFromInventoryTransaction.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,8 @@ class PickFromInventoryTransaction @Ta5kBuilder constructor(
3636
confirming = true
3737
}
3838

39-
listen<InventoryEvent.HotbarSlot.Update> {
40-
// ToDo: Check slot
39+
listen<InventoryEvent.SlotUpdate> {
40+
if (it.slot != slot) return@listen
4141
finish()
4242
}
4343
}

common/src/main/kotlin/com/lambda/interaction/material/transfer/transaction/SwapHandsTransaction.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,9 @@ class SwapHandsTransaction @Ta5kBuilder constructor() : InventoryTransaction() {
4545
confirming = true
4646
}
4747

48-
listen<InventoryEvent.SlotUpdate> {
49-
// ToDo: Check slot
50-
if (confirming) finish()
48+
listen<InventoryEvent.HotbarSlot.Sync> {
49+
if (it.slot != player.inventory.selectedSlot) return@listen
50+
finish()
5151
}
5252
}
5353
}

common/src/main/kotlin/com/lambda/interaction/material/transfer/transaction/SwapHotbarSlotTransaction.kt

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,21 +17,19 @@
1717

1818
package com.lambda.interaction.material.transfer.transaction
1919

20-
import com.lambda.context.SafeContext
2120
import com.lambda.event.events.TickEvent
2221
import com.lambda.event.listener.SafeListener.Companion.listen
23-
import com.lambda.interaction.material.transfer.InventoryChanges
2422
import com.lambda.interaction.material.transfer.InventoryTransaction
2523

2624
class SwapHotbarSlotTransaction @Ta5kBuilder constructor(
2725
val slot: Int,
2826
) : InventoryTransaction() {
2927
override val name: String get() = "Selecting slot #$slot"
3028

31-
override fun SafeContext.onStart() {
32-
changes = InventoryChanges(player.currentScreenHandler.slots)
33-
player.inventory.selectedSlot = slot
34-
changes.detectChanges()
35-
success(changes)
29+
init {
30+
listen<TickEvent.Pre> {
31+
player.inventory.selectedSlot = slot
32+
finish()
33+
}
3634
}
3735
}

common/src/main/kotlin/com/lambda/task/tasks/BuildTask.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ class BuildTask @Ta5kBuilder constructor(
115115
failure("No item in inventory to throw but inventory is full and cant pick up item drop")
116116
return@listen
117117
}
118-
transfer {
118+
transfer(player.currentScreenHandler) {
119119
throwStack(stackToThrow.id)
120120
}.execute(this@BuildTask)
121121
return@listen

0 commit comments

Comments
 (0)