diff --git a/api/build.gradle.kts b/api/build.gradle.kts index 0ad329bb..61cc595f 100644 --- a/api/build.gradle.kts +++ b/api/build.gradle.kts @@ -6,6 +6,7 @@ dependencies { tasks { shadowJar { - relocate ("de.tr7zw", "net.momirealms.customfishing.libraries") + relocate ("de.tr7zw.changeme", "net.momirealms.customfishing.libraries") + relocate ("de.tr7zw.annotations", "net.momirealms.customfishing.libraries.annotations") } } diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts index 871b2c18..bdcb77a8 100644 --- a/plugin/build.gradle.kts +++ b/plugin/build.gradle.kts @@ -75,7 +75,8 @@ dependencies { tasks { shadowJar { - relocate ("de.tr7zw", "net.momirealms.customfishing.libraries") + relocate ("de.tr7zw.changeme", "net.momirealms.customfishing.libraries") + relocate ("de.tr7zw.annotations", "net.momirealms.customfishing.libraries.annotations") relocate ("net.kyori", "net.momirealms.customfishing.libraries") relocate ("net.wesjd", "net.momirealms.customfishing.libraries") relocate ("org.bstats", "net.momirealms.customfishing.libraries.bstats") diff --git a/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java b/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java index 24fb0891..ed5b22ed 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/CustomFishingPluginImpl.java @@ -148,6 +148,8 @@ public class CustomFishingPluginImpl extends CustomFishingPlugin { ((CompetitionManagerImpl) this.competitionManager).unload(); ((CompetitionManagerImpl) this.competitionManager).load(); ((StorageManagerImpl) this.storageManager).reload(); + ((PlaceholderManagerImpl) this.placeholderManager).unload(); + ((PlaceholderManagerImpl) this.placeholderManager).load(); this.commandManager.loadCommands(); } diff --git a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderAPIHook.java b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderAPIHook.java index 536db5b6..512ae04e 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderAPIHook.java +++ b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderAPIHook.java @@ -18,12 +18,27 @@ package net.momirealms.customfishing.compatibility.papi; import me.clip.placeholderapi.expansion.PlaceholderExpansion; +import net.momirealms.customfishing.api.CustomFishingPlugin; import org.bukkit.OfflinePlayer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class PlaceholderAPIHook extends PlaceholderExpansion { + private CustomFishingPlugin plugin; + + public PlaceholderAPIHook(CustomFishingPlugin plugin) { + this.plugin = plugin; + } + + public void load() { + super.register(); + } + + public void unload() { + super.unregister(); + } + @Override public @NotNull String getIdentifier() { return "customfishing"; @@ -46,6 +61,9 @@ public class PlaceholderAPIHook extends PlaceholderExpansion { @Override public @Nullable String onRequest(OfflinePlayer player, @NotNull String params) { + + + return super.onRequest(player, params); } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderManagerImpl.java b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderManagerImpl.java index 1e97dbf5..9ba6e5c2 100644 --- a/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customfishing/compatibility/papi/PlaceholderManagerImpl.java @@ -21,6 +21,8 @@ import net.momirealms.customfishing.api.CustomFishingPlugin; import net.momirealms.customfishing.api.manager.PlaceholderManager; import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; +import org.bukkit.configuration.ConfigurationSection; +import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; import org.jetbrains.annotations.Nullable; @@ -39,6 +41,7 @@ public class PlaceholderManagerImpl implements PlaceholderManager { private final boolean hasPapi; private final Pattern pattern; private final HashMap customPlaceholderMap; + private PlaceholderAPIHook placeholderAPIHook; public PlaceholderManagerImpl(CustomFishingPlugin plugin) { instance = this; @@ -46,12 +49,34 @@ public class PlaceholderManagerImpl implements PlaceholderManager { this.hasPapi = Bukkit.getPluginManager().isPluginEnabled("PlaceholderAPI"); this.pattern = Pattern.compile("\\{[^{}]+}"); this.customPlaceholderMap = new HashMap<>(); + if (this.hasPapi) { + placeholderAPIHook = new PlaceholderAPIHook(plugin); + } + } + + public void load() { + if (placeholderAPIHook != null) placeholderAPIHook.load(); + loadCustomPlaceholders(); + } + + public void unload() { + if (placeholderAPIHook != null) placeholderAPIHook.unload(); } public void disable() { this.customPlaceholderMap.clear(); } + public void loadCustomPlaceholders() { + YamlConfiguration config = plugin.getConfig("config.yml"); + ConfigurationSection section = config.getConfigurationSection("other-settings.placeholder-register"); + if (section != null) { + for (Map.Entry entry : section.getValues(false).entrySet()) { + this.customPlaceholderMap.put(entry.getKey(), (String) entry.getValue()); + } + } + } + @Override public String setPlaceholders(Player player, String text) { return hasPapi ? ParseUtils.setPlaceholders(player, text) : text; @@ -72,11 +97,14 @@ public class PlaceholderManagerImpl implements PlaceholderManager { @Override public String getSingleValue(@Nullable Player player, String placeholder, Map placeholders) { - String result; - result = placeholders.get(placeholder); - if (result != null) return result; + String result = null; + if (placeholders != null) + result = placeholders.get(placeholder); + if (result != null) + return result; String custom = customPlaceholderMap.get(placeholder); - if (custom == null) return placeholder; + if (custom == null) + return placeholder; return setPlaceholders(player, custom); } 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 new file mode 100644 index 00000000..44497da1 --- /dev/null +++ b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/EmptyRequirement.java @@ -0,0 +1,14 @@ +package net.momirealms.customfishing.mechanic.requirement; + +import net.momirealms.customfishing.api.mechanic.condition.Condition; +import net.momirealms.customfishing.api.mechanic.requirement.Requirement; + +public class EmptyRequirement implements Requirement { + + public static EmptyRequirement instance = new EmptyRequirement(); + + @Override + public boolean isConditionMet(Condition condition) { + return true; + } +} 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 d3f70e2f..be48b10a 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 @@ -28,19 +28,16 @@ import net.momirealms.customfishing.api.mechanic.condition.Condition; import net.momirealms.customfishing.api.mechanic.requirement.Requirement; import net.momirealms.customfishing.api.mechanic.requirement.RequirementBuilder; import net.momirealms.customfishing.api.util.LogUtils; -import net.momirealms.customfishing.mechanic.requirement.inbuilt.LogicRequirement; +import net.momirealms.customfishing.compatibility.papi.ParseUtils; import net.momirealms.customfishing.util.ConfigUtils; import org.bukkit.World; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.MemorySection; import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.*; -import java.util.regex.Matcher; -import java.util.regex.Pattern; public class RequirementManagerImpl implements RequirementManager { @@ -96,8 +93,9 @@ public class RequirementManagerImpl implements RequirementManager { private void registerInbuiltRequirements() { this.registerTimeRequirement(); this.registerYRequirement(); - this.registerLogicRequirement(); - this.registerCompare(); + this.registerContainRequirement(); + this.registerStartWithRequirement(); + this.registerEqualsRequirement(); this.registerBiomeRequirement(); this.registerDateRequirement(); this.registerPluginLevelRequirement(); @@ -108,6 +106,9 @@ public class RequirementManagerImpl implements RequirementManager { this.registerInLavaRequirement(); this.registerRodRequirement(); this.registerBaitRequirement(); + this.registerCompareRequirement(); + this.registerAndRequirement(); + this.registerOrRequirement(); } public ConditionalLoots getConditionalLoots(ConfigurationSection section) { @@ -178,8 +179,8 @@ public class RequirementManagerImpl implements RequirementManager { List actionList = null; if (advanced) { actionList = new ArrayList<>(); - if (section.contains("actions")) { - for (Map.Entry entry : Objects.requireNonNull(section.getConfigurationSection("actions")).getValues(false).entrySet()) { + if (section.contains("not-met-actions")) { + for (Map.Entry entry : Objects.requireNonNull(section.getConfigurationSection("not-met-actions")).getValues(false).entrySet()) { if (entry.getValue() instanceof MemorySection inner) { actionList.add(plugin.getActionManager().getAction(inner)); } @@ -190,11 +191,12 @@ public class RequirementManagerImpl implements RequirementManager { } String type = section.getString("type"); if (type == null) { - throw new NullPointerException(section.getCurrentPath() + ".type" + " doesn't exist"); + LogUtils.warn("No requirement type found at " + section.getCurrentPath()); + return EmptyRequirement.instance; } var builder = getRequirementBuilder(type); if (builder == null) { - throw new NullPointerException("Requirement type: " + type + " doesn't exist"); + return EmptyRequirement.instance; } return builder.build(section.get("value"), actionList, advanced); } @@ -214,12 +216,6 @@ public class RequirementManagerImpl implements RequirementManager { return requirementBuilderMap.get(type); } - private void registerLogicRequirement() { - registerRequirement("logic", (args, actions, advanced) -> - new LogicRequirement(this, args, actions, advanced) - ); - } - private void registerTimeRequirement() { registerRequirement("time", (args, actions, advanced) -> { List> timePairs = ConfigUtils.stringListArgs(args).stream().map(this::getIntegerPair).toList(); @@ -248,6 +244,51 @@ public class RequirementManagerImpl implements RequirementManager { }); } + private void registerOrRequirement() { + registerRequirement("||", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + Requirement[] requirements = getRequirements(section, advanced); + return condition -> { + if (requirements == null) return true; + for (Requirement requirement : requirements) { + if (requirement.isConditionMet(condition)) { + return true; + } + } + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at || requirement."); + return null; + } + }); + } + + private void registerAndRequirement() { + registerRequirement("&&", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + Requirement[] requirements = getRequirements(section, advanced); + return condition -> { + if (requirements == null) return true; + outer: { + for (Requirement requirement : requirements) { + if (!requirement.isConditionMet(condition)) { + break outer; + } + } + return true; + } + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at && requirement."); + return null; + } + }); + } + private void registerInLavaRequirement() { registerRequirement("in-lava", (args, actions, advanced) -> { boolean inLava = (boolean) args; @@ -375,6 +416,243 @@ public class RequirementManagerImpl implements RequirementManager { }); } + private void registerCompareRequirement() { + registerRequirement(">=", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) >= Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at >= requirement."); + return null; + } + }); + registerRequirement(">", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) > Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at > requirement."); + return null; + } + }); + registerRequirement("<", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) < Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at < requirement."); + return null; + } + }); + registerRequirement("<=", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) <= Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at <= requirement."); + return null; + } + }); + registerRequirement("==", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) == Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !startsWith requirement."); + return null; + } + }); + registerRequirement("!=", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (Double.parseDouble(p1) != Double.parseDouble(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !startsWith requirement."); + return null; + } + }); + } + + + private void registerStartWithRequirement() { + registerRequirement("startsWith", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (p1.startsWith(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at startsWith requirement."); + return null; + } + }); + registerRequirement("!startsWith", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (!p1.startsWith(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !startsWith requirement."); + return null; + } + }); + registerRequirement("endsWith", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (p1.endsWith(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at endsWith requirement."); + return null; + } + }); + registerRequirement("!endsWith", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (!p1.endsWith(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !endsWith requirement."); + return null; + } + }); + } + + private void registerContainRequirement() { + registerRequirement("contains", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (p1.contains(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at contains requirement."); + return null; + } + }); + registerRequirement("!contains", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (!p1.contains(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !contains requirement."); + return null; + } + }); + } + + private void registerEqualsRequirement() { + registerRequirement("equals", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (p1.equals(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at equals requirement."); + return null; + } + }); + registerRequirement("!equals", (args, actions, advanced) -> { + if (args instanceof ConfigurationSection section) { + String v1 = section.getString("value1", ""); + String v2 = section.getString("value2", ""); + return condition -> { + String p1 = v1.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v1) : v1; + String p2 = v2.startsWith("%") ? ParseUtils.setPlaceholders(condition.getPlayer(), v2) : v2; + if (!p1.equals(p2)) return true; + if (advanced) triggerActions(actions, condition); + return false; + }; + } else { + LogUtils.warn("Wrong value format found at !equals requirement."); + return null; + } + }); + } + private void registerRodRequirement() { registerRequirement("rod", (args, actions, advanced) -> { List rods = ConfigUtils.stringListArgs(args); @@ -434,17 +712,10 @@ public class RequirementManagerImpl implements RequirementManager { if (advanced) triggerActions(actions, condition); return false; }; + } else { + LogUtils.warn("Wrong value format found at plugin-level requirement."); + return null; } - return null; - }); - } - - private void registerCompare() { - registerRequirement("compare", (args, actions, advanced) -> condition -> { - if (evaluateExpression((String) args, condition.getPlayer())) - return true; - if (advanced) triggerActions(actions, condition); - return false; }); } @@ -453,40 +724,4 @@ public class RequirementManagerImpl implements RequirementManager { for (Action action : actions) action.trigger(condition); } - - private double doubleArg(String s, Player player) { - double arg = 0; - try { - arg = Double.parseDouble(s); - } catch (NumberFormatException e1) { - try { - arg = Double.parseDouble(plugin.getPlaceholderManager().setPlaceholders(player, s)); - } catch (NumberFormatException e2) { - LogUtils.severe(String.format("Invalid placeholder %s", s), e2); - } - } - return arg; - } - - public boolean evaluateExpression(String input, Player player) { - input = input.replace("\\s", ""); - Pattern pattern = Pattern.compile("(-?\\d+\\.?\\d*)(==|!=|<=?|>=?)(-?\\d+\\.?\\d*)"); - Matcher matcher = pattern.matcher(input); - if (matcher.matches()) { - double num1 = doubleArg(matcher.group(1), player); - String operator = matcher.group(2); - double num2 = doubleArg(matcher.group(3), player); - return switch (operator) { - case ">" -> num1 > num2; - case "<" -> num1 < num2; - case ">=" -> num1 >= num2; - case "<=" -> num1 <= num2; - case "==" -> num1 == num2; - case "!=" -> num1 != num2; - default -> throw new IllegalArgumentException("Unsupported operator: " + operator); - }; - } else { - throw new IllegalArgumentException("Invalid input format: " + input); - } - } } diff --git a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/inbuilt/LogicRequirement.java b/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/inbuilt/LogicRequirement.java deleted file mode 100644 index d5591245..00000000 --- a/plugin/src/main/java/net/momirealms/customfishing/mechanic/requirement/inbuilt/LogicRequirement.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * 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.inbuilt; - -import net.momirealms.customfishing.api.manager.RequirementManager; -import net.momirealms.customfishing.api.mechanic.action.Action; -import net.momirealms.customfishing.api.mechanic.condition.Condition; -import net.momirealms.customfishing.api.mechanic.requirement.Requirement; -import net.momirealms.customfishing.mechanic.requirement.AbstractRequirement; -import org.bukkit.configuration.MemorySection; - -import java.util.*; - -public class LogicRequirement extends AbstractRequirement { - - private List requirementList; - private boolean checkAction; - - public LogicRequirement(RequirementManager requirementManager, Object args, List actions, boolean checkAction) { - super(actions); - if (!(args instanceof MemorySection section1)) - return; - this.requirementList = new ArrayList<>(); - this.checkAction = checkAction; - Deque stack = new ArrayDeque<>(); - stack.push(new StackElement(section1.getValues(false), requirementList)); - while (!stack.isEmpty()) { - StackElement stackElement = stack.pop(); - Map currentMap = stackElement.getMap(); - List currentResult = stackElement.getRequirements(); - for (Map.Entry entry : currentMap.entrySet()) { - String key = entry.getKey(); - Object value = entry.getValue(); - if (value instanceof MemorySection section2) { - Map sectionMap = section2.getValues(false); - if (key.startsWith("&&")) { - List andReqList = new ArrayList<>(); - currentResult.add(new AndRequirement(andReqList)); - stack.push(new StackElement(sectionMap, andReqList)); - } else if (key.startsWith("||")) { - List orReqList = new ArrayList<>(); - currentResult.add(new OrRequirement(orReqList)); - stack.push(new StackElement(sectionMap, orReqList)); - } else { - currentResult.add(requirementManager.getRequirement(section2, checkAction)); - } - } - } - } - } - - public static class StackElement { - - private final Map map; - private final List requirements; - - public StackElement(Map map, List requirements) { - this.map = map; - this.requirements = requirements; - } - - public Map getMap() { - return map; - } - - public List getRequirements() { - return requirements; - } - } - - @Override - public boolean isConditionMet(Condition condition) { - for (Requirement requirement : requirementList) { - if (!requirement.isConditionMet(condition)) { - if (checkAction) super.triggerActions(condition); - return false; - } - } - return true; - } - - public static class AndRequirement implements Requirement { - - private final List requirementList; - - public AndRequirement(List requirementList) { - this.requirementList = requirementList; - } - - @Override - public boolean isConditionMet(Condition condition) { - for (Requirement requirement : requirementList) { - if (!requirement.isConditionMet(condition)) { - return false; - } - } - return true; - } - } - - public static class OrRequirement implements Requirement { - - private final List requirementList; - - public OrRequirement(List requirementList) { - this.requirementList = requirementList; - } - - @Override - public boolean isConditionMet(Condition condition) { - for (Requirement requirement : requirementList) { - if (requirement.isConditionMet(condition)) { - return true; - } - } - return false; - } - } -} diff --git a/plugin/src/main/resources/config.yml b/plugin/src/main/resources/config.yml index 292159d4..dbabf579 100644 --- a/plugin/src/main/resources/config.yml +++ b/plugin/src/main/resources/config.yml @@ -131,7 +131,7 @@ other-settings: # Requires PlaceholderAPI to work placeholder-register: - '{date}': '%server_date%' + '{date}': '%server_time_yyyy-MM-dd-HH:mm:ss%' # CustomFishing supports using items from other plugins # If items share the same id, they would inherit the effects