@@ -10,9 +10,11 @@ import org.bukkit.event.inventory.InventoryType
1010import org.bukkit.inventory.InventoryView
1111import org.bukkit.inventory.ItemStack
1212import taboolib.library.reflex.Reflex.Companion.getProperty
13+ import taboolib.library.reflex.Reflex.Companion.invokeMethod
1314import taboolib.library.reflex.Reflex.Companion.setProperty
1415import taboolib.library.reflex.Reflex.Companion.unsafeInstance
1516import taboolib.module.nms.MinecraftVersion
17+ import taboolib.module.nms.nmsClass
1618import taboolib.module.nms.sendPacket
1719import taboolib.platform.util.isAir
1820import trplugins.menu.api.receptacle.vanilla.window.StaticInventory.inventoryView
@@ -24,10 +26,16 @@ import trplugins.menu.api.receptacle.vanilla.window.StaticInventory.staticInvent
2426 */
2527class NMSImpl : NMS () {
2628
27- private val emptyItemStack: net.minecraft.server.v1_16_R3.ItemStack ? = CraftItemStack .asNMSCopy((ItemStack (Material .AIR )))
2829 private val version = MinecraftVersion .majorLegacy
30+ private val isUnobfuscated = MinecraftVersion .isUnobfuscated
2931 private val windowIds = HashMap <String , Int >()
3032
33+ private val emptyItemStack: Any? = if (isUnobfuscated) {
34+ craftItemStackCopy(ItemStack (Material .AIR ))
35+ } else {
36+ CraftItemStack .asNMSCopy(ItemStack (Material .AIR ))
37+ }
38+
3139 private val Player .windowId get() = windowIds[this .name] ? : 119
3240
3341 override fun windowId (player : Player , create : Boolean ): Int {
@@ -44,7 +52,13 @@ class NMSImpl : NMS() {
4452 StaticInventory .close(player)
4553 } else {
4654 windowIds.remove(player.name)
47- player.sendPacket(PacketPlayOutCloseWindow (windowId))
55+ if (isUnobfuscated) {
56+ val packet = nmsClass(" network.protocol.game.ClientboundContainerClosePacket" )
57+ .getDeclaredConstructor(Int ::class .java).newInstance(windowId)
58+ player.sendPacket(packet)
59+ } else {
60+ player.sendPacket(PacketPlayOutCloseWindow (windowId))
61+ }
4862 }
4963 }
5064
@@ -59,6 +73,16 @@ class NMSImpl : NMS() {
5973 inventory.setItem(index, item)
6074 }
6175 }
76+ isUnobfuscated -> {
77+ sendPacket(
78+ player,
79+ nmsClass(" network.protocol.game.ClientboundContainerSetContentPacket" ).unsafeInstance(),
80+ " containerId" to windowId,
81+ " stateId" to 1 ,
82+ " items" to items.map { i -> toNMSCopy(i) }.toList(),
83+ " carriedItem" to emptyItemStack
84+ )
85+ }
6286 version >= 11701 -> {
6387 sendPacket(
6488 player,
@@ -101,6 +125,17 @@ class NMSImpl : NMS() {
101125 player.useStaticInventory() -> {
102126 StaticInventory .open(player, type, title)
103127 }
128+ isUnobfuscated -> {
129+ val menuType = nmsClass(" world.inventory.MenuType" ).getProperty<Any >(type.vanillaId, isStatic = true )
130+ val chatComponent = craftChatMessageComponent(title)
131+ sendPacket(
132+ player,
133+ nmsClass(" network.protocol.game.ClientboundOpenScreenPacket" ).unsafeInstance(),
134+ " containerId" to windowId,
135+ " type" to menuType,
136+ " title" to chatComponent
137+ )
138+ }
104139 version >= 11900 -> {
105140 sendPacket(
106141 player,
@@ -153,6 +188,16 @@ class NMSImpl : NMS() {
153188 }
154189 }
155190 }
191+ isUnobfuscated -> {
192+ sendPacket(
193+ player,
194+ nmsClass(" network.protocol.game.ClientboundContainerSetSlotPacket" ).unsafeInstance(),
195+ " containerId" to windowId,
196+ " stateId" to - 1 ,
197+ " slot" to slot,
198+ " itemStack" to toNMSCopy(itemStack)
199+ )
200+ }
156201 version >= 11701 -> {
157202 sendPacket(
158203 player,
@@ -164,7 +209,7 @@ class NMSImpl : NMS() {
164209 )
165210 }
166211 else -> {
167- player.sendPacket(PacketPlayOutSetSlot (windowId, slot, toNMSCopy(itemStack)))
212+ player.sendPacket(PacketPlayOutSetSlot (windowId, slot, toNMSCopy(itemStack) as ? net.minecraft.server.v1_16_R3. ItemStack ))
168213 }
169214 }
170215 if (version >= 12104 ) {
@@ -186,6 +231,15 @@ class NMSImpl : NMS() {
186231 val property = getInventoryProperty(inventory.type, id) ? : return
187232 view.setProperty(property, value)
188233 }
234+ isUnobfuscated -> {
235+ sendPacket(
236+ player,
237+ nmsClass(" network.protocol.game.ClientboundContainerSetDataPacket" ).unsafeInstance(),
238+ " containerId" to windowId,
239+ " id" to id,
240+ " value" to value
241+ )
242+ }
189243 MinecraftVersion .isUniversal -> {
190244 sendPacket(
191245 player,
@@ -201,8 +255,13 @@ class NMSImpl : NMS() {
201255 }
202256 }
203257
204- override fun toNMSCopy (itemStack : ItemStack ? ): net.minecraft.server.v1_16_R3.ItemStack ? {
205- return if (itemStack.isAir()) emptyItemStack else CraftItemStack .asNMSCopy(itemStack)
258+ override fun toNMSCopy (itemStack : ItemStack ? ): Any? {
259+ if (itemStack.isAir()) return emptyItemStack
260+ return if (isUnobfuscated) {
261+ craftItemStackCopy(itemStack)
262+ } else {
263+ CraftItemStack .asNMSCopy(itemStack)
264+ }
206265 }
207266
208267 private fun sendPacket (player : Player , packet : Any , vararg fields : Pair <String , Any ?>) {
@@ -214,4 +273,16 @@ class NMSImpl : NMS() {
214273 return InventoryView .Property .entries.find { (it.type == type || (it.type == InventoryType .FURNACE && type == InventoryType .BLAST_FURNACE )) && it.id == id }
215274 }
216275
276+ private fun craftItemStackCopy (itemStack : ItemStack ): net.minecraft.world.item.ItemStack ? {
277+ return org.bukkit.craftbukkit.inventory.CraftItemStack .asNMSCopy(itemStack)
278+ }
279+
280+ private fun craftChatMessageComponent (text : String ): Any {
281+ val clazz = Class .forName(" org.bukkit.craftbukkit.util.CraftChatMessage" )
282+ return if (text.startsWith(' {' ) && text.endsWith(' }' )) {
283+ clazz.invokeMethod<Any >(" fromJSON" , text, isStatic = true )!!
284+ } else {
285+ (clazz.invokeMethod<Array <Any >>(" fromString" , text, isStatic = true ))!! [0 ]
286+ }
287+ }
217288}
0 commit comments