From 54da6fe236ad7a3f4ed385e5169cfef3357e7fab Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Sun, 10 Sep 2023 18:59:24 +0800 Subject: [PATCH] fish finder --- .../api/manager/FishingManager.java | 7 +- .../api/mechanic/action/ActionTrigger.java | 3 +- .../api/mechanic/condition/Condition.java | 4 + .../CustomFishingPluginImpl.java | 23 +++-- .../adventure/AdventureManagerImpl.java | 10 +-- .../command/CommandManagerImpl.java | 8 +- .../command/sub/CompetitionCommand.java | 20 ++--- .../command/sub/FishingBagCommand.java | 9 +- .../command/sub/ItemCommand.java | 10 +-- .../compatibility/papi/CompetitionPapi.java | 10 +-- .../mechanic/action/ActionManagerImpl.java | 24 +++++- .../mechanic/bag/BagManagerImpl.java | 9 +- .../mechanic/competition/Competition.java | 18 ++-- .../competition/CompetitionManagerImpl.java | 13 +-- .../actionbar/ActionBarSender.java | 4 +- .../competition/bossbar/BossBarSender.java | 4 +- .../mechanic/effect/EffectManagerImpl.java | 2 +- .../mechanic/fishing/FishingManagerImpl.java | 59 ++++++++----- .../mechanic/fishing/HookCheckTimerTask.java | 6 +- .../mechanic/item/ItemManagerImpl.java | 4 +- .../mechanic/misc/CoolDownManager.java | 83 +++++++++++++++++++ .../requirement/EmptyRequirement.java | 17 ++++ .../requirement/RequirementManagerImpl.java | 21 ++++- .../scheduler/SchedulerImpl.java | 8 +- .../setting/{Config.java => CFConfig.java} | 2 +- .../setting/{Locale.java => CFLocale.java} | 14 +++- .../storage/StorageManagerImpl.java | 8 +- .../database/sql/AbstractSQLDatabase.java | 4 +- .../method/database/sql/SQLiteImpl.java | 4 +- .../storage/user/OfflineUserImpl.java | 4 +- .../main/resources/contents/utils/default.yml | 46 ++++++---- .../src/main/resources/messages/english.yml | 4 +- 32 files changed, 330 insertions(+), 132 deletions(-) create mode 100644 plugin/src/main/java/net/momirealms/customfishing/mechanic/misc/CoolDownManager.java rename plugin/src/main/java/net/momirealms/customfishing/setting/{Config.java => CFConfig.java} (99%) rename plugin/src/main/java/net/momirealms/customfishing/setting/{Locale.java => CFLocale.java} (90%) diff --git a/api/src/main/java/net/momirealms/customfishing/api/manager/FishingManager.java b/api/src/main/java/net/momirealms/customfishing/api/manager/FishingManager.java index b481379c..4a8d24f0 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/manager/FishingManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/manager/FishingManager.java @@ -18,6 +18,7 @@ package net.momirealms.customfishing.api.manager; import net.momirealms.customfishing.api.mechanic.TempFishingState; +import net.momirealms.customfishing.api.mechanic.condition.Condition; import net.momirealms.customfishing.api.mechanic.condition.FishingPreparation; import net.momirealms.customfishing.api.mechanic.effect.Effect; import net.momirealms.customfishing.api.mechanic.game.GameInstance; @@ -46,11 +47,11 @@ public interface FishingManager { void processGameResult(GamingPlayer gamingPlayer); - Collection getPossibleLootKeys(FishingPreparation fishingPreparation); + Collection getPossibleLootKeys(Condition condition); - @NotNull Map getPossibleLootKeysWithWeight(Effect initialEffect, FishingPreparation fishingPreparation); + @NotNull Map getPossibleLootKeysWithWeight(Effect initialEffect, Condition condition); - Loot getNextLoot(Effect initialEffect, FishingPreparation fishingPreparation); + Loot getNextLoot(Effect initialEffect, Condition condition); void startFishingGame(Player player, Loot loot, Effect effect); diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/action/ActionTrigger.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/action/ActionTrigger.java index 03e837d2..40b4e545 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/action/ActionTrigger.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/action/ActionTrigger.java @@ -25,5 +25,6 @@ public enum ActionTrigger { CONSUME, CAST, BITE, - LAND + LAND, + INTERACT } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/condition/Condition.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/condition/Condition.java index 5eedd3a3..4d0c799d 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/condition/Condition.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/condition/Condition.java @@ -82,4 +82,8 @@ public class Condition { public void insertArg(String key, String value) { args.put(key, value); } + + public String delArg(String key) { + return args.remove(key); + } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java b/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java index 5fa98d0d..a66d1096 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java @@ -43,9 +43,10 @@ import net.momirealms.customfishing.mechanic.mob.MobManagerImpl; import net.momirealms.customfishing.mechanic.requirement.RequirementManagerImpl; import net.momirealms.customfishing.mechanic.statistic.StatisticsManagerImpl; import net.momirealms.customfishing.scheduler.SchedulerImpl; -import net.momirealms.customfishing.setting.Config; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFConfig; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.storage.StorageManagerImpl; +import net.momirealms.customfishing.mechanic.misc.CoolDownManager; import net.momirealms.customfishing.version.VersionManagerImpl; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; @@ -58,6 +59,7 @@ import java.util.TimeZone; public class CustomFishingPluginImpl extends CustomFishingPlugin { private static ProtocolManager protocolManager; + private CoolDownManager coolDownManager; public CustomFishingPluginImpl() { super(); @@ -94,8 +96,9 @@ public class CustomFishingPluginImpl extends CustomFishingPlugin { this.competitionManager = new CompetitionManagerImpl(this); this.integrationManager = new IntegrationManagerImpl(this); this.statisticsManager = new StatisticsManagerImpl(this); + this.coolDownManager = new CoolDownManager(this); this.reload(); - if (Config.updateChecker) + if (CFConfig.updateChecker) this.versionManager.checkUpdate().thenAccept(result -> { if (!result) this.getAdventure().sendConsoleMessage("[CustomFishing] You are using the latest version."); else this.getAdventure().sendConsoleMessage("[CustomFishing] Update is available: https://polymart.org/resource/customfishing.2723"); @@ -122,12 +125,14 @@ public class CustomFishingPluginImpl extends CustomFishingPlugin { ((PlaceholderManagerImpl) this.placeholderManager).disable(); ((StatisticsManagerImpl) this.statisticsManager).disable(); ((ActionManagerImpl) this.actionManager).disable(); + this.coolDownManager.disable(); + this.commandManager.unload(); } @Override public void reload() { - Config.load(); - Locale.load(); + CFConfig.load(); + CFLocale.load(); ((SchedulerImpl) this.scheduler).reload(); ((RequirementManagerImpl) this.requirementManager).unload(); ((RequirementManagerImpl) this.requirementManager).load(); @@ -160,6 +165,8 @@ public class CustomFishingPluginImpl extends CustomFishingPlugin { ((PlaceholderManagerImpl) this.placeholderManager).load(); this.commandManager.unload(); this.commandManager.load(); + this.coolDownManager.unload(); + this.coolDownManager.load(); } private void loadDependencies() { @@ -233,7 +240,11 @@ public class CustomFishingPluginImpl extends CustomFishingPlugin { } public void debug(String message) { - if (!Config.debug) return; + if (!CFConfig.debug) return; LogUtils.info(message); } + + public CoolDownManager getCoolDownManager() { + return coolDownManager; + } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/adventure/AdventureManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/adventure/AdventureManagerImpl.java index b0e141c0..9a8a384b 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/adventure/AdventureManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/adventure/AdventureManagerImpl.java @@ -29,8 +29,8 @@ import net.kyori.adventure.title.Title; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.manager.AdventureManager; import net.momirealms.customfishing.api.util.ReflectionUtils; -import net.momirealms.customfishing.setting.Config; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFConfig; +import net.momirealms.customfishing.setting.CFLocale; import org.bukkit.Bukkit; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; @@ -60,7 +60,7 @@ public class AdventureManagerImpl implements AdventureManager { @Override public Component getComponentFromMiniMessage(String text) { - if (Config.legacyColorSupport) { + if (CFConfig.legacyColorSupport) { return MiniMessage.miniMessage().deserialize(legacyToMiniMessage(text)); } else { return MiniMessage.miniMessage().deserialize(text); @@ -77,8 +77,8 @@ public class AdventureManagerImpl implements AdventureManager { @Override public void sendMessageWithPrefix(CommandSender sender, String s) { if (s == null) return; - if (sender instanceof Player player) sendPlayerMessage(player, Locale.MSG_Prefix + s); - else if (sender instanceof ConsoleCommandSender) sendConsoleMessage(Locale.MSG_Prefix + s); + if (sender instanceof Player player) sendPlayerMessage(player, CFLocale.MSG_Prefix + s); + else if (sender instanceof ConsoleCommandSender) sendConsoleMessage(CFLocale.MSG_Prefix + s); } @Override diff --git a/plugin/src/main/java/net/momirealms/customfishing/command/CommandManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/command/CommandManagerImpl.java index 1998173f..59a5ae8e 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/command/CommandManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/command/CommandManagerImpl.java @@ -25,7 +25,7 @@ import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.manager.CommandManager; import net.momirealms.customfishing.api.util.LogUtils; import net.momirealms.customfishing.command.sub.*; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import org.bukkit.entity.Player; import org.bukkit.inventory.Inventory; @@ -80,7 +80,7 @@ public class CommandManagerImpl implements CommandManager { .executes((sender, args) -> { long time = System.currentTimeMillis(); plugin.reload(); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Reload.replace("{time}", String.valueOf(System.currentTimeMillis()-time))); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Reload.replace("{time}", String.valueOf(System.currentTimeMillis()-time))); }); } @@ -96,7 +96,7 @@ public class CommandManagerImpl implements CommandManager { assert players != null; for (Player player : players) { plugin.getMarketManager().openMarketGUI(player); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Market_GUI_Open.replace("{player}", player.getName())); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Market_GUI_Open.replace("{player}", player.getName())); } })); } @@ -111,7 +111,7 @@ public class CommandManagerImpl implements CommandManager { Inventory inventory = plugin.getBagManager().getOnlineBagInventory(player.getUniqueId()); if (inventory != null) { player.openInventory(inventory); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Market_GUI_Open.replace("{player}", player.getName())); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Fishing_Bag_Open.replace("{player}", player.getName())); } else { LogUtils.warn("Player " + player.getName() + "'s bag data has not been loaded."); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/command/sub/CompetitionCommand.java b/plugin/src/main/java/net/momirealms/customfishing/command/sub/CompetitionCommand.java index 366bf365..8f66e716 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/command/sub/CompetitionCommand.java +++ b/plugin/src/main/java/net/momirealms/customfishing/command/sub/CompetitionCommand.java @@ -23,8 +23,8 @@ import dev.jorel.commandapi.arguments.StringArgument; import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.competition.FishingCompetition; -import net.momirealms.customfishing.setting.Config; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFConfig; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.storage.method.database.nosql.RedisManager; import java.util.Set; @@ -52,12 +52,12 @@ public class CompetitionCommand { ArgumentSuggestions.strings(allCompetitions) ) ); - if (Config.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); + if (CFConfig.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); command.executes((sender, args) -> { String id = (String) args.get(0); assert id != null; if (!allCompetitions.contains(id)) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Competition_Not_Exist.replace("{id}", id)); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Competition_Not_Exist.replace("{id}", id)); return; } boolean allServer = args.getOrDefault(1, "").equals("-allservers"); @@ -68,7 +68,7 @@ public class CompetitionCommand { private CommandAPICommand getCompetitionEndCommand() { var command = new CommandAPICommand("end"); - if (Config.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); + if (CFConfig.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); command.executes((sender, args) -> { boolean allServer = args.getOrDefault(1, "").equals("-allservers"); if (allServer) { @@ -77,9 +77,9 @@ public class CompetitionCommand { FishingCompetition competition = CustomFishingPlugin.get().getCompetitionManager().getOnGoingCompetition(); if (competition != null) { competition.end(); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_End_Competition); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_End_Competition); } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_No_Competition_Ongoing); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_No_Competition_Ongoing); } } }); @@ -88,7 +88,7 @@ public class CompetitionCommand { private CommandAPICommand getCompetitionStopCommand() { var command = new CommandAPICommand("stop"); - if (Config.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); + if (CFConfig.redisRanking) command.withOptionalArguments(new StringArgument("-allservers")); command.executes((sender, args) -> { boolean allServer = args.getOrDefault(1, "").equals("-allservers"); if (allServer) { @@ -97,9 +97,9 @@ public class CompetitionCommand { FishingCompetition competition = CustomFishingPlugin.get().getCompetitionManager().getOnGoingCompetition(); if (competition != null) { competition.stop(); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Stop_Competition); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Stop_Competition); } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_No_Competition_Ongoing); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_No_Competition_Ongoing); } } }); diff --git a/plugin/src/main/java/net/momirealms/customfishing/command/sub/FishingBagCommand.java b/plugin/src/main/java/net/momirealms/customfishing/command/sub/FishingBagCommand.java index 28b4b0ee..581534e0 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/command/sub/FishingBagCommand.java +++ b/plugin/src/main/java/net/momirealms/customfishing/command/sub/FishingBagCommand.java @@ -20,11 +20,10 @@ package net.momirealms.customfishing.command.sub; import dev.jorel.commandapi.CommandAPICommand; import dev.jorel.commandapi.arguments.PlayerArgument; import dev.jorel.commandapi.arguments.UUIDArgument; -import net.momirealms.customfishing.CustomFishingPluginImpl; import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.data.user.OfflineUser; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.storage.user.OfflineUserImpl; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -46,7 +45,7 @@ public class FishingBagCommand { if (inv != null) { player.openInventory(inv); } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Data_Not_Loaded); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CFLocale.MSG_Data_Not_Loaded); } } })); @@ -82,12 +81,12 @@ public class FishingBagCommand { } CustomFishingPlugin.get().getStorageManager().getOfflineUser(uuid, false).thenAccept(optional -> { if (optional.isEmpty()) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Never_Played); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CFLocale.MSG_Never_Played); return; } OfflineUser offlineUser = optional.get(); if (offlineUser == OfflineUserImpl.LOCKED_USER) { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Unsafe_Modification); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CFLocale.MSG_Unsafe_Modification); return; } CustomFishingPlugin.get().getScheduler().runTaskSync(() -> { diff --git a/plugin/src/main/java/net/momirealms/customfishing/command/sub/ItemCommand.java b/plugin/src/main/java/net/momirealms/customfishing/command/sub/ItemCommand.java index c7bcf557..b4b392f1 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/command/sub/ItemCommand.java +++ b/plugin/src/main/java/net/momirealms/customfishing/command/sub/ItemCommand.java @@ -28,7 +28,7 @@ import net.momirealms.customfishing.api.common.Key; import net.momirealms.customfishing.api.mechanic.condition.Condition; import net.momirealms.customfishing.api.mechanic.item.BuildableItem; import net.momirealms.customfishing.mechanic.item.ItemManagerImpl; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import org.bukkit.entity.Player; import org.bukkit.inventory.ItemStack; @@ -81,9 +81,9 @@ public class ItemCommand { ItemStack item = CustomFishingPlugin.get().getItemManager().build(player, namespace, id, new Condition(player).getArgs()); if (item != null) { int actual = ItemManagerImpl.giveCertainAmountOfItem(player, item, amount); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Get_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual))); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CFLocale.MSG_Get_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual))); } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, Locale.MSG_Item_Not_Exists); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(player, CFLocale.MSG_Item_Not_Exists); } }); } @@ -107,10 +107,10 @@ public class ItemCommand { for (Player player : players) { ItemStack item = CustomFishingPlugin.get().getItemManager().build(player, namespace, id, new Condition(player).getArgs()); int actual = ItemManagerImpl.giveCertainAmountOfItem(player, item, amount); - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Give_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual)).replace("{player}", player.getName())); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Give_Item.replace("{item}", id).replace("{amount}", String.valueOf(actual)).replace("{player}", player.getName())); } } else { - AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, Locale.MSG_Item_Not_Exists); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(sender, CFLocale.MSG_Item_Not_Exists); } }); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/CompetitionPapi.java b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/CompetitionPapi.java index d9ebd025..c68b2492 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/CompetitionPapi.java +++ b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/CompetitionPapi.java @@ -20,7 +20,7 @@ package net.momirealms.customfishing.compatibility.papi; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.competition.FishingCompetition; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -73,22 +73,22 @@ public class CompetitionPapi extends PlaceholderExpansion { return String.valueOf(plugin.getCompetitionManager().getNextCompetitionSeconds()); } case "nextsecond" -> { - return plugin.getCompetitionManager().getNextCompetitionSeconds() % 60 + Locale.FORMAT_Second; + return plugin.getCompetitionManager().getNextCompetitionSeconds() % 60 + CFLocale.FORMAT_Second; } case "nextminute" -> { int sec = plugin.getCompetitionManager().getNextCompetitionSeconds(); int min = (sec % 3600) / 60; - return sec < 60 ? "" : min + Locale.FORMAT_Minute; + return sec < 60 ? "" : min + CFLocale.FORMAT_Minute; } case "nexthour" -> { int sec = plugin.getCompetitionManager().getNextCompetitionSeconds(); int h = (sec % (3600 * 24)) / 3600; - return sec < 3600 ? "" : h + Locale.FORMAT_Hour; + return sec < 3600 ? "" : h + CFLocale.FORMAT_Hour; } case "nextday" -> { int sec = plugin.getCompetitionManager().getNextCompetitionSeconds(); int day = sec / (3600 * 24); - return day == 0 ? "" : day + Locale.FORMAT_Day; + return day == 0 ? "" : day + CFLocale.FORMAT_Day; } case "rank" -> { FishingCompetition competition = plugin.getCompetitionManager().getOnGoingCompetition(); diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/action/ActionManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/action/ActionManagerImpl.java index d71c14b1..336b62ac 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/action/ActionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/action/ActionManagerImpl.java @@ -23,14 +23,17 @@ import net.momirealms.customfishing.adventure.AdventureManagerImpl; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.common.Pair; import net.momirealms.customfishing.api.manager.ActionManager; +import net.momirealms.customfishing.api.manager.LootManager; import net.momirealms.customfishing.api.mechanic.GlobalSettings; import net.momirealms.customfishing.api.mechanic.action.Action; import net.momirealms.customfishing.api.mechanic.action.ActionExpansion; import net.momirealms.customfishing.api.mechanic.action.ActionFactory; import net.momirealms.customfishing.api.mechanic.action.ActionTrigger; +import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.api.mechanic.requirement.Requirement; import net.momirealms.customfishing.api.util.LogUtils; import net.momirealms.customfishing.compatibility.papi.PlaceholderManagerImpl; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.util.ArmorStandUtils; import net.momirealms.customfishing.util.ClassUtils; import net.momirealms.customfishing.util.ConfigUtils; @@ -81,6 +84,7 @@ public class ActionManagerImpl implements ActionManager { this.registerLevelAction(); this.registerHologramAction(); this.registerFakeItemAction(); + this.registerFishFindAction(); } public void load() { @@ -478,7 +482,7 @@ public class ActionManagerImpl implements ActionManager { registerAction("conditional", (args, chance) -> { if (args instanceof ConfigurationSection section) { Action[] actions = getActions(section.getConfigurationSection("actions")); - Requirement[] requirements = plugin.getRequirementManager().getRequirements(section.getConfigurationSection("conditions"), false); + Requirement[] requirements = plugin.getRequirementManager().getRequirements(section.getConfigurationSection("conditions"), true); return condition -> { if (Math.random() > chance) return; if (requirements != null) @@ -549,6 +553,24 @@ public class ActionManagerImpl implements ActionManager { }); } + private void registerFishFindAction() { + registerAction("fish-finder", (args, chance) -> { + boolean arg = (boolean) args; + return condition -> { + if (Math.random() > chance) return; + condition.insertArg("{lava}", String.valueOf(arg)); + LootManager lootManager = plugin.getLootManager(); + List loots = plugin.getFishingManager().getPossibleLootKeys(condition).stream().map(lootManager::getLoot).filter(Objects::nonNull).filter(Loot::showInFinder).map(Loot::getNick).toList(); + StringJoiner stringJoiner = new StringJoiner(CFLocale.MSG_Split_Char); + for (String loot : loots) { + stringJoiner.add(loot); + } + condition.delArg("{lava}"); + AdventureManagerImpl.getInstance().sendMessageWithPrefix(condition.getPlayer(), CFLocale.MSG_Possible_Loots + stringJoiner); + }; + }); + } + @SuppressWarnings("ResultOfMethodCallIgnored") private void loadExpansions() { File expansionFolder = new File(plugin.getDataFolder(), EXPANSION_FOLDER); diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/bag/BagManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/bag/BagManagerImpl.java index 2d5b8ad7..f2ac29b0 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/bag/BagManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/bag/BagManagerImpl.java @@ -22,8 +22,7 @@ import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.data.user.OfflineUser; import net.momirealms.customfishing.api.manager.BagManager; import net.momirealms.customfishing.api.mechanic.bag.FishingBagHolder; -import net.momirealms.customfishing.api.mechanic.condition.Condition; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Bukkit; import org.bukkit.Material; import org.bukkit.entity.Player; @@ -51,7 +50,7 @@ public class BagManagerImpl implements BagManager, Listener { @Override public boolean isEnabled() { - return Config.enableFishingBag; + return CFConfig.enableFishingBag; } public void load() { @@ -105,7 +104,7 @@ public class BagManagerImpl implements BagManager, Listener { ItemStack clickedItem = event.getCurrentItem(); if (clickedItem == null || clickedItem.getType() == Material.AIR) return; - if (Config.bagWhiteListItems.contains(clickedItem.getType())) + if (CFConfig.bagWhiteListItems.contains(clickedItem.getType())) return; String id = plugin.getItemManager().getAnyItemID(clickedItem); if (plugin.getEffectManager().getEffect("rod", id) != null) @@ -114,7 +113,7 @@ public class BagManagerImpl implements BagManager, Listener { return; if (plugin.getEffectManager().getEffect("util", id) != null) return; - if (Config.bagStoreLoots && plugin.getLootManager().getLoot(id) != null) + if (CFConfig.bagStoreLoots && plugin.getLootManager().getLoot(id) != null) return; event.setCancelled(true); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/Competition.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/Competition.java index c5703e6a..58e27c18 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/Competition.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/Competition.java @@ -30,8 +30,8 @@ import net.momirealms.customfishing.mechanic.competition.actionbar.ActionBarMana import net.momirealms.customfishing.mechanic.competition.bossbar.BossBarManager; import net.momirealms.customfishing.mechanic.competition.ranking.LocalRankingImpl; import net.momirealms.customfishing.mechanic.competition.ranking.RedisRankingImpl; -import net.momirealms.customfishing.setting.Config; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFConfig; +import net.momirealms.customfishing.setting.CFLocale; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -59,7 +59,7 @@ public class Competition implements FishingCompetition { public Competition(CompetitionConfig config) { this.config = config; this.goal = config.getGoal() == CompetitionGoal.RANDOM ? CompetitionGoal.getRandom() : config.getGoal(); - if (Config.redisRanking) this.ranking = new RedisRankingImpl(); + if (CFConfig.redisRanking) this.ranking = new RedisRankingImpl(); else this.ranking = new LocalRankingImpl(); this.publicPlaceholders = new ConcurrentHashMap<>(); this.publicPlaceholders.put("{goal}", CustomFishingPlugin.get().getCompetitionManager().getCompetitionLocale(goal)); @@ -103,19 +103,19 @@ public class Competition implements FishingCompetition { } private void updatePublicPlaceholders() { - for (int i = 1; i < Config.placeholderLimit + 1; i++) { + for (int i = 1; i < CFConfig.placeholderLimit + 1; i++) { int finalI = i; Optional.ofNullable(ranking.getPlayerAt(i)).ifPresentOrElse(player -> { publicPlaceholders.put("{" + finalI + "_player}", player); publicPlaceholders.put("{" + finalI + "_score}", String.format("%.2f", ranking.getScoreAt(finalI))); }, () -> { - publicPlaceholders.put("{" + finalI + "_player}", Locale.MSG_No_Player); - publicPlaceholders.put("{" + finalI + "_score}", Locale.MSG_No_Score); + publicPlaceholders.put("{" + finalI + "_player}", CFLocale.MSG_No_Player); + publicPlaceholders.put("{" + finalI + "_score}", CFLocale.MSG_No_Score); }); } - publicPlaceholders.put("{hour}", remainingTime < 3600 ? "" : (remainingTime / 3600) + Locale.FORMAT_Hour); - publicPlaceholders.put("{minute}", remainingTime < 60 ? "" : (remainingTime % 3600) / 60 + Locale.FORMAT_Minute); - publicPlaceholders.put("{second}", remainingTime == 0 ? "" : remainingTime % 60 + Locale.FORMAT_Second); + publicPlaceholders.put("{hour}", remainingTime < 3600 ? "" : (remainingTime / 3600) + CFLocale.FORMAT_Hour); + publicPlaceholders.put("{minute}", remainingTime < 60 ? "" : (remainingTime % 3600) / 60 + CFLocale.FORMAT_Minute); + publicPlaceholders.put("{second}", remainingTime == 0 ? "" : remainingTime % 60 + CFLocale.FORMAT_Second); publicPlaceholders.put("{seconds}", String.valueOf(remainingTime)); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/CompetitionManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/CompetitionManagerImpl.java index 0cf6e5fa..ce98ef70 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/CompetitionManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/CompetitionManagerImpl.java @@ -25,7 +25,8 @@ import net.momirealms.customfishing.api.mechanic.competition.*; import net.momirealms.customfishing.api.mechanic.condition.Condition; import net.momirealms.customfishing.api.scheduler.CancellableTask; import net.momirealms.customfishing.api.util.LogUtils; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFLocale; +import net.momirealms.customfishing.setting.CFConfig; import net.momirealms.customfishing.storage.method.database.nosql.RedisManager; import org.bukkit.Bukkit; import org.bukkit.boss.BarColor; @@ -205,16 +206,16 @@ public class CompetitionManagerImpl implements CompetitionManager { public String getCompetitionLocale(CompetitionGoal goal) { switch (goal) { case MAX_SIZE -> { - return net.momirealms.customfishing.setting.Locale.MSG_Max_Size; + return CFLocale.MSG_Max_Size; } case CATCH_AMOUNT -> { - return net.momirealms.customfishing.setting.Locale.MSG_Catch_Amount; + return CFLocale.MSG_Catch_Amount; } case TOTAL_SCORE -> { - return net.momirealms.customfishing.setting.Locale.MSG_Total_Score; + return CFLocale.MSG_Total_Score; } case TOTAL_SIZE -> { - return net.momirealms.customfishing.setting.Locale.MSG_Total_Size; + return CFLocale.MSG_Total_Size; } } return ""; @@ -280,7 +281,7 @@ public class CompetitionManagerImpl implements CompetitionManager { @Override public CompletableFuture getPlayerCount() { - if (!Config.redisRanking) { + if (!CFConfig.redisRanking) { return CompletableFuture.completedFuture(Bukkit.getOnlinePlayers().size()); } else { return plugin.getStorageManager().getRedisPlayerCount(); diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/actionbar/ActionBarSender.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/actionbar/ActionBarSender.java index d7eb14e8..8dd6ae75 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/actionbar/ActionBarSender.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/actionbar/ActionBarSender.java @@ -22,7 +22,7 @@ import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.competition.ActionBarConfig; import net.momirealms.customfishing.api.scheduler.CancellableTask; import net.momirealms.customfishing.mechanic.competition.Competition; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.util.DynamicText; import org.bukkit.entity.Player; @@ -63,7 +63,7 @@ public class ActionBarSender { private void updatePrivatePlaceholders() { this.privatePlaceholders.put("{score}", String.format("%.2f", competition.getRanking().getPlayerScore(player.getName()))); int rank = competition.getRanking().getPlayerRank(player.getName()); - this.privatePlaceholders.put("{rank}", rank != -1 ? String.valueOf(rank) : Locale.MSG_No_Rank); + this.privatePlaceholders.put("{rank}", rank != -1 ? String.valueOf(rank) : CFLocale.MSG_No_Rank); this.privatePlaceholders.putAll(competition.getCachedPlaceholders()); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/bossbar/BossBarSender.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/bossbar/BossBarSender.java index 6e0d0343..ee9bd6f2 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/bossbar/BossBarSender.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/competition/bossbar/BossBarSender.java @@ -30,7 +30,7 @@ import net.momirealms.customfishing.api.mechanic.competition.BossBarConfig; import net.momirealms.customfishing.api.scheduler.CancellableTask; import net.momirealms.customfishing.api.util.ReflectionUtils; import net.momirealms.customfishing.mechanic.competition.Competition; -import net.momirealms.customfishing.setting.Locale; +import net.momirealms.customfishing.setting.CFLocale; import net.momirealms.customfishing.util.DynamicText; import org.bukkit.boss.BarColor; import org.bukkit.entity.Player; @@ -76,7 +76,7 @@ public class BossBarSender { private void updatePrivatePlaceholders() { this.privatePlaceholders.put("{score}", String.format("%.2f", competition.getRanking().getPlayerScore(player.getName()))); int rank = competition.getRanking().getPlayerRank(player.getName()); - this.privatePlaceholders.put("{rank}", rank != -1 ? String.valueOf(rank) : Locale.MSG_No_Rank); + this.privatePlaceholders.put("{rank}", rank != -1 ? String.valueOf(rank) : CFLocale.MSG_No_Rank); this.privatePlaceholders.putAll(competition.getCachedPlaceholders()); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/effect/EffectManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/effect/EffectManagerImpl.java index 33752a08..6a957249 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/effect/EffectManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/effect/EffectManagerImpl.java @@ -249,7 +249,7 @@ public class EffectManagerImpl implements EffectManager { return ((effect, condition) -> effect.setLavaFishing(true)); } case "conditional" -> { - Requirement[] requirements = plugin.getRequirementManager().getRequirements(section.getConfigurationSection("conditions"), false); + Requirement[] requirements = plugin.getRequirementManager().getRequirements(section.getConfigurationSection("conditions"), true); EffectModifier[] modifiers = getEffectModifiers(section.getConfigurationSection("effects")); return ((effect, condition) -> { for (Requirement requirement : requirements) diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/FishingManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/FishingManagerImpl.java index c8eff75b..c42af740 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/FishingManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/FishingManagerImpl.java @@ -28,11 +28,13 @@ import net.momirealms.customfishing.api.manager.FishingManager; import net.momirealms.customfishing.api.manager.RequirementManager; import net.momirealms.customfishing.api.mechanic.GlobalSettings; import net.momirealms.customfishing.api.mechanic.TempFishingState; +import net.momirealms.customfishing.api.mechanic.action.Action; import net.momirealms.customfishing.api.mechanic.action.ActionTrigger; import net.momirealms.customfishing.api.mechanic.competition.FishingCompetition; import net.momirealms.customfishing.api.mechanic.condition.Condition; import net.momirealms.customfishing.api.mechanic.condition.FishingPreparation; import net.momirealms.customfishing.api.mechanic.effect.Effect; +import net.momirealms.customfishing.api.mechanic.effect.EffectCarrier; import net.momirealms.customfishing.api.mechanic.effect.FishingEffect; import net.momirealms.customfishing.api.mechanic.game.GameConfig; import net.momirealms.customfishing.api.mechanic.game.GameInstance; @@ -43,15 +45,13 @@ import net.momirealms.customfishing.api.mechanic.loot.WeightModifier; import net.momirealms.customfishing.api.util.LogUtils; import net.momirealms.customfishing.api.util.WeightUtils; import net.momirealms.customfishing.mechanic.requirement.RequirementManagerImpl; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Bukkit; +import org.bukkit.Material; import org.bukkit.NamespacedKey; import org.bukkit.Statistic; import org.bukkit.entity.*; -import org.bukkit.event.EventHandler; -import org.bukkit.event.EventPriority; -import org.bukkit.event.HandlerList; -import org.bukkit.event.Listener; +import org.bukkit.event.*; import org.bukkit.event.inventory.InventoryPickupItemEvent; import org.bukkit.event.player.*; import org.bukkit.inventory.ItemStack; @@ -107,37 +107,37 @@ public class FishingManagerImpl implements Listener, FishingManager { @EventHandler(priority = EventPriority.MONITOR) public void onFishMONITOR(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.MONITOR) return; + if (CFConfig.eventPriority != EventPriority.MONITOR) return; this.selectState(event); } @EventHandler(priority = EventPriority.HIGHEST) public void onFishHIGHEST(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.HIGHEST) return; + if (CFConfig.eventPriority != EventPriority.HIGHEST) return; this.selectState(event); } @EventHandler(priority = EventPriority.HIGH) public void onFishHIGH(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.HIGH) return; + if (CFConfig.eventPriority != EventPriority.HIGH) return; this.selectState(event); } @EventHandler(priority = EventPriority.NORMAL) public void onFishNORMAL(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.NORMAL) return; + if (CFConfig.eventPriority != EventPriority.NORMAL) return; this.selectState(event); } @EventHandler(priority = EventPriority.LOW) public void onFishLOW(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.LOW) return; + if (CFConfig.eventPriority != EventPriority.LOW) return; this.selectState(event); } @EventHandler(priority = EventPriority.LOWEST) public void onFishLOWEST(PlayerFishEvent event) { - if (Config.eventPriority != EventPriority.LOWEST) return; + if (CFConfig.eventPriority != EventPriority.LOWEST) return; this.selectState(event); } @@ -213,6 +213,27 @@ public class FishingManagerImpl implements Listener, FishingManager { } } + @EventHandler + public void onInteractWithUtils(PlayerInteractEvent event) { + if (event.useItemInHand() == Event.Result.DENY) + return; + ItemStack itemStack = event.getPlayer().getInventory().getItemInMainHand(); + if (itemStack.getType() == Material.AIR) + return; + String id = plugin.getItemManager().getAnyItemID(itemStack); + EffectCarrier carrier = plugin.getEffectManager().getEffect("util", id); + if (carrier == null) + return; + Condition condition = new Condition(event.getPlayer()); + if (!RequirementManager.isRequirementsMet(carrier.getRequirements(), condition)) + return; + Action[] actions = carrier.getActions(ActionTrigger.INTERACT); + if (actions != null) + for (Action action : actions) { + action.trigger(condition); + } + } + @Override public boolean removeHook(UUID uuid) { FishHook hook = hookCacheMap.remove(uuid); @@ -365,7 +386,7 @@ public class FishingManagerImpl implements Listener, FishingManager { return; } - if (!Config.vanillaMechanicIfNoLoot) { + if (!CFConfig.vanillaMechanicIfNoLoot) { event.setCancelled(true); event.getHook().remove(); } @@ -607,16 +628,16 @@ public class FishingManagerImpl implements Listener, FishingManager { } @Override - public Collection getPossibleLootKeys (FishingPreparation fishingPreparation) { - return plugin.getRequirementManager().getLootWithWeight(fishingPreparation).keySet(); + public Collection getPossibleLootKeys (Condition condition) { + return plugin.getRequirementManager().getLootWithWeight(condition).keySet(); } @NotNull @Override - public Map getPossibleLootKeysWithWeight(Effect initialEffect, FishingPreparation fishingPreparation) { - Map lootWithWeight = plugin.getRequirementManager().getLootWithWeight(fishingPreparation); + public Map getPossibleLootKeysWithWeight(Effect initialEffect, Condition condition) { + Map lootWithWeight = plugin.getRequirementManager().getLootWithWeight(condition); - Player player = fishingPreparation.getPlayer(); + Player player = condition.getPlayer(); for (Pair pair : initialEffect.getWeightModifier()) { Double previous = lootWithWeight.get(pair.left()); if (previous != null) @@ -631,8 +652,8 @@ public class FishingManagerImpl implements Listener, FishingManager { @Override @Nullable - public Loot getNextLoot(Effect initialEffect, FishingPreparation fishingPreparation) { - String key = WeightUtils.getRandom(getPossibleLootKeysWithWeight(initialEffect, fishingPreparation)); + public Loot getNextLoot(Effect initialEffect, Condition condition) { + String key = WeightUtils.getRandom(getPossibleLootKeysWithWeight(initialEffect, condition)); Loot loot = plugin.getLootManager().getLoot(key); if (loot == null) { LogUtils.warn(String.format("Loot %s doesn't exist!", key)); diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/HookCheckTimerTask.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/HookCheckTimerTask.java index 366c4541..da9e9dec 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/HookCheckTimerTask.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/fishing/HookCheckTimerTask.java @@ -29,7 +29,7 @@ import net.momirealms.customfishing.api.mechanic.condition.FishingPreparation; import net.momirealms.customfishing.api.mechanic.effect.Effect; import net.momirealms.customfishing.api.mechanic.loot.Loot; import net.momirealms.customfishing.api.scheduler.CancellableTask; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; @@ -175,10 +175,10 @@ public class HookCheckTimerTask implements Runnable { private void startLavaFishingMechanic() { // get random time - int random = ThreadLocalRandom.current().nextInt(Config.lavaMinTime, Config.lavaMaxTime); + int random = ThreadLocalRandom.current().nextInt(CFConfig.lavaMinTime, CFConfig.lavaMaxTime); random -= lureLevel * 100; random *= initialEffect.getHookTimeModifier(); - random = Math.max(Config.lavaMinTime, random); + random = Math.max(CFConfig.lavaMinTime, random); // lava effect task (Three seconds in advance) this.lavaFishingTask = new LavaEffectTask( diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java index 6be01a5d..89812120 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/item/ItemManagerImpl.java @@ -32,7 +32,7 @@ import net.momirealms.customfishing.api.util.LogUtils; import net.momirealms.customfishing.compatibility.item.CustomFishingItemImpl; import net.momirealms.customfishing.compatibility.item.VanillaItemImpl; import net.momirealms.customfishing.compatibility.papi.PlaceholderManagerImpl; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import net.momirealms.customfishing.util.NBTUtils; import org.apache.commons.lang3.StringUtils; import org.bukkit.Bukkit; @@ -173,7 +173,7 @@ public class ItemManagerImpl implements ItemManager { @Override public String getAnyItemID(ItemStack itemStack) { - for (String plugin : Config.itemDetectOrder) { + for (String plugin : CFConfig.itemDetectOrder) { ItemLibrary itemLibrary = itemLibraryMap.get(plugin); if (itemLibrary != null) { String id = itemLibrary.getItemID(itemStack); diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/misc/CoolDownManager.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/misc/CoolDownManager.java new file mode 100644 index 00000000..74a9833e --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/misc/CoolDownManager.java @@ -0,0 +1,83 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +package net.momirealms.customfishing.mechanic.misc; + +import net.momirealms.customfishing.api.CustomFishingPlugin; +import org.bukkit.Bukkit; +import org.bukkit.event.EventHandler; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerQuitEvent; + +import java.util.HashMap; +import java.util.UUID; +import java.util.concurrent.ConcurrentHashMap; + +public class CoolDownManager implements Listener { + + private final ConcurrentHashMap dataMap; + private final CustomFishingPlugin plugin; + + public CoolDownManager(CustomFishingPlugin plugin) { + this.dataMap = new ConcurrentHashMap<>(); + this.plugin = plugin; + } + + public boolean isCoolDown(UUID uuid, String key, long time) { + Data data = this.dataMap.computeIfAbsent(uuid, k -> new Data()); + return data.isCoolDown(key, time); + } + + public void load() { + Bukkit.getPluginManager().registerEvents(this, plugin); + } + + public void unload() { + HandlerList.unregisterAll(this); + } + + public void disable() { + unload(); + this.dataMap.clear(); + } + + @EventHandler + public void onQuit(PlayerQuitEvent event) { + dataMap.remove(event.getPlayer().getUniqueId()); + } + + public static class Data { + + private final HashMap coolDownMap; + + public Data() { + this.coolDownMap = new HashMap<>(); + } + + public synchronized boolean isCoolDown(String key, long delay) { + long time = System.currentTimeMillis(); + long last = coolDownMap.getOrDefault(key, time - delay); + if (last + delay > time) { + return true; + } else { + coolDownMap.put(key, time); + return false; + } + } + } +} diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/EmptyRequirement.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/EmptyRequirement.java index 44497da1..8f926604 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/EmptyRequirement.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/EmptyRequirement.java @@ -1,3 +1,20 @@ +/* + * Copyright (C) <2022> + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + package net.momirealms.customfishing.mechanic.requirement; import net.momirealms.customfishing.api.mechanic.condition.Condition; diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/RequirementManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/RequirementManagerImpl.java index e8819c99..ace2a55a 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/RequirementManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/RequirementManagerImpl.java @@ -124,6 +124,7 @@ public class RequirementManagerImpl implements RequirementManager { this.registerRandomRequirement(); this.registerIceFishingRequirement(); this.registerOpenWaterRequirement(); + this.registerCoolDownRequirement(); } public ConditionalLoots getConditionalLoots(ConfigurationSection section) { @@ -310,7 +311,7 @@ public class RequirementManagerImpl implements RequirementManager { registerRequirement("lava-fishing", (args, actions, advanced) -> { boolean inLava = (boolean) args; return condition -> { - String current = condition.getArgs().get("{lava}"); + String current = condition.getArgs().getOrDefault("{lava}","false"); if (current.equals(String.valueOf(inLava))) return true; if (advanced) triggerActions(actions, condition); @@ -446,6 +447,24 @@ public class RequirementManagerImpl implements RequirementManager { }); } + private void registerCoolDownRequirement() { + registerRequirement("cooldown", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String key = section.getString("key"); + int time = section.getInt("time"); + return condition -> { + if (!plugin.getCoolDownManager().isCoolDown(condition.getPlayer().getUniqueId(), key, time)) { + return true; + } + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + return null; + } + }); + } + private void registerDateRequirement() { registerRequirement("date", (args, actions, advanced) -> { HashSet dates = new HashSet<>(ConfigUtils.stringListArgs(args)); diff --git a/plugin/src/main/java/net/momirealms/customfishing/scheduler/SchedulerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/scheduler/SchedulerImpl.java index 9e36c5f4..94a4d31b 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/scheduler/SchedulerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/scheduler/SchedulerImpl.java @@ -20,7 +20,7 @@ package net.momirealms.customfishing.scheduler; import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.scheduler.CancellableTask; import net.momirealms.customfishing.api.scheduler.Scheduler; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Location; import java.util.concurrent.ScheduledFuture; @@ -45,9 +45,9 @@ public class SchedulerImpl implements Scheduler { } public void reload() { - this.schedule.setCorePoolSize(Config.corePoolSize); - this.schedule.setKeepAliveTime(Config.keepAliveTime, TimeUnit.SECONDS); - this.schedule.setMaximumPoolSize(Config.maximumPoolSize); + this.schedule.setCorePoolSize(CFConfig.corePoolSize); + this.schedule.setKeepAliveTime(CFConfig.keepAliveTime, TimeUnit.SECONDS); + this.schedule.setMaximumPoolSize(CFConfig.maximumPoolSize); } public void shutdown() { diff --git a/plugin/src/main/java/net/momirealms/customfishing/setting/Config.java b/plugin/src/main/java/net/momirealms/customfishing/setting/CFConfig.java similarity index 99% rename from plugin/src/main/java/net/momirealms/customfishing/setting/Config.java rename to plugin/src/main/java/net/momirealms/customfishing/setting/CFConfig.java index 6766dd92..96879474 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/setting/Config.java +++ b/plugin/src/main/java/net/momirealms/customfishing/setting/CFConfig.java @@ -37,7 +37,7 @@ import java.util.List; import java.util.Locale; import java.util.Objects; -public class Config { +public class CFConfig { // config version public static String configVersion = "26"; diff --git a/plugin/src/main/java/net/momirealms/customfishing/setting/Locale.java b/plugin/src/main/java/net/momirealms/customfishing/setting/CFLocale.java similarity index 90% rename from plugin/src/main/java/net/momirealms/customfishing/setting/Locale.java rename to plugin/src/main/java/net/momirealms/customfishing/setting/CFLocale.java index 4e399bf5..31b36e1d 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/setting/Locale.java +++ b/plugin/src/main/java/net/momirealms/customfishing/setting/CFLocale.java @@ -32,7 +32,7 @@ import java.io.File; import java.io.IOException; import java.util.Objects; -public class Locale { +public class CFLocale { public static String MSG_Total_Size; public static String MSG_Catch_Amount; public static String MSG_Total_Score; @@ -53,6 +53,9 @@ public class Locale { public static String MSG_Unsafe_Modification; public static String MSG_Data_Not_Loaded; public static String MSG_Market_GUI_Open; + public static String MSG_Fishing_Bag_Open; + public static String MSG_Split_Char; + public static String MSG_Possible_Loots; public static String FORMAT_Day; public static String FORMAT_Hour; public static String FORMAT_Minute; @@ -61,8 +64,8 @@ public class Locale { public static void load() { try { YamlDocument.create( - new File(CustomFishingPlugin.getInstance().getDataFolder(), "messages/" + Config.language + ".yml"), - Objects.requireNonNull(CustomFishingPlugin.getInstance().getResource("messages/" + Config.language + ".yml")), + new File(CustomFishingPlugin.getInstance().getDataFolder(), "messages/" + CFConfig.language + ".yml"), + Objects.requireNonNull(CustomFishingPlugin.getInstance().getResource("messages/" + CFConfig.language + ".yml")), GeneralSettings.DEFAULT, LoaderSettings .builder() @@ -77,7 +80,7 @@ public class Locale { } catch (IOException e) { LogUtils.warn(e.getMessage()); } - loadSettings(CustomFishingPlugin.get().getConfig("messages/" + Config.language + ".yml")); + loadSettings(CustomFishingPlugin.get().getConfig("messages/" + CFConfig.language + ".yml")); } private static void loadSettings(YamlConfiguration locale) { @@ -103,10 +106,13 @@ public class Locale { MSG_Unsafe_Modification = msgSection.getString("unsafe-modification"); MSG_Data_Not_Loaded = msgSection.getString("data-not-loaded"); MSG_Market_GUI_Open = msgSection.getString("open-market-gui"); + MSG_Fishing_Bag_Open = msgSection.getString("open-fishing-bag"); FORMAT_Day = msgSection.getString("format-day"); FORMAT_Hour = msgSection.getString("format-hour"); FORMAT_Minute = msgSection.getString("format-minute"); FORMAT_Second = msgSection.getString("format-second"); + MSG_Split_Char = msgSection.getString("split-char"); + MSG_Possible_Loots = msgSection.getString("possible-loots"); } } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/storage/StorageManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/storage/StorageManagerImpl.java index 3fcea589..fd582d4e 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/storage/StorageManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/storage/StorageManagerImpl.java @@ -29,7 +29,7 @@ import net.momirealms.customfishing.api.data.user.OnlineUser; import net.momirealms.customfishing.api.manager.StorageManager; import net.momirealms.customfishing.api.scheduler.CancellableTask; import net.momirealms.customfishing.api.util.LogUtils; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import net.momirealms.customfishing.storage.method.database.nosql.MongoDBImpl; import net.momirealms.customfishing.storage.method.database.nosql.RedisManager; import net.momirealms.customfishing.storage.method.database.sql.H2Impl; @@ -109,15 +109,15 @@ public class StorageManagerImpl implements StorageManager, Listener { if (this.timerSaveTask != null && !this.timerSaveTask.isCancelled()) { this.timerSaveTask.cancel(); } - if (Config.dataSaveInterval != -1) + if (CFConfig.dataSaveInterval != -1) this.timerSaveTask = this.plugin.getScheduler().runTaskAsyncTimer( () -> { long time1 = System.currentTimeMillis(); this.dataSource.savePlayersData(this.onlineUserMap.values(), false); LogUtils.info("Data Saved for online players. Took " + (System.currentTimeMillis() - time1) + "ms."); }, - Config.dataSaveInterval, - Config.dataSaveInterval, + CFConfig.dataSaveInterval, + CFConfig.dataSaveInterval, TimeUnit.SECONDS ); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/AbstractSQLDatabase.java b/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/AbstractSQLDatabase.java index 4cad501f..aefab05f 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/AbstractSQLDatabase.java +++ b/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/AbstractSQLDatabase.java @@ -21,7 +21,7 @@ import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.data.PlayerData; import net.momirealms.customfishing.api.data.user.OfflineUser; import net.momirealms.customfishing.api.util.LogUtils; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import net.momirealms.customfishing.storage.method.AbstractStorage; import org.bukkit.Bukkit; import org.jetbrains.annotations.NotNull; @@ -90,7 +90,7 @@ public abstract class AbstractSQLDatabase extends AbstractStorage { ResultSet rs = statement.executeQuery(); if (rs.next()) { int lock = rs.getInt(2); - if (!force && (lock != 0 && getCurrentSeconds() - Config.dataSaveInterval <= lock)) { + if (!force && (lock != 0 && getCurrentSeconds() - CFConfig.dataSaveInterval <= lock)) { statement.close(); rs.close(); connection.close(); future.complete(Optional.of(PlayerData.LOCKED)); return; diff --git a/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/SQLiteImpl.java b/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/SQLiteImpl.java index 4dc3c73c..4bdb3ea5 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/SQLiteImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/storage/method/database/sql/SQLiteImpl.java @@ -22,7 +22,7 @@ import net.momirealms.customfishing.api.data.PlayerData; import net.momirealms.customfishing.api.data.StorageType; import net.momirealms.customfishing.api.data.user.OfflineUser; import net.momirealms.customfishing.api.util.LogUtils; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Bukkit; import org.bukkit.configuration.file.YamlConfiguration; import org.sqlite.SQLiteConfig; @@ -88,7 +88,7 @@ public class SQLiteImpl extends AbstractSQLDatabase { ResultSet rs = statement.executeQuery(); if (rs.next()) { int lock = rs.getInt(2); - if (!force && (lock != 0 && getCurrentSeconds() - Config.dataSaveInterval <= lock)) { + if (!force && (lock != 0 && getCurrentSeconds() - CFConfig.dataSaveInterval <= lock)) { statement.close(); rs.close(); connection.close(); future.complete(Optional.of(PlayerData.LOCKED)); return; diff --git a/plugin/src/main/java/net/momirealms/customfishing/storage/user/OfflineUserImpl.java b/plugin/src/main/java/net/momirealms/customfishing/storage/user/OfflineUserImpl.java index 5c0057a4..1cbd96c9 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/storage/user/OfflineUserImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/storage/user/OfflineUserImpl.java @@ -27,7 +27,7 @@ import net.momirealms.customfishing.api.mechanic.bag.FishingBagHolder; import net.momirealms.customfishing.api.mechanic.statistic.Statistics; import net.momirealms.customfishing.api.util.InventoryUtils; import net.momirealms.customfishing.compatibility.papi.PlaceholderManagerImpl; -import net.momirealms.customfishing.setting.Config; +import net.momirealms.customfishing.setting.CFConfig; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.entity.Player; @@ -53,7 +53,7 @@ public class OfflineUserImpl implements OfflineUser { this.holder.setInventory(InventoryUtils.createInventory(this.holder, playerData.getBagData().size, AdventureManagerImpl.getInstance().getComponentFromMiniMessage( PlaceholderManagerImpl.getInstance().parse( - offlinePlayer, Config.bagTitle, Map.of("{player}", Optional.ofNullable(offlinePlayer.getName()).orElse(String.valueOf(uuid))) + offlinePlayer, CFConfig.bagTitle, Map.of("{player}", Optional.ofNullable(offlinePlayer.getName()).orElse(String.valueOf(uuid))) ) ))); this.holder.setItems(InventoryUtils.getInventoryItems(playerData.getBagData().serialized)); diff --git a/plugin/src/main/resources/contents/utils/default.yml b/plugin/src/main/resources/contents/utils/default.yml index 94715c1e..7747cd0f 100644 --- a/plugin/src/main/resources/contents/utils/default.yml +++ b/plugin/src/main/resources/contents/utils/default.yml @@ -9,26 +9,40 @@ fishfinder: display: name: 'Fish Finder' lore: - - 'Right click to see what fish can be caught in this place!' + - '' + - '<#7FFFD4>Desciption:' + - ' - Compact yet powerful, it scans the waters' + - ' - with precision, revealing the variety of' + - ' - fish species lurking below the surface.' + - ' - Whether you''re in uncharted territories or' + - ' - familiar waters, this device ensures you''re' + - ' - always informed about your aquatic neighbors.' + - '' custom-model-data: 50000 + events: + interact: + conditional_action: + type: conditional + value: + conditions: + condition_1: + type: cooldown + value: + key: fishfinder + time: 3000 #ms + not-met-actions: + action_1: + type: message + value: + - 'Slow down! You are using the fish finder too frequently.' + actions: + action_1: + type: fish-finder + value: false water_effect: material: PAPER custom-model-data: 49998 lava_effect: material: PAPER - custom-model-data: 49999 - -fisherman_talismans: - material: player_head - display: - name: 'Fisherman Talismans' - lore: - - '' - - 'Fishing would be easier when keeping' - - 'the talismans in the fishing bag' - - '' - - 'The effect cannot be stacked' - head64: eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNWQzZmVjNGI3M2E1ZThlMWY1Y2FiOTBjZDBhMzgzMDJmMzdiMDBjNzEzY2EwNmM4NDkzMDBmOGZkMTFlNWVjMiJ9fX0= - effect: - difficulty: -1 \ No newline at end of file + custom-model-data: 49999 \ No newline at end of file diff --git a/plugin/src/main/resources/messages/english.yml b/plugin/src/main/resources/messages/english.yml index db8bb503..9b85bfd5 100644 --- a/plugin/src/main/resources/messages/english.yml +++ b/plugin/src/main/resources/messages/english.yml @@ -6,7 +6,7 @@ messages: prefix: '[CustomFishing] ' reload: 'Reloaded. Took {time}ms.' item-not-exist: 'That item does not exist.' - escape: 'It has been too long since the fish is hooked. Oh my god, it escaped.' + escape: 'The fish managed to get rid of the hook and escaped.' give-item: 'Successfully given player {player} {amount}x {item}.' get-item: 'Successfully got {amount}x {item}.' possible-loots: 'Possible loots here: ' @@ -26,7 +26,7 @@ messages: never-played: 'That player has never played the server. You can''t edit a non existent player''s fishing bag.' data-not-loaded: 'Your data has not been loaded yet. Try rejoining the server. If the problem still occurs, contact the server administrator.' open-market-gui: 'Successfully opened the market gui for {player}' - open-fishingbag-gui: 'Successfully opened the fishing bag for {player}' + open-fishing-bag: 'Successfully opened the fishing bag for {player}' format-day: 'd' format-hour: 'h' format-minute: 'm'