From ee3ed61809aa8a6657c70eea5e8aa9726d77dc72 Mon Sep 17 00:00:00 2001 From: petulikan1 Date: Wed, 10 Jan 2024 21:00:57 +0100 Subject: [PATCH] Added event unregistering when plugin disabling, implemented the unused MONEY_EARNED_OFFLINE language field + added the possibility to delay the message (in ticks @ config.yml), made few code improvements --- .../bgsoftware/wildchests/WildChestsPlugin.java | 7 +++++-- .../wildchests/handlers/DataHandler.java | 8 +++----- .../wildchests/handlers/ProvidersHandler.java | 4 ++-- .../wildchests/handlers/SettingsHandler.java | 2 ++ .../wildchests/listeners/PlayerListener.java | 14 ++++++++++++++ .../bgsoftware/wildchests/utils/ChestUtils.java | 10 ++++------ src/main/resources/config.yml | 3 +++ 7 files changed, 33 insertions(+), 15 deletions(-) diff --git a/src/main/java/com/bgsoftware/wildchests/WildChestsPlugin.java b/src/main/java/com/bgsoftware/wildchests/WildChestsPlugin.java index 6b67a2a6..2d6c5c6c 100644 --- a/src/main/java/com/bgsoftware/wildchests/WildChestsPlugin.java +++ b/src/main/java/com/bgsoftware/wildchests/WildChestsPlugin.java @@ -29,6 +29,7 @@ import org.bukkit.World; import org.bukkit.entity.HumanEntity; import org.bukkit.entity.Player; +import org.bukkit.event.HandlerList; import org.bukkit.inventory.Inventory; import org.bukkit.plugin.java.JavaPlugin; @@ -138,6 +139,8 @@ public void onDisable() { Executor.stop(); log("Terminating database..."); SQLHelper.close(); + log("Terminating events..."); + HandlerList.unregisterAll(this); } private void loadAPI() { @@ -188,8 +191,8 @@ private boolean loadNMSAdapter() { if (version != null) { try { - nmsAdapter = (NMSAdapter) Class.forName(String.format("com.bgsoftware.wildchests.nms.%s.NMSAdapter", version)).newInstance(); - nmsInventory = (NMSInventory) Class.forName(String.format("com.bgsoftware.wildchests.nms.%s.NMSInventory", version)).newInstance(); + nmsAdapter = (NMSAdapter) Class.forName(String.format("com.bgsoftware.wildchests.nms.%s.NMSAdapter", version)).getDeclaredConstructor().newInstance(); + nmsInventory = (NMSInventory) Class.forName(String.format("com.bgsoftware.wildchests.nms.%s.NMSInventory", version)).getDeclaredConstructor().newInstance(); return true; } catch (Exception error) { diff --git a/src/main/java/com/bgsoftware/wildchests/handlers/DataHandler.java b/src/main/java/com/bgsoftware/wildchests/handlers/DataHandler.java index b5311575..4d4fc8df 100644 --- a/src/main/java/com/bgsoftware/wildchests/handlers/DataHandler.java +++ b/src/main/java/com/bgsoftware/wildchests/handlers/DataHandler.java @@ -27,10 +27,8 @@ import java.io.IOException; import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.List; import java.util.UUID; -import java.util.stream.Collectors; @SuppressWarnings("ResultOfMethodCallIgnored") public final class DataHandler { @@ -56,13 +54,13 @@ public void saveDatabase(Chunk chunk, boolean async) { List regularModifiedChests = chestList.stream() .filter(chest -> chest.getChestType() == ChestType.CHEST) - .collect(Collectors.toList()); + .toList(); List storageModifiedChests = chestList.stream() .filter(chest -> chest.getChestType() == ChestType.STORAGE_UNIT) - .collect(Collectors.toList()); + .toList(); List linkedChestsModifiedChests = chestList.stream() .filter(chest -> chest.getChestType() == ChestType.LINKED_CHEST) - .collect(Collectors.toList()); + .toList(); if (!regularModifiedChests.isEmpty()) { StatementHolder chestsUpdateHolder = Query.REGULAR_CHEST_UPDATE_INVENTORIES.getStatementHolder(null); diff --git a/src/main/java/com/bgsoftware/wildchests/handlers/ProvidersHandler.java b/src/main/java/com/bgsoftware/wildchests/handlers/ProvidersHandler.java index 797ebe0a..f4e95c01 100644 --- a/src/main/java/com/bgsoftware/wildchests/handlers/ProvidersHandler.java +++ b/src/main/java/com/bgsoftware/wildchests/handlers/ProvidersHandler.java @@ -198,7 +198,7 @@ private void registerPricesProvider(WildChestsPlugin plugin) { .flatMap(shopsProvider -> shopsProvider.createInstance(plugin).map(shopsBridge -> new PricesProvider_ShopsBridgeWrapper(shopsProvider, shopsBridge))); - if (!pricesProvider.isPresent()) { + if (pricesProvider.isEmpty()) { WildChestsPlugin.log("- Couldn't find any prices providers, using default one"); return; } @@ -277,7 +277,7 @@ private Optional createInstance(String className) { return Optional.of((T) constructor.newInstance(plugin)); } catch (Exception error) { // noinspection unchecked - return Optional.of((T) clazz.newInstance()); + return Optional.of((T) clazz.getDeclaredConstructor().newInstance()); } } catch (ClassNotFoundException ignored) { return Optional.empty(); diff --git a/src/main/java/com/bgsoftware/wildchests/handlers/SettingsHandler.java b/src/main/java/com/bgsoftware/wildchests/handlers/SettingsHandler.java index bbcda85f..3903f0fc 100644 --- a/src/main/java/com/bgsoftware/wildchests/handlers/SettingsHandler.java +++ b/src/main/java/com/bgsoftware/wildchests/handlers/SettingsHandler.java @@ -38,6 +38,7 @@ public final class SettingsHandler { public final boolean invalidWorldDelete; public final boolean wildStackerHook; public final int maximumPickupDelay; + public final int offlineMoneyMessageDelay; public SettingsHandler(WildChestsPlugin plugin) { WildChestsPlugin.log("Loading configuration started..."); @@ -67,6 +68,7 @@ public SettingsHandler(WildChestsPlugin plugin) { invalidWorldDelete = cfg.getBoolean("database.invalid-world-delete", false); wildStackerHook = cfg.getBoolean("hooks.wildstacker", true); maximumPickupDelay = cfg.getInt("maximum-pickup-delay", 32767); + offlineMoneyMessageDelay = cfg.getInt("offline-money-message-delay",10); Map prices = new HashMap<>(); diff --git a/src/main/java/com/bgsoftware/wildchests/listeners/PlayerListener.java b/src/main/java/com/bgsoftware/wildchests/listeners/PlayerListener.java index a412513b..1b8ca184 100644 --- a/src/main/java/com/bgsoftware/wildchests/listeners/PlayerListener.java +++ b/src/main/java/com/bgsoftware/wildchests/listeners/PlayerListener.java @@ -1,12 +1,18 @@ package com.bgsoftware.wildchests.listeners; +import com.bgsoftware.wildchests.Locale; import com.bgsoftware.wildchests.WildChestsPlugin; +import com.bgsoftware.wildchests.utils.ChestUtils; import com.bgsoftware.wildchests.utils.Executor; +import com.bgsoftware.wildchests.utils.StringUtils; +import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerJoinEvent; +import java.math.BigDecimal; + @SuppressWarnings("unused") public final class PlayerListener implements Listener { @@ -33,6 +39,14 @@ public void onPlayerJoin(PlayerJoinEvent e){ e.getPlayer().sendMessage(ChatColor.DARK_PURPLE + "" + ChatColor.BOLD + "WildChests" + ChatColor.GRAY + " A new version is available (v" + plugin.getUpdater().getLatestVersion() + ")!"), 20L); } + Bukkit.getScheduler().runTaskLater(plugin,()->{ + if (ChestUtils.offlineDeposit.containsKey(e.getPlayer().getUniqueId())) { + BigDecimal bigdecimal = BigDecimal.valueOf(ChestUtils.offlineDeposit.get(e.getPlayer().getUniqueId())); + Locale.MONEY_EARNED_OFFLINE.send(e.getPlayer(), plugin.getSettings().sellFormat ? + StringUtils.fancyFormat(bigdecimal) : StringUtils.format(bigdecimal)); + ChestUtils.offlineDeposit.remove(e.getPlayer().getUniqueId()); + } + }, plugin.getSettings().offlineMoneyMessageDelay); } } diff --git a/src/main/java/com/bgsoftware/wildchests/utils/ChestUtils.java b/src/main/java/com/bgsoftware/wildchests/utils/ChestUtils.java index 10ef5a86..4fe6fe71 100644 --- a/src/main/java/com/bgsoftware/wildchests/utils/ChestUtils.java +++ b/src/main/java/com/bgsoftware/wildchests/utils/ChestUtils.java @@ -16,12 +16,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.Recipe; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; +import java.util.*; import java.util.function.BiPredicate; public final class ChestUtils { @@ -30,6 +25,7 @@ public final class ChestUtils { private static final WildChestsPlugin plugin = WildChestsPlugin.getPlugin(); public static final short DEFAULT_COOLDOWN = 20; + public static final HashMap offlineDeposit = new HashMap<>(); public static final BiPredicate SUCTION_PREDICATE = (item, chestData) -> { Key itemKey = item.getItemStack() == null ? Key.of("AIR:0") : Key.of(item.getItemStack()); @@ -183,6 +179,8 @@ public static boolean trySellItem(OfflinePlayer player, Chest chest, ItemStack t if (successDeposit) NotifierTask.addTransaction(player.getUniqueId(), toSell, toSell.getAmount(), finalPrice); + if(!player.isOnline()) + offlineDeposit.put(player.getUniqueId(),offlineDeposit.getOrDefault(player.getUniqueId(),0.0)+finalPrice); return successDeposit; } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 7358bb8c..6e9589e3 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -53,6 +53,9 @@ hooks: # The maximum pickup delay items can have for the suction chests to pick them up. maximum-pickup-delay: 32767 +# How long the received money while being offline message should be delayed (in ticks) +offline-money-message-delay: 10 + # The plugin brings tons of new custom and unique chests to your server. All the chests are configurable, and # you can create and mix between them. You can create chests that stores infinite amount of items, chests that # are connected to player vaults or factions, linked chests and many more!