1717
1818package com.lambda.interaction.request.inventory
1919
20- import com.lambda.context.AutomatedSafeContext
2120import com.lambda.config.AutomationConfig.Companion.DEFAULT
21+ import com.lambda.context.AutomatedSafeContext
2222import com.lambda.context.SafeContext
2323import com.lambda.event.EventFlow.post
24+ import com.lambda.event.events.PacketEvent
2425import com.lambda.event.events.TickEvent
2526import com.lambda.event.events.UpdateManagerEvent
2627import com.lambda.event.listener.SafeListener.Companion.listen
@@ -38,6 +39,7 @@ import com.lambda.util.item.ItemStackUtils.equal
3839import com.llamalad7.mixinextras.injector.wrapoperation.Operation
3940import net.minecraft.client.gui.screen.ingame.CreativeInventoryScreen
4041import net.minecraft.item.ItemStack
42+ import net.minecraft.network.packet.c2s.play.CloseHandledScreenC2SPacket
4143import net.minecraft.network.packet.s2c.play.InventoryS2CPacket
4244import net.minecraft.network.packet.s2c.play.ScreenHandlerSlotUpdateS2CPacket
4345import net.minecraft.screen.PlayerScreenHandler
@@ -60,14 +62,16 @@ object InventoryManager : RequestHandler<InventoryRequest>(
6062 private var actions = mutableListOf<InventoryAction >()
6163
6264 private var slots = listOf<ItemStack >()
63- private var alteredSlots = LimitedDecayQueue <Pair < Int , Pair < ItemStack , ItemStack >> >(
65+ private var alteredSlots = LimitedDecayQueue <InventoryChange >(
6466 Int .MAX_VALUE , DEFAULT .desyncTimeout * 50L
6567 )
6668
6769 private var screenHandler: ScreenHandler ? = null
6870 set(value) {
69- if (value != null && field?.syncId != value.syncId)
71+ if (value != null && field?.syncId != value.syncId) {
72+ alteredSlots.clear()
7073 slots = getStacks(value.slots)
74+ }
7175 field = value
7276 }
7377
@@ -92,6 +96,14 @@ object InventoryManager : RequestHandler<InventoryRequest>(
9296 actions = mutableListOf ()
9397 }
9498
99+ listen<PacketEvent .Send .Pre > { event ->
100+ if (event.packet is CloseHandledScreenC2SPacket &&
101+ event.packet.syncId != player.currentScreenHandler.syncId
102+ ) {
103+ screenHandler = player.playerScreenHandler
104+ }
105+ }
106+
95107 return " Loaded Inventory Manager"
96108 }
97109
@@ -136,7 +148,6 @@ object InventoryManager : RequestHandler<InventoryRequest>(
136148 activeRequest?.let { active ->
137149 PlaceManager .logger.debug(" Processing request" , active)
138150 if (tickStage !in active.inventoryConfig.tickStageMask && active.nowOrNothing) return
139- screenHandler = player.currentScreenHandler
140151 val iterator = actions.iterator()
141152 while (iterator.hasNext()) {
142153 val action = iterator.next()
@@ -169,7 +180,7 @@ object InventoryManager : RequestHandler<InventoryRequest>(
169180 if (player.currentScreenHandler.syncId != screenHandler?.syncId) return
170181 val changes = screenHandler?.slots
171182 ?.filter { ! it.stack.equal(slots[it.id]) }
172- ?.map { Pair (it.id, Pair ( slots[it.id], it.stack.copy() )) }
183+ ?.map { InventoryChange (it.id, slots[it.id], it.stack.copy()) }
173184 ? : emptyList()
174185 alteredSlots.addAll(changes)
175186 slots = getStacks(player.currentScreenHandler.slots)
@@ -189,7 +200,6 @@ object InventoryManager : RequestHandler<InventoryRequest>(
189200 original.call(packet)
190201 return
191202 }
192- screenHandler = player.currentScreenHandler
193203 val packetScreenHandler =
194204 when (packet.syncId) {
195205 0 -> player.playerScreenHandler
@@ -199,7 +209,7 @@ object InventoryManager : RequestHandler<InventoryRequest>(
199209 val alteredContents = mutableListOf<ItemStack >()
200210 packet.contents.forEachIndexed { index, incomingStack ->
201211 val matches = alteredSlots.removeIf { cached ->
202- incomingStack.equal(cached.second.second )
212+ incomingStack.equal(cached.after )
203213 }
204214 if (matches) alteredContents.add(packetScreenHandler.slots[index].stack)
205215 else alteredContents.add(incomingStack)
@@ -218,7 +228,6 @@ object InventoryManager : RequestHandler<InventoryRequest>(
218228 @JvmStatic
219229 fun onSlotUpdate (packet : ScreenHandlerSlotUpdateS2CPacket , original : Operation <Void >) {
220230 runSafe {
221- screenHandler = player.currentScreenHandler
222231 if (! mc.isOnThread || ! DEFAULT .avoidDesync) {
223232 original.call(packet)
224233 return
@@ -231,7 +240,7 @@ object InventoryManager : RequestHandler<InventoryRequest>(
231240 } ? : false
232241
233242 val matches = alteredSlots.removeIf {
234- it.first == packet.slot && it.second.second .equal(itemStack)
243+ it.syncId == packet.slot && it.after .equal(itemStack)
235244 }
236245
237246 if (packet.syncId == 0 ) {
@@ -255,5 +264,16 @@ object InventoryManager : RequestHandler<InventoryRequest>(
255264 original.call(packet)
256265 }
257266
267+ @JvmStatic
268+ fun onSetScreenHandler (screenHandler : ScreenHandler ) {
269+ this .screenHandler = screenHandler
270+ }
271+
272+ private data class InventoryChange (
273+ val syncId : Int ,
274+ val before : ItemStack ,
275+ val after : ItemStack
276+ )
277+
258278 override fun preEvent () = UpdateManagerEvent .Inventory .post()
259279}
0 commit comments