Item.kt

Branches > main > 743d568 > files / src / main / kotlin / net / bowmap / server / item / Item.kt

package net.bowmap.server.item

import net.kyori.adventure.text.Component
import org.bukkit.inventory.ItemStack
import org.bukkit.Material
import kotlinx.collections.immutable.*

// Bowmap's Item type

// Either a material or a custommodeldata
data class Texture(val material: Material? = null, val customModelData: Int? = null) {
  init {
    require(material != null || customModelData != null) { "Texture requires either a material or custom model data" }
  }
}

data class Item(
  val material: Material,
  val amount: Int = 1,
  val texture: Texture = Texture(material = material),
  val name: Component,
  val lore: PersistentList<Component> = persistentListOf()
)

fun toItemStack(item: Item): ItemStack {
  // TODO custommodeldata
  val itemStack = ItemStack(item.material, item.amount)
  val meta = itemStack.getItemMeta()

  // itemName is not editable via an anvil, which is the desired behavior
  // TODO make sure its not italics!
  meta.itemName(item.name)
  if (item.lore.isNotEmpty()) {
    // TODO Make sure it's not purple and italics...
    meta.lore(item.lore)
  }

  itemStack.setItemMeta(meta)
  return itemStack
}

fun toItem(itemStack: ItemStack): Item {
  // TODO custommodeldata
  // See the above itemName comment
  val meta = itemStack.getItemMeta()
  val lore = meta.lore()?.toPersistentList() ?: persistentListOf()
  return Item(
    material = itemStack.type,
    amount = itemStack.amount,
    name = meta.itemName(),
    lore = lore
  )
}