diff --git a/addon/reremake-migrator/pom.xml b/addon/reremake-migrator/pom.xml
index 1927782551..86441aa4c5 100644
--- a/addon/reremake-migrator/pom.xml
+++ b/addon/reremake-migrator/pom.xml
@@ -155,7 +155,7 @@
net.minidev
json-smart
- 1.3.2
+ 2.4.9
compile
diff --git a/compatibility/oraxen/.gitignore b/compatibility/oraxen/.gitignore
new file mode 100644
index 0000000000..4788b4b454
--- /dev/null
+++ b/compatibility/oraxen/.gitignore
@@ -0,0 +1,113 @@
+# User-specific stuff
+.idea/
+
+*.iml
+*.ipr
+*.iws
+
+# IntelliJ
+out/
+
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+*~
+
+# temporary files which can be created if a process still has a handle open of a deleted file
+.fuse_hidden*
+
+# KDE directory preferences
+.directory
+
+# Linux trash folder which might appear on any partition or disk
+.Trash-*
+
+# .nfs files are created when an open file is removed but is still being accessed
+.nfs*
+
+# General
+.DS_Store
+.AppleDouble
+.LSOverride
+
+# Icon must end with two \r
+Icon
+
+# Thumbnails
+._*
+
+# Files that might appear in the root of a volume
+.DocumentRevisions-V100
+.fseventsd
+.Spotlight-V100
+.TemporaryItems
+.Trashes
+.VolumeIcon.icns
+.com.apple.timemachine.donotpresent
+
+# Directories potentially created on remote AFP share
+.AppleDB
+.AppleDesktop
+Network Trash Folder
+Temporary Items
+.apdisk
+
+# Windows thumbnail cache files
+Thumbs.db
+Thumbs.db:encryptable
+ehthumbs.db
+ehthumbs_vista.db
+
+# Dump file
+*.stackdump
+
+# Folder config file
+[Dd]esktop.ini
+
+# Recycle Bin used on file shares
+$RECYCLE.BIN/
+
+# Windows Installer files
+*.cab
+*.msi
+*.msix
+*.msm
+*.msp
+
+# Windows shortcuts
+*.lnk
+
+target/
+
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+
+release.properties
+dependency-reduced-pom.xml
+buildNumber.properties
+.mvn/timing.properties
+.mvn/wrapper/maven-wrapper.jar
+.flattened-pom.xml
+
+# Common working directory
+run/
diff --git a/compatibility/oraxen/pom.xml b/compatibility/oraxen/pom.xml
new file mode 100644
index 0000000000..f415e4e087
--- /dev/null
+++ b/compatibility/oraxen/pom.xml
@@ -0,0 +1,94 @@
+
+
+
+ 4.0.0
+
+ com.ghostchu
+ quickshop-hikari
+ 6.2.0.7
+ ../../pom.xml
+
+ com.ghostchu.quickshop.compatibility
+ oraxen
+ takari-jar
+
+ Compat-Oraxen
+
+ Compatibility module for Oraxen
+
+
+
+
+ org.apache.maven.plugins
+ maven-shade-plugin
+
+
+
+
+
+ src/main/resources
+ true
+
+
+
+
+
+
+ oraxen-releases
+ https://repo.oraxen.com/releases
+
+
+
+
+
+ org.spigotmc
+ spigot-api
+
+
+ com.ghostchu.quickshop.compatibility
+ common
+ ${project.parent.version}
+ compile
+
+
+ com.ghostchu
+ quickshop-bukkit
+ ${project.parent.version}
+ provided
+
+
+ io.th0rgal
+ oraxen
+ 1.182.0
+ provided
+
+
+ oraxen
+ v1_20_R2
+
+
+ oraxen
+ v1_20_R3
+
+
+ oraxen
+ v1_20_R4
+
+
+ oraxen
+ v1_21_R1
+
+
+ com.github.Euphillya
+ Energie
+
+
+ me.gabytm.util
+ actions-spigot
+
+
+
+
+
diff --git a/compatibility/oraxen/src/main/java/com/ghostchu/quickshop/compatibility/oraxen/Main.java b/compatibility/oraxen/src/main/java/com/ghostchu/quickshop/compatibility/oraxen/Main.java
new file mode 100644
index 0000000000..595fce729b
--- /dev/null
+++ b/compatibility/oraxen/src/main/java/com/ghostchu/quickshop/compatibility/oraxen/Main.java
@@ -0,0 +1,55 @@
+package com.ghostchu.quickshop.compatibility.oraxen;
+
+import com.ghostchu.quickshop.QuickShop;
+import com.ghostchu.quickshop.api.registry.BuiltInRegistry;
+import com.ghostchu.quickshop.api.registry.Registry;
+import com.ghostchu.quickshop.api.registry.builtin.itemexpression.ItemExpressionHandler;
+import com.ghostchu.quickshop.api.registry.builtin.itemexpression.ItemExpressionRegistry;
+import com.ghostchu.quickshop.compatibility.CompatibilityModule;
+import io.th0rgal.oraxen.api.OraxenItems;
+import io.th0rgal.oraxen.items.ItemBuilder;
+import net.kyori.adventure.text.Component;
+import net.kyori.adventure.text.minimessage.MiniMessage;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public final class Main extends CompatibilityModule implements ItemExpressionHandler {
+
+ @Override
+ public void init() {
+ final Registry registry = QuickShop.getInstance().getRegistry().getRegistry(BuiltInRegistry.ITEM_EXPRESSION);
+ if(registry instanceof ItemExpressionRegistry itemExpressionRegistry) {
+ if(itemExpressionRegistry.registerHandlerSafely(this)) {
+ getLogger().info("Register Oraxen ItemExpressionHandler successfully!");
+ }
+ }
+ }
+
+ @Override
+ public @NotNull Plugin getPlugin() {
+ return this;
+ }
+
+ @Override
+ public String getPrefix() {
+ return "oraxen";
+ }
+
+ @Override
+ public boolean match(final ItemStack stack, final String expression) {
+ return expression.equals(OraxenItems.getIdByItem(stack));
+ }
+
+ @Override
+ public @Nullable Component displayName(@NotNull ItemStack stack) {
+ final ItemBuilder builder = OraxenItems.getBuilderByItem(stack);
+ if (builder == null) {
+ return ItemExpressionHandler.super.displayName(stack);
+ }
+
+ final String displayName = builder.getItemName();
+ return displayName != null ? MiniMessage.miniMessage().deserialize(displayName) : ItemExpressionHandler.super.displayName(stack);
+ }
+}
diff --git a/compatibility/oraxen/src/main/resources/plugin.yml b/compatibility/oraxen/src/main/resources/plugin.yml
new file mode 100644
index 0000000000..027d2393e0
--- /dev/null
+++ b/compatibility/oraxen/src/main/resources/plugin.yml
@@ -0,0 +1,9 @@
+name: qscompat-${project.artifactId}
+version: '${project.version}'
+main: com.ghostchu.quickshop.compatibility.${project.artifactId}.Main
+api-version: 1.18
+depend:
+ - Oraxen
+ - QuickShop-Hikari
+authors: [ NahuLD ]
+description: Compatibility module for Oraxen
diff --git a/pom.xml b/pom.xml
index a0f5975f4b..9028cbfa40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -436,6 +436,7 @@
compatibility/slimefun
compatibility/itemsadder
compatibility/voidchest
+ compatibility/oraxen
addon/discordsrv
addon/plan
addon/discount
diff --git a/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionHandler.java b/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionHandler.java
index 2c07f48a14..ccb670a8fa 100644
--- a/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionHandler.java
+++ b/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionHandler.java
@@ -1,8 +1,10 @@
package com.ghostchu.quickshop.api.registry.builtin.itemexpression;
+import net.kyori.adventure.text.Component;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
public interface ItemExpressionHandler extends Comparable {
@@ -18,6 +20,11 @@ default String getInternalPrefix0() {
boolean match(ItemStack stack, String expression);
+ @Nullable
+ default Component displayName(@NotNull ItemStack stack) {
+ return null;
+ }
+
@Override
int hashCode();
diff --git a/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionRegistry.java b/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionRegistry.java
index 721041891c..9183c23813 100644
--- a/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionRegistry.java
+++ b/quickshop-api/src/main/java/com/ghostchu/quickshop/api/registry/builtin/itemexpression/ItemExpressionRegistry.java
@@ -2,8 +2,10 @@
import com.ghostchu.quickshop.api.registry.PrefixAlreadyRegisteredException;
import com.ghostchu.quickshop.api.registry.Registry;
+import net.kyori.adventure.text.Component;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.Nullable;
import java.util.Set;
@@ -13,6 +15,9 @@ public interface ItemExpressionRegistry extends Registry {
boolean match(ItemStack stack, String expression);
+ @Nullable
+ Component displayName(ItemStack stack);
+
void registerHandler(ItemExpressionHandler handler) throws PrefixAlreadyRegisteredException;
boolean registerHandlerSafely(ItemExpressionHandler handler);
diff --git a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/browse/MainPage.java b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/browse/MainPage.java
index 0620814b55..53c83e34a7 100644
--- a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/browse/MainPage.java
+++ b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/browse/MainPage.java
@@ -21,6 +21,7 @@
import com.ghostchu.quickshop.api.economy.AbstractEconomy;
import com.ghostchu.quickshop.api.obj.QUser;
import com.ghostchu.quickshop.api.shop.Shop;
+import com.ghostchu.quickshop.util.Util;
import net.kyori.adventure.text.Component;
import net.tnemc.item.AbstractItemStack;
import net.tnemc.item.bukkit.BukkitItemStack;
@@ -150,6 +151,7 @@ public void handle(final PageOpenCallback callback) {
final AbstractEconomy eco = QuickShop.getInstance().getEconomy();
final AbstractItemStack stack = new BukkitItemStack().of(shop.getItem().getType().getKey().toString(), shop.getShopStackingAmount())
+ .display(Util.getItemStackName(shop.getItem()))
.lore(getList(id, iconLore,
shop.getOwner().getDisplay(),
location,
diff --git a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/trade/MainPage.java b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/trade/MainPage.java
index f022079f9e..1be5501f38 100644
--- a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/trade/MainPage.java
+++ b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/menu/trade/MainPage.java
@@ -81,7 +81,7 @@ public void handle(final PageOpenCallback open) {
final int stock = (shop.get().isBuying())? -1 : shop.get().getRemainingStock();
final String stockString = (shop.get().isUnlimited())? "Unlimited" : stock + "";
- open.getPage().addIcon(new IconBuilder(new BukkitItemStack().of(shopItem)).withSlot(13).build());
+ open.getPage().addIcon(new IconBuilder(new BukkitItemStack().of(shopItem).display(Util.getItemStackName(shopItem))).withSlot(13).build());
final String lore = (shop.get().isSelling())? "gui.trade.custom.lore-buy" : "gui.trade.custom.lore-sell";
final String enter = (shop.get().isSelling())? "gui.trade.custom.enter-buy" : "gui.trade.custom.enter-sell";
diff --git a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/SimpleItemExpressionRegistry.java b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/SimpleItemExpressionRegistry.java
index 96b13a7f5b..4676bfeada 100644
--- a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/SimpleItemExpressionRegistry.java
+++ b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/registry/builtin/itemexpression/SimpleItemExpressionRegistry.java
@@ -5,9 +5,11 @@
import com.ghostchu.quickshop.api.registry.builtin.itemexpression.ItemExpressionHandler;
import com.ghostchu.quickshop.api.registry.builtin.itemexpression.ItemExpressionRegistry;
import com.google.common.collect.ImmutableSet;
+import net.kyori.adventure.text.Component;
import org.apache.commons.lang3.StringUtils;
import org.bukkit.inventory.ItemStack;
import org.bukkit.plugin.Plugin;
+import org.jetbrains.annotations.Nullable;
import java.util.Set;
import java.util.concurrent.ConcurrentSkipListSet;
@@ -41,6 +43,17 @@ public boolean match(final ItemStack stack, final String expression) {
return false;
}
+ @Override
+ public @Nullable Component displayName(ItemStack stack) {
+ for (ItemExpressionHandler handler : handlers) {
+ final Component component = handler.displayName(stack);
+ if (component != null) {
+ return component;
+ }
+ }
+ return null;
+ }
+
@Override
public void registerHandler(final ItemExpressionHandler handler) throws PrefixAlreadyRegisteredException {
diff --git a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/util/Util.java b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/util/Util.java
index 5b16e0a1f9..1bebb5cb41 100644
--- a/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/util/Util.java
+++ b/quickshop-bukkit/src/main/java/com/ghostchu/quickshop/util/Util.java
@@ -4,6 +4,8 @@
import com.ghostchu.quickshop.api.inventory.CountableInventoryWrapper;
import com.ghostchu.quickshop.api.inventory.InventoryWrapper;
import com.ghostchu.quickshop.api.inventory.InventoryWrapperIterator;
+import com.ghostchu.quickshop.api.registry.BuiltInRegistry;
+import com.ghostchu.quickshop.api.registry.builtin.itemexpression.ItemExpressionRegistry;
import com.ghostchu.quickshop.api.shop.ItemMatcher;
import com.ghostchu.quickshop.api.shop.Shop;
import com.ghostchu.quickshop.api.shop.permission.BuiltInShopPermission;
@@ -503,6 +505,11 @@ public static Component getItemStackName(@NotNull final ItemStack itemStack) {
@Nullable
public static Component getItemCustomName(@NotNull final ItemStack itemStack) {
+ final ItemExpressionRegistry registry = (ItemExpressionRegistry) plugin.getRegistry().getRegistry(BuiltInRegistry.ITEM_EXPRESSION);
+ final Component displayName = registry.displayName(itemStack);
+ if (displayName != null) {
+ return displayName;
+ }
if(useEnchantmentForEnchantedBook() && itemStack.getType() == Material.ENCHANTED_BOOK) {
final ItemMeta meta = itemStack.getItemMeta();