From 6ec825fb360e51f2973cf8d7511b5bf887ccd225 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Wed, 24 Jul 2024 20:45:06 +0800 Subject: [PATCH] refactor config parsers --- .../api/mechanic/block/BlockConfig.java | 33 ++++++++ .../api/mechanic/block/BlockConfigImpl.java | 35 +++++++- .../api/mechanic/block/BlockManager.java | 19 +++++ .../api/mechanic/config/ConfigManager.java | 78 +++++++++++++---- .../api/mechanic/config/ConfigType.java | 83 ++++++++++++++++++- .../mechanic/context/PlayerContextImpl.java | 1 + compatibility/build.gradle.kts | 2 +- .../bukkit/block/BukkitBlockManager.java | 21 ++++- .../bukkit/config/BukkitConfigManager.java | 45 +++++++++- .../bukkit/market/BukkitMarketManager.java | 14 ++-- gradle.properties | 2 +- 11 files changed, 301 insertions(+), 32 deletions(-) diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfig.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfig.java index 23bbfda2..8eae20c5 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfig.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfig.java @@ -17,6 +17,9 @@ package net.momirealms.customfishing.api.mechanic.block; +import net.momirealms.customfishing.api.mechanic.misc.value.MathValue; +import org.bukkit.entity.Player; + import java.util.List; /** @@ -38,6 +41,20 @@ public interface BlockConfig { */ String blockID(); + /** + * Retrieves the horizontal vector value for the block. + * + * @return the horizontal vector value as a double + */ + MathValue horizontalVector(); + + /** + * Retrieves the vertical vector value for the block. + * + * @return the vertical vector value as a double + */ + MathValue verticalVector(); + /** * Gets the list of data modifiers applied to the block. * @@ -81,6 +98,22 @@ public interface BlockConfig { */ Builder blockID(String blockID); + /** + * Sets the vertical vector value for the BlockConfig being built. + * + * @param value the vertical vector value as a double + * @return the current Builder instance + */ + Builder verticalVector(MathValue value); + + /** + * Sets the horizontal vector value for the BlockConfig being built. + * + * @param value the horizontal vector value as a double + * @return the current Builder instance + */ + Builder horizontalVector(MathValue value); + /** * Sets the list of data modifiers for the configuration. * diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfigImpl.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfigImpl.java index 762ebda8..58b08884 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfigImpl.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockConfigImpl.java @@ -17,20 +17,29 @@ package net.momirealms.customfishing.api.mechanic.block; +import net.momirealms.customfishing.api.mechanic.misc.value.MathValue; +import org.bukkit.entity.Player; + import java.util.ArrayList; import java.util.List; +import static java.util.Objects.requireNonNull; + public class BlockConfigImpl implements BlockConfig { private final String blockID; + private final MathValue horizontalVector; + private final MathValue verticalVector; private final List dataModifierList; private final List stateModifierList; private final String id; - public BlockConfigImpl(String id, String blockID, List dataModifierList, List stateModifierList) { + public BlockConfigImpl(String id, String blockID, MathValue horizontalVector, MathValue verticalVector, List dataModifierList, List stateModifierList) { this.blockID = blockID; this.dataModifierList = dataModifierList; this.stateModifierList = stateModifierList; + this.horizontalVector = horizontalVector; + this.verticalVector = verticalVector; this.id = id; } @@ -44,6 +53,16 @@ public class BlockConfigImpl implements BlockConfig { return blockID; } + @Override + public MathValue horizontalVector() { + return horizontalVector; + } + + @Override + public MathValue verticalVector() { + return verticalVector; + } + @Override public List dataModifier() { return dataModifierList; @@ -58,6 +77,8 @@ public class BlockConfigImpl implements BlockConfig { private String blockID; private final List dataModifierList = new ArrayList<>(); private final List stateModifierList = new ArrayList<>(); + private MathValue horizontalVector; + private MathValue verticalVector; private String id; @Override public Builder id(String id) { @@ -70,6 +91,16 @@ public class BlockConfigImpl implements BlockConfig { return this; } @Override + public Builder verticalVector(MathValue value) { + this.verticalVector = value; + return this; + } + @Override + public Builder horizontalVector(MathValue value) { + this.horizontalVector = value; + return this; + } + @Override public Builder dataModifierList(List dataModifierList) { this.dataModifierList.addAll(dataModifierList); return this; @@ -81,7 +112,7 @@ public class BlockConfigImpl implements BlockConfig { } @Override public BlockConfig build() { - return new BlockConfigImpl(id, blockID, dataModifierList, stateModifierList); + return new BlockConfigImpl(id, requireNonNull(blockID, "Block id should not be null"), horizontalVector, verticalVector, dataModifierList, stateModifierList); } } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockManager.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockManager.java index ee0a35a2..a3db986f 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/block/BlockManager.java @@ -23,12 +23,31 @@ import org.bukkit.block.Block; import org.bukkit.entity.FallingBlock; import org.bukkit.entity.Player; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; /** * Interface for managing custom block loots. */ public interface BlockManager extends Reloadable { + /** + * Get the {@link BlockDataModifierFactory} by ID + * + * @param id the id of the factory + * @return the factory instance + */ + @Nullable + BlockDataModifierFactory getBlockDataModifierFactory(@NotNull String id); + + /** + * Get the {@link BlockStateModifierFactory} by ID + * + * @param id the id of the factory + * @return the factory instance + */ + @Nullable + BlockStateModifierFactory getBlockStateModifierFactory(@NotNull String id); + /** * Registers a block loot. * diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigManager.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigManager.java index fe581b39..1004d8cc 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigManager.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigManager.java @@ -27,6 +27,7 @@ import dev.dejvokep.boostedyaml.settings.loader.LoaderSettings; import dev.dejvokep.boostedyaml.settings.updater.UpdaterSettings; import dev.dejvokep.boostedyaml.utils.format.NodeRole; import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; +import net.momirealms.customfishing.api.mechanic.block.BlockConfig; import net.momirealms.customfishing.api.mechanic.config.function.*; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.effect.Effect; @@ -66,7 +67,15 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { private static ConfigManager instance; protected final BukkitCustomFishingPlugin plugin; - protected final HashMap> formatFunctions = new HashMap<>(); + protected final HashMap> entityFormatFunctions = new HashMap<>(); + protected final HashMap> blockFormatFunctions = new HashMap<>(); + protected final HashMap> totemFormatFunctions = new HashMap<>(); + protected final HashMap> hookFormatFunctions = new HashMap<>(); + protected final HashMap> eventFormatFunctions = new HashMap<>(); + protected final HashMap> baseEffectFormatFunctions = new HashMap<>(); + protected final HashMap> effectModifierFormatFunctions = new HashMap<>(); + protected final HashMap> itemFormatFunctions = new HashMap<>(); + protected final HashMap> lootFormatFunctions = new HashMap<>(); protected int placeholderLimit; protected boolean redisRanking; protected String serverGroup; @@ -234,39 +243,42 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { } public void registerHookParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new HookParserFunction(function)); + registerNodeFunction(nodes, new HookParserFunction(function), hookFormatFunctions); } public void registerTotemParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new TotemParserFunction(function)); + registerNodeFunction(nodes, new TotemParserFunction(function), totemFormatFunctions); } public void registerLootParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new LootParserFunction(function)); + registerNodeFunction(nodes, new LootParserFunction(function), lootFormatFunctions); } public void registerItemParser(Function, Context>> function, int priority, String... nodes) { - registerNodeFunction(nodes, new ItemParserFunction(priority, function)); + registerNodeFunction(nodes, new ItemParserFunction(priority, function), itemFormatFunctions); } public void registerEffectModifierParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new EffectModifierParserFunction(function)); + registerNodeFunction(nodes, new EffectModifierParserFunction(function), effectModifierFormatFunctions); } public void registerEntityParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new EntityParserFunction(function)); + registerNodeFunction(nodes, new EntityParserFunction(function), entityFormatFunctions); + } + + public void registerBlockParser(Function> function, String... nodes) { + registerNodeFunction(nodes, new BlockParserFunction(function), blockFormatFunctions); } public void registerEventParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new EventParserFunction(function)); + registerNodeFunction(nodes, new EventParserFunction(function), eventFormatFunctions); } public void registerBaseEffectParser(Function> function, String... nodes) { - registerNodeFunction(nodes, new BaseEffectParserFunction(function)); + registerNodeFunction(nodes, new BaseEffectParserFunction(function), baseEffectFormatFunctions); } - public void unregisterNodeFunction(String... nodes) { - Map> functionMap = formatFunctions; + public void unregisterNodeFunction(Map> functionMap, String... nodes) { for (int i = 0; i < nodes.length; i++) { if (functionMap.containsKey(nodes[i])) { Node functionNode = functionMap.get(nodes[i]); @@ -285,8 +297,7 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { } } - public void registerNodeFunction(String[] nodes, ConfigParserFunction configParserFunction) { - Map> functionMap = formatFunctions; + public void registerNodeFunction(String[] nodes, ConfigParserFunction configParserFunction, Map> functionMap) { for (int i = 0; i < nodes.length; i++) { if (functionMap.containsKey(nodes[i])) { Node functionNode = functionMap.get(nodes[i]); @@ -389,11 +400,48 @@ public abstract class ConfigManager implements ConfigLoader, Reloadable { } } - public Map> getFormatFunctions() { - return formatFunctions; + public HashMap> getBlockFormatFunctions() { + return blockFormatFunctions; + } + + public HashMap> getEntityFormatFunctions() { + return entityFormatFunctions; + } + + public HashMap> getTotemFormatFunctions() { + return totemFormatFunctions; + } + + public HashMap> getHookFormatFunctions() { + return hookFormatFunctions; + } + + public HashMap> getEventFormatFunctions() { + return eventFormatFunctions; + } + + public HashMap> getBaseEffectFormatFunctions() { + return baseEffectFormatFunctions; + } + + public HashMap> getEffectModifierFormatFunctions() { + return effectModifierFormatFunctions; + } + + public HashMap> getItemFormatFunctions() { + return itemFormatFunctions; + } + + public HashMap> getLootFormatFunctions() { + return lootFormatFunctions; } public abstract List, Double, Double>>> parseWeightOperation(List ops); public abstract List, Double, Double>>> parseGroupWeightOperation(List gops); + + @Deprecated + public Map> getDefaultFormatFunctions() { + return getItemFormatFunctions(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java index f9fef15f..b84e6c48 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/config/ConfigType.java @@ -24,7 +24,9 @@ import net.momirealms.customfishing.api.mechanic.config.function.ConfigParserFun import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.util.TriConsumer; +import java.util.HashMap; import java.util.Map; +import java.util.function.Supplier; /** * Configuration types for various mechanics. @@ -33,6 +35,13 @@ public class ConfigType { public static final ConfigType ITEM = of( "item", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getLootFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getItemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.LOOT); ItemConfigParser config = new ItemConfigParser(id, section, functions); @@ -44,6 +53,13 @@ public class ConfigType { public static final ConfigType ENTITY = of( "entity", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getLootFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEntityFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.LOOT); EntityConfigParser config = new EntityConfigParser(id, section, functions); @@ -55,6 +71,13 @@ public class ConfigType { public static final ConfigType BLOCK = of( "block", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getLootFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getBlockFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.LOOT); BlockConfigParser config = new BlockConfigParser(id, section, functions); @@ -66,6 +89,13 @@ public class ConfigType { public static final ConfigType ROD = of( "rod", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getItemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.ROD); RodConfigParser config = new RodConfigParser(id, section, functions); @@ -78,6 +108,13 @@ public class ConfigType { public static final ConfigType BAIT = of( "bait", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getItemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.BAIT); BaitConfigParser config = new BaitConfigParser(id, section, functions); @@ -90,6 +127,14 @@ public class ConfigType { public static final ConfigType HOOK = of( "hook", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getItemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getHookFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.HOOK); HookConfigParser config = new HookConfigParser(id, section, functions); @@ -103,6 +148,13 @@ public class ConfigType { public static final ConfigType UTIL = of( "util", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getItemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { MechanicType.register(id, MechanicType.UTIL); UtilConfigParser config = new UtilConfigParser(id, section, functions); @@ -115,6 +167,13 @@ public class ConfigType { public static final ConfigType TOTEM = of( "totem", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getTotemFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + return parsers; + }, (id, section, functions) -> { TotemConfigParser config = new TotemConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier(), MechanicType.TOTEM); @@ -125,6 +184,12 @@ public class ConfigType { public static final ConfigType ENCHANT = of( "enchant", + () -> { + HashMap> parsers = new HashMap<>(); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEventFormatFunctions()); + parsers.putAll(BukkitCustomFishingPlugin.getInstance().getConfigManager().getEffectModifierFormatFunctions()); + return parsers; + }, (id, section, functions) -> { EnchantConfigParser config = new EnchantConfigParser(id, section, functions); BukkitCustomFishingPlugin.getInstance().getEffectManager().registerEffectModifier(config.getEffectModifier(), MechanicType.ENCHANT); @@ -134,6 +199,7 @@ public class ConfigType { public static final ConfigType MINI_GAME = of( "minigame", + HashMap::new, (id, section, functions) -> { MiniGameConfigParser config = new MiniGameConfigParser(id, section); BukkitCustomFishingPlugin.getInstance().getGameManager().registerGame(config.getGame()); @@ -153,6 +219,7 @@ public class ConfigType { private final String path; private TriConsumer>> argumentConsumer; + private Supplier>> parserSupplier; /** * Creates a new ConfigType with the specified path and argument consumer. @@ -160,9 +227,10 @@ public class ConfigType { * @param path the configuration path. * @param argumentConsumer the argument consumer. */ - public ConfigType(String path, TriConsumer>> argumentConsumer) { + public ConfigType(String path, Supplier>> parserSupplier, TriConsumer>> argumentConsumer) { this.path = path; this.argumentConsumer = argumentConsumer; + this.parserSupplier = parserSupplier; } /** @@ -181,8 +249,8 @@ public class ConfigType { * @param argumentConsumer the argument consumer. * @return A new ConfigType instance. */ - public static ConfigType of(String path, TriConsumer>> argumentConsumer) { - return new ConfigType(path, argumentConsumer); + public static ConfigType of(String path, Supplier>> parserSupplier, TriConsumer>> argumentConsumer) { + return new ConfigType(path, parserSupplier, argumentConsumer); } /** @@ -204,4 +272,13 @@ public class ConfigType { public String path() { return path; } + + /** + * Get the config parsers + * + * @return config parsers + */ + public Map> parser() { + return parserSupplier.get(); + } } diff --git a/api/src/main/java/net/momirealms/customfishing/api/mechanic/context/PlayerContextImpl.java b/api/src/main/java/net/momirealms/customfishing/api/mechanic/context/PlayerContextImpl.java index 7301bd96..26be94e5 100644 --- a/api/src/main/java/net/momirealms/customfishing/api/mechanic/context/PlayerContextImpl.java +++ b/api/src/main/java/net/momirealms/customfishing/api/mechanic/context/PlayerContextImpl.java @@ -62,6 +62,7 @@ public final class PlayerContextImpl implements Context { @Override public PlayerContextImpl arg(ContextKeys key, C value) { + if (key == null || value == null) return this; this.args.put(key, value); this.placeholderMap.put("{" + key.key() + "}", value.toString()); return this; diff --git a/compatibility/build.gradle.kts b/compatibility/build.gradle.kts index a014e298..46086d83 100644 --- a/compatibility/build.gradle.kts +++ b/compatibility/build.gradle.kts @@ -43,7 +43,7 @@ dependencies { compileOnly(files("libs/BattlePass-4.0.6-api.jar")) compileOnly(files("libs/ClueScrolls-4.8.7-api.jar")) compileOnly(files("libs/notquests-5.17.1.jar")) - compileOnly("org.betonquest:betonquest:2.0.1") + compileOnly("org.betonquest:betonquest:2.1.2") // item compileOnly(files("libs/zaphkiel-2.0.24.jar")) compileOnly("com.github.LoneDev6:API-ItemsAdder:3.6.1") diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/block/BukkitBlockManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/block/BukkitBlockManager.java index 3568e7e6..15c30b39 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/block/BukkitBlockManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/block/BukkitBlockManager.java @@ -50,6 +50,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.persistence.PersistentDataType; import org.bukkit.util.Vector; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; import java.util.*; import java.util.concurrent.ThreadLocalRandom; @@ -88,6 +89,18 @@ public class BukkitBlockManager implements BlockManager, Listener { }); } + @Nullable + @Override + public BlockDataModifierFactory getBlockDataModifierFactory(@NotNull String id) { + return dataFactories.get(id); + } + + @Nullable + @Override + public BlockStateModifierFactory getBlockStateModifierFactory(@NotNull String id) { + return stateFactories.get(id); + } + @Override public void load() { Bukkit.getPluginManager().registerEvents(this, plugin.getBoostrap()); @@ -235,8 +248,12 @@ public class BukkitBlockManager implements BlockManager, Listener { PersistentDataType.STRING, id + ";" + context.getHolder().getName() ); - Vector vector = playerLocation.subtract(hookLocation).toVector().multiply(1.2 - 1); - vector = vector.setY((vector.getY() + 0.2) * 1.2); + double d0 = playerLocation.getX() - hookLocation.getX(); + double d1 = playerLocation.getY() - hookLocation.getY(); + double d2 = playerLocation.getZ() - hookLocation.getZ(); + double d3 = config.horizontalVector().evaluate(context); + double d4 = config.verticalVector().evaluate(context); + Vector vector = new Vector(d0 * 0.1D * d3, d1 * 0.1D + Math.sqrt(Math.sqrt(d0 * d0 + d1 * d1 + d2 * d2)) * 0.08D * d4, d2 * 0.1D * d3); fallingBlock.setVelocity(vector); return fallingBlock; } diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java index 46454bb7..18f5936b 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/config/BukkitConfigManager.java @@ -32,8 +32,13 @@ import net.momirealms.customfishing.api.BukkitCustomFishingPlugin; import net.momirealms.customfishing.api.mechanic.MechanicType; import net.momirealms.customfishing.api.mechanic.action.Action; import net.momirealms.customfishing.api.mechanic.action.ActionTrigger; +import net.momirealms.customfishing.api.mechanic.block.BlockDataModifier; +import net.momirealms.customfishing.api.mechanic.block.BlockDataModifierFactory; +import net.momirealms.customfishing.api.mechanic.block.BlockStateModifier; +import net.momirealms.customfishing.api.mechanic.block.BlockStateModifierFactory; import net.momirealms.customfishing.api.mechanic.config.ConfigManager; import net.momirealms.customfishing.api.mechanic.config.ConfigType; +import net.momirealms.customfishing.api.mechanic.config.function.ConfigParserFunction; import net.momirealms.customfishing.api.mechanic.context.Context; import net.momirealms.customfishing.api.mechanic.context.ContextKeys; import net.momirealms.customfishing.api.mechanic.effect.Effect; @@ -60,6 +65,7 @@ import net.momirealms.customfishing.bukkit.totem.particle.DustParticleSetting; import net.momirealms.customfishing.bukkit.totem.particle.ParticleSetting; import net.momirealms.customfishing.bukkit.util.ItemStackUtils; import net.momirealms.customfishing.bukkit.util.ParticleUtils; +import net.momirealms.customfishing.common.config.node.Node; import net.momirealms.customfishing.common.dependency.DependencyProperties; import net.momirealms.customfishing.common.helper.AdventureHelper; import net.momirealms.customfishing.common.helper.VersionHelper; @@ -102,6 +108,7 @@ public class BukkitConfigManager extends ConfigManager { this.registerBuiltInEffectModifierParser(); this.registerBuiltInTotemParser(); this.registerBuiltInHookParser(); + this.registerBuiltInBlockParser(); dustParticle = VersionHelper.isVersionNewerThan1_20_5() ? Particle.valueOf("DUST") : Particle.valueOf("REDSTONE"); } @@ -262,6 +269,7 @@ public class BukkitConfigManager extends ConfigManager { if (!typeFolder.mkdirs()) return; plugin.getBoostrap().saveResource("contents" + File.separator + type.path() + File.separator + "default.yml", false); } + Map> nodes = type.parser(); fileDeque.push(typeFolder); while (!fileDeque.isEmpty()) { File file = fileDeque.pop(); @@ -274,7 +282,7 @@ public class BukkitConfigManager extends ConfigManager { YamlDocument document = plugin.getConfigManager().loadData(subFile); for (Map.Entry entry : document.getStringRouteMappedValues(false).entrySet()) { if (entry.getValue() instanceof Section section) { - type.parse(entry.getKey(), section, formatFunctions); + type.parse(entry.getKey(), section, nodes); } } } @@ -783,6 +791,41 @@ public class BukkitConfigManager extends ConfigManager { }, "base-effects", "wait-time-multiplier"); } + private void registerBuiltInBlockParser() { + this.registerBlockParser(object -> { + String block = (String) object; + return builder -> builder.blockID(block); + }, "block"); + this.registerBlockParser(object -> { + Section section = (Section) object; + List dataModifiers = new ArrayList<>(); + List stateModifiers = new ArrayList<>(); + for (Map.Entry innerEntry : section.getStringRouteMappedValues(false).entrySet()) { + BlockDataModifierFactory dataModifierFactory = plugin.getBlockManager().getBlockDataModifierFactory(innerEntry.getKey()); + if (dataModifierFactory != null) { + dataModifiers.add(dataModifierFactory.process(innerEntry.getValue())); + continue; + } + BlockStateModifierFactory stateModifierFactory = plugin.getBlockManager().getBlockStateModifierFactory(innerEntry.getKey()); + if (stateModifierFactory != null) { + stateModifiers.add(stateModifierFactory.process(innerEntry.getValue())); + } + } + return builder -> { + builder.dataModifierList(dataModifiers); + builder.stateModifierList(stateModifiers); + }; + }, "properties"); + this.registerBlockParser(object -> { + MathValue mathValue = MathValue.auto(object); + return builder -> builder.horizontalVector(mathValue); + }, "velocity", "horizontal"); + this.registerBlockParser(object -> { + MathValue mathValue = MathValue.auto(object); + return builder -> builder.verticalVector(mathValue); + }, "velocity", "vertical"); + } + private void registerBuiltInEntityParser() { this.registerEntityParser(object -> { String entity = (String) object; diff --git a/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java b/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java index 47d89245..e4f06f11 100644 --- a/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java +++ b/core/src/main/java/net/momirealms/customfishing/bukkit/market/BukkitMarketManager.java @@ -146,9 +146,9 @@ public class BukkitMarketManager implements MarketManager, Listener { this.sellAllSlot = sellAllSection.getString("symbol", "S").charAt(0); this.sellFishingBag = sellAllSection.getBoolean("fishingbag", true); - this.sellAllIconAllowItem = new SingleItemParser("allow", sellAllSection.getSection("allow-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); - this.sellAllIconDenyItem = new SingleItemParser("deny", sellAllSection.getSection("deny-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); - this.sellAllIconLimitItem = new SingleItemParser("limit", sellAllSection.getSection("limit-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); + this.sellAllIconAllowItem = new SingleItemParser("allow", sellAllSection.getSection("allow-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); + this.sellAllIconDenyItem = new SingleItemParser("deny", sellAllSection.getSection("deny-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); + this.sellAllIconLimitItem = new SingleItemParser("limit", sellAllSection.getSection("limit-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); this.sellAllAllowActions = plugin.getActionManager().parseActions(sellAllSection.getSection("allow-icon.action")); this.sellAllDenyActions = plugin.getActionManager().parseActions(sellAllSection.getSection("deny-icon.action")); @@ -163,9 +163,9 @@ public class BukkitMarketManager implements MarketManager, Listener { if (sellSection != null) { this.sellSlot = sellSection.getString("symbol", "B").charAt(0); - this.sellIconAllowItem = new SingleItemParser("allow", sellSection.getSection("allow-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); - this.sellIconDenyItem = new SingleItemParser("deny", sellSection.getSection("deny-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); - this.sellIconLimitItem = new SingleItemParser("limit", sellSection.getSection("limit-icon"), plugin.getConfigManager().getFormatFunctions()).getItem(); + this.sellIconAllowItem = new SingleItemParser("allow", sellSection.getSection("allow-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); + this.sellIconDenyItem = new SingleItemParser("deny", sellSection.getSection("deny-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); + this.sellIconLimitItem = new SingleItemParser("limit", sellSection.getSection("limit-icon"), plugin.getConfigManager().getItemFormatFunctions()).getItem(); this.sellAllowActions = plugin.getActionManager().parseActions(sellSection.getSection("allow-icon.action")); this.sellDenyActions = plugin.getActionManager().parseActions(sellSection.getSection("deny-icon.action")); @@ -188,7 +188,7 @@ public class BukkitMarketManager implements MarketManager, Listener { for (Map.Entry entry : decorativeSection.getStringRouteMappedValues(false).entrySet()) { if (entry.getValue() instanceof Section innerSection) { char symbol = Objects.requireNonNull(innerSection.getString("symbol")).charAt(0); - decorativeIcons.put(symbol, new SingleItemParser("gui", innerSection, plugin.getConfigManager().getFormatFunctions()).getItem()); + decorativeIcons.put(symbol, new SingleItemParser("gui", innerSection, plugin.getConfigManager().getItemFormatFunctions()).getItem()); } } } diff --git a/gradle.properties b/gradle.properties index cf50950a..a17cf5cd 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,6 +1,6 @@ # Project settings # Rule: [major update].[feature update].[bug fix] -project_version=2.2.4 +project_version=2.2.5 config_version=34 project_group=net.momirealms