diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/ItemStack.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/ItemStack.kt index 5c68d6e6b..a952dff16 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/ItemStack.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/ItemStack.kt @@ -20,6 +20,8 @@ import de.bixilon.kutil.observer.DataObserver.Companion.observed import de.bixilon.minosoft.data.Rarities import de.bixilon.minosoft.data.container.SlotEdit import de.bixilon.minosoft.data.container.stack.property.* +import de.bixilon.minosoft.data.container.stack.property.DisplayProperty.Companion.updateDisplayNbt +import de.bixilon.minosoft.data.container.stack.property.EnchantingProperty.Companion.updateEnchantingNbt import de.bixilon.minosoft.data.registries.item.items.Item import de.bixilon.minosoft.data.text.ChatComponent import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection @@ -166,13 +168,13 @@ class ItemStack { return } // ToDo: This force creates an instance of every property - if (!this.display.updateNbt(nbt)) { + if (!this.updateDisplayNbt(nbt)) { _display = null } if (!this.durability.updateNbt(nbt)) { _durability = null } - if (!this.enchanting.updateNbt(nbt)) { + if (!this.updateEnchantingNbt(nbt)) { _enchanting = null } if (!this.hide.updateNbt(nbt)) { diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/DisplayProperty.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/DisplayProperty.kt index 5bf8f7e1c..f9c8f2396 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/DisplayProperty.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/DisplayProperty.kt @@ -50,21 +50,6 @@ class DisplayProperty( return _customDisplayName == null && lore.isEmpty() && _dyeColor == null } - override fun updateNbt(nbt: MutableJsonObject): Boolean { - val display = nbt.remove(DISPLAY_TAG)?.nullCast() ?: return false - display[DISPLAY_MAME_TAG]?.let { _customDisplayName = ChatComponent.of(it, translator = stack.holder?.connection?.language) } - - display[DISPLAY_LORE_TAG]?.listCast()?.let { - for (line in it) { - this.lore += ChatComponent.of(line, translator = stack.holder?.connection?.language) - } - } - - display[DISPLAY_COLOR_TAG]?.toInt()?.asRGBColor()?.let { this._dyeColor = it } - - return !isDefault() - } - override fun hashCode(): Int { return Objects.hashCode(lore, _customDisplayName, _dyeColor) } @@ -92,5 +77,21 @@ class DisplayProperty( private const val DISPLAY_MAME_TAG = "Name" private const val DISPLAY_LORE_TAG = "Lore" private const val DISPLAY_COLOR_TAG = "color" + + fun ItemStack.updateDisplayNbt(nbt: MutableJsonObject): Boolean { + val display = nbt.remove(DISPLAY_TAG)?.nullCast() ?: return false + display[DISPLAY_MAME_TAG]?.let { this.display._customDisplayName = ChatComponent.of(it, translator = this.holder?.connection?.language) } + + display[DISPLAY_LORE_TAG]?.listCast()?.let { + for (line in it) { + this.display.lore += ChatComponent.of(line, translator = this.holder?.connection?.language) + } + } + + display[DISPLAY_COLOR_TAG]?.toInt()?.asRGBColor()?.let { this.display._dyeColor = it } + if (_display == null) return false + + return !this.display.isDefault() + } } } diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/DurabilityProperty.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/DurabilityProperty.kt index acac718a7..28b0226dc 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/DurabilityProperty.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/DurabilityProperty.kt @@ -59,7 +59,7 @@ class DurabilityProperty( return !_unbreakable && (stack.item.item is DurableItem && _durability == stack.item.item.maxDurability) } - override fun updateNbt(nbt: MutableJsonObject): Boolean { + fun updateNbt(nbt: MutableJsonObject): Boolean { nbt.remove(UNBREAKABLE_TAG)?.toBoolean()?.let { this._unbreakable = it } nbt.remove(DAMAGE_TAG)?.toInt()?.let { if (stack.item.item is DurableItem) this._durability = stack.item.item.maxDurability - it } diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/EnchantingProperty.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/EnchantingProperty.kt index 4045696d9..9c4e5e7cc 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/EnchantingProperty.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/EnchantingProperty.kt @@ -61,26 +61,6 @@ class EnchantingProperty( return _repairCost == 0 && enchantments.isEmpty() } - override fun updateNbt(nbt: MutableJsonObject): Boolean { - nbt.remove(REPAIR_COST_TAG)?.toInt()?.let { _repairCost = it } - - nbt.remove(*ENCHANTMENTS_TAG)?.listCast()?.let { - val registry = stack.holder?.connection?.registries?.enchantment ?: return@let - for (tag in it) { - val enchantmentName = tag[ENCHANTMENT_ID_TAG] - val enchantment = registry[enchantmentName] ?: throw IllegalArgumentException("Unknown enchantment: $enchantmentName") - val level = tag[ENCHANTMENT_LEVEL_TAG]?.toInt() ?: 1 - if (level <= 0) { - continue - } - - enchantments[enchantment] = level - } - } - - return !isDefault() - } - override fun hashCode(): Int { return Objects.hashCode(enchantments, _repairCost) } @@ -111,5 +91,27 @@ class EnchantingProperty( private const val ENCHANTMENT_ID_TAG = "id" private const val ENCHANTMENT_LEVEL_TAG = "lvl" + + + fun ItemStack.updateEnchantingNbt(nbt: MutableJsonObject): Boolean { + nbt.remove(REPAIR_COST_TAG)?.toInt()?.let { enchanting._repairCost = it } + + nbt.remove(*ENCHANTMENTS_TAG)?.listCast()?.let { + val registry = holder?.connection?.registries?.enchantment ?: return@let + for (tag in it) { + val enchantmentName = tag[ENCHANTMENT_ID_TAG] + val enchantment = registry[enchantmentName] ?: throw IllegalArgumentException("Unknown enchantment: $enchantmentName") + val level = tag[ENCHANTMENT_LEVEL_TAG]?.toInt() ?: 1 + if (level <= 0) { + continue + } + + this.enchanting.enchantments[enchantment] = level + } + } + if (_enchanting == null) return false + + return !enchanting.isDefault() + } } } diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/HideProperty.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/HideProperty.kt index 72cc3b247..336830fe3 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/HideProperty.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/HideProperty.kt @@ -72,7 +72,7 @@ class HideProperty( return _hideFlags == 0 } - override fun updateNbt(nbt: MutableJsonObject): Boolean { + fun updateNbt(nbt: MutableJsonObject): Boolean { nbt.remove(HIDE_FLAGS_TAG)?.toInt()?.let { this._hideFlags = it } return !isDefault() } diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/NbtProperty.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/NbtProperty.kt index faf0319e5..2d69d419d 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/NbtProperty.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/NbtProperty.kt @@ -29,7 +29,7 @@ class NbtProperty( return nbt.isEmpty() } - override fun updateNbt(nbt: MutableJsonObject): Boolean { + fun updateNbt(nbt: MutableJsonObject): Boolean { this.nbt.putAll(nbt) return !isDefault() } diff --git a/src/main/java/de/bixilon/minosoft/data/container/stack/property/Property.kt b/src/main/java/de/bixilon/minosoft/data/container/stack/property/Property.kt index dc02648df..cc1c4bde7 100644 --- a/src/main/java/de/bixilon/minosoft/data/container/stack/property/Property.kt +++ b/src/main/java/de/bixilon/minosoft/data/container/stack/property/Property.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * Copyright (C) 2020-2023 Moritz Zwerger * * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. * @@ -14,13 +14,10 @@ package de.bixilon.minosoft.data.container.stack.property import de.bixilon.kutil.json.JsonObject -import de.bixilon.kutil.json.MutableJsonObject interface Property { fun isDefault(): Boolean - fun updateNbt(nbt: MutableJsonObject): Boolean = false - fun getNBT(): JsonObject = emptyMap() }