From fb20cc73979f84deba37c190477bdd63fd088e25 Mon Sep 17 00:00:00 2001 From: XiaoMoMi Date: Fri, 23 May 2025 02:01:03 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=BA=86leveler=20exp?= =?UTF-8?q?=E5=87=BD=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bukkit/compatibility/build.gradle.kts | 2 + .../BukkitCompatibilityManager.java | 42 ++++++++++-- .../leveler/AuraSkillsLevelerProvider.java | 19 ++++++ .../src/main/resources/translations/en.yml | 3 + .../src/main/resources/translations/zh_cn.yml | 21 +++--- .../bukkit/plugin/BukkitCraftEngine.java | 2 +- .../furniture/AbstractFurnitureManager.java | 4 +- .../craftengine/core/plugin/CraftEngine.java | 1 + .../craftengine/core/plugin/Plugin.java | 1 + .../CompatibilityManager.java | 11 ++- .../plugin/compatibility/LevelerProvider.java | 10 +++ .../plugin/compatibility/ModelProvider.java | 8 +++ .../plugin/context/event/EventFunctions.java | 1 + .../context/function/CommonFunctions.java | 2 +- .../context/function/LevelerExpFunction.java | 67 +++++++++++++++++++ 15 files changed, 172 insertions(+), 22 deletions(-) create mode 100644 bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AuraSkillsLevelerProvider.java rename core/src/main/java/net/momirealms/craftengine/core/plugin/{ => compatibility}/CompatibilityManager.java (59%) create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ModelProvider.java create mode 100644 core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java diff --git a/bukkit/compatibility/build.gradle.kts b/bukkit/compatibility/build.gradle.kts index db481a7c5..55151de14 100644 --- a/bukkit/compatibility/build.gradle.kts +++ b/bukkit/compatibility/build.gradle.kts @@ -41,6 +41,8 @@ dependencies { compileOnly("com.viaversion:viaversion-api:5.3.2") // Skript compileOnly("com.github.SkriptLang:Skript:2.11.0") + // AuraSkills + compileOnly("dev.aurelium:auraskills-api-bukkit:2.2.4") // FAWE compileOnly(platform("com.intellectualsites.bom:bom-newest:1.52")) compileOnly("com.fastasyncworldedit:FastAsyncWorldEdit-Core") diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java index a4a72da12..4e00a179d 100644 --- a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/BukkitCompatibilityManager.java @@ -5,6 +5,7 @@ import net.momirealms.craftengine.bukkit.compatibility.bettermodel.BetterModelMo import net.momirealms.craftengine.bukkit.compatibility.item.MMOItemsProvider; import net.momirealms.craftengine.bukkit.compatibility.item.NeigeItemsProvider; import net.momirealms.craftengine.bukkit.compatibility.legacy.slimeworld.LegacySlimeFormatStorageAdaptor; +import net.momirealms.craftengine.bukkit.compatibility.leveler.AuraSkillsLevelerProvider; import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineModel; import net.momirealms.craftengine.bukkit.compatibility.modelengine.ModelEngineUtils; import net.momirealms.craftengine.bukkit.compatibility.papi.PlaceholderAPIUtils; @@ -16,24 +17,36 @@ import net.momirealms.craftengine.bukkit.compatibility.worldedit.WorldEditBlockR import net.momirealms.craftengine.bukkit.font.BukkitFontManager; import net.momirealms.craftengine.bukkit.item.BukkitItemManager; import net.momirealms.craftengine.bukkit.plugin.BukkitCraftEngine; -import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; +import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; -import net.momirealms.craftengine.core.plugin.CompatibilityManager; +import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; +import net.momirealms.craftengine.core.plugin.compatibility.ModelProvider; import net.momirealms.craftengine.core.util.Key; import net.momirealms.craftengine.core.util.VersionHelper; import net.momirealms.craftengine.core.world.WorldManager; import org.bukkit.Bukkit; import org.bukkit.plugin.Plugin; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import java.util.UUID; public class BukkitCompatibilityManager implements CompatibilityManager { private final BukkitCraftEngine plugin; + private final Map modelProviders; + private final Map levelerProviders; private boolean hasPlaceholderAPI; private boolean hasViaVersion; public BukkitCompatibilityManager(BukkitCraftEngine plugin) { this.plugin = plugin; + this.modelProviders = new HashMap<>(Map.of( + "ModelEngine", ModelEngineModel::new, + "BetterModel", BetterModelModel::new + )); + this.levelerProviders = new HashMap<>(); } @Override @@ -85,6 +98,14 @@ public class BukkitCompatibilityManager implements CompatibilityManager { this.initLuckPermsHook(); logHook("LuckPerms"); } + if (this.isPluginEnabled("AuraSkills")) { + this.registerLevelerProvider("AuraSkills", new AuraSkillsLevelerProvider()); + } + } + + @Override + public void registerLevelerProvider(String plugin, LevelerProvider provider) { + this.levelerProviders.put(plugin, provider); } private void logHook(String plugin) { @@ -92,13 +113,22 @@ public class BukkitCompatibilityManager implements CompatibilityManager { } @Override - public AbstractExternalModel createModelEngineModel(String id) { - return new ModelEngineModel(id); + public void addLevelerExp(Player player, String plugin, String target, double value) { + Optional.ofNullable(this.levelerProviders.get(plugin)).ifPresentOrElse(leveler -> leveler.addExp(player, target, value), + () -> this.plugin.logger().warn("[Compatibility] '" + plugin + "' leveler provider not found")); } @Override - public AbstractExternalModel createBetterModelModel(String id) { - return new BetterModelModel(id); + public int getLevel(Player player, String plugin, String target) { + return Optional.ofNullable(this.levelerProviders.get(plugin)).map(leveler -> leveler.getLevel(player, target)).orElseGet(() -> { + this.plugin.logger().warn("[Compatibility] '" + plugin + "' leveler provider not found"); + return 0; + }); + } + + @Override + public ExternalModel createModel(String plugin, String id) { + return this.modelProviders.get(plugin).createModel(id); } @Override diff --git a/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AuraSkillsLevelerProvider.java b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AuraSkillsLevelerProvider.java new file mode 100644 index 000000000..9189f2e30 --- /dev/null +++ b/bukkit/compatibility/src/main/java/net/momirealms/craftengine/bukkit/compatibility/leveler/AuraSkillsLevelerProvider.java @@ -0,0 +1,19 @@ +package net.momirealms.craftengine.bukkit.compatibility.leveler; + +import dev.aurelium.auraskills.api.AuraSkillsApi; +import dev.aurelium.auraskills.api.registry.NamespacedId; +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.plugin.compatibility.LevelerProvider; + +public class AuraSkillsLevelerProvider implements LevelerProvider { + + @Override + public void addExp(Player player, String target, double amount) { + AuraSkillsApi.get().getUser(player.uuid()).addSkillXp(AuraSkillsApi.get().getGlobalRegistry().getSkill(NamespacedId.fromDefault(target)), amount); + } + + @Override + public int getLevel(Player player, String target) { + return AuraSkillsApi.get().getUser(player.uuid()).getSkillLevel(AuraSkillsApi.get().getGlobalRegistry().getSkill(NamespacedId.fromDefault(target))); + } +} diff --git a/bukkit/loader/src/main/resources/translations/en.yml b/bukkit/loader/src/main/resources/translations/en.yml index fdfa1323b..c268cd1a0 100644 --- a/bukkit/loader/src/main/resources/translations/en.yml +++ b/bukkit/loader/src/main/resources/translations/en.yml @@ -330,6 +330,9 @@ warning.config.function.particle.missing_from: "Issue found in file Issue found in file - The config '' is missing the required 'to' argument for 'particle' function." warning.config.function.particle.missing_item: "Issue found in file - The config '' is missing the required 'item' argument for 'particle' function." warning.config.function.particle.missing_block_state: "Issue found in file - The config '' is missing the required 'block-state' argument for 'particle' function." +warning.config.function.leveler_exp.missing_count: "Issue found in file - The config '' is missing the required 'count' argument for 'leveler_exp' function." +warning.config.function.leveler_exp.missing_leveler: "Issue found in file - The config '' is missing the required 'leveler' argument for 'leveler_exp' function." +warning.config.function.leveler_exp.missing_plugin: "Issue found in file - The config '' is missing the required 'plugin' argument for 'leveler_exp' function." warning.config.selector.missing_type: "Issue found in file - The config '' is missing the required 'type' argument for selector." warning.config.selector.invalid_type: "Issue found in file - The config '' is using an invalid selector type ''." warning.config.selector.invalid_target: "Issue found in file - The config '' is using an invalid selector target ''." diff --git a/bukkit/loader/src/main/resources/translations/zh_cn.yml b/bukkit/loader/src/main/resources/translations/zh_cn.yml index 4f15d6a9f..ba48283e0 100644 --- a/bukkit/loader/src/main/resources/translations/zh_cn.yml +++ b/bukkit/loader/src/main/resources/translations/zh_cn.yml @@ -321,15 +321,18 @@ warning.config.function.open_window.missing_gui_type: "在文件 warning.config.function.open_window.invalid_gui_type: "在文件 中发现问题 - 配置项 '' 为 'open_window' 函数使用了无效的 GUI 类型 . 允许的类型: []。" warning.config.function.run.missing_functions: "在文件 中发现问题 - 配置项 '' 缺少 'run' 函数必需的 'functions' 参数" warning.config.function.place_block.missing_block_state: "在文件 中发现问题 - 配置项 '' 缺少 'place_block' 函数必需的 'block-state' 参数." -warning.config.function.set_food.missing_food: "Issue found in file - The config '' is missing the required 'food' argument for 'set_food' function." -warning.config.function.set_saturation.missing_saturation: "Issue found in file - The config '' is missing the required 'saturation' argument for 'set_saturation' function." -warning.config.function.play_sound.missing_sound: "Issue found in file - The config '' is missing the required 'sound' argument for 'play_sound' function." -warning.config.function.particle.missing_particle: "Issue found in file - The config '' is missing the required 'particle' argument for 'particle' function." -warning.config.function.particle.missing_color: "Issue found in file - The config '' is missing the required 'color' argument for 'particle' function." -warning.config.function.particle.missing_from: "Issue found in file - The config '' is missing the required 'from' argument for 'particle' function." -warning.config.function.particle.missing_to: "Issue found in file - The config '' is missing the required 'to' argument for 'particle' function." -warning.config.function.particle.missing_item: "Issue found in file - The config '' is missing the required 'item' argument for 'particle' function." -warning.config.function.particle.missing_block_state: "Issue found in file - The config '' is missing the required 'block-state' argument for 'particle' function." +warning.config.function.set_food.missing_food: "在文件 中发现问题 - 配置项 '' 缺少 'set_food' 函数必需的 'food' 参数" +warning.config.function.set_saturation.missing_saturation: "在文件 中发现问题 - 配置项 '' 缺少 'set_saturation' 函数必需的 'saturation' 参数" +warning.config.function.play_sound.missing_sound: "在文件 中发现问题 - 配置项 '' 缺少 'play_sound' 函数必需的 'sound' 参数" +warning.config.function.particle.missing_particle: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'particle' 参数" +warning.config.function.particle.missing_color: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'color' 参数" +warning.config.function.particle.missing_from: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'from' 参数" +warning.config.function.particle.missing_to: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'to' 参数" +warning.config.function.particle.missing_item: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'item' 参数" +warning.config.function.particle.missing_block_state: "在文件 中发现问题 - 配置项 '' 缺少 'particle' 函数必需的 'block-state' 参数" +warning.config.function.leveler_exp.missing_count: "在文件 中发现问题 - 配置项 '' 缺少 'leveler_exp' 函数必需的 'count' 参数" +warning.config.function.leveler_exp.missing_leveler: "在文件 中发现问题 - 配置项 '' 缺少 'leveler_exp' 函数必需的 'leveler' 参数" +warning.config.function.leveler_exp.missing_plugin: "在文件 中发现问题 - 配置项 '' 缺少 'leveler_exp' 函数必需的 'plugin' 参数" warning.config.selector.missing_type: "在文件 中发现问题 - 配置项 '' 缺少选择器必需的 'type' 参数" warning.config.selector.invalid_type: "在文件 中发现问题 - 配置项 '' 使用了无效的选择器类型 ''" warning.config.selector.invalid_target: "在文件 中发现问题 - 配置项 '' 使用了无效的选择器目标 ''" diff --git a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java index 6d5f8f262..72f05d54c 100644 --- a/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java +++ b/bukkit/src/main/java/net/momirealms/craftengine/bukkit/plugin/BukkitCraftEngine.java @@ -26,7 +26,7 @@ import net.momirealms.craftengine.bukkit.util.EventUtils; import net.momirealms.craftengine.bukkit.util.Reflections; import net.momirealms.craftengine.bukkit.world.BukkitWorldManager; import net.momirealms.craftengine.core.item.ItemManager; -import net.momirealms.craftengine.core.plugin.CompatibilityManager; +import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; import net.momirealms.craftengine.core.plugin.CraftEngine; import net.momirealms.craftengine.core.plugin.classpath.ReflectionClassPathAppender; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; diff --git a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java index 5e28da9ac..d8980df7b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/entity/furniture/AbstractFurnitureManager.java @@ -116,9 +116,9 @@ public abstract class AbstractFurnitureManager implements FurnitureManager { // external model providers Optional externalModel; if (placementArguments.containsKey("model-engine")) { - externalModel = Optional.of(plugin.compatibilityManager().createModelEngineModel(placementArguments.get("model-engine").toString())); + externalModel = Optional.of(plugin.compatibilityManager().createModel("ModelEngine", placementArguments.get("model-engine").toString())); } else if (placementArguments.containsKey("better-model")) { - externalModel = Optional.of(plugin.compatibilityManager().createBetterModelModel(placementArguments.get("better-model").toString())); + externalModel = Optional.of(plugin.compatibilityManager().createModel("BetterModel", placementArguments.get("better-model").toString())); } else { externalModel = Optional.empty(); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java index df20daeff..cf5e56691 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/CraftEngine.java @@ -12,6 +12,7 @@ import net.momirealms.craftengine.core.pack.PackManager; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.command.CraftEngineCommandManager; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; import net.momirealms.craftengine.core.plugin.config.template.TemplateManagerImpl; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java index cbb4feb74..ea2888a6d 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/Plugin.java @@ -11,6 +11,7 @@ import net.momirealms.craftengine.core.loot.VanillaLootManager; import net.momirealms.craftengine.core.pack.PackManager; import net.momirealms.craftengine.core.plugin.classpath.ClassPathAppender; import net.momirealms.craftengine.core.plugin.command.sender.SenderFactory; +import net.momirealms.craftengine.core.plugin.compatibility.CompatibilityManager; import net.momirealms.craftengine.core.plugin.config.Config; import net.momirealms.craftengine.core.plugin.config.template.TemplateManager; import net.momirealms.craftengine.core.plugin.context.GlobalVariableManager; diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/CompatibilityManager.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java similarity index 59% rename from core/src/main/java/net/momirealms/craftengine/core/plugin/CompatibilityManager.java rename to core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java index 7749be015..5afa56e2b 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/CompatibilityManager.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/CompatibilityManager.java @@ -1,6 +1,7 @@ -package net.momirealms.craftengine.core.plugin; +package net.momirealms.craftengine.core.plugin.compatibility; import net.momirealms.craftengine.core.entity.furniture.AbstractExternalModel; +import net.momirealms.craftengine.core.entity.furniture.ExternalModel; import net.momirealms.craftengine.core.entity.player.Player; import java.util.UUID; @@ -13,9 +14,13 @@ public interface CompatibilityManager { void onDelayedEnable(); - AbstractExternalModel createModelEngineModel(String id); + void registerLevelerProvider(String plugin, LevelerProvider provider); - AbstractExternalModel createBetterModelModel(String id); + void addLevelerExp(Player player, String plugin, String target, double value); + + int getLevel(Player player, String plugin, String target); + + ExternalModel createModel(String plugin, String id); int interactionToBaseEntity(int id); diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java new file mode 100644 index 000000000..228115d40 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/LevelerProvider.java @@ -0,0 +1,10 @@ +package net.momirealms.craftengine.core.plugin.compatibility; + +import net.momirealms.craftengine.core.entity.player.Player; + +public interface LevelerProvider { + + void addExp(Player player, String target, double amount); + + int getLevel(Player player, String target); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ModelProvider.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ModelProvider.java new file mode 100644 index 000000000..f636bf857 --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/compatibility/ModelProvider.java @@ -0,0 +1,8 @@ +package net.momirealms.craftengine.core.plugin.compatibility; + +import net.momirealms.craftengine.core.entity.furniture.ExternalModel; + +public interface ModelProvider { + + ExternalModel createModel(String id); +} diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java index b2ce2de15..bc07135d2 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/event/EventFunctions.java @@ -35,6 +35,7 @@ public class EventFunctions { register(CommonFunctions.PLAY_SOUND, new PlaySoundFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.PARTICLE, new ParticleFunction.FactoryImpl<>(EventConditions::fromMap)); register(CommonFunctions.POTION_EFFECT, new PotionEffectFunction.FactoryImpl<>(EventConditions::fromMap)); + register(CommonFunctions.LEVELER_EXP, new LevelerExpFunction.FactoryImpl<>(EventConditions::fromMap)); } public static void register(Key key, FunctionFactory factory) { diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java index e8369e3fa..a1011a396 100644 --- a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/CommonFunctions.java @@ -23,5 +23,5 @@ public final class CommonFunctions { public static final Key SET_SATURATION = Key.of("craftengine:saturation"); public static final Key DROP_LOOT = Key.of("craftengine:drop_loot"); public static final Key SWING_HAND = Key.of("craftengine:swing_hand"); - public static final Key PLUGIN_EXP = Key.of("craftengine:plugin_exp"); + public static final Key LEVELER_EXP = Key.of("craftengine:leveler_exp"); } diff --git a/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java new file mode 100644 index 000000000..4c546ad3b --- /dev/null +++ b/core/src/main/java/net/momirealms/craftengine/core/plugin/context/function/LevelerExpFunction.java @@ -0,0 +1,67 @@ +package net.momirealms.craftengine.core.plugin.context.function; + +import net.momirealms.craftengine.core.entity.player.Player; +import net.momirealms.craftengine.core.item.Item; +import net.momirealms.craftengine.core.plugin.CraftEngine; +import net.momirealms.craftengine.core.plugin.context.*; +import net.momirealms.craftengine.core.plugin.context.number.NumberProvider; +import net.momirealms.craftengine.core.plugin.context.number.NumberProviders; +import net.momirealms.craftengine.core.plugin.context.parameter.DirectContextParameters; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelector; +import net.momirealms.craftengine.core.plugin.context.selector.PlayerSelectors; +import net.momirealms.craftengine.core.plugin.context.text.TextProvider; +import net.momirealms.craftengine.core.util.Key; +import net.momirealms.craftengine.core.util.ResourceConfigUtils; + +import java.util.List; +import java.util.Map; +import java.util.Optional; + +public class LevelerExpFunction extends AbstractConditionalFunction { + private final PlayerSelector selector; + private final NumberProvider count; + private final String leveler; + private final String plugin; + + public LevelerExpFunction(NumberProvider count, String leveler, String plugin, PlayerSelector selector, List> predicates) { + super(predicates); + this.count = count; + this.leveler = leveler; + this.plugin = plugin; + this.selector = selector; + } + + @Override + public void runInternal(CTX ctx) { + if (this.selector == null) { + ctx.getOptionalParameter(DirectContextParameters.PLAYER).ifPresent(it -> { + CraftEngine.instance().compatibilityManager().addLevelerExp(it, this.plugin, this.leveler, this.count.getDouble(ctx)); + }); + } else { + for (Player target : this.selector.get(ctx)) { + RelationalContext relationalContext = ViewerContext.of(ctx, PlayerOptionalContext.of(target, ContextHolder.EMPTY)); + CraftEngine.instance().compatibilityManager().addLevelerExp(target, this.plugin, this.leveler, this.count.getDouble(relationalContext)); + } + } + } + + @Override + public Key type() { + return CommonFunctions.LEVELER_EXP; + } + + public static class FactoryImpl extends AbstractFactory { + + public FactoryImpl(java.util.function.Function, Condition> factory) { + super(factory); + } + + @Override + public Function create(Map arguments) { + Object count = ResourceConfigUtils.requireNonNullOrThrow(arguments.get("count"), "warning.config.function.leveler_exp.missing_count"); + String leveler = ResourceConfigUtils.requireNonEmptyStringOrThrow("leveler", "warning.config.function.leveler_exp.missing_leveler"); + String plugin = ResourceConfigUtils.requireNonEmptyStringOrThrow("plugin", "warning.config.function.leveler_exp.missing_plugin"); + return new LevelerExpFunction<>(NumberProviders.fromObject(count), leveler, plugin, PlayerSelectors.fromObject(arguments.get("target"), conditionFactory()), getPredicates(arguments)); + } + } +}