diff --git a/build.gradle.kts b/build.gradle.kts index 2bd6aca22..83717d598 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -89,6 +89,9 @@ allprojects { // IridiumSkyblock maven("https://nexus.iridiumdevelopment.net/repository/maven-releases/") + + // HuskPlugins + maven("https://repo.william278.net/releases") } dependencies { diff --git a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ConfigSlot.java b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ConfigSlot.java index f73734d6a..b7fa54377 100644 --- a/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ConfigSlot.java +++ b/eco-api/src/main/java/com/willfp/eco/core/gui/slot/ConfigSlot.java @@ -86,7 +86,7 @@ private SlotHandler dispatchCommandHandler(@NotNull final String configKey) { for (String command : config.getStrings(configKey)) { if (command.startsWith("console:")) { commands.add(new CommandToDispatch( - StringUtils.removePrefix("console:", command), + StringUtils.removePrefix(command, "console:"), true )); } else { @@ -127,12 +127,16 @@ private record CommandToDispatch( * @param player The player. */ void dispatch(@NotNull final Player player) { + System.out.println("DISPATCHING " + command); + if (console()) { + System.out.println("CONSOLE"); Bukkit.dispatchCommand( Bukkit.getConsoleSender(), command().replace("%player%", player.getName()) ); } else { + System.out.println("NON-CONSOLE"); Bukkit.dispatchCommand( player, command().replace("%player%", player.getName()) diff --git a/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java b/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java index 1eccedba1..0ebf005d7 100644 --- a/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java +++ b/eco-api/src/main/java/com/willfp/eco/util/PatternUtils.java @@ -2,6 +2,7 @@ import com.github.benmanes.caffeine.cache.Cache; import com.github.benmanes.caffeine.cache.Caffeine; +import com.willfp.eco.core.Eco; import org.jetbrains.annotations.NotNull; import java.util.concurrent.TimeUnit; @@ -15,7 +16,7 @@ public final class PatternUtils { * Cache of compiled literal patterns. */ private static final Cache LITERAL_PATTERN_CACHE = Caffeine.newBuilder() - .expireAfterAccess(1, TimeUnit.MINUTES) + .expireAfterAccess(Eco.get().getEcoPlugin().getConfigYml().getInt(""), TimeUnit.MINUTES) .build(); /** diff --git a/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/items/ArgParserEntity.kt b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/items/ArgParserEntity.kt new file mode 100644 index 000000000..05387c11b --- /dev/null +++ b/eco-core/core-backend/src/main/kotlin/com/willfp/eco/internal/items/ArgParserEntity.kt @@ -0,0 +1,64 @@ +package com.willfp.eco.internal.items + +import com.willfp.eco.core.items.args.LookupArgParser +import org.bukkit.block.CreatureSpawner +import org.bukkit.entity.EntityType +import org.bukkit.inventory.ItemStack +import org.bukkit.inventory.meta.BlockStateMeta +import org.bukkit.inventory.meta.ItemMeta +import java.util.function.Predicate + +object ArgParserEntity : LookupArgParser { + override fun parseArguments(args: Array, meta: ItemMeta): Predicate? { + if (meta !is BlockStateMeta) { + return null + } + + if (meta.hasBlockState() || meta.blockState !is CreatureSpawner) { + return null + } + + val state = meta.blockState as CreatureSpawner + + var type: String? = null + + for (arg in args) { + val argSplit = arg.split(":") + if (!argSplit[0].equals("entity", ignoreCase = true)) { + continue + } + if (argSplit.size < 2) { + continue + } + type = argSplit[1] + } + + type ?: return null + + val entityType = runCatching { EntityType.valueOf(type.uppercase()) }.getOrNull() ?: return null + + state.spawnedType = entityType + + meta.blockState = state + + return Predicate { + val testMeta = ((it.itemMeta as? BlockStateMeta) as? CreatureSpawner) ?: return@Predicate false + + testMeta.spawnedType?.name?.equals(type, true) == true + } + } + + override fun serializeBack(meta: ItemMeta): String? { + if (meta !is BlockStateMeta) { + return null + } + + if (meta.hasBlockState() || meta.blockState !is CreatureSpawner) { + return null + } + + val state = meta.blockState as CreatureSpawner + + return state.spawnedType?.let { "entity:${state.spawnedType!!.name}" } ?: return null + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/build.gradle.kts b/eco-core/core-plugin/build.gradle.kts index 827c788bb..66e7bc1b8 100644 --- a/eco-core/core-plugin/build.gradle.kts +++ b/eco-core/core-plugin/build.gradle.kts @@ -62,6 +62,9 @@ dependencies { exclude(group = "*", module = "*") } compileOnly("com.iridium:IridiumSkyblock:4.0.8") + compileOnly("net.william278.huskclaims:huskclaims-bukkit:1.0.1") + compileOnly("net.william278:husktowns:2.6.1") + compileOnly("com.github.jojodmo:ItemBridge:b0054538c1") compileOnly(fileTree("../../lib") { include("*.jar") diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt index 9b5c1753f..fc215bf3a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/EcoSpigotPlugin.kt @@ -22,34 +22,8 @@ import com.willfp.eco.core.particle.Particles import com.willfp.eco.core.price.Prices import com.willfp.eco.internal.data.MavenVersionToStringAdapter import com.willfp.eco.internal.data.VersionToStringAdapter -import com.willfp.eco.internal.entities.EntityArgParserAdult -import com.willfp.eco.internal.entities.EntityArgParserAttackDamage -import com.willfp.eco.internal.entities.EntityArgParserAttackSpeed -import com.willfp.eco.internal.entities.EntityArgParserBaby -import com.willfp.eco.internal.entities.EntityArgParserCharged -import com.willfp.eco.internal.entities.EntityArgParserEquipment -import com.willfp.eco.internal.entities.EntityArgParserExplosionRadius -import com.willfp.eco.internal.entities.EntityArgParserFlySpeed -import com.willfp.eco.internal.entities.EntityArgParserFollowRange -import com.willfp.eco.internal.entities.EntityArgParserHealth -import com.willfp.eco.internal.entities.EntityArgParserJumpStrength -import com.willfp.eco.internal.entities.EntityArgParserKnockback -import com.willfp.eco.internal.entities.EntityArgParserKnockbackResistance -import com.willfp.eco.internal.entities.EntityArgParserName -import com.willfp.eco.internal.entities.EntityArgParserNoAI -import com.willfp.eco.internal.entities.EntityArgParserSilent -import com.willfp.eco.internal.entities.EntityArgParserSize -import com.willfp.eco.internal.entities.EntityArgParserSpawnReinforcements -import com.willfp.eco.internal.entities.EntityArgParserSpeed -import com.willfp.eco.internal.items.ArgParserColor -import com.willfp.eco.internal.items.ArgParserCustomModelData -import com.willfp.eco.internal.items.ArgParserEnchantment -import com.willfp.eco.internal.items.ArgParserFlag -import com.willfp.eco.internal.items.ArgParserHead -import com.willfp.eco.internal.items.ArgParserName -import com.willfp.eco.internal.items.ArgParserTexture -import com.willfp.eco.internal.items.ArgParserTrim -import com.willfp.eco.internal.items.ArgParserUnbreakable +import com.willfp.eco.internal.entities.* +import com.willfp.eco.internal.items.* import com.willfp.eco.internal.lookup.SegmentParserGroup import com.willfp.eco.internal.lookup.SegmentParserUseIfPresent import com.willfp.eco.internal.particle.ParticleFactoryRGB @@ -69,37 +43,10 @@ import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener import com.willfp.eco.internal.spigot.gui.GUIListener import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationCMI import com.willfp.eco.internal.spigot.integrations.afk.AFKIntegrationEssentials -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAAC -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatAlice -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatMatrix -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatNCP -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatSpartan -import com.willfp.eco.internal.spigot.integrations.anticheat.AnticheatVulcan -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefBentoBox -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV10 -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCombatLogXV11 -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefCrashClaim -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefDeluxeCombat -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFabledSkyBlock -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefFactionsUUID -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefGriefPrevention -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefIridiumSkyblock -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefKingdoms -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefLands -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefPvPManager -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefRPGHorses -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefSuperiorSkyblock2 -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefTowny -import com.willfp.eco.internal.spigot.integrations.antigrief.AntigriefWorldGuard +import com.willfp.eco.internal.spigot.integrations.anticheat.* +import com.willfp.eco.internal.spigot.integrations.antigrief.* import com.willfp.eco.internal.spigot.integrations.customentities.CustomEntitiesMythicMobs -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsCustomCrafting -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsDenizen -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsExecutableItems -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsHeadDatabase -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsAdder -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsMythicMobs -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen -import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsScyther +import com.willfp.eco.internal.spigot.integrations.customitems.* import com.willfp.eco.internal.spigot.integrations.customrecipes.CustomRecipeCustomCrafting import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault import com.willfp.eco.internal.spigot.integrations.entitylookup.EntityLookupModelEngine @@ -149,6 +96,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { Items.registerArgParser(ArgParserUnbreakable) Items.registerArgParser(ArgParserName) Items.registerArgParser(ArgParserHead) + Items.registerArgParser(ArgParserEntity) if (Prerequisite.HAS_1_20.isMet) { Items.registerArgParser(ArgParserTrim) } @@ -296,6 +244,8 @@ abstract class EcoSpigotPlugin : EcoPlugin() { IntegrationLoader("Kingdoms") { AntigriefManager.register(AntigriefKingdoms()) }, IntegrationLoader("RPGHorses") { AntigriefManager.register(AntigriefRPGHorses()) }, IntegrationLoader("CrashClaim") { AntigriefManager.register(AntigriefCrashClaim()) }, + IntegrationLoader("HuskTowns") { AntigriefManager.register(AntigriefHuskTowns()) }, + IntegrationLoader("HuskClaims") { AntigriefManager.register(AntigriefHuskClaims()) }, IntegrationLoader("CombatLogX") { val pluginManager = Bukkit.getPluginManager() val combatLogXPlugin = pluginManager.getPlugin("CombatLogX") ?: return@IntegrationLoader @@ -335,6 +285,7 @@ abstract class EcoSpigotPlugin : EcoPlugin() { IntegrationLoader("MythicMobs") { CustomItemsManager.register(CustomItemsMythicMobs(this)) }, IntegrationLoader("Scyther") { CustomItemsManager.register(CustomItemsScyther()) }, IntegrationLoader("Denizen") { CustomItemsManager.register(CustomItemsDenizen()) }, + IntegrationLoader("ItemBridge") { CustomItemsManager.register(CustomItemsItemBridge()) }, // Shop IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) }, diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskClaims.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskClaims.kt new file mode 100644 index 000000000..91ff92114 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskClaims.kt @@ -0,0 +1,135 @@ +package com.willfp.eco.internal.spigot.integrations.antigrief + +import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration +import net.crashcraft.crashclaim.CrashClaim +import net.crashcraft.crashclaim.permissions.PermissionRoute +import net.william278.huskclaims.api.HuskClaimsAPI +import net.william278.huskclaims.libraries.cloplib.operation.Operation +import net.william278.huskclaims.libraries.cloplib.operation.OperationPosition +import net.william278.huskclaims.libraries.cloplib.operation.OperationType +import net.william278.huskclaims.position.Position +import net.william278.huskclaims.position.World +import org.bukkit.Location +import org.bukkit.block.Block +import org.bukkit.entity.LivingEntity +import org.bukkit.entity.Monster +import org.bukkit.entity.Player +import kotlin.jvm.optionals.getOrElse + +class AntigriefHuskClaims : AntigriefIntegration { + override fun canBreakBlock( + player: Player, + block: Block + ): Boolean { + val api = HuskClaimsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player.uniqueId) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + OperationType.BLOCK_BREAK, + Position.at( + block.x.toDouble(), + block.y.toDouble(), + block.z.toDouble(), + api.getWorld(block.location.world.name) + ), + true + ) + ) + } + + override fun canCreateExplosion( + player: Player, + location: Location + ): Boolean { + val api = HuskClaimsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player.uniqueId) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + OperationType.EXPLOSION_DAMAGE_ENTITY, + Position.at( + location.x, + location.y, + location.z, + api.getWorld(location.world.name) + ), + true + ) + ) + } + + override fun canPlaceBlock( + player: Player, + block: Block + ): Boolean { + val api = HuskClaimsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player.uniqueId) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + OperationType.BLOCK_PLACE, + Position.at( + block.x.toDouble(), + block.y.toDouble(), + block.z.toDouble(), + api.getWorld(block.location.world.name) + ), + true + ) + ) + } + + override fun canInjure( + player: Player, + victim: LivingEntity + ): Boolean { + val api = HuskClaimsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player.uniqueId) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + when (victim) { + is Monster -> OperationType.PLAYER_DAMAGE_MONSTER + is Player -> OperationType.PLAYER_DAMAGE_PLAYER + else -> OperationType.PLAYER_DAMAGE_ENTITY + }, + Position.at( + victim.x, + victim.y, + victim.z, + api.getWorld(victim.location.world.name) + ), + true + ) + ) + } + + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + + override fun getPluginName(): String { + return "HuskClaims" + } + + override fun equals(other: Any?): Boolean { + if (other !is AntigriefIntegration) { + return false + } + + return other.pluginName == this.pluginName + } + + override fun hashCode(): Int { + return this.pluginName.hashCode() + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskTowns.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskTowns.kt new file mode 100644 index 000000000..d94456fd6 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/antigrief/AntigriefHuskTowns.kt @@ -0,0 +1,129 @@ +package com.willfp.eco.internal.spigot.integrations.antigrief + +import com.willfp.eco.core.integrations.antigrief.AntigriefIntegration +import net.william278.husktowns.api.HuskTownsAPI +import net.william278.husktowns.claim.Position +import net.william278.husktowns.listener.Operation +import org.bukkit.Location +import org.bukkit.block.Block +import org.bukkit.entity.LivingEntity +import org.bukkit.entity.Monster +import org.bukkit.entity.Player + +class AntigriefHuskTowns : AntigriefIntegration { + override fun canBreakBlock( + player: Player, + block: Block + ): Boolean { + val api = HuskTownsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + Operation.Type.BLOCK_BREAK, + Position.at( + block.location.x, + block.location.y, + block.location.z, + api.getWorld(block.world) + ), + true + ) + ) + } + + override fun canCreateExplosion( + player: Player, + location: Location + ): Boolean { + val api = HuskTownsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + Operation.Type.EXPLOSION_DAMAGE_ENTITY, + Position.at( + location.x, + location.y, + location.z, + api.getWorld(location.world) + ), + true + ) + ) + } + + override fun canPlaceBlock( + player: Player, + block: Block + ): Boolean { + val api = HuskTownsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + Operation.Type.BLOCK_PLACE, + Position.at( + block.location.x, + block.location.y, + block.location.z, + api.getWorld(block.world) + ), + true + ) + ) + } + + override fun canInjure( + player: Player, + victim: LivingEntity + ): Boolean { + val api = HuskTownsAPI.getInstance() ?: return true + + val user = api.getOnlineUser(player) ?: return true + + return api.isOperationAllowed( + Operation.of( + user, + when(victim) { + is Monster -> Operation.Type.PLAYER_DAMAGE_MONSTER + is Player -> Operation.Type.PLAYER_DAMAGE_PLAYER + else -> Operation.Type.PLACE_HANGING_ENTITY + }, + Position.at( + player.location.x, + player.location.y, + player.location.z, + api.getWorld(player.world) + ), + true + ) + ) + } + + override fun canPickupItem(player: Player, location: Location): Boolean { + return true + } + + override fun getPluginName(): String { + return "HuskTowns" + } + + override fun equals(other: Any?): Boolean { + if (other !is AntigriefIntegration) { + return false + } + + return other.pluginName == this.pluginName + } + + override fun hashCode(): Int { + return this.pluginName.hashCode() + } +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsItemBridge.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsItemBridge.kt new file mode 100644 index 000000000..f34d42073 --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/integrations/customitems/CustomItemsItemBridge.kt @@ -0,0 +1,47 @@ +package com.willfp.eco.internal.spigot.integrations.customitems + +import com.jojodmo.itembridge.ItemBridge +import com.willfp.eco.core.integrations.customitems.CustomItemsIntegration +import com.willfp.eco.core.items.CustomItem +import com.willfp.eco.core.items.Items +import com.willfp.eco.core.items.TestableItem +import com.willfp.eco.core.items.provider.ItemProvider +import com.willfp.eco.util.namespacedKeyOf +import org.bukkit.inventory.ItemStack + +class CustomItemsItemBridge : CustomItemsIntegration { + override fun registerProvider() { + Items.registerItemProvider(ItemBridgeProvider()) + } + + override fun getPluginName(): String { + return "ItemBridge" + } + + private class ItemBridgeProvider : ItemProvider("itembridge") { + override fun provideForKey(key: String): TestableItem? { + + val split = key.split(":").toMutableList() + + if (split.size < 2) { + return null + } + + val itemKey = split[0] + + val item = split[1] + + val stack = ItemBridge.getItemStack(itemKey, item) ?: kotlin.run { + return null + } + + return CustomItem( + namespacedKeyOf("eco:${key.lowercase().replace(":", "__")}"), + { test: ItemStack -> + ItemBridge.isItemStack(test, itemKey, item) + }, + stack + ) + } + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/math/ExpressionHandlers.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/math/ExpressionHandlers.kt index 6021f0e08..9c8dc5493 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/math/ExpressionHandlers.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/eco/internal/spigot/math/ExpressionHandlers.kt @@ -5,6 +5,7 @@ import com.github.benmanes.caffeine.cache.Caffeine import com.willfp.eco.core.integrations.placeholder.PlaceholderManager import com.willfp.eco.core.placeholder.context.PlaceholderContext import com.willfp.eco.internal.placeholder.PlaceholderParser +import com.willfp.eco.util.randDouble import redempt.crunch.CompiledExpression import redempt.crunch.Crunch import redempt.crunch.functional.EvaluationEnvironment @@ -22,6 +23,10 @@ private val max = Function("max", 2) { max(it[0], it[1]) } +private val rand = Function("random", 2) { + randDouble(it[0], it[1]) +} + interface ExpressionHandler { fun evaluate(expression: String, context: PlaceholderContext): Double? } @@ -77,7 +82,7 @@ class ImmediatePlaceholderTranslationExpressionHandler( .build() private val env = EvaluationEnvironment().apply { - addFunctions(min, max) + addFunctions(min, max, rand) } override fun evaluate(expression: String, context: PlaceholderContext): Double? { @@ -106,7 +111,7 @@ class LazyPlaceholderTranslationExpressionHandler( val compiled = cache.getOrPut(expression) { val env = EvaluationEnvironment() env.setVariableNames(*placeholders.toTypedArray()) - env.addFunctions(min, max) + env.addFunctions(rand, min, max) runCatching { Crunch.compileExpression(expression, env) }.getOrNull() } diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml index dc1f4ecb0..43ac96939 100644 --- a/eco-core/core-plugin/src/main/resources/config.yml +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -96,6 +96,11 @@ use-immediate-placeholder-translation-for-math: false # less reactive values. math-cache-ttl: 200 +# The time (in minutes) for literal patterns to be cached for. Higher values will lead to +# faster evaluation times (less CPU usage) at the expense of slightly more memory usage and +# less reactive values. (Do not change unless you are told to). +literal-cache-ttl: 1 + # If anonymous usage statistics should be tracked. This is very valuable information as it # helps understand how eco and other plugins are being used by logging player and server # counts. This is completely anonymous and no personal information is logged. This data diff --git a/eco-core/core-plugin/src/main/resources/plugin.yml b/eco-core/core-plugin/src/main/resources/plugin.yml index 6729b1f31..9791b46a1 100644 --- a/eco-core/core-plugin/src/main/resources/plugin.yml +++ b/eco-core/core-plugin/src/main/resources/plugin.yml @@ -18,6 +18,10 @@ loadbefore: - SCore - ExecutableItems softdepend: + - ItemBridge + - HuskClaims + - HuskTowns + - Terra - ProtocolLib - WorldGuard - GriefPrevention diff --git a/lib/fabledskyblock3.jar b/lib/fabledskyblock3.jar new file mode 100644 index 000000000..211c555f4 Binary files /dev/null and b/lib/fabledskyblock3.jar differ