@@ -4,9 +4,11 @@ import org.bukkit.entity.Player
44import org.bukkit.inventory.ItemStack
55import taboolib.common.platform.function.submit
66import taboolib.module.chat.component
7+ import taboolib.module.nms.MinecraftVersion
78import taboolib.module.nms.nmsProxy
89import trplugins.menu.api.receptacle.Receptacle
910import trplugins.menu.api.receptacle.ReceptacleInteractEvent
11+ import trplugins.menu.api.receptacle.getViewingReceptacle
1012import trplugins.menu.api.receptacle.setViewingReceptacle
1113
1214/* *
@@ -47,8 +49,9 @@ open class WindowReceptacle(var type: WindowLayout, override var title: String =
4749
4850 override fun setElement (element : ItemStack ? , slot : Int , display : Boolean ) {
4951 contents[slot] = element
50- if (! display || viewer == null ) return
51- nmsProxy<NMS >().sendWindowsSetSlot(viewer!! , slot = slot, itemStack = element, stateId = stateId)
52+ val player = viewer ? : return
53+ if (! display || player.getViewingReceptacle() != this ) return
54+ nmsProxy<NMS >().sendWindowsSetSlot(player, slot = slot, itemStack = element, stateId = stateId)
5255 }
5356
5457 override fun clear (display : Boolean ) {
@@ -59,22 +62,22 @@ open class WindowReceptacle(var type: WindowLayout, override var title: String =
5962 }
6063
6164 override fun refresh (slot : Int ) {
62- if (viewer != null ) {
63- setupPlayerInventorySlots()
64- runCatching {
65- if (slot >= 0 ) {
66- nmsProxy< NMS >().sendWindowsSetSlot(viewer !! , slot = slot, itemStack = contents[slot], stateId = stateId)
67- } else {
68- nmsProxy< NMS >().sendWindowsItems(viewer !! , items = contents)
69- }
65+ val player = viewer ? : return
66+ if (player.getViewingReceptacle() != this ) return
67+ setupPlayerInventorySlots()
68+ runCatching {
69+ if ( slot >= 0 ) {
70+ nmsProxy< NMS >().sendWindowsSetSlot(player, slot = slot, itemStack = contents[slot], stateId = stateId)
71+ } else {
72+ nmsProxy< NMS >().sendWindowsItems(player, items = contents)
7073 }
7174 }
7275 }
7376
7477 override fun open (player : Player ) {
7578 viewer = player
76- initializationPackets()
7779 player.setViewingReceptacle(this )
80+ initializationPackets()
7881 onOpen(player, this )
7982 }
8083
@@ -85,6 +88,7 @@ open class WindowReceptacle(var type: WindowLayout, override var title: String =
8588 }
8689 onClose(viewer!! , this )
8790 viewer!! .setViewingReceptacle(null )
91+ viewer = null
8892 }
8993 }
9094
@@ -98,9 +102,9 @@ open class WindowReceptacle(var type: WindowLayout, override var title: String =
98102 }
99103
100104 override fun property (id : Int , value : Int ) {
101- if (viewer != null ) {
102- nmsProxy< NMS >().sendWindowsUpdateData(viewer !! , id = id, value = value)
103- }
105+ val player = viewer ? : return
106+ if (player.getViewingReceptacle() != this ) return
107+ nmsProxy< NMS >().sendWindowsUpdateData(player, id = id, value = value)
104108 }
105109
106110 override fun callEventClick (event : ReceptacleInteractEvent <ItemStack >) {
@@ -112,7 +116,10 @@ open class WindowReceptacle(var type: WindowLayout, override var title: String =
112116 private fun initializationPackets () {
113117 if (viewer != null ) {
114118 nmsProxy<NMS >().sendWindowsOpen(viewer!! , title = title, type = type)
115- nmsProxy<NMS >().sendWindowsSetSlot(viewer!! , windowId = 0 , slot = 45 )
119+ if (MinecraftVersion .majorLegacy < 12111 ) {
120+ // 1.21.11+ can crash on offhand slot update during menu switch
121+ nmsProxy<NMS >().sendWindowsSetSlot(viewer!! , windowId = 0 , slot = 45 )
122+ }
116123 refresh()
117124 }
118125 }
0 commit comments