From 02d869dc01817c1a69b07eaf4ee5f7cd2476c214 Mon Sep 17 00:00:00 2001 From: Logan Date: Wed, 31 Dec 2025 14:00:26 -0600 Subject: [PATCH] feat: add option to add glide item component when player has elytra equipped --- .../hibiscusmc/hmccosmetics/config/Settings.java | 5 +++-- .../config/section/SlotOptionConfig.java | 5 ++++- .../cosmetic/types/CosmeticArmorType.java | 16 ++++++++++++++-- .../hmccosmetics/util/HMCCInventoryUtils.java | 11 +++++++++++ common/src/main/resources/config.yml | 1 + 5 files changed, 33 insertions(+), 5 deletions(-) diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java index c323eda9..6d6a6e30 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/Settings.java @@ -205,7 +205,8 @@ public class Settings { } boolean addEnchantments = value.node("add-enchantments").getBoolean(false); boolean requireEmpty = value.node("require-empty").getBoolean(false); - slotOptions.put(slot, new SlotOptionConfig(slot, addEnchantments, requireEmpty)); + boolean addElytraComponent = value.node("add-elytra-componnt").getBoolean(true); + slotOptions.put(slot, new SlotOptionConfig(slot, addEnchantments, requireEmpty, addElytraComponent)); }); tickPeriod = cosmeticSettings.node(TICK_PERIOD_PATH).getInt(-1); @@ -270,7 +271,7 @@ public class Settings { } public static SlotOptionConfig getSlotOption(EquipmentSlot slot) { - if (!slotOptions.containsKey(slot)) slotOptions.put(slot, new SlotOptionConfig(slot, false, false)); + if (!slotOptions.containsKey(slot)) slotOptions.put(slot, new SlotOptionConfig(slot, false, false, false)); return slotOptions.get(slot); } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/section/SlotOptionConfig.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/section/SlotOptionConfig.java index d984c81a..28764ee5 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/config/section/SlotOptionConfig.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/config/section/SlotOptionConfig.java @@ -11,10 +11,13 @@ public class SlotOptionConfig { private final boolean addEnchantments; @Getter private final boolean requireEmpty; + @Getter + private final boolean addElytraComponent; - public SlotOptionConfig(EquipmentSlot slot, boolean addEnchantments, boolean requireEmpty) { + public SlotOptionConfig(EquipmentSlot slot, boolean addEnchantments, boolean requireEmpty, boolean addElytraComponent) { this.slot = slot; this.addEnchantments = addEnchantments; this.requireEmpty = requireEmpty; + this.addElytraComponent = addElytraComponent; } } diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java index ab20cc01..2c20b5f3 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/types/CosmeticArmorType.java @@ -1,11 +1,16 @@ package com.hibiscusmc.hmccosmetics.cosmetic.types; +import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.config.Settings; import com.hibiscusmc.hmccosmetics.cosmetic.Cosmetic; import com.hibiscusmc.hmccosmetics.cosmetic.behavior.CosmeticUpdateBehavior; import com.hibiscusmc.hmccosmetics.user.CosmeticUser; import com.hibiscusmc.hmccosmetics.util.HMCCInventoryUtils; +import com.hibiscusmc.hmccosmetics.util.MessagesUtil; import com.hibiscusmc.hmccosmetics.util.packets.HMCCPacketManager; +import io.papermc.paper.datacomponent.DataComponentType; +import io.papermc.paper.datacomponent.DataComponentTypes; +import me.lojosho.hibiscuscommons.HibiscusCommonsPlugin; import me.lojosho.hibiscuscommons.util.packets.PacketManager; import me.lojosho.shaded.configurate.ConfigurationNode; import org.bukkit.Bukkit; @@ -16,6 +21,8 @@ import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; +import java.util.logging.Level; + public class CosmeticArmorType extends Cosmetic implements CosmeticUpdateBehavior { private final EquipmentSlot equipSlot; @@ -51,9 +58,14 @@ public class CosmeticArmorType extends Cosmetic implements CosmeticUpdateBehavio Player player = user.getPlayer(); if (player == null) return null; + ItemStack physicalEquippedItem = player.getInventory().getItem(equipSlot); if (Settings.getSlotOption(equipSlot).isAddEnchantments()) { - ItemStack equippedItem = player.getInventory().getItem(equipSlot); - cosmeticItem.addUnsafeEnchantments(equippedItem.getEnchantments()); + cosmeticItem.addUnsafeEnchantments(physicalEquippedItem.getEnchantments()); + } + if (Settings.getSlotOption(equipSlot).isAddElytraComponent() + && HibiscusCommonsPlugin.isOnPaper() + && HMCCInventoryUtils.isGlider(physicalEquippedItem)) { + cosmeticItem.editMeta(itemMeta -> itemMeta.setGlider(true)); } // Basically, if force offhand is off AND there is no item in an offhand slot, then the equipment packet to add the cosmetic return cosmeticItem; 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 d97ec701..dc88c0ae 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/util/HMCCInventoryUtils.java @@ -2,9 +2,11 @@ package com.hibiscusmc.hmccosmetics.util; import com.hibiscusmc.hmccosmetics.HMCCosmeticsPlugin; import com.hibiscusmc.hmccosmetics.cosmetic.CosmeticSlot; +import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.persistence.PersistentDataType; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.NotNull; @@ -136,4 +138,13 @@ public class HMCCInventoryUtils { public static List getPlayerArmorSlots() { return Arrays.asList(EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET, EquipmentSlot.OFF_HAND, EquipmentSlot.HAND); } + + public static boolean isGlider(@NotNull ItemStack itemStack) { + Material type = itemStack.getType(); + if (type.isAir()) return false; + if (type == Material.ELYTRA) return true; // Hacky + ItemMeta itemMeta = itemStack.getItemMeta(); + if (itemMeta == null) return false; + return itemMeta.isGlider(); + } } diff --git a/common/src/main/resources/config.yml b/common/src/main/resources/config.yml index ad161b2d..bde86ca7 100644 --- a/common/src/main/resources/config.yml +++ b/common/src/main/resources/config.yml @@ -68,6 +68,7 @@ cosmetic-settings: chestplate: add-enchantments: false require-empty: false + add-elytra-componnt: true leggings: add-enchantments: false require-empty: false