diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
index c7596ecc..b981a7cd 100644
--- a/.idea/jarRepositories.xml
+++ b/.idea/jarRepositories.xml
@@ -56,5 +56,10 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/modules/HMCCosmetics.iml b/.idea/modules/HMCCosmetics.iml
new file mode 100644
index 00000000..85578b10
--- /dev/null
+++ b/.idea/modules/HMCCosmetics.iml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+ MCP
+ ADVENTURE
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
new file mode 100644
index 00000000..797acea5
--- /dev/null
+++ b/.idea/runConfigurations.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
index b874c4e6..2a02bd20 100644
--- a/build.gradle
+++ b/build.gradle
@@ -15,6 +15,7 @@ repositories {
maven { url = 'https://repo.dmulloy2.net/repository/public/' }
maven { url = 'https://repo.extendedclip.com/content/repositories/placeholderapi/' }
maven { url = 'https://mvnrepository.com/artifact/com.zaxxer/HikariCP' }
+ maven { url = 'https://repo.jeff-media.de/maven2/' }
}
dependencies {
@@ -25,6 +26,7 @@ dependencies {
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.0'
compileOnly 'net.kyori:adventure-api:4.9.3'
compileOnly 'me.clip:placeholderapi:2.11.1'
+ compileOnly 'com.github.oraxen:oraxen:-SNAPSHOT'
implementation 'net.kyori:adventure-text-minimessage:4.2.0-SNAPSHOT'
implementation 'net.kyori:adventure-platform-bukkit:4.0.0'
implementation 'dev.triumphteam:triumph-gui:3.0.3'
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
index acf83cca..1df47fb4 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/HMCCosmetics.java
@@ -35,7 +35,6 @@ public class HMCCosmetics extends JavaPlugin {
private MessageHandler messageHandler;
private CosmeticsMenu cosmeticsMenu;
private CommandManager commandManager;
- private boolean papiEnabled;
private Database database;
@Override
@@ -56,8 +55,6 @@ public class HMCCosmetics extends JavaPlugin {
this.database = DatabaseFactory.create(this);
this.database.load();
- this.papiEnabled = Bukkit.getPluginManager().getPlugin("PlaceholderAPI") != null;
-
this.registerCommands();
this.registerListeners();
}
@@ -126,9 +123,5 @@ public class HMCCosmetics extends JavaPlugin {
public Database getDatabase() {
return database;
}
-
- public boolean isPapiEnabled() {
- return papiEnabled;
- }
}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java
index 408f93fb..a58d7d7d 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/GuiSerializer.java
@@ -4,8 +4,6 @@ import dev.triumphteam.gui.guis.GuiItem;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
import io.github.fisher2911.hmccosmetics.gui.CosmeticGui;
import io.github.fisher2911.hmccosmetics.message.Adventure;
-import io.github.fisher2911.hmccosmetics.papi.PAPIHook;
-import io.github.fisher2911.hmccosmetics.util.StringUtils;
import org.checkerframework.checker.nullness.qual.Nullable;
import org.spongepowered.configurate.ConfigurationNode;
import org.spongepowered.configurate.serialize.SerializationException;
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java b/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java
index 85f1530c..fb3a97b1 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/config/ItemSerializer.java
@@ -3,6 +3,7 @@ package io.github.fisher2911.hmccosmetics.config;
import dev.triumphteam.gui.guis.GuiItem;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
+import io.github.fisher2911.hmccosmetics.hook.HookManager;
import io.github.fisher2911.hmccosmetics.message.Adventure;
import io.github.fisher2911.hmccosmetics.util.Keys;
import io.github.fisher2911.hmccosmetics.util.StringUtils;
@@ -96,9 +97,19 @@ public class ItemSerializer implements TypeSerializer {
final ConfigurationNode dyeableNode = source.node(DYEABLE);
- final Material material = Utils.stringToEnum(Utils.replaceIfNull(materialNode.getString(), ""),
- Material.class, Material.AIR);
+ final String materialString = Utils.replaceIfNull(materialNode.getString(), "");
final int amount = amountNode.getInt();
+
+ ItemStack itemStack;
+
+ try {
+ itemStack = new ItemStack(Material.valueOf(materialString), amount);
+ } catch (final IllegalArgumentException exception) {
+ itemStack = HookManager.getInstance().getItemHooks().getItemStack(materialString);
+ if (itemStack == null) itemStack = new ItemStack(Material.AIR);
+ }
+
+
final Component name = StringUtils.parse(nameNode.getString());
final boolean unbreakable = unbreakableNode.getBoolean();
@@ -162,7 +173,7 @@ public class ItemSerializer implements TypeSerializer {
final ItemBuilder itemBuilder;
- if (material == Material.PLAYER_HEAD) {
+ if (itemStack.getType() == Material.PLAYER_HEAD) {
itemBuilder = SkullBuilder.
create();
@@ -172,16 +183,16 @@ public class ItemSerializer implements TypeSerializer {
final OfflinePlayer player = Bukkit.getOfflinePlayer(owner);
((SkullBuilder) itemBuilder).owner(player);
}
- } else if (ColorBuilder.canBeColored(material)) {
- itemBuilder = ColorBuilder.from(material);
+ } else if (ColorBuilder.canBeColored(itemStack)) {
+ itemBuilder = ColorBuilder.from(itemStack);
if (color != null) {
((ColorBuilder) itemBuilder).color(color);
}
} else {
- itemBuilder = ItemBuilder.from(material);
+ itemBuilder = ItemBuilder.from(itemStack);
}
- final ItemStack itemStack = itemBuilder.
+ itemStack = itemBuilder.
amount(amount).
name(name).
unbreakable(unbreakable).
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java b/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
index c23c5c9f..8307b9b3 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/database/Database.java
@@ -5,6 +5,7 @@ import io.github.fisher2911.hmccosmetics.cosmetic.CosmeticManager;
import io.github.fisher2911.hmccosmetics.gui.ArmorItem;
import io.github.fisher2911.hmccosmetics.inventory.PlayerArmor;
import io.github.fisher2911.hmccosmetics.user.User;
+import org.bukkit.Bukkit;
import java.sql.Connection;
import java.sql.PreparedStatement;
@@ -49,6 +50,7 @@ public abstract class Database {
}
public void saveUser(final User user) {
+
try (final PreparedStatement statement = this.getConnection().prepareStatement(this.getSaveStatement())) {
final PlayerArmor playerArmor = user.getPlayerArmor();
final String hat = playerArmor.getHat().getId();
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/Hook.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/Hook.java
new file mode 100644
index 00000000..4a1f6ff4
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/Hook.java
@@ -0,0 +1,7 @@
+package io.github.fisher2911.hmccosmetics.hook;
+
+public interface Hook {
+
+ String getId();
+
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/HookManager.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/HookManager.java
new file mode 100644
index 00000000..b7be4454
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/HookManager.java
@@ -0,0 +1,65 @@
+package io.github.fisher2911.hmccosmetics.hook;
+
+import io.github.fisher2911.hmccosmetics.hook.item.ItemHook;
+import io.github.fisher2911.hmccosmetics.hook.item.ItemHooks;
+import io.github.fisher2911.hmccosmetics.hook.item.OraxenHook;
+import org.bukkit.Bukkit;
+import org.bukkit.plugin.PluginManager;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+public class HookManager {
+
+ private static HookManager INSTANCE;
+
+ static {
+ INSTANCE = new HookManager();
+ }
+
+ public static HookManager getInstance() {
+ return INSTANCE;
+ }
+
+ private final ItemHooks itemHooks;
+ private final PAPIHook papiHook;
+ private final Set> registeredHooks;
+
+ private HookManager() {
+ this.registeredHooks = new HashSet<>();
+ final PluginManager pluginManager = Bukkit.getPluginManager();
+ if (pluginManager.getPlugin("PlaceholderApi") != null) {
+ this.registeredHooks.add(PAPIHook.class);
+ this.papiHook = new PAPIHook();
+ } else {
+ this.papiHook = null;
+ }
+
+ final Map itemHookMap = new HashMap<>();
+ final OraxenHook oraxenHook = new OraxenHook();
+ if (pluginManager.getPlugin("Oraxen") != null) itemHookMap.put(oraxenHook.getIdentifier(), oraxenHook);
+ this.itemHooks = new ItemHooks(itemHookMap);
+
+ itemHookMap.values().forEach(hook -> this.registerHook(hook.getClass()));
+ }
+
+ protected void registerHook(final Class extends Hook> hook) {
+ this.registeredHooks.add(hook);
+ }
+
+ public boolean isEnabled(final Class extends Hook> hook) {
+ return this.registeredHooks.contains(hook);
+ }
+
+ @Nullable
+ public PAPIHook getPapiHook() {
+ return papiHook;
+ }
+
+ public ItemHooks getItemHooks() {
+ return itemHooks;
+ }
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/PAPIHook.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/PAPIHook.java
new file mode 100644
index 00000000..d54a8a6f
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/PAPIHook.java
@@ -0,0 +1,19 @@
+package io.github.fisher2911.hmccosmetics.hook;
+
+import me.clip.placeholderapi.PlaceholderAPI;
+import org.bukkit.entity.Player;
+
+public class PAPIHook implements Hook {
+
+ private static final String ID = "PAPI";
+
+ @Override
+ public String getId() {
+ return ID;
+ }
+
+ public String parse(final Player player, final String string) {
+ return PlaceholderAPI.setPlaceholders(player, string);
+ }
+
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHook.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHook.java
new file mode 100644
index 00000000..c604872a
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHook.java
@@ -0,0 +1,11 @@
+package io.github.fisher2911.hmccosmetics.hook.item;
+
+import io.github.fisher2911.hmccosmetics.hook.Hook;
+import org.bukkit.inventory.ItemStack;
+
+public interface ItemHook extends Hook {
+
+ String getIdentifier();
+
+ ItemStack getItem(final String id);
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHooks.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHooks.java
new file mode 100644
index 00000000..c9ba4258
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/ItemHooks.java
@@ -0,0 +1,37 @@
+package io.github.fisher2911.hmccosmetics.hook.item;
+
+import io.github.fisher2911.hmccosmetics.HMCCosmetics;
+import io.github.fisher2911.hmccosmetics.hook.HookManager;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class ItemHooks {
+
+ private final Map itemHookMap;
+
+ public ItemHooks(final Map itemHookMap) {
+ this.itemHookMap = itemHookMap;
+ }
+
+ @Nullable
+ public ItemStack getItemStack(final String item) {
+ final String[] parts = item.split(":");
+
+ if (parts.length != 2) return null;
+
+ final String identifier = parts[0];
+ final String itemId = parts[1];
+
+ final ItemHook hook = this.itemHookMap.get(identifier);
+
+
+ if (hook == null) return null;
+
+ return hook.getItem(itemId);
+ }
+
+
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/OraxenHook.java b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/OraxenHook.java
new file mode 100644
index 00000000..6991311f
--- /dev/null
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/hook/item/OraxenHook.java
@@ -0,0 +1,29 @@
+package io.github.fisher2911.hmccosmetics.hook.item;
+
+import io.github.fisher2911.hmccosmetics.hook.Hook;
+import io.th0rgal.oraxen.items.ItemBuilder;
+import io.th0rgal.oraxen.items.OraxenItems;
+import org.bukkit.inventory.ItemStack;
+
+public class OraxenHook implements ItemHook {
+
+ public static final String ID = "ORAXEN";
+ private static final String IDENTIFIER = "oraxen";
+
+ @Override
+ public String getId() {
+ return ID;
+ }
+
+ @Override
+ public String getIdentifier() {
+ return IDENTIFIER;
+ }
+
+ @Override
+ public ItemStack getItem(final String id) {
+ final ItemBuilder itemBuilder = OraxenItems.getItemById(id);
+ if (itemBuilder == null) return null;
+ return itemBuilder.build();
+ }
+}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java b/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java
index 1a4c8d41..a7a2742e 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/message/MessageHandler.java
@@ -1,7 +1,6 @@
package io.github.fisher2911.hmccosmetics.message;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
-import io.github.fisher2911.hmccosmetics.papi.PAPIHook;
import io.github.fisher2911.hmccosmetics.util.StringUtils;
import io.github.fisher2911.hmccosmetics.util.Utils;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java b/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java
deleted file mode 100644
index c1e855fa..00000000
--- a/src/main/java/io/github/fisher2911/hmccosmetics/papi/PAPIHook.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package io.github.fisher2911.hmccosmetics.papi;
-
-import me.clip.placeholderapi.PlaceholderAPI;
-import org.bukkit.entity.Player;
-
-public class PAPIHook {
-
- public static String parse(final Player player, final String string) {
- return PlaceholderAPI.setPlaceholders(player, string);
- }
-
-}
diff --git a/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java b/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java
index 7158a31d..41df7068 100644
--- a/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java
+++ b/src/main/java/io/github/fisher2911/hmccosmetics/util/StringUtils.java
@@ -1,10 +1,10 @@
package io.github.fisher2911.hmccosmetics.util;
import io.github.fisher2911.hmccosmetics.HMCCosmetics;
+import io.github.fisher2911.hmccosmetics.hook.HookManager;
import io.github.fisher2911.hmccosmetics.message.Adventure;
-import io.github.fisher2911.hmccosmetics.papi.PAPIHook;
+import io.github.fisher2911.hmccosmetics.hook.PAPIHook;
import net.kyori.adventure.text.Component;
-import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.Nullable;
@@ -32,8 +32,8 @@ public class StringUtils {
}
public static String applyPapiPlaceholders(@Nullable final Player player, final String message) {
- if (plugin.isPapiEnabled()) {
- return PAPIHook.parse(player, message);
+ if (HookManager.getInstance().isEnabled(PAPIHook.class)) {
+ return HookManager.getInstance().getPapiHook().parse(player, message);
}
return message;
diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml
index 586e21e2..a237a17c 100644
--- a/src/main/resources/plugin.yml
+++ b/src/main/resources/plugin.yml
@@ -5,6 +5,7 @@ api-version: 1.17
softdepend:
- Multiverse
- PlaceholderAPI
+ - Oraxen
depend:
- ProtocolLib
permissions: