diff --git a/eco-api/src/main/java/com/willfp/eco/core/Handler.java b/eco-api/src/main/java/com/willfp/eco/core/Handler.java index dab5c04e..b8976df7 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/Handler.java +++ b/eco-api/src/main/java/com/willfp/eco/core/Handler.java @@ -13,6 +13,7 @@ import com.willfp.eco.core.gui.GUIFactory; import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration; import com.willfp.eco.core.proxy.Cleaner; import com.willfp.eco.core.proxy.ProxyFactory; +import com.willfp.eco.core.requirement.RequirementFactory; import com.willfp.eco.core.scheduling.Scheduler; import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; @@ -194,4 +195,11 @@ public interface Handler { * @param plugin The plugin. */ void registerBStats(@NotNull EcoPlugin plugin); + + /** + * Get the requirement factory. + * + * @return The factory. + */ + RequirementFactory getRequirementFactory(); } diff --git a/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirement.java b/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirement.java new file mode 100644 index 00000000..8e1ddb8e --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirement.java @@ -0,0 +1,28 @@ +package com.willfp.eco.core.requirement; + +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +/** + * A requirement is a defined goal that a player must meet. + */ +public abstract class Requirement { + /** + * Create a new requirement. + */ + protected Requirement() { + + } + + /** + * Test if the player meets the requirement. + * + * @param player The player. + * @param args The arguments. + * @return The requirement. + */ + public abstract boolean doesPlayerMeet(@NotNull Player player, + @NotNull List args); +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/requirement/RequirementFactory.java b/eco-api/src/main/java/com/willfp/eco/core/requirement/RequirementFactory.java new file mode 100644 index 00000000..7210ed3e --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/requirement/RequirementFactory.java @@ -0,0 +1,17 @@ +package com.willfp.eco.core.requirement; + +import org.jetbrains.annotations.NotNull; + +/** + * Interface for internal requirement factory implementations. + */ +public interface RequirementFactory { + /** + * Create a requirement. + * + * @param name The name. + * @return The requirement returned for the name. + * Will return a requirement that is always true if not found. + */ + Requirement create(@NotNull String name); +} diff --git a/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirements.java b/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirements.java new file mode 100644 index 00000000..45590deb --- /dev/null +++ b/eco-api/src/main/java/com/willfp/eco/core/requirement/Requirements.java @@ -0,0 +1,41 @@ +package com.willfp.eco.core.requirement; + +import com.willfp.eco.core.Eco; +import lombok.experimental.UtilityClass; +import org.jetbrains.annotations.NotNull; + +/** + * Contains methods and fields pertaining to requirements. + */ +@UtilityClass +public class Requirements { + /** + * Requires a player to have a permission. + */ + public static final Requirement HAS_PERMISSION = Eco.getHandler().getRequirementFactory().create("has-permission"); + + /** + * Placeholder equals value. + */ + public static final Requirement PLACEHOLDER_EQUALS = Eco.getHandler().getRequirementFactory().create("placeholder-equals"); + + /** + * Numeric placeholder greater than value. + */ + public static final Requirement PLACEHOLDER_GREATER_THAN = Eco.getHandler().getRequirementFactory().create("placeholder-greater-than"); + + /** + * Numeric placeholder less than value. + */ + public static final Requirement PLACEHOLDER_LESS_THAN = Eco.getHandler().getRequirementFactory().create("placeholder-less-than"); + + /** + * Get Requirements matching ID. + * + * @param name The ID to search for. + * @return The matching Requirements. + */ + public static Requirement getByID(@NotNull final String name) { + return Eco.getHandler().getRequirementFactory().create(name); + } +} diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/EcoRequirementFactory.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/EcoRequirementFactory.kt new file mode 100644 index 00000000..06a16682 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/EcoRequirementFactory.kt @@ -0,0 +1,17 @@ +package com.willfp.eco.internal.requirement + +import com.willfp.eco.core.requirement.Requirement +import com.willfp.eco.core.requirement.RequirementFactory +import com.willfp.eco.internal.requirement.requirements.* + +class EcoRequirementFactory: RequirementFactory { + override fun create(name: String): Requirement { + return when (name.lowercase()) { + "has-permission" -> RequirementHasPermission() + "placeholder-equals" -> RequirementPlaceholderEquals() + "placeholder-greater-than" -> RequirementPlaceholderGreaterThan() + "placeholder-less-than" -> RequirementPlaceholderLessThan() + else -> RequirementTrue() + } + } +} \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementHasPermission.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementHasPermission.kt new file mode 100644 index 00000000..ba5fd7cc --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementHasPermission.kt @@ -0,0 +1,18 @@ +package com.willfp.eco.internal.requirement.requirements + +import com.willfp.eco.core.requirement.Requirement +import org.bukkit.entity.Player + +class RequirementHasPermission : Requirement() { + override fun doesPlayerMeet( + player: Player, + args: List + ): Boolean { + if (args.isEmpty()) { + return false + } + + val permission = args[0] + return player.hasPermission(permission) + } +} \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderEquals.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderEquals.kt new file mode 100644 index 00000000..5d024531 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderEquals.kt @@ -0,0 +1,20 @@ +package com.willfp.eco.internal.requirement.requirements + +import com.willfp.eco.core.integrations.placeholder.PlaceholderManager +import com.willfp.eco.core.requirement.Requirement +import org.bukkit.entity.Player + +class RequirementPlaceholderEquals : Requirement() { + override fun doesPlayerMeet( + player: Player, + args: List + ): Boolean { + if (args.size < 2) { + return false + } + + val placeholder = args[0] + val equals = args[1] + return PlaceholderManager.translatePlaceholders(placeholder, player).equals(equals, ignoreCase = true) + } +} \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderGreaterThan.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderGreaterThan.kt new file mode 100644 index 00000000..aff41ed1 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderGreaterThan.kt @@ -0,0 +1,20 @@ +package com.willfp.eco.internal.requirement.requirements + +import com.willfp.eco.core.integrations.placeholder.PlaceholderManager +import com.willfp.eco.core.requirement.Requirement +import org.bukkit.entity.Player + +class RequirementPlaceholderGreaterThan : Requirement() { + override fun doesPlayerMeet( + player: Player, + args: List + ): Boolean { + if (args.size < 2) { + return false + } + + val placeholder = args[0] + val equals = args[1].toDoubleOrNull() ?: return false + return PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0 >= equals + } +} \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderLessThan.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderLessThan.kt new file mode 100644 index 00000000..2ddea848 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementPlaceholderLessThan.kt @@ -0,0 +1,20 @@ +package com.willfp.eco.internal.requirement.requirements + +import com.willfp.eco.core.integrations.placeholder.PlaceholderManager +import com.willfp.eco.core.requirement.Requirement +import org.bukkit.entity.Player + +class RequirementPlaceholderLessThan : Requirement() { + override fun doesPlayerMeet( + player: Player, + args: List + ): Boolean { + if (args.size < 2) { + return false + } + + val placeholder = args[0] + val equals = args[1].toDoubleOrNull() ?: return false + return PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0 < equals + } +} \ No newline at end of file diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementTrue.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementTrue.kt new file mode 100644 index 00000000..0fb31990 --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/requirement/requirements/RequirementTrue.kt @@ -0,0 +1,13 @@ +package com.willfp.eco.internal.requirement.requirements + +import com.willfp.eco.core.requirement.Requirement +import org.bukkit.entity.Player + +class RequirementTrue : Requirement() { + override fun doesPlayerMeet( + player: Player, + args: List + ): Boolean { + return true + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/EcoHandler.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/EcoHandler.kt index e3e09bfd..a3ed6851 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/EcoHandler.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/EcoHandler.kt @@ -15,6 +15,7 @@ import com.willfp.eco.core.gui.GUIFactory import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration import com.willfp.eco.core.proxy.Cleaner import com.willfp.eco.core.proxy.ProxyFactory +import com.willfp.eco.core.requirement.RequirementFactory import com.willfp.eco.core.scheduling.Scheduler import com.willfp.eco.internal.EcoCleaner import com.willfp.eco.internal.Plugins @@ -30,6 +31,7 @@ import com.willfp.eco.internal.gui.EcoGUIFactory import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI import com.willfp.eco.internal.logging.EcoLogger import com.willfp.eco.internal.proxy.EcoProxyFactory +import com.willfp.eco.internal.requirement.EcoRequirementFactory import com.willfp.eco.internal.scheduling.EcoScheduler import com.willfp.eco.proxy.FastItemStackFactoryProxy import com.willfp.eco.spigot.integrations.bstats.MetricHandler @@ -39,6 +41,7 @@ import java.util.logging.Logger @Suppress("UNUSED") class EcoHandler : EcoSpigotPlugin(), Handler { private val cleaner = EcoCleaner() + private val requirementFactory = EcoRequirementFactory() override fun createScheduler(plugin: EcoPlugin): Scheduler { return EcoScheduler(plugin) @@ -119,4 +122,8 @@ class EcoHandler : EcoSpigotPlugin(), Handler { override fun registerBStats(plugin: EcoPlugin) { MetricHandler.createMetrics(plugin, this.ecoPlugin) } + + override fun getRequirementFactory(): RequirementFactory { + return requirementFactory + } } \ No newline at end of file