diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/EffectDataFixer.kt b/core/common/src/main/kotlin/com/willfp/libreforge/EffectDataFixer.kt index 207882c31..a4d14ed2e 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/EffectDataFixer.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/EffectDataFixer.kt @@ -38,7 +38,7 @@ object EffectDataFixer : Listener { dispatcher.updateHolders() - plugin.scheduler.run { + plugin.scheduler.runTask(player) { dispatcher.updateEffects() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/HolderUpdates.kt b/core/common/src/main/kotlin/com/willfp/libreforge/HolderUpdates.kt index d827cb72c..d53b5aadd 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/HolderUpdates.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/HolderUpdates.kt @@ -13,7 +13,7 @@ import org.bukkit.event.player.PlayerDropItemEvent import org.bukkit.event.player.PlayerItemHeldEvent import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerRespawnEvent -import java.util.UUID +import java.util.* import java.util.concurrent.TimeUnit @Suppress("unused", "UNUSED_PARAMETER") @@ -27,6 +27,9 @@ object ItemRefreshListener : Listener { @EventHandler(priority = EventPriority.LOWEST) fun onItemPickup(event: EntityPickupItemEvent) { + val entity = event.entity + val dispatcher = entity.toDispatcher() + if (!plugin.configYml.getBool("refresh.pickup.enabled")) { return } @@ -36,20 +39,26 @@ object ItemRefreshListener : Listener { return } } - - event.entity.toDispatcher().refreshHolders() + dispatcher.refreshHolders() } @EventHandler(priority = EventPriority.LOWEST) fun onPlayerJoin(event: PlayerJoinEvent) { Bukkit.getServer().onlinePlayers.forEach { - it.toDispatcher().refreshHolders() + plugin.scheduler.runTask(it) { + it.toDispatcher().refreshHolders() + } } } @EventHandler(priority = EventPriority.HIGHEST) fun onInventoryDrop(event: PlayerDropItemEvent) { - event.player.toDispatcher().refreshHolders() + val dispatcher = event.player.toDispatcher() + val player = event.player + + plugin.scheduler.runTask(player) { + dispatcher.refreshHolders() + } } @EventHandler(priority = EventPriority.LOWEST) @@ -66,24 +75,35 @@ object ItemRefreshListener : Listener { val dispatcher = player.toDispatcher() - plugin.scheduler.run { + plugin.scheduler.runTask(player) { dispatcher.refreshHolders() } } @EventHandler fun onRespawn(event: PlayerRespawnEvent) { - event.player.toDispatcher().refreshHolders() + val dispatcher = event.player.toDispatcher() + val player = event.player + + plugin.scheduler.runTask(player) { + dispatcher.refreshHolders() + } } @EventHandler fun onArmorChange(event: ArmorChangeEvent) { - event.player.toDispatcher().refreshHolders() + val dispatcher = event.player.toDispatcher() + val player = event.player + + plugin.scheduler.runTask(player) { + dispatcher.refreshHolders() + } } @EventHandler(priority = EventPriority.LOWEST) fun onInventoryClick(event: InventoryClickEvent) { val player = event.whoClicked as? Player ?: return + val dispatcher = player.toDispatcher() if (inventoryClickTimeouts.getIfPresent(player.uniqueId) != null) { return @@ -91,6 +111,9 @@ object ItemRefreshListener : Listener { inventoryClickTimeouts.put(player.uniqueId, Unit) - player.toDispatcher().refreshHolders() + + plugin.scheduler.runTask(player) { + dispatcher.refreshHolders() + } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt index f713adaf3..faae310f8 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/LibreforgeSpigotPlugin.kt @@ -50,12 +50,7 @@ import com.willfp.libreforge.integrations.worldguard.WorldGuardIntegration import com.willfp.libreforge.integrations.xiaomomiplugins.customcrops.CustomCropsIntegration import com.willfp.libreforge.integrations.xiaomomiplugins.customfishing.CustomFishingIntegration import com.willfp.libreforge.levels.LevelTypes -import com.willfp.libreforge.levels.placeholder.ItemDataPlaceholder -import com.willfp.libreforge.levels.placeholder.ItemLevelPlaceholder -import com.willfp.libreforge.levels.placeholder.ItemPointsPlaceholder -import com.willfp.libreforge.levels.placeholder.ItemProgressPlaceholder -import com.willfp.libreforge.levels.placeholder.ItemXPPlaceholder -import com.willfp.libreforge.levels.placeholder.ItemXPRequiredPlaceholder +import com.willfp.libreforge.levels.placeholder.* import com.willfp.libreforge.placeholders.CustomPlaceholders import com.willfp.libreforge.tags.CustomTag import com.willfp.libreforge.triggers.DispatchedTriggerFactory @@ -172,13 +167,17 @@ class LibreforgeSpigotPlugin : EcoPlugin() { dispatchedTriggerFactory.startTicking() // Poll for changes - plugin.scheduler.runTimer(20, 20) { + plugin.scheduler.runTaskTimer(20, 20) { for (player in Bukkit.getOnlinePlayers()) { if (skipAFKPlayers && AFKManager.isAfk(player)) { continue } - player.toDispatcher().refreshHolders() + val runnable = Runnable { player.toDispatcher().refreshHolders() } + if (Prerequisite.HAS_FOLIA.isMet) // folia issue: refresh player holder in their own thread + plugin.scheduler.runTask(player, runnable) + else + runnable.run() } } @@ -189,10 +188,18 @@ class LibreforgeSpigotPlugin : EcoPlugin() { */ var currentOffset = 30L for (world in Bukkit.getWorlds()) { - plugin.scheduler.runTimer(currentOffset, configYml.getInt("refresh.entities.interval").toLong()) { + plugin.scheduler.runTaskTimer(currentOffset, configYml.getInt("refresh.entities.interval").toLong()) { for (entity in world.entities) { - if (entity is LivingEntity) { - entity.toDispatcher().refreshHolders() + val runnable = Runnable { + if (entity is LivingEntity) { + entity.toDispatcher().refreshHolders() + } + } + if (Prerequisite.HAS_FOLIA.isMet) { // folia issue + if (entity.isValid) + plugin.scheduler.runTask(entity, runnable) + } else { + runnable.run() } } } @@ -201,7 +208,7 @@ class LibreforgeSpigotPlugin : EcoPlugin() { } // Poll for changes in global holders - this.scheduler.runTimer(25, 20) { + this.scheduler.runTaskTimer(25, 20) { GlobalDispatcher.refreshHolders() } } @@ -249,7 +256,7 @@ class LibreforgeSpigotPlugin : EcoPlugin() { IntegrationLoader("EdPrison") { EdPrisonCoreIntegration.load(this) }, IntegrationLoader("MythicMobs") { MythicMobsIntegration.load(this) }, IntegrationLoader("Nexo") { NexoIntegration.load(this) }, - IntegrationLoader("Oraxen") { OraxenIntegration.load(this)} + IntegrationLoader("Oraxen") { OraxenIntegration.load(this) } ) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/Utils.kt b/core/common/src/main/kotlin/com/willfp/libreforge/Utils.kt index ec0447552..800a3b439 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/Utils.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/Utils.kt @@ -2,12 +2,7 @@ package com.willfp.libreforge import com.willfp.eco.core.items.Items import com.willfp.eco.util.namespacedKeyOf -import org.bukkit.Bukkit -import org.bukkit.Location -import org.bukkit.Material -import org.bukkit.NamespacedKey -import org.bukkit.Sound -import org.bukkit.SoundCategory +import org.bukkit.* import org.bukkit.block.Block import org.bukkit.enchantments.Enchantment import org.bukkit.entity.Player @@ -68,21 +63,44 @@ fun Collection.filterNotEmpty() = internal val ItemStack?.isEcoEmpty: Boolean get() = Items.isEmpty(this) +@Suppress("DEPRECATION") +@Deprecated("Use applyDamage with the removeItem function") fun ItemStack.applyDamage(damage: Int, player: Player?): Boolean { + return this.applyDamage(damage, player) { this.type = Material.AIR } +} + +fun ItemStack.applyDamage(damage: Int, player: Player?, removeItem: Runnable): Boolean { val meta = this.itemMeta as? Damageable ?: return false - meta.damage += damage + // don't apply damage to unbreakable + if (meta.isUnbreakable) return false + + val unbreaking = meta.getEnchantLevel(Enchantment.UNBREAKING) + + // Calculate actual damage considering unbreaking + // Each damage point has a chance to be negated + var actualDamage = damage + if (unbreaking > 0) { + var damageNegated = 0 + repeat(damage) { + // Chance to negate this damage point: (unbreakingLevel) / (unbreakingLevel + 1) + if (Math.random() < (unbreaking.toDouble() / (unbreaking + 1))) + damageNegated++ + } + actualDamage = damage - damageNegated + } + + meta.damage += actualDamage if (meta.damage >= this.type.maxDurability) { meta.damage = this.type.maxDurability.toInt() + this.itemMeta = meta if (player != null) { Bukkit.getPluginManager().callEvent(PlayerItemBreakEvent(player, this)) player.playSound(player.location, Sound.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, 1f, 1f) } - @Suppress("DEPRECATION") - this.type = Material.AIR + removeItem.run() } else { this.itemMeta = meta } - return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/commands/CommandReload.kt b/core/common/src/main/kotlin/com/willfp/libreforge/commands/CommandReload.kt index 4abe0042c..d8f961f96 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/commands/CommandReload.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/commands/CommandReload.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.commands +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.command.impl.Subcommand import com.willfp.eco.util.StringUtils import com.willfp.eco.util.toNiceString @@ -13,9 +14,15 @@ internal object CommandReload : Subcommand( false ) { override fun onExecute(sender: CommandSender, args: List) { - sender.sendMessage( - plugin.langYml.getMessage("reloaded", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) - .replace("%time%", plugin.reloadWithTime(false).toNiceString()) - ) + val runnable = Runnable { + sender.sendMessage( + plugin.langYml.getMessage("reloaded", StringUtils.FormatOption.WITHOUT_PLACEHOLDERS) + .replace("%time%", plugin.reloadWithTime(false).toNiceString()) + ) + } + if (Prerequisite.HAS_FOLIA.isMet) + plugin.scheduler.runTask(runnable) // run on global thread + else + runnable.run() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/conditions/impl/ConditionIsStorm.kt b/core/common/src/main/kotlin/com/willfp/libreforge/conditions/impl/ConditionIsStorm.kt index a2cf9b165..87b355d0f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/conditions/impl/ConditionIsStorm.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/conditions/impl/ConditionIsStorm.kt @@ -1,17 +1,13 @@ package com.willfp.libreforge.conditions.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.* import com.willfp.libreforge.conditions.Condition -import com.willfp.libreforge.toDispatcher -import com.willfp.libreforge.updateEffects import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.weather.WeatherChangeEvent -object ConditionIsStorm: Condition("is_storm") { +object ConditionIsStorm : Condition("is_storm") { override fun isMet( dispatcher: Dispatcher<*>, config: Config, @@ -25,7 +21,9 @@ object ConditionIsStorm: Condition("is_storm") { @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) fun handle(event: WeatherChangeEvent) { for (entity in event.world.entities) { - entity.toDispatcher().updateEffects() + plugin.scheduler.runTask(entity) { + entity.toDispatcher().updateEffects() + } } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/ElementLike.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/ElementLike.kt index 90555427e..953b3f081 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/ElementLike.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/ElementLike.kt @@ -2,16 +2,11 @@ package com.willfp.libreforge.effects import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.core.placeholder.InjectablePlaceholder -import com.willfp.libreforge.ConfigurableElement -import com.willfp.libreforge.DynamicNumericValue -import com.willfp.libreforge.NamedValue +import com.willfp.libreforge.* import com.willfp.libreforge.conditions.ConditionList import com.willfp.libreforge.effects.arguments.EffectArgumentList import com.willfp.libreforge.filters.FilterList -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression import com.willfp.libreforge.mutators.MutatorList -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.DispatchedTrigger /** @@ -165,14 +160,22 @@ abstract class ElementLike : ConfigurableElement { } else { // Delay between each repeat. var repeats = 0 - plugin.runnableFactory.create { task -> + val task = plugin.runnableFactory.create { task -> repeats++ trigger() if (repeats >= repeatTimes) { - task.cancel() + task.cancelTask() } - }.runTaskTimer(delay, delay) + } + // folia issue, run the task based on whom the trigger is for + if (data.player != null) { + task.runTaskTimer(data.player, delay, delay) + } else if (data.victim != null) { + task.runTaskTimer(data.victim, delay, delay) + } else { + task.runTaskTimer(delay, delay) + } } // Code here is fucking disgusting duplicating the delay check. diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolder.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolder.kt index 45b0a4fb6..230c23646 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolder.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolder.kt @@ -2,24 +2,16 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.map.listMap -import com.willfp.libreforge.Holder -import com.willfp.libreforge.HolderTemplate -import com.willfp.libreforge.SimpleProvidedHolder -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Effects -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.nest -import com.willfp.libreforge.plugin -import com.willfp.libreforge.registerGenericHolderProvider import com.willfp.libreforge.triggers.TriggerData import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDeathEvent import org.bukkit.event.player.PlayerQuitEvent -import java.util.UUID +import java.util.* object EffectAddHolder : Effect("add_holder") { override val isPermanent = false @@ -44,7 +36,7 @@ object EffectAddHolder : Effect("add_holder") { holders[dispatcher.uuid].add(holder) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(duration.toLong()) { holders[dispatcher.uuid].remove(holder) if (holders[dispatcher.uuid].isEmpty()) { holders.remove(dispatcher.uuid) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderInRadius.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderInRadius.kt index 827d07061..b20ad5c4f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderInRadius.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderInRadius.kt @@ -2,24 +2,13 @@ package com.willfp.libreforge.effects.impl import com.github.benmanes.caffeine.cache.Caffeine import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.Holder -import com.willfp.libreforge.HolderTemplate -import com.willfp.libreforge.SimpleProvidedHolder -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Effects -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.nest -import com.willfp.libreforge.plugin -import com.willfp.libreforge.registerGenericHolderProvider import com.willfp.libreforge.triggers.TriggerData import org.bukkit.Location -import java.util.Objects -import java.util.UUID +import java.util.* import java.util.concurrent.TimeUnit object EffectAddHolderInRadius : Effect("add_holder_in_radius") { @@ -65,7 +54,7 @@ object EffectAddHolderInRadius : Effect("add_holder_in_radius") ) holders += holder - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(duration.toLong()) { holders -= holder } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderToVictim.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderToVictim.kt index 72e385622..1a990f62f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderToVictim.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAddHolderToVictim.kt @@ -2,25 +2,17 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.map.listMap -import com.willfp.libreforge.Holder -import com.willfp.libreforge.HolderTemplate -import com.willfp.libreforge.SimpleProvidedHolder -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Effects -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.nest -import com.willfp.libreforge.plugin -import com.willfp.libreforge.registerGenericHolderProvider import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.entity.EntityDeathEvent import org.bukkit.event.player.PlayerQuitEvent -import java.util.UUID +import java.util.* object EffectAddHolderToVictim : Effect("add_holder_to_victim") { override val parameters = setOf( @@ -46,7 +38,7 @@ object EffectAddHolderToVictim : Effect("add_holder_to_victim") holders[player.uniqueId].add(holder) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(player, duration.toLong()) { holders[player.uniqueId].remove(holder) if (holders[player.uniqueId].isEmpty()) { holders.remove(player.uniqueId) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAnimation.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAnimation.kt index ee0e4a879..9a348ed79 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAnimation.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectAnimation.kt @@ -53,11 +53,11 @@ object EffectAnimation : Effect?>("animation") { data, animationData ) - it.cancel() + it.cancelTask() } tick++ - }.runTaskTimer(0, 1) + }.runTaskTimer(location, 0, 1) } playAnimation(compileData) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBleed.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBleed.kt index 2b05f2a40..c576addae 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBleed.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBleed.kt @@ -2,12 +2,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import com.willfp.libreforge.triggers.impl.TriggerKill @@ -54,9 +50,9 @@ object EffectBleed : Effect("bleed") { victim.damage(damage) if (current >= amount || killed) { - it.cancel() + it.cancelTask() } - }.runTaskTimer(interval.toLong(), interval.toLong()) + }.runTaskTimer(victim, interval.toLong(), interval.toLong()) return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBrewTimeMultiplier.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBrewTimeMultiplier.kt index 4fba6d90c..6be7dd63f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBrewTimeMultiplier.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectBrewTimeMultiplier.kt @@ -23,7 +23,7 @@ object EffectBrewTimeMultiplier : MultiplierEffect("brew_time_multiplier") { // 2 seconds later to allow for the brewing stand to update, I guess. // This is from old EcoSkills code - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { val stand = player.openInventory.topInventory.holder if (stand is BrewingStand) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectClearInvulnerability.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectClearInvulnerability.kt index 57bea3289..22ddd6065 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectClearInvulnerability.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectClearInvulnerability.kt @@ -15,7 +15,7 @@ object EffectClearInvulnerability : Effect("clear_invulnerability override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val victim = data.victim ?: return false - plugin.scheduler.run { + plugin.scheduler.runTask(victim) { victim.noDamageTicks = 0 } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateExplosion.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateExplosion.kt index c798ad491..a4e5a9b15 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateExplosion.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateExplosion.kt @@ -1,12 +1,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.event.Listener @@ -34,10 +30,10 @@ object EffectCreateExplosion : Effect("create_explosion"), Listen val breakBlocks = config.getBoolOrNull("break_blocks") ?: true for (i in 1..amount) { - plugin.scheduler.runLater(i.toLong()) { + plugin.scheduler.runTaskLater(location, i.toLong()) { world.createExplosion(location, power.toFloat(), fire, breakBlocks, source) - } } + } return true } } \ No newline at end of file diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateHologram.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateHologram.kt index 8363379a4..b2bb4f948 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateHologram.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectCreateHologram.kt @@ -2,12 +2,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.hologram.HologramManager -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getFormattedStrings -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter @@ -29,7 +25,7 @@ object EffectCreateHologram : Effect("create_hologram") { val hologram = HologramManager.createHologram(location, text) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(location, duration.toLong()) { hologram.remove() } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageArmor.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageArmor.kt index 361623a60..d30855dc9 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageArmor.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageArmor.kt @@ -1,22 +1,15 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.enumValueOfOrNull -import com.willfp.libreforge.getIntFromExpression import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.Bukkit import org.bukkit.Material -import org.bukkit.Sound -import org.bukkit.SoundCategory import org.bukkit.entity.Player -import org.bukkit.event.player.PlayerItemBreakEvent import org.bukkit.event.player.PlayerItemDamageEvent import org.bukkit.inventory.EquipmentSlot -import org.bukkit.inventory.ItemStack import org.bukkit.inventory.meta.Damageable @@ -29,6 +22,7 @@ object EffectDamageArmor : Effect("damage_armor") { require("damage", "You must specify the amount of damage!") } + @Suppress("DEPRECATION") override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val victim = data.victim ?: return false @@ -67,10 +61,10 @@ object EffectDamageArmor : Effect("damage_armor") { val event = PlayerItemDamageEvent(victim, item, damage) Bukkit.getPluginManager().callEvent(event) if (!event.isCancelled) { - applyDamage(item, event.damage, victim) + item.applyDamage(event.damage, victim) } } else { - applyDamage(item, damage, null) + item.applyDamage(damage, null) } } } else { @@ -83,10 +77,10 @@ object EffectDamageArmor : Effect("damage_armor") { val event = PlayerItemDamageEvent(victim, item, damage) Bukkit.getPluginManager().callEvent(event) if (!event.isCancelled) { - applyDamage(item, event.damage, victim) + item.applyDamage(event.damage, victim) } } else { - applyDamage(item, damage, null) + item.applyDamage(damage, null) } } } @@ -94,26 +88,4 @@ object EffectDamageArmor : Effect("damage_armor") { return true } - - private fun applyDamage(itemStack: ItemStack, amount: Int, player: Player?) { - val meta = itemStack.itemMeta as? Damageable ?: return - - meta.damage += amount - - if (meta.damage >= itemStack.type.maxDurability) { - meta.damage = itemStack.type.maxDurability.toInt() - - itemStack.itemMeta = meta - - if (player != null) { - Bukkit.getPluginManager().callEvent(PlayerItemBreakEvent(player, itemStack)) - player.playSound(player.location, Sound.ENTITY_ITEM_BREAK, SoundCategory.BLOCKS, 1f, 1f) - } - - @Suppress("DEPRECATION") - itemStack.type = Material.AIR - } else { - itemStack.itemMeta = meta - } - } } \ No newline at end of file diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageNearbyEntities.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageNearbyEntities.kt index 28f0e6c03..a84e6e074 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageNearbyEntities.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageNearbyEntities.kt @@ -12,7 +12,7 @@ import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.entity.LivingEntity -import java.util.UUID +import java.util.* object EffectDamageNearbyEntities : Effect>("damage_nearby_entities") { private val damagedEntities = mutableSetOf() @@ -57,7 +57,7 @@ object EffectDamageNearbyEntities : Effect>("damage_n } entity.setMetadata("ignore-nearby-damage", plugin.metadataValueFactory.create(true)) - plugin.scheduler.runLater(5) { entity.removeMetadata("ignore-nearby-damage", plugin) } + plugin.scheduler.runTaskLater(entity, 5) { entity.removeMetadata("ignore-nearby-damage", plugin) } if (!damageSelf && (entity == player)) { continue diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageTwice.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageTwice.kt index b0c51459d..2756d0d44 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageTwice.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDamageTwice.kt @@ -27,7 +27,7 @@ object EffectDamageTwice : Effect("damage_twice") { return false } - plugin.scheduler.run { + plugin.scheduler.runTask(victim) { victim.setMetadata(META_KEY, plugin.createMetadataValue(true)) victim.noDamageTicks = 0 victim.damage(event.damage, event.damager) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeLapisChance.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeLapisChance.kt index 534df5d40..2b102b1a3 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeLapisChance.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeLapisChance.kt @@ -20,7 +20,7 @@ object EffectDontConsumeLapisChance : ChanceMultiplierEffect("dont_consume_lapis } // 2 Ticks because that's what I did in EcoSkills! - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { event.inventory.addItem(ItemStack(Material.LAPIS_LAZULI, cost)) } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeXpChance.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeXpChance.kt index 6daa524f3..7ac212bc3 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeXpChance.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDontConsumeXpChance.kt @@ -18,7 +18,7 @@ object EffectDontConsumeXpChance : ChanceMultiplierEffect("dont_consume_xp_chanc } // 2 Ticks because that's what I did in EcoSkills! - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { player.giveExpLevels(cost) } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDrill.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDrill.kt index 406890bc5..630e0b54a 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDrill.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDrill.kt @@ -1,15 +1,16 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.blocks.Blocks import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.util.VectorUtils -import com.willfp.eco.util.containsIgnoreCase import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.templates.MineBlockEffect import com.willfp.libreforge.getIntFromExpression import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter +import org.bukkit.Material import org.bukkit.block.Block @@ -25,6 +26,7 @@ object EffectDrill : MineBlockEffect("drill") { override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val block = data.block ?: data.location?.block ?: return false + val world = block.world val player = data.player ?: return false @@ -35,38 +37,40 @@ object EffectDrill : MineBlockEffect("drill") { } val whitelist = config.getStringsOrNull("whitelist") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val blacklist = config.getStringsOrNull("blacklisted_blocks") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() val preventTriggers = config.getBool("prevent_trigger") + val checkHardness = config.getBool("check_hardness") + val blocks = mutableSetOf() for (i in 1..amount) { val simplified = VectorUtils.simplifyVector(player.location.direction.normalize()).multiply(i) - val toBreak = block.world.getBlockAt(block.location.clone().add(simplified)) + val toBreak = world.getBlockAt(block.location.clone().add(simplified)) - if (config.getStrings("blacklisted_blocks").containsIgnoreCase(toBreak.type.name)) { + if (toBreak.type == Material.AIR) continue - } - if (whitelist != null) { - if (!whitelist.containsIgnoreCase(toBreak.type.name)) { - continue - } - } - - if (config.getBool("check_hardness")) { - if (toBreak.type.hardness > block.type.hardness) { - continue - } - } + if (toBreak.type.hardness < 0) + continue - if (!AntigriefManager.canBreakBlock(player, toBreak)) { + if (checkHardness && toBreak.type.hardness > block.type.hardness) continue - } - if (toBreak.type.hardness < 0) { + if (!AntigriefManager.canBreakBlock(player, toBreak)) continue - } + + if (blacklist != null) + if (blacklist.any { it.matches(toBreak) }) + continue + + if (whitelist != null) + if (!whitelist.any { it.matches(toBreak) }) + continue blocks.add(toBreak) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItem.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItem.kt index 5cb047f2c..faf2803e0 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItem.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItem.kt @@ -6,6 +6,7 @@ import com.willfp.eco.core.items.Items import com.willfp.libreforge.ViolationContext import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.Effect +import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.inventory.ItemStack @@ -22,11 +23,12 @@ object EffectDropItem : Effect("drop_item") { override fun onTrigger(config: Config, data: TriggerData, compileData: ItemStack): Boolean { val location = data.location ?: return false - val player = data.player if (player == null) { - location.world?.dropItem(location, compileData) + plugin.scheduler.runTask(location) { + location.world?.dropItem(location, compileData) + } } else { DropQueue(player) .setLocation(location) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItemSlot.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItemSlot.kt index afa02f4c9..b1c03f351 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItemSlot.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropItemSlot.kt @@ -5,6 +5,7 @@ import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.isEcoEmpty +import com.willfp.libreforge.plugin import com.willfp.libreforge.slot.SlotTypes import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter @@ -47,8 +48,12 @@ object EffectDropItemSlot : Effect("drop_item_slot") { val itemToDrop = item.clone().apply { this.amount = (amount ?: this.amount) } - val drop = player.location.world.dropItem(player.eyeLocation, itemToDrop) - drop.velocity = player.eyeLocation.direction.clone().multiply(0.3) + plugin.scheduler.runTask(player.eyeLocation) { // folia issue + player.location.world.dropItem(player.eyeLocation, itemToDrop) + .apply { + velocity = player.eyeLocation.direction.clone().multiply(0.3) + } + } player.inventory.setItem(slot, itemToSet) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropRandomItem.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropRandomItem.kt index 250c6c234..d0a54da4c 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropRandomItem.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropRandomItem.kt @@ -8,6 +8,7 @@ import com.willfp.libreforge.ViolationContext import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.getStrings +import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.inventory.ItemStack @@ -32,7 +33,9 @@ object EffectDropRandomItem : Effect>("drop_random_item") { .setLocation(location) .push() } else { - location.world?.dropItem(location, item) + plugin.scheduler.runTask(location) { + location.world?.dropItem(location, item) + } } return true diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropWeightedRandomItem.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropWeightedRandomItem.kt index 88e360f8a..9409263f0 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropWeightedRandomItem.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectDropWeightedRandomItem.kt @@ -4,13 +4,8 @@ import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.drops.DropQueue import com.willfp.eco.core.items.Items import com.willfp.eco.core.recipe.parts.EmptyTestableItem -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.WeightedItems -import com.willfp.libreforge.WeightedList -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getStrings -import com.willfp.libreforge.toWeightedList import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter @@ -35,7 +30,9 @@ object EffectDropWeightedRandomItem : Effect>("drop_ .setLocation(location) .push() } else { - location.world?.dropItem(location, item) + plugin.scheduler.runTask(location) { + location.world?.dropItem(location, item) + } } return true diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectFoodMultiplier.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectFoodMultiplier.kt index eb9e2ea7c..a35b7e34c 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectFoodMultiplier.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectFoodMultiplier.kt @@ -18,6 +18,6 @@ object EffectFoodMultiplier : MultiplierEffect("food_multiplier") { return } - event.foodLevel = player.foodLevel + ceil(getMultiplier(player.toDispatcher()) * diff).toInt() + event.foodLevel += ceil(getMultiplier(player.toDispatcher()) * diff).toInt() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectGlowNearbyBlocks.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectGlowNearbyBlocks.kt index 36eaf5db7..cc4782831 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectGlowNearbyBlocks.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectGlowNearbyBlocks.kt @@ -4,12 +4,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.util.TeamUtils -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.enumValueOfOrNull -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.Bukkit @@ -24,7 +20,7 @@ import org.bukkit.event.block.BlockBreakEvent import org.bukkit.event.world.ChunkLoadEvent import org.bukkit.event.world.ChunkUnloadEvent import org.bukkit.scoreboard.Team -import java.util.UUID +import java.util.* object EffectGlowNearbyBlocks : Effect("glow_nearby_blocks") { override val parameters = setOf( @@ -86,7 +82,7 @@ object EffectGlowNearbyBlocks : Effect("glow_nearby_blocks") { team.addEntry(shulker.uniqueId.toString()) block.setMetadata("gnb-uuid", plugin.metadataValueFactory.create(shulker.uniqueId)) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(duration.toLong()) { team.removeEntry(shulker.uniqueId.toString()) shulker.remove() block.removeMetadata("gnb-uuid", plugin) @@ -100,14 +96,14 @@ object EffectGlowNearbyBlocks : Effect("glow_nearby_blocks") { fun handleChunkUnload(event: ChunkUnloadEvent) { event.chunk.entities.filterIsInstance() .filter { it.hasMetadata("gnb-shulker") } - .forEach { it.remove() } + .forEach { plugin.scheduler.runTask(it) { it.remove() } } } @EventHandler fun handleChunkLoad(event: ChunkLoadEvent) { event.chunk.entities.filterIsInstance() .filter { it.hasMetadata("gnb-shulker") } - .forEach { it.remove() } + .forEach { plugin.scheduler.runTask(it) { it.remove() } } } @EventHandler @@ -122,7 +118,11 @@ object EffectGlowNearbyBlocks : Effect("glow_nearby_blocks") { it.value() is UUID }?.value() as? UUID ?: return - Bukkit.getServer().getEntity(uuid)?.remove() + Bukkit.getServer().getEntity(uuid)?.let { + plugin.scheduler.runTask(it) { + it.remove() + } + } for (shulker in block.location.world.getNearbyEntities( block.location, @@ -130,7 +130,9 @@ object EffectGlowNearbyBlocks : Effect("glow_nearby_blocks") { 2.0, 2.0 ) { it.hasMetadata("gnb-shulker") }) { - shulker.remove() + plugin.scheduler.runTask(shulker) { + shulker.remove() + } } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectHoming.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectHoming.kt index fab502ccb..e5d884477 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectHoming.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectHoming.kt @@ -4,16 +4,8 @@ import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.entities.Entities import com.willfp.eco.core.entities.TestableEntity import com.willfp.eco.core.integrations.antigrief.AntigriefManager -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments -import com.willfp.libreforge.distance +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.lerp -import com.willfp.libreforge.normalize -import com.willfp.libreforge.plugin -import com.willfp.libreforge.toFloat3 -import com.willfp.libreforge.toVector import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.GameMode @@ -94,11 +86,11 @@ object EffectHoming : Effect>("homing") { checks++ if (checks > MAX_CHECKS) { - task.cancel() + task.cancelTask() } if (arrow.isDead || arrow.isInBlock || arrow.isOnGround) { - task.cancel() + task.cancelTask() } val entities = arrow.getNearbyEntities(distance, distance, distance) @@ -116,7 +108,7 @@ object EffectHoming : Effect>("homing") { val dist = arrow.location.toFloat3().distance(entity.eyeLocation.toFloat3()) if (dist < 1.0) { - task.cancel() + task.cancelTask() break } @@ -144,7 +136,7 @@ object EffectHoming : Effect>("homing") { arrow.velocity = lerp(arrow.velocity.toFloat3(), targetVelocity, 1 - SMOOTHNESS).toVector() } - }.runTaskTimer(3L, CHECK_DELAY) + }.runTaskTimer(arrow, 3L, CHECK_DELAY) } override fun makeCompileData(config: Config, context: ViolationContext): List { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadius.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadius.kt index 65b7a92b0..69a907c7a 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadius.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadius.kt @@ -1,8 +1,8 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.blocks.Blocks import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager -import com.willfp.eco.util.containsIgnoreCase import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.templates.MineBlockEffect @@ -24,61 +24,58 @@ object EffectMineRadius : MineBlockEffect("mine_radius") { override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val block = data.block ?: data.location?.block ?: return false val player = data.player ?: return false + val world = block.world val radius = config.getIntFromExpression("radius", data) val preventTriggers = config.getBool("prevent_trigger") - if (player.isSneaking && config.getBool("disable_on_sneak")) { + if (player.isSneaking && config.getBool("disable_on_sneak")) return false - } val whitelist = config.getStringsOrNull("whitelist") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val blacklist = config.getStringsOrNull("blacklisted_blocks") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val checkHardness = config.getBool("check_hardness") - val blocks = mutableSetOf() + val blocks = mutableListOf() + + for (y in (-radius..radius)) { + val endY = block.y + y + if (endY !in world.minHeight..world.maxHeight) { + continue + } - for (x in (-radius..radius)) { - for (y in (-radius..radius)) { + for (x in (-radius..radius)) { for (z in (-radius..radius)) { if (x == 0 && y == 0 && z == 0) { continue } - val toBreak = block.world.getBlockAt( - block.location.clone().add(x.toDouble(), y.toDouble(), z.toDouble()) - ) + val toBreak = world.getBlockAt(block.x + x, block.y + y, block.z + z) - if (toBreak.location.blockY !in block.world.minHeight..block.world.maxHeight) { + if (toBreak.type == Material.AIR) continue - } - if (config.getStrings("blacklisted_blocks").containsIgnoreCase(toBreak.type.name)) { + if (toBreak.type.hardness < 0) continue - } - - if (whitelist != null) { - if (!whitelist.containsIgnoreCase(toBreak.type.name)) { - continue - } - } - if (config.getBoolOrNull("check_hardness") != false) { - if (toBreak.type.hardness < 0 || toBreak.type.hardness > block.type.hardness) { - continue - } - } - - if (toBreak.type.hardness < 0) { + if (checkHardness && toBreak.type.hardness > block.type.hardness) continue - } - if (toBreak.type == Material.AIR) { + if (!AntigriefManager.canBreakBlock(player, toBreak)) continue - } - if (!AntigriefManager.canBreakBlock(player, toBreak)) { - continue - } + if (blacklist != null) + if (blacklist.any { it.matches(toBreak) }) + continue + + if (whitelist != null) + if (!whitelist.any { it.matches(toBreak) }) + continue blocks.add(toBreak) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadiusOneDeep.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadiusOneDeep.kt index 9a1e4a8de..1d1236d14 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadiusOneDeep.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineRadiusOneDeep.kt @@ -1,8 +1,8 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.blocks.Blocks import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager -import com.willfp.eco.util.containsIgnoreCase import com.willfp.eco.util.simplify import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments @@ -26,23 +26,34 @@ object EffectMineRadiusOneDeep : MineBlockEffect("mine_radius_one override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val block = data.block ?: data.location?.block ?: return false val player = data.player ?: return false + val world = block.world val radius = config.getIntFromExpression("radius", data) val preventTriggers = config.getBool("prevent_trigger") - if (player.isSneaking && config.getBool("disable_on_sneak")) { + if (player.isSneaking && config.getBool("disable_on_sneak")) return false - } val whitelist = config.getStringsOrNull("whitelist") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val blacklist = config.getStringsOrNull("blacklisted_blocks") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val checkHardness = config.getBool("check_hardness") - val blocks = mutableSetOf() + val blocks = mutableListOf() val ignoreVector = player.location.direction.simplify() - for (x in (-radius..radius)) { - for (y in (-radius..radius)) { + for (y in (-radius..radius)) { + val endY = block.y + y + if (endY !in world.minHeight..world.maxHeight) { + continue + } + + for (x in (-radius..radius)) { for (z in (-radius..radius)) { // Jank if (ignoreVector.x != 0.0 && x != 0) { @@ -75,41 +86,27 @@ object EffectMineRadiusOneDeep : MineBlockEffect("mine_radius_one } } - val toBreak = block.world.getBlockAt( - block.location.clone().add(x.toDouble(), y.toDouble(), z.toDouble()) - ) + val toBreak = world.getBlockAt(block.x + x, block.y + y, block.z + z) - if (toBreak.location.blockY !in block.world.minHeight..block.world.maxHeight) { + if (toBreak.type == Material.AIR) continue - } - if (config.getStrings("blacklisted_blocks").containsIgnoreCase(toBreak.type.name)) { + if (toBreak.type.hardness < 0) continue - } - - if (whitelist != null) { - if (!whitelist.containsIgnoreCase(toBreak.type.name)) { - continue - } - } - if (config.getBoolOrNull("check_hardness") != false) { - if (toBreak.type.hardness > block.type.hardness) { - continue - } - } - - if (toBreak.type.hardness < 0) { + if (checkHardness && toBreak.type.hardness > block.type.hardness) continue - } - if (toBreak.type == Material.AIR) { + if (!AntigriefManager.canBreakBlock(player, toBreak)) continue - } - if (!AntigriefManager.canBreakBlock(player, toBreak)) { - continue - } + if (blacklist != null) + if (blacklist.any { it.matches(toBreak) }) + continue + + if (whitelist != null) + if (!whitelist.any { it.matches(toBreak) }) + continue blocks.add(toBreak) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineVein.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineVein.kt index e036b69dc..5936add78 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineVein.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectMineVein.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.blocks.Blocks import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.util.BlockUtils @@ -11,7 +12,6 @@ import com.willfp.libreforge.filters.Filters import com.willfp.libreforge.getIntFromExpression import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter -import org.bukkit.Material object EffectMineVein : MineBlockEffect("mine_vein") { override val parameters = setOf( @@ -30,13 +30,11 @@ object EffectMineVein : MineBlockEffect("mine_vein") { val preventTriggers = config.getBool("prevent_trigger") - if (player.isSneaking && config.getBool("disable_on_sneak")) { + if (player.isSneaking && config.getBool("disable_on_sneak")) return false - } - val whitelist = config.getStringsOrNull("blocks") - ?.mapNotNull { Material.matchMaterial(it.uppercase()) } - ?: listOf(block.type) + val whitelist = config.getStringsOrNull("whitelist") + ?.mapNotNull { Blocks.lookup(it) } ?: listOf(Blocks.getBlock(block)) val blocks = BlockUtils.getVein( block, diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectParticleAnimation.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectParticleAnimation.kt index 1098facdd..43d102a47 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectParticleAnimation.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectParticleAnimation.kt @@ -2,18 +2,12 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.particle.Particles -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.impl.particles.ParticleAnimationBlock import com.willfp.libreforge.effects.impl.particles.ParticleAnimations -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin -import com.willfp.libreforge.toFloat3 -import com.willfp.libreforge.toLocation import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter -import com.willfp.libreforge.xz import org.bukkit.entity.LivingEntity object EffectParticleAnimation : Effect?>("particle_animation") { @@ -102,7 +96,7 @@ object EffectParticleAnimation : Effect?>("particle_an player ) }) { - it.cancel() + it.cancelTask() } tick++ diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPermanentPotionEffect.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPermanentPotionEffect.kt index 39961a038..c388dfa26 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPermanentPotionEffect.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPermanentPotionEffect.kt @@ -1,20 +1,15 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.ProvidedHolder -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Identifiers -import com.willfp.libreforge.get -import com.willfp.libreforge.plugin import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerRespawnEvent import org.bukkit.potion.PotionEffect import org.bukkit.potion.PotionEffectType -import java.util.UUID +import java.util.* @Suppress("UNCHECKED_CAST") object EffectPermanentPotionEffect : Effect("permanent_potion_effect") { @@ -51,36 +46,37 @@ object EffectPermanentPotionEffect : Effect("permanent_potion_eff } private fun refreshEffectsOfType(player: Player, type: PotionEffectType) { - player.removePotionEffect(type) - val active = getHolderData(player) - .values - .filter { it.effectType == type } - if (active.isEmpty()) return - val best = active.maxByOrNull { it.level }!! - val effect = PotionEffect( - type, - DURATION, - best.level, - false, - active.any { it.particles }, - active.any { it.icon } - ) - player.addPotionEffect(effect) + plugin.scheduler.runTask(player) { + player.removePotionEffect(type) + val active = getHolderData(player) + .values + .filter { it.effectType == type } + if (active.isEmpty()) return@runTask + val best = active.maxByOrNull { it.level }!! + val effect = PotionEffect( + type, + DURATION, + best.level, + false, + active.any { it.particles }, + active.any { it.icon } + ) + player.addPotionEffect(effect) + } } @EventHandler fun onRespawn(event: PlayerRespawnEvent) { val player = event.player - plugin.server.scheduler.runTask(plugin, Runnable { + plugin.scheduler.runTask(player) { val types = getHolderData(player) .values .map { it.effectType } .toSet() types.forEach { refreshEffectsOfType(player, it) } - } - ) + } } override fun onEnable( diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionDurationMultiplier.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionDurationMultiplier.kt index a1cc7f6e8..8c89b2b3a 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionDurationMultiplier.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionDurationMultiplier.kt @@ -20,7 +20,7 @@ object EffectPotionDurationMultiplier : MultiplierEffect("potion_duration_multip val multiplier = getMultiplier(player.toDispatcher()) - plugin.scheduler.run { + plugin.scheduler.runTask(event.block.location) { for (i in 0..2) { val item = event.contents.getItem(i) ?: continue val meta = item.itemMeta as? PotionMeta ?: continue @@ -103,13 +103,15 @@ object EffectPotionDurationMultiplier : MultiplierEffect("potion_duration_multip for (effect in effects) { val newDuration = (effect.duration * multiplier * intensity).toInt() - entity.addPotionEffect( - PotionEffect( - effect.type, - newDuration, - effect.amplifier + plugin.scheduler.runTask(entity) { + entity.addPotionEffect( + PotionEffect( + effect.type, + newDuration, + effect.amplifier + ) ) - ) + } } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionEffect.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionEffect.kt index 214b1a26d..1af173e29 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionEffect.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectPotionEffect.kt @@ -5,6 +5,7 @@ import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.getIntFromExpression +import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.potion.PotionEffect @@ -36,18 +37,20 @@ object EffectPotionEffect : Effect("potion_effect") { data.victim ?: return false } - toApply.addPotionEffect( - PotionEffect( - @Suppress("DEPRECATION") - PotionEffectType.getByName(config.getString("effect").uppercase()) - ?: PotionEffectType.LUCK, - config.getIntFromExpression("duration", data), - config.getIntFromExpression("level", data) - 1, - true, - config.getBoolOrNull("particles") ?: true, - config.getBoolOrNull("icon") ?: true + plugin.scheduler.runTask(toApply) { + toApply.addPotionEffect( + PotionEffect( + @Suppress("DEPRECATION") + PotionEffectType.getByName(config.getString("effect").uppercase()) + ?: PotionEffectType.LUCK, + config.getIntFromExpression("duration", data), + config.getIntFromExpression("level", data) - 1, + true, + config.getBoolOrNull("particles") ?: true, + config.getBoolOrNull("icon") ?: true + ) ) - ) + } return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReelSpeedMultiplier.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReelSpeedMultiplier.kt index 23df6a185..8beb2dfa4 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReelSpeedMultiplier.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReelSpeedMultiplier.kt @@ -31,8 +31,10 @@ object EffectReelSpeedMultiplier : MultiplierEffect("reel_speed_multiplier") { .normalize() .multiply(multiplier) - plugin.scheduler.run { - event.caught?.velocity = vector + event.caught?.let { + plugin.scheduler.runTask(it) { + it.velocity = vector + } } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRemovePotionEffect.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRemovePotionEffect.kt index 6665db327..43264a239 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRemovePotionEffect.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRemovePotionEffect.kt @@ -33,7 +33,7 @@ object EffectRemovePotionEffect : Effect("remove_potion_effect") data.victim ?: return false } - plugin.scheduler.run { + plugin.scheduler.runTask(toApply) { toApply.removePotionEffect( @Suppress("DEPRECATION") PotionEffectType.getByName(config.getString("effect").uppercase()) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplaceNear.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplaceNear.kt index c1b6b9f03..1ddcbb048 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplaceNear.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplaceNear.kt @@ -1,15 +1,10 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.blocks.Blocks import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager -import com.willfp.eco.core.items.Items -import com.willfp.eco.util.containsIgnoreCase -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.getOrNull -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.Material @@ -32,48 +27,55 @@ object EffectReplaceNear : Effect("replace_near") { override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val block = data.block ?: data.location?.block ?: return false val player = data.player ?: return false + val world = block.world val radius = config.getIntFromExpression("radius", data) + // todo: radiusY is not used, someone left it here + // please use it or remove it, but don't leave it like this val radiusY = config.getIntFromExpression("radius_y", data) - if (player.isSneaking && config.getBool("disable_on_sneak")) { + if (player.isSneaking && config.getBool("disable_on_sneak")) return false - } - val replaceTo = Items.lookup(config.getString("replace_to")).item.type + val replaceTo = Blocks.lookup(config.getString("replace_to")) val whitelist = config.getStringsOrNull("whitelist") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() + + val blacklist = config.getStringsOrNull("blacklist") + ?.mapNotNull { Blocks.lookup(it) }?.toSet() val duration = config.getOrNull("duration") { getIntFromExpression(it, data) } val exposedBlocksOnly = config.getBool("exposed_only") val sourceBlocksOnly = config.getBool("source_only") - for (x in (-radius..radius)) { - for (y in (-radiusY..radiusY)) { + for (y in (-radius..radius)) { + val endY = block.y + y + if (endY !in world.minHeight..world.maxHeight) { + continue + } + + for (x in (-radius..radius)) { for (z in (-radius..radius)) { if (x == 0 && y == 0 && z == 0) { continue } - val toReplace = block.world.getBlockAt( - block.location.clone().add(x.toDouble(), y.toDouble(), z.toDouble()) - ) + val toReplace = world.getBlockAt(block.x + x, block.y + y, block.z + z) - if (config.getStrings("blacklist").containsIgnoreCase(toReplace.type.name)) { - continue + if (blacklist != null) { + if (blacklist.any { it.matches(toReplace) }) { + continue + } } if (whitelist != null) { - if (!whitelist.containsIgnoreCase(toReplace.type.name)) { + if (!whitelist.any { it.matches(toReplace) }) { continue } } - if (toReplace.type == Material.AIR && whitelist?.containsIgnoreCase("air") != true) { - continue - } - if (exposedBlocksOnly && !toReplace.getRelative(BlockFace.UP, 1).isEmpty) { continue } @@ -87,25 +89,27 @@ object EffectReplaceNear : Effect("replace_near") { } } - if (!(AntigriefManager.canBreakBlock(player, toReplace) && AntigriefManager.canPlaceBlock(player, toReplace))) { + if (!(AntigriefManager.canBreakBlock(player, toReplace) && AntigriefManager.canPlaceBlock( + player, + toReplace + )) + ) { continue } if (duration != null && duration > 0) { - val oldBlock = toReplace.type - val oldBlockData = toReplace.blockData + val oldBlock = Blocks.getBlock(toReplace) toReplace.setMetadata("rn-block", plugin.createMetadataValue(true)) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(duration.toLong()) { if (toReplace.hasMetadata("rn-block")) { - toReplace.type = oldBlock - toReplace.blockData = oldBlockData + oldBlock.place(toReplace.location) toReplace.removeMetadata("rn-block", plugin) } } } - toReplace.type = replaceTo + replaceTo.place(toReplace.location) } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplantCrops.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplantCrops.kt index cd1a8db5b..5988c75eb 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplantCrops.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectReplantCrops.kt @@ -3,13 +3,9 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.integrations.antigrief.AntigriefManager import com.willfp.eco.core.map.listMap -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.ProvidedHolder -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Identifiers -import com.willfp.libreforge.plugin import org.bukkit.Bukkit import org.bukkit.Material import org.bukkit.block.BlockFace @@ -19,7 +15,7 @@ import org.bukkit.event.block.BlockBreakEvent import org.bukkit.event.block.BlockPlaceEvent import org.bukkit.inventory.EquipmentSlot import org.bukkit.inventory.ItemStack -import java.util.UUID +import java.util.* object EffectReplantCrops : Effect("replant_crops") { override val arguments = arguments { @@ -120,7 +116,7 @@ object EffectReplantCrops : Effect("replant_crops") { data.age = 0 - plugin.scheduler.run { + plugin.scheduler.runTask(block.location) { block.type = type block.blockData = data diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRunCommand.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRunCommand.kt index 05a018c14..80f14437c 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRunCommand.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectRunCommand.kt @@ -1,12 +1,10 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.placeholder.translatePlaceholders -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getStrings -import com.willfp.libreforge.toPlaceholderContext import com.willfp.libreforge.triggers.TriggerData import org.bukkit.Bukkit import org.bukkit.entity.Player @@ -23,17 +21,25 @@ object EffectRunCommand : Effect("run_command") { val victim = data.victim as? Player val commands = config.getStrings("commands", "command") - .map { it.replace("%player%", player?.name ?: "%player") - it.replace("%victim%", victim?.name ?: "")} + .map { + it.replace("%player%", player?.name ?: "%player") + it.replace("%victim%", victim?.name ?: "") + } .map { it.translatePlaceholders(config.toPlaceholderContext(data)) } .dropLastWhile { it.isEmpty() } - commands.forEach { - Bukkit.getServer().dispatchCommand( - Bukkit.getConsoleSender(), - it - ) + val runnable = Runnable { + commands.forEach { + Bukkit.getServer().dispatchCommand( + Bukkit.getConsoleSender(), + it + ) + } } + if (Prerequisite.HAS_FOLIA.isMet) + plugin.scheduler.runTask(runnable) + else + runnable.run() return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSmite.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSmite.kt index 78b590a1e..899955576 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSmite.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSmite.kt @@ -1,12 +1,12 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.eco.util.LightningUtils import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter +import com.willfp.libreforge.triggers.tryAsLivingEntity object EffectSmite : Effect("smite") { override val parameters = setOf( @@ -21,7 +21,8 @@ object EffectSmite : Effect("smite") { val victim = data.victim ?: return false val damage = config.getDoubleFromExpression("damage", data.player) - LightningUtils.strike(victim, damage) + victim.world.strikeLightningEffect(victim.location) + victim.tryAsLivingEntity()?.damage(damage) return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnMobs.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnMobs.kt index 848a9b9d9..5236dc94e 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnMobs.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnMobs.kt @@ -4,12 +4,8 @@ import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.entities.Entities import com.willfp.eco.core.entities.TestableEntity import com.willfp.eco.util.NumberUtils -import com.willfp.libreforge.ViolationContext -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.attribute.Attribute @@ -19,7 +15,7 @@ import org.bukkit.event.EventHandler import org.bukkit.event.EventPriority import org.bukkit.event.entity.EntityDeathEvent import org.bukkit.event.entity.EntityTargetEvent -import java.util.UUID +import java.util.* object EffectSpawnMobs : Effect("spawn_mobs") { @@ -75,7 +71,7 @@ object EffectSpawnMobs : Effect("spawn_mobs") { mob.health = health - plugin.scheduler.runLater(ticksToLive.toLong()) { mob.remove() } + plugin.scheduler.runTaskLater(mob, ticksToLive.toLong()) { mob.remove() } } return true diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnParticle.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnParticle.kt index 98bf9f89d..44a1c1909 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnParticle.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectSpawnParticle.kt @@ -2,12 +2,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.particle.Particles -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.getOrElse -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter @@ -27,7 +23,7 @@ object EffectSpawnParticle : Effect( val particle = Particles.lookup(config.getString("particle")) val amount = config.getOrElse("amount", 1) { getIntFromExpression(it, data) } - plugin.scheduler.runAsync { + plugin.scheduler.runTaskAsync { particle.spawn(location, amount) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStrikeLightning.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStrikeLightning.kt index d468de555..c5048c965 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStrikeLightning.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStrikeLightning.kt @@ -21,9 +21,9 @@ object EffectStrikeLightning : Effect("strike_lightning") { val amount = config.getOrElse("amount", 1) { getIntFromExpression(it, data) } for (i in 1..amount) { - plugin.scheduler.runLater({ + plugin.scheduler.runTaskLater(location, 1) { world.strikeLightning(location) - }, 1) + } } return true diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStripAI.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStripAI.kt index e5bbc65e6..9dd412bc4 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStripAI.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectStripAI.kt @@ -32,7 +32,7 @@ object EffectStripAI : Effect("strip_ai") { victim.setAI(false) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(victim, duration.toLong()) { victim.setAI(true) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleport.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleport.kt index e75a55504..285588358 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleport.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleport.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.effects.Effect @@ -17,7 +18,11 @@ object EffectTeleport : Effect("teleport") { val location = data.location ?: return false location.pitch = player.location.pitch location.yaw = player.location.yaw - player.teleport(location) + + if (Prerequisite.HAS_PAPER.isMet) + player.teleportAsync(location) + else + player.teleport(location) // damn spigot! return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportTo.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportTo.kt index 0c10bebad..f1f88ba49 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportTo.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportTo.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments @@ -33,7 +34,10 @@ object EffectTeleportTo : Effect("teleport_to") { config.getDoubleFromExpression("z", data) ) - player.teleport(loc) + if (Prerequisite.HAS_PAPER.isMet) + player.teleportAsync(loc) + else + player.teleport(loc) // damn spigot! return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportToGround.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportToGround.kt index 57dd0e838..42c6d3536 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportToGround.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTeleportToGround.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.effects.Effect @@ -29,7 +30,10 @@ object EffectTeleportToGround : Effect("teleport_to_ground") { current = current.subtract(0.0, 1.0, 0.0) } - player.teleport(current) + if (Prerequisite.HAS_PAPER.isMet) + player.teleportAsync(current) + else + player.teleport(current) // damn spigot! return true } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTraceback.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTraceback.kt index 7436113ed..6c840c37d 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTraceback.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTraceback.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments @@ -35,14 +36,21 @@ object EffectTraceback : Effect("traceback") { val location = times.getOrElse(index) { times.lastOrNull() } ?: return false - player.teleport(location) + if (Prerequisite.HAS_PAPER.isMet) + player.teleportAsync(location) + else + player.teleport(location) // damn spigot! return true } override fun postRegister() { - plugin.scheduler.runTimer(20, 20) { - for (player in Bukkit.getOnlinePlayers()) { + Bukkit.getOnlinePlayers().forEach { player -> + // one timer for each player in folia cuz + // player metadata can be accessed only on player threads.. + // + // sadly the same for spigot, and it's annoying :( + plugin.scheduler.runTaskTimer(player, 20, 20) { @Suppress("UNCHECKED_CAST") val times = player.getMetadata(key).getOrNull(0)?.value() as? List ?: emptyList() val newTimes = (if (times.size < 30) times else times.drop(1)) + player.location diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTransmission.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTransmission.kt index e284afd7d..c3f536ae2 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTransmission.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectTransmission.kt @@ -1,5 +1,6 @@ package com.willfp.libreforge.effects.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.libreforge.NoCompileData import com.willfp.libreforge.arguments @@ -49,6 +50,9 @@ object EffectTransmission : Effect("transmission") { location.pitch = player.location.pitch location.yaw = player.location.yaw - return player.teleport(location) + return if (Prerequisite.HAS_PAPER.isMet) + player.teleportAsync(location).get() + else + player.teleport(location) // DAMN SPIGOT! } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectVictimSpeedMultiplier.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectVictimSpeedMultiplier.kt index cad4bb571..64a106d32 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectVictimSpeedMultiplier.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/EffectVictimSpeedMultiplier.kt @@ -1,12 +1,8 @@ package com.willfp.libreforge.effects.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression -import com.willfp.libreforge.plugin import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import org.bukkit.attribute.Attribute @@ -41,7 +37,7 @@ object EffectVictimSpeedMultiplier : Effect("victim_speed_multipl victim.setMetadata(META_KEY, plugin.createMetadataValue(true)) - plugin.scheduler.runLater(duration.toLong()) { + plugin.scheduler.runTaskLater(victim, duration.toLong()) { attribute.baseValue = attributeValue victim.removeMetadata(META_KEY, plugin) } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/animations/impl/AnimationSpinItem.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/animations/impl/AnimationSpinItem.kt index 550bbabd1..48831f8f7 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/animations/impl/AnimationSpinItem.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/impl/animations/impl/AnimationSpinItem.kt @@ -1,12 +1,10 @@ package com.willfp.libreforge.effects.impl.animations.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.items.Items -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.impl.animations.Animation -import com.willfp.libreforge.getDoubleFromExpression -import com.willfp.libreforge.getIntFromExpression import com.willfp.libreforge.triggers.TriggerData import dev.romainguy.kotlin.math.Float3 import org.bukkit.Location @@ -75,9 +73,13 @@ object AnimationSpinItem : Animation>("spin_item val x = cos(armorStandAngle) * radius val z = sin(armorStandAngle) * radius - val armorStandLocation = sourceLocation.clone().add(x, 0.0, z) - armorStand.teleport(armorStandLocation.add(0.0,0.5, 0.0)) - armorStand.rightArmPose = EulerAngle(0.0, armorStandAngle + Math.PI, 0.0) // Add PI to make the item point outwards + val armorStandLocation = sourceLocation.clone().add(x, 0.5, z) + if (Prerequisite.HAS_PAPER.isMet) + armorStand.teleportAsync(armorStandLocation) + else + armorStand.teleport(armorStandLocation) // damn spigot + armorStand.rightArmPose = + EulerAngle(0.0, armorStandAngle + Math.PI, 0.0) // Add PI to make the item point outwards } return tick >= config.getDoubleFromExpression("duration", triggerData) @@ -91,6 +93,6 @@ object AnimationSpinItem : Animation>("spin_item compileData: NoCompileData, data: List ) { - data.forEach { it.remove() } + data.forEach { plugin.scheduler.runTask(it) { it.remove() } } } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/AttributeEffect.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/AttributeEffect.kt index 5120a1bee..59f7a0601 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/AttributeEffect.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/AttributeEffect.kt @@ -1,13 +1,9 @@ package com.willfp.libreforge.effects.templates import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.ProvidedHolder +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Identifiers -import com.willfp.libreforge.get -import com.willfp.libreforge.plugin import org.bukkit.attribute.Attribute import org.bukkit.attribute.AttributeInstance import org.bukkit.attribute.AttributeModifier @@ -87,7 +83,7 @@ abstract class AttributeEffect( ) // Run on next tick to prevent constraining to the lower value during reloads. - plugin.scheduler.run { + plugin.scheduler.runTask(entity) { constrainAttribute(entity, instance.value) } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/DamageItemEffect.kt b/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/DamageItemEffect.kt index 92d94580f..7eeb635ba 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/DamageItemEffect.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/effects/templates/DamageItemEffect.kt @@ -22,6 +22,7 @@ abstract class DamageItemEffect(id: String) : Effect(id) { abstract fun getItems(data: TriggerData): List + @Suppress("DEPRECATION") final override fun onTrigger(config: Config, data: TriggerData, compileData: NoCompileData): Boolean { val victim = data.victim ?: return false @@ -41,7 +42,6 @@ abstract class DamageItemEffect(id: String) : Effect(id) { } if (victim is Player) { - @Suppress("DEPRECATION") val event = PlayerItemDamageEvent(victim, item, damage) Bukkit.getPluginManager().callEvent(event) if (!event.isCancelled) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterIsBoss.kt b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterIsBoss.kt index d5edf35ec..33e1df135 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterIsBoss.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterIsBoss.kt @@ -7,6 +7,7 @@ import com.willfp.libreforge.filters.Filter import com.willfp.libreforge.triggers.TriggerData import org.bukkit.entity.Boss import org.bukkit.entity.ElderGuardian +import org.bukkit.entity.Warden import org.bukkit.persistence.PersistentDataType object FilterIsBoss : Filter("is_boss") { @@ -16,7 +17,7 @@ object FilterIsBoss : Filter("is_boss") { override fun isMet(data: TriggerData, value: Boolean, compileData: NoCompileData): Boolean { val entity = data.victim ?: return true - return (entity is Boss || entity is ElderGuardian || entity.persistentDataContainer + return (entity is Boss || entity is ElderGuardian || entity is Warden || entity.persistentDataContainer .has(NamespacedKeyUtils.create("ecobosses", "boss"), PersistentDataType.STRING)) == value } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyBosses.kt b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyBosses.kt index f40ea4ed2..6628cc03f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyBosses.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyBosses.kt @@ -7,6 +7,7 @@ import com.willfp.libreforge.filters.Filter import com.willfp.libreforge.triggers.TriggerData import org.bukkit.entity.Boss import org.bukkit.entity.ElderGuardian +import org.bukkit.entity.Warden import org.bukkit.persistence.PersistentDataType @Deprecated("Use is_boss instead") @@ -17,7 +18,7 @@ object FilterOnlyBosses : Filter("only_bosses") { override fun isMet(data: TriggerData, value: Boolean, compileData: NoCompileData): Boolean { val entity = data.victim ?: return true - return (entity is Boss || entity is ElderGuardian || entity.persistentDataContainer + return (entity is Boss || entity is ElderGuardian || entity is Warden || entity.persistentDataContainer .has(NamespacedKeyUtils.create("ecobosses", "boss"), PersistentDataType.STRING)) == value } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyNonBosses.kt b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyNonBosses.kt index 575eb33b5..ef8d399d9 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyNonBosses.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/filters/impl/FilterOnlyNonBosses.kt @@ -7,6 +7,7 @@ import com.willfp.libreforge.filters.Filter import com.willfp.libreforge.triggers.TriggerData import org.bukkit.entity.Boss import org.bukkit.entity.ElderGuardian +import org.bukkit.entity.Warden import org.bukkit.persistence.PersistentDataType @Deprecated("Use is_boss instead") @@ -17,7 +18,7 @@ object FilterOnlyNonBosses : Filter("only_non_bosses") { override fun isMet(data: TriggerData, value: Boolean, compileData: NoCompileData): Boolean { val entity = data.victim ?: return true - return (entity is Boss || entity is ElderGuardian || entity.persistentDataContainer + return (entity is Boss || entity is ElderGuardian || entity is Warden || entity.persistentDataContainer .has(NamespacedKeyUtils.create("ecobosses", "boss"), PersistentDataType.STRING)) != value } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/auraskills/impl/EffectAddStat.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/auraskills/impl/EffectAddStat.kt index 8bc323516..0ad3be834 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/auraskills/impl/EffectAddStat.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/auraskills/impl/EffectAddStat.kt @@ -1,13 +1,9 @@ package com.willfp.libreforge.integrations.auraskills.impl import com.willfp.eco.core.config.interfaces.Config -import com.willfp.libreforge.Dispatcher -import com.willfp.libreforge.NoCompileData -import com.willfp.libreforge.ProvidedHolder -import com.willfp.libreforge.arguments +import com.willfp.libreforge.* import com.willfp.libreforge.effects.Effect import com.willfp.libreforge.effects.Identifiers -import com.willfp.libreforge.get import dev.aurelium.auraskills.api.AuraSkillsApi import dev.aurelium.auraskills.api.registry.NamespacedId import dev.aurelium.auraskills.api.stat.StatModifier @@ -21,6 +17,7 @@ object EffectAddStat : Effect("add_stat") { override val shouldReload = false + @Suppress("DEPRECATION") override fun onEnable( dispatcher: Dispatcher<*>, config: Config, @@ -34,11 +31,13 @@ object EffectAddStat : Effect("add_stat") { val user = auraSkills.getUser(player.uniqueId) val stat = auraSkills.globalRegistry.getStat(NamespacedId.fromDefault(config.getString("stat"))) - user.addStatModifier(StatModifier( - identifiers.key.key, - stat, - config.getDoubleFromExpression("amount", player) - )) + user.addStatModifier( + StatModifier( + identifiers.key.key, + stat, + config.getDoubleFromExpression("amount", player) + ) + ) } override fun onDisable(dispatcher: Dispatcher<*>, identifiers: Identifiers, holder: ProvidedHolder) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/paper/impl/EffectDropPickupItem.kt b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/paper/impl/EffectDropPickupItem.kt index ca0a9ae26..edfab898f 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/integrations/paper/impl/EffectDropPickupItem.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/integrations/paper/impl/EffectDropPickupItem.kt @@ -75,7 +75,9 @@ object EffectDropPickupItem : Effect("drop_pickup_item") { val meta = item.getMetadata(META_KEY).firstOrNull()?.value() as? Meta ?: return event.isCancelled = true - item.remove() + plugin.scheduler.runTask(item) { + item.remove() + } meta.chain.trigger(meta.trigger) meta.team?.removeEntry(item.uniqueId.toString()) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/DispatchedTriggerFactory.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/DispatchedTriggerFactory.kt index 8714e3573..0ec461952 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/DispatchedTriggerFactory.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/DispatchedTriggerFactory.kt @@ -3,7 +3,7 @@ package com.willfp.libreforge.triggers import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.map.listMap import com.willfp.libreforge.Dispatcher -import java.util.UUID +import java.util.* /* @@ -33,7 +33,7 @@ class DispatchedTriggerFactory( } internal fun startTicking() { - plugin.scheduler.runTimer(1, 1) { + plugin.scheduler.runTaskTimer(1, 1) { dispatcherTriggers.clear() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerAltClick.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerAltClick.kt index 0444a47d0..014841bcd 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerAltClick.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerAltClick.kt @@ -14,7 +14,7 @@ import org.bukkit.entity.LivingEntity import org.bukkit.event.EventHandler import org.bukkit.event.block.Action import org.bukkit.event.player.PlayerInteractEvent -import java.util.UUID +import java.util.* object TriggerAltClick : Trigger("alt_click") { override val parameters = setOf( @@ -125,7 +125,7 @@ object TriggerAltClick : Trigger("alt_click") { preventDoubleTriggers += player.uniqueId - plugin.scheduler.run { + plugin.scheduler.runTask(player) { preventDoubleTriggers -= player.uniqueId } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrew.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrew.kt index 2bb5cce8d..c122fd8fe 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrew.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrew.kt @@ -35,7 +35,7 @@ object TriggerBrew : Trigger("brew") { val location = inventory.location ?: return val oldContents = inventory.contents - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { val newContents = inventory.contents if (!oldContents.contentEquals(newContents)) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrewIngredient.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrewIngredient.kt index 6003c5b53..0bffe61a8 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrewIngredient.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerBrewIngredient.kt @@ -35,7 +35,7 @@ object TriggerBrewIngredient : Trigger("brew_ingredient") { val location = inventory.location ?: return val oldContents = inventory.contents - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { val newContents = inventory.contents if (!oldContents.contentEquals(newContents)) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerChangeChunk.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerChangeChunk.kt index 2e6a1e8fe..3aa6f5e0c 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerChangeChunk.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerChangeChunk.kt @@ -1,12 +1,12 @@ package com.willfp.libreforge.triggers.impl import com.willfp.eco.core.Prerequisite +import com.willfp.libreforge.plugin import com.willfp.libreforge.toDispatcher import com.willfp.libreforge.triggers.Trigger import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import io.papermc.paper.event.entity.EntityMoveEvent -import org.bukkit.entity.LivingEntity import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerMoveEvent @@ -23,7 +23,7 @@ object TriggerChangeChunk : Trigger("change_chunk") { @EventHandler(ignoreCancelled = true) fun handle(event: EntityMoveEvent) { - val entity = event.entity as? LivingEntity ?: return + val entity = event.entity if (entity is Player) { return @@ -37,15 +37,24 @@ object TriggerChangeChunk : Trigger("change_chunk") { return } - this.dispatch( - entity.toDispatcher(), TriggerData( - victim = entity as? LivingEntity, - location = event.to, - velocity = entity.velocity, - event = event, - item = entity.equipment?.itemInMainHand + + val runnable = Runnable { + this.dispatch( + entity.toDispatcher(), TriggerData( + victim = entity, + location = event.to, + velocity = entity.velocity, + event = event, + item = entity.equipment?.itemInMainHand + ) ) - ) + } + + if (Prerequisite.HAS_FOLIA.isMet) { + if (entity.isValid) // folia issue, sometimes entity moves when is dead, making the task impossible + plugin.scheduler.runTask(entity, runnable) + } else + runnable.run() } @EventHandler(ignoreCancelled = true) @@ -62,15 +71,23 @@ object TriggerChangeChunk : Trigger("change_chunk") { return } - this.dispatch( - player.toDispatcher(), - TriggerData( - player = player, - location = player.location, - velocity = player.velocity, - event = event, - item = player.equipment.itemInMainHand, + val runnable = Runnable { + this.dispatch( + player.toDispatcher(), + TriggerData( + player = player, + location = player.location, + velocity = player.velocity, + event = event, + item = player.equipment.itemInMainHand, + ) ) - ) + } + + if (Prerequisite.HAS_FOLIA.isMet) { + if (player.isValid) // folia issue, sometimes player moves when is dead, making the task impossible + plugin.scheduler.runTask(player, runnable) + } else + runnable.run() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupGlobalStatic.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupGlobalStatic.kt index d5c871d33..abb2874d7 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupGlobalStatic.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupGlobalStatic.kt @@ -30,7 +30,7 @@ object TriggerGroupGlobalStatic : TriggerGroup("global_static") { } override fun postRegister() { - plugin.scheduler.runTimer(1, 1) { + plugin.scheduler.runTaskTimer(1, 1) { tick++ for ((interval, trigger) in registry) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupStatic.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupStatic.kt index c38f5f0cf..7c30e321e 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupStatic.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerGroupStatic.kt @@ -34,7 +34,7 @@ object TriggerGroupStatic : TriggerGroup("static") { } override fun postRegister() { - plugin.scheduler.runTimer(1, 1) { + plugin.scheduler.runTaskTimer(1, 1) { tick++ for ((interval, trigger) in registry) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerJump.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerJump.kt index e588364d3..e66b66813 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerJump.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerJump.kt @@ -1,6 +1,8 @@ package com.willfp.libreforge.triggers.impl +import com.willfp.eco.core.Prerequisite import com.willfp.eco.core.events.PlayerJumpEvent +import com.willfp.libreforge.plugin import com.willfp.libreforge.toDispatcher import com.willfp.libreforge.triggers.Trigger import com.willfp.libreforge.triggers.TriggerData @@ -19,14 +21,22 @@ object TriggerJump : Trigger("jump") { fun handle(event: PlayerJumpEvent) { val player = event.player - this.dispatch( - player.toDispatcher(), - TriggerData( - player = player, - location = player.location, - event = event, - velocity = player.velocity + val runnable = Runnable { + this.dispatch( + player.toDispatcher(), + TriggerData( + player = player, + location = player.location, + event = event, + velocity = player.velocity + ) ) - ) + } + + if (Prerequisite.HAS_FOLIA.isMet) { + if (player.isValid) // folia issue, sometimes player moves when is dead, teleporting, etc, making the task impossible + plugin.scheduler.runTask(player, runnable) + } else + runnable.run() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerMove.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerMove.kt index 0055cf863..d0ed78908 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerMove.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerMove.kt @@ -1,12 +1,12 @@ package com.willfp.libreforge.triggers.impl import com.willfp.eco.core.Prerequisite +import com.willfp.libreforge.plugin import com.willfp.libreforge.toDispatcher import com.willfp.libreforge.triggers.Trigger import com.willfp.libreforge.triggers.TriggerData import com.willfp.libreforge.triggers.TriggerParameter import io.papermc.paper.event.entity.EntityMoveEvent -import org.bukkit.entity.LivingEntity import org.bukkit.entity.Player import org.bukkit.event.EventHandler import org.bukkit.event.player.PlayerMoveEvent @@ -22,7 +22,7 @@ object TriggerMove : Trigger("move") { @EventHandler(ignoreCancelled = true) fun handle(event: EntityMoveEvent) { - val entity = event.entity as? LivingEntity ?: return + val entity = event.entity if (entity is Player) { return @@ -38,16 +38,24 @@ object TriggerMove : Trigger("move") { 0.0 } - this.dispatch( - entity.toDispatcher(), - TriggerData( - location = entity.location, - velocity = entity.velocity, - event = event, - item = entity.equipment?.itemInMainHand, - value = distance + val runnable = Runnable { + this.dispatch( + entity.toDispatcher(), + TriggerData( + location = entity.location, + velocity = entity.velocity, + event = event, + item = entity.equipment?.itemInMainHand, + value = distance + ) ) - ) + } + + if (Prerequisite.HAS_FOLIA.isMet) { + if (entity.isValid) // folia issue, sometimes entity moves when is dead, making the task impossible + plugin.scheduler.runTask(entity, runnable) + } else + runnable.run() } @EventHandler(ignoreCancelled = true) @@ -66,16 +74,24 @@ object TriggerMove : Trigger("move") { 0.0 } - this.dispatch( - player.toDispatcher(), - TriggerData( - player = player, - location = player.location, - velocity = player.velocity, - event = event, - item = player.equipment.itemInMainHand, - value = distance + val runnable = Runnable { + this.dispatch( + player.toDispatcher(), + TriggerData( + player = player, + location = player.location, + velocity = player.velocity, + event = event, + item = player.equipment.itemInMainHand, + value = distance + ) ) - ) + } + + if (Prerequisite.HAS_FOLIA.isMet) { + if (player.isValid) // folia issue, sometimes player moves when is dead, making the task impossible + plugin.scheduler.runTask(player, runnable) + } else + runnable.run() } } diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerRunCommand.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerRunCommand.kt index 60e2019a3..c5862ec91 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerRunCommand.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerRunCommand.kt @@ -19,7 +19,7 @@ object TriggerRunCommand : Trigger("run_command") { fun handle(event: PlayerCommandPreprocessEvent) { val player = event.player - plugin.scheduler.run { + plugin.scheduler.runTask(player) { this.dispatch( player.toDispatcher(), TriggerData( diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSendMessage.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSendMessage.kt index 237d5efc3..d85824456 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSendMessage.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSendMessage.kt @@ -22,7 +22,7 @@ object TriggerSendMessage : Trigger("send_message") { fun handle(event: AsyncPlayerChatEvent) { val player = event.player - plugin.scheduler.run { + plugin.scheduler.runTask(player) { this.dispatch( player.toDispatcher(), TriggerData( diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSmelt.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSmelt.kt index 1733cb532..0e74f348e 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSmelt.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerSmelt.kt @@ -35,7 +35,7 @@ object TriggerSmelt : Trigger("smelt") { val location = inventory.location ?: return val oldContents = inventory.contents - plugin.scheduler.runLater(2) { + plugin.scheduler.runTaskLater(player, 2) { val newContents = inventory.contents if (!oldContents.contentEquals(newContents)) { diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerTeleport.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerTeleport.kt index 379bd6aed..57010ff7c 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerTeleport.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerTeleport.kt @@ -17,11 +17,13 @@ object TriggerTeleport : Trigger("teleport") { @EventHandler(ignoreCancelled = true) fun handle(event: PlayerTeleportEvent) { - plugin.scheduler.run { + val player = event.player + + plugin.scheduler.runTask(player) { this.dispatch( - event.player.toDispatcher(), + player.toDispatcher(), TriggerData( - player = event.player, + player = player, location = event.to, text = event.cause.name.lowercase() ) diff --git a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerWinRaid.kt b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerWinRaid.kt index 24456999b..f80cbbbfc 100644 --- a/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerWinRaid.kt +++ b/core/common/src/main/kotlin/com/willfp/libreforge/triggers/impl/TriggerWinRaid.kt @@ -1,5 +1,7 @@ package com.willfp.libreforge.triggers.impl +import com.willfp.eco.core.Prerequisite +import com.willfp.libreforge.plugin import com.willfp.libreforge.toDispatcher import com.willfp.libreforge.triggers.Trigger import com.willfp.libreforge.triggers.TriggerData @@ -16,14 +18,20 @@ object TriggerWinRaid : Trigger("win_raid") { @EventHandler(ignoreCancelled = true) fun handle(event: RaidFinishEvent) { for (player in event.winners) { - this.dispatch( - player.toDispatcher(), - TriggerData( - player = player, - location = event.raid.location, - value = event.raid.badOmenLevel.toDouble() + 1 + val runnable = Runnable { + this.dispatch( + player.toDispatcher(), + TriggerData( + player = player, + location = event.raid.location, + value = event.raid.badOmenLevel.toDouble() + 1 + ) ) - ) + } + if (Prerequisite.HAS_FOLIA.isMet) + plugin.scheduler.runTask(player, runnable) + else + runnable.run() } } } diff --git a/core/common/src/main/resources/plugin.yml b/core/common/src/main/resources/plugin.yml index 332a05a3c..5072e11bc 100644 --- a/core/common/src/main/resources/plugin.yml +++ b/core/common/src/main/resources/plugin.yml @@ -4,6 +4,7 @@ main: com.willfp.libreforge.LibreforgeSpigotPlugin api-version: 1.21.4 authors: [ Auxilor ] website: willfp.com +folia-supported: true # eco is written as a softdepend because otherwise the plugin # loader will complain about it not being installed.