diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/PylonCore.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/PylonCore.kt index 737636d81..286112f64 100644 --- a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/PylonCore.kt +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/PylonCore.kt @@ -25,6 +25,7 @@ import io.github.pylonmc.pylon.core.guide.button.PageButton import io.github.pylonmc.pylon.core.guide.button.setting.TogglePlayerSettingButton import io.github.pylonmc.pylon.core.guide.pages.PlayerSettingsPage import io.github.pylonmc.pylon.core.i18n.PylonTranslator +import io.github.pylonmc.pylon.core.item.PylonInventoryTicker import io.github.pylonmc.pylon.core.item.PylonItem import io.github.pylonmc.pylon.core.item.PylonItemListener import io.github.pylonmc.pylon.core.item.research.Research @@ -33,10 +34,10 @@ import io.github.pylonmc.pylon.core.recipe.ConfigurableRecipeType import io.github.pylonmc.pylon.core.recipe.PylonRecipeListener import io.github.pylonmc.pylon.core.recipe.RecipeType import io.github.pylonmc.pylon.core.registry.PylonRegistry -import io.github.pylonmc.pylon.core.util.mergeGlobalConfig import io.github.pylonmc.pylon.core.resourcepack.armor.ArmorTextureEngine import io.github.pylonmc.pylon.core.resourcepack.armor.ArmorTextureEngine.hasCustomArmorTextures import io.github.pylonmc.pylon.core.resourcepack.block.BlockTextureEngine +import io.github.pylonmc.pylon.core.util.mergeGlobalConfig import io.github.pylonmc.pylon.core.util.pylonKey import io.github.pylonmc.pylon.core.waila.Waila import io.github.retrooper.packetevents.factory.spigot.SpigotPacketEventsBuilder @@ -56,7 +57,7 @@ import org.bukkit.permissions.Permission import org.bukkit.permissions.PermissionDefault import org.bukkit.plugin.java.JavaPlugin import xyz.xenondevs.invui.InvUI -import java.util.Locale +import java.util.* import kotlin.io.path.* /** @@ -98,6 +99,7 @@ object PylonCore : JavaPlugin(), PylonAddon { Bukkit.getPluginManager().registerEvents(BlockStorage, this) Bukkit.getPluginManager().registerEvents(BlockListener, this) Bukkit.getPluginManager().registerEvents(PylonItemListener, this) + Bukkit.getScheduler().runTaskTimer(this, PylonInventoryTicker(), 0, PylonConfig.inventoryTickerBaseRate) Bukkit.getPluginManager().registerEvents(TickManager, this) Bukkit.getPluginManager().registerEvents(MultiblockCache, this) Bukkit.getPluginManager().registerEvents(EntityStorage, this) diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/config/PylonConfig.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/config/PylonConfig.kt index 2ab32bfb1..bba58cf53 100644 --- a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/config/PylonConfig.kt +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/config/PylonConfig.kt @@ -63,6 +63,9 @@ object PylonConfig { @JvmStatic val disabledItems = config.getOrThrow("disabled-items", ConfigAdapter.SET.from(ConfigAdapter.NAMESPACED_KEY)) + @JvmStatic + val inventoryTickerBaseRate = config.getOrThrow("inventory-ticker-base-rate", ConfigAdapter.LONG) + object WailaConfig { private val config = Config(PylonCore, "config.yml") diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/PylonInventoryTicker.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/PylonInventoryTicker.kt new file mode 100644 index 000000000..0c58469ca --- /dev/null +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/PylonInventoryTicker.kt @@ -0,0 +1,19 @@ +package io.github.pylonmc.pylon.core.item + +import io.github.pylonmc.pylon.core.item.base.PylonInventoryTicker +import org.bukkit.Bukkit + +internal class PylonInventoryTicker() : Runnable { + private var count = 0L + override fun run() { + for (player in Bukkit.getOnlinePlayers()) { + for (item in player.inventory) { + val pylonItem = PylonItem.fromStack(item) + if (pylonItem is PylonInventoryTicker && count % pylonItem.tickInterval == 0L) { + pylonItem.onTick(player) + } + } + } + count += 1L + } +} \ No newline at end of file diff --git a/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/base/PylonInventoryTicker.kt b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/base/PylonInventoryTicker.kt new file mode 100644 index 000000000..d4383072d --- /dev/null +++ b/pylon-core/src/main/kotlin/io/github/pylonmc/pylon/core/item/base/PylonInventoryTicker.kt @@ -0,0 +1,20 @@ +package io.github.pylonmc.pylon.core.item.base + +import io.github.pylonmc.pylon.core.config.PylonConfig +import org.bukkit.entity.Player + +/** + * An item should implement this interface to tick when a player has the item in their inventory + */ +interface PylonInventoryTicker { + /** + * Called when the item is detected in the player's inventory. + * will be called at [tickInterval] * [PylonConfig.inventoryTickerBaseRate + * @param player The player whose inventory the item was in + */ + fun onTick(player: Player) + + /** Determines the rate at which the [onTick] method will be called. + * [onTick] will be called at [tickInterval] * [PylonConfig.inventoryTickerBaseRate] */ + val tickInterval: Long +} \ No newline at end of file diff --git a/pylon-core/src/main/resources/config.yml b/pylon-core/src/main/resources/config.yml index bce246b28..8b3203924 100644 --- a/pylon-core/src/main/resources/config.yml +++ b/pylon-core/src/main/resources/config.yml @@ -18,6 +18,9 @@ block-data-autosave-interval-seconds: 60 entity-data-autosave-interval-seconds: 60 +# The lowest tick interval at which pylon inventory ticker items may tick +inventory-ticker-base-rate: 10 + waila: # The interval (in Minecraft ticks), between WAILA checks # Set to 0 to disable WAILA globally