diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/HMCCosmeticsAPI.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/HMCCosmeticsAPI.java index 00e91bbe..39331b2f 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/api/HMCCosmeticsAPI.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/api/HMCCosmeticsAPI.java @@ -11,6 +11,7 @@ import com.hibiscusmc.hmccosmetics.user.CosmeticUserProvider; import com.hibiscusmc.hmccosmetics.user.CosmeticUsers; import lombok.Getter; import me.lojosho.hibiscuscommons.nms.NMSHandlers; +import me.lojosho.shaded.configurate.ConfigurationNode; import org.bukkit.Color; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; @@ -19,6 +20,7 @@ import org.jetbrains.annotations.Nullable; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.function.BiConsumer; /** * The main API class for HMCCosmetics. This class provides methods to interact with the plugin. @@ -144,8 +146,8 @@ public final class HMCCosmeticsAPI { * @param id the id for the cosmetic slot * @return the {@link CosmeticSlot} associated with the given id */ - public static @NotNull CosmeticSlot registerCosmeticSlot(@NotNull String id) { - return CosmeticSlot.register(id); + public static @NotNull CosmeticSlot registerCosmeticSlot(@NotNull String id, BiConsumer consumer) { + return CosmeticSlot.register(id, consumer); } /** diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/CosmeticSlot.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/CosmeticSlot.java index 6aff3ca9..33da4539 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/CosmeticSlot.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/CosmeticSlot.java @@ -1,30 +1,44 @@ package com.hibiscusmc.hmccosmetics.cosmetic; +import com.hibiscusmc.hmccosmetics.cosmetic.types.*; +import me.lojosho.shaded.configurate.ConfigurationNode; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.function.BiConsumer; +import java.util.function.Consumer; public class CosmeticSlot { private static final ConcurrentHashMap REGISTRY = new ConcurrentHashMap<>(); - public static final CosmeticSlot HELMET = register("HELMET"); - public static final CosmeticSlot CHESTPLATE = register("CHESTPLATE"); - public static final CosmeticSlot LEGGINGS = register("LEGGINGS"); - public static final CosmeticSlot BOOTS = register("BOOTS"); - public static final CosmeticSlot MAINHAND = register("MAINHAND"); - public static final CosmeticSlot OFFHAND = register("OFFHAND"); - public static final CosmeticSlot BACKPACK = register("BACKPACK"); - public static final CosmeticSlot BALLOON = register("BALLOON"); - public static final CosmeticSlot EMOTE = register("EMOTE"); - public static final CosmeticSlot CUSTOM = register("CUSTOM"); + public static final CosmeticSlot HELMET = register("HELMET", CosmeticArmorType::new); + public static final CosmeticSlot CHESTPLATE = register("CHESTPLATE", CosmeticArmorType::new); + public static final CosmeticSlot LEGGINGS = register("LEGGINGS", CosmeticArmorType::new); + public static final CosmeticSlot BOOTS = register("BOOTS", CosmeticArmorType::new); + public static final CosmeticSlot MAINHAND = register("MAINHAND", CosmeticMainhandType::new); + public static final CosmeticSlot OFFHAND = register("OFFHAND", CosmeticArmorType::new); + public static final CosmeticSlot BACKPACK = register("BACKPACK", CosmeticBackpackType::new); + public static final CosmeticSlot BALLOON = register("BALLOON", CosmeticBalloonType::new); + public static final CosmeticSlot EMOTE = register("EMOTE", CosmeticEmoteType::new); private final String name; + private final BiConsumer consumer; - private CosmeticSlot(@NotNull String name) { + private CosmeticSlot(@NotNull String name, @NotNull BiConsumer consumer) { this.name = name; + this.consumer = consumer; + } + + /** + * Accepts the given id and configuration node to run the consumer relating to the ConsumerSlot + * @param id The id of the cosmetic + * @param config The configuration node of the cosmetic + */ + public void accept(@NotNull String id, @NotNull ConfigurationNode config) { + consumer.accept(id, config); } /** @@ -33,9 +47,9 @@ public class CosmeticSlot { * @return The slot that was registered or already exists. */ @NotNull - public static CosmeticSlot register(@NotNull String name) { + public static CosmeticSlot register(@NotNull String name, @NotNull BiConsumer consumer) { name = name.toUpperCase(); - return REGISTRY.computeIfAbsent(name, key -> new CosmeticSlot(key)); + return REGISTRY.computeIfAbsent(name, key -> new CosmeticSlot(key, consumer)); } /** diff --git a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java index 6f2159ef..ad24b51b 100644 --- a/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java +++ b/common/src/main/java/com/hibiscusmc/hmccosmetics/cosmetic/Cosmetics.java @@ -102,18 +102,12 @@ public class Cosmetics { continue; } String slot = slotNode.getString(""); - if (!CosmeticSlot.contains(slot)) { + CosmeticSlot cosmeticSlot = CosmeticSlot.valueOf(slot); + if (cosmeticSlot == null) { MessagesUtil.sendDebugMessages("Unable to create " + id + " because " + slotNode.getString() + " is not a valid slot!", Level.WARNING); continue; } - switch (slot) { - case "BALLOON" -> new CosmeticBalloonType(id, cosmeticConfig); - case "BACKPACK" -> new CosmeticBackpackType(id, cosmeticConfig); - case "MAINHAND" -> new CosmeticMainhandType(id, cosmeticConfig); - case "EMOTE" -> new CosmeticEmoteType(id, cosmeticConfig); - case "HELMET", "CHESTPLATE", "LEGGINGS", "BOOTS", "OFFHAND" -> new CosmeticArmorType(id, cosmeticConfig); - default -> new CosmeticTypeRegisterEvent(id, cosmeticConfig).callEvent(); - } + cosmeticSlot.accept(id, cosmeticConfig); } } } \ No newline at end of file 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 0d3649e5..f145afa5 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 @@ -28,6 +28,8 @@ import java.util.*; public class HMCCPacketManager extends PacketManager { + private static final List EQUIPMENT_SLOTS = List.of(CosmeticSlot.HELMET, CosmeticSlot.CHESTPLATE, CosmeticSlot.LEGGINGS, CosmeticSlot.BOOTS, CosmeticSlot.MAINHAND, CosmeticSlot.OFFHAND); + public static void sendEntitySpawnPacket( final @NotNull Location location, final int entityId, @@ -91,8 +93,7 @@ public class HMCCPacketManager extends PacketManager { CosmeticSlot cosmeticSlot, List sendTo ) { - if (cosmeticSlot == CosmeticSlot.BACKPACK || cosmeticSlot == CosmeticSlot.CUSTOM || cosmeticSlot == CosmeticSlot.BALLOON || cosmeticSlot == CosmeticSlot.EMOTE) return; - + if (!EQUIPMENT_SLOTS.contains(cosmeticSlot)) return; equipmentSlotUpdate(entityId, HMCCInventoryUtils.getEquipmentSlot(cosmeticSlot), user.getUserCosmeticItem(cosmeticSlot), sendTo); }