From b476368425d03a89c02657140d2d64752ebcbcc5 Mon Sep 17 00:00:00 2001 From: Kariya Date: Thu, 11 Dec 2025 12:59:52 +0000 Subject: [PATCH] refactor: Replace `SpecialItem` with `CustomItem` interface and `AbstractItem` class. --- .../item/{SpecialItem.kt => AbstractItem.kt} | 22 +++++-------------- .../hcu/items/api/item/CustomItem.kt | 19 ++++++++++++++++ .../hcu/items/command/CommandRegistrar.kt | 3 ++- .../hcu/items/content/items/GrapplingItem.kt | 10 ++++----- .../hcu/items/content/items/TestItem.kt | 6 ++--- .../hcu/items/listeners/EventListener.kt | 14 ++++++------ .../hcu/items/registry/ItemRegistry.kt | 10 ++++----- 7 files changed, 46 insertions(+), 38 deletions(-) rename src/main/kotlin/net/hareworks/hcu/items/api/item/{SpecialItem.kt => AbstractItem.kt} (70%) create mode 100644 src/main/kotlin/net/hareworks/hcu/items/api/item/CustomItem.kt diff --git a/src/main/kotlin/net/hareworks/hcu/items/api/item/SpecialItem.kt b/src/main/kotlin/net/hareworks/hcu/items/api/item/AbstractItem.kt similarity index 70% rename from src/main/kotlin/net/hareworks/hcu/items/api/item/SpecialItem.kt rename to src/main/kotlin/net/hareworks/hcu/items/api/item/AbstractItem.kt index 997efb5..96d7043 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/api/item/SpecialItem.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/api/item/AbstractItem.kt @@ -5,12 +5,12 @@ import org.bukkit.NamespacedKey import org.bukkit.inventory.ItemStack import org.bukkit.persistence.PersistentDataType -abstract class SpecialItem(val id: String) { +abstract class AbstractItem(override val id: String) : CustomItem { - open val maxTier: Int = 5 - open val minTier: Int = 1 + override val maxTier: Int = 5 + override val minTier: Int = 1 - fun createItemStack(tier: Tier = Tier.ONE): ItemStack { + override fun createItemStack(tier: Tier): ItemStack { val validTier = if (tier.level < minTier) Tier.fromLevel(minTier) else if (tier.level > maxTier) Tier.fromLevel(maxTier) else tier @@ -27,23 +27,11 @@ abstract class SpecialItem(val id: String) { protected abstract fun buildItem(tier: Tier): ItemStack - open fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) {} - - open fun onFish(event: org.bukkit.event.player.PlayerFishEvent) {} - - open fun onProjectileHit(event: org.bukkit.event.entity.ProjectileHitEvent) {} - - open fun onProjectileLaunch(event: org.bukkit.event.entity.ProjectileLaunchEvent) {} - - open fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {} - - open fun onPlayerMove(event: org.bukkit.event.player.PlayerMoveEvent) {} - companion object { val KEY_HCU_ITEM_ID = NamespacedKey("hcu_items", "id") val KEY_HCU_ITEM_TIER = NamespacedKey("hcu_items", "tier") - fun isSpecialItem(item: ItemStack?): Boolean { + fun isCustomItem(item: ItemStack?): Boolean { if (item == null || item.type.isAir) return false return item.itemMeta?.persistentDataContainer?.has(KEY_HCU_ITEM_ID, PersistentDataType.STRING) == true } diff --git a/src/main/kotlin/net/hareworks/hcu/items/api/item/CustomItem.kt b/src/main/kotlin/net/hareworks/hcu/items/api/item/CustomItem.kt new file mode 100644 index 0000000..d847a51 --- /dev/null +++ b/src/main/kotlin/net/hareworks/hcu/items/api/item/CustomItem.kt @@ -0,0 +1,19 @@ +package net.hareworks.hcu.items.api.item + +import net.hareworks.hcu.items.api.Tier +import org.bukkit.inventory.ItemStack + +interface CustomItem { + val id: String + val maxTier: Int + val minTier: Int + + fun createItemStack(tier: Tier = Tier.ONE): ItemStack + + fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) {} + fun onFish(event: org.bukkit.event.player.PlayerFishEvent) {} + fun onProjectileHit(event: org.bukkit.event.entity.ProjectileHitEvent) {} + fun onProjectileLaunch(event: org.bukkit.event.entity.ProjectileLaunchEvent) {} + fun onEntityDamage(event: org.bukkit.event.entity.EntityDamageEvent) {} + fun onPlayerMove(event: org.bukkit.event.player.PlayerMoveEvent) {} +} diff --git a/src/main/kotlin/net/hareworks/hcu/items/command/CommandRegistrar.kt b/src/main/kotlin/net/hareworks/hcu/items/command/CommandRegistrar.kt index 97696d2..ca725dc 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/command/CommandRegistrar.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/command/CommandRegistrar.kt @@ -7,7 +7,7 @@ import net.hareworks.permits_lib.bukkit.MutationSession import org.bukkit.permissions.PermissionDefault import org.bukkit.entity.Player import net.hareworks.hcu.items.registry.ItemRegistry -import net.hareworks.hcu.items.api.item.SpecialItem +import net.hareworks.hcu.items.api.item.AbstractItem import net.hareworks.hcu.items.api.Tier import net.hareworks.hcu.items.registry.ComponentRegistry @@ -194,6 +194,7 @@ object CommandRegistrar { sender.sendMessage("Applied component '${component.displayName}' (Tier ${tier.level}) to held item.") } } + } } } } diff --git a/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt b/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt index 1d5322d..a2b6f88 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/content/items/GrapplingItem.kt @@ -1,6 +1,6 @@ package net.hareworks.hcu.items.content.items -import net.hareworks.hcu.items.api.item.SpecialItem +import net.hareworks.hcu.items.api.item.AbstractItem import net.hareworks.hcu.items.api.Tier import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor @@ -9,7 +9,7 @@ import org.bukkit.Material import org.bukkit.event.player.PlayerFishEvent import org.bukkit.inventory.ItemStack -class GrapplingItem : SpecialItem("grappling_hook") { +class GrapplingItem : AbstractItem("grappling_hook") { override fun buildItem(tier: Tier): ItemStack { val item = ItemStack(Material.FISHING_ROD) @@ -53,7 +53,7 @@ class GrapplingItem : SpecialItem("grappling_hook") { val vector = hookLoc.toVector().subtract(playerLoc.toVector()) val item = player.inventory.itemInMainHand - val tier = SpecialItem.getTier(item) + val tier = AbstractItem.getTier(item) val speed = 1.0 + (tier.level * 0.4) @@ -184,7 +184,7 @@ class GrapplingItem : SpecialItem("grappling_hook") { else -> return } - val tier = SpecialItem.getTier(item) + val tier = AbstractItem.getTier(item) val originalDamage = event.damage val reducedDamage = originalDamage / 2.0 @@ -228,7 +228,7 @@ class GrapplingItem : SpecialItem("grappling_hook") { } private fun isGrapplingHook(item: ItemStack): Boolean { - return SpecialItem.getId(item) == "grappling_hook" + return AbstractItem.getId(item) == "grappling_hook" } companion object { diff --git a/src/main/kotlin/net/hareworks/hcu/items/content/items/TestItem.kt b/src/main/kotlin/net/hareworks/hcu/items/content/items/TestItem.kt index 1bbac21..4e7eaf1 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/content/items/TestItem.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/content/items/TestItem.kt @@ -1,13 +1,13 @@ package net.hareworks.hcu.items.content.items -import net.hareworks.hcu.items.api.item.SpecialItem +import net.hareworks.hcu.items.api.item.AbstractItem import net.hareworks.hcu.items.api.Tier import net.kyori.adventure.text.Component import net.kyori.adventure.text.format.NamedTextColor import org.bukkit.Material import org.bukkit.inventory.ItemStack -class TestItem : SpecialItem("test_sword") { +class TestItem : AbstractItem("test_sword") { override fun buildItem(tier: Tier): ItemStack { val item = ItemStack(Material.DIAMOND_SWORD) val meta = item.itemMeta ?: return item @@ -24,7 +24,7 @@ class TestItem : SpecialItem("test_sword") { override fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) { val item = event.item - val tier = SpecialItem.getTier(item) + val tier = AbstractItem.getTier(item) event.player.sendMessage(Component.text("You used the Test Sword (Tier ${tier.level})!", tier.color)) diff --git a/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt b/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt index 8bc396e..91deda2 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/listeners/EventListener.kt @@ -1,7 +1,7 @@ package net.hareworks.hcu.items.listeners import net.hareworks.hcu.items.api.component.CustomComponent -import net.hareworks.hcu.items.api.item.SpecialItem +import net.hareworks.hcu.items.api.item.AbstractItem import net.hareworks.hcu.items.registry.ComponentRegistry import net.hareworks.hcu.items.registry.ItemRegistry import org.bukkit.entity.Player @@ -37,9 +37,9 @@ class EventListener : Listener { val shooter = projectile.shooter if (shooter is Player) { - // For ProjectileHitEvent, SpecialItems often need to check if the projectile belongs to them, + // For ProjectileHitEvent, AbstractItems often need to check if the projectile belongs to them, // which might not be the item currently held by the player. - // Therefore, we iterate through all registered SpecialItems. + // Therefore, we iterate through all registered AbstractItems. ItemRegistry.getAll().forEach { it.onProjectileHit(event) } // CustomComponent interface does not define onProjectileHit, so no dispatchToComponents here. } @@ -84,13 +84,13 @@ class EventListener : Listener { val items = getEquipmentItems(player) for (item in items) { - // SpecialItem interface does not define onToggleSneak. + // AbstractItem interface does not define onToggleSneak. dispatchToComponents(item) { it.onToggleSneak(player, item, event) } } } private fun getEquipmentItems(player: Player): List { - val equipment = player.equipment ?: return emptyList() + val equipment = player.equipment val items = mutableListOf() items.addAll(equipment.armorContents.filterNotNull()) items.add(equipment.itemInMainHand) @@ -98,9 +98,9 @@ class EventListener : Listener { return items.filter { !it.type.isAir } } - private fun dispatchToItem(item: ItemStack, action: (SpecialItem) -> Unit) { + private fun dispatchToItem(item: ItemStack, action: (AbstractItem) -> Unit) { if (item.type.isAir) return - val id = SpecialItem.getId(item) ?: return + val id = AbstractItem.getId(item) ?: return val specialItem = ItemRegistry.get(id) ?: return action(specialItem) } diff --git a/src/main/kotlin/net/hareworks/hcu/items/registry/ItemRegistry.kt b/src/main/kotlin/net/hareworks/hcu/items/registry/ItemRegistry.kt index 8f64361..40fc3b0 100644 --- a/src/main/kotlin/net/hareworks/hcu/items/registry/ItemRegistry.kt +++ b/src/main/kotlin/net/hareworks/hcu/items/registry/ItemRegistry.kt @@ -1,22 +1,22 @@ package net.hareworks.hcu.items.registry -import net.hareworks.hcu.items.api.item.SpecialItem +import net.hareworks.hcu.items.api.item.AbstractItem object ItemRegistry { - private val items = mutableMapOf() + private val items = mutableMapOf() - fun register(item: SpecialItem) { + fun register(item: AbstractItem) { if (items.containsKey(item.id)) { throw IllegalArgumentException("Item with id ${item.id} is already registered") } items[item.id] = item } - fun get(id: String): SpecialItem? { + fun get(id: String): AbstractItem? { return items[id] } - fun getAll(): Collection { + fun getAll(): Collection { return items.values } }