summaryrefslogtreewikicommitdiff
path: root/bukkit/src/Item.kt
blob: 40646e22906c455ee5abcdec903ea61edee17709 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
package cat.freya.khs.bukkit

import cat.freya.khs.config.EffectConfig
import cat.freya.khs.config.ItemConfig
import cat.freya.khs.world.Effect as KhsEffect
import cat.freya.khs.world.Item as KhsItem
import com.cryptomorin.xseries.XItemStack
import com.cryptomorin.xseries.XMaterial
import kotlin.collections.emptyMap
import org.bukkit.configuration.file.YamlConfiguration
import org.bukkit.inventory.ItemStack
import org.bukkit.inventory.meta.SkullMeta
import org.bukkit.potion.PotionEffect

class BukkitKhsItem(val inner: ItemStack, override val config: ItemConfig) : KhsItem {
    override val name: String? = inner.itemMeta?.displayName
    override val material: String = inner.type?.name ?: "NONE"

    override fun clone(): KhsItem = BukkitKhsItem(inner, config)

    override fun similar(config: ItemConfig): Boolean {
        var item = parseBukkitItem(config) ?: return false
        return inner.isSimilar(item.inner)
    }

    override fun similar(material: String): Boolean {
        val xMaterial = XMaterial.matchXMaterial(material).orElse(null) ?: return false
        return xMaterial.isSimilar(inner)
    }
}

class BukkitKhsEffect(val inner: PotionEffect, override val config: EffectConfig) : KhsEffect {
    @Suppress("DEPRECATION") override val name: String? = inner.type.name

    override fun clone(): KhsEffect = BukkitKhsEffect(inner, config)
}

fun parseBukkitItem(itemConfig: ItemConfig): BukkitKhsItem? {
    var config = YamlConfiguration().createSection("temp")
    var materialParts = itemConfig.material.uppercase().split(":")
    var material = materialParts.first()

    // set name and material
    config.set("name", itemConfig.name?.let { formatText(it) })
    config.set("material", material)
    if (!itemConfig.lore.isEmpty()) config.set("lore", itemConfig.lore.map { formatText(it) })
    config.set("unbreakable", itemConfig.unbreakable ?: false)

    // parse enchantments
    var enchantments = YamlConfiguration().createSection("enchantments")
    for ((enchantment, value) in itemConfig.enchantments) enchantments.set(
        enchantment,
        value.toInt(),
    )
    config.set("enchants", enchantments)

    // set custom model data (1.14+)
    if (itemConfig.modelData != null) config.set("model-data", itemConfig.modelData?.toInt())

    // TODO: potions are broken on 1.8

    // set potion data
    if (material.endsWith("POTION")) {
        var potionType = materialParts.getOrNull(1) ?: "AKWARD"
        config.set("base-type", potionType)
    }

    val item = runCatching {
        val item = (XItemStack.Deserializer()).withConfig(config).read() ?: return null

        // set player head owner (if skull)
        if (itemConfig.owner != null && itemConfig.material == "PLAYER_HEAD") {
            val meta = item.itemMeta as SkullMeta
            meta.setOwner(itemConfig.owner)
            item.itemMeta = meta
        }

        BukkitKhsItem(item, itemConfig)
    }

    return item.getOrDefault(null)
}

fun toKhsItem(inner: ItemStack?): BukkitKhsItem? {
    if (inner == null) return null

    val config = ItemConfig()
    config.name = inner.itemMeta?.displayName
    config.material = inner.type?.name ?: "NONE"
    config.lore = inner.itemMeta?.lore ?: listOf()
    @Suppress("DEPRECATION")
    config.enchantments =
        inner.itemMeta?.enchants?.mapKeys { it.key.name }?.mapValues { it.value.toUInt() }
            ?: emptyMap()
    config.unbreakable = inner.itemMeta?.isUnbreakable
    return BukkitKhsItem(inner, config)
}