From 08e12278689e8c5fbfa7ad7ee5848f3453af52b1 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Thu, 8 Apr 2021 18:10:46 +0200 Subject: [PATCH] fix several issues in new snapshots (with negative build height, new entities) --- .../minosoft/data/DefaultEntityFactories.kt | 6 ++-- .../entities/decoration/GlowItemFrame.kt | 31 +++++++++++++++++++ .../entities/entities/decoration/ItemFrame.kt | 2 +- .../minosoft/data/mappings/Dimension.kt | 2 +- .../blocks/properties/BlockProperties.kt | 4 +-- .../clientbound/play/PacketJoinGame.kt | 5 ++- .../bixilon/minosoft/util/chunk/ChunkUtil.kt | 18 +++++------ 7 files changed, 48 insertions(+), 20 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/GlowItemFrame.kt diff --git a/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt b/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt index a650ab3e9..5d07fbd14 100644 --- a/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt +++ b/src/main/java/de/bixilon/minosoft/data/DefaultEntityFactories.kt @@ -23,10 +23,7 @@ import de.bixilon.minosoft.data.entities.entities.animal.water.* import de.bixilon.minosoft.data.entities.entities.boss.enderdragon.EndCrystal import de.bixilon.minosoft.data.entities.entities.boss.enderdragon.EnderDragon import de.bixilon.minosoft.data.entities.entities.boss.wither.WitherBoss -import de.bixilon.minosoft.data.entities.entities.decoration.ArmorStand -import de.bixilon.minosoft.data.entities.entities.decoration.ItemFrame -import de.bixilon.minosoft.data.entities.entities.decoration.LeashFenceKnotEntity -import de.bixilon.minosoft.data.entities.entities.decoration.Painting +import de.bixilon.minosoft.data.entities.entities.decoration.* import de.bixilon.minosoft.data.entities.entities.item.FallingBlock import de.bixilon.minosoft.data.entities.entities.item.ItemEntity import de.bixilon.minosoft.data.entities.entities.item.PrimedTNT @@ -91,6 +88,7 @@ object DefaultEntityFactories { Illusioner, IronGolem, ItemEntity, + GlowItemFrame, ItemFrame, LargeFireball, LeashFenceKnotEntity, diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/GlowItemFrame.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/GlowItemFrame.kt new file mode 100644 index 000000000..0c2d4745d --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/GlowItemFrame.kt @@ -0,0 +1,31 @@ +/* + * Minosoft + * Copyright (C) 2021 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. + * + * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with this program.If not, see . + * + * This software is not affiliated with Mojang AB, the original developer of Minecraft. + */ +package de.bixilon.minosoft.data.entities.entities.decoration + +import de.bixilon.minosoft.data.entities.EntityRotation +import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.entities.EntityFactory +import de.bixilon.minosoft.data.mappings.entities.EntityType +import de.bixilon.minosoft.protocol.network.connection.PlayConnection +import glm_.vec3.Vec3 + +class GlowItemFrame(connection: PlayConnection, entityType: EntityType, position: Vec3, rotation: EntityRotation) : ItemFrame(connection, entityType, position, rotation) { + + companion object : EntityFactory { + override val RESOURCE_LOCATION: ResourceLocation = ResourceLocation("glow_item_frame") + + override fun build(connection: PlayConnection, entityType: EntityType, position: Vec3, rotation: EntityRotation): GlowItemFrame { + return GlowItemFrame(connection, entityType, position, rotation) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt index d3c3cca24..8d0827311 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/entities/decoration/ItemFrame.kt @@ -22,7 +22,7 @@ import de.bixilon.minosoft.data.mappings.entities.EntityType import de.bixilon.minosoft.protocol.network.connection.PlayConnection import glm_.vec3.Vec3 -class ItemFrame(connection: PlayConnection, entityType: EntityType, position: Vec3, rotation: EntityRotation) : HangingEntity(connection, entityType, position, rotation) { +open class ItemFrame(connection: PlayConnection, entityType: EntityType, position: Vec3, rotation: EntityRotation) : HangingEntity(connection, entityType, position, rotation) { @get:EntityMetaDataFunction(name = "Item") val item: ItemStack? diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/Dimension.kt b/src/main/java/de/bixilon/minosoft/data/mappings/Dimension.kt index d4c9b0180..ad1bde784 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/Dimension.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/Dimension.kt @@ -89,7 +89,7 @@ data class Dimension( hasRaids = data.get("has_raids")?.asBoolean == true, logicalHeight = data.get("logical_height")?.asInt ?: 256, coordinateScale = data.get("coordinate_scale")?.asDouble ?: 0.0, - minY = data.get("min_y")?.asInt ?: 0, + minY = data.get("minimum_y")?.asInt ?: 0, hasCeiling = data.get("has_ceiling")?.asBoolean == true, ultraWarm = data.get("ultrawarm")?.asBoolean == true, height = data.get("height")?.asInt ?: 256, diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt index eb1b90187..f905a509c 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt @@ -95,7 +95,7 @@ enum class BlockProperties { LEGACY_SMOOTH("smooth", BooleanBlocKPropertiesSerializer), SCULK_SENSOR_PHASE("sculk_sensor_phase", SensorPhases), DRIPSTONE_TILT("tilt", Tilts), - CAVE_VINES_BERRIES(BooleanBlocKPropertiesSerializer), + CAVE_VINES_BERRIES("berries", BooleanBlocKPropertiesSerializer), ; val group: String @@ -141,7 +141,7 @@ enum class BlockProperties { throw IllegalArgumentException("Can not parse value $value for group $group") } return Pair(retProperty, retValue) - } ?: throw IllegalArgumentException("Can not find group: $group") + } ?: throw IllegalArgumentException("Can not find group: $group, expected value $value") } } diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.kt index f5d8b2025..e60db023b 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/clientbound/play/PacketJoinGame.kt @@ -99,11 +99,10 @@ class PacketJoinGame(buffer: PlayInByteBuffer) : PlayClientboundPacket() { } else { buffer.readNBT() as CompoundTag // dimension tag } + val currentDimension = buffer.readResourceLocation() + dimension = dimensions[currentDimension] ?: buffer.connection.mapping.dimensionRegistry.get(currentDimension)!! } - if (buffer.versionId >= ProtocolVersions.V_20W22A) { - dimension = buffer.connection.mapping.dimensionRegistry.get(buffer.readResourceLocation())!! - } if (buffer.versionId >= ProtocolVersions.V_19W36A) { hashedSeed = buffer.readLong() } diff --git a/src/main/java/de/bixilon/minosoft/util/chunk/ChunkUtil.kt b/src/main/java/de/bixilon/minosoft/util/chunk/ChunkUtil.kt index 598fbb7b4..fa998eb3d 100644 --- a/src/main/java/de/bixilon/minosoft/util/chunk/ChunkUtil.kt +++ b/src/main/java/de/bixilon/minosoft/util/chunk/ChunkUtil.kt @@ -60,8 +60,8 @@ object ChunkUtil { // parse data var arrayPosition = 0 val sectionMap: MutableMap = Collections.synchronizedMap(ConcurrentHashMap()) - for (sectionHeight in dimension.lowestSection until dimension.highestSection) { - if (!sectionBitMask.get(sectionHeight)) { + for ((sectionIndex, sectionHeight) in (dimension.lowestSection until dimension.highestSection).withIndex()) { + if (!sectionBitMask[sectionIndex]) { continue } @@ -94,7 +94,7 @@ object ChunkUtil { blocks[blockNumber] = buffer.connection.mapping.getBlockState(blockId) ?: continue } - sectionMap[dimension.lowestSection + sectionHeight] = ChunkSection(blocks) + sectionMap[sectionHeight] = ChunkSection(blocks) } chunkData.blocks = sectionMap return chunkData @@ -129,8 +129,8 @@ object ChunkUtil { var arrayPos = 0 val sectionMap: MutableMap = Collections.synchronizedMap(ConcurrentHashMap()) - for (sectionHeight in dimension.lowestSection until dimension.highestSection) { // max sections per chunks in chunk column - if (!sectionBitMask.get(sectionHeight)) { + for ((sectionIndex, sectionHeight) in (dimension.lowestSection until dimension.highestSection).withIndex()) { // max sections per chunks in chunk column + if (!sectionBitMask[sectionIndex]) { continue } val blocks = arrayOfNulls(ProtocolDefinition.BLOCKS_PER_SECTION) @@ -139,7 +139,7 @@ object ChunkUtil { val block = buffer.connection.mapping.getBlockState(blockId) ?: continue blocks[blockNumber] = block } - sectionMap[dimension.lowestSection + sectionHeight] = ChunkSection(blocks) + sectionMap[sectionHeight] = ChunkSection(blocks) } chunkData.blocks = sectionMap return chunkData @@ -149,8 +149,8 @@ object ChunkUtil { val chunkData = ChunkData() val sectionMap: MutableMap = Collections.synchronizedMap(ConcurrentHashMap()) - for (sectionHeight in dimension.lowestSection until sectionBitMask.length()) { // max sections per chunks in chunk column - if (!sectionBitMask[sectionHeight]) { + for ((sectionIndex, sectionHeight) in (dimension.lowestSection until sectionBitMask.length()).withIndex()) { // max sections per chunks in chunk column + if (!sectionBitMask[sectionIndex]) { continue } if (buffer.versionId >= V_18W43A) { @@ -195,7 +195,7 @@ object ChunkUtil { } // ToDo } - sectionMap[dimension.lowestSection + sectionHeight] = ChunkSection(blocks) + sectionMap[sectionHeight] = ChunkSection(blocks) } chunkData.blocks = sectionMap