From a106e1c5b6e79cdb11d3d3148e84606c0714e8a2 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 23 May 2021 15:41:19 +0200 Subject: [PATCH] ItemStack: Replace version with connection --- .../data/commands/parser/ItemStackParser.kt | 2 +- .../entities/block/CampfireBlockEntity.kt | 2 +- .../entities/projectile/LargeFireball.kt | 2 +- .../entities/projectile/SmallFireball.kt | 2 +- .../entities/entities/projectile/ThrownEgg.kt | 2 +- .../entities/projectile/ThrownEnderPearl.kt | 2 +- .../projectile/ThrownExperienceBottle.kt | 2 +- .../entities/projectile/ThrownEyeOfEnder.kt | 2 +- .../entities/projectile/ThrownSnowball.kt | 2 +- .../minosoft/data/inventory/ItemStack.kt | 33 ++++++++++--------- .../enchantment/DefaultEnchantments.kt | 1 + .../mappings/other/containers/Container.kt | 2 +- .../data/mappings/versions/Version.kt | 14 ++++---- .../gui/rendering/chunk/WorldRenderer.kt | 2 +- .../gui/rendering/input/LeftClickHandler.kt | 6 +--- .../network/connection/PlayConnection.kt | 2 +- .../protocol/protocol/PlayInByteBuffer.kt | 6 ++-- 17 files changed, 42 insertions(+), 42 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/data/commands/parser/ItemStackParser.kt b/src/main/java/de/bixilon/minosoft/data/commands/parser/ItemStackParser.kt index b91c69dc4..f1b1bf49f 100644 --- a/src/main/java/de/bixilon/minosoft/data/commands/parser/ItemStackParser.kt +++ b/src/main/java/de/bixilon/minosoft/data/commands/parser/ItemStackParser.kt @@ -41,7 +41,7 @@ class ItemStackParser : CommandParser() { } return ItemStack( item = item, - version = connection.version, + connection = connection, nbt = nbt, ) } diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt index 9f8b8b789..783a99e0b 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt @@ -30,7 +30,7 @@ class CampfireBlockEntity(connection: PlayConnection) : BlockEntity(connection) val itemStack = ItemStack( item = connection.registries.itemRegistry[slot["id"]?.nullCast()!!]!!, - version = connection.version, + connection = connection, count = slot["Count"]?.nullCast()?.toInt() ?: 1, ) diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/LargeFireball.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/LargeFireball.kt index 75e80d98f..0397c97f5 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/LargeFireball.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/LargeFireball.kt @@ -22,7 +22,7 @@ import glm_.vec3.Vec3 class LargeFireball(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : Fireball(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("fire_charge") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/SmallFireball.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/SmallFireball.kt index 2a7da9ae2..a067c6df7 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/SmallFireball.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/SmallFireball.kt @@ -22,7 +22,7 @@ import glm_.vec3.Vec3 class SmallFireball(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : Fireball(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("fire_charge") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEgg.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEgg.kt index ff6ea7fc0..e4d9d44aa 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEgg.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEgg.kt @@ -22,7 +22,7 @@ import glm_.vec3.Vec3 class ThrownEgg(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : ThrowableItemProjectile(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("egg") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEnderPearl.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEnderPearl.kt index 916a5f2e6..c5a725fa7 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEnderPearl.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEnderPearl.kt @@ -22,7 +22,7 @@ import glm_.vec3.Vec3 class ThrownEnderPearl(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : ThrowableItemProjectile(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("ender_pearl") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownExperienceBottle.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownExperienceBottle.kt index 9b6f44834..0315b785b 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownExperienceBottle.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownExperienceBottle.kt @@ -22,7 +22,7 @@ import glm_.vec3.Vec3 class ThrownExperienceBottle(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : ThrowableItemProjectile(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("experience_bottle") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEyeOfEnder.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEyeOfEnder.kt index c26b92799..6982d2fe9 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEyeOfEnder.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownEyeOfEnder.kt @@ -30,7 +30,7 @@ class ThrownEyeOfEnder(connection: PlayConnection, entityType: EntityType, locat get() = entityMetaData.sets.getItemStack(EntityMetaDataFields.THROWN_EYE_OF_ENDER_ITEM) ?: defaultItem val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("ender_eye") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownSnowball.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownSnowball.kt index 5905429b6..84f1ad248 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownSnowball.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/projectile/ThrownSnowball.kt @@ -23,7 +23,7 @@ import glm_.vec3.Vec3 class ThrownSnowball(connection: PlayConnection, entityType: EntityType, location: Vec3, rotation: EntityRotation) : ThrowableItemProjectile(connection, entityType, location, rotation) { override val defaultItem: ItemStack - get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection.version) + get() = ItemStack(connection.registries.itemRegistry[DEFAULT_ITEM]!!, connection) companion object : EntityFactory { private val DEFAULT_ITEM = ResourceLocation("snowball") diff --git a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt index 364472d91..5981eb518 100644 --- a/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt +++ b/src/main/java/de/bixilon/minosoft/data/inventory/ItemStack.kt @@ -26,8 +26,8 @@ import de.bixilon.minosoft.data.inventory.ItemNBTValues.UNBREAKABLE_TAG import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.enchantment.Enchantment import de.bixilon.minosoft.data.mappings.items.Item -import de.bixilon.minosoft.data.mappings.versions.Version import de.bixilon.minosoft.data.text.ChatComponent +import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.BitByte.isBit import de.bixilon.minosoft.util.KUtil.nullCast import de.bixilon.minosoft.util.nbt.tag.NBTUtil.compoundCast @@ -36,13 +36,13 @@ import de.bixilon.minosoft.util.nbt.tag.NBTUtil.listCast data class ItemStack( val item: Item, - private val version: Version? = null, + private val connection: PlayConnection? = null, var count: Int = 0, val enchantments: MutableMap = mutableMapOf(), val lore: MutableList = mutableListOf(), var repairCost: Int = 0, var customDisplayName: ChatComponent? = null, - var isUnbreakable: Boolean = false, + var unbreakable: Boolean = false, var durability: Int = 0, val nbt: MutableMap = mutableMapOf(), ) { @@ -61,22 +61,22 @@ data class ItemStack( nbt.getAndRemove(DISPLAY_TAG)?.compoundCast()?.let { it.getAndRemove(DISPLAY_MAME_TAG)?.nullCast()?.let { nameTag -> - customDisplayName = ChatComponent.of(nameTag, translator = version?.localeManager) + customDisplayName = ChatComponent.of(nameTag, translator = connection?.version?.localeManager) } it.getAndRemove(DISPLAY_LORE_TAG)?.listCast()?.let { loreTag -> for (lore in loreTag) { - this.lore.add(ChatComponent.of(lore, translator = version?.localeManager)) + this.lore.add(ChatComponent.of(lore, translator = connection?.version?.localeManager)) } } } nbt.getAndRemove(UNBREAKABLE_TAG)?.nullCast()?.let { - isUnbreakable = it.toInt() == 0x01 + unbreakable = it.toInt() == 0x01 } nbt.getAndRemove(UNBREAKABLE_TAG)?.nullCast()?.let { - isUnbreakable = it.toInt() == 0x01 + unbreakable = it.toInt() == 0x01 } nbt.getAndRemove(HIDE_FLAGS_TAG)?.nullCast()?.let { @@ -88,10 +88,10 @@ data class ItemStack( val enchantment = enchantmentTag[ENCHANTMENT_ID_TAG]?.let { enchantmentId -> when (enchantmentId) { is Number -> { - version!!.mapping.enchantmentRegistry[enchantmentId.toInt()] + connection!!.registries.enchantmentRegistry[enchantmentId.toInt()] } is String -> { - version!!.mapping.enchantmentRegistry[ResourceLocation.getPathResourceLocation(enchantmentId)] + connection!!.registries.enchantmentRegistry[ResourceLocation.getPathResourceLocation(enchantmentId)] } else -> TODO() } @@ -126,7 +126,7 @@ data class ItemStack( } } - if (isUnbreakable) { + if (unbreakable) { nbt[UNBREAKABLE_TAG] = true } @@ -137,19 +137,19 @@ data class ItemStack( val enchantmentList: MutableList> = mutableListOf() for ((enchantment, level) in enchantments) { val enchantmentTag: MutableMap = mutableMapOf() - if (version!!.isFlattened()) { + if (connection!!.version.isFlattened()) { enchantmentTag[ENCHANTMENT_ID_TAG] = enchantment.resourceLocation.full } else { - enchantmentTag[ENCHANTMENT_ID_TAG] = version.mapping.enchantmentRegistry.getId(enchantment) + enchantmentTag[ENCHANTMENT_ID_TAG] = connection.registries.enchantmentRegistry.getId(enchantment) } - enchantmentTag[ENCHANTMENT_LEVEL_TAG] = if (version.isFlattened()) { + enchantmentTag[ENCHANTMENT_LEVEL_TAG] = if (connection.version.isFlattened()) { level } else { level.toShort() } } - if (version!!.isFlattened()) { + if (connection!!.version.isFlattened()) { nbt[ENCHANTMENT_FLATTENING_TAG] = enchantmentList } else { nbt[ENCHANTMENT_PRE_FLATTENING_TAG] = enchantmentList @@ -161,7 +161,7 @@ data class ItemStack( val displayName: ChatComponent get() { customDisplayName?.let { return it } - item.translationKey?.let { version?.localeManager?.translate(it)?.let { translatedName -> return translatedName } } + item.translationKey?.let { connection?.version?.localeManager?.translate(it)?.let { translatedName -> return translatedName } } return ChatComponent.of(item.toString()) } @@ -206,6 +206,9 @@ data class ItemStack( } } + val damageable: Boolean + get() = item.maxDamage > 0 || !unbreakable + companion object { private const val HIDE_ENCHANTMENT_BIT = 0 private const val HIDE_MODIFIERS_BIT = 1 diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/enchantment/DefaultEnchantments.kt b/src/main/java/de/bixilon/minosoft/data/mappings/enchantment/DefaultEnchantments.kt index 0b9a49409..2d3ee4ebb 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/enchantment/DefaultEnchantments.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/enchantment/DefaultEnchantments.kt @@ -16,5 +16,6 @@ package de.bixilon.minosoft.data.mappings.enchantment import de.bixilon.minosoft.util.KUtil.asResourceLocation object DefaultEnchantments { + val UNBREAKING = "minecraft:unbreaking".asResourceLocation() val EFFICIENCY = "minecraft:efficiency".asResourceLocation() } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/other/containers/Container.kt b/src/main/java/de/bixilon/minosoft/data/mappings/other/containers/Container.kt index ae181d19e..dca5f14fa 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/other/containers/Container.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/other/containers/Container.kt @@ -29,7 +29,7 @@ open class Container( fun validate() { for ((slot, itemStack) in slots.toSynchronizedMap()) { - if (itemStack.count <= 0) { + if (itemStack.count <= 0 || itemStack.durability < 0) { slots.remove(slot) } } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/Version.kt b/src/main/java/de/bixilon/minosoft/data/mappings/versions/Version.kt index 6b19910b6..f64f2e789 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/Version.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/Version.kt @@ -37,7 +37,7 @@ data class Version( ) { var isLoaded = false var isGettingLoaded = false - val mapping: Registries = Registries() + val registries: Registries = Registries() lateinit var assetsManager: MinecraftAssetsManager lateinit var localeManager: MinecraftLocaleManager @@ -92,9 +92,9 @@ data class Version( if (versionId == ProtocolDefinition.PRE_FLATTENING_VERSION_ID) { - Versions.PRE_FLATTENING_MAPPING = mapping + Versions.PRE_FLATTENING_MAPPING = registries } else if (!isFlattened()) { - mapping.parentMapping = Versions.PRE_FLATTENING_MAPPING + registries.parentMapping = Versions.PRE_FLATTENING_MAPPING } val pixlyzerData = try { Util.readJsonFromStream(assetsManager.readAssetAsStream(Resources.getPixLyzerDataHashByVersion(this))) @@ -110,7 +110,7 @@ data class Version( JsonObject() } latch.addCount(1) - mapping.load(this, pixlyzerData) + registries.load(this, pixlyzerData) latch.countDown() if (pixlyzerData.size() > 0) { Log.log(LogMessageType.VERSION_LOADING, level = LogLevels.INFO) { "Loaded mappings for $this (${versionName} in ${System.currentTimeMillis() - startTime}ms" } @@ -123,9 +123,9 @@ data class Version( } fun unload() { - mapping.clear() - if (mapping.parentMapping == mapping) { - mapping.parentMapping = null + registries.clear() + if (registries.parentMapping == registries) { + registries.parentMapping = null } isLoaded = false isGettingLoaded = false diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index 4024061fc..11125896e 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -133,7 +133,7 @@ class WorldRenderer( } override fun init() { - allBlocks = getAllBlocks(connection.version.mapping) + allBlocks = getAllBlocks(connection.version.registries) renderWindow.textures.allTextures.addAll(resolveBlockTextureIds(allBlocks!!)) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt index a9e7d1f31..c89b17859 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/LeftClickHandler.kt @@ -121,14 +121,10 @@ class LeftClickHandler( } fun finishDigging() { + // ToDo: Check for acknowledgment connection.sendPacket(BlockBreakC2SP(BlockBreakC2SP.BreakType.FINISHED_DIGGING, raycastHit.blockPosition, raycastHit.hitDirection)) clearDigging() connection.world.setBlockState(raycastHit.blockPosition, null) - - if (connection.player.entity.gamemode != Gamemodes.CREATIVE) { - // decrease durability - // ToDo - } } val canStartBreaking = currentTime - breakSent >= ProtocolDefinition.TICK_TIME diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt index ed330bfdd..7aa84db1c 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/PlayConnection.kt @@ -152,7 +152,7 @@ class PlayConnection( try { version.load(latch) // ToDo: show gui loader assetsManager = MultiAssetsManager(version.assetsManager, Minosoft.MINOSOFT_ASSETS_MANAGER, Minosoft.MINECRAFT_FALLBACK_ASSETS_MANAGER) - registries.parentMapping = version.mapping + registries.parentMapping = version.registries player = Player(account, this) if (!RenderConstants.DISABLE_RENDERING) { diff --git a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt index 95c833fba..aff7b9413 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/protocol/PlayInByteBuffer.kt @@ -82,7 +82,7 @@ class PlayInByteBuffer : InByteBuffer { // ToDo: Replace with dynamic particle type calling if (this.versionId < V_17W45A) { return when (type.resourceLocation.full) { - "minecraft:iconcrack" -> ItemParticleData(ItemStack(item = connection.registries.itemRegistry[readVarInt() shl 16 or readVarInt()], connection.version), type) + "minecraft:iconcrack" -> ItemParticleData(ItemStack(item = connection.registries.itemRegistry[readVarInt() shl 16 or readVarInt()], connection), type) "minecraft:blockcrack", "minecraft:blockdust", "minecraft:falling_dust" -> BlockParticleData(connection.registries.getBlockState(readVarInt() shl 4), type) // ToDo: What about meta data? else -> ParticleData(type) } @@ -114,7 +114,7 @@ class PlayInByteBuffer : InByteBuffer { val nbt = readNBTTag(versionId < V_14W28B)?.compoundCast() return ItemStack( item = connection.registries.itemRegistry[id shl 16 or metaData], - version = connection.version, + connection = connection, count = count, durability = metaData, nbt = nbt ?: mutableMapOf(), @@ -123,8 +123,8 @@ class PlayInByteBuffer : InByteBuffer { return if (readBoolean()) { ItemStack( - version = connection.version, item = connection.registries.itemRegistry[readVarInt()], + connection = connection, count = readUnsignedByte(), nbt = readNBT()?.compoundCast() ?: mutableMapOf(), )