diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CPTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CPTest.kt index 96e83e748..7528a5c97 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CPTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/protocol/packets/s2c/play/chunk/ChunkS2CPTest.kt @@ -96,5 +96,22 @@ class ChunkS2CPTest { assertEquals(blocks[3]!![0, 8, 0]!!.block.identifier, MinecraftBlocks.STONE) assertEquals(blocks[3]!![0, 11, 0]!!.block.identifier, MinecraftBlocks.DIRT) } + + @Test(groups = ["packet"], invocationCount = 10) + fun cuberite_1_12_2() { + val packet = read("cuberite_1_12_2", "1.12.2", dimension = DimensionProperties(light = true, skyLight = true, minY = 0, height = 256)) + assertEquals(packet.position, Vec2i(0, 0)) + val blocks = packet.prototype.blocks + assertNotNull(blocks); blocks!! + assertNull(blocks[0]!![0, 0, 0]) + + assertEquals(blocks[0]!![2, 0, 0]!!.block.identifier, MinecraftBlocks.BEDROCK) + assertEquals(blocks[0]!![5, 5, 1]!!.block.identifier, MinecraftBlocks.STONE) + assertEquals(blocks[1]!![0, 0, 0]!!.block.identifier, MinecraftBlocks.STONE) + assertEquals(blocks[2]!![0, 0, 0]!!.block.identifier, MinecraftBlocks.STONE) + assertEquals(blocks[3]!![0, 0, 0]!!.block.identifier, MinecraftBlocks.STONE) + assertEquals(blocks[3]!![1, 11, 0]!!.block.identifier, MinecraftBlocks.DIRT) + assertEquals(blocks[4]!![4, 3, 4]!!.block.identifier, MinecraftBlocks.STONE) + } } diff --git a/src/integration-test/resources/packets/chunk/cuberite_1_12_2.bin b/src/integration-test/resources/packets/chunk/cuberite_1_12_2.bin new file mode 100644 index 000000000..9bd29139b Binary files /dev/null and b/src/integration-test/resources/packets/chunk/cuberite_1_12_2.bin differ diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/PalettedContainerReader.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/PalettedContainerReader.kt index bfe4ff3e5..b50aeded6 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/PalettedContainerReader.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/PalettedContainerReader.kt @@ -23,7 +23,7 @@ object PalettedContainerReader { fun read(buffer: PlayInByteBuffer, registry: AbstractRegistry, paletteFactory: PaletteFactory): PalettedContainer { val bits = buffer.readUnsignedByte() - val palette = paletteFactory.createPalette(registry, bits) + val palette = paletteFactory.createPalette(registry, bits, buffer.versionId) palette.read(buffer) val paletteData = PaletteData.create(buffer.versionId, palette.bits, paletteFactory.containerSize) diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BiomePaletteFactory.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BiomePaletteFactory.kt index c8d1d356b..c509c483d 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BiomePaletteFactory.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BiomePaletteFactory.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. * @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry object BiomePaletteFactory : PaletteFactory { override val edgeBits get() = 2 - override fun createPalette(registry: AbstractRegistry, bits: Int): Palette { + override fun createPalette(registry: AbstractRegistry, bits: Int, version: Int): Palette { return when (bits) { 0 -> SingularPalette(registry) 1, 2, 3 -> ArrayPalette(registry, bits) diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BlockStatePaletteFactory.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BlockStatePaletteFactory.kt index 22ff7ebe4..c813bf98a 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BlockStatePaletteFactory.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/BlockStatePaletteFactory.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,16 +14,19 @@ package de.bixilon.minosoft.data.world.container.palette.palettes import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry +import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_17W46A object BlockStatePaletteFactory : PaletteFactory { override val edgeBits get() = 4 - override fun createPalette(registry: AbstractRegistry, bits: Int): Palette { - return when (bits) { - 0 -> SingularPalette(registry) - 1, 2, 3, 4 -> ArrayPalette(registry, 4) - 5, 6, 7, 8 -> ArrayPalette(registry, bits) - else -> RegistryPalette(registry) + override fun createPalette(registry: AbstractRegistry, bits: Int, version: Int): Palette { + when (bits) { + 0 -> return SingularPalette(registry) + 1, 2, 3, 4 -> return ArrayPalette(registry, 4) + 5, 6, 7, 8 -> return ArrayPalette(registry, bits) } + if (version > V_17W46A) return RegistryPalette(registry) // flattened + + return RegistryPalette(registry, 13) // minecraft uses 13 bits to encode the blocks (8 bits id + 4 bits meta + 1 magic bit, thanks) } } diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/PaletteFactory.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/PaletteFactory.kt index 0b4ade2dd..b769343e3 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/PaletteFactory.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/PaletteFactory.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. * @@ -19,5 +19,5 @@ interface PaletteFactory { val containerSize: Int get() = 1 shl (edgeBits * 3) - fun createPalette(registry: AbstractRegistry, bits: Int): Palette + fun createPalette(registry: AbstractRegistry, bits: Int, version: Int): Palette } diff --git a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/RegistryPalette.kt b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/RegistryPalette.kt index baa4f7bb0..121f9d2cf 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/RegistryPalette.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/container/palette/palettes/RegistryPalette.kt @@ -15,15 +15,22 @@ package de.bixilon.minosoft.data.world.container.palette.palettes import de.bixilon.kutil.math.simple.IntMath.binaryBase import de.bixilon.minosoft.data.registries.registries.registry.AbstractRegistry +import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_12_2 import de.bixilon.minosoft.protocol.protocol.buffers.play.PlayInByteBuffer -class RegistryPalette(private val registry: AbstractRegistry) : Palette { - override val bits = registry.size.binaryBase +class RegistryPalette( + private val registry: AbstractRegistry, + override val bits: Int = registry.size.binaryBase, +) : Palette { override val isEmpty: Boolean get() = false - override fun read(buffer: PlayInByteBuffer) {} + override fun read(buffer: PlayInByteBuffer) { + if (buffer.versionId <= V_1_12_2) { // TODO: find out exact version + buffer.readVarInt() // no data + } + } @Suppress("UNCHECKED_CAST") override fun getOrNull(id: Int): T? { diff --git a/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt b/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt index 8aa76800e..805d20c9d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/network/connection/status/StatusConnection.kt @@ -142,6 +142,7 @@ class StatusConnection( state = StatusConnectionStates.RESOLVING val addresses: List try { + // TODO: Don't resolve if address is ip addresses = resolve() } catch (exception: Exception) { Log.log(LogMessageType.NETWORK) { "Can not resolve ${this.address}" } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/chunk/ChunkS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/chunk/ChunkS2CP.kt index dfc62fdd4..3d6e2e47d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/chunk/ChunkS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/block/chunk/ChunkS2CP.kt @@ -16,6 +16,7 @@ import de.bixilon.kotlinglm.vec2.Vec2i import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.array.ArrayUtil.cast import de.bixilon.kutil.compression.zlib.ZlibUtil.decompress +import de.bixilon.kutil.exception.Broken import de.bixilon.kutil.json.JsonUtil.asJsonObject import de.bixilon.kutil.json.JsonUtil.toJsonObject import de.bixilon.kutil.primitive.IntUtil.toInt @@ -37,6 +38,7 @@ import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_14W28A import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_15W34C import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_15W36D import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_18W44A +import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_19W36A import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_16_2_PRE2 import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_16_PRE7 import de.bixilon.minosoft.protocol.protocol.ProtocolVersions.V_1_9_4 @@ -94,7 +96,7 @@ class ChunkS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { if (buffer.versionId >= V_18W44A) { buffer.readNBT()?.toJsonObject() // heightmap } - if (action == ChunkAction.CREATE && buffer.versionId < V_21W37A) { + if (action == ChunkAction.CREATE && buffer.versionId >= V_19W36A && buffer.versionId < V_21W37A) { this.prototype.biomeSource = SpatialBiomeArray(buffer.readBiomeArray()) } readingData = ChunkReadingData(PlayInByteBuffer(buffer.readByteArray(), buffer.connection), dimension, sectionBitMask) @@ -153,8 +155,8 @@ class ChunkS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket { fun PlayInByteBuffer.readBiomeArray(): Array { val length = when { versionId >= ProtocolVersions.V_20W28A -> readVarInt() - versionId >= ProtocolVersions.V_19W36A -> ProtocolDefinition.BLOCKS_PER_SECTION / 4 // 1024, 4x4 blocks - else -> 0 + versionId >= V_19W36A -> ProtocolDefinition.BLOCKS_PER_SECTION / 4 // 1024, 4x4 blocks + else -> Broken("") } check(length <= this.size) { "Trying to allocate too much memory" }