From 64d6fc900bc9e83ad3d280a021001420ca6a763c Mon Sep 17 00:00:00 2001 From: D3v1s0m Date: Wed, 1 May 2024 19:19:29 +0530 Subject: [PATCH] fix client side desync when interacting with allays --- .../java/lol/pyr/znpcsplus/ZNpcsPlus.java | 2 +- .../InteractionPacketListener.java | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java index fd95cd0..52abae7 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/ZNpcsPlus.java @@ -138,7 +138,7 @@ public class ZNpcsPlus { typeRegistry.registerDefault(packetEvents, propertyRegistry); actionRegistry.registerTypes(scheduler, adventure, textSerializer, bungeeConnector); - packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry, scheduler), PacketListenerPriority.MONITOR); + packetEvents.getEventManager().registerListener(new InteractionPacketListener(userManager, npcRegistry, typeRegistry, scheduler), PacketListenerPriority.MONITOR); new Metrics(bootstrap, 18244); pluginManager.registerEvents(new UserListener(userManager), bootstrap); diff --git a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java index c27f3b6..8734c0e 100644 --- a/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java +++ b/plugin/src/main/java/lol/pyr/znpcsplus/interaction/InteractionPacketListener.java @@ -1,29 +1,39 @@ package lol.pyr.znpcsplus.interaction; +import com.github.retrooper.packetevents.PacketEvents; import com.github.retrooper.packetevents.event.PacketListener; import com.github.retrooper.packetevents.event.PacketReceiveEvent; +import com.github.retrooper.packetevents.protocol.item.ItemStack; import com.github.retrooper.packetevents.protocol.packettype.PacketType; +import com.github.retrooper.packetevents.protocol.player.Equipment; +import com.github.retrooper.packetevents.protocol.player.EquipmentSlot; import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientInteractEntity; +import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerEntityEquipment; import lol.pyr.znpcsplus.api.event.NpcInteractEvent; import lol.pyr.znpcsplus.api.interaction.InteractionAction; import lol.pyr.znpcsplus.api.interaction.InteractionType; import lol.pyr.znpcsplus.npc.NpcEntryImpl; import lol.pyr.znpcsplus.npc.NpcImpl; import lol.pyr.znpcsplus.npc.NpcRegistryImpl; +import lol.pyr.znpcsplus.npc.NpcTypeRegistryImpl; import lol.pyr.znpcsplus.scheduling.TaskScheduler; import lol.pyr.znpcsplus.user.User; import lol.pyr.znpcsplus.user.UserManager; import org.bukkit.Bukkit; import org.bukkit.entity.Player; +import java.util.Collections; + public class InteractionPacketListener implements PacketListener { private final UserManager userManager; private final NpcRegistryImpl npcRegistry; + private final NpcTypeRegistryImpl typeRegistry; private final TaskScheduler scheduler; - public InteractionPacketListener(UserManager userManager, NpcRegistryImpl npcRegistry, TaskScheduler scheduler) { + public InteractionPacketListener(UserManager userManager, NpcRegistryImpl npcRegistry, NpcTypeRegistryImpl typeRegistry, TaskScheduler scheduler) { this.userManager = userManager; this.npcRegistry = npcRegistry; + this.typeRegistry = typeRegistry; this.scheduler = scheduler; } @@ -34,14 +44,25 @@ public class InteractionPacketListener implements PacketListener { if (player == null) return; WrapperPlayClientInteractEntity packet = new WrapperPlayClientInteractEntity(event); - User user = userManager.get(player); - if (!user.canInteract()) return; NpcEntryImpl entry = npcRegistry.getByEntityId(packet.getEntityId()); if (entry == null || !entry.isProcessed()) return; NpcImpl npc = entry.getNpc(); + + if ((packet.getAction().equals(WrapperPlayClientInteractEntity.InteractAction.INTERACT) + || packet.getAction().equals(WrapperPlayClientInteractEntity.InteractAction.INTERACT_AT)) + && npc.getType().equals(typeRegistry.getByName("allay"))) { + PacketEvents.getAPI().getPlayerManager().sendPacket(player, + new WrapperPlayServerEntityEquipment(packet.getEntityId(), Collections.singletonList( + new Equipment(EquipmentSlot.MAIN_HAND, ItemStack.EMPTY)))); + player.updateInventory(); + } + InteractionType type = wrapClickType(packet.getAction()); + User user = userManager.get(player); + if (!user.canInteract()) return; + NpcInteractEvent interactEvent = new NpcInteractEvent(player, entry, type); Bukkit.getPluginManager().callEvent(interactEvent); if (interactEvent.isCancelled()) return;