From 2df264662295b2b746eb49d9f67bab75dbdac438 Mon Sep 17 00:00:00 2001 From: MomoPewpew <50401575+MomoPewpew@users.noreply.github.com> Date: Wed, 2 Aug 2023 21:49:19 +0200 Subject: [PATCH] Backpack bug fixes Putting on a backpack will no longer throw off all current riders Acquiring a new rider will now reattach your backpack --- .../listener/PlayerGameListener.java | 26 +++++++++++++++++ .../user/manager/UserBackpackManager.java | 15 ++++++++-- .../util/packets/PacketManager.java | 28 ++++++++++++++----- 3 files changed, 59 insertions(+), 10 deletions(-) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java index 05655b36..58d37719 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -45,6 +45,8 @@ import org.bukkit.persistence.PersistentDataType; import org.bukkit.potion.PotionEffectType; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.spigotmc.event.entity.EntityDismountEvent; +import org.spigotmc.event.entity.EntityMountEvent; import java.util.*; @@ -358,6 +360,30 @@ public class PlayerGameListener implements Listener { } } + @EventHandler + public void onPlayerMounted(EntityMountEvent event) { + if (!event.isCancelled() && event.getEntity() instanceof Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) return; + + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{ + user.respawnBackpack(); + }, 1); + } + } + + @EventHandler + public void onPlayerDismounted(EntityDismountEvent event) { + if (!event.isCancelled() && event.getDismounted() instanceof Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) return; + + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{ + user.respawnBackpack(); + }, 1); + } + } + private void registerInventoryClickListener() { ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.WINDOW_CLICK) { @Override diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserBackpackManager.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserBackpackManager.java index 54f22755..82bfd6cb 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserBackpackManager.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserBackpackManager.java @@ -66,12 +66,21 @@ public class UserBackpackManager { if (this.invisibleArmorStand != null) return; this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType); + Entity entity = user.getEntity(); + + int[] passengerIDs = new int[entity.getPassengers().size() + 1]; + + for (int i = 0; i < entity.getPassengers().size(); i++) { + passengerIDs[i] = entity.getPassengers().get(i).getEntityId(); + } + + passengerIDs[passengerIDs.length - 1] = this.getFirstArmorStandId(); + List outsideViewers = user.getUserBackpackManager().getCloudManager().refreshViewers(user.getEntity().getLocation()); - PacketManager.sendRidingPacket(user.getEntity().getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers); + PacketManager.sendRidingPacket(user.getEntity().getEntityId(), passengerIDs, outsideViewers); ArrayList owner = new ArrayList<>(); if (user.getPlayer() != null) owner.add(user.getPlayer()); - Entity entity = user.getEntity(); if (cosmeticBackpackType.isFirstPersonCompadible()) { for (int i = particleCloud.size(); i < 5; i++) { @@ -88,7 +97,7 @@ public class UserBackpackManager { PacketManager.sendRidingPacket(particleCloud.get(particleCloud.size() - 1), user.getUserBackpackManager().getFirstArmorStandId(), owner); if (!user.getHidden()) NMSHandlers.getHandler().equipmentSlotUpdate(user.getUserBackpackManager().getFirstArmorStandId(), EquipmentSlot.HEAD, cosmeticBackpackType.getFirstPersonBackpack(), owner); } - PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers); + PacketManager.sendRidingPacket(entity.getEntityId(), passengerIDs, outsideViewers); // No one should be using ME because it barely works but some still use it, so it's here if (cosmeticBackpackType.getModelName() != null && Hooks.isActiveHook("ModelEngine")) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/PacketManager.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/PacketManager.java index ff869a9a..3edfe91c 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/PacketManager.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/PacketManager.java @@ -252,7 +252,26 @@ public class PacketManager extends BasePacket { /** * Mostly to deal with backpacks, this deals with entities riding other entities. - * @param mountId The entity that is the "mount", ex. a player + * @param mountIds The entity that is the "mount", ex. a player + * @param passengerIds The entities that are riding the mount, ex. a armorstand for a backpack + * @param sendTo Whom to send the packet to + */ + public static void sendRidingPacket( + final int mountId, + final int[] passengerIds, + final @NotNull List sendTo + ) { + PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT); + packet.getIntegers().write(0, mountId); + packet.getIntegerArrays().write(0, passengerIds); + for (final Player p : sendTo) { + sendPacket(p, packet); + } + } + + /** + * Mostly to deal with backpacks, this deals with entities riding other entities. + * @param mountIds The entity that is the "mount", ex. a player * @param passengerId The entity that is riding the mount, ex. a armorstand for a backpack * @param sendTo Whom to send the packet to */ @@ -261,12 +280,7 @@ public class PacketManager extends BasePacket { final int passengerId, final @NotNull List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT); - packet.getIntegers().write(0, mountId); - packet.getIntegerArrays().write(0, new int[]{passengerId}); - for (final Player p : sendTo) { - sendPacket(p, packet); - } + sendRidingPacket(mountId, new int[] {passengerId}, sendTo); } /**