diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java index 0269922a..26f7f720 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEmoteModel.java @@ -14,7 +14,10 @@ import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import java.util.HashMap; import java.util.List; import java.util.UUID; @@ -40,6 +43,10 @@ public class UserEmoteModel extends PlayerModel { // Add config option that either allows player to move or forces them into a spot. Player player = user.getPlayer(); List viewer = List.of(user.getPlayer()); + List outsideViewers = PacketManager.getViewers(player.getLocation()); + outsideViewers.remove(player); + + PacketManager.equipmentSlotUpdate(player, true, outsideViewers); Location newLocation = player.getLocation().clone(); newLocation.setPitch(0); @@ -83,17 +90,22 @@ public class UserEmoteModel extends PlayerModel { despawn(); Bukkit.getScheduler().runTask(HMCCosmeticsPlugin.getInstance(), () -> { if (user.getPlayer() == null) return; + Player player = user.getPlayer(); List viewer = List.of(user.getPlayer()); if (viewer == null) return; - int entityId = user.getPlayer().getEntityId(); + List outsideViewers = PacketManager.getViewers(player.getLocation()); + outsideViewers.remove(player); + + int entityId = player.getEntityId(); PacketManager.sendCameraPacket(entityId, viewer); PacketManager.sendEntityDestroyPacket(armorstandId, viewer); if (this.originalGamemode != null) { - PacketManager.gamemodeChangePacket(user.getPlayer(), ServerUtils.convertGamemode(this.originalGamemode)); - user.getPlayer().setGameMode(this.originalGamemode); + PacketManager.gamemodeChangePacket(player, ServerUtils.convertGamemode(this.originalGamemode)); + player.setGameMode(this.originalGamemode); } - if (user.getPlayer() != null) user.getPlayer().setInvisible(false); + if (user.getPlayer() != null) player.setInvisible(false); + PacketManager.equipmentSlotUpdate(player, false, outsideViewers); user.showPlayer(); user.showCosmetics(); }); 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 7aa0a580..64148865 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 @@ -16,9 +16,12 @@ import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerPlayer import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerRelEntityMove; import it.unimi.dsi.fastutil.ints.IntArrayList; import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; import java.util.ArrayList; import java.util.Collections; @@ -69,6 +72,17 @@ public class PacketManager extends BasePacket { for (Player p : sendTo) sendPacket(p, packet); } + public static void equipmentSlotUpdate( + Player player, + boolean empty, + List sendTo + ) { + for (EquipmentSlot slot : EquipmentSlot.values()) { + ItemStack item = player.getInventory().getItem(slot); + if (empty) item = new ItemStack(Material.AIR); + NMSHandlers.getHandler().equipmentSlotUpdate(player.getEntityId(), slot, item, sendTo); + } + } public static void equipmentSlotUpdate( Player player, CosmeticSlot cosmetic,