From d7a407711a6b6dc99cb4d86f47c890f09613c070 Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:38:18 +0200 Subject: [PATCH 1/8] Create IVaultProvider.java --- IVaultProvider.java | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 IVaultProvider.java diff --git a/IVaultProvider.java b/IVaultProvider.java new file mode 100644 index 0000000..78c30b4 --- /dev/null +++ b/IVaultProvider.java @@ -0,0 +1,11 @@ +package org.metadevs.buycraftapi.providers; + +import org.bukkit.OfflinePlayer; + +public interface IVaultProvider { + boolean setupPermissions(); + + String getPrimaryGroup(OfflinePlayer player); + + boolean isHooked(); +} From 091efac830f46151cfdb00c05d6686aa8ede80aa Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:40:48 +0200 Subject: [PATCH 2/8] Create IVaultProvider.java --- .../metadevs/buycraftapi/providers/IVaultProvider.java | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 src/main/java/org/metadevs/buycraftapi/providers/IVaultProvider.java diff --git a/src/main/java/org/metadevs/buycraftapi/providers/IVaultProvider.java b/src/main/java/org/metadevs/buycraftapi/providers/IVaultProvider.java new file mode 100644 index 0000000..b62cffd --- /dev/null +++ b/src/main/java/org/metadevs/buycraftapi/providers/IVaultProvider.java @@ -0,0 +1,9 @@ +package org.metadevs.buycraftapi.providers; + +import org.bukkit.OfflinePlayer; + +public interface IVaultProvider { + boolean setupPermissions(); + String getPrimaryGroup(OfflinePlayer player); + boolean isHooked(); +} From 46022ecdaa55ee57a7e7e8f91de613a12da2df1d Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:41:21 +0200 Subject: [PATCH 3/8] Create VaultSupport.java --- .../buycraftapi/providers/VaultSupport.java | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/main/java/org/metadevs/buycraftapi/providers/VaultSupport.java diff --git a/src/main/java/org/metadevs/buycraftapi/providers/VaultSupport.java b/src/main/java/org/metadevs/buycraftapi/providers/VaultSupport.java new file mode 100644 index 0000000..482c820 --- /dev/null +++ b/src/main/java/org/metadevs/buycraftapi/providers/VaultSupport.java @@ -0,0 +1,54 @@ +package org.metadevs.buycraftapi.providers; + +import net.milkbowl.vault.permission.Permission; +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.plugin.RegisteredServiceProvider; + +import java.util.logging.Level; +import java.util.logging.Logger; + +public class VaultSupport implements IVaultProvider { + private Permission perms = null; + private final Logger logger; + + public VaultSupport(Logger logger) { + this.logger = logger; + } + + @Override + public boolean setupPermissions() { + if (!Bukkit.getPluginManager().isPluginEnabled("Vault")) { + return false; + } + try { + RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager() + .getRegistration(Permission.class); + if (rsp == null) + return false; + perms = rsp.getProvider(); + logger.log(Level.INFO, "Successfully hooked into Vault permissions."); + return true; + } catch (Exception e) { + logger.log(Level.WARNING, "Failed to hook into Vault permissions: " + e.getMessage()); + return false; + } + } + + @Override + public String getPrimaryGroup(OfflinePlayer player) { + if (perms == null) { + return "No Vault"; + } + try { + return perms.getPrimaryGroup(null, player); + } catch (Exception e) { + return "Error"; + } + } + + @Override + public boolean isHooked() { + return perms != null; + } +} From a6b3226a4348c10dafabcb8d29bd79b94bb4cda8 Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:41:53 +0200 Subject: [PATCH 4/8] Delete IVaultProvider.java --- IVaultProvider.java | 11 ----------- 1 file changed, 11 deletions(-) delete mode 100644 IVaultProvider.java diff --git a/IVaultProvider.java b/IVaultProvider.java deleted file mode 100644 index 78c30b4..0000000 --- a/IVaultProvider.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.metadevs.buycraftapi.providers; - -import org.bukkit.OfflinePlayer; - -public interface IVaultProvider { - boolean setupPermissions(); - - String getPrimaryGroup(OfflinePlayer player); - - boolean isHooked(); -} From c340135fbf5616f70af7c37d6d16e71c9ab9cbcb Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:42:54 +0200 Subject: [PATCH 5/8] Update build.gradle --- build.gradle | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index 5522786..889fa40 100644 --- a/build.gradle +++ b/build.gradle @@ -1,7 +1,7 @@ plugins { id 'java-library' id 'maven-publish' - id "com.github.johnrengelman.shadow" version "8.1.1" + id "io.github.goooler.shadow" version "8.1.8" } repositories { @@ -73,7 +73,11 @@ build.dependsOn(shadowJar) group = 'org.metadevs.buycraftapi' description = 'BuyCraftAPI' -java.sourceCompatibility = JavaVersion.VERSION_17 +java { + toolchain { + languageVersion = JavaLanguageVersion.of(21) + } +} publishing { publications { From a23f8084491a2614cd1091f73bdecd93ec010d93 Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:43:26 +0200 Subject: [PATCH 6/8] Update BuyCraftAPI.java --- .../org/metadevs/buycraftapi/BuyCraftAPI.java | 60 +++++++++---------- 1 file changed, 30 insertions(+), 30 deletions(-) diff --git a/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java b/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java index 8d873db..cc39537 100644 --- a/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java +++ b/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java @@ -6,8 +6,8 @@ import me.clip.placeholderapi.expansion.Taskable; import me.clip.placeholderapi.metrics.bukkit.Metrics; import me.clip.placeholderapi.metrics.charts.MultiLineChart; -import net.milkbowl.vault.permission.Permission; import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; import org.bukkit.plugin.RegisteredServiceProvider; import org.jetbrains.annotations.NotNull; @@ -18,6 +18,8 @@ import org.metadevs.buycraftapi.providers.BuyCraftXProvider; import org.metadevs.buycraftapi.providers.Provider; import org.metadevs.buycraftapi.providers.TebexProvider; +import org.metadevs.buycraftapi.providers.IVaultProvider; +import org.metadevs.buycraftapi.providers.VaultSupport; import org.metadevs.buycraftapi.tasks.Tasks; import java.util.HashMap; @@ -25,11 +27,10 @@ import java.util.logging.Level; import java.util.logging.Logger; - @Getter public class BuyCraftAPI extends PlaceholderExpansion implements Taskable, Configurable { - private Permission perms = null; + private IVaultProvider vaultSupport; private Request request; private Placeholders placeholdersManager; private Query query; @@ -45,15 +46,26 @@ private Provider getProvider() { getLogger().log(Level.INFO, "Tebex found! Using it..."); return new TebexProvider(); } else { - throw new IllegalStateException("No supported plugin found"); + return null; } } - @Override public boolean canRegister() { logger = Logger.getLogger("BuycraftAPI"); - provider = getProvider(); + + try { + provider = getProvider(); + } catch (Throwable e) { + logger.severe("Failed to initialize provider: " + e.getMessage()); + return false; + } + + if (provider == null) { + logger.severe("Plugin Tebex or BuycraftX not found! This expansion requires one of them to work."); + return false; + } + configManager = new ConfigManager(this); final String key = provider.getKey(); @@ -66,17 +78,14 @@ public boolean canRegister() { return true; } - public @NotNull - String getAuthor() { + public @NotNull String getAuthor() { return "AlexDev_"; } - public @NotNull String getIdentifier() { return "buycraftapi"; } - public @NotNull String getVersion() { try { return getClass().getPackage().getImplementationVersion(); @@ -91,32 +100,18 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { return placeholdersManager.onPlaceholderRequest(p, identifier); } - - private void vaultHook() { - if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { - if (setupPermissions()) { - getLogger().log(Level.INFO, "Successfully hooked into Vault for BuyCraftAPI v" + getVersion()); - } - } - } - - - private boolean setupPermissions() { - try { - RegisteredServiceProvider rsp = Bukkit.getServer().getServicesManager().getRegistration(Permission.class); - if (rsp == null) return false; - perms = rsp.getProvider(); - return true; - } catch (Exception e) { - return false; + public String getGroup(OfflinePlayer player) { + if (vaultSupport != null && vaultSupport.isHooked()) { + return vaultSupport.getPrimaryGroup(player); } + return "No Vault"; } @Override public void start() { request = new Request(provider.getKey(), this); query = new Query(this); - + new Tasks(this, getPlaceholderAPI()); int pluginId = 10173; @@ -129,8 +124,13 @@ public void start() { return valueMap; })); - vaultHook(); + if (Bukkit.getPluginManager().isPluginEnabled("Vault")) { + vaultSupport = new VaultSupport(logger); + vaultSupport.setupPermissions(); + } + placeholdersManager = new Placeholders(this); + } @Override From afd113e86d1d1d1eee5b57b0160db44557580126 Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:44:37 +0200 Subject: [PATCH 7/8] Update Placeholders.java --- .../placeholders/Placeholders.java | 94 +++++++++++-------- 1 file changed, 53 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/metadevs/buycraftapi/placeholders/Placeholders.java b/src/main/java/org/metadevs/buycraftapi/placeholders/Placeholders.java index 66f0a61..2953496 100644 --- a/src/main/java/org/metadevs/buycraftapi/placeholders/Placeholders.java +++ b/src/main/java/org/metadevs/buycraftapi/placeholders/Placeholders.java @@ -27,12 +27,12 @@ public Placeholders(BuyCraftAPI buyCraftAPI) { public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.equalsIgnoreCase("value_from_name")) { - if (p == null) return "Player is Offline"; + if (p == null) + return "Player is Offline"; String value = query.getPlayerTotal(p.getName()); return value != null ? value : "0"; } - if (identifier.contains("vault_recent_name_")) { int num; try { @@ -40,19 +40,18 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { } catch (NumberFormatException e) { return "Invalid payment number. Put a number from 0 to " + (maxPayments - 1); } - if (maxPayments == 0) return "Payments could not be found"; + if (maxPayments == 0) + return "Payments could not be found"; if (num > maxPayments - 1 || num < 0) return "Invalid payment number. Put a number from 0 to " + (maxPayments - 1); - - if(Bukkit.isPrimaryThread()){ + if (Bukkit.isPrimaryThread()) { return "This placeholder is not supported on the main thread"; } - OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(query.getRecentPayment(num).getUuid()); - return buyCraftAPI.getPerms().getPrimaryGroup(null, offlinePlayer); + return buyCraftAPI.getGroup(offlinePlayer); } if (identifier.contains("recent_name_")) { @@ -63,40 +62,43 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { return "Invalid payment number. Put a number from 0 to " + (maxPayments - 1); } - if (maxPayments == 0) return "Payments could not be found"; + if (maxPayments == 0) + return "Payments could not be found"; if (num > maxPayments - 1 || num < 0) return "0"; - //return "Invalid payment number. Put a number from 0 to " + (maxPayments - 1); - + // return "Invalid payment number. Put a number from 0 to " + (maxPayments - 1); return query.getRecentPayment(num).getName(); } - if (identifier.contains("recent_currency_")) { String replace = identifier.replace("recent_currency_", ""); - if (query.isNotNumeric(replace)) return "Invalid number"; + if (query.isNotNumeric(replace)) + return "Invalid number"; int num = Integer.parseInt(replace); - if (maxPayments == 0) return "Payments could not be found"; + if (maxPayments == 0) + return "Payments could not be found"; if (num > maxPayments - 1 || num < 0) return "0"; - //return "Error, Invalid number! You can put a number from 0 to " + (maxPayments - 1); - + // return "Error, Invalid number! You can put a number from 0 to " + + // (maxPayments - 1); return query.getRecentPayment(num).getCurrency(); } - if (identifier.contains("recent_amount_")) { String replace = identifier.replace("recent_amount_", ""); - if (query.isNotNumeric(replace)) return "Invalid number"; + if (query.isNotNumeric(replace)) + return "Invalid number"; int num = Integer.parseInt(replace); - if (maxPayments == 0) return "Payments could not be found"; + if (maxPayments == 0) + return "Payments could not be found"; if (num > maxPayments - 1 || num < 0) return "0"; - //return "Error, Invalid number! You can put a number from 0 to " + (maxPayments - 1); + // return "Error, Invalid number! You can put a number from 0 to " + + // (maxPayments - 1); return String.valueOf(Query.round(query.getRecentPayment(num).getAmount(), 2)); } @@ -118,10 +120,12 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.contains("top_donor_global_name_")) { String replace = identifier.replace("top_donor_global_name_", ""); - if (query.isNotNumeric(replace)) return "Error, Invalid number"; + if (query.isNotNumeric(replace)) + return "Error, Invalid number"; int num = Integer.parseInt(replace); TopValue payment = query.getTop(GLOBAL, num); - if (payment == null) return ""; + if (payment == null) + return ""; else { return payment.getName(); } @@ -129,10 +133,12 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.contains("top_donor_monthly_name_")) { String replace = identifier.replace("top_donor_monthly_name_", ""); - if (query.isNotNumeric(replace)) return "Error, Invalid number"; + if (query.isNotNumeric(replace)) + return "Error, Invalid number"; int num = Integer.parseInt(replace); TopValue payment = query.getTop(MONTHLY, num); - if (payment == null) return "0"; + if (payment == null) + return "0"; else { return payment.getName(); @@ -141,10 +147,12 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.contains("top_donor_current_month_name_")) { String replace = identifier.replace("top_donor_current_month_name_", ""); - if (query.isNotNumeric(replace)) return "Error, Invalid number"; + if (query.isNotNumeric(replace)) + return "Error, Invalid number"; int num = Integer.parseInt(replace); TopValue payment = query.getTop(CURRENT_MONTH, num); - if (payment == null) return "0"; + if (payment == null) + return "0"; else { return payment.getName(); } @@ -165,21 +173,22 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { return getPrice(replace, CURRENT_MONTH); } - if(identifier.equalsIgnoreCase("top_donor_global_name")){ + if (identifier.equalsIgnoreCase("top_donor_global_name")) { return query.getTopDonorName(GLOBAL); } - if(identifier.equalsIgnoreCase("top_donor_monthly_name")){ + if (identifier.equalsIgnoreCase("top_donor_monthly_name")) { return query.getTopDonorName(MONTHLY); } - if(identifier.equalsIgnoreCase("top_donor_current_month_name")){ + if (identifier.equalsIgnoreCase("top_donor_current_month_name")) { return query.getTopDonorName(CURRENT_MONTH); } if (identifier.equalsIgnoreCase("total_earnings_global")) { double data = query.getAllMoneySpent(GLOBAL); - if (data == -1) return "Error"; + if (data == -1) + return "Error"; else { return String.format("%.2f", data); } @@ -187,7 +196,8 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.equalsIgnoreCase("total_earnings_monthly")) { double data = query.getAllMoneySpent(MONTHLY); - if (data == -1) return "Error"; + if (data == -1) + return "Error"; else { return String.format("%.2f", data); } @@ -195,19 +205,18 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { if (identifier.equalsIgnoreCase("total_earnings_current_month")) { double data = query.getAllMoneySpent(CURRENT_MONTH); - if (data == -1) return "Error"; + if (data == -1) + return "Error"; else { return String.format("%.2f", data); } } - if (identifier.equalsIgnoreCase("info")) { return query.getPayments().size() + " payments"; } - - if (identifier.equalsIgnoreCase("all")) { //only for test + if (identifier.equalsIgnoreCase("all")) { // only for test StringBuilder sb = new StringBuilder(); for (Payment s : query.getPayments()) { sb.append(s.getName()).append(" ").append(s.getAmount()).append("\n"); @@ -215,31 +224,34 @@ public String onPlaceholderRequest(Player p, @NotNull String identifier) { return sb.toString(); } - return null; } private String getVaultTop(String replace, Type currentMonth) { - if (query.isNotNumeric(replace)) return "Error, Invalid number"; + if (query.isNotNumeric(replace)) + return "Error, Invalid number"; int num = Integer.parseInt(replace); - if(Bukkit.isPrimaryThread()){ + if (Bukkit.isPrimaryThread()) { return "This placeholder is not supported on the main thread"; } TopValue payment = query.getTop(currentMonth, num); - if (payment == null) return "0"; + if (payment == null) + return "0"; else { OfflinePlayer offlinePlayer = Bukkit.getOfflinePlayer(payment.getUuid()); - return buyCraftAPI.getPerms().getPrimaryGroup(null, offlinePlayer); + return buyCraftAPI.getGroup(offlinePlayer); } } private String getPrice(String replace, Type monthly) { - if (query.isNotNumeric(replace)) return "Error, Invalid number"; + if (query.isNotNumeric(replace)) + return "Error, Invalid number"; int num = Integer.parseInt(replace); TopValue payment = query.getTop(monthly, num); - if (payment == null) return "Error"; + if (payment == null) + return "Error"; else { return String.format("%.2f", payment.getAmount()); } From 7c17a2bd6bfb138627dc0a4ef0a90c6df209292c Mon Sep 17 00:00:00 2001 From: liquidman228 <93479046+liquidman228@users.noreply.github.com> Date: Sat, 31 Jan 2026 00:45:25 +0200 Subject: [PATCH 8/8] Update BuyCraftAPI.java --- src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java b/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java index cc39537..c7827e2 100644 --- a/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java +++ b/src/main/java/org/metadevs/buycraftapi/BuyCraftAPI.java @@ -9,7 +9,6 @@ import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; -import org.bukkit.plugin.RegisteredServiceProvider; import org.jetbrains.annotations.NotNull; import org.metadevs.buycraftapi.config.ConfigManager; import org.metadevs.buycraftapi.data.Request;