diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/ReforgesPlugin.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/ReforgesPlugin.kt index 9bd6899..24182cf 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/ReforgesPlugin.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/ReforgesPlugin.kt @@ -2,33 +2,29 @@ package com.willfp.reforges import com.willfp.eco.core.command.impl.PluginCommand import com.willfp.eco.core.display.DisplayModule -import com.willfp.eco.core.integrations.IntegrationLoader import com.willfp.eco.core.items.Items import com.willfp.libreforge.conditions.Conditions import com.willfp.libreforge.loader.LibreforgePlugin import com.willfp.libreforge.loader.configs.ConfigCategory import com.willfp.libreforge.registerHolderProvider -import com.willfp.libreforge.registerPlayerRefreshFunction -import com.willfp.libreforge.registerSpecificHolderProvider -import com.willfp.libreforge.registerSpecificRefreshFunction import com.willfp.reforges.commands.CommandReforge import com.willfp.reforges.commands.CommandReforges import com.willfp.reforges.config.TargetYml import com.willfp.reforges.display.ReforgesDisplay -import com.willfp.reforges.integrations.talismans.TalismansIntegration import com.willfp.reforges.libreforge.ConditionHasReforge +import com.willfp.reforges.reforges.ReforgeFinder import com.willfp.reforges.reforges.Reforges import com.willfp.reforges.reforges.util.ReforgeArgParser import com.willfp.reforges.util.AntiPlaceListener import com.willfp.reforges.util.DiscoverRecipeListener -import com.willfp.reforges.util.ReforgeLookup -import org.bukkit.entity.Player import org.bukkit.event.Listener class ReforgesPlugin : LibreforgePlugin() { val targetYml: TargetYml = TargetYml(this) + val reforgeFinder = ReforgeFinder(this) + init { instance = this } @@ -44,13 +40,7 @@ class ReforgesPlugin : LibreforgePlugin() { Items.registerArgParser(ReforgeArgParser) - registerSpecificHolderProvider { - ReforgeLookup.provideReforges(it) - } - - registerSpecificRefreshFunction { - ReforgeLookup.clearCache(it) - } + registerHolderProvider(reforgeFinder.toHolderProvider()) } override fun loadListeners(): List { @@ -71,12 +61,6 @@ class ReforgesPlugin : LibreforgePlugin() { return ReforgesDisplay(this) } - override fun loadIntegrationLoaders(): List { - return listOf( - IntegrationLoader("Talismans") { TalismansIntegration.registerProvider() } - ) - } - companion object { /** * Instance of Reforges. diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/config/TargetYml.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/config/TargetYml.kt index c6f27bf..b33f27b 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/config/TargetYml.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/config/TargetYml.kt @@ -5,8 +5,10 @@ import com.willfp.eco.core.config.ConfigType import com.willfp.eco.core.config.StaticBaseConfig import com.willfp.eco.core.items.Items import com.willfp.eco.core.items.TestableItem -import com.willfp.reforges.reforges.ReforgeTarget -import java.util.* +import com.willfp.libreforge.slot.SlotType +import com.willfp.libreforge.slot.SlotTypes +import com.willfp.libreforge.slot.impl.SlotTypeAny +import java.util.Locale import java.util.function.Consumer class TargetYml(plugin: EcoPlugin) : StaticBaseConfig("target", plugin, ConfigType.YAML) { @@ -37,7 +39,7 @@ class TargetYml(plugin: EcoPlugin) : StaticBaseConfig("target", plugin, ConfigTy * @param target The name of the target. * @return All materials. */ - fun getSlot(target: String): ReforgeTarget.Slot { - return ReforgeTarget.Slot.valueOf(this.getString("$target.slot").uppercase(Locale.getDefault())) + fun getSlot(target: String): SlotType { + return SlotTypes[target] ?: SlotTypeAny } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/integrations/talismans/TalismansIntegration.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/integrations/talismans/TalismansIntegration.kt deleted file mode 100644 index b6e5ea0..0000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/integrations/talismans/TalismansIntegration.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.willfp.reforges.integrations.talismans - -import com.willfp.eco.core.integrations.Integration -import com.willfp.reforges.reforges.ReforgeTarget -import com.willfp.reforges.util.ReforgeLookup -import com.willfp.talismans.talismans.util.TalismanChecks -import org.bukkit.inventory.ItemStack - -object TalismansIntegration : Integration { - @JvmStatic - fun registerProvider() { - ReforgeLookup.registerProvider { player -> - val provided = mutableMapOf() - for (itemStack in TalismanChecks.getTalismanItemsOnPlayer(player)) { - provided[itemStack] = ReforgeTarget.Slot.ANY - } - - provided - } - } - - override fun getPluginName(): String { - return "Talismans" - } -} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/libreforge/ConditionHasReforge.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/libreforge/ConditionHasReforge.kt index b9e1b93..81ad79a 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/libreforge/ConditionHasReforge.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/libreforge/ConditionHasReforge.kt @@ -8,8 +8,9 @@ import com.willfp.libreforge.ProvidedHolder import com.willfp.libreforge.arguments import com.willfp.libreforge.conditions.Condition import com.willfp.libreforge.get +import com.willfp.libreforge.getHoldersOfType +import com.willfp.libreforge.toDispatcher import com.willfp.reforges.reforges.Reforge -import com.willfp.reforges.util.ReforgeLookup import org.bukkit.entity.Player object ConditionHasReforge : Condition("has_reforge") { @@ -25,9 +26,7 @@ object ConditionHasReforge : Condition("has_reforge") { ): Boolean { val player = dispatcher.get() ?: return false - return ReforgeLookup.provideReforges(player) - .map { it.holder } - .filterIsInstance() + return player.toDispatcher().getHoldersOfType() .map { it.id.key } .containsIgnoreCase(config.getString("reforge")) } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeFinder.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeFinder.kt new file mode 100644 index 0000000..990268c --- /dev/null +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeFinder.kt @@ -0,0 +1,19 @@ +package com.willfp.reforges.reforges + +import com.willfp.libreforge.slot.ItemHolderFinder +import com.willfp.libreforge.slot.SlotType +import com.willfp.reforges.ReforgesPlugin +import com.willfp.reforges.util.reforge +import org.bukkit.inventory.ItemStack + +class ReforgeFinder( + private val plugin: ReforgesPlugin +): ItemHolderFinder() { + override fun find(item: ItemStack): List { + return listOfNotNull(item.reforge) + } + + override fun isValidInSlot(holder: Reforge, slot: SlotType): Boolean { + return slot in holder.targets.map { it.slot }.toSet() + } +} diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTarget.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTarget.kt index 874f607..230b0e1 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTarget.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTarget.kt @@ -2,12 +2,13 @@ package com.willfp.reforges.reforges import com.willfp.eco.core.items.TestableItem import com.willfp.eco.core.recipe.parts.EmptyTestableItem +import com.willfp.libreforge.slot.SlotType import org.bukkit.inventory.ItemStack -import java.util.* +import java.util.Objects class ReforgeTarget( val id: String, - val slot: Slot, + val slot: SlotType, val items: MutableSet ) { init { @@ -34,10 +35,4 @@ class ReforgeTarget( override fun hashCode(): Int { return Objects.hash(this.id) } - - enum class Slot { - HANDS, - ARMOR, - ANY - } } diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTargets.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTargets.kt index 101b77f..e8b5bc7 100644 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTargets.kt +++ b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/reforges/ReforgeTargets.kt @@ -2,13 +2,14 @@ package com.willfp.reforges.reforges import com.google.common.collect.ImmutableSet import com.willfp.eco.core.config.updating.ConfigUpdater +import com.willfp.libreforge.slot.impl.SlotTypeAny import com.willfp.reforges.ReforgesPlugin import org.bukkit.inventory.ItemStack object ReforgeTargets { private val registered = mutableMapOf() - val ALL = ReforgeTarget("all", ReforgeTarget.Slot.ANY, HashSet()) + val ALL = ReforgeTarget("all", SlotTypeAny, HashSet()) init { registered["all"] = ALL diff --git a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/util/ReforgeLookup.kt b/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/util/ReforgeLookup.kt deleted file mode 100644 index 300935a..0000000 --- a/eco-core/core-plugin/src/main/kotlin/com/willfp/reforges/util/ReforgeLookup.kt +++ /dev/null @@ -1,107 +0,0 @@ -package com.willfp.reforges.util - -import com.github.benmanes.caffeine.cache.Caffeine -import com.willfp.libreforge.ItemProvidedHolder -import com.willfp.reforges.ReforgesPlugin -import com.willfp.reforges.reforges.ReforgeTarget -import org.bukkit.entity.Player -import org.bukkit.inventory.ItemStack -import java.util.concurrent.TimeUnit - -typealias SlotProvider = (Player) -> Map - -object ReforgeLookup { - private val plugin = ReforgesPlugin.instance - private val slotProviders = mutableSetOf<(Player) -> Map>() - - private val itemCache = Caffeine.newBuilder() - .expireAfterWrite(2, TimeUnit.SECONDS) - .build>() - - private val reforgeCache = Caffeine.newBuilder() - .expireAfterWrite(2, TimeUnit.SECONDS) - .build>() - - @JvmStatic - fun registerProvider(provider: SlotProvider) { - slotProviders.add { - val found = mutableMapOf() - for ((item, slot) in provider(it)) { - if (item != null && slot != null) { - found[item] = slot - } - } - found - } - } - - private fun provide(player: Player): Map { - return itemCache.get(player) { - val found = mutableMapOf() - for (provider in slotProviders) { - found.putAll(provider(player)) - } - - found - } - } - - fun provideReforges(player: Player): List { - return reforgeCache.get(player) { - val found = mutableListOf() - - for ((itemStack, slot) in provide(player)) { - val reforge = itemStack.reforge ?: continue - if (slot != ReforgeTarget.Slot.ANY) { - if (!reforge.targets.map { it.slot }.contains(slot)) { - continue - } - } - found.add( - ItemProvidedHolder( - reforge, - itemStack - ) - ) - } - - found - }.toList() - } - - fun clearCache(player: Player) { - itemCache.invalidate(player) - reforgeCache.invalidate(player) - } - - init { - registerProvider { - mapOf( - Pair( - it.inventory.itemInMainHand, - ReforgeTarget.Slot.HANDS - ) - ) - } - - if (!plugin.configYml.getBool("no-offhand")) { - registerProvider { - mapOf( - Pair( - it.inventory.itemInOffHand, - ReforgeTarget.Slot.HANDS - ) - ) - } - } - - - registerProvider { - val items = mutableMapOf() - for (stack in it.inventory.armorContents) { - items[stack] = ReforgeTarget.Slot.ARMOR - } - items - } - } -} diff --git a/eco-core/core-plugin/src/main/resources/plugin.yml b/eco-core/core-plugin/src/main/resources/plugin.yml index c3d9b48..d9c6ffd 100644 --- a/eco-core/core-plugin/src/main/resources/plugin.yml +++ b/eco-core/core-plugin/src/main/resources/plugin.yml @@ -8,7 +8,6 @@ depend: - eco softdepend: - libreforge - - Talismans commands: reforges: diff --git a/eco-core/core-plugin/src/main/resources/target.yml b/eco-core/core-plugin/src/main/resources/target.yml index a689d09..bb3d259 100644 --- a/eco-core/core-plugin/src/main/resources/target.yml +++ b/eco-core/core-plugin/src/main/resources/target.yml @@ -1,11 +1,10 @@ # # A target consists of items and a slot. -# The slot is either hands, armor, or any. -# Hands means the reforge will activate on hands, armor -# means it will only work on armor, and any -# means it will activate whenever its on the player. # +# The options for slot are mainhand, offhand, hands, helmet, chestplate, +# leggings, boots, armor, any, a number from 0-40 (to specify an exact slot), +# or a list of slots like "9, 10, 11, mainhand" pickaxe: slot: hands