From 17b90869306edd5697d07550ee4d021d344ee5d2 Mon Sep 17 00:00:00 2001 From: Moritz Zwerger Date: Sun, 30 Jul 2023 21:14:27 +0200 Subject: [PATCH] correct wrong pixlyzer random block offset --- .../bixilon/minosoft/camera/target/TargetHandler.kt | 3 +-- .../blocks/types/pixlyzer/PixLyzerBlock.kt | 12 +++++++++++- .../types/properties/offset/RandomOffsetBlock.kt | 11 +++++++++++ .../rendering/chunk/outline/BlockOutlineRenderer.kt | 3 +-- 4 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/main/java/de/bixilon/minosoft/camera/target/TargetHandler.kt b/src/main/java/de/bixilon/minosoft/camera/target/TargetHandler.kt index 3e85646df..87d7d52d7 100644 --- a/src/main/java/de/bixilon/minosoft/camera/target/TargetHandler.kt +++ b/src/main/java/de/bixilon/minosoft/camera/target/TargetHandler.kt @@ -32,7 +32,6 @@ import de.bixilon.minosoft.data.world.chunk.chunk.Chunk import de.bixilon.minosoft.data.world.positions.BlockPosition import de.bixilon.minosoft.data.world.positions.ChunkPositionUtil.chunkPosition import de.bixilon.minosoft.data.world.positions.ChunkPositionUtil.inChunkPosition -import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.floor import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3dUtil.raycastDistance @@ -102,7 +101,7 @@ class TargetHandler( return null } var shape = state.block.getOutlineShape(camera.connection, state) ?: return null - state.block.nullCast()?.randomOffset?.let { shape += blockPosition.getWorldOffset(it) } + state.block.nullCast()?.offsetBlock(blockPosition)?.let { shape += it } shape += blockPosition diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt index ab809d4ab..7d5326782 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/PixLyzerBlock.kt @@ -12,6 +12,8 @@ */ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer +import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.cast.CastUtil.nullCast import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.kutil.cast.CollectionCast.asAnyMap @@ -46,6 +48,8 @@ import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem import de.bixilon.minosoft.data.registries.registries.registry.codec.ResourceLocationCodec import de.bixilon.minosoft.data.world.positions.BlockPosition +import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.util.logging.Log import de.bixilon.minosoft.util.logging.LogLevels @@ -57,7 +61,6 @@ open class PixLyzerBlock( registries: Registries, data: Map, ) : Block(identifier, BlockSettings(soundGroup = data["sound_group"]?.toInt()?.let { registries.soundGroup[it] })), FrictionBlock, JumpBlock, VelocityBlock, RandomOffsetBlock, OutlinedBlock, BlockStateBuilder, ReplaceableBlock, PotentialFullOpaqueBlock, WaterloggableBlock, CollidableBlock, ToolRequirement, BlockWithItem { - override val randomOffset: RandomOffsetTypes? = data["offset_type"].nullCast()?.let { RandomOffsetTypes[it] } override val friction = data["friction"]?.toFloat() ?: FrictionBlock.DEFAULT_FRICTION @@ -101,7 +104,14 @@ open class PixLyzerBlock( return identifier.toString() } + override fun offsetBlock(position: Vec3i): Vec3 { + val offset = randomOffset ?: return Vec3.EMPTY + return super.offsetBlock(position) + if (offset == RandomOffsetTypes.XZ) NULL_OFFSET_XZ else NULL_OFFSET_XYZ // this corrects wrong pixlyzer data + } + companion object : ResourceLocationCodec, PixLyzerBlockFactory, MultiClassFactory { + private val NULL_OFFSET_XYZ = Vec3i(0, 0, 0).getWorldOffset(RandomOffsetTypes.XYZ) + private val NULL_OFFSET_XZ = Vec3i(0, 0, 0).getWorldOffset(RandomOffsetTypes.XZ) private val ITEM_FIELD = PixLyzerBlock::item.javaField!! override val ALIASES: Set = setOf("Block") diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/offset/RandomOffsetBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/offset/RandomOffsetBlock.kt index c7df5280c..6e5380ae2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/offset/RandomOffsetBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/offset/RandomOffsetBlock.kt @@ -13,6 +13,17 @@ package de.bixilon.minosoft.data.registries.blocks.types.properties.offset +import de.bixilon.kotlinglm.vec3.Vec3 +import de.bixilon.kotlinglm.vec3.Vec3i +import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset +import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3Util.EMPTY + interface RandomOffsetBlock { val randomOffset: RandomOffsetTypes? // TODO: make non nullable + + + fun offsetBlock(position: Vec3i): Vec3 { + val offset = this.randomOffset ?: return Vec3.EMPTY + return position.getWorldOffset(offset) + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt index 158d690b6..912261218 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/outline/BlockOutlineRenderer.kt @@ -36,7 +36,6 @@ import de.bixilon.minosoft.gui.rendering.system.base.DepthFunctions import de.bixilon.minosoft.gui.rendering.system.base.RenderSystem import de.bixilon.minosoft.gui.rendering.system.base.layer.RenderLayer import de.bixilon.minosoft.gui.rendering.system.base.settings.RenderSettings -import de.bixilon.minosoft.gui.rendering.util.VecUtil.getWorldOffset import de.bixilon.minosoft.gui.rendering.util.VecUtil.toVec3d import de.bixilon.minosoft.gui.rendering.util.mesh.LineMesh import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection @@ -125,7 +124,7 @@ class BlockOutlineRenderer( val blockOffset = target.blockPosition.toVec3d if (target.state.block is RandomOffsetBlock) { - target.state.block.randomOffset?.let { blockOffset += target.blockPosition.getWorldOffset(it) } + blockOffset += target.state.block.offsetBlock(target.blockPosition) }