From afb12e923bd9eb3e9c48764c9951b513e501fa7f Mon Sep 17 00:00:00 2001
From: DoctorMacc <toy.fighter1@gmail.com>
Date: Sat, 6 Jun 2020 00:04:05 -0400
Subject: [PATCH] Show villager display name

---
 .../connector/network/session/GeyserSession.java         | 3 ++-
 .../bedrock/BedrockInventoryTransactionTranslator.java   | 5 +++++
 .../inventory/MerchantInventoryTranslator.java           | 1 +
 .../translators/java/world/JavaTradeListTranslator.java  | 9 ++++++++-
 4 files changed, 16 insertions(+), 2 deletions(-)

diff --git a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
index 7597e59f1..db4d6aea3 100644
--- a/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
+++ b/connector/src/main/java/org/geysermc/connector/network/session/GeyserSession.java
@@ -30,7 +30,6 @@ import com.github.steveice10.mc.auth.exception.request.InvalidCredentialsExcepti
 import com.github.steveice10.mc.auth.exception.request.RequestException;
 import com.github.steveice10.mc.protocol.MinecraftProtocol;
 import com.github.steveice10.mc.protocol.data.SubProtocol;
-import com.github.steveice10.mc.protocol.data.game.entity.metadata.ItemStack;
 import com.github.steveice10.mc.protocol.data.game.entity.player.GameMode;
 import com.github.steveice10.mc.protocol.data.game.window.VillagerTrade;
 import com.github.steveice10.mc.protocol.data.game.world.block.BlockState;
@@ -173,6 +172,8 @@ public class GeyserSession implements CommandSender {
 
     @Setter
     private VillagerTrade[] villagerTrades;
+    @Setter
+    private long lastInteractedVillagerEid;
 
     private MinecraftProtocol protocol;
 
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
index 8f96b8004..777d4d9e3 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/bedrock/BedrockInventoryTransactionTranslator.java
@@ -45,6 +45,7 @@ import com.nukkitx.protocol.bedrock.packet.InventoryTransactionPacket;
 
 import org.geysermc.connector.entity.Entity;
 import org.geysermc.connector.entity.ItemFrameEntity;
+import org.geysermc.connector.entity.living.merchant.AbstractMerchantEntity;
 import org.geysermc.connector.inventory.Inventory;
 import org.geysermc.connector.network.session.GeyserSession;
 import org.geysermc.connector.network.translators.PacketTranslator;
@@ -198,6 +199,10 @@ public class BedrockInventoryTransactionTranslator extends PacketTranslator<Inve
                         session.sendDownstreamPacket(interactAtPacket);
 
                         EntitySoundInteractionHandler.handleEntityInteraction(session, vector, entity);
+
+                        if (entity instanceof AbstractMerchantEntity) {
+                            session.setLastInteractedVillagerEid(packet.getRuntimeEntityId());
+                        }
                         break;
                     case 1: //Attack
                         ClientPlayerInteractEntityPacket attackPacket = new ClientPlayerInteractEntityPacket((int) entity.getEntityId(),
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
index 4bf8d51fe..3f7636b9e 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/inventory/MerchantInventoryTranslator.java
@@ -93,6 +93,7 @@ public class MerchantInventoryTranslator extends BaseInventoryTranslator {
 
     @Override
     public void closeInventory(GeyserSession session, Inventory inventory) {
+        session.setLastInteractedVillagerEid(-1);
         session.setVillagerTrades(null);
     }
 
diff --git a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaTradeListTranslator.java b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaTradeListTranslator.java
index 04cee77e6..97f04ee58 100644
--- a/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaTradeListTranslator.java
+++ b/connector/src/main/java/org/geysermc/connector/network/translators/java/world/JavaTradeListTranslator.java
@@ -62,7 +62,14 @@ public class JavaTradeListTranslator extends PacketTranslator<ServerTradeListPac
         updateTradePacket.setTradeTier(packet.getVillagerLevel() - 1);
         updateTradePacket.setWindowId((short) packet.getWindowId());
         updateTradePacket.setWindowType((short) ContainerType.TRADING.id());
-        updateTradePacket.setDisplayName("Villager");
+        String displayName;
+        Entity realVillager = session.getEntityCache().getEntityByGeyserId(session.getLastInteractedVillagerEid());
+        if (realVillager != null && realVillager.getMetadata().containsKey(EntityData.NAMETAG) && realVillager.getMetadata().getString(EntityData.NAMETAG) != null) {
+            displayName = realVillager.getMetadata().getString(EntityData.NAMETAG);
+        } else {
+            displayName = packet.isRegularVillager() ? "Villager" : "Wandering Trader";
+        }
+        updateTradePacket.setDisplayName(displayName);
         updateTradePacket.setUnknownInt(0);
         updateTradePacket.setScreen2(true);
         updateTradePacket.setWilling(true);