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 9f3c3a0d..9f4666fa 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -46,6 +46,8 @@ 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.*; @@ -350,6 +352,30 @@ public void onPlayerCosemticEquip(PlayerCosmeticPostEquipEvent event) { } } + @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 53d75c5e..e4ee6007 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 @@ private void spawn(CosmeticBackpackType cosmeticBackpackType) { 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 @@ private void spawn(CosmeticBackpackType cosmeticBackpackType) { 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 ed604d9b..6cd8530e 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 @@ -253,22 +253,36 @@ public static void sendRidingPacket( /** * Mostly to deal with backpacks, this deals with entities riding other entities. * @param mountId 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 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 passengerId, + final int[] passengerIds, final @NotNull List sendTo ) { PacketContainer packet = new PacketContainer(PacketType.Play.Server.MOUNT); packet.getIntegers().write(0, mountId); - packet.getIntegerArrays().write(0, new int[]{passengerId}); + 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 mountId 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 + */ + public static void sendRidingPacket( + final int mountId, + final int passengerId, + final @NotNull List sendTo + ) { + sendRidingPacket(mountId, new int[] {passengerId}, sendTo); + } + /** * Destroys an entity from a player * @param entityId The entity to delete for a player