From 7b2593778f91935f1294cbf6180b18f8ccbb2d60 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 28 Sep 2023 14:38:04 +0200 Subject: [PATCH] fix 1.9..1.12.2 chunk reading + tests --- .../packets/s2c/play/chunk/ChunkS2CPTest.kt | 17 +++++++++++++++++ .../packets/chunk/cuberite_1_12_2.bin | Bin 0 -> 54050 bytes .../palette/PalettedContainerReader.kt | 2 +- .../palette/palettes/BiomePaletteFactory.kt | 4 ++-- .../palettes/BlockStatePaletteFactory.kt | 17 ++++++++++------- .../palette/palettes/PaletteFactory.kt | 4 ++-- .../palette/palettes/RegistryPalette.kt | 13 ++++++++++--- .../connection/status/StatusConnection.kt | 1 + .../packets/s2c/play/block/chunk/ChunkS2CP.kt | 8 +++++--- 9 files changed, 48 insertions(+), 18 deletions(-) create mode 100644 src/integration-test/resources/packets/chunk/cuberite_1_12_2.bin 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 0000000000000000000000000000000000000000..9bd29139b1abc53a88bb4815a4d651aec9a985c3 GIT binary patch literal 54050 zcmeHQy-plS5Uw>o%-PsRjvQDzkY4~Hf(wx>-oPTh#B%D$LKjVj$Q)dNh#Z}SES(%9 z2js|aV4dy-Eb#>9s=lh4nH^?-Sax^T@U`&HbWK%%-CtGL3_Xok#7pnDzy4l&EN9CP zFz7{WxXdWrKrfWe(C)bOI;VX)fGQ0TBXv&SqnSh?A$AD%jQ-@rO@hc zv8G$^W9TN%j<|Wz#6hFlqW*YEoHY|^i`k)?qKS+o6B&*v#&~wZTych)8*gYa%m?C> zIRKg-pwNF)1=$7IgYF=<@o^!sN^8B*QP!j-PDmwrlTrTB zMi7`|^0t8fDaT#~n^O~?Q}j>OVu_HvNd#tI@F+|v`e>r&{0Vc5YglF+z+8Loomcb3 z88HDm^-s+cNdv}{6&*}V@gX)ZlmqX-(40TbyaR2uEz+#Xo6GOTw2&sjk#{8LPt89N z{gnREp67Ui7NbW+5@|T4@Q+Hh)O-nB2x}ijv=}1GJB9vh;xywL>S}AcDCr+H@55 z<#?EXQXM#2X^8_5u1HYoUbN_qE^dCiHg7lc&-y6dz_XH8;6y)~agcJKKj0X?4fzoN zKqKRz?jIzB#2GQs=6(Me>Yw$NxW1Wxq{TmdyrD85|G*OprK4QD`7bg@7tTN4p(bz9%_%QNj|nnS;63Z`2>Iz8Us)0MT8^G}Cwe-SzT_T_kgS>*itR~3kS z`|V|CB?P&VCr$o%&>hjUFwS4d@&d2xw{&wK+2L4{)D?lCpS8dPmwL5+I z+T99Y-l1xuaY`S4j(-6Dp*C0_KidBs;}_5|4rHHBEB^!V%~0_lqJi^IMu!%-!%rvp zJUV^&PT`c#M};}?^xJCXf9HSIfYkqwtog)O|65i4kAtY{L`Csom+dJ&>gV4dSmWV%`pBrAaJ)rYjv*jAiVy_9(KlIN$*KBXsS}NC|p6t}p?{d)nBQ*eUODDB<~Qay<~Qay z+l)AQ9L(!^^tR#f{xiw_=Z3G4Xif&m02v?yWPl9ZMh3VCr(3U*fAZfY1B|~e*%u-I zTKP}{!bI`VViXC#k|&1xyCuk8YlO-FM3>a{w#J}(?9eNpAQ!Qoi3jb z7JHu3KlBgxNKKwcIe$2RIDa^Qa=mI^zn9Dlhxv{9jrooFZNB+!hOd{{G#MZRWPl8i z0W$EjGQd4Z-FlAvlm9LmVElE-KKFn!{$?6~+ylxzptkPHJ)l2B9Pk|h-x2T~0pAg1 zzMj{+$$8;0zcIftzcIftzw!T(s=nlwf5XGS;lcN=>q>~_Mt;|;e+~V(|IhxCJlAh~ zk@aQS>=mo>hqEYWkgCX~OCm9G$- zLG%Y#69bQb4OBo;p` zLx-3+2rkt!9Mx*Ufo&59|5>-%I?m+l2jL&7cmt#19|^Cif2XoqLHfs>VIU2h{5{wbQgInS;B zf$c>8k*oeuoYFsr+2)^>JLDgo-ZnqQpBiPyII-gMQ#@H}P3GGpc@wg~)(4i_{8^Kd4>%&_yRz*o` z(Q1+Y`Eh`*ID$9ZDQiR8dIF4rTj1k^wS62FSqOU?6_8=xnh1=r+8}_ztCC zzwN&q4eG`EpbOKHzu$kqxBX1y&D%G-FMA@d_g-67c6MJ`Rb+e9sv<8pP?cvhCIn!$ zkBi!Q7pKJUg7pfM{8wCbaYp{TV7aAW}`th==yZ@s;eQY#*ap|~i zN8rbGk*W8i5C1Z7e$@J7_}MQh`!O{lfSC?nSxb!spTPKK8&I9HJZA4^(we47SARo*3T)^UABTg&i^?8@@wE)_jM| z@O?Z3#%|)lxDNDcS9i>6nKrJqY31s86W0g0wY>(tX^j_+)jleoo48KwtZ=gnuif1; zEB_|Wpkr6K*`Ha(RklCsIBWlo!oTVK9o7EG>o?3_Bip9}8CYNju%Tq=NA5-$sx-rk X#GfI#Y?=&^0Wv@a?kEGjJ6_~}y)W~N literal 0 HcmV?d00001 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" }