From 684e02f768413e0ec5ee9071c036a2266a7cdcba Mon Sep 17 00:00:00 2001 From: Boy0000 Date: Thu, 22 May 2025 21:30:59 +0200 Subject: [PATCH] drop protocollib --- build.gradle.kts | 16 +- common/build.gradle.kts | 5 + .../listener/PlayerGameListener.java | 261 ------------------ .../listener/PlayerPacketListener.java | 27 ++ .../nms/CosmeticChannelHandler.java | 247 +++++++++++++++++ .../hmccosmetics/user/manager/UserEntity.java | 5 +- .../user/manager/UserWardrobeManager.java | 18 +- .../hmccosmetics/util/HMCCInventoryUtils.java | 89 +++--- .../hmccosmetics/util/HMCCPlayerUtils.java | 14 - .../hmccosmetics/util/HMCCServerUtils.java | 14 - .../util/packets/HMCCPacketManager.java | 210 +++++--------- .../util/packets/wrappers/AbstractPacket.java | 92 ------ .../WrapperPlayServerNamedEntitySpawn.java | 165 ----------- .../wrappers/WrapperPlayServerPlayerInfo.java | 44 --- .../WrapperPlayServerRelEntityMove.java | 170 ------------ gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 400 insertions(+), 979 deletions(-) create mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerPacketListener.java create mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/nms/CosmeticChannelHandler.java delete mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/AbstractPacket.java delete mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerNamedEntitySpawn.java delete mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerPlayerInfo.java delete mode 100644 common/src/main/java/com/hibiscusmc/hmccosmetics/util/packets/wrappers/WrapperPlayServerRelEntityMove.java diff --git a/build.gradle.kts b/build.gradle.kts index f4db5eca..40ed94d4 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -69,6 +69,7 @@ allprojects { // Hibiscus Commons maven("https://repo.hibiscusmc.com/releases") + mavenLocal() } dependencies { @@ -77,16 +78,21 @@ allprojects { //compileOnly("org.spigotmc:spigot-api:1.18.2-R0.1-SNAPSHOT") compileOnly("io.papermc.paper:paper-api:1.20.4-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.6.3-32402bd") // Handled by Spigot Library Loader compileOnly("net.kyori:adventure-api:4.19.0") @@ -175,8 +181,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("BetterHud", "ModelEngine", "Nexo", "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/build.gradle.kts b/common/build.gradle.kts index d41ba2e2..f64f8bac 100644 --- a/common/build.gradle.kts +++ b/common/build.gradle.kts @@ -1,6 +1,11 @@ plugins { id("java") id("maven-publish") + id("io.papermc.paperweight.userdev") version "2.0.0-beta.17" +} + +dependencies { + paperweight.paperDevBundle("1.21.4-R0.1-SNAPSHOT") } java { 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/listener/PlayerPacketListener.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerPacketListener.java new file mode 100644 index 00000000..d6cae19b --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/listener/PlayerPacketListener.java @@ -0,0 +1,27 @@ +package com.hibiscusmc.hmccosmetics.listener; + +import com.hibiscusmc.hmccosmetics.nms.CosmeticChannelHandler; +import io.netty.channel.Channel; +import io.netty.channel.ChannelPipeline; +import net.minecraft.network.Connection; +import org.bukkit.craftbukkit.entity.CraftPlayer; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerJoinEvent; + +public class PlayerPacketListener implements Listener { + + @EventHandler + public void onPlayerJoin(PlayerJoinEvent event) { + Player player = event.getPlayer(); + Channel channel = ((CraftPlayer) event.getPlayer()).getHandle().connection.connection.channel; + ChannelPipeline pipeline = channel.pipeline(); + + CosmeticChannelHandler channelHandler = new CosmeticChannelHandler(player); + for (String key : pipeline.toMap().keySet()) { + if (!(pipeline.get(key) instanceof Connection)) continue; + pipeline.addBefore(key, "hmccosmetics_channel_handler", channelHandler); + } + } +} diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/CosmeticChannelHandler.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/CosmeticChannelHandler.java new file mode 100644 index 00000000..65e60db1 --- /dev/null +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/nms/CosmeticChannelHandler.java @@ -0,0 +1,247 @@ +package com.hibiscusmc.hmccosmetics.nms; + +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.HMCCServerUtils; +import com.hibiscusmc.hmccosmetics.util.MessagesUtil; +import com.mojang.datafixers.util.Pair; +import io.netty.buffer.Unpooled; +import io.netty.channel.ChannelDuplexHandler; +import io.netty.channel.ChannelHandlerContext; +import io.netty.channel.ChannelPromise; +import me.lojosho.hibiscuscommons.nms.NMSHandlers; +import net.minecraft.core.NonNullList; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.game.*; +import net.minecraft.network.protocol.status.ClientboundStatusResponsePacket; +import net.minecraft.network.protocol.status.ServerboundStatusRequestPacket; +import net.minecraft.world.inventory.ClickType; +import net.minecraft.world.item.ItemStack; +import org.bukkit.Bukkit; +import org.bukkit.craftbukkit.CraftEquipmentSlot; +import org.bukkit.craftbukkit.inventory.CraftItemStack; +import org.bukkit.entity.Entity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.EquipmentSlot; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Objects; + +public class CosmeticChannelHandler extends ChannelDuplexHandler { + private final Player player; + + public CosmeticChannelHandler(Player player) { + this.player = player; + } + + @Override + public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception { + if (!(msg instanceof Packet packet)) { + super.write(ctx, msg, promise); + return; + } + + switch (packet) { + case ClientboundContainerSetContentPacket setContentPacket -> msg = handleMenuChange(setContentPacket); + case ClientboundContainerSetSlotPacket setSlotPacket -> msg = handleSlotChange(setSlotPacket); + case ClientboundSetEquipmentPacket equipmentPacket -> msg = handlePlayerEquipment(equipmentPacket); + case ClientboundSetPassengersPacket passengerPacket -> msg = handlePassengerSet(passengerPacket); + default -> { + } + } + + if (msg == null) return; + else super.write(ctx, msg, promise); + } + + private Packet handleMenuChange(ClientboundContainerSetContentPacket packet) { + MessagesUtil.sendDebugMessages("Menu Initial "); + int windowId = packet.getContainerId(); + NonNullList slotData = NonNullList.create(); + slotData.addAll(packet.getItems()); + if (windowId != 0) return packet; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) return packet; + + 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()), CraftItemStack.asNMSCopy(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)); + } + } + + MessagesUtil.sendDebugMessages("Menu Fired, updated cosmetics " + " on slotdata " + windowId + " with " + slotData.size()); + return new ClientboundContainerSetContentPacket(0, packet.getStateId(), slotData, packet.getCarriedItem()); + } + + private Packet handleSlotChange(ClientboundContainerSetSlotPacket packet) { + MessagesUtil.sendDebugMessages("SetSlot Initial "); + + int windowId = packet.getContainerId(); + if (windowId != 0) return packet; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || user.isInWardrobe()) return packet; + + int slot = packet.getSlot(); + MessagesUtil.sendDebugMessages("SetSlot Slot " + slot); + CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slot); + EquipmentSlot equipmentSlot = HMCCInventoryUtils.getPacketArmorSlot(slot); + if (cosmeticSlot == null || equipmentSlot == null) return packet; + if (!user.hasCosmeticInSlot(cosmeticSlot)) return packet; + if (Settings.getSlotOption(equipmentSlot).isRequireEmpty()) { + if (!player.getInventory().getItem(equipmentSlot).getType().isAir()) return packet; + } + + ItemStack item = CraftItemStack.asNMSCopy(user.getUserCosmeticItem(cosmeticSlot)); + return new ClientboundContainerSetSlotPacket(0, packet.getStateId(), slot, item); + } + + private Packet handlePlayerEquipment(ClientboundSetEquipmentPacket packet) { + CosmeticUser user = CosmeticUsers.getUser(packet.getEntity()); + if (user == null || user.isInWardrobe()) return packet; + + List> armor = packet.getSlots(); + + for (int i = 0; i < armor.size(); i++) { + Pair pair = armor.get(i); + if (pair.getFirst() == net.minecraft.world.entity.EquipmentSlot.MAINHAND) { + 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.set(i, new Pair<>(pair.getFirst(), CraftItemStack.asNMSCopy(player.getInventory().getItemInMainHand()))); + } else { + EquipmentSlot slot = CraftEquipmentSlot.getSlot(pair.getFirst()); + if (slot == null) continue; + 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 = CraftItemStack.asNMSCopy(user.getUserCosmeticItem(cosmeticSlot)); + if (item == null) continue; + armor.set(i, new Pair<>(pair.getFirst(), item)); + } + } + + MessagesUtil.sendDebugMessages("Equipment for " + user.getPlayer().getName() + " has been updated for " + player.getName()); + return new ClientboundSetEquipmentPacket(packet.getEntity(), armor); + } + + private Packet handlePassengerSet(ClientboundSetPassengersPacket packet) { + CosmeticUser viewerUser = CosmeticUsers.getUser(player); + if (viewerUser == null || viewerUser.isInWardrobe()) return packet; + + int ownerId = packet.getVehicle(); + MessagesUtil.sendDebugMessages("Mount Packet Sent - Read - EntityID: " + ownerId); + Entity entity = HMCCServerUtils.getEntity(ownerId); + if (entity == null) return packet; + + CosmeticUser user = CosmeticUsers.getUser(entity.getUniqueId()); + if (user == null) return packet; + MessagesUtil.sendDebugMessages("Mount Packet Sent - " + user.getUniqueId()); + + if (!user.hasCosmeticInSlot(CosmeticSlot.BACKPACK)) return packet; + if (user.getUserBackpackManager() == null) return packet; + + List passengers = new ArrayList<>(user.getUserBackpackManager().getEntityManager().getIds()); + for (int passenger : packet.getPassengers()) passengers.add(passenger); + + int[] passengerIds = passengers.stream().mapToInt(Integer::intValue).toArray(); + return (Packet) NMSHandlers.getHandler().getPacketHandler().createMountPacket(ownerId, passengerIds); + } + + @Override + public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception { + if (!(msg instanceof Packet packet)) { + super.channelRead(ctx, msg); + return; + } + + switch (packet) { + case ServerboundContainerClickPacket clickPacket -> handleInventoryClick(clickPacket); + case ServerboundPlayerActionPacket playerActionPacket -> msg = handlePlayerAction(playerActionPacket); + case ServerboundSwingPacket swingPacket -> msg = handlePlayerArm(swingPacket); + case ServerboundUseItemOnPacket useItemOnPacket -> msg = handleEntityUse(useItemOnPacket); + default -> { + } + } + + if (msg == null) return; + else super.channelRead(ctx, msg); + + } + + private void handleInventoryClick(ServerboundContainerClickPacket packet) { + ClickType clickType = packet.getClickType(); + int slotClicked = packet.getSlotNum(); + + if (clickType != ClickType.PICKUP || slotClicked == -999) return; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || user.isInWardrobe()) return; + CosmeticSlot cosmeticSlot = HMCCInventoryUtils.NMSCosmeticSlot(slotClicked); + if (cosmeticSlot == null || !user.hasCosmeticInSlot(cosmeticSlot)) return; + + Bukkit.getScheduler().runTaskLater(HMCCosmeticsPlugin.getInstance(), () -> user.updateCosmetic(cosmeticSlot), 1); + MessagesUtil.sendDebugMessages("Packet fired, updated cosmetic " + cosmeticSlot); + } + + private Packet handlePlayerAction(ServerboundPlayerActionPacket packet) { + ServerboundPlayerActionPacket.Action action = packet.getAction(); + + MessagesUtil.sendDebugMessages("EntityStatus Initial " + player.getEntityId() + " - " + action); + if (action != ServerboundPlayerActionPacket.Action.SWAP_ITEM_WITH_OFFHAND) return packet; + + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null) { + MessagesUtil.sendDebugMessages("EntityStatus User is null"); + return packet; + } + if (!user.hasCosmeticInSlot(CosmeticSlot.OFFHAND)) return packet; + + return null; + } + + private Packet handlePlayerArm(ServerboundSwingPacket packet) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || !user.isInWardrobe() || !user.getWardrobeManager().getWardrobeStatus().equals(UserWardrobeManager.WardrobeStatus.RUNNING)) return packet; + + Menu menu = user.getWardrobeManager().getLastOpenMenu(); + if (menu == null) return packet; + menu.openMenu(user); + return null; + } + + private Packet handleEntityUse(ServerboundUseItemOnPacket packet) { + CosmeticUser user = CosmeticUsers.getUser(player); + if (user == null || !user.isInWardrobe()) return packet; + else return null; + } +} 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..4e17ea2b 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 @@ -1,6 +1,5 @@ package com.hibiscusmc.hmccosmetics.user.manager; -import com.hibiscusmc.hmccosmetics.config.Settings; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import com.hibiscusmc.hmccosmetics.util.HMCCPlayerUtils; @@ -80,7 +79,7 @@ public class UserEntity { if (this.getLocation() != null && this.getLocation().getWorld() == location.getWorld()) { // Was thinking about using schedulers to just send the packet later... but that would be a lot of tasks and // would probably cause more lag. Furthermore, the server "ticks" the cosmetics every second by defualt. So it's fine like this. - if (System.currentTimeMillis() - getLastPositionUpdate() <= Settings.getPacketEntityTeleportCooldown()) return; + //if (System.currentTimeMillis() - getLastPositionUpdate() <= Settings.getPacketEntityTeleportCooldown()) return; } this.location = location; for (Integer entity : ids) { @@ -99,7 +98,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..d65bfebe 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,12 @@ 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); + 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 +142,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 @@ -234,7 +234,7 @@ public class UserWardrobeManager { // NPC if (user.isBalloonSpawned()) user.getBalloonManager().sendRemoveLeashPacket(); HMCCPacketManager.sendEntityDestroyPacket(NPC_ID, viewer); // Success - HMCCPacketManager.sendRemovePlayerPacket(player, WARDROBE_UUID, viewer); // Success + HMCCPacketManager.sendRemovePlayerPacket(WARDROBE_UUID, viewer); // Success // Player HMCCPacketManager.sendCameraPacket(player.getEntityId(), viewer); @@ -247,11 +247,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,7 +311,7 @@ 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)); @@ -323,10 +323,11 @@ public class UserWardrobeManager { HMCCPacketManager.equipmentSlotUpdate(NPC_ID, user, slot, viewer); } + // Handle backpacks if (user.hasCosmeticInSlot(CosmeticSlot.BACKPACK) && user.getUserBackpackManager() != null) { HMCCPacketManager.sendTeleportPacket(user.getUserBackpackManager().getFirstArmorStandId(), location, false, viewer); HMCCPacketManager.ridingMountPacket(NPC_ID, user.getUserBackpackManager().getFirstArmorStandId(), viewer); - user.getUserBackpackManager().getEntityManager().setRotation(nextyaw); + //user.getUserBackpackManager().getEntityManager().setRotation(nextyaw); HMCCPacketManager.sendEntityDestroyPacket(user.getUserBackpackManager().getFirstArmorStandId(), outsideViewers); } @@ -358,5 +359,4 @@ public class UserWardrobeManager { RUNNING, STOPPING, } - } 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..45fc1cb3 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,17 +50,17 @@ 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 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) { @@ -147,31 +130,31 @@ 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 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; 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/HMCCServerUtils.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCServerUtils.java index 8c244c93..cf43ae49 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCServerUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCServerUtils.java @@ -18,20 +18,6 @@ public class HMCCServerUtils { private static String COLOR_CHAR = "&"; - /** - * Converts a bukkit gamemode into an integer for use in packets - * @param gamemode Bukkit gamemode to convert. - * @return int of the gamemode - */ - public static int convertGamemode(final GameMode gamemode) { - return switch (gamemode) { - case SURVIVAL -> 0; - case CREATIVE -> 1; - case ADVENTURE -> 2; - case SPECTATOR -> 3; - }; - } - public static org.bukkit.entity.Entity getEntity(int entityId) { return NMSHandlers.getHandler().getUtilHandler().getEntity(entityId); } 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..ef577cac 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,30 +1,27 @@ 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.nms.NMSHandlers; import me.lojosho.hibiscuscommons.util.packets.PacketManager; import org.bukkit.Location; import org.bukkit.Material; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; +import org.bukkit.entity.*; 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.*; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; public class HMCCPacketManager extends PacketManager { @@ -46,16 +43,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( @@ -97,53 +85,20 @@ public class HMCCPacketManager extends PacketManager { equipmentSlotUpdate(entityId, HMCCInventoryUtils.getEquipmentSlot(cosmeticSlot), user.getUserCosmeticItem(cosmeticSlot), sendTo); } - public static void sendArmorstandMetadata( - 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(); - + public static void sendArmorstandMetadata(int entityId, List sendTo) { // 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); + public static void sendInvisibilityPacket(int entityId, List sendTo) { + 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); + public static void sendCloudEffect(int entityId, List sendTo) { + Map dataValues = Map.of(0, (byte) 0x20, 8, 0f); + NMSHandlers.getHandler().getPacketHandler().sendSharedEntityData(entityId, dataValues, sendTo); } public static void sendRotationPacket( @@ -161,16 +116,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,15 +129,7 @@ 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); } @@ -216,12 +157,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 +187,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 +200,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,32 +227,20 @@ 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); } /** * Removes a fake player from being seen by players. - * @param player Which gameprofile to wrap for removing the player. * @param uuid What is the fake player UUID * @param sendTo Whom to send the packet to */ @SuppressWarnings("deprecation") public static void sendRemovePlayerPacket( - final Player player, 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 +266,39 @@ 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); + } + + 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 +310,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 diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index cea7a793..ca025c83 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-8.12-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.14-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME