From ce219e208c8fcf1e8fe69c27974975b6abcb5328 Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Sun, 24 Sep 2017 21:17:07 +0300 Subject: [PATCH 1/6] Check the right type --- .../src/main/java/us/myles/ViaVersion/api/PacketWrapper.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java index 6182d5d92..6421495e8 100644 --- a/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java +++ b/common/src/main/java/us/myles/ViaVersion/api/PacketWrapper.java @@ -149,10 +149,11 @@ public class PacketWrapper { } } else { Pair read = readableObjects.poll(); - if (read.getKey().equals(type) || (type.getBaseClass().equals(read.getKey().getBaseClass()) && type.getOutputClass().equals(read.getKey().getOutputClass()))) { + Type rtype = read.getKey(); + if (rtype.equals(type) || (type.getBaseClass().equals(rtype.getBaseClass()) && type.getOutputClass().equals(rtype.getOutputClass()))) { return (T) read.getValue(); } else { - if (type == Type.NOTHING) { + if (rtype == Type.NOTHING) { return read(type); // retry } else { Exception e = new IOException("Unable to read type " + type.getTypeName() + ", found " + read.getKey().getTypeName()); From 343e316e4c7386ce7d0b1402a2bf88dd2289b7bb Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Sun, 24 Sep 2017 21:35:38 +0300 Subject: [PATCH 2/6] Make InvContainerItemProvider --- .../ViaVersion/bukkit/platform/BukkitViaLoader.java | 5 +++++ .../providers/BukkitInvContainerItemProvider.java | 13 +++++++++++++ .../protocol1_12to1_11_1/Protocol1_12To1_11_1.java | 7 +++++++ .../providers/InvContainerItemProvider.java | 11 +++++++++++ 4 files changed, 36 insertions(+) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java index 49bf0aa91..3d2a53084 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/platform/BukkitViaLoader.java @@ -1,10 +1,12 @@ package us.myles.ViaVersion.bukkit.platform; import lombok.AllArgsConstructor; + import org.bukkit.Bukkit; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerQuitEvent; + import us.myles.ViaVersion.ViaVersionPlugin; import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.data.UserConnection; @@ -12,9 +14,11 @@ import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.platform.ViaPlatformLoader; import us.myles.ViaVersion.bukkit.listeners.UpdateListener; import us.myles.ViaVersion.bukkit.listeners.protocol1_9to1_8.*; +import us.myles.ViaVersion.bukkit.providers.BukkitInvContainerItemProvider; import us.myles.ViaVersion.bukkit.providers.BukkitViaBulkChunkTranslator; import us.myles.ViaVersion.bukkit.providers.BukkitViaMovementTransmitter; import us.myles.ViaVersion.protocols.base.ProtocolInfo; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.BulkChunkTranslatorProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.HandItemProvider; import us.myles.ViaVersion.protocols.protocol1_9to1_8.providers.MovementTransmitterProvider; @@ -60,6 +64,7 @@ public class BukkitViaLoader implements ViaPlatformLoader { /* Providers */ Via.getManager().getProviders().use(BulkChunkTranslatorProvider.class, new BukkitViaBulkChunkTranslator()); Via.getManager().getProviders().use(MovementTransmitterProvider.class, new BukkitViaMovementTransmitter()); + Via.getManager().getProviders().use(InvContainerItemProvider.class, new BukkitInvContainerItemProvider()); Via.getManager().getProviders().use(HandItemProvider.class, new HandItemProvider() { @Override public Item getHandItem(final UserConnection info) { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java new file mode 100644 index 000000000..99c8fa8df --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java @@ -0,0 +1,13 @@ +package us.myles.ViaVersion.bukkit.providers; + +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; + +public class BukkitInvContainerItemProvider extends InvContainerItemProvider { + + @Override + public boolean registerInvClickPacket(int windowId, short slotId, byte button, short amumber, int mode, UserConnection uconnection) { + // TODO: lets add some stuff here :) + return true; + } +} \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java index f153ea234..49d5cb373 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/Protocol1_12To1_11_1.java @@ -12,6 +12,7 @@ import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_12Types; import us.myles.ViaVersion.api.minecraft.chunks.Chunk; import us.myles.ViaVersion.api.minecraft.chunks.ChunkSection; +import us.myles.ViaVersion.api.platform.providers.ViaProviders; import us.myles.ViaVersion.api.protocol.Protocol; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -19,6 +20,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.api.type.types.version.Types1_12; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.packets.InventoryPackets; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.EntityTracker; import us.myles.ViaVersion.protocols.protocol1_9_1_2to1_9_3_4.types.Chunk1_9_3_4Type; import us.myles.ViaVersion.protocols.protocol1_9_3to1_9_1_2.storage.ClientWorld; @@ -384,6 +386,11 @@ public class Protocol1_12To1_11_1 extends Protocol { newId += 3; return newId; } + + @Override + protected void register(ViaProviders providers) { + providers.register(InvContainerItemProvider.class, new InvContainerItemProvider()); + } @Override public void init(UserConnection userConnection) { diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java new file mode 100644 index 000000000..5455906cb --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java @@ -0,0 +1,11 @@ +package us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers; + +import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.platform.providers.Provider; + +public class InvContainerItemProvider implements Provider { + + public boolean registerInvClickPacket(int windowId, short slotId, byte button, short amumber, int mode, UserConnection uconnection) { + return false; // not supported :/ plays very sad violin + } +} \ No newline at end of file From b2669129f28607cf6d4b985f73ae27c0effa849e Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Sun, 24 Sep 2017 22:11:54 +0300 Subject: [PATCH 3/6] More work on the inv provider --- .../BukkitInvContainerItemProvider.java | 6 ++++-- .../packets/InventoryPackets.java | 19 ++++++++++++++++++- .../providers/InvContainerItemProvider.java | 2 +- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java index 99c8fa8df..3b11a50e5 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java @@ -6,8 +6,10 @@ import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainer public class BukkitInvContainerItemProvider extends InvContainerItemProvider { @Override - public boolean registerInvClickPacket(int windowId, short slotId, byte button, short amumber, int mode, UserConnection uconnection) { + public boolean registerInvClickPacket(short windowId, short slotId, short anumber, UserConnection uconnection) { // TODO: lets add some stuff here :) - return true; + //http://wiki.vg/index.php?title=Protocol&oldid=13223#Click_Window + System.out.println("QUICK ACTION windowId: " + windowId + " slotId: " + slotId + " button: " + 0 + " anumber: " + anumber + " mode: " + 1); + return false; // change to true once supported } } \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/packets/InventoryPackets.java index d59b713a2..743d52d0f 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/packets/InventoryPackets.java @@ -1,6 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_12to1_11_1.packets; import us.myles.ViaVersion.api.PacketWrapper; +import us.myles.ViaVersion.api.Via; import us.myles.ViaVersion.api.minecraft.item.Item; import us.myles.ViaVersion.api.remapper.PacketHandler; import us.myles.ViaVersion.api.remapper.PacketRemapper; @@ -8,6 +9,7 @@ import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.BedRewriter; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.Protocol1_12To1_11_1; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; public class InventoryPackets { public static void register(Protocol1_12To1_11_1 protocol) { @@ -118,8 +120,23 @@ public class InventoryPackets { handler(new PacketHandler() { @Override public void handle(PacketWrapper wrapper) throws Exception { + byte button = wrapper.get(Type.BYTE, 0); + int mode = wrapper.get(Type.VAR_INT, 0); Item item = wrapper.get(Type.ITEM, 0); - BedRewriter.toServerItem(item); + // QUICK_MOVE PATCH (Shift + (click/double click)) + if (mode == 1 && button == 0 && item == null) { + short windowId = wrapper.get(Type.UNSIGNED_BYTE, 0); + short slotId = wrapper.get(Type.SHORT, 0); + short anumber = wrapper.get(Type.SHORT, 1); + InvContainerItemProvider provider = Via.getManager().getProviders().get(InvContainerItemProvider.class); + boolean succeed = provider.registerInvClickPacket(windowId, slotId, anumber, wrapper.user()); + if (succeed) { + wrapper.cancel(); + } + // otherwise just pass through so the server sends the PacketPlayOutTransaction packet. + } else { + BedRewriter.toServerItem(item); + } } }); } diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java index 5455906cb..e928136ea 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/providers/InvContainerItemProvider.java @@ -5,7 +5,7 @@ import us.myles.ViaVersion.api.platform.providers.Provider; public class InvContainerItemProvider implements Provider { - public boolean registerInvClickPacket(int windowId, short slotId, byte button, short amumber, int mode, UserConnection uconnection) { + public boolean registerInvClickPacket(short windowId, short slotId, short anumber, UserConnection uconnection) { return false; // not supported :/ plays very sad violin } } \ No newline at end of file From 976c418c9effd6f08691af7aa95cf8eba60ffdbd Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Mon, 25 Sep 2017 16:13:56 +0300 Subject: [PATCH 4/6] Start implementing inv update task --- .../BukkitInvContainerUpdateTask.java | 22 +++++++++++++++++++ .../BukkitInvContainerItemProvider.java | 17 ++++++++++++-- .../storage/InvItemStorage.java | 13 +++++++++++ 3 files changed, 50 insertions(+), 2 deletions(-) create mode 100644 bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java create mode 100644 common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java new file mode 100644 index 000000000..5f6d9e977 --- /dev/null +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java @@ -0,0 +1,22 @@ +package us.myles.ViaVersion.bukkit.protocol1_12to1_11_1; + +import java.util.UUID; + +import us.myles.ViaVersion.bukkit.providers.BukkitInvContainerItemProvider; + +public class BukkitInvContainerUpdateTask implements Runnable { + + private BukkitInvContainerItemProvider provider; + private UUID uuid; + + public BukkitInvContainerUpdateTask(BukkitInvContainerItemProvider provider, UUID uuid) { + this.provider = provider; + this.uuid = uuid; + } + + @Override + public void run() { + // TODO Auto-generated method stub + provider.onTaskExecuted(uuid); + } +} \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java index 3b11a50e5..a02078e3b 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java @@ -1,15 +1,28 @@ package us.myles.ViaVersion.bukkit.providers; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.bukkit.protocol1_12to1_11_1.BukkitInvContainerUpdateTask; +import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; public class BukkitInvContainerItemProvider extends InvContainerItemProvider { + private static Map updateTasks = new ConcurrentHashMap<>(); + @Override public boolean registerInvClickPacket(short windowId, short slotId, short anumber, UserConnection uconnection) { + ProtocolInfo info = uconnection.get(ProtocolInfo.class); // TODO: lets add some stuff here :) - //http://wiki.vg/index.php?title=Protocol&oldid=13223#Click_Window - System.out.println("QUICK ACTION windowId: " + windowId + " slotId: " + slotId + " button: " + 0 + " anumber: " + anumber + " mode: " + 1); + // http://wiki.vg/index.php?title=Protocol&oldid=13223#Click_Window + System.out.println("info: " + info + " QUICK ACTION windowId: " + windowId + " slotId: " + slotId + " button: " + 0 + " anumber: " + anumber + " mode: " + 1); return false; // change to true once supported } + + public void onTaskExecuted(UUID uuid) { + updateTasks.remove(uuid); + } } \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java new file mode 100644 index 000000000..d20fa9d0e --- /dev/null +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java @@ -0,0 +1,13 @@ +package us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@AllArgsConstructor +@Getter +public class InvItemStorage { + + private short windowId; + private short slotId; + private short actionNumber; +} \ No newline at end of file From b3d3921f6ecea0c446e1b4ba2ac0a068680ed9bc Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Mon, 25 Sep 2017 18:04:39 +0300 Subject: [PATCH 5/6] Support item provider on a 1.8 server ... 1.9 is on the way --- .../BukkitInvContainerUpdateTask.java | 39 ++++- .../BukkitInvContainerItemProvider.java | 145 +++++++++++++++++- .../storage/InvItemStorage.java | 2 + 3 files changed, 180 insertions(+), 6 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java index 5f6d9e977..39068f2d8 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java @@ -1,22 +1,55 @@ package us.myles.ViaVersion.bukkit.protocol1_12to1_11_1; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; import java.util.UUID; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; + import us.myles.ViaVersion.bukkit.providers.BukkitInvContainerItemProvider; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.InvItemStorage; public class BukkitInvContainerUpdateTask implements Runnable { private BukkitInvContainerItemProvider provider; - private UUID uuid; + private final UUID uuid; + private final List items; public BukkitInvContainerUpdateTask(BukkitInvContainerItemProvider provider, UUID uuid) { this.provider = provider; this.uuid = uuid; + this.items = Collections.synchronizedList(new ArrayList<>()); + } + + public void addItem(short windowId, short slotId, short anumber) { + InvItemStorage storage = new InvItemStorage(windowId, slotId, anumber); + items.add(storage); } @Override public void run() { - // TODO Auto-generated method stub - provider.onTaskExecuted(uuid); + Player p = Bukkit.getServer().getPlayer(uuid); + if (p == null) { + provider.onTaskExecuted(uuid); + return; + } + try { + synchronized (items) { + for (InvItemStorage storage : items) { + Object packet = provider.buildWindowClickPacket(p, storage); + boolean result = provider.sendPlayer(p, packet); + System.out.println("item result: " + result); + if (!result) { + break; + } + } + System.out.println("items: " + items); + items.clear(); + } + } finally { + provider.onTaskExecuted(uuid); + } } } \ No newline at end of file diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java index a02078e3b..7fad14feb 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java @@ -1,28 +1,167 @@ package us.myles.ViaVersion.bukkit.providers; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.Map; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.bukkit.plugin.Plugin; +import org.bukkit.scheduler.BukkitScheduler; + import us.myles.ViaVersion.api.data.UserConnection; +import us.myles.ViaVersion.api.protocol.ProtocolRegistry; import us.myles.ViaVersion.bukkit.protocol1_12to1_11_1.BukkitInvContainerUpdateTask; +import us.myles.ViaVersion.bukkit.util.NMSUtil; import us.myles.ViaVersion.protocols.base.ProtocolInfo; import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.providers.InvContainerItemProvider; +import us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage.InvItemStorage; +import us.myles.ViaVersion.util.ReflectionUtil; public class BukkitInvContainerItemProvider extends InvContainerItemProvider { private static Map updateTasks = new ConcurrentHashMap<>(); + private boolean supported; + // packet class + private Class wclickPacketClass; + // Use for nms + private Method nmsItemMethod; + private Method ephandle; + private Field connection; + private Method packetMethod; + + public BukkitInvContainerItemProvider() { + this.supported = isSupported(); + setupReflection(); + } @Override public boolean registerInvClickPacket(short windowId, short slotId, short anumber, UserConnection uconnection) { + if (!supported) { + return false; + } ProtocolInfo info = uconnection.get(ProtocolInfo.class); - // TODO: lets add some stuff here :) + UUID uuid = info.getUuid(); + BukkitInvContainerUpdateTask utask = updateTasks.get(uuid); + final boolean registered = utask != null; + if (!registered) { + utask = new BukkitInvContainerUpdateTask(this, uuid); + updateTasks.put(uuid, utask); + } // http://wiki.vg/index.php?title=Protocol&oldid=13223#Click_Window - System.out.println("info: " + info + " QUICK ACTION windowId: " + windowId + " slotId: " + slotId + " button: " + 0 + " anumber: " + anumber + " mode: " + 1); - return false; // change to true once supported + utask.addItem(windowId, slotId, anumber); + if (!registered) { + scheduleTask(utask); + } + return true; + } + + public Object buildWindowClickPacket(Player p, InvItemStorage storage) { + if (!supported) { + return null; + } + InventoryView inv = p.getOpenInventory(); + short slotId = storage.getSlotId(); + if (slotId > inv.countSlots()) { + return null; // wrong container open? + } + ItemStack itemstack = inv.getItem(slotId); + if (itemstack == null) { + return null; + } + Object cinstance = null; + try { + Object nmsItem = nmsItemMethod.invoke(null, itemstack); + // TODO: PASSTHROUGH PROTOCOLS? (Make InvItemStorage inheritance from Item?) + cinstance = wclickPacketClass.newInstance(); + ReflectionUtil.set(cinstance, "a", (int) storage.getWindowId()); + ReflectionUtil.set(cinstance, "slot", (int) slotId); + ReflectionUtil.set(cinstance, "button", 0); // shift + left mouse click + ReflectionUtil.set(cinstance, "d", storage.getActionNumber()); + ReflectionUtil.set(cinstance, "item", nmsItem); + // TODO: THIS MUST BE AN ENUM on 1.9+ SERVERS!! + ReflectionUtil.set(cinstance, "shift", 1); // mode + } catch (Exception e) { + e.printStackTrace(); + } + return cinstance; + } + + public boolean sendPlayer(Player p, Object packet) { + if (packet == null) { + return false; + } + try { + Object entityPlayer = ephandle.invoke(p); + Object pconnection = connection.get(entityPlayer); + // send + packetMethod.invoke(pconnection, packet); + } catch (IllegalAccessException | InvocationTargetException e) { + e.printStackTrace(); + return false; + } + return true; } public void onTaskExecuted(UUID uuid) { updateTasks.remove(uuid); } + + private void scheduleTask(BukkitInvContainerUpdateTask utask) { + BukkitScheduler scheduler = Bukkit.getServer().getScheduler(); + Plugin instance = Bukkit.getServer().getPluginManager().getPlugin("ViaVersion"); + scheduler.runTaskLater(instance, utask, 5); // 5 ticks later. + } + + private void setupReflection() { + if (!supported) { + return; + } + try { + this.wclickPacketClass = NMSUtil.nms("PacketPlayInWindowClick"); + Class citemStack = NMSUtil.obc("inventory.CraftItemStack"); + this.nmsItemMethod = citemStack.getDeclaredMethod("asNMSCopy", ItemStack.class); + } catch (Exception e) { + this.supported = false; + return; + } + try { + this.ephandle = NMSUtil.obc("entity.CraftPlayer").getDeclaredMethod("getHandle"); + } catch (NoSuchMethodException | ClassNotFoundException e) { + this.supported = false; + throw new RuntimeException("Couldn't find CraftPlayer", e); + } + try { + this.connection = NMSUtil.nms("EntityPlayer").getDeclaredField("playerConnection"); + } catch (NoSuchFieldException | ClassNotFoundException e) { + this.supported = false; + throw new RuntimeException("Couldn't find Player Connection", e); + } + try { + this.packetMethod = NMSUtil.nms("PlayerConnection").getDeclaredMethod("a", wclickPacketClass); + } catch (NoSuchMethodException | ClassNotFoundException e) { + this.supported = false; + throw new RuntimeException("Couldn't find CraftPlayer", e); + } + } + + private boolean isSupported() { + int protocolId = ProtocolRegistry.SERVER_PROTOCOL; + if (protocolId == 47) { + return true; // 1.8 + } /**else if (protocolId >= 107 && protocolId <= 110) { + return true; // 1.9 + } else if (protocolId == 210) { + return true; // 1.10 + } else if (protocolId == 315 || protocolId == 316) { + return true; // 1.11 + }*/ + // this is not needed on 1.12+ + return false; + } } \ No newline at end of file diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java index d20fa9d0e..9deb38231 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_12to1_11_1/storage/InvItemStorage.java @@ -2,8 +2,10 @@ package us.myles.ViaVersion.protocols.protocol1_12to1_11_1.storage; import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.ToString; @AllArgsConstructor +@ToString @Getter public class InvItemStorage { From 1c4e0051a06b0943be13de00c68a68ed3adedabf Mon Sep 17 00:00:00 2001 From: mmxw11 Date: Mon, 25 Sep 2017 21:49:43 +0300 Subject: [PATCH 6/6] Finish inventory provider + Support 1.9+ servers --- .../BukkitInvContainerUpdateTask.java | 2 -- .../BukkitInvContainerItemProvider.java | 27 ++++++++++--------- 2 files changed, 14 insertions(+), 15 deletions(-) diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java index 39068f2d8..4e9fad983 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/protocol1_12to1_11_1/BukkitInvContainerUpdateTask.java @@ -40,12 +40,10 @@ public class BukkitInvContainerUpdateTask implements Runnable { for (InvItemStorage storage : items) { Object packet = provider.buildWindowClickPacket(p, storage); boolean result = provider.sendPlayer(p, packet); - System.out.println("item result: " + result); if (!result) { break; } } - System.out.println("items: " + items); items.clear(); } } finally { diff --git a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java index 7fad14feb..d4e7746c1 100644 --- a/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java +++ b/bukkit/src/main/java/us/myles/ViaVersion/bukkit/providers/BukkitInvContainerItemProvider.java @@ -29,6 +29,7 @@ public class BukkitInvContainerItemProvider extends InvContainerItemProvider { private boolean supported; // packet class private Class wclickPacketClass; + private Object clickTypeEnum; // Use for nms private Method nmsItemMethod; private Method ephandle; @@ -76,16 +77,19 @@ public class BukkitInvContainerItemProvider extends InvContainerItemProvider { } Object cinstance = null; try { - Object nmsItem = nmsItemMethod.invoke(null, itemstack); - // TODO: PASSTHROUGH PROTOCOLS? (Make InvItemStorage inheritance from Item?) cinstance = wclickPacketClass.newInstance(); + Object nmsItem = nmsItemMethod.invoke(null, itemstack); ReflectionUtil.set(cinstance, "a", (int) storage.getWindowId()); ReflectionUtil.set(cinstance, "slot", (int) slotId); ReflectionUtil.set(cinstance, "button", 0); // shift + left mouse click ReflectionUtil.set(cinstance, "d", storage.getActionNumber()); ReflectionUtil.set(cinstance, "item", nmsItem); - // TODO: THIS MUST BE AN ENUM on 1.9+ SERVERS!! - ReflectionUtil.set(cinstance, "shift", 1); // mode + int protocolId = ProtocolRegistry.SERVER_PROTOCOL; + if (protocolId == 47) { + ReflectionUtil.set(cinstance, "shift", 1); + } else if (protocolId >= 107) { // 1.9+ + ReflectionUtil.set(cinstance, "shift", clickTypeEnum); + } } catch (Exception e) { e.printStackTrace(); } @@ -115,7 +119,7 @@ public class BukkitInvContainerItemProvider extends InvContainerItemProvider { private void scheduleTask(BukkitInvContainerUpdateTask utask) { BukkitScheduler scheduler = Bukkit.getServer().getScheduler(); Plugin instance = Bukkit.getServer().getPluginManager().getPlugin("ViaVersion"); - scheduler.runTaskLater(instance, utask, 5); // 5 ticks later. + scheduler.runTaskLater(instance, utask, 2); // 2 ticks later (possible double click action). } private void setupReflection() { @@ -124,6 +128,9 @@ public class BukkitInvContainerItemProvider extends InvContainerItemProvider { } try { this.wclickPacketClass = NMSUtil.nms("PacketPlayInWindowClick"); + Class eclassz = NMSUtil.nms("InventoryClickType"); + Object[] constants = eclassz.getEnumConstants(); + this.clickTypeEnum = constants[1]; // QUICK_MOVE Class citemStack = NMSUtil.obc("inventory.CraftItemStack"); this.nmsItemMethod = citemStack.getDeclaredMethod("asNMSCopy", ItemStack.class); } catch (Exception e) { @@ -152,15 +159,9 @@ public class BukkitInvContainerItemProvider extends InvContainerItemProvider { private boolean isSupported() { int protocolId = ProtocolRegistry.SERVER_PROTOCOL; - if (protocolId == 47) { + if (protocolId >= 47 && protocolId <= 316) { return true; // 1.8 - } /**else if (protocolId >= 107 && protocolId <= 110) { - return true; // 1.9 - } else if (protocolId == 210) { - return true; // 1.10 - } else if (protocolId == 315 || protocolId == 316) { - return true; // 1.11 - }*/ + } // this is not needed on 1.12+ return false; }