Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ object EffectDataFixer : Listener {

dispatcher.updateHolders()

plugin.scheduler.run {
plugin.scheduler.runTask(player) {
dispatcher.updateEffects()
}
}
Expand Down
41 changes: 32 additions & 9 deletions core/common/src/main/kotlin/com/willfp/libreforge/HolderUpdates.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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")
Expand All @@ -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
}
Expand All @@ -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)
Expand All @@ -66,31 +75,45 @@ 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
}

inventoryClickTimeouts.put(player.uniqueId, Unit)

player.toDispatcher().refreshHolders()

plugin.scheduler.runTask(player) {
dispatcher.refreshHolders()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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()
}
}

Expand All @@ -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()
}
}
}
Expand All @@ -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()
}
}
Expand Down Expand Up @@ -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) }
)
}

Expand Down
38 changes: 28 additions & 10 deletions core/common/src/main/kotlin/com/willfp/libreforge/Utils.kt
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -68,21 +63,44 @@ fun Collection<ItemStack?>.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
}

Expand Down
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -13,9 +14,15 @@ internal object CommandReload : Subcommand(
false
) {
override fun onExecute(sender: CommandSender, args: List<String>) {
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()
}
}
Original file line number Diff line number Diff line change
@@ -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<NoCompileData>("is_storm") {
object ConditionIsStorm : Condition<NoCompileData>("is_storm") {
override fun isMet(
dispatcher: Dispatcher<*>,
config: Config,
Expand All @@ -25,7 +21,9 @@ object ConditionIsStorm: Condition<NoCompileData>("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()
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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

/**
Expand Down Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<HolderTemplate>("add_holder") {
override val isPermanent = false
Expand All @@ -44,7 +36,7 @@ object EffectAddHolder : Effect<HolderTemplate>("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)
Expand Down
Loading
Loading