From 2d6defba114d7054ae348535ba53a15db84be6ac Mon Sep 17 00:00:00 2001 From: creeper123123321 Date: Wed, 10 Apr 2019 15:05:27 -0300 Subject: [PATCH] Resync the inventory when selecting trade Closes #1237 --- .../Protocol1_14To1_13_2.java | 1 - .../packets/InventoryPackets.java | 32 ++++++++++++++++--- .../storage/EntityTracker.java | 5 +++ 3 files changed, 33 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java index 79be0c42f..1cc1d0d4e 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/Protocol1_14To1_13_2.java @@ -225,7 +225,6 @@ public class Protocol1_14To1_13_2 extends Protocol { registerIncoming(State.PLAY, 0x1C, 0x1E); registerIncoming(State.PLAY, 0x1D, 0x1F); registerIncoming(State.PLAY, 0x1E, 0x20); - registerIncoming(State.PLAY, 0x1F, 0x21); registerIncoming(State.PLAY, 0x20, 0x22); registerIncoming(State.PLAY, 0x21, 0x23); diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java index 05408cd6c..b36c2b9b4 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/packets/InventoryPackets.java @@ -1,10 +1,7 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.packets; import com.github.steveice10.opennbt.conversion.ConverterRegistry; -import com.github.steveice10.opennbt.tag.builtin.CompoundTag; -import com.github.steveice10.opennbt.tag.builtin.ListTag; -import com.github.steveice10.opennbt.tag.builtin.StringTag; -import com.github.steveice10.opennbt.tag.builtin.Tag; +import com.github.steveice10.opennbt.tag.builtin.*; import com.google.common.collect.Sets; import us.myles.ViaVersion.api.PacketWrapper; import us.myles.ViaVersion.api.Via; @@ -15,9 +12,12 @@ import us.myles.ViaVersion.api.remapper.PacketRemapper; import us.myles.ViaVersion.api.type.Type; import us.myles.ViaVersion.packets.State; import us.myles.ViaVersion.protocols.protocol1_13to1_12_2.ChatRewriter; +import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.Protocol1_14To1_13_2; import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.data.MappingData; +import us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage.EntityTracker; import java.util.Set; +import java.util.concurrent.ThreadLocalRandom; public class InventoryPackets { private static String NBT_TAG_NAME; @@ -151,6 +151,7 @@ public class InventoryPackets { wrapper.read(Type.STRING); // Remove channel int windowId = wrapper.read(Type.INT); + wrapper.user().get(EntityTracker.class).setLatestTradeWindowId(windowId); wrapper.write(Type.VAR_INT, windowId); int size = wrapper.passthrough(Type.UNSIGNED_BYTE); @@ -280,6 +281,29 @@ public class InventoryPackets { } }); + // Select trade + protocol.registerIncoming(State.PLAY, 0x1F, 0x21, new PacketRemapper() { + @Override + public void registerMap() { + handler(new PacketHandler() { + @Override + public void handle(PacketWrapper wrapper) throws Exception { + // Selecting trade now moves the items, we need to resync the inventory + PacketWrapper resyncPacket = wrapper.create(0x08); + resyncPacket.write(Type.UNSIGNED_BYTE, ((short) wrapper.user().get(EntityTracker.class).getLatestTradeWindowId())); // 0 - Window ID + resyncPacket.write(Type.SHORT, ((short) -999)); // 1 - Slot + resyncPacket.write(Type.BYTE, (byte) 2); // 2 - Button - End left click + resyncPacket.write(Type.SHORT, ((short) ThreadLocalRandom.current().nextInt())); // 3 - Action number + resyncPacket.write(Type.VAR_INT, 5); // 4 - Mode - Drag + CompoundTag tag = new CompoundTag(""); + tag.put(new DoubleTag("force_resync", Double.NaN)); // Tags with NaN are not equal + resyncPacket.write(Type.FLAT_VAR_INT_ITEM, new Item(1, (byte) 1, (short) 0, tag)); // 5 - Clicked Item + resyncPacket.sendToServer(Protocol1_14To1_13_2.class, true, true); + } + }); + } + }); + // Creative Inventory Action protocol.registerIncoming(State.PLAY, 0x24, 0x26, new PacketRemapper() { @Override diff --git a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java index da3c0e057..4e752ca25 100644 --- a/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java +++ b/common/src/main/java/us/myles/ViaVersion/protocols/protocol1_14to1_13_2/storage/EntityTracker.java @@ -1,6 +1,8 @@ package us.myles.ViaVersion.protocols.protocol1_14to1_13_2.storage; import com.google.common.base.Optional; +import lombok.Getter; +import lombok.Setter; import us.myles.ViaVersion.api.data.StoredObject; import us.myles.ViaVersion.api.data.UserConnection; import us.myles.ViaVersion.api.entities.Entity1_14Types; @@ -11,6 +13,9 @@ import java.util.concurrent.ConcurrentHashMap; public class EntityTracker extends StoredObject { private final Map clientEntityTypes = new ConcurrentHashMap<>(); + @Getter + @Setter + private int latestTradeWindowId; public EntityTracker(UserConnection user) { super(user);