diff --git a/build.gradle.kts b/build.gradle.kts index ed37179..ce5b896 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -42,16 +42,11 @@ dependencies { compileOnly("me.clip:placeholderapi:2.11.6") compileOnly(files("libraries/RivalHarvesterHoesAPI.jar")) compileOnly(files("libraries/RivalPickaxesAPI.jar")) - compileOnly(files("libraries/AxBoosters-3.15.3.jar")) - compileOnly(files("libraries/AxHoes-1.2.0.jar")) - compileOnly(files("libraries/AxPickaxes-1.0.0.jar")) - compileOnly("net.kyori:adventure-key:4.17.0") compileOnly("com.zaxxer:HikariCP:7.0.2") compileOnly("com.mysql:mysql-connector-j:9.5.0") compileOnly("org.xerial:sqlite-jdbc:3.51.1.0") compileOnly("org.postgresql:postgresql:42.7.8") - compileOnly("com.h2database:h2:2.3.232") implementation("me.croabeast.expr4j:core:1.0") implementation("me.croabeast.expr4j:big-decimal:1.0") diff --git a/libraries/AxBoosters-3.15.3.jar b/libraries/AxBoosters-3.15.3.jar deleted file mode 100644 index 1fd48c3..0000000 Binary files a/libraries/AxBoosters-3.15.3.jar and /dev/null differ diff --git a/libraries/AxHoes-1.2.0.jar b/libraries/AxHoes-1.2.0.jar deleted file mode 100644 index 09188c9..0000000 Binary files a/libraries/AxHoes-1.2.0.jar and /dev/null differ diff --git a/libraries/AxPickaxes-1.0.0.jar b/libraries/AxPickaxes-1.0.0.jar deleted file mode 100644 index a494f7e..0000000 Binary files a/libraries/AxPickaxes-1.0.0.jar and /dev/null differ diff --git a/src/main/java/com/bitaspire/cyberlevels/BaseSystem.java b/src/main/java/com/bitaspire/cyberlevels/BaseSystem.java index e49b366..ccfca10 100644 --- a/src/main/java/com/bitaspire/cyberlevels/BaseSystem.java +++ b/src/main/java/com/bitaspire/cyberlevels/BaseSystem.java @@ -803,12 +803,7 @@ public double getMultiplier() { } catch (Exception ignored) {} } - double base = multiplier == 0 ? 1 : multiplier; - - if (system.main.hookManager != null) - base *= system.main.hookManager.externalMultiplier(getPlayer()); - - return base; + return multiplier == 0 ? 1 : multiplier; } @Override diff --git a/src/main/java/com/bitaspire/cyberlevels/CyberLevels.java b/src/main/java/com/bitaspire/cyberlevels/CyberLevels.java index 2b80a13..750fca3 100644 --- a/src/main/java/com/bitaspire/cyberlevels/CyberLevels.java +++ b/src/main/java/com/bitaspire/cyberlevels/CyberLevels.java @@ -94,7 +94,6 @@ public void onEnable() { loader.load("com.mysql", "mysql-connector-j", "8.0.33", true); loader.load("org.xerial", "sqlite-jdbc", "3.51.1.0", true); loader.load("org.postgresql", "postgresql", "42.7.8", true); - loader.load("com.h2database", "h2", "2.3.232", true); loader.load("org.apache.commons", "commons-lang3", "3.18.0", true); } diff --git a/src/main/java/com/bitaspire/cyberlevels/DatabaseFactory.java b/src/main/java/com/bitaspire/cyberlevels/DatabaseFactory.java index 40d29b1..fe95578 100644 --- a/src/main/java/com/bitaspire/cyberlevels/DatabaseFactory.java +++ b/src/main/java/com/bitaspire/cyberlevels/DatabaseFactory.java @@ -1205,230 +1205,6 @@ void renameTable(Connection conn, String from, String to) throws SQLException { } } - static class H2 extends DatabaseImpl { - - private final String filePath, table; - - H2(CyberLevels main, BaseSystem system) { - super(main, system, "H2"); - Config.Database db = main.cache().config().database(); - this.filePath = db.getH2File(); - this.table = db.getTable(); - } - - @Override String getTable() { return table; } - - @Override - HikariConfig createConfig() { - HikariConfig config = new HikariConfig(); - config.setJdbcUrl("jdbc:h2:file:" + filePath + - ";MODE=PostgreSQL;DATABASE_TO_UPPER=FALSE;CASE_INSENSITIVE_IDENTIFIERS=TRUE" + - ";DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;AUTO_SERVER=TRUE"); - config.setMaximumPoolSize(10); - config.setMinimumIdle(2); - config.setConnectionTimeout(10000); - config.setValidationTimeout(5000); - config.setIdleTimeout(600000); - config.setMaxLifetime(1800000); - config.setKeepaliveTime(300000); - config.setPoolName("CLV-H2"); - return config; - } - - @Override - String qCol(String name) { - return "\"" + name + "\""; - } - - @Override - String qTab(String name) { - return "\"" + name + "\""; - } - - private PreparedStatement prepareMerge(Connection c, - String targetTable, - String[] cols, - String keyCol, - String[] caseCols, - String maxCol, - Object[] values) throws SQLException { - StringBuilder source = new StringBuilder(); - for (int i = 0; i < cols.length; i++) { - if (i > 0) source.append(','); - source.append('?'); - } - - StringBuilder colsList = new StringBuilder(); - for (int i = 0; i < cols.length; i++) { - if (i > 0) colsList.append(','); - colsList.append(qCol(cols[i])); - } - - StringBuilder srcCols = new StringBuilder(); - for (int i = 0; i < cols.length; i++) { - if (i > 0) srcCols.append(','); - srcCols.append(qCol(cols[i])); - } - - StringBuilder updateClause = new StringBuilder(); - for (int i = 0; i < caseCols.length; i++) { - if (i > 0) updateClause.append(','); - String col = caseCols[i]; - updateClause.append(qCol(col)).append(" = CASE WHEN s.").append(qCol(maxCol)) - .append(" >= t.").append(qCol(maxCol)).append(" THEN s.").append(qCol(col)) - .append(" ELSE t.").append(qCol(col)).append(" END"); - } - if (updateClause.length() > 0) updateClause.append(','); - updateClause.append(qCol(maxCol)).append(" = CASE WHEN s.").append(qCol(maxCol)) - .append(" > t.").append(qCol(maxCol)).append(" THEN s.").append(qCol(maxCol)) - .append(" ELSE t.").append(qCol(maxCol)).append(" END"); - - String sql = "MERGE INTO " + qTab(targetTable) + " t " + - "USING (SELECT " + buildSelectAliasList(cols) + " FROM (VALUES (" + source + ")) v(" + srcCols + ")) s " + - "ON t." + qCol(keyCol) + " = s." + qCol(keyCol) + " " + - "WHEN MATCHED THEN UPDATE SET " + updateClause + " " + - "WHEN NOT MATCHED THEN INSERT (" + colsList + ") VALUES (" + buildSourceRefList(cols) + ")"; - - PreparedStatement ps = c.prepareStatement(sql); - for (int i = 0; i < values.length; i++) { - Object v = values[i]; - if (v instanceof Long) ps.setLong(i + 1, (Long) v); - else ps.setString(i + 1, String.valueOf(v)); - } - return ps; - } - - private String buildSelectAliasList(String[] cols) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < cols.length; i++) { - if (i > 0) sb.append(','); - sb.append("v.").append(qCol(cols[i])).append(" AS ").append(qCol(cols[i])); - } - return sb.toString(); - } - - private String buildSourceRefList(String[] cols) { - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < cols.length; i++) { - if (i > 0) sb.append(','); - sb.append("s.").append(qCol(cols[i])); - } - return sb.toString(); - } - - @Override - PreparedStatement prepareUpsert(Connection c, UUID uuid, long level, String exp, long updatedAt) throws SQLException { - String[] cols = { "UUID", "LEVEL", "EXP", "UPDATED_AT" }; - String[] caseCols = { "LEVEL", "EXP" }; - Object[] values = { uuid.toString(), level, exp, updatedAt }; - return prepareMerge(c, getTable(), cols, "UUID", caseCols, "UPDATED_AT", values); - } - - @Override - PreparedStatement prepareUpsertMeta(Connection c, UUID uuid, long highest, long updatedAt) throws SQLException { - String sql = "MERGE INTO " + qTab(metaTable()) + " t " + - "USING (SELECT v." + qCol("UUID") + " AS " + qCol("UUID") + "," + - " v." + qCol("HIGHEST_REWARDED") + " AS " + qCol("HIGHEST_REWARDED") + "," + - " v." + qCol("UPDATED_AT") + " AS " + qCol("UPDATED_AT") + - " FROM (VALUES (?,?,?)) v(" + qCol("UUID") + "," + qCol("HIGHEST_REWARDED") + "," + qCol("UPDATED_AT") + ")) s " + - "ON t." + qCol("UUID") + " = s." + qCol("UUID") + " " + - "WHEN MATCHED THEN UPDATE SET " + - qCol("HIGHEST_REWARDED") + " = CASE WHEN s." + qCol("HIGHEST_REWARDED") + " > t." + qCol("HIGHEST_REWARDED") + - " THEN s." + qCol("HIGHEST_REWARDED") + " ELSE t." + qCol("HIGHEST_REWARDED") + " END," + - qCol("UPDATED_AT") + " = CASE WHEN s." + qCol("UPDATED_AT") + " > t." + qCol("UPDATED_AT") + - " THEN s." + qCol("UPDATED_AT") + " ELSE t." + qCol("UPDATED_AT") + " END " + - "WHEN NOT MATCHED THEN INSERT (" + qCol("UUID") + "," + qCol("HIGHEST_REWARDED") + "," + qCol("UPDATED_AT") + - ") VALUES (s." + qCol("UUID") + ", s." + qCol("HIGHEST_REWARDED") + ", s." + qCol("UPDATED_AT") + ")"; - PreparedStatement ps = c.prepareStatement(sql); - ps.setString(1, uuid.toString()); - ps.setLong(2, highest); - ps.setLong(3, updatedAt); - return ps; - } - - @Override - Set getExistingColumns(Connection conn) throws SQLException { - Set cols = new HashSet<>(); - String sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS " + - "WHERE UPPER(TABLE_SCHEMA) = UPPER(SCHEMA()) AND UPPER(TABLE_NAME) = UPPER(?)"; - try (PreparedStatement ps = conn.prepareStatement(sql)) { - ps.setString(1, getTable()); - try (ResultSet rs = ps.executeQuery()) { - while (rs.next()) cols.add(rs.getString(1).toUpperCase(Locale.ENGLISH)); - } - } - return cols; - } - - @Override - boolean isExpColumnTextual(Connection conn) throws SQLException { - String sql = "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS " + - "WHERE UPPER(TABLE_SCHEMA) = UPPER(SCHEMA()) AND UPPER(TABLE_NAME) = UPPER(?) " + - "AND UPPER(COLUMN_NAME) = 'EXP'"; - try (PreparedStatement ps = conn.prepareStatement(sql)) { - ps.setString(1, getTable()); - try (ResultSet rs = ps.executeQuery()) { - if (rs.next()) { - String type = rs.getString(1); - if (type == null) return false; - type = type.toLowerCase(Locale.ENGLISH); - return type.contains("char") || type.contains("text") || type.contains("clob") || - type.contains("varchar"); - } - } - } - return false; - } - - @Override - boolean hasPrimaryKeyOnUuid(Connection conn) throws SQLException { - String sql = "SELECT kcu.COLUMN_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc " + - "JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE kcu " + - "ON tc.CONSTRAINT_NAME = kcu.CONSTRAINT_NAME AND tc.TABLE_SCHEMA = kcu.TABLE_SCHEMA " + - "AND tc.TABLE_NAME = kcu.TABLE_NAME " + - "WHERE tc.CONSTRAINT_TYPE = 'PRIMARY KEY' " + - "AND UPPER(tc.TABLE_SCHEMA) = UPPER(SCHEMA()) " + - "AND UPPER(tc.TABLE_NAME) = UPPER(?)"; - try (PreparedStatement ps = conn.prepareStatement(sql)) { - ps.setString(1, getTable()); - try (ResultSet rs = ps.executeQuery()) { - while (rs.next()) { - String col = rs.getString(1); - if ("UUID".equalsIgnoreCase(col)) return true; - } - } - } - return false; - } - - @Override - void createTargetTable(Connection conn) throws SQLException { - String sql = "CREATE TABLE IF NOT EXISTS " + qTab(getTable()) + " (" + - qCol("UUID") + " VARCHAR(36) NOT NULL," + - qCol("LEVEL") + " BIGINT," + - qCol("EXP") + " VARCHAR," + - qCol("UPDATED_AT") + " BIGINT NOT NULL DEFAULT 0," + - "PRIMARY KEY (" + qCol("UUID") + "))"; - try (Statement st = conn.createStatement()) { - st.executeUpdate(sql); - } - } - - @Override - void dropTableIfExists(Connection conn, String table) throws SQLException { - try (Statement st = conn.createStatement()) { - st.executeUpdate("DROP TABLE IF EXISTS " + qTab(table)); - } - } - - @Override - void renameTable(Connection conn, String from, String to) throws SQLException { - try (Statement st = conn.createStatement()) { - st.executeUpdate("ALTER TABLE " + qTab(from) + " RENAME TO " + qTab(to)); - } - } - } - static Database createDatabase(CyberLevels main, BaseSystem system) { String type = main.cache().config().database().getType(); @@ -1439,8 +1215,6 @@ static Database createDatabase(CyberLevels main, BaseSyste case "MYSQL": case "MARIADB": return new MySQL<>(main, system); - case "H2": - return new H2<>(main, system); case "SQLITE": default: return new SQLite<>(main, system); diff --git a/src/main/java/com/bitaspire/cyberlevels/cache/Config.java b/src/main/java/com/bitaspire/cyberlevels/cache/Config.java index 399021b..1372f38 100644 --- a/src/main/java/com/bitaspire/cyberlevels/cache/Config.java +++ b/src/main/java/com/bitaspire/cyberlevels/cache/Config.java @@ -135,8 +135,7 @@ public static class Database { database = "database", username = "username", password = "password", table = "levels", type = "MySQL", - sqliteFile = "plugins/CyberLevels/data.db", - h2File = "plugins/CyberLevels/data.h2"; + sqliteFile = "plugins/CyberLevels/data.db"; Database(ConfigurationSection section) { if (section == null) return; @@ -152,7 +151,6 @@ public static class Database { table = section.getString("table", table); sqliteFile = section.getString("sqlite-file", sqliteFile); - h2File = section.getString("h2-file", h2File); type = section.getString("type", type); } diff --git a/src/main/java/com/bitaspire/cyberlevels/hook/AxBoostersHook.java b/src/main/java/com/bitaspire/cyberlevels/hook/AxBoostersHook.java deleted file mode 100644 index 8469013..0000000 --- a/src/main/java/com/bitaspire/cyberlevels/hook/AxBoostersHook.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.bitaspire.cyberlevels.hook; - -import com.artillexstudios.axboosters.api.AxBoostersAPI; -import com.artillexstudios.axboosters.api.events.AxBoostersLoadEvent; -import com.artillexstudios.axboosters.hooks.booster.BoosterHook; -import com.artillexstudios.axboosters.users.User; -import com.artillexstudios.axboosters.users.UserList; -import com.bitaspire.cyberlevels.CyberLevels; -import net.kyori.adventure.key.Key; -import org.bukkit.Material; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - -final class AxBoostersHook implements Hook, BoosterHook, Listener { - - private static final Key KEY = Key.key("cyberlevels2", "xp"); - - private static volatile AxBoostersHook registered; - - private final CyberLevels main; - - AxBoostersHook(CyberLevels main) { - this.main = main; - } - - @Override - public Key getKey() { - return KEY; - } - - @Override - public Material getIcon() { - return Material.EXPERIENCE_BOTTLE; - } - - @Override - public boolean isPersistent() { - return false; - } - - double getMultiplier(Player player) { - if (player == null) return 1D; - - try { - User user = UserList.getUser(player); - if (user == null) return 1D; - - float boost = user.getBoost(this); - if (Float.isNaN(boost) || boost <= 0F) return 1D; - return boost; - } catch (Throwable t) { - return 1D; - } - } - - @EventHandler - public void onAxBoostersLoad(AxBoostersLoadEvent event) { - synchronized (AxBoostersHook.class) { - if (registered != null) return; - try { - AxBoostersAPI.registerBoosterHook(main, this); - registered = this; - } catch (Throwable t) { - main.logger("&cFailed to register AxBoosters hook: " + t.getMessage()); - } - } - } - - @Override - public void register() { - main.getServer().getPluginManager().registerEvents(this, main); - } - - @Override - public void unregister() { - HandlerList.unregisterAll(this); - } -} diff --git a/src/main/java/com/bitaspire/cyberlevels/hook/AxHoesHook.java b/src/main/java/com/bitaspire/cyberlevels/hook/AxHoesHook.java deleted file mode 100644 index f4d4c44..0000000 --- a/src/main/java/com/bitaspire/cyberlevels/hook/AxHoesHook.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.bitaspire.cyberlevels.hook; - -import com.artillexstudios.axhoes.api.events.PlayerXPGainEvent; -import com.bitaspire.cyberlevels.CyberLevels; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - -/** - * AxHoes integration. - * - *

AxHoes cancels the vanilla {@link org.bukkit.event.block.BlockBreakEvent} for tool-managed - * breaks and runs its own drop/XP pipeline, which makes a {@code BlockBreakEvent} listener - * unreliable as a trigger. Instead we listen to AxHoes' own {@link PlayerXPGainEvent}, which is - * fired once per successful break, and dispatch a single roll of the {@code axhoes-breaking} - * earn-exp source. The event carries no block reference, so per-block include/specific lists are - * ignored — configure {@code general.exp} to set the flat reward. - */ -final class AxHoesHook implements Hook, Listener { - - private final CyberLevels main; - private final HookManager manager; - - AxHoesHook(CyberLevels main, HookManager manager) { - this.main = main; - this.manager = manager; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - private void onPlayerXPGain(PlayerXPGainEvent event) { - manager.sendExp( - event.getPlayer(), - main.cache().earnExp().getExpSources().get("axhoes-breaking"), - "" - ); - } - - @Override - public void register() { - main.getServer().getPluginManager().registerEvents(this, main); - } - - @Override - public void unregister() { - HandlerList.unregisterAll(this); - } -} diff --git a/src/main/java/com/bitaspire/cyberlevels/hook/AxPickHook.java b/src/main/java/com/bitaspire/cyberlevels/hook/AxPickHook.java deleted file mode 100644 index 1a97603..0000000 --- a/src/main/java/com/bitaspire/cyberlevels/hook/AxPickHook.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.bitaspire.cyberlevels.hook; - -import com.artillexstudios.axpickaxes.api.events.PlayerXPGainEvent; -import com.bitaspire.cyberlevels.CyberLevels; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; - -/** - * AxPickaxes integration. - * - *

AxPickaxes cancels the vanilla {@link org.bukkit.event.block.BlockBreakEvent} for tool-managed - * breaks and runs its own drop/XP pipeline, which makes a {@code BlockBreakEvent} listener - * unreliable as a trigger. Instead we listen to AxPickaxes' own {@link PlayerXPGainEvent}, which - * is fired once per successful break, and dispatch a single roll of the {@code axpick-breaking} - * earn-exp source. The event carries no block reference, so per-block include/specific lists are - * ignored — configure {@code general.exp} to set the flat reward. - */ -final class AxPickHook implements Hook, Listener { - - private final CyberLevels main; - private final HookManager manager; - - AxPickHook(CyberLevels main, HookManager manager) { - this.main = main; - this.manager = manager; - } - - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - private void onPlayerXPGain(PlayerXPGainEvent event) { - manager.sendExp( - event.getPlayer(), - main.cache().earnExp().getExpSources().get("axpick-breaking"), - "" - ); - } - - @Override - public void register() { - main.getServer().getPluginManager().registerEvents(this, main); - } - - @Override - public void unregister() { - HandlerList.unregisterAll(this); - } -} diff --git a/src/main/java/com/bitaspire/cyberlevels/hook/HookManager.java b/src/main/java/com/bitaspire/cyberlevels/hook/HookManager.java index 7226dd7..9f53191 100644 --- a/src/main/java/com/bitaspire/cyberlevels/hook/HookManager.java +++ b/src/main/java/com/bitaspire/cyberlevels/hook/HookManager.java @@ -5,10 +5,6 @@ import com.bitaspire.cyberlevels.level.ExpSource; import com.bitaspire.cyberlevels.user.LevelUser; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; -import org.bukkit.event.server.PluginEnableEvent; import java.util.HashSet; import java.util.Set; @@ -24,11 +20,6 @@ public class HookManager { private final Set hooks = new HashSet<>(); private final CyberLevels main; - private AxBoostersHook axBoostersHook; - private boolean axHoesLoaded; - private boolean axPickLoaded; - private boolean globalRegistered; - private final LateHookListener lateListener = new LateHookListener(); /** * Creates and eagerly loads every supported integration that is available on the server. @@ -61,20 +52,6 @@ public HookManager(CyberLevels main) { main.logger("&7Loaded &eRivalPickaxes&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7."); } - if (main.isEnabled("AxBoosters")) { - final long l = System.currentTimeMillis(); - axBoostersHook = new AxBoostersHook(main); - hooks.add(axBoostersHook); - main.logger("&7Loaded &eAxBoosters&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7."); - } - - // AxHoes and AxPickaxes both list CyberLevels in their own softdepend, which makes Bukkit - // commonly enable them AFTER us — so a plain isEnabled() check at construction misses them. - // We try to load eagerly here when possible, then attach a PluginEnableEvent listener as a - // fallback that activates the hook the moment those plugins finish enabling. - loadAxHoesIfReady(); - loadAxPickIfReady(); - int c = hooks.size(); main.logger("&7Loaded &e" + c + "&7 plugin hook" + (c == 1 ? "" : "s") + @@ -82,37 +59,7 @@ public HookManager(CyberLevels main) { "ms&7.", ""); } - private synchronized boolean loadAxHoesIfReady() { - if (axHoesLoaded) return false; - if (!main.isEnabled("AxHoes")) return false; - - final long l = System.currentTimeMillis(); - AxHoesHook hook = new AxHoesHook(main, this); - hooks.add(hook); - // Only register here if the global register() pass has already run; otherwise it'll be - // picked up by hooks.forEach(Hook::register) later. Registering twice would attach the - // listener twice and double-count every PlayerXPGainEvent. - if (globalRegistered) hook.register(); - axHoesLoaded = true; - main.logger("&7Loaded &eAxHoes&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7."); - return true; - } - - private synchronized boolean loadAxPickIfReady() { - if (axPickLoaded) return false; - if (!main.isEnabled("AxPickaxes")) return false; - - final long l = System.currentTimeMillis(); - AxPickHook hook = new AxPickHook(main, this); - hooks.add(hook); - if (globalRegistered) hook.register(); - axPickLoaded = true; - main.logger("&7Loaded &eAxPickaxes&7 plugin hook in &a" + (System.currentTimeMillis() - l) + "ms&7."); - return true; - } - void sendExp(Player player, ExpSource source, String item) { - if (source == null) return; if (main.levelSystem().checkAntiAbuse(player, source)) return; double counter = 0; @@ -137,32 +84,11 @@ void sendExp(Player player, ExpSource source, String item) { user.removeExp(Math.abs(counter)); } - /** - * Returns the multiplier currently applied to {@code player} by external boost integrations. - * - *

This combines every loaded multiplier-providing hook (currently AxBoosters) into a single - * scalar that callers can apply on top of permission-based multipliers. - * - * @param player target player; {@code null} returns 1.0 - * @return non-negative multiplier; 1.0 when no boost is active - */ - public double externalMultiplier(Player player) { - if (player == null) return 1D; - - double multiplier = 1D; - if (axBoostersHook != null) multiplier *= axBoostersHook.getMultiplier(player); - return multiplier; - } - /** * Registers all loaded hooks with their respective target plugins or services. */ public void register() { hooks.forEach(Hook::register); - // Catch plugins that enable AFTER us — primarily AxHoes and AxPickaxes, which softdepend - // on CyberLevels and therefore typically load later in the plugin enable order. - main.getServer().getPluginManager().registerEvents(lateListener, main); - globalRegistered = true; } /** @@ -172,21 +98,7 @@ public void register() { * reload. */ public void unregister() { - HandlerList.unregisterAll(lateListener); hooks.forEach(Hook::unregister); hooks.clear(); - axHoesLoaded = false; - axPickLoaded = false; - globalRegistered = false; - } - - private final class LateHookListener implements Listener { - - @EventHandler - public void onPluginEnable(PluginEnableEvent event) { - String name = event.getPlugin().getName(); - if ("AxHoes".equals(name)) loadAxHoesIfReady(); - else if ("AxPickaxes".equals(name)) loadAxPickIfReady(); - } } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 5facc30..2258b24 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -3,7 +3,7 @@ config: # Tested on MySQL 10.4 and MariaDB 10.6. mysql: enabled: true # When enabled, will use type below. When disabled, this will fall-back to file storage. - type: SQLITE # Can also be MARIADB, SQLITE, POSTGRES, POSTGRESQL, H2 + type: SQLITE # Can also be MARIADB, SQLITE, POSTGRES, POSTGRESQL host: 'localhost' port: '3306' database: 'cyberlevels' @@ -12,10 +12,6 @@ config: table: 'levels' ssl: true sqlite-file: "plugins/CyberLevels/data.db" - # Embedded H2 database file (used when type: H2). H2 will append its own - # extension (.mv.db) to the path below. AUTO_SERVER mode is enabled so - # multiple JVM processes on the same host can share the file. - h2-file: "plugins/CyberLevels/data.h2" # Should the plugin use BigDecimal for all calculations? # Can be required if you plan to use very large numbers, otherwise keep disabled. diff --git a/src/main/resources/earn-exp.yml b/src/main/resources/earn-exp.yml index 523ce40..2aee3ff 100644 --- a/src/main/resources/earn-exp.yml +++ b/src/main/resources/earn-exp.yml @@ -402,42 +402,3 @@ earn-exp: stack-with-general: true blocks: - 'DIAMOND_ORE: 4, 6' - - # Used for AxHoes (Artillex Studios). Triggered by AxHoes' own PlayerXPGainEvent - # (fired when AxHoes confirms a successful break with one of its tools), NOT by - # the vanilla BlockBreakEvent — AxHoes cancels that and runs its own break logic. - # Per-block include/specific lists therefore have no effect; only the general - # range applies. Set general.exp to choose the CyberLevels XP reward per break. - axhoes-breaking: - general: - enabled: false - exp: 1 - includes: - enabled: false - whitelist: false - list: - - "POTATO" - - "BEET_ROOT" - specific-blocks: - enabled: false - stack-with-general: true - blocks: - - 'CARROT: 4, 6' - - # Used for AxPickaxes (Artillex Studios). Same caveats as axhoes-breaking above: - # triggered by AxPickaxes' PlayerXPGainEvent, only the general range is used. - axpick-breaking: - general: - enabled: false - exp: 1 - includes: - enabled: false - whitelist: false - list: - - "DIRT" - - "GRASS_BLOCK" - specific-blocks: - enabled: false - stack-with-general: true - blocks: - - 'DIAMOND_ORE: 4, 6' diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index f680b0b..6aa987d 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -26,9 +26,6 @@ softdepend: - CyberWorldReset - RivalHarvesterHoes - RivalPickaxes - - AxBoosters - - AxHoes - - AxPickaxes libraries: - ch.obermuhlner:big-math:2.3.2 @@ -36,5 +33,4 @@ libraries: - com.mysql:mysql-connector-j:9.5.0 - org.xerial:sqlite-jdbc:3.51.1.0 - org.postgresql:postgresql:42.7.8 - - com.h2database:h2:2.3.232 - org.apache.commons:commons-lang3:3.18.0 \ No newline at end of file