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)
}
|