Skip to content

Commit a101289

Browse files
authored
Merge branch 'Auxilor:master' into master
2 parents d5870e5 + 5c422ac commit a101289

File tree

10 files changed

+90
-443
lines changed

10 files changed

+90
-443
lines changed

eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/EcoEnchantsPlugin.kt

+7-17
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@ import com.willfp.ecoenchants.display.EnchantSorter
1717
import com.willfp.ecoenchants.enchant.EcoEnchantLevel
1818
import com.willfp.ecoenchants.enchant.EcoEnchants
1919
import com.willfp.ecoenchants.enchant.EnchantGUI
20-
import com.willfp.ecoenchants.enchant.FoundEcoEnchantLevel
2120
import com.willfp.ecoenchants.enchant.LoreConversion
2221
import com.willfp.ecoenchants.enchant.legacyRegisterVanillaEnchantmentData
2322
import com.willfp.ecoenchants.enchant.registration.EnchantmentRegisterer
@@ -32,15 +31,15 @@ import com.willfp.ecoenchants.mechanics.ExtraItemSupport
3231
import com.willfp.ecoenchants.mechanics.GrindstoneSupport
3332
import com.willfp.ecoenchants.mechanics.LootSupport
3433
import com.willfp.ecoenchants.mechanics.VillagerSupport
35-
import com.willfp.ecoenchants.target.EnchantLookup.clearEnchantCache
36-
import com.willfp.ecoenchants.target.EnchantLookup.heldEnchantLevels
34+
import com.willfp.ecoenchants.target.EnchantFinder
35+
import com.willfp.ecoenchants.target.EnchantFinder.clearEnchantmentCache
3736
import com.willfp.libreforge.NamedValue
3837
import com.willfp.libreforge.loader.LibreforgePlugin
3938
import com.willfp.libreforge.loader.configs.ConfigCategory
4039
import com.willfp.libreforge.registerHolderPlaceholderProvider
41-
import com.willfp.libreforge.registerSpecificHolderProvider
40+
import com.willfp.libreforge.registerHolderProvider
4241
import com.willfp.libreforge.registerSpecificRefreshFunction
43-
import org.bukkit.entity.Player
42+
import org.bukkit.entity.LivingEntity
4443
import org.bukkit.event.Listener
4544

4645
internal lateinit var plugin: EcoEnchantsPlugin
@@ -75,19 +74,10 @@ class EcoEnchantsPlugin : LibreforgePlugin() {
7574
}
7675

7776
override fun handleEnable() {
78-
registerSpecificHolderProvider<Player> {
79-
it.heldEnchantLevels
80-
}
81-
82-
registerSpecificRefreshFunction<Player> {
83-
it.clearEnchantCache()
84-
}
77+
registerHolderProvider(EnchantFinder.toHolderProvider())
8578

86-
registerHolderPlaceholderProvider<FoundEcoEnchantLevel> { it, _ ->
87-
listOf(
88-
NamedValue("level", it.level.level),
89-
NamedValue("active_level", it.activeLevel)
90-
)
79+
registerSpecificRefreshFunction<LivingEntity> {
80+
it.clearEnchantmentCache()
9181
}
9282

9383
registerHolderPlaceholderProvider<EcoEnchantLevel> { it, _ ->

eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/enchant/EcoEnchantLevel.kt

-9
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,3 @@ class EcoEnchantLevel(
3131
return Objects.hash(this.id)
3232
}
3333
}
34-
35-
data class FoundEcoEnchantLevel(
36-
val level: EcoEnchantLevel,
37-
val activeLevel: Int
38-
): Holder {
39-
override val effects = level.effects
40-
override val conditions = level.conditions
41-
override val id = level.id
42-
}

eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/enchant/impl/hardcoded/EnchantmentRepairing.kt

+5-13
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ package com.willfp.ecoenchants.enchant.impl.hardcoded
33
import com.willfp.eco.util.DurabilityUtils
44
import com.willfp.ecoenchants.EcoEnchantsPlugin
55
import com.willfp.ecoenchants.enchant.impl.HardcodedEcoEnchant
6-
import com.willfp.ecoenchants.target.EnchantLookup.getActiveEnchantLevelInSlot
7-
import com.willfp.ecoenchants.target.EnchantLookup.hasEnchantActive
6+
import com.willfp.ecoenchants.target.EnchantFinder.getItemsWithEnchantActive
7+
import com.willfp.ecoenchants.target.EnchantFinder.hasEnchantActive
88
import com.willfp.libreforge.slot.impl.SlotTypeHands
99
import org.bukkit.Bukkit
1010

@@ -29,18 +29,10 @@ class EnchantmentRepairing(
2929
if (player.hasEnchantActive(this)) {
3030
val repairPerLevel = config.getIntFromExpression("repair-per-level", player)
3131

32-
for ((slot, item) in player.inventory.withIndex()) {
33-
if (item == null) {
34-
continue
35-
}
36-
37-
if (notWhileHolding && slot in SlotTypeHands.getItemSlots(player)) {
38-
continue
39-
}
40-
41-
val level = player.getActiveEnchantLevelInSlot(this, slot)
32+
for ((item, level) in player.getItemsWithEnchantActive(this)) {
33+
val isHolding = item in SlotTypeHands.getItems(player)
4234

43-
if (level == 0) {
35+
if (notWhileHolding && isHolding) {
4436
continue
4537
}
4638

eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/enchant/impl/hardcoded/EnchantmentReplenish.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import com.willfp.eco.core.EcoPlugin
44
import com.willfp.ecoenchants.EcoEnchantsPlugin
55
import com.willfp.ecoenchants.enchant.EcoEnchant
66
import com.willfp.ecoenchants.enchant.impl.HardcodedEcoEnchant
7-
import com.willfp.ecoenchants.target.EnchantLookup.hasEnchantActive
7+
import com.willfp.ecoenchants.target.EnchantFinder.hasEnchantActive
88
import org.bukkit.Bukkit
99
import org.bukkit.Material
1010
import org.bukkit.block.BlockFace

eco-core/core-plugin/src/main/kotlin/com/willfp/ecoenchants/enchant/impl/hardcoded/EnchantmentSoulbound.kt

+2-22
Original file line numberDiff line numberDiff line change
@@ -11,16 +11,14 @@ import com.willfp.eco.core.items.Items
1111
import com.willfp.ecoenchants.EcoEnchantsPlugin
1212
import com.willfp.ecoenchants.enchant.EcoEnchant
1313
import com.willfp.ecoenchants.enchant.impl.HardcodedEcoEnchant
14-
import com.willfp.ecoenchants.target.EnchantLookup.getActiveEnchantLevelInSlot
15-
import com.willfp.ecoenchants.target.EnchantLookup.hasEnchantActive
14+
import com.willfp.ecoenchants.target.EnchantFinder.getItemsWithEnchantActive
1615
import org.bukkit.entity.Player
1716
import org.bukkit.event.EventHandler
1817
import org.bukkit.event.EventPriority
1918
import org.bukkit.event.Listener
2019
import org.bukkit.event.entity.PlayerDeathEvent
2120
import org.bukkit.event.player.PlayerJoinEvent
2221
import org.bukkit.event.player.PlayerRespawnEvent
23-
import org.bukkit.inventory.ItemStack
2422
import org.bukkit.persistence.PersistentDataType
2523

2624
class EnchantmentSoulbound(
@@ -61,25 +59,7 @@ class EnchantmentSoulbound(
6159
}
6260

6361
val player = event.entity
64-
val items = mutableListOf<ItemStack>()
65-
66-
if (!player.hasEnchantActive(enchant)) {
67-
return
68-
}
69-
70-
for ((slot, item) in player.inventory.withIndex()) {
71-
if (item == null) {
72-
continue
73-
}
74-
75-
val level = player.getActiveEnchantLevelInSlot(enchant, slot)
76-
77-
if (level == 0) {
78-
continue
79-
}
80-
81-
items.add(item)
82-
}
62+
val items = player.getItemsWithEnchantActive(enchant).keys
8363

8464
if (items.isEmpty()) {
8565
return
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
package com.willfp.ecoenchants.target
2+
3+
import com.github.benmanes.caffeine.cache.Caffeine
4+
import com.willfp.eco.core.fast.fast
5+
import com.willfp.ecoenchants.enchant.EcoEnchant
6+
import com.willfp.ecoenchants.enchant.EcoEnchantLevel
7+
import com.willfp.libreforge.ProvidedHolder
8+
import com.willfp.libreforge.slot.ItemHolderFinder
9+
import com.willfp.libreforge.slot.SlotType
10+
import com.willfp.libreforge.toDispatcher
11+
import org.bukkit.entity.LivingEntity
12+
import org.bukkit.inventory.ItemStack
13+
import java.util.UUID
14+
import java.util.concurrent.TimeUnit
15+
16+
object EnchantFinder : ItemHolderFinder<EcoEnchantLevel>() {
17+
private val provider = this.toHolderProvider()
18+
private val levelCache = Caffeine.newBuilder()
19+
.expireAfterWrite(1, TimeUnit.SECONDS)
20+
.build<UUID, List<ProvidedLevel>>()
21+
22+
override fun find(item: ItemStack): List<EcoEnchantLevel> {
23+
val enchantMap = item.fast().enchants
24+
val enchants = mutableListOf<EcoEnchantLevel>()
25+
26+
for ((enchant, level) in enchantMap) {
27+
if (enchant !is EcoEnchant) {
28+
continue
29+
}
30+
31+
enchants += enchant.getLevel(level)
32+
}
33+
34+
return enchants
35+
}
36+
37+
override fun isValidInSlot(holder: EcoEnchantLevel, slot: SlotType): Boolean {
38+
return slot in holder.enchant.targets.map { it.slot }
39+
}
40+
41+
internal fun LivingEntity.clearEnchantmentCache() = levelCache.invalidate(this.uniqueId)
42+
43+
private val LivingEntity.cachedLevels: List<ProvidedLevel>
44+
get() = levelCache.get(this.uniqueId) {
45+
provider.provide(this.toDispatcher())
46+
.mapNotNull {
47+
val level = it.holder as? EcoEnchantLevel ?: return@mapNotNull null
48+
val item = it.provider as? ItemStack ?: return@mapNotNull null
49+
50+
ProvidedLevel(level, item, it)
51+
}
52+
}
53+
54+
fun LivingEntity.hasEnchantActive(enchant: EcoEnchant): Boolean {
55+
return this.cachedLevels
56+
.filter { it.level.enchant == enchant }
57+
.any { it.level.conditions.areMet(this.toDispatcher(), it.holder) }
58+
}
59+
60+
fun LivingEntity.getItemsWithEnchantActive(enchant: EcoEnchant): Map<ItemStack, Int> {
61+
return this.cachedLevels
62+
.filter { it.level.enchant == enchant }
63+
.filter { it.level.conditions.areMet(this.toDispatcher(), it.holder) }
64+
.associate { it.item to it.level.level }
65+
}
66+
67+
private data class ProvidedLevel(
68+
val level: EcoEnchantLevel,
69+
val item: ItemStack,
70+
val holder: ProvidedHolder
71+
)
72+
}

0 commit comments

Comments
 (0)