Try fixing window items packet on 1.17.1 and 1.18
This commit is contained in:
1 parent
935c9782a1
commit
d5c2619bb3
1 file changed
+62
-14
+62
-14
@@ -23,7 +23,6 @@ import io.github.retrooper.packetevents.packetwrappers.NMSPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.WrappedPacket;
|
||||
import io.github.retrooper.packetevents.packetwrappers.api.SendableWrapper;
|
||||
import io.github.retrooper.packetevents.utils.nms.NMSUtils;
|
||||
import io.github.retrooper.packetevents.utils.reflection.Reflection;
|
||||
import io.github.retrooper.packetevents.utils.server.ServerVersion;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
|
||||
@@ -31,6 +30,8 @@ import java.lang.reflect.Constructor;
|
||||
import java.lang.reflect.InvocationTargetException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Optional;
|
||||
|
||||
//TODO Test wrapper
|
||||
public class WrappedPacketOutWindowItems extends WrappedPacket implements SendableWrapper {
|
||||
private static boolean v_1_17, v_1_17_1;
|
||||
@@ -38,15 +39,19 @@ public class WrappedPacketOutWindowItems extends WrappedPacket implements Sendab
|
||||
private static Class<?> nonNullListClass;
|
||||
private static Constructor<?> packetConstructor;
|
||||
private int windowID;
|
||||
private int stateID;
|
||||
private List<ItemStack> slotData;
|
||||
private ItemStack heldItem;
|
||||
|
||||
public WrappedPacketOutWindowItems(NMSPacket packet) {
|
||||
super(packet);
|
||||
}
|
||||
|
||||
public WrappedPacketOutWindowItems(int windowID, List<ItemStack> slots) {
|
||||
public WrappedPacketOutWindowItems(int windowID, int stateID, List<ItemStack> slots, ItemStack heldItem) {
|
||||
this.windowID = windowID;
|
||||
this.stateID = stateID;
|
||||
this.slotData = slots;
|
||||
this.heldItem = heldItem;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -60,15 +65,14 @@ public class WrappedPacketOutWindowItems extends WrappedPacket implements Sendab
|
||||
Constructor<?> nonNullListConstructor = nonNullListClass.getDeclaredConstructors()[0];
|
||||
nonNullListConstructor.setAccessible(true);
|
||||
nonNullListInstance = nonNullListConstructor.newInstance(new ArrayList<>(), null);
|
||||
}
|
||||
else {
|
||||
packetConstructor = PacketTypeClasses.Play.Server.WINDOW_ITEMS.getConstructor(int.class, int.class, nonNullListClass, NMSUtils.nmsItemStackClass);
|
||||
} else {
|
||||
Constructor<?> nonNullListConstructor = nonNullListClass.getDeclaredConstructor();
|
||||
nonNullListConstructor.setAccessible(true);
|
||||
nonNullListInstance = nonNullListConstructor.newInstance();
|
||||
packetConstructor = PacketTypeClasses.Play.Server.WINDOW_ITEMS.getConstructor(int.class, nonNullListClass);
|
||||
}
|
||||
packetConstructor = PacketTypeClasses.Play.Server.WINDOW_ITEMS.getConstructor(int.class, nonNullListClass);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
packetConstructor = PacketTypeClasses.Play.Server.WINDOW_ITEMS.getConstructor();
|
||||
}
|
||||
} catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException | InstantiationException e) {
|
||||
@@ -92,6 +96,22 @@ public class WrappedPacketOutWindowItems extends WrappedPacket implements Sendab
|
||||
}
|
||||
}
|
||||
|
||||
public int getStateId() {
|
||||
if (packet != null) {
|
||||
return readInt(1);
|
||||
} else {
|
||||
return stateID;
|
||||
}
|
||||
}
|
||||
|
||||
public void setStateId(int stateID) {
|
||||
if (packet != null) {
|
||||
writeInt(1, stateID);
|
||||
} else {
|
||||
this.stateID = stateID;
|
||||
}
|
||||
}
|
||||
|
||||
public List<ItemStack> getSlots() {
|
||||
if (packet != null) {
|
||||
List<ItemStack> slots = new ArrayList<>();
|
||||
@@ -107,8 +127,7 @@ public class WrappedPacketOutWindowItems extends WrappedPacket implements Sendab
|
||||
}
|
||||
}
|
||||
return slots;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
return slotData;
|
||||
}
|
||||
}
|
||||
@@ -128,21 +147,50 @@ public class WrappedPacketOutWindowItems extends WrappedPacket implements Sendab
|
||||
}
|
||||
writeAnyObject(1, nmsItemStacks);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.slotData = slots;
|
||||
}
|
||||
}
|
||||
|
||||
public Optional<ItemStack> getHeldItem() {
|
||||
if (!v_1_17_1) return Optional.empty();
|
||||
|
||||
if (packet != null) {
|
||||
return Optional.ofNullable(NMSUtils.toBukkitItemStack(readObject(0, NMSUtils.nmsItemStackClass)));
|
||||
} else {
|
||||
return Optional.of(heldItem);
|
||||
}
|
||||
}
|
||||
|
||||
public void setHeldItem(ItemStack heldItem) {
|
||||
if (packet != null) {
|
||||
writeObject(0, NMSUtils.toNMSItemStack(heldItem));
|
||||
} else {
|
||||
this.heldItem = heldItem;
|
||||
}
|
||||
}
|
||||
|
||||
private Object getNMSItemHeld() {
|
||||
if (packet != null) {
|
||||
return readObject(0, NMSUtils.nmsItemStackClass);
|
||||
} else {
|
||||
return NMSUtils.toNMSItemStack(heldItem);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object asNMSPacket() throws Exception {
|
||||
Object packetInstance;
|
||||
if (v_1_17) {
|
||||
|
||||
if (v_1_17_1) {
|
||||
packetInstance = packetConstructor.newInstance(getWindowId(), stateID, nonNullListInstance, getNMSItemHeld());
|
||||
WrappedPacketOutWindowItems wrappedPacketOutWindowItems = new WrappedPacketOutWindowItems(new NMSPacket(packetInstance));
|
||||
wrappedPacketOutWindowItems.setSlots(getSlots());
|
||||
} else if (v_1_17) {
|
||||
packetInstance = packetConstructor.newInstance(getWindowId(), nonNullListInstance);
|
||||
WrappedPacketOutWindowItems wrappedPacketOutWindowItems = new WrappedPacketOutWindowItems(new NMSPacket(packetInstance));
|
||||
wrappedPacketOutWindowItems.setSlots(getSlots());
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
packetInstance = packetConstructor.newInstance();
|
||||
WrappedPacketOutWindowItems wrappedPacketOutWindowItems = new WrappedPacketOutWindowItems(new NMSPacket(packetInstance));
|
||||
wrappedPacketOutWindowItems.setWindowId(getWindowId());
|
||||
|
||||
Reference in new issue
Block a user