refactor: Replace SpecialItem with CustomItem interface and AbstractItem class.
This commit is contained in:
parent
9bb631df74
commit
b476368425
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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) {}
|
||||
}
|
||||
|
|
@ -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
|
||||
|
||||
|
|
@ -199,4 +199,5 @@ object CommandRegistrar {
|
|||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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))
|
||||
|
||||
|
|
|
|||
|
|
@ -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<ItemStack> {
|
||||
val equipment = player.equipment ?: return emptyList()
|
||||
val equipment = player.equipment
|
||||
val items = mutableListOf<ItemStack>()
|
||||
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)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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<String, SpecialItem>()
|
||||
private val items = mutableMapOf<String, AbstractItem>()
|
||||
|
||||
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<SpecialItem> {
|
||||
fun getAll(): Collection<AbstractItem> {
|
||||
return items.values
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user