diff --git a/.idea/.gitignore b/.idea/.gitignore
deleted file mode 100644
index 26d33521..00000000
--- a/.idea/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-# Default ignored files
-/shelf/
-/workspace.xml
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
deleted file mode 100644
index b50771ba..00000000
--- a/.idea/compiler.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
deleted file mode 100644
index 47a3352b..00000000
--- a/.idea/encodings.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
deleted file mode 100644
index 27954257..00000000
--- a/.idea/jarRepositories.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
deleted file mode 100644
index cff82f00..00000000
--- a/.idea/misc.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/uiDesigner.xml b/.idea/uiDesigner.xml
deleted file mode 100644
index 2b63946d..00000000
--- a/.idea/uiDesigner.xml
+++ /dev/null
@@ -1,124 +0,0 @@
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
- -
-
-
-
-
- -
-
-
- -
-
-
-
-
-
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
deleted file mode 100644
index 83067447..00000000
--- a/.idea/vcs.xml
+++ /dev/null
@@ -1,7 +0,0 @@
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/API/pom.xml b/API/pom.xml
index ae1a1e04..06cec5bf 100644
--- a/API/pom.xml
+++ b/API/pom.xml
@@ -42,7 +42,7 @@
io.papermc.paper
paper-api
- 1.21.5-R0.1-SNAPSHOT
+ 1.21.11-R0.1-SNAPSHOT
provided
diff --git a/API/src/main/java/dev/lrxh/api/NeptuneAPI.java b/API/src/main/java/dev/lrxh/api/NeptuneAPI.java
index 2287df22..321563d7 100644
--- a/API/src/main/java/dev/lrxh/api/NeptuneAPI.java
+++ b/API/src/main/java/dev/lrxh/api/NeptuneAPI.java
@@ -1,7 +1,7 @@
package dev.lrxh.api;
import dev.lrxh.api.arena.IArenaService;
-import dev.lrxh.api.features.ICosmeticService;
+import dev.lrxh.api.features.cosmetics.ICosmeticService;
import dev.lrxh.api.features.IDivisionService;
import dev.lrxh.api.features.IItemBrowserService;
import dev.lrxh.api.kit.IKitService;
diff --git a/API/src/main/java/dev/lrxh/api/NeptuneAPIImpl.java b/API/src/main/java/dev/lrxh/api/NeptuneAPIImpl.java
index f7ff4fc3..789e8af7 100644
--- a/API/src/main/java/dev/lrxh/api/NeptuneAPIImpl.java
+++ b/API/src/main/java/dev/lrxh/api/NeptuneAPIImpl.java
@@ -1,7 +1,7 @@
package dev.lrxh.api;
import dev.lrxh.api.arena.IArenaService;
-import dev.lrxh.api.features.ICosmeticService;
+import dev.lrxh.api.features.cosmetics.ICosmeticService;
import dev.lrxh.api.features.IDivisionService;
import dev.lrxh.api.features.IItemBrowserService;
import dev.lrxh.api.kit.IKitService;
diff --git a/API/src/main/java/dev/lrxh/api/features/ICosmeticService.java b/API/src/main/java/dev/lrxh/api/features/ICosmeticService.java
deleted file mode 100644
index 62d4082b..00000000
--- a/API/src/main/java/dev/lrxh/api/features/ICosmeticService.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package dev.lrxh.api.features;
-
-import java.util.Map;
-
-public interface ICosmeticService {
- Map getDeathMessages();
-
- void registerKillMessage(IKillMessagePackage killMessagePackage);
-}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmetic.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmetic.java
new file mode 100644
index 00000000..38587cf1
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmetic.java
@@ -0,0 +1,8 @@
+package dev.lrxh.api.features.cosmetics;
+
+import java.util.Map;
+
+public interface ICosmetic {
+ String key();
+ Map getPackages();
+}
diff --git a/API/src/main/java/dev/lrxh/api/features/IKillMessagePackage.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticPackage.java
similarity index 60%
rename from API/src/main/java/dev/lrxh/api/features/IKillMessagePackage.java
rename to API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticPackage.java
index 841a3a2d..5baca0c5 100644
--- a/API/src/main/java/dev/lrxh/api/features/IKillMessagePackage.java
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticPackage.java
@@ -1,23 +1,14 @@
-package dev.lrxh.api.features;
+package dev.lrxh.api.features.cosmetics;
import org.bukkit.Material;
import java.util.List;
-public interface IKillMessagePackage {
+public interface ICosmeticPackage {
String getName();
-
String getDisplayName();
-
Material getMaterial();
-
List getDescription();
-
int getSlot();
-
- List getMessages();
-
- String getRandomMessage();
-
String permission();
}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticService.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticService.java
new file mode 100644
index 00000000..bb41f89e
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/ICosmeticService.java
@@ -0,0 +1,13 @@
+package dev.lrxh.api.features.cosmetics;
+
+import dev.lrxh.api.features.cosmetics.armortrims.IArmorTrimPackage;
+import dev.lrxh.api.features.cosmetics.killmessages.IKillMessagePackage;
+
+import java.util.Map;
+
+public interface ICosmeticService {
+ void registerCosmetic(ICosmetic cosmetic);
+ Map getPackages(ICosmetic cosmetic);
+ Map getKillMessagePackages();
+ Map getArmorTrimPackages();
+}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimCosmetic.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimCosmetic.java
new file mode 100644
index 00000000..9c5fc0f1
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimCosmetic.java
@@ -0,0 +1,12 @@
+package dev.lrxh.api.features.cosmetics.armortrims;
+
+import dev.lrxh.api.features.cosmetics.ICosmetic;
+
+import java.util.Map;
+
+public interface IArmorTrimCosmetic extends ICosmetic {
+ Map getPackages();
+ IArmorTrimPackage getDefault();
+ IArmorTrimPackage getOrDefault(String packageName);
+ void addPackage(IArmorTrimPackage cosmeticPackage);
+}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimPackage.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimPackage.java
new file mode 100644
index 00000000..af98d128
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/armortrims/IArmorTrimPackage.java
@@ -0,0 +1,15 @@
+package dev.lrxh.api.features.cosmetics.armortrims;
+
+import dev.lrxh.api.features.cosmetics.ICosmeticPackage;
+import org.bukkit.inventory.meta.trim.ArmorTrim;
+
+public interface IArmorTrimPackage extends ICosmeticPackage {
+ ArmorTrim getHelmetTrim();
+ String getHelmetName();
+ ArmorTrim getChestplateTrim();
+ String getChestplateName();
+ ArmorTrim getLeggingsTrim();
+ String getLeggingsName();
+ ArmorTrim getBootsTrim();
+ String getBootsName();
+}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessageCosmetic.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessageCosmetic.java
new file mode 100644
index 00000000..928c1be1
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessageCosmetic.java
@@ -0,0 +1,12 @@
+package dev.lrxh.api.features.cosmetics.killmessages;
+
+import dev.lrxh.api.features.cosmetics.ICosmetic;
+
+import java.util.Map;
+
+public interface IKillMessageCosmetic extends ICosmetic {
+ Map getPackages();
+ IKillMessagePackage getDefault();
+ IKillMessagePackage getOrDefault(String packageName);
+ void addPackage(IKillMessagePackage killMessagePackage);
+}
diff --git a/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessagePackage.java b/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessagePackage.java
new file mode 100644
index 00000000..d8cb9330
--- /dev/null
+++ b/API/src/main/java/dev/lrxh/api/features/cosmetics/killmessages/IKillMessagePackage.java
@@ -0,0 +1,11 @@
+package dev.lrxh.api.features.cosmetics.killmessages;
+
+import dev.lrxh.api.features.cosmetics.ICosmeticPackage;
+
+import java.util.List;
+
+public interface IKillMessagePackage extends ICosmeticPackage {
+ List getMessages();
+ String getRandomMessage();
+ String permission();
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/Neptune.java b/Plugin/src/main/java/dev/lrxh/neptune/Neptune.java
index 0511a8e3..a553d2d7 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/Neptune.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/Neptune.java
@@ -124,11 +124,8 @@ private void loadManager() {
KitService.get().load();
this.cache = new Cache();
HotbarService.get().load();
-
CosmeticService.get().load();
-
DivisionService.get().load();
-
LeaderboardService.get().load();
registerListeners();
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/configs/ConfigService.java b/Plugin/src/main/java/dev/lrxh/neptune/configs/ConfigService.java
index 551ed1f3..d8f6cf73 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/configs/ConfigService.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/configs/ConfigService.java
@@ -18,6 +18,7 @@ public class ConfigService {
private ConfigFile divisionsConfig;
private ConfigFile cosmeticsConfig;
private ConfigFile killMessagesConfig;
+ private ConfigFile armorTrimsConfig;
private ConfigFile soundsConfig;
public static ConfigService get() {
@@ -37,8 +38,10 @@ public void load() {
divisionsConfig = new ConfigFile("divisions");
cosmeticsConfig = new ConfigFile("cosmetics");
killMessagesConfig = new ConfigFile("kill-messages");
+ armorTrimsConfig = new ConfigFile("armor-trims");
soundsConfig = new ConfigFile("sounds");
+
initialize();
}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/configs/impl/MenusLocale.java b/Plugin/src/main/java/dev/lrxh/neptune/configs/impl/MenusLocale.java
index 4ab2533a..31bca26e 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/configs/impl/MenusLocale.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/configs/impl/MenusLocale.java
@@ -454,6 +454,7 @@ public enum MenusLocale implements IDataAccessor {
"",
" &7Current Kill Effect: &b",
" &7Current Kill Message: &b",
+ " &7Current Armor Trim: &b",
" ",
"&aClick to open cosmetics menu"),
SETTINGS_COSMETICS_SLOT("SETTINGS.SETTINGS.COSMETICS.SLOT", DataType.INT, "15"),
@@ -521,6 +522,35 @@ public enum MenusLocale implements IDataAccessor {
" ",
"",
" ",
+ "&cNo permission"),
+ ARMOR_TRIMS_TITLE("SETTINGS.ARMOR-TRIMS.TITLE", DataType.STRING, "&7Armor Trims"),
+ ARMOR_TRIMS_FILTER("SETTINGS.ARMOR-TRIMS.FILTER-TYPE", "FILL, BORDER, NONE", DataType.STRING, "FILL"),
+ ARMOR_TRIMS_SLOT("SETTINGS.COSMETICS.ARMOR-TRIMS.SLOT", DataType.INT, "12"),
+ ARMOR_TRIMS_NAME("SETTINGS.COSMETICS.ARMOR-TRIMS.NAME", DataType.STRING, "&bArmor Trims"),
+ ARMOR_TRIMS_MATERIAL("SETTINGS.COSMETICS.ARMOR-TRIMS.MATERIAL", DataType.STRING, "NETHERITE_CHESTPLATE"),
+ ARMOR_TRIMS_LORE("SETTINGS.COSMETICS.ARMOR-TRIMS.LORE", DataType.STRING_LIST,
+ "&7View all available armor trims", " ", "&aClick to open"),
+ ARMOR_TRIMS_NAME_SELECTED("SETTINGS.ARMOR-TRIMS.SELECTED.NAME", DataType.STRING,
+ " &7&o(Selected)"),
+ ARMOR_TRIMS_NAME_NOT_SELECTED("SETTINGS.ARMOR-TRIMS.UNSELECTED.NAME", DataType.STRING, ""),
+ ARMOR_TRIMS_DISPLAY_HELMET_MATERIAL("SETTINGS.ARMOR-TRIMS.DISPLAY.HELMET.MATERIAL", DataType.STRING, "netherite_helmet"),
+ ARMOR_TRIMS_DISPLAY_CHESTPLATE_MATERIAL("SETTINGS.ARMOR-TRIMS.DISPLAY.CHESTPLATE.MATERIAL", DataType.STRING, "netherite_chestplate"),
+ ARMOR_TRIMS_DISPLAY_LEGGINGS_MATERIAL("SETTINGS.ARMOR-TRIMS.DISPLAY.LEGGINGS.MATERIAL", DataType.STRING, "netherite_leggings"),
+ ARMOR_TRIMS_DISPLAY_BOOTS_MATERIAL("SETTINGS.ARMOR-TRIMS.DISPLAY.BOOTS.MATERIAL", DataType.STRING, "netherite_boots"),
+ ARMOR_TRIMS_SELECTED_LORE("SETTINGS.ARMOR-TRIMS.SELECTED.LORE", DataType.STRING_LIST,
+ " ",
+ "",
+ " ",
+ "&eCurrently Selected"),
+ ARMOR_TRIMS_UNSELECTED_LORE("SETTINGS.ARMOR-TRIMS.UNSELECTED.LORE", DataType.STRING_LIST,
+ " ",
+ "",
+ " ",
+ "&aClick to select"),
+ ARMOR_TRIMS_NO_PERMISSION_LORE("SETTINGS.ARMOR-TRIMS.NO-PERMISSION.LORE", DataType.STRING_LIST,
+ " ",
+ "",
+ " ",
"&cNo permission");
private final String path;
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/CosmeticService.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/CosmeticService.java
index 0d20790e..0e8b56dd 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/CosmeticService.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/CosmeticService.java
@@ -1,27 +1,25 @@
package dev.lrxh.neptune.feature.cosmetics;
-import dev.lrxh.api.features.ICosmeticService;
-import dev.lrxh.api.features.IKillMessagePackage;
+import dev.lrxh.api.features.cosmetics.ICosmetic;
+import dev.lrxh.api.features.cosmetics.ICosmeticService;
import dev.lrxh.neptune.configs.ConfigService;
-import dev.lrxh.neptune.feature.cosmetics.impl.KillMessagePackage;
+import dev.lrxh.neptune.feature.cosmetics.impl.Cosmetic;
+import dev.lrxh.neptune.feature.cosmetics.impl.CosmeticPackage;
+import dev.lrxh.neptune.feature.cosmetics.impl.armortrims.ArmorTrimCosmetic;
+import dev.lrxh.neptune.feature.cosmetics.impl.armortrims.ArmorTrimPackage;
+import dev.lrxh.neptune.feature.cosmetics.impl.killmessage.KillMessageCosmetic;
+import dev.lrxh.neptune.feature.cosmetics.impl.killmessage.KillMessagePackage;
import dev.lrxh.neptune.providers.manager.IService;
import dev.lrxh.neptune.utils.ConfigFile;
-import org.bukkit.Material;
-import org.bukkit.configuration.file.FileConfiguration;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-import java.util.Objects;
+@SuppressWarnings("ALL")
public class CosmeticService extends IService implements ICosmeticService {
private static CosmeticService instance;
- public final Map deathMessages;
-
- public CosmeticService() {
- this.deathMessages = new HashMap<>();
- load();
- }
+ public Map> cosmetics
+ = new HashMap<>();
public static CosmeticService get() {
if (instance == null) instance = new CosmeticService();
@@ -29,29 +27,10 @@ public static CosmeticService get() {
return instance;
}
- public Map getDeathMessages() {
- return deathMessages.entrySet().stream().collect(HashMap::new, (map, entry) -> map.put(entry.getKey(), entry.getValue()), HashMap::putAll);
- }
-
@Override
public void load() {
- FileConfiguration config = ConfigService.get().getKillMessagesConfig().getConfiguration();
- if (config.contains("KILL_MESSAGES")) {
- for (String deathPackageName : getKeys(config, "KILL_MESSAGES")) {
- String path = "KILL_MESSAGES." + deathPackageName + ".";
- String displayName = config.getString(path + "DISPLAY_NAME");
- Material material = Material.getMaterial(Objects.requireNonNull(config.getString(path + "MATERIAL")));
- List description = config.getStringList(path + "DESCRIPTION");
- int slot = config.getInt(path + "SLOT");
- List messages = config.getStringList(path + "MESSAGES");
-
- deathMessages.put(deathPackageName, new KillMessagePackage(deathPackageName, displayName, material, description, slot, messages));
- }
- }
- }
-
- public void registerKillMessage(IKillMessagePackage killMessagePackage) {
- deathMessages.put(killMessagePackage.getName(), (KillMessagePackage) killMessagePackage);
+ KillMessageCosmetic.get().load();
+ ArmorTrimCosmetic.get().load();
}
@Override
@@ -59,19 +38,22 @@ public void save() {
}
- @Override
- public ConfigFile getConfigFile() {
- return ConfigService.get().getCosmeticsConfig();
+ public void registerCosmetic(ICosmetic cosmetic) {
+ cosmetics.put((Cosmetic) cosmetic, (Map) cosmetic.getPackages());
}
- public KillMessagePackage getDeathMessagePackage(String packageName) {
- if (!deathMessages.containsKey(packageName)) {
- return getDefault();
- }
- return deathMessages.get(packageName);
+ public Map getPackages(ICosmetic cosmetic) {
+ return cosmetics.getOrDefault((Cosmetic) cosmetic, null);
+ }
+ public Map getKillMessagePackages() {
+ return (Map) getPackages(KillMessageCosmetic.get());
+ }
+ public Map getArmorTrimPackages() {
+ return (Map) getPackages(ArmorTrimCosmetic.get());
}
- public KillMessagePackage getDefault() {
- return deathMessages.get("DEFAULT");
+ @Override
+ public ConfigFile getConfigFile() {
+ return ConfigService.get().getCosmeticsConfig();
}
}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillEffect.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/KillEffect.java
similarity index 98%
rename from Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillEffect.java
rename to Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/KillEffect.java
index 8f516306..eb6913b6 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillEffect.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/KillEffect.java
@@ -1,4 +1,4 @@
-package dev.lrxh.neptune.feature.cosmetics.impl;
+package dev.lrxh.neptune.feature.cosmetics;
import dev.lrxh.neptune.configs.impl.CosmeticsLocale;
import dev.lrxh.neptune.utils.RandomUtils;
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/Cosmetic.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/Cosmetic.java
new file mode 100644
index 00000000..ed3cd522
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/Cosmetic.java
@@ -0,0 +1,22 @@
+package dev.lrxh.neptune.feature.cosmetics.impl;
+
+import dev.lrxh.api.features.cosmetics.ICosmetic;
+import dev.lrxh.api.features.cosmetics.ICosmeticPackage;
+import lombok.Getter;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+
+@Getter
+public abstract class Cosmetic implements ICosmetic {
+ public abstract String key();
+ public abstract Map getPackages();
+ public abstract ICosmeticPackage getOrDefault(String packageName);
+ public Set getKeys(FileConfiguration config, String path) {
+ return Objects.requireNonNull(config.getConfigurationSection(path)).getKeys(false);
+ }
+ public abstract YamlConfiguration getConfig();
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/CosmeticPackage.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/CosmeticPackage.java
new file mode 100644
index 00000000..e06b44c5
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/CosmeticPackage.java
@@ -0,0 +1,20 @@
+package dev.lrxh.neptune.feature.cosmetics.impl;
+
+import dev.lrxh.api.features.cosmetics.ICosmeticPackage;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import org.bukkit.Material;
+
+import java.util.List;
+
+@Getter
+@AllArgsConstructor
+public abstract class CosmeticPackage implements ICosmeticPackage {
+ protected final String name;
+ protected final String displayName;
+ protected final Material material;
+ protected final List description;
+ protected final int slot;
+
+ public abstract String permission();
+}
\ No newline at end of file
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillMessagePackage.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillMessagePackage.java
deleted file mode 100644
index c76e52af..00000000
--- a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/KillMessagePackage.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package dev.lrxh.neptune.feature.cosmetics.impl;
-
-import dev.lrxh.api.features.IKillMessagePackage;
-import dev.lrxh.neptune.utils.RandomUtils;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
-import org.bukkit.Material;
-
-import java.util.List;
-
-@Getter
-@AllArgsConstructor
-public class KillMessagePackage implements IKillMessagePackage {
- private String name;
- private String displayName;
- private Material material;
- private List description;
- private int slot;
- private List messages;
-
- public String getRandomMessage() {
- return messages.get(RandomUtils.getRandInt(messages.size()));
- }
-
- public String permission() {
- return "neptune.cosmetics.killmessages." + name.toLowerCase();
- }
-}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimCosmetic.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimCosmetic.java
new file mode 100644
index 00000000..cacd27c1
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimCosmetic.java
@@ -0,0 +1,76 @@
+package dev.lrxh.neptune.feature.cosmetics.impl.armortrims;
+
+import dev.lrxh.api.features.cosmetics.armortrims.IArmorTrimCosmetic;
+import dev.lrxh.api.features.cosmetics.armortrims.IArmorTrimPackage;
+import dev.lrxh.neptune.configs.ConfigService;
+import dev.lrxh.neptune.feature.cosmetics.CosmeticService;
+import dev.lrxh.neptune.feature.cosmetics.impl.Cosmetic;
+import dev.lrxh.neptune.utils.ItemUtils;
+import lombok.Getter;
+import org.bukkit.Material;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+import org.bukkit.inventory.meta.trim.ArmorTrim;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Getter
+public class ArmorTrimCosmetic extends Cosmetic implements IArmorTrimCosmetic {
+ private static ArmorTrimCosmetic instance;
+ public static ArmorTrimCosmetic get() {
+ if (instance == null) instance = new ArmorTrimCosmetic();
+ return instance;
+ }
+
+ public String key() {
+ return "armortrims";
+ }
+
+ private final Map packages = new HashMap<>();
+ public void load() {
+ packages.clear();
+ FileConfiguration armorTrimsConfig = ConfigService.get().getArmorTrimsConfig().getConfiguration();
+ if (!armorTrimsConfig.contains("ARMOR_TRIMS")) return;
+ for (String armorTrimName : getKeys(armorTrimsConfig, "ARMOR_TRIMS")) {
+ String path = "ARMOR_TRIMS." + armorTrimName + ".";
+ String displayName = armorTrimsConfig.getString(path + "DISPLAY_NAME");
+ Material material = ItemUtils.getMaterial(Objects.requireNonNull(armorTrimsConfig.getString(path + "MATERIAL")));
+ List description = armorTrimsConfig.getStringList(path + "DESCRIPTION");
+ int slot = armorTrimsConfig.getInt(path + "SLOT");
+ ArmorTrim helmetTrim = ItemUtils.getArmorTrim(armorTrimsConfig.getString(path + "HELMET.MATERIAL"), armorTrimsConfig.getString(path + "HELMET.PATTERN"));
+ String helmetName = armorTrimsConfig.getString(path + "HELMET.DISPLAY_NAME");
+ ArmorTrim chestplateTrim = ItemUtils.getArmorTrim(armorTrimsConfig.getString(path + "CHESTPLATE.MATERIAL"), armorTrimsConfig.getString(path + "CHESTPLATE.PATTERN"));
+ String chestplateName = armorTrimsConfig.getString(path + "CHESTPLATE.DISPLAY_NAME");
+ ArmorTrim leggingsTrim = ItemUtils.getArmorTrim(armorTrimsConfig.getString(path + "LEGGINGS.MATERIAL"), armorTrimsConfig.getString(path + "LEGGINGS.PATTERN"));
+ String leggingsName = armorTrimsConfig.getString(path + "LEGGINGS.DISPLAY_NAME");
+ ArmorTrim bootsTrim = ItemUtils.getArmorTrim(armorTrimsConfig.getString(path + "BOOTS.MATERIAL"), armorTrimsConfig.getString(path + "BOOTS.PATTERN"));
+ String bootsName = armorTrimsConfig.getString(path + "BOOTS.DISPLAY_NAME");
+
+ packages.put(armorTrimName, new ArmorTrimPackage(
+ armorTrimName, displayName, material, description, slot,
+ helmetTrim, helmetName,
+ chestplateTrim, chestplateName,
+ leggingsTrim, leggingsName,
+ bootsTrim, bootsName));
+ }
+ CosmeticService.get().registerCosmetic(this);
+ }
+
+ public ArmorTrimPackage getDefault() {
+ return packages.get("DEFAULT");
+ }
+ public ArmorTrimPackage getOrDefault(String packageName) {
+ if (packages.containsKey(packageName)) return packages.get(packageName);
+ return getDefault();
+ }
+
+ public void addPackage(IArmorTrimPackage armorTrimPackage) {
+ packages.put(armorTrimPackage.getName(), (ArmorTrimPackage) armorTrimPackage);
+ }
+ public YamlConfiguration getConfig() {
+ return ConfigService.get().getArmorTrimsConfig().getConfiguration();
+ }
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimPackage.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimPackage.java
new file mode 100644
index 00000000..ee9b2ec3
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/armortrims/ArmorTrimPackage.java
@@ -0,0 +1,49 @@
+package dev.lrxh.neptune.feature.cosmetics.impl.armortrims;
+
+import dev.lrxh.api.features.cosmetics.armortrims.IArmorTrimPackage;
+import dev.lrxh.neptune.feature.cosmetics.impl.CosmeticPackage;
+import lombok.Getter;
+import org.bukkit.Material;
+import org.bukkit.inventory.meta.trim.ArmorTrim;
+
+import java.util.List;
+
+@Getter
+public class ArmorTrimPackage extends CosmeticPackage implements IArmorTrimPackage {
+ private final ArmorTrim helmetTrim;
+ private final String helmetName;
+ private final ArmorTrim chestplateTrim;
+ private final String chestplateName;
+ private final ArmorTrim leggingsTrim;
+ private final String leggingsName;
+ private final ArmorTrim bootsTrim;
+ private final String bootsName;
+
+ public ArmorTrimPackage(
+ String name,
+ String displayName,
+ Material material,
+ List description,
+ int slot,
+ ArmorTrim helmetTrim,
+ String helmetName,
+ ArmorTrim chestplateTrim,
+ String chestplateName,
+ ArmorTrim leggingsTrim,
+ String leggingsName,
+ ArmorTrim bootsTrim,
+ String bootsName
+ ) {
+ super(name, displayName, material, description, slot);
+ this.helmetTrim = helmetTrim;
+ this.helmetName = helmetName;
+ this.chestplateTrim = chestplateTrim;
+ this.chestplateName = chestplateName;
+ this.leggingsTrim = leggingsTrim;
+ this.leggingsName = leggingsName;
+ this.bootsTrim = bootsTrim;
+ this.bootsName = bootsName;
+ }
+
+ public String permission() { return "neptune.cosmetics.armortrims." + name.toLowerCase(); }
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessageCosmetic.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessageCosmetic.java
new file mode 100644
index 00000000..95024602
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessageCosmetic.java
@@ -0,0 +1,61 @@
+package dev.lrxh.neptune.feature.cosmetics.impl.killmessage;
+
+import dev.lrxh.api.features.cosmetics.killmessages.IKillMessageCosmetic;
+import dev.lrxh.api.features.cosmetics.killmessages.IKillMessagePackage;
+import dev.lrxh.neptune.configs.ConfigService;
+import dev.lrxh.neptune.feature.cosmetics.impl.Cosmetic;
+import lombok.Getter;
+import org.bukkit.Material;
+import org.bukkit.configuration.file.FileConfiguration;
+import org.bukkit.configuration.file.YamlConfiguration;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+
+@Getter
+public class KillMessageCosmetic extends Cosmetic implements IKillMessageCosmetic {
+ private static KillMessageCosmetic instance;
+ public static KillMessageCosmetic get() {
+ if (instance == null) instance = new KillMessageCosmetic();
+ return instance;
+ }
+
+ public String key() {
+ return "killmessages";
+ }
+
+ public Map packages = new HashMap<>();
+ public void load() {
+ packages.clear();
+ FileConfiguration killMessagesConfig = ConfigService.get().getKillMessagesConfig().getConfiguration();
+ if (killMessagesConfig.contains("KILL_MESSAGES")) {
+ for (String packageName : getKeys(killMessagesConfig, "KILL_MESSAGES")) {
+ String path = "KILL_MESSAGES." + packageName + ".";
+ String displayName = killMessagesConfig.getString(path + "DISPLAY_NAME");
+ Material material = Material.getMaterial(Objects.requireNonNull(killMessagesConfig.getString(path + "MATERIAL")));
+ List description = killMessagesConfig.getStringList(path + "DESCRIPTION");
+ int slot = killMessagesConfig.getInt(path + "SLOT");
+ List messages = killMessagesConfig.getStringList(path + "MESSAGES");
+
+ packages.put(packageName, new KillMessagePackage(packageName, displayName, material, description, slot, messages));
+ }
+ }
+ }
+
+ public KillMessagePackage getDefault() {
+ return packages.get("DEFAULT");
+ }
+ public KillMessagePackage getOrDefault(String packageName) {
+ if (packages.containsKey(packageName)) return packages.get(packageName);
+ return getDefault();
+ }
+
+ public void addPackage(IKillMessagePackage killMessagePackage) {
+ packages.put(killMessagePackage.getName(), (KillMessagePackage) killMessagePackage);
+ }
+ public YamlConfiguration getConfig() {
+ return ConfigService.get().getKillMessagesConfig().getConfiguration();
+ }
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessagePackage.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessagePackage.java
new file mode 100644
index 00000000..8c90602e
--- /dev/null
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/impl/killmessage/KillMessagePackage.java
@@ -0,0 +1,33 @@
+package dev.lrxh.neptune.feature.cosmetics.impl.killmessage;
+
+import dev.lrxh.api.features.cosmetics.killmessages.IKillMessagePackage;
+import dev.lrxh.neptune.feature.cosmetics.impl.CosmeticPackage;
+import dev.lrxh.neptune.utils.RandomUtils;
+import lombok.Getter;
+import org.bukkit.Material;
+
+import java.util.List;
+
+@Getter
+public class KillMessagePackage extends CosmeticPackage implements IKillMessagePackage {
+ private final List messages;
+
+ public KillMessagePackage(
+ String name,
+ String displayName,
+ Material material,
+ List description,
+ int slot,
+ List messages
+ ) {
+ super(name, displayName, material, description, slot);
+ this.messages = messages;
+ }
+
+ public String getRandomMessage() {
+ return messages.get(RandomUtils.getRandInt(messages.size()));
+ }
+ public String permission() {
+ return "neptune.cosmetics.killmessages." + name.toLowerCase();
+ }
+}
diff --git a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/menu/CosmeticsManageMenu.java b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/menu/CosmeticsManageMenu.java
index d41299db..ab5efc8d 100644
--- a/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/menu/CosmeticsManageMenu.java
+++ b/Plugin/src/main/java/dev/lrxh/neptune/feature/cosmetics/menu/CosmeticsManageMenu.java
@@ -1,6 +1,7 @@
package dev.lrxh.neptune.feature.cosmetics.menu;
import dev.lrxh.neptune.configs.impl.MenusLocale;
+import dev.lrxh.neptune.feature.cosmetics.menu.armorTrims.ArmorTrimsMenu;
import dev.lrxh.neptune.feature.cosmetics.menu.killEffects.KillEffectsMenu;
import dev.lrxh.neptune.feature.cosmetics.menu.killMessages.KillMessagesMenu;
import dev.lrxh.neptune.utils.menu.Button;
@@ -34,6 +35,13 @@ public List