From 2ab59dd2b25003a6371a8d89ee90379c5bba214e Mon Sep 17 00:00:00 2001 From: MomoPewpew <50401575+MomoPewpew@users.noreply.github.com> Date: Tue, 1 Aug 2023 19:35:09 +0200 Subject: [PATCH 1/4] Reattach backpacks after a player is mounted or dismounted --- .../listener/PlayerGameListener.java | 20 ++++++++++ .../user/manager/UserBackpackManager.java | 39 ++++++++++++------- 2 files changed, 46 insertions(+), 13 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..3f721cd0 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,24 @@ public class PlayerGameListener implements Listener { } } + @EventHandler + public void onPlayerMounted(EntityMountEvent event) { + if (!event.isCancelled() && event.getMount() instanceof Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{ + user.getUserBackpackManager().reattach(); + }, 1); + } + } + + @EventHandler + public void onPlayerDismounted(EntityDismountEvent event) { + if (!event.isCancelled() && event.getDismounted() instanceof Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + user.getUserBackpackManager().reattach(); + } + } + 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..454e8862 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 @@ -1,5 +1,6 @@ package com.hibiscusmc.hmccosmetics.user.manager; +import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBackpackType; import com.hibiscusmc.hmccosmetics.hooks.Hooks; @@ -10,6 +11,8 @@ import com.hibiscusmc.hmccosmetics.util.packets.PacketManager; import com.ticxo.modelengine.api.ModelEngineAPI; import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ModeledEntity; + +import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; @@ -64,6 +67,26 @@ public class UserBackpackManager { private void spawn(CosmeticBackpackType cosmeticBackpackType) { if (this.invisibleArmorStand != null) return; + + attach(cosmeticBackpackType); + + // 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")) { + if (ModelEngineAPI.api.getModelRegistry().getBlueprint(cosmeticBackpackType.getModelName()) == null) { + MessagesUtil.sendDebugMessages("Invalid Model Engine Blueprint " + cosmeticBackpackType.getModelName(), Level.SEVERE); + return; + } + ModeledEntity modeledEntity = ModelEngineAPI.getOrCreateModeledEntity(invisibleArmorStand); + ActiveModel model = ModelEngineAPI.createActiveModel(ModelEngineAPI.getBlueprint(cosmeticBackpackType.getModelName())); + model.setCanHurt(false); + modeledEntity.addModel(model, false); + } + + MessagesUtil.sendDebugMessages("spawnBackpack Bukkit - Finish"); + } + + private void attach(CosmeticBackpackType cosmeticBackpackType) { + if (this.invisibleArmorStand != null) return; this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType); List outsideViewers = user.getUserBackpackManager().getCloudManager().refreshViewers(user.getEntity().getLocation()); @@ -89,20 +112,10 @@ public class UserBackpackManager { if (!user.getHidden()) NMSHandlers.getHandler().equipmentSlotUpdate(user.getUserBackpackManager().getFirstArmorStandId(), EquipmentSlot.HEAD, cosmeticBackpackType.getFirstPersonBackpack(), owner); } PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), 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")) { - if (ModelEngineAPI.api.getModelRegistry().getBlueprint(cosmeticBackpackType.getModelName()) == null) { - MessagesUtil.sendDebugMessages("Invalid Model Engine Blueprint " + cosmeticBackpackType.getModelName(), Level.SEVERE); - return; - } - ModeledEntity modeledEntity = ModelEngineAPI.getOrCreateModeledEntity(invisibleArmorStand); - ActiveModel model = ModelEngineAPI.createActiveModel(ModelEngineAPI.getBlueprint(cosmeticBackpackType.getModelName())); - model.setCanHurt(false); - modeledEntity.addModel(model, false); - } - - MessagesUtil.sendDebugMessages("spawnBackpack Bukkit - Finish"); + public void reattach() { + attach((CosmeticBackpackType) user.getCosmetic(CosmeticSlot.BACKPACK)); } public void despawnBackpack() { From e8d1dd1798f3178912fdb8cdb30765a4e61574f4 Mon Sep 17 00:00:00 2001 From: MomoPewpew <50401575+MomoPewpew@users.noreply.github.com> Date: Tue, 1 Aug 2023 20:36:57 +0200 Subject: [PATCH 2/4] Revert "Reattach backpacks after a player is mounted or dismounted" This reverts commit 2ab59dd2b25003a6371a8d89ee90379c5bba214e. --- .../listener/PlayerGameListener.java | 20 ---------- .../user/manager/UserBackpackManager.java | 39 +++++++------------ 2 files changed, 13 insertions(+), 46 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 3f721cd0..05655b36 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -45,8 +45,6 @@ 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.*; @@ -360,24 +358,6 @@ public class PlayerGameListener implements Listener { } } - @EventHandler - public void onPlayerMounted(EntityMountEvent event) { - if (!event.isCancelled() && event.getMount() instanceof Player player) { - CosmeticUser user = CosmeticUsers.getUser(player); - Bukkit.getServer().getScheduler().scheduleSyncDelayedTask(HMCCosmeticsPlugin.getInstance(), ()->{ - user.getUserBackpackManager().reattach(); - }, 1); - } - } - - @EventHandler - public void onPlayerDismounted(EntityDismountEvent event) { - if (!event.isCancelled() && event.getDismounted() instanceof Player player) { - CosmeticUser user = CosmeticUsers.getUser(player); - user.getUserBackpackManager().reattach(); - } - } - 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 454e8862..54f22755 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 @@ -1,6 +1,5 @@ package com.hibiscusmc.hmccosmetics.user.manager; -import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticBackpackType; import com.hibiscusmc.hmccosmetics.hooks.Hooks; @@ -11,8 +10,6 @@ import com.hibiscusmc.hmccosmetics.util.packets.PacketManager; import com.ticxo.modelengine.api.ModelEngineAPI; import com.ticxo.modelengine.api.model.ActiveModel; import com.ticxo.modelengine.api.model.ModeledEntity; - -import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Entity; @@ -67,26 +64,6 @@ public class UserBackpackManager { private void spawn(CosmeticBackpackType cosmeticBackpackType) { if (this.invisibleArmorStand != null) return; - - attach(cosmeticBackpackType); - - // 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")) { - if (ModelEngineAPI.api.getModelRegistry().getBlueprint(cosmeticBackpackType.getModelName()) == null) { - MessagesUtil.sendDebugMessages("Invalid Model Engine Blueprint " + cosmeticBackpackType.getModelName(), Level.SEVERE); - return; - } - ModeledEntity modeledEntity = ModelEngineAPI.getOrCreateModeledEntity(invisibleArmorStand); - ActiveModel model = ModelEngineAPI.createActiveModel(ModelEngineAPI.getBlueprint(cosmeticBackpackType.getModelName())); - model.setCanHurt(false); - modeledEntity.addModel(model, false); - } - - MessagesUtil.sendDebugMessages("spawnBackpack Bukkit - Finish"); - } - - private void attach(CosmeticBackpackType cosmeticBackpackType) { - if (this.invisibleArmorStand != null) return; this.invisibleArmorStand = (ArmorStand) NMSHandlers.getHandler().spawnBackpack(user, cosmeticBackpackType); List outsideViewers = user.getUserBackpackManager().getCloudManager().refreshViewers(user.getEntity().getLocation()); @@ -112,10 +89,20 @@ public class UserBackpackManager { if (!user.getHidden()) NMSHandlers.getHandler().equipmentSlotUpdate(user.getUserBackpackManager().getFirstArmorStandId(), EquipmentSlot.HEAD, cosmeticBackpackType.getFirstPersonBackpack(), owner); } PacketManager.sendRidingPacket(entity.getEntityId(), user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers); - } - public void reattach() { - attach((CosmeticBackpackType) user.getCosmetic(CosmeticSlot.BACKPACK)); + // 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")) { + if (ModelEngineAPI.api.getModelRegistry().getBlueprint(cosmeticBackpackType.getModelName()) == null) { + MessagesUtil.sendDebugMessages("Invalid Model Engine Blueprint " + cosmeticBackpackType.getModelName(), Level.SEVERE); + return; + } + ModeledEntity modeledEntity = ModelEngineAPI.getOrCreateModeledEntity(invisibleArmorStand); + ActiveModel model = ModelEngineAPI.createActiveModel(ModelEngineAPI.getBlueprint(cosmeticBackpackType.getModelName())); + model.setCanHurt(false); + modeledEntity.addModel(model, false); + } + + MessagesUtil.sendDebugMessages("spawnBackpack Bukkit - Finish"); } public void despawnBackpack() { 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 3/4] 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); } /** From 6ec47c3f088e08f807f8208082387a67297659aa Mon Sep 17 00:00:00 2001 From: MomoPewpew <50401575+MomoPewpew@users.noreply.github.com> Date: Wed, 2 Aug 2023 22:06:45 +0200 Subject: [PATCH 4/4] Fixed documentation typo --- .../hibiscusmc/hmccosmetics/util/packets/PacketManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 3edfe91c..930c1534 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,7 @@ public class PacketManager extends BasePacket { /** * Mostly to deal with backpacks, this deals with entities riding other entities. - * @param mountIds The entity that is the "mount", ex. a player + * @param mountId 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 */ @@ -271,7 +271,7 @@ public class PacketManager extends BasePacket { /** * Mostly to deal with backpacks, this deals with entities riding other entities. - * @param mountIds The entity that is the "mount", ex. a player + * @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 */