feat: Introduce item tiers, integrate them into special item creation and behavior, and update the /hcu give command to support tier specification.

This commit is contained in:
Kariya 2025-12-08 06:37:17 +00:00
parent 7ca1092d6d
commit 553f4589a6
4 changed files with 92 additions and 11 deletions

View File

@ -8,6 +8,7 @@ import org.bukkit.permissions.PermissionDefault
import org.bukkit.entity.Player import org.bukkit.entity.Player
import net.hareworks.hcu.items.domain.ItemRegistry import net.hareworks.hcu.items.domain.ItemRegistry
import net.hareworks.hcu.items.domain.SpecialItem import net.hareworks.hcu.items.domain.SpecialItem
import net.hareworks.hcu.items.domain.Tier
object CommandRegistrar { object CommandRegistrar {
fun register(plugin: App, permits: MutationSession): KommandLib { fun register(plugin: App, permits: MutationSession): KommandLib {
@ -62,8 +63,48 @@ object CommandRegistrar {
return@executes return@executes
} }
sender.inventory.addItem(item.createItemStack()) sender.inventory.addItem(item.createItemStack(Tier.ONE))
sender.sendMessage("Given $itemId to yourself.") sender.sendMessage("Given $itemId (Tier 1) to yourself.")
}
integer("tier", min = 1, max = 5) {
executes {
val sender = sender
if (sender !is Player) {
sender.sendMessage("Only players can use this command without a target.")
return@executes
}
val itemId = argument<String>("itemId")
val tierLevel = argument<Int>("tier")
val item = ItemRegistry.get(itemId)
val tier = Tier.fromLevel(tierLevel) ?: Tier.ONE
if (item == null) {
sender.sendMessage("Unknown item: $itemId")
return@executes
}
sender.inventory.addItem(item.createItemStack(tier))
sender.sendMessage("Given $itemId (Tier ${tier.level}) to yourself.")
}
player("target") {
executes {
val target = argument<Player>("target")
val itemId = argument<String>("itemId")
val tierLevel = argument<Int>("tier")
val item = ItemRegistry.get(itemId)
val tier = Tier.fromLevel(tierLevel) ?: Tier.ONE
if (item == null) {
sender.sendMessage("Unknown item: $itemId")
return@executes
}
target.inventory.addItem(item.createItemStack(tier))
sender.sendMessage("Given $itemId (Tier ${tier.level}) to ${target.name}.")
}
}
} }
player("target") { player("target") {
@ -77,8 +118,8 @@ object CommandRegistrar {
return@executes return@executes
} }
target.inventory.addItem(item.createItemStack()) target.inventory.addItem(item.createItemStack(Tier.ONE))
sender.sendMessage("Given $itemId to ${target.name}.") sender.sendMessage("Given $itemId (Tier 1) to ${target.name}.")
} }
} }
} }

View File

@ -15,13 +15,15 @@ abstract class SpecialItem(val id: String) {
/** /**
* Creates a new ItemStack for this special item. * Creates a new ItemStack for this special item.
* Subclasses should override [buildItem] to define the item's properties. * Subclasses should override [buildItem] to define the item's properties.
* @param tier The tier of the item to create. Defaults to [Tier.ONE].
*/ */
fun createItemStack(): ItemStack { fun createItemStack(tier: Tier = Tier.ONE): ItemStack {
val item = buildItem() val item = buildItem(tier)
val meta = item.itemMeta ?: return item val meta = item.itemMeta ?: return item
// Tag the item as a special HCU item // Tag the item as a special HCU item
meta.persistentDataContainer.set(KEY_HCU_ITEM_ID, PersistentDataType.STRING, id) meta.persistentDataContainer.set(KEY_HCU_ITEM_ID, PersistentDataType.STRING, id)
meta.persistentDataContainer.set(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER, tier.level)
item.itemMeta = meta item.itemMeta = meta
return item return item
@ -30,8 +32,9 @@ abstract class SpecialItem(val id: String) {
/** /**
* Builds the base ItemStack. * Builds the base ItemStack.
* This method should configure the material, name, lore, etc. * This method should configure the material, name, lore, etc.
* @param tier The tier of the item being built.
*/ */
protected abstract fun buildItem(): ItemStack protected abstract fun buildItem(tier: Tier): ItemStack
/** /**
* Called when a player interacts with this item. * Called when a player interacts with this item.
@ -40,6 +43,7 @@ abstract class SpecialItem(val id: String) {
companion object { companion object {
val KEY_HCU_ITEM_ID = NamespacedKey("hcu_items", "id") val KEY_HCU_ITEM_ID = NamespacedKey("hcu_items", "id")
val KEY_HCU_ITEM_TIER = NamespacedKey("hcu_items", "tier")
/** /**
* Checks if the given item is a special HCU item. * Checks if the given item is a special HCU item.
@ -56,5 +60,14 @@ abstract class SpecialItem(val id: String) {
if (item == null || item.type.isAir) return null if (item == null || item.type.isAir) return null
return item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_ID, PersistentDataType.STRING) return item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_ID, PersistentDataType.STRING)
} }
/**
* Gets the Tier of the given item. Defaults to [Tier.ONE] if not found/valid.
*/
fun getTier(item: ItemStack?): Tier {
if (item == null || item.type.isAir) return Tier.ONE
val level = item.itemMeta?.persistentDataContainer?.get(KEY_HCU_ITEM_TIER, PersistentDataType.INTEGER) ?: return Tier.ONE
return Tier.fromLevel(level) ?: Tier.ONE
}
} }
} }

View File

@ -0,0 +1,18 @@
package net.hareworks.hcu.items.domain
import net.kyori.adventure.text.format.NamedTextColor
import net.kyori.adventure.text.format.TextColor
enum class Tier(val level: Int, val color: TextColor) {
ONE(1, NamedTextColor.WHITE),
TWO(2, NamedTextColor.GREEN),
THREE(3, NamedTextColor.AQUA),
FOUR(4, NamedTextColor.LIGHT_PURPLE),
FIVE(5, NamedTextColor.GOLD);
companion object {
fun fromLevel(level: Int): Tier? {
return entries.find { it.level == level }
}
}
}

View File

@ -1,19 +1,21 @@
package net.hareworks.hcu.items.domain.impl package net.hareworks.hcu.items.domain.impl
import net.hareworks.hcu.items.domain.SpecialItem import net.hareworks.hcu.items.domain.SpecialItem
import net.hareworks.hcu.items.domain.Tier
import net.kyori.adventure.text.Component import net.kyori.adventure.text.Component
import net.kyori.adventure.text.format.NamedTextColor import net.kyori.adventure.text.format.NamedTextColor
import org.bukkit.Material import org.bukkit.Material
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
class TestItem : SpecialItem("test_sword") { class TestItem : SpecialItem("test_sword") {
override fun buildItem(): ItemStack { override fun buildItem(tier: Tier): ItemStack {
val item = ItemStack(Material.DIAMOND_SWORD) val item = ItemStack(Material.DIAMOND_SWORD)
val meta = item.itemMeta ?: return item val meta = item.itemMeta ?: return item
meta.displayName(Component.text("Test Sword", NamedTextColor.GOLD)) meta.displayName(Component.text("Test Sword ${tier.level}", tier.color))
meta.lore(listOf( meta.lore(listOf(
Component.text("A special sword for testing purposes.", NamedTextColor.GRAY) Component.text("A special sword for testing purposes.", NamedTextColor.GRAY),
Component.text("Tier: ${tier.name}", tier.color)
)) ))
item.itemMeta = meta item.itemMeta = meta
@ -21,6 +23,13 @@ class TestItem : SpecialItem("test_sword") {
} }
override fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) { override fun onInteract(event: org.bukkit.event.player.PlayerInteractEvent) {
event.player.sendMessage(Component.text("You used the Test Sword!", NamedTextColor.GREEN)) val item = event.item
val tier = SpecialItem.getTier(item)
event.player.sendMessage(Component.text("You used the Test Sword (Tier ${tier.level})!", tier.color))
if (tier.level >= 3) {
event.player.sendMessage(Component.text("High tier bonus activated!", NamedTextColor.GOLD))
}
} }
} }