diff --git a/build.gradle.kts b/build.gradle.kts index 275c7523..7b1c386e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { } group = "com.hibiscusmc" -version = "2.7.10${getGitCommitHash()}" +version = "2.8.0${getGitCommitHash()}" allprojects { apply(plugin = "java") @@ -16,6 +16,7 @@ allprojects { repositories { mavenCentral() + mavenLocal() // Paper Repo maven("https://repo.papermc.io/repository/maven-public/") @@ -24,8 +25,7 @@ allprojects { // Jitpack maven("https://jitpack.io") - // ProtocolLib repo - maven("https://repo.dmulloy2.net/repository/public/") //ProtocolLib Repo, constantly down + // Geary maven("https://repo.mineinabyss.com/releases/") maven("https://repo.mineinabyss.com/snapshots/") @@ -75,18 +75,23 @@ allprojects { compileOnly(fileTree("${project.rootDir}/lib") { include("*.jar") }) compileOnly("com.mojang:authlib:1.5.25") //compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") - compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT") + compileOnly("io.papermc.paper:paper-api:1.20.6-R0.1-SNAPSHOT") compileOnly("org.jetbrains:annotations:24.1.0") - compileOnly("com.comphenix.protocol:ProtocolLib:5.3.0") compileOnly("me.clip:placeholderapi:2.11.6") compileOnly("com.ticxo.modelengine:ModelEngine:R4.0.6") - compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.12") + compileOnly("com.sk89q.worldguard:worldguard-bukkit:7.0.12") { + exclude(group = "org.bukkit") + exclude(group = "com.google.guava") + exclude(group = "com.google.code.gson") + exclude(group = "it.unimi.dsi") + exclude(group = "com.sk89q.jnbt") + } compileOnly("io.github.toxicity188:BetterHud-standard-api:1.12") //Standard api compileOnly("io.github.toxicity188:BetterHud-bukkit-api:1.12") //Platform api compileOnly("io.github.toxicity188:BetterCommand:1.3") //BetterCommand library //compileOnly("it.unimi.dsi:fastutil:8.5.14") compileOnly("org.projectlombok:lombok:1.18.34") - compileOnly("me.lojosho:HibiscusCommons:0.6.3-0f0baaf4") + compileOnly("me.lojosho:HibiscusCommons:0.7.0-d301221e") // Handled by Spigot Library Loader compileOnly("net.kyori:adventure-api:4.23.0") @@ -138,7 +143,6 @@ tasks { downloadPlugins { hangar("PlaceholderAPI", "2.11.6") - url("https://ci.dmulloy2.net/job/ProtocolLib/lastSuccessfulBuild/artifact/build/libs/ProtocolLib.jar") url("https://download.luckperms.net/1593/bukkit/loader/LuckPerms-Bukkit-5.5.8.jar") } } @@ -175,8 +179,8 @@ bukkit { main = "com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin" apiVersion = "1.20" authors = listOf("LoJoSho") - depend = listOf("HibiscusCommons", "ProtocolLib") - softDepend = listOf("BetterHud", "ModelEngine", "Oraxen", "ItemsAdder", "Geary", "HMCColor", "WorldGuard", "MythicMobs", "PlaceholderAPI", "SuperVanish", "PremiumVanish", "LibsDisguises", "Denizen", "MMOItems", "Eco") + depend = listOf("HibiscusCommons") + softDepend = listOf("Nexo", "BetterHud", "ModelEngine", "Oraxen", "ItemsAdder", "Geary", "HMCColor", "WorldGuard", "MythicMobs", "PlaceholderAPI", "SuperVanish", "PremiumVanish", "LibsDisguises", "Denizen", "MMOItems", "Eco") version = "${project.version}" loadBefore = listOf( "Cosmin" // Fixes an issue with Cosmin loading before and taking /cosmetic, when messing with what we do. diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/HMCCosmeticsPlugin.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/HMCCosmeticsPlugin.java index 272c9652..78ce8e8d 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/HMCCosmeticsPlugin.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/HMCCosmeticsPlugin.java @@ -20,6 +20,7 @@ import com.hibiscusmc.hmccosmetics.listener.PaperPlayerGameListener; import com.hibiscusmc.hmccosmetics.listener.PlayerConnectionListener; import com.hibiscusmc.hmccosmetics.listener.PlayerGameListener; import com.hibiscusmc.hmccosmetics.listener.ServerListener; +import com.hibiscusmc.hmccosmetics.packets.CosmeticPacketInterface; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.util.MessagesUtil; @@ -83,6 +84,7 @@ public final class HMCCosmeticsPlugin extends HibiscusPlugin { // Setup setup(); + setPacketInterface(new CosmeticPacketInterface()); // Commands getServer().getPluginCommand("cosmetic").setExecutor(new CosmeticCommand()); 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 92beb8ec..6a155d20 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerGameListener.java @@ -1,10 +1,5 @@ package com.hibiscusmc.hmccosmetics.listener; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.*; -import com.comphenix.protocol.wrappers.EnumWrappers; -import com.comphenix.protocol.wrappers.Pair; import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.api.events.PlayerCosmeticPostEquipEvent; import com.hibiscusmc.hmccosmetics.config.Settings; @@ -52,17 +47,6 @@ import java.util.*; public class PlayerGameListener implements Listener { - public PlayerGameListener() { - registerInventoryClickListener(); - registerMenuChangeListener(); - registerEntityStatusListener(); - registerPlayerEquipmentListener(); - registerPlayerArmListener(); - registerEntityUseListener(); - registerSlotChangeListener(); - registerPassengerSetListener(); - } - @EventHandler(priority = EventPriority.LOW) public void onPlayerClick(@NotNull InventoryClickEvent event) { // || !event.getClickedInventory().getType().equals(InventoryType.PLAYER) @@ -426,251 +410,6 @@ public class PlayerGameListener implements Listener { user.showCosmetics(CosmeticUser.HiddenReason.PLUGIN); } - private void registerInventoryClickListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, List.of(PacketType.Play.Client.WINDOW_CLICK), ListenerOptions.ASYNC) { - @Override - public void onPacketReceiving(PacketEvent event) { - Player player = event.getPlayer(); - int invTypeClicked = event.getPacket().getIntegers().read(0); - int slotClicked = -999; - if (NMSHandlers.getVersion().isHigherOrEqual(MinecraftVersion.v1_21_5)) { - slotClicked = event.getPacket().getShorts().read(0); - } else { - slotClicked = event.getPacket().getIntegers().read(2); - } - - // Must be a player inventory. - if (invTypeClicked != 0) return; - // -999 is when a player clicks outside their inventory. https://wiki.vg/Inventory#Player_Inventory - if (slotClicked == -999) return; - if (event.getPlayer() == null) return; - - CosmeticUser user = CosmeticUsers.getUser(player); - if (user == null) return; - if (user.isInWardrobe()) return; - CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slotClicked); - if (cosmeticSlot == null) return; - if (!user.hasCosmeticInSlot(cosmeticSlot)) return; - Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> user.updateCosmetic(cosmeticSlot), 1); - MessagesUtil.sendDebugMessages("Packet fired, updated cosmetic " + cosmeticSlot); - } - }); - } - - private void registerMenuChangeListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, List.of(PacketType.Play.Server.WINDOW_ITEMS), ListenerOptions.ASYNC) { - @Override - public void onPacketSending(PacketEvent event) { - MessagesUtil.sendDebugMessages("Menu Initial "); - Player player = event.getPlayer(); - if (event.getPlayer() == null) return; - - int windowID = event.getPacket().getIntegers().read(0); - List slotData = event.getPacket().getItemListModifier().read(0); - if (windowID != 0) return; - - CosmeticUser user = CosmeticUsers.getUser(player); - if (user == null) return; - - HashMap items = new HashMap<>(); - - if (!user.isInWardrobe()) { - for (Cosmetic cosmetic : user.getCosmetics()) { - if ((cosmetic instanceof CosmeticArmorType cosmeticArmorType)) { - boolean requireEmpty = Settings.getSlotOption(cosmeticArmorType.getEquipSlot()).isRequireEmpty(); - boolean isAir = user.getPlayer().getInventory().getItem(cosmeticArmorType.getEquipSlot()).getType().isAir(); - MessagesUtil.sendDebugMessages("Menu Fired (Checks) - " + cosmeticArmorType.getId() + " - " + requireEmpty + " - " + isAir); - if (requireEmpty && !isAir) continue; - items.put(HMCCInventoryUtils.getPacketArmorSlot(cosmeticArmorType.getEquipSlot()), user.getUserCosmeticItem(cosmeticArmorType)); - } - } - } - - PacketContainer packet = new PacketContainer(PacketType.Play.Server.WINDOW_ITEMS); - packet.getIntegers().write(0, 0); - for (int slot = 0; slot < 46; slot++) { - if ((slot >= 5 && slot <= 8) || slot == 45) { - if (!items.containsKey(slot)) continue; - slotData.set(slot, items.get(slot)); - if (Settings.isDebugMode()) MessagesUtil.sendDebugMessages("Set " + slot + " as " + items.get(slot)); - } - } - packet.getItemListModifier().write(0, slotData); - packet.getItemModifier().write(0, event.getPacket().getItemModifier().read(0)); - event.setPacket(packet); - MessagesUtil.sendDebugMessages("Menu Fired, updated cosmetics " + " on slotdata " + windowID + " with " + slotData.size()); - /* - for (Cosmetic cosmetic : user.getCosmetic()) { - if ((cosmetic instanceof CosmeticArmorType) || (cosmetic instanceof CosmeticMainhandType)) { - Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> { - user.updateCosmetic(cosmetic); - }, 1); - - } - } - */ - } - }); - } - - private void registerSlotChangeListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.SET_SLOT) { - @Override - public void onPacketSending(PacketEvent event) { - MessagesUtil.sendDebugMessages("SetSlot Initial "); - - Player player = event.getPlayer(); - if (event.getPlayer() == null) return; - - int windowID = event.getPacket().getIntegers().read(0); - if (windowID != 0) return; - - CosmeticUser user = CosmeticUsers.getUser(player); - if (user == null) return; - if (user.isInWardrobe()) return; - - int slot = event.getPacket().getIntegers().read(2); - MessagesUtil.sendDebugMessages("SetSlot Slot " + slot); - CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slot); - EquipmentSlot equipmentSlot = HMCCInventoryUtils.getPacketArmorSlot(slot); - if (cosmeticSlot == null || equipmentSlot == null) return; - if (!user.hasCosmeticInSlot(cosmeticSlot)) return; - if (Settings.getSlotOption(equipmentSlot).isRequireEmpty()) { - if (!player.getInventory().getItem(equipmentSlot).getType().isAir()) return; - } - event.getPacket().getItemModifier().write(0, user.getUserCosmeticItem(cosmeticSlot)); - } - }); - } - - private void registerPlayerEquipmentListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.ENTITY_EQUIPMENT) { - @Override - public void onPacketSending(PacketEvent event) { - Player player = event.getPlayer(); // Player that's sent - int entityID = event.getPacket().getIntegers().read(0); - // User - CosmeticUser user = CosmeticUsers.getUser(entityID); - if (user == null) return; - if (user.isInWardrobe()) return; - - List> armor = event.getPacket().getSlotStackPairLists().read(0); - - for (int i = 0; i < armor.size(); i++) { - com.comphenix.protocol.wrappers.Pair pair = armor.get(i); - switch (pair.getFirst()) { - case MAINHAND -> { - if (user.getPlayer() == event.getPlayer()) continue; // When a player scrolls real fast, it messes up the mainhand. This fixes it - if (user.getPlayer() != null && user.getPlayer().isInvisible()) continue; // Fixes integration with GSit still showing mainhand even when hidden - armor.set(i, new Pair<>(pair.getFirst(), user.getPlayer().getInventory().getItemInMainHand())); - } - default -> { - EquipmentSlot slot = HMCCInventoryUtils.getEquipmentSlot(pair.getFirst()); - CosmeticSlot cosmeticSlot = HMCCInventoryUtils.getItemSlotToCosmeticSlot(pair.getFirst()); - if (slot == null || cosmeticSlot == null) continue; - if (Settings.getSlotOption(slot).isRequireEmpty() - && !user.getPlayer().getInventory().getItem(slot).getType().isAir()) continue; - CosmeticArmorType cosmeticArmor = (CosmeticArmorType) user.getCosmetic(cosmeticSlot); - if (cosmeticArmor == null) continue; - ItemStack item = user.getUserCosmeticItem(cosmeticArmor); - if (item == null) continue; - Pair armorPair = new Pair<>(HMCCInventoryUtils.itemBukkitSlot(slot), item); - armor.set(i, armorPair); - } - } - } - - event.getPacket().getSlotStackPairLists().write(0, armor); - MessagesUtil.sendDebugMessages("Equipment for " + user.getPlayer().getName() + " has been updated for " + player.getName()); - } - }); - } - - private void registerEntityStatusListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.ENTITY_STATUS) { - @Override - public void onPacketSending(PacketEvent event) { - int entityid = event.getPacket().getIntegers().read(0); - byte status = event.getPacket().getBytes().read(0); - - MessagesUtil.sendDebugMessages("EntityStatus Initial " + entityid + " - " + status); - if (status != 55) return; - - CosmeticUser user = CosmeticUsers.getUser(entityid); - if (user == null) { - MessagesUtil.sendDebugMessages("EntityStatus User is null"); - return; - } - if (!user.hasCosmeticInSlot(CosmeticSlot.OFFHAND)) return; - event.setCancelled(true); - } - }); - } - - private void registerPassengerSetListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Server.MOUNT) { - @Override - public void onPacketSending(PacketEvent event) { - CosmeticUser viewerUser = CosmeticUsers.getUser(event.getPlayer().getUniqueId()); - if (viewerUser == null) return; - if (viewerUser.isInWardrobe()) return; - - int ownerId = event.getPacket().getIntegers().read(0); - MessagesUtil.sendDebugMessages("Mount Packet Sent - Read - EntityID: " + ownerId); - Entity entity = HMCCServerUtils.getEntity(ownerId); - if (entity == null) return; - - CosmeticUser user = CosmeticUsers.getUser(entity.getUniqueId()); - if (user == null) return; - MessagesUtil.sendDebugMessages("Mount Packet Sent - " + user.getUniqueId()); - - if (!user.hasCosmeticInSlot(CosmeticSlot.BACKPACK)) return; - if (user.getUserBackpackManager() == null) return; - - // Basically, take the original passengers and "bump" them to the end of the list - int[] originalPassengers = event.getPacket().getIntegerArrays().read(0); - List passengers = new ArrayList<>(user.getUserBackpackManager().getEntityManager().getIds()); - - passengers.addAll(Arrays.stream(originalPassengers).boxed().toList()); - - event.getPacket().getIntegerArrays().write(0, passengers.stream().mapToInt(Integer::intValue).toArray()); - } - }); - } - - private void registerPlayerArmListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.ARM_ANIMATION) { - @Override - public void onPacketReceiving(PacketEvent event) { - if (event.getPlayer() == null) return; - Player player = event.getPlayer(); - CosmeticUser user = CosmeticUsers.getUser(player); - if (user == null) return; - if (!user.isInWardrobe()) return; - if (!user.getWardrobeManager().getWardrobeStatus().equals(UserWardrobeManager.WardrobeStatus.RUNNING)) return; - - Menu menu = user.getWardrobeManager().getLastOpenMenu(); - if (menu == null) return; - menu.openMenu(user); - event.setCancelled(true); - } - }); - } - - private void registerEntityUseListener() { - ProtocolLibrary.getProtocolManager().addPacketListener(new PacketAdapter(HMCCosmeticsPlugin.getInstance(), ListenerPriority.NORMAL, PacketType.Play.Client.USE_ENTITY) { - @Override - public void onPacketReceiving(PacketEvent event) { - if (event.getPlayer() == null) return; - CosmeticUser user = CosmeticUsers.getUser(event.getPlayer()); - if (user == null) return; - if (user.isInWardrobe()) { - event.setCancelled(true); - } - } - }); - } - @Nullable private EquipmentSlot getArmorSlot(final Material material) { for (final EquipmentSlot slot : EquipmentSlot.values()) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/packets/CosmeticPacketInterface.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/packets/CosmeticPacketInterface.java new file mode 100644 index 00000000..7be48d81 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/packets/CosmeticPacketInterface.java @@ -0,0 +1,195 @@ +package com.hibiscusmc.hmccosmetics.packets; + +import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; +import com.hibiscusmc.hmccosmetics.config.Settings; +import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic; +import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; +import com.hibiscusmc.hmccosmetics.cosmetic.types.CosmeticArmorType; +import com.hibiscusmc.hmccosmetics.gui.Menu; +import com.hibiscusmc.hmccosmetics.user.CosmeticUser; +import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; +import com.hibiscusmc.hmccosmetics.user.manager.UserWardrobeManager; +import com.hibiscusmc.hmccosmetics.util.HMCCInventoryUtils; +import com.hibiscusmc.hmccosmetics.util.MessagesUtil; +import me.lojosho.hibiscuscommons.packets.PacketAction; +import me.lojosho.hibiscuscommons.packets.PacketInterface; +import me.lojosho.hibiscuscommons.packets.wrapper.*; +import org.bukkit.Bukkit; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; +import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; + +import java.util.*; + +public class CosmeticPacketInterface implements PacketInterface { + + @Override + public PacketAction writeContainerContent(@NotNull Player player, @NotNull ContainerContentWrapper wrapper) { + int windowId = wrapper.getWindowId(); + if (windowId != 0) return PacketAction.NOTHING; + List slotData = wrapper.getSlotData(); + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) return PacketAction.NOTHING; + + HashMap items = new HashMap<>(); + + if (!user.isInWardrobe()) for (Cosmetic cosmetic : user.getCosmetics()) if (cosmetic instanceof CosmeticArmorType armorType) { + boolean requireEmpty = Settings.getSlotOption(armorType.getEquipSlot()).isRequireEmpty(); + boolean isAir = user.getPlayer().getInventory().getItem(armorType.getEquipSlot()).getType().isAir(); + MessagesUtil.sendDebugMessages("Menu Fired (Checks) - " + armorType.getId() + " - " + requireEmpty + " - " + isAir); + if (requireEmpty && !isAir) continue; + items.put(HMCCInventoryUtils.getPacketArmorSlot(armorType.getEquipSlot()), user.getUserCosmeticItem(armorType)); + } + + for (int slot = 0; slot < 46; slot++) { + if ((slot >= 5 && slot <= 8) || slot == 45) { + if (!items.containsKey(slot)) continue; + slotData.set(slot, items.get(slot)); + if (Settings.isDebugMode()) MessagesUtil.sendDebugMessages("Set " + slot + " as " + items.get(slot)); + } + } + + wrapper.setSlotData(slotData); + MessagesUtil.sendDebugMessages("Menu Fired, updated cosmetics " + " on slotdata " + windowId + " with " + slotData.size()); + return PacketAction.CHANGED; + } + + @Override + public PacketAction writeSlotContent(@NotNull Player player, @NotNull SlotContentWrapper wrapper) { + int windowId = wrapper.getWindowId(); + int slot = wrapper.getSlot(); + ItemStack itemStack = wrapper.getItemStack(); + + MessagesUtil.sendDebugMessages("SetSlot Initial "); + if (windowId != 0) return PacketAction.NOTHING; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || user.isInWardrobe()) return PacketAction.NOTHING; + + MessagesUtil.sendDebugMessages("SetSlot Slot " + slot); + CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slot); + EquipmentSlot equipmentSlot = HMCCInventoryUtils.getPacketArmorSlot(slot); + if (cosmeticSlot == null || equipmentSlot == null) return PacketAction.NOTHING; + if (!user.hasCosmeticInSlot(cosmeticSlot)) return PacketAction.NOTHING; + if (Settings.getSlotOption(equipmentSlot).isRequireEmpty()) { + if (!player.getInventory().getItem(equipmentSlot).getType().isAir()) return PacketAction.NOTHING; + } + wrapper.setItemStack(user.getUserCosmeticItem(cosmeticSlot)); + return PacketAction.CHANGED; + } + + @Override + public PacketAction writeEquipmentContent(@NotNull Player player, @NotNull EntityEquipmentWrapper wrapper) { + if (player.getEntityId() != wrapper.getEntityId()) return PacketAction.NOTHING; + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || user.isInWardrobe()) return PacketAction.NOTHING; + Map armor = wrapper.getArmor(); + + for (Map.Entry armorSlot : armor.entrySet()) { + EquipmentSlot slot = armorSlot.getKey(); + + if (slot == EquipmentSlot.HAND) { + if (user.getPlayer().getUniqueId() == player.getUniqueId()) + continue; // When a player scrolls real fast, it messes up the mainhand. This fixes it + if (user.getPlayer() != null && user.getPlayer().isInvisible()) + continue; // Fixes integration with GSit still showing mainhand even when hidden + armor.put(slot, player.getInventory().getItemInMainHand()); + } else { + CosmeticSlot cosmeticSlot = HMCCInventoryUtils.BukkitCosmeticSlot(slot); + if (cosmeticSlot == null) continue; + if (Settings.getSlotOption(slot).isRequireEmpty() && player.getInventory().getItem(slot).getType().isAir()) + continue; + + CosmeticArmorType cosmeticArmor = (CosmeticArmorType) user.getCosmetic(cosmeticSlot); + if (cosmeticArmor == null) continue; + ItemStack item = user.getUserCosmeticItem(cosmeticSlot); + if (item == null) continue; + armor.put(slot, item); + } + } + + wrapper.setArmor(armor); + MessagesUtil.sendDebugMessages("Equipment for " + user.getPlayer().getName() + " has been updated for " + player.getName()); + return PacketAction.CHANGED; + } + + @Override + public PacketAction writePassengerContent(@NotNull Player player, @NotNull PassengerWrapper wrapper) { + CosmeticUser viewerUser = CosmeticUsers.getUser(player); + if (viewerUser == null || viewerUser.isInWardrobe()) return PacketAction.NOTHING; + + int ownerId = wrapper.getOwner(); + List originalPassengers = wrapper.getPassengers(); + + MessagesUtil.sendDebugMessages("Mount Packet Sent - Read - EntityID: " + ownerId); + + Optional optionalCosmeticUser = CosmeticUsers.values().stream().filter(user -> user.getPlayer() != null).filter(user -> ownerId == user.getPlayer().getEntityId()).findFirst(); + if (optionalCosmeticUser.isEmpty()) return PacketAction.NOTHING; + Player entity = optionalCosmeticUser.get().getPlayer(); + + CosmeticUser user = CosmeticUsers.getUser(entity.getUniqueId()); + if (user == null) return PacketAction.NOTHING; + MessagesUtil.sendDebugMessages("Mount Packet Sent - " + user.getUniqueId()); + + if (!user.hasCosmeticInSlot(CosmeticSlot.BACKPACK)) return PacketAction.NOTHING; + if (user.getUserBackpackManager() == null) return PacketAction.NOTHING; + + List passengers = new ArrayList<>(user.getUserBackpackManager().getEntityManager().getIds()); + for (int passenger : originalPassengers) passengers.add(passenger); + + wrapper.setPassengers(passengers); + return PacketAction.CHANGED; + } + + @Override + public PacketAction readInventoryClick(@NotNull Player player, @NotNull InventoryClickWrapper wrapper) { + int clickType = wrapper.getClickType(); + int slotNumber = wrapper.getSlotNumber(); + if (clickType != 0 || slotNumber == -999) return PacketAction.NOTHING; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || user.isInWardrobe()) return PacketAction.NOTHING; + CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slotNumber); + if (cosmeticSlot == null || !user.hasCosmeticInSlot(cosmeticSlot)) return PacketAction.NOTHING; + + Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> user.updateCosmetic(cosmeticSlot), 1); + MessagesUtil.sendDebugMessages("Packet fired, updated cosmetic " + cosmeticSlot); + return PacketAction.NOTHING; + } + + @Override + public PacketAction readPlayerAction(@NotNull Player player, @NotNull PlayerActionWrapper wrapper) { + String actionType = wrapper.getActionType(); + MessagesUtil.sendDebugMessages("EntityStatus Initial " + player.getEntityId() + " - " + actionType); + // If it's not SWAP_ITEM_WITH_OFFHAND, ignore + if (!actionType.equalsIgnoreCase("SWAP_ITEM_WITH_OFFHAND")) return PacketAction.NOTHING; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) { + MessagesUtil.sendDebugMessages("EntityStatus User is null"); + return PacketAction.NOTHING; + } + if (!user.hasCosmeticInSlot(CosmeticSlot.OFFHAND)) return PacketAction.NOTHING; + return PacketAction.CANCELLED; + } + + @Override + public PacketAction readPlayerArm(@NotNull Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || !user.isInWardrobe() || !user.getWardrobeManager().getWardrobeStatus().equals(UserWardrobeManager.WardrobeStatus.RUNNING)) return PacketAction.NOTHING; + + Menu menu = user.getWardrobeManager().getLastOpenMenu(); + if (menu == null) return PacketAction.NOTHING; + menu.openMenu(user); + return PacketAction.CANCELLED; + } + + @Override + public PacketAction readEntityHandle(@NotNull Player player) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || !user.isInWardrobe()) return PacketAction.NOTHING; + else return PacketAction.CANCELLED; + } +} \ No newline at end of file diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java index 8574f4eb..df15c468 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/CosmeticUser.java @@ -603,7 +603,7 @@ public class CosmeticUser implements CosmeticHolder { * @return Entity */ public Entity getEntity() { - return Bukkit.getEntity(uniqueId); + return getPlayer(); } public Color getCosmeticColor(CosmeticSlot slot) { diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java index 8d4bc94a..09f17881 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserEntity.java @@ -99,7 +99,7 @@ public class UserEntity { // First person backpacks need both packets to rotate properly, otherwise they look off // Regular backpacks just need the look packet if (additonalPacket) HMCCPacketManager.sendRotationPacket(entity, yaw, false, getViewers()); - HMCCPacketManager.sendLookPacket(entity, location, getViewers()); + HMCCPacketManager.sendRotateHeadPacket(entity, location, getViewers()); } } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java index 4d7a4ccf..cbd7950c 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/user/manager/UserWardrobeManager.java @@ -117,12 +117,14 @@ public class UserWardrobeManager { // Armorstand HMCCPacketManager.sendEntitySpawnPacket(viewingLocation, ARMORSTAND_ID, EntityType.ARMOR_STAND, UUID.randomUUID(), viewer); HMCCPacketManager.sendArmorstandMetadata(ARMORSTAND_ID, viewer); - HMCCPacketManager.sendLookPacket(ARMORSTAND_ID, viewingLocation, viewer); + NMSHandlers.getHandler().getPacketHandler().sendTeleportPacket(ARMORSTAND_ID, viewingLocation.getX(), viewingLocation.getY(), viewingLocation.getZ(), viewingLocation.getYaw(), viewingLocation.getPitch(), false, viewer); + //NMSHandlers.getHandler().getPacketHandler().sendLookAtPacket(ARMORSTAND_ID, viewingLocation, viewer); + HMCCPacketManager.sendRotateHeadPacket(ARMORSTAND_ID, viewingLocation, viewer); // Player player.teleport(viewingLocation, PlayerTeleportEvent.TeleportCause.PLUGIN); player.setInvisible(true); - HMCCPacketManager.gamemodeChangePacket(player, 3); + HMCCPacketManager.gamemodeChangePacket(player, GameMode.SPECTATOR); HMCCPacketManager.sendCameraPacket(ARMORSTAND_ID, viewer); // NPC @@ -142,7 +144,7 @@ public class UserWardrobeManager { }, 4); // Location - HMCCPacketManager.sendLookPacket(NPC_ID, npcLocation, viewer); + HMCCPacketManager.sendRotateHeadPacket(NPC_ID, npcLocation, viewer); HMCCPacketManager.sendRotationPacket(NPC_ID, npcLocation, true, viewer); // Misc @@ -247,11 +249,11 @@ public class UserWardrobeManager { if (WardrobeSettings.isForceExitGamemode()) { MessagesUtil.sendDebugMessages("Force Exit Gamemode " + WardrobeSettings.getExitGamemode()); player.setGameMode(WardrobeSettings.getExitGamemode()); - HMCCPacketManager.gamemodeChangePacket(player, HMCCServerUtils.convertGamemode(WardrobeSettings.getExitGamemode())); // Success + HMCCPacketManager.gamemodeChangePacket(player, WardrobeSettings.getExitGamemode()); // Success } else { MessagesUtil.sendDebugMessages("Original Gamemode " + this.originalGamemode); player.setGameMode(this.originalGamemode); - HMCCPacketManager.gamemodeChangePacket(player, HMCCServerUtils.convertGamemode(this.originalGamemode)); // Success + HMCCPacketManager.gamemodeChangePacket(player, this.originalGamemode); // Success } user.showPlayer(); @@ -311,11 +313,13 @@ public class UserWardrobeManager { int yaw = data.get(); location.setYaw(yaw); - HMCCPacketManager.sendLookPacket(NPC_ID, location, viewer); + HMCCPacketManager.sendRotateHeadPacket(NPC_ID, location, viewer); user.hidePlayer(); int rotationSpeed = WardrobeSettings.getRotationSpeed(); - location.setYaw(HMCCServerUtils.getNextYaw(yaw - 30, rotationSpeed)); - HMCCPacketManager.sendRotationPacket(NPC_ID, location, true, viewer); + int newYaw = HMCCServerUtils.getNextYaw(yaw - 30, rotationSpeed); + location.setYaw(newYaw); + NMSHandlers.getHandler().getPacketHandler().sendRotationPacket(NPC_ID, newYaw, 0, false, viewer); + HMCCPacketManager.sendRotationPacket(NPC_ID, newYaw, true, viewer); int nextyaw = HMCCServerUtils.getNextYaw(yaw, rotationSpeed); data.set(nextyaw); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java index abf5f987..d97ec701 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java @@ -1,6 +1,5 @@ package com.hibiscusmc.hmccosmetics.util; -import com.comphenix.protocol.wrappers.EnumWrappers; import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; import org.bukkit.NamespacedKey; @@ -28,22 +27,6 @@ public class HMCCInventoryUtils { SLOT_MAP.put(CosmeticSlot.MAINHAND, EquipmentSlot.HAND); } - /** - * Converts from the Bukkit item slots to ProtocolLib item slots. Will produce a null if an improper bukkit item slot is sent through - * @param slot The BUKKIT item slot to convert. - * @return The ProtocolLib item slot that is returned - */ - public static EnumWrappers.ItemSlot itemBukkitSlot(final EquipmentSlot slot) { - return switch (slot) { - case HEAD -> EnumWrappers.ItemSlot.HEAD; - case CHEST -> EnumWrappers.ItemSlot.CHEST; - case LEGS -> EnumWrappers.ItemSlot.LEGS; - case FEET -> EnumWrappers.ItemSlot.FEET; - case HAND -> EnumWrappers.ItemSlot.MAINHAND; - case OFF_HAND -> EnumWrappers.ItemSlot.OFFHAND; - }; - } - public static int getPacketArmorSlot(final EquipmentSlot slot) { return switch (slot) { case HEAD -> 5; @@ -67,18 +50,6 @@ public class HMCCInventoryUtils { }; } - public static CosmeticSlot getItemSlotToCosmeticSlot(final EnumWrappers.ItemSlot slot) { - return switch (slot) { - case HEAD -> CosmeticSlot.HELMET; - case CHEST -> CosmeticSlot.CHESTPLATE; - case LEGS -> CosmeticSlot.LEGGINGS; - case FEET -> CosmeticSlot.BOOTS; - case OFFHAND -> CosmeticSlot.OFFHAND; - case MAINHAND -> CosmeticSlot.MAINHAND; - default -> null; - }; - } - public static CosmeticSlot BukkitCosmeticSlot(EquipmentSlot slot) { return switch (slot) { case HAND -> CosmeticSlot.MAINHAND; @@ -147,32 +118,6 @@ public class HMCCInventoryUtils { return SLOT_MAP.get(slot); } - public static EquipmentSlot getEquipmentSlot(@NotNull EnumWrappers.ItemSlot slot) { - switch (slot) { - case HEAD -> { - return EquipmentSlot.HEAD; - } - case CHEST -> { - return EquipmentSlot.CHEST; - } - case LEGS -> { - return EquipmentSlot.LEGS; - } - case FEET -> { - return EquipmentSlot.FEET; - } - case OFFHAND -> { - return EquipmentSlot.OFF_HAND; - } - case MAINHAND -> { - return EquipmentSlot.HAND; - } - default -> { - return null; - } - } - } - public static boolean isCosmeticItem(ItemStack itemStack) { if (itemStack == null) return false; itemStack = itemStack.clone(); diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCPlayerUtils.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCPlayerUtils.java index 7fd79487..e57caf85 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCPlayerUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCPlayerUtils.java @@ -1,29 +1,15 @@ package com.hibiscusmc.hmccosmetics.util; -import com.comphenix.protocol.wrappers.WrappedGameProfile; -import com.comphenix.protocol.wrappers.WrappedSignedProperty; import com.hibiscusmc.hmccosmetics.config.Settings; import me.lojosho.hibiscuscommons.util.packets.PacketManager; import org.bukkit.Location; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; import java.util.List; public class HMCCPlayerUtils { - @Nullable - public static WrappedSignedProperty getSkin(Player player) { - WrappedSignedProperty skinData = WrappedGameProfile.fromPlayer(player).getProperties() - .get("textures").stream().findAny().orElse(null); - - if (skinData == null) { - return null; - } - return new WrappedSignedProperty("textures", skinData.getValue(), skinData.getSignature()); - } - /** * Get nearby players. {@link com.hibiscusmc.hmccosmetics.util.packets.HMCCPacketManager#getViewers(Location)} * @param player diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/HMCCPacketManager.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/HMCCPacketManager.java index 641d2157..e6fd0bc2 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/HMCCPacketManager.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/HMCCPacketManager.java @@ -1,28 +1,23 @@ package com.hibiscusmc.hmccosmetics.util.packets; -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.*; -import com.google.common.collect.Lists; -import com.hibiscusmc.hmccosmetics.api.HMCCosmeticsAPI; import com.hibiscusmc.hmccosmetics.config.Settings; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.util.HMCCInventoryUtils; -import com.hibiscusmc.hmccosmetics.util.HMCCPlayerUtils; -import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerNamedEntitySpawn; -import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerPlayerInfo; -import com.hibiscusmc.hmccosmetics.util.packets.wrappers.WrapperPlayServerRelEntityMove; +import me.lojosho.hibiscuscommons.nms.NMSHandlers; import me.lojosho.hibiscuscommons.util.packets.PacketManager; import org.bukkit.Location; import org.bukkit.Material; +import org.bukkit.entity.Display; import org.bukkit.entity.EntityType; +import org.bukkit.entity.ItemDisplay; import org.bukkit.entity.Player; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import org.joml.Quaternionf; +import org.joml.Vector3f; import java.util.*; @@ -46,16 +41,7 @@ public class HMCCPacketManager extends PacketManager { final UUID uuid, final @NotNull List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.SPAWN_ENTITY); - packet.getModifier().writeDefaults(); - packet.getUUIDs().write(0, uuid); - packet.getIntegers().write(0, entityId); - packet.getEntityTypeModifier().write(0, entityType); - packet.getDoubles(). - write(0, location.getX()). - write(1, location.getY()). - write(2, location.getZ()); - for (Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendSpawnEntityPacket(entityId, uuid, entityType, location, sendTo); } public static void equipmentSlotUpdate( @@ -101,49 +87,24 @@ public class HMCCPacketManager extends PacketManager { int entityId, List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, entityId); - final List wrappedDataValueList = Lists.newArrayList(); - - // 0x21 = Invisible + Fire (Aka, burns to make it not take the light of the block its in, avoiding turning it black) - byte mask = 0x20; - if (Settings.isBackpackPreventDarkness()) mask = 0x21; - wrappedDataValueList.add(new WrappedDataValue(0, WrappedDataWatcher.Registry.get(Byte.class), mask)); - wrappedDataValueList.add(new WrappedDataValue(15, WrappedDataWatcher.Registry.get(Byte.class), (byte) 0x10)); - packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); - for (Player p : sendTo) sendPacket(p, packet); + byte mask = (byte) (Settings.isBackpackPreventDarkness() ? 0x21 : 0x20); + Map dataValues = Map.of(0, mask, 15, (byte) 0x10); + NMSHandlers.getHandler().getPacketHandler().sendSharedEntityData(entityId, dataValues, sendTo); } public static void sendInvisibilityPacket( int entityId, List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, entityId); - - final List wrappedDataValueList = Lists.newArrayList(); - wrappedDataValueList.add(new WrappedDataValue(0, WrappedDataWatcher.Registry.get(Byte.class), (byte) 0x20)); - packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); - for (Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendSharedEntityData(entityId, Map.of(0, (byte) 0x20), sendTo); } public static void sendCloudEffect( int entityId, List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, entityId); - - final List wrappedDataValueList = Lists.newArrayList(); - wrappedDataValueList.add(new WrappedDataValue(0, WrappedDataWatcher.Registry.get(Byte.class), (byte) 0x20)); - wrappedDataValueList.add(new WrappedDataValue(8, WrappedDataWatcher.Registry.get(Float.class), 0f)); - //wrappedDataValueList.add(new WrappedDataValue(11, WrappedDataWatcher.Registry.get(Integer.class), 21)); - packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); - - for (Player p : sendTo) sendPacket(p, packet); + Map dataValues = Map.of(0, (byte) 0x20, 8, 0f); + NMSHandlers.getHandler().getPacketHandler().sendSharedEntityData(entityId, dataValues, sendTo); } public static void sendRotationPacket( @@ -161,16 +122,10 @@ public class HMCCPacketManager extends PacketManager { @NotNull List sendTo ) { float ROTATION_FACTOR = 256.0F / 360.0F; - float yaw = location.getYaw() * ROTATION_FACTOR; - float pitch = location.getPitch() * ROTATION_FACTOR; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); - packet.getIntegers().write(0, entityId); - packet.getBytes().write(0, (byte) yaw); - packet.getBytes().write(1, (byte) pitch); + byte yaw = (byte) (location.getYaw() * ROTATION_FACTOR); + byte pitch = (byte) (location.getPitch() * ROTATION_FACTOR); - //Bukkit.getLogger().info("DEBUG: Yaw: " + (location.getYaw() * ROTATION_FACTOR) + " | Original Yaw: " + location.getYaw()); - packet.getBooleans().write(0, onGround); - for (Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendRotationPacket(entityId, yaw, pitch, onGround, sendTo); } public static void sendRotationPacket( @@ -180,18 +135,9 @@ public class HMCCPacketManager extends PacketManager { @NotNull List sendTo ) { float ROTATION_FACTOR = 256.0F / 360.0F; - float yaw2 = yaw * ROTATION_FACTOR; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_LOOK); - packet.getIntegers().write(0, entityId); - packet.getBytes().write(0, (byte) yaw2); - packet.getBytes().write(1, (byte) 0); - - //Bukkit.getLogger().info("DEBUG: Yaw: " + (location.getYaw() * ROTATION_FACTOR) + " | Original Yaw: " + location.getYaw()); - packet.getBooleans().write(0, onGround); - for (Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendRotationPacket(entityId, yaw * ROTATION_FACTOR, 0, onGround, sendTo); } - /** * Mostly to deal with backpacks, this deals with entities riding other entities. * @param mountId The entity that is the "mount", ex. a player @@ -216,12 +162,7 @@ public class HMCCPacketManager extends PacketManager { 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); - } + NMSHandlers.getHandler().getPacketHandler().sendMountPacket(mountId, passengerIds, sendTo); } /** @@ -251,17 +192,7 @@ public class HMCCPacketManager extends PacketManager { final int entityId, final @NotNull List sendTo ) { - if (HMCCosmeticsAPI.getNMSVersion().contains("v1_19_R3") || HMCCosmeticsAPI.getNMSVersion().contains("v1_20_R1")) { - WrapperPlayServerNamedEntitySpawn wrapper = new WrapperPlayServerNamedEntitySpawn(); - wrapper.setEntityID(entityId); - wrapper.setPlayerUUID(uuid); - wrapper.setPosition(location.toVector()); - wrapper.setPitch(location.getPitch()); - wrapper.setYaw(location.getYaw()); - for (final Player p : sendTo) sendPacket(p, wrapper.getHandle()); - return; - } - sendEntitySpawnPacket(location, entityId, EntityType.PLAYER, uuid); + sendEntitySpawnPacket(location, entityId, EntityType.PLAYER, uuid, sendTo); } /** @@ -274,28 +205,10 @@ public class HMCCPacketManager extends PacketManager { final Player skinnedPlayer, final int entityId, final UUID uuid, - final String NPCName, + final String npcName, final List sendTo ) { - WrapperPlayServerPlayerInfo info = new WrapperPlayServerPlayerInfo(); - info.setAction(EnumWrappers.PlayerInfoAction.ADD_PLAYER); - - String name = NPCName; - while (name.length() > 16) { - name = name.substring(16); - } - - WrappedGameProfile wrappedGameProfile = new WrappedGameProfile(uuid, name); - WrappedSignedProperty skinData = HMCCPlayerUtils.getSkin(skinnedPlayer); - if (skinData != null) wrappedGameProfile.getProperties().put("textures", skinData); - - info.getHandle().getPlayerInfoDataLists().write(1, Collections.singletonList(new PlayerInfoData( - wrappedGameProfile, - 0, - EnumWrappers.NativeGameMode.CREATIVE, - WrappedChatComponent.fromText(name) - ))); - for (final Player p : sendTo) sendPacket(p, info.getHandle()); + NMSHandlers.getHandler().getPacketHandler().sendFakePlayerInfoPacket(skinnedPlayer, entityId, uuid, npcName, sendTo); } /** @@ -319,15 +232,7 @@ public class HMCCPacketManager extends PacketManager { https://wiki.vg/Entity_metadata#Entity */ final byte mask = 0x01 | 0x02 | 0x04 | 0x08 | 0x010 | 0x020 | 0x40; - PacketContainer packet = new PacketContainer(PacketType.Play.Server.ENTITY_METADATA); - packet.getModifier().writeDefaults(); - packet.getIntegers().write(0, playerId); - - final List wrappedDataValueList = Lists.newArrayList(); - wrappedDataValueList.add(new WrappedDataValue(17, WrappedDataWatcher.Registry.get(Byte.class), mask)); - packet.getDataValueCollectionModifier().write(0, wrappedDataValueList); - - for (final Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendSharedEntityData(playerId, Map.of(17, mask), sendTo); } /** @@ -342,9 +247,7 @@ public class HMCCPacketManager extends PacketManager { final UUID uuid, final List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.PLAYER_INFO_REMOVE); - packet.getUUIDLists().write(0, List.of(uuid)); - for (final Player p : sendTo) sendPacket(p, packet); + NMSHandlers.getHandler().getPacketHandler().sendPlayerInfoRemovePacket(uuid, sendTo); } public static void sendLeashPacket( @@ -370,16 +273,43 @@ public class HMCCPacketManager extends PacketManager { final boolean onGround, @NotNull List sendTo ) { - PacketContainer packet = new PacketContainer(PacketType.Play.Server.REL_ENTITY_MOVE); - WrapperPlayServerRelEntityMove wrapper = new WrapperPlayServerRelEntityMove(packet); - wrapper.setEntityID(entityId); - wrapper.setDx(to.getX() - from.getX()); - wrapper.setDy(to.getY() - from.getY()); - wrapper.setDz(to.getZ() - from.getZ()); - wrapper.setOnGround(onGround); - for (final Player p : sendTo) { - sendPacket(p, wrapper.getHandle()); - } + NMSHandlers.getHandler().getPacketHandler().sendMovePacket(entityId, from, to, onGround, sendTo); + } + + // For future transition to display entities + public static void sendDisplayEntityMetadataPacket( + int entityid, + ItemStack backpackItem, + List sendTo) { + // TODO: Make the default values adjustable + Vector3f translation = new Vector3f(0, 3, 0); + Vector3f scale = new Vector3f(1, 1, 1); + Quaternionf rotationLeft = new Quaternionf(); + Quaternionf rotationRight = new Quaternionf(); + Display.Billboard billboard = Display.Billboard.FIXED; + int blockLight = 15; + int skylight = 15; + int viewRange = Settings.getViewDistance(); + int width = 0; + int height = 0; + ItemDisplay.ItemDisplayTransform transform = ItemDisplay.ItemDisplayTransform.HEAD; + + NMSHandlers.getHandler().getPacketHandler().sendItemDisplayMetadata( + entityid, + translation, + scale, + rotationLeft, + rotationRight, + billboard, + blockLight, + skylight, + viewRange, + width, + height, + transform, + backpackItem, + sendTo + ); } /** @@ -391,9 +321,4 @@ public class HMCCPacketManager extends PacketManager { public static List getViewers(@NotNull Location location) { return PacketManager.getViewers(location, Settings.getViewDistance()); } - - public static void sendPacket(Player player, PacketContainer packet) { - if (player == null) return; - ProtocolLibrary.getProtocolManager().sendServerPacket(player, packet, null,false); - } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/AbstractPacket.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/AbstractPacket.java deleted file mode 100644 index 3697424f..00000000 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/AbstractPacket.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.hibiscusmc.hmccosmetics.util.packets.wrappers; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.ProtocolLibrary; -import com.comphenix.protocol.events.PacketContainer; -import com.google.common.base.Objects; -import org.bukkit.entity.Player; - -// Courtesy of Packet Wrapper -public class AbstractPacket { - - // The packet we will be modifying - protected PacketContainer handle; - - /** - * Constructs a new strongly typed wrapper for the given packet. - * - * @param handle - handle to the raw packet data. - * @param type - the packet type. - */ - protected AbstractPacket(PacketContainer handle, PacketType type) { - // Make sure we're given a valid packet - if (handle == null) - throw new IllegalArgumentException("Packet handle cannot be NULL."); - if (!Objects.equal(handle.getType(), type)) - throw new IllegalArgumentException(handle.getHandle() - + " is not a packet of type " + type); - - this.handle = handle; - } - - /** - * Retrieve a handle to the raw packet data. - * - * @return Raw packet data. - */ - public PacketContainer getHandle() { - return handle; - } - - /** - * Send the current packet to the given receiver. - * - * @param receiver - the receiver. - * @throws RuntimeException If the packet cannot be sent. - */ - public void sendPacket(Player receiver) { - ProtocolLibrary.getProtocolManager().sendServerPacket(receiver, - getHandle()); - } - - /** - * Send the current packet to all online players. - */ - public void broadcastPacket() { - ProtocolLibrary.getProtocolManager().broadcastServerPacket(getHandle()); - } - - /** - * Simulate receiving the current packet from the given sender. - * - * @param sender - the sender. - * @throws RuntimeException If the packet cannot be received. - * @deprecated Misspelled. recieve to receive - * @see #receivePacket(Player) - */ - @Deprecated - public void recievePacket(Player sender) { - try { - ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, - getHandle()); - } catch (Exception e) { - throw new RuntimeException("Cannot recieve packet.", e); - } - } - - /** - * Simulate receiving the current packet from the given sender. - * - * @param sender - the sender. - * @throws RuntimeException if the packet cannot be received. - */ - public void receivePacket(Player sender) { - try { - ProtocolLibrary.getProtocolManager().receiveClientPacket(sender, - getHandle()); - } catch (Exception e) { - throw new RuntimeException("Cannot receive packet.", e); - } - } - -} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerNamedEntitySpawn.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerNamedEntitySpawn.java deleted file mode 100644 index 8c76c463..00000000 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerNamedEntitySpawn.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.hibiscusmc.hmccosmetics.util.packets.wrappers; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.bukkit.util.Vector; -import org.jetbrains.annotations.NotNull; - -import java.util.UUID; - -public class WrapperPlayServerNamedEntitySpawn extends AbstractPacket { - public static final PacketType TYPE = - PacketType.Play.Server.NAMED_ENTITY_SPAWN; - - public WrapperPlayServerNamedEntitySpawn() { - super(new PacketContainer(TYPE), TYPE); - handle.getModifier().writeDefaults(); - } - - public WrapperPlayServerNamedEntitySpawn(PacketContainer packet) { - super(packet, TYPE); - } - - /** - * Retrieve Entity ID. - *

- * Notes: entity's ID - * - * @return The current Entity ID - */ - public int getEntityID() { - return handle.getIntegers().read(0); - } - - /** - * Set Entity ID. - * - * @param value - new value. - */ - public void setEntityID(int value) { - handle.getIntegers().write(0, value); - } - - /** - * Retrieve the entity of the painting that will be spawned. - * - * @param world - the current world of the entity. - * @return The spawned entity. - */ - public Entity getEntity(World world) { - return handle.getEntityModifier(world).read(0); - } - - /** - * Retrieve the entity of the painting that will be spawned. - * - * @param event - the packet event. - * @return The spawned entity. - */ - public Entity getEntity(@NotNull PacketEvent event) { - return getEntity(event.getPlayer().getWorld()); - } - - /** - * Retrieve Player UUID. - *

- * Notes: player's UUID - * - * @return The current Player UUID - */ - public UUID getPlayerUUID() { - return handle.getUUIDs().read(0); - } - - /** - * Set Player UUID. - * - * @param value - new value. - */ - public void setPlayerUUID(UUID value) { - handle.getUUIDs().write(0, value); - } - - /** - * Retrieve the position of the spawned entity as a vector. - * - * @return The position as a vector. - */ - public Vector getPosition() { - return new Vector(getX(), getY(), getZ()); - } - - /** - * Set the position of the spawned entity using a vector. - * - * @param position - the new position. - */ - public void setPosition(@NotNull Vector position) { - setX(position.getX()); - setY(position.getY()); - setZ(position.getZ()); - } - - public double getX() { - return handle.getDoubles().read(0); - } - - public void setX(double value) { - handle.getDoubles().write(0, value); - } - - public double getY() { - return handle.getDoubles().read(1); - } - - public void setY(double value) { - handle.getDoubles().write(1, value); - } - - public double getZ() { - return handle.getDoubles().read(2); - } - - public void setZ(double value) { - handle.getDoubles().write(2, value); - } - - /** - * Retrieve the yaw of the spawned entity. - * - * @return The current Yaw - */ - public float getYaw() { - return (handle.getBytes().read(0) * 360.F) / 256.0F; - } - - /** - * Set the yaw of the spawned entity. - * - * @param value - new yaw. - */ - public void setYaw(float value) { - handle.getBytes().write(0, (byte) (value * 256.0F / 360.0F)); - } - - /** - * Retrieve the pitch of the spawned entity. - * - * @return The current pitch - */ - public float getPitch() { - return (handle.getBytes().read(1) * 360.F) / 256.0F; - } - - /** - * Set the pitch of the spawned entity. - * - * @param value - new pitch. - */ - public void setPitch(float value) { - handle.getBytes().write(1, (byte) (value * 256.0F / 360.0F)); - } -} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerPlayerInfo.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerPlayerInfo.java deleted file mode 100644 index abb7a11e..00000000 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerPlayerInfo.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.hibiscusmc.hmccosmetics.util.packets.wrappers; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.wrappers.EnumWrappers.PlayerInfoAction; -import com.comphenix.protocol.wrappers.PlayerInfoData; -import com.hibiscusmc.hmccosmetics.api.HMCCosmeticsAPI; - -import java.util.List; -import java.util.Set; - -public class WrapperPlayServerPlayerInfo extends AbstractPacket { - public static final PacketType TYPE = PacketType.Play.Server.PLAYER_INFO; - - public WrapperPlayServerPlayerInfo() { - super(new PacketContainer(TYPE), TYPE); - handle.getModifier().writeDefaults(); - } - - public WrapperPlayServerPlayerInfo(PacketContainer packet) { - super(packet, TYPE); - } - - public PlayerInfoAction getAction() { - return handle.getPlayerInfoAction().read(0); - } - - public void setAction(PlayerInfoAction value) { - if (HMCCosmeticsAPI.getNMSVersion().contains("v1_17_R1") || HMCCosmeticsAPI.getNMSVersion().contains("v1_18_R2") || HMCCosmeticsAPI.getNMSVersion().contains("v1_19_R1")) { - handle.getPlayerInfoAction().write(0, value); - return; - } - // New way of handling it 1.19.3+ - handle.getPlayerInfoActions().write(0, Set.of(value)); - } - - public List getData() { - return handle.getPlayerInfoDataLists().read(0); - } - - public void setData(List value) { - handle.getPlayerInfoDataLists().write(0, value); - } -} \ No newline at end of file diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerRelEntityMove.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerRelEntityMove.java deleted file mode 100644 index 9e5e4166..00000000 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerRelEntityMove.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.hibiscusmc.hmccosmetics.util.packets.wrappers; - -import com.comphenix.protocol.PacketType; -import com.comphenix.protocol.events.PacketContainer; -import com.comphenix.protocol.events.PacketEvent; -import org.bukkit.World; -import org.bukkit.entity.Entity; -import org.jetbrains.annotations.NotNull; - -public class WrapperPlayServerRelEntityMove extends AbstractPacket { - public static final PacketType TYPE = - PacketType.Play.Server.REL_ENTITY_MOVE; - - public WrapperPlayServerRelEntityMove() { - super(new PacketContainer(TYPE), TYPE); - handle.getModifier().writeDefaults(); - } - - public WrapperPlayServerRelEntityMove(PacketContainer packet) { - super(packet, TYPE); - } - - /** - * Retrieve Entity ID. - *

- * Notes: entity's ID - * - * @return The current Entity ID - */ - public int getEntityID() { - return handle.getIntegers().read(0); - } - - /** - * Set Entity ID. - * - * @param value - new value. - */ - public void setEntityID(int value) { - handle.getIntegers().write(0, value); - } - - /** - * Retrieve the entity of the painting that will be spawned. - * - * @param world - the current world of the entity. - * @return The spawned entity. - */ - public Entity getEntity(World world) { - return handle.getEntityModifier(world).read(0); - } - - /** - * Retrieve the entity of the painting that will be spawned. - * - * @param event - the packet event. - * @return The spawned entity. - */ - public Entity getEntity(@NotNull PacketEvent event) { - return getEntity(event.getPlayer().getWorld()); - } - - /** - * Retrieve DX. - * - * @return The current DX - */ - public double getDx() { - return handle.getShorts().read(0) / 4096D; - } - - /** - * Set DX. - * - * @param value - new value. - */ - public void setDx(double value) { - handle.getShorts().write(0, (short) (value * 4096)); - } - - /** - * Retrieve DY. - * - * @return The current DY - */ - public double getDy() { - return handle.getShorts().read(1) / 4096D; - } - - /** - * Set DY. - * - * @param value - new value. - */ - public void setDy(double value) { - handle.getShorts().write(1, (short) (value * 4096)); - } - - /** - * Retrieve DZ. - * - * @return The current DZ - */ - public double getDz() { - return handle.getShorts().read(2) / 4096D; - } - - /** - * Set DZ. - * - * @param value - new value. - */ - public void setDz(double value) { - handle.getShorts().write(2, (short) (value * 4096)); - } - - /** - * Retrieve the yaw of the current entity. - * - * @return The current Yaw - */ - public float getYaw() { - return (handle.getBytes().read(0) * 360.F) / 256.0F; - } - - /** - * Set the yaw of the current entity. - * - * @param value - new yaw. - */ - public void setYaw(float value) { - handle.getBytes().write(0, (byte) (value * 256.0F / 360.0F)); - } - - /** - * Retrieve the pitch of the current entity. - * - * @return The current pitch - */ - public float getPitch() { - return (handle.getBytes().read(1) * 360.F) / 256.0F; - } - - /** - * Set the pitch of the current entity. - * - * @param value - new pitch. - */ - public void setPitch(float value) { - handle.getBytes().write(1, (byte) (value * 256.0F / 360.0F)); - } - - /** - * Retrieve On Ground. - * - * @return The current On Ground - */ - public boolean getOnGround() { - return handle.getBooleans().read(0); - } - - /** - * Set On Ground. - * - * @param value - new value. - */ - public void setOnGround(boolean value) { - handle.getBooleans().write(0, value); - } -} \ No newline at end of file