diff --git a/common/build.gradle.kts b/common/build.gradle.kts index 4564bc19..1387a941 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -103,7 +103,7 @@ bukkit { apiVersion = "1.16" name = "HMCCosmetics" authors = listOf("MasterOfTheFish") - softDepend = listOf("Multiverse", "PlaceholderAPI", "Oraxen", "ItemsAdder", "Citizens", "ModelEngine", "packetevents") + softDepend = listOf("Multiverse", "PlaceholderAPI", "Oraxen", "ItemsAdder", "Citizens", "ModelEngine") // depend = listOf("ProtocolLib") permissions { register("hmccosmetics.cmd.default") { diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java index 58503980..5fc285b2 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java @@ -63,7 +63,6 @@ public class HMCCosmetics extends JavaPlugin { @Override public void onLoad() { PacketEvents.setAPI(SpigotPacketEventsBuilder.build(this)); - PacketEvents.getAPI().getSettings().debug(true); PacketEvents.getAPI().load(); } diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java index 1923231b..4eeed82f 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java @@ -15,14 +15,12 @@ import io.github.fisher2911.hmccosmetics.user.EntityIds; import io.github.fisher2911.hmccosmetics.user.NPCUser; import io.github.fisher2911.hmccosmetics.user.User; import io.github.fisher2911.hmccosmetics.user.Wardrobe; -import io.github.retrooper.packetevents.util.SpigotDataHelper; import io.github.retrooper.packetevents.util.SpigotReflectionUtil; import org.bukkit.Bukkit; import org.bukkit.entity.Entity; import java.sql.SQLException; import java.util.List; -import java.util.SplittableRandom; import java.util.UUID; import java.util.function.Consumer; diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java index 7488febc..5ef3cf10 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/CosmeticFixListener.java @@ -39,7 +39,6 @@ import java.util.ArrayList; import java.util.EnumSet; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.Set; @@ -173,66 +172,6 @@ public class CosmeticFixListener implements Listener { } ); } -// -// int i = 0; -// -// private void updateIfDifferent(final Player player, final EntityEquipment previous) { -// i++; -// this.taskManager.submit(() -> { -// final int copy = i; -// final EntityEquipment equipment = player.getEquipment(); -// if (equipment == null) return; -// if (this.equipmentEquals(equipment, previous)) { -// player.sendMessage("Same armor"); -// return; -// } -// player.sendMessage("Different armor"); -// final List equipmentList = new ArrayList<>(); -// final Optional optionalUser = this.userManager.get(player.getUniqueId()); -// if (optionalUser.isEmpty()) return; -// final User user = optionalUser.get(); -// final PlayerArmor playerArmor = user.getPlayerArmor(); -// for (final ArmorItem item : playerArmor.getArmorItems()) { -// final EquipmentSlot slot = item.getType().getSlot(); -// if (slot == null) continue; -// final ItemStack current = Utils.replaceIfNull(equipment.getItem(slot), new ItemStack(Material.AIR)); -// equipmentList.add( -// PacketManager.getEquipment( -// this.userManager.getCosmeticItem( -// item, -// current, -// ArmorItem.Status.APPLIED, -// slot -// ), -// slot -// ) -// ); -// } -// this.userManager.sendUpdatePacket( -// user, -// equipmentList -// ); -// }); -// } - - private boolean equipmentEquals(final EntityEquipment first, final EntityEquipment second) { - if (first == null && second == null) { - return true; - } - if (first == null) { - return false; - } - if (second == null) { - return false; - } - for (final EquipmentSlot slot : EquipmentSlot.values()) { - final ItemStack i = first.getItem(slot); - final ItemStack i2 = second.getItem(slot); - if (i == null && i2 == null) continue; - if (!Objects.equals(first.getItem(slot), second.getItem(slot))) return false; - } - return true; - } private void updateOnClick(final Player player, final EquipmentSlot slot, final User user, final ArmorItem.Type type, final ItemStack current) { taskManager.submit(() -> { @@ -247,7 +186,7 @@ public class CosmeticFixListener implements Listener { if (cosmetic != null && cosmetic.getType() != Material.AIR) equipment.setItem(slot, cosmetic); final List items = - getItemList(user, equipment, Set.of(type)); + userManager.getItemList(user, equipment, Set.of(type)); for (final Player other : Bukkit.getOnlinePlayers()) { if (!settings.isInViewDistance(location, other.getLocation())) continue; userManager.sendUpdatePacket( @@ -391,33 +330,6 @@ public class CosmeticFixListener implements Listener { ), 1)); } - private List getItemList( - final User user, - final Equipment equipment, - final Set ignored - ) { - final PlayerArmor armor = user.getPlayerArmor(); - final List items = new ArrayList<>(); - for (final ArmorItem.Type type : ArmorItem.Type.values()) { - final EquipmentSlot slot = type.getSlot(); - if (slot == null) continue; - if (ignored.contains(type)) { - items.add(PacketManager.getEquipment(equipment.getItem(slot), slot)); - continue; - } - final ItemStack wearing = Utils.replaceIfNull(equipment.getItem(slot), new ItemStack(Material.AIR)); - final ItemStack itemStack = this.userManager.getCosmeticItem( - armor.getItem(type), - wearing, - ArmorItem.Status.APPLIED, - slot - ); - if (itemStack.getType() != Material.AIR) items.add(PacketManager.getEquipment(itemStack, slot)); - } - return items; - } - - @Nullable private EquipmentSlot getArmorSlot(final Material material) { for (final EquipmentSlot slot : EquipmentSlot.values()) { diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java index b86a4e6a..cd24a46c 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/JoinListener.java @@ -36,7 +36,8 @@ public class JoinListener implements Listener { user -> new TaskChain(this.plugin).chain( () -> this.userManager.add(user) ).chain(() -> { - this.userManager.resendCosmetics(player); +// this.userManager.resendCosmetics(player); +// this.userManager.updateCosmetics(user); final WardrobeSettings settings = this.plugin.getSettings().getWardrobeSettings(); if (settings.isAlwaysDisplay() && settings.getWardrobeLocation() != null) { final Wardrobe wardrobe = user.getWardrobe(); diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/TeleportListener.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/TeleportListener.java index 83fe365f..c7f4b33f 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/TeleportListener.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/listener/TeleportListener.java @@ -6,6 +6,7 @@ import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; +import org.bukkit.event.entity.PlayerDeathEvent; import org.bukkit.event.player.PlayerTeleportEvent; public class TeleportListener implements Listener { @@ -23,7 +24,17 @@ public class TeleportListener implements Listener { final Player player = event.getPlayer(); this.userManager.get(player.getUniqueId()).ifPresent(user -> { + user.despawnAttached(); user.despawnBalloon(); + }); + } + + @EventHandler(ignoreCancelled = true, priority = EventPriority.LOWEST) + public void onPlayerDeath(final PlayerDeathEvent event) { + final Player player = event.getEntity(); + + this.userManager.get(player.getUniqueId()).ifPresent(user -> { + user.despawnAttached(); user.despawnBalloon(); }); } diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/packet/PacketManager.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/packet/PacketManager.java index 5e29aaee..3952c3f1 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/packet/PacketManager.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/packet/PacketManager.java @@ -54,7 +54,7 @@ public class PacketManager { public static void sendArmorStandMetaContainer(final int armorStandId, final Player... sendTo) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityMetadata( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityMetadata( armorStandId, List.of( new EntityData(0, EntityDataTypes.BYTE, (byte) 0x20), @@ -96,7 +96,7 @@ public class PacketManager { final UUID uuid, final Player... sendTo) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerSpawnLivingEntity( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerSpawnLivingEntity( entityId, uuid, entityType, @@ -116,7 +116,7 @@ public class PacketManager { public static void sendInvisibilityPacket(final int entityId, final Player... sendTo) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityMetadata( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityMetadata( entityId, List.of(new EntityData(0, EntityDataTypes.BYTE, (byte) 0x20)) )); @@ -139,7 +139,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityTeleport( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityTeleport( entityId, new Vector3d(location.getX(), location.getY(), location.getZ()), location.getYaw(), @@ -167,7 +167,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityRelativeMove( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityRelativeMove( entityId, to.getX() - from.getX(), to.getY() - from.getY(), @@ -191,7 +191,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerAttachEntity( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerAttachEntity( balloonId, entityId, true @@ -216,7 +216,7 @@ public class PacketManager { final ItemStack itemStack = SpigotDataHelper.toBukkitItemStack(equipment.getItem()); } for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityEquipment( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityEquipment( entityId, equipmentList )); @@ -239,7 +239,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityRotation( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityRotation( entityId, location.getYaw(), location.getPitch(), @@ -262,7 +262,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityHeadLook( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityHeadLook( entityId, location.getYaw() )); @@ -283,7 +283,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerSetPassengers( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerSetPassengers( mountId, new int[]{passengerId} )); @@ -296,7 +296,7 @@ public class PacketManager { public static void sendEntityDestroyPacket(final int entityId, final Player... sendTo) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerDestroyEntities(entityId)); + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerDestroyEntities(entityId)); } } @@ -354,7 +354,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerSpawnPlayer( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerSpawnPlayer( entityId, uuid, new com.github.retrooper.packetevents.protocol.world.Location( @@ -382,7 +382,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerPlayerInfo( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerPlayerInfo( WrapperPlayServerPlayerInfo.Action.ADD_PLAYER, new WrapperPlayServerPlayerInfo.PlayerData( Component.empty(), @@ -410,7 +410,7 @@ public class PacketManager { ) { final byte mask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020 | 0x40; for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerEntityMetadata( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerEntityMetadata( playerId, List.of( new EntityData(17, EntityDataTypes.BYTE, mask), @@ -434,7 +434,7 @@ public class PacketManager { final Player... sendTo ) { for (final Player p : sendTo) { - PacketEvents.getAPI().getPlayerManager().sendPacketAsync(p, new WrapperPlayServerPlayerInfo( + PacketEvents.getAPI().getPlayerManager().sendPacketSilentlyAsync(p, new WrapperPlayServerPlayerInfo( WrapperPlayServerPlayerInfo.Action.REMOVE_PLAYER, new WrapperPlayServerPlayerInfo.PlayerData( Component.empty(), diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/BaseUser.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/BaseUser.java index 0bfe80b3..60389423 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/BaseUser.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/BaseUser.java @@ -155,7 +155,6 @@ public abstract class BaseUser { if (vector != null) actual.add(this.getVelocity().multiply(-1)); this.balloon.setLocation(actual); this.balloon.setVelocity(actual.clone().subtract(previous.clone()).toVector()); -// hookManager.getModelEngineHook().updateModel(this.balloon); this.balloon.updateModel(); final int balloonId = this.getBalloonId(); PacketManager.sendTeleportPacket(balloonId, actual, false, other); @@ -163,6 +162,7 @@ public abstract class BaseUser { } private void spawnArmorStand(final Player other, final Location location) { + // todo PacketManager.sendEntitySpawnPacket(location, this.getArmorStandId(), EntityTypes.ARMOR_STAND, other); } @@ -179,7 +179,6 @@ public abstract class BaseUser { final boolean shouldShow = shouldShow(other); final UUID otherUUID = other.getUniqueId(); final boolean hasBackpack = !this.playerArmor.getItem(ArmorItem.Type.BACKPACK).isEmpty(); - other.sendMessage(this.viewingArmorStand.toString()); if (!this.viewingArmorStand.contains(otherUUID)) { if (!inViewDistance || !shouldShow) { if (this.viewingBalloon.contains(otherUUID)) { @@ -219,7 +218,6 @@ public abstract class BaseUser { type(ItemTypes.AIR). build() )); - other.sendMessage("Air"); } else { final com.github.retrooper.packetevents.protocol.item.ItemStack itemStack = SpigotDataHelper.fromBukkitItemStack(this.playerArmor.getBackpack().getItemStack(ArmorItem.Status.APPLIED)); @@ -227,15 +225,14 @@ public abstract class BaseUser { EquipmentSlot.HELMET, itemStack )); - other.sendMessage("Added " + this.playerArmor.getBackpack().getItemStack(ArmorItem.Status.APPLIED).getType()); } final int armorStandId = this.getArmorStandId(); PacketManager.sendEquipmentPacket(equipment, armorStandId, other); PacketManager.sendRotationPacket(armorStandId, location, false, other); + PacketManager.sendLookPacket(armorStandId, location, other); PacketManager.sendRidingPacket(this.getEntityId(), armorStandId, other); PacketManager.sendArmorStandMetaContainer(armorStandId, other); - other.sendMessage("Spawned equipment: " + hidden + " : " + shouldShow); if (hidden) return; this.updateBalloon(other, location, settings.getCosmeticSettings()); diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java index e364de68..72fd8ccc 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/User.java @@ -51,7 +51,7 @@ public class User extends BaseUser { public boolean shouldShow(final Player other) { final Player player = this.getPlayer(); - if (player == null) return false; + if (player == null || player.isDead()) return false; if (player.getUniqueId().equals(other.getUniqueId()) && this.hidden) return false; final ItemStack itemStack = player.getInventory().getItemInMainHand(); if (itemStack != null && itemStack.getType() == Material.TRIDENT) { diff --git a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java index 6d6f1893..1248ba3d 100644 --- a/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java +++ b/common/src/main/java/io/github/fisher2911/hmccosmetics/user/UserManager.java @@ -13,9 +13,11 @@ import io.github.fisher2911.hmccosmetics.message.Placeholder; import io.github.fisher2911.hmccosmetics.message.Translation; import io.github.fisher2911.hmccosmetics.packet.PacketManager; import io.github.fisher2911.hmccosmetics.task.InfiniteTask; +import io.github.fisher2911.hmccosmetics.util.Utils; import io.github.fisher2911.hmccosmetics.util.builder.ItemBuilder; -import io.github.retrooper.packetevents.util.SpigotDataHelper; import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; @@ -23,9 +25,11 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; @@ -72,8 +76,6 @@ public class UserManager { } public void startTeleportTask() { - // throws an error on first load of registry if this isn't here -// WrappedDataWatcher.Registry.get(Byte.class); this.plugin.getTaskManager().submit(new InfiniteTask( () -> { for (final User user : this.userMap.values()) { @@ -83,59 +85,77 @@ public class UserManager { )); } - public void resendCosmetics(final Player player) { - for (final User user : this.userMap.values()) { - final Player p = user.getPlayer(); - if (p == null) continue; +// public void resendCosmetics(final Player player) { +// for (final User user : this.userMap.values()) { +// final Player p = user.getPlayer(); +// if (p == null) continue; // user.updateOutsideCosmetics(player, p.getLocation(), this.settings); - player.sendMessage("Resending cosmetics"); - this.updateCosmetics(user, player); - } - } +// } +// } public void updateCosmetics(final UUID uuid) { this.get(uuid).ifPresent(this::updateCosmetics); } - public void updateCosmetics(final BaseUser user) { - for (final Player player : Bukkit.getOnlinePlayers()) { - this.updateCosmetics(user, player); - } + public void updateCosmetics(final UUID uuid, final Player other) { + this.get(uuid).ifPresent(user -> this.updateCosmetics(user, other)); } public void updateCosmetics(final BaseUser user, final Player other) { - final Equipment equipment = user.getEquipment(); - for (final ArmorItem.Type type : ArmorItem.Type.values()) { - if (type.getSlot() == null) continue; - this.sendUpdatePacket( - user, - other, - equipment, - type - ); - } - } - - private void sendUpdatePacket( - final BaseUser user, - final Player other, - final Equipment equipment, - final ArmorItem.Type type) { - final PlayerArmor playerArmor = user.getPlayerArmor(); - final EquipmentSlot slot = type.getSlot(); - final ItemStack itemStack = this.getCosmeticItem(playerArmor.getItem(type), equipment.getItem(type.getSlot()), ArmorItem.Status.APPLIED, slot); - if (itemStack != null && itemStack.equals(equipment.getItem(slot))) return; - final List itemList = new ArrayList<>(); - itemList.add(new com.github.retrooper.packetevents.protocol.player.Equipment( - PacketManager.fromBukkitSlot(slot), SpigotDataHelper.fromBukkitItemStack(itemStack) - )); - PacketManager.sendEquipmentPacket( - itemList, - user.getEntityId(), - other + this.sendUpdatePacket( + user, + other, + this.getItemList( + user, + user.getEquipment(), + Collections.emptySet() + ) ); } + public void updateCosmetics(final BaseUser user) { + this.sendUpdatePacket( + user, + this.getItemList(user, user.getEquipment(), Collections.emptySet()) + ); +// for (final Player player : Bukkit.getOnlinePlayers()) { +// this.updateCosmetics(user, player); +// } + } + +// public void updateCosmetics(final BaseUser user, final Player other) { +// final Equipment equipment = user.getEquipment(); +// for (final ArmorItem.Type type : ArmorItem.Type.values()) { +// if (type.getSlot() == null) continue; +// this.sendUpdatePacket( +// user, +// other, +// equipment, +// type +// ); +// } +// } + +// private void sendUpdatePacket( +// final BaseUser user, +// final Player other, +// final Equipment equipment, +// final ArmorItem.Type type) { +// final PlayerArmor playerArmor = user.getPlayerArmor(); +// final EquipmentSlot slot = type.getSlot(); +// final ItemStack itemStack = this.getCosmeticItem(playerArmor.getItem(type), equipment.getItem(type.getSlot()), ArmorItem.Status.APPLIED, slot); +// if (itemStack != null && itemStack.equals(equipment.getItem(slot))) return; +// final List itemList = new ArrayList<>(); +// itemList.add(new com.github.retrooper.packetevents.protocol.player.Equipment( +// PacketManager.fromBukkitSlot(slot), SpigotDataHelper.fromBukkitItemStack(itemStack) +// )); +// PacketManager.sendEquipmentPacket( +// itemList, +// user.getEntityId(), +// other +// ); +// } + public ItemStack getCosmeticItem( final ArmorItem armorItem, final ItemStack wearing, @@ -164,6 +184,32 @@ public class UserManager { return itemStack; } + public List getItemList( + final BaseUser user, + final Equipment equipment, + final Set ignored + ) { + final PlayerArmor armor = user.getPlayerArmor(); + final List items = new ArrayList<>(); + for (final ArmorItem.Type type : ArmorItem.Type.values()) { + final EquipmentSlot slot = type.getSlot(); + if (slot == null) continue; + if (ignored.contains(type)) { + items.add(PacketManager.getEquipment(equipment.getItem(slot), slot)); + continue; + } + final ItemStack wearing = Utils.replaceIfNull(equipment.getItem(slot), new ItemStack(Material.AIR)); + final ItemStack itemStack = this.getCosmeticItem( + armor.getItem(type), + wearing, + ArmorItem.Status.APPLIED, + slot + ); + if (itemStack.getType() != Material.AIR) items.add(PacketManager.getEquipment(itemStack, slot)); + } + return items; + } + public void setItem(final BaseUser user, final ArmorItem armorItem) { ArmorItem previous = user.getPlayerArmor().getItem(armorItem.getType()); @@ -257,30 +303,52 @@ public class UserManager { final ArmorItem armorItem, final ItemStack wearing, final ArmorItem.Type type) { - final EquipmentSlot slot = type.getSlot(); - final ItemStack itemStack = this.getCosmeticItem(armorItem, wearing, ArmorItem.Status.APPLIED, slot); - final List itemList = new ArrayList<>(); - itemList.add(PacketManager.getEquipment(itemStack, slot)); - this.sendUpdatePacket(user, itemList); + final EquipmentSlot slot = type.getSlot(); + final ItemStack itemStack = this.getCosmeticItem(armorItem, wearing, ArmorItem.Status.APPLIED, slot); + final List itemList = new ArrayList<>(); + itemList.add(PacketManager.getEquipment(itemStack, slot)); + this.sendUpdatePacket(user, itemList); } public void sendUpdatePacket( - final User user, - List items) { - final Player player = user.getPlayer(); - if (player == null) return; + final BaseUser user, + List items + ) { +// final Player player = user.getPlayer(); +// if (player == null) return; + final Location location = user.getLocation(); + if (location == null) return; final int entityId = user.getEntityId(); for (final User otherUser : this.userMap.values()) { final Player other = otherUser.getPlayer(); if (other == null) continue; if (!user.shouldShow(other)) continue; - if (!this.settings.getCosmeticSettings().isInViewDistance(player.getLocation(), other.getLocation())) continue; + if (!this.settings.getCosmeticSettings().isInViewDistance(location, other.getLocation())) continue; PacketManager.sendEquipmentPacket( items, entityId, other ); } + } + public void sendUpdatePacket( + final BaseUser user, + final Player other, + List items + ) { +// final Player player = user.getPlayer(); +// if (player == null) return; + final Location location = user.getLocation(); + if (location == null) return; + final int entityId = user.getEntityId(); + if (other == null) return; + if (!user.shouldShow(other)) return; + if (!this.settings.getCosmeticSettings().isInViewDistance(location, other.getLocation())) return; + PacketManager.sendEquipmentPacket( + items, + entityId, + other + ); } }