diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/building/plants/DoublePlant.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/building/plants/DoublePlant.kt index 5ca2eee80..6842d188c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/building/plants/DoublePlant.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/building/plants/DoublePlant.kt @@ -14,6 +14,7 @@ package de.bixilon.minosoft.data.registries.blocks.types.building.plants import de.bixilon.kutil.cast.CastUtil.nullCast +import de.bixilon.kutil.exception.Broken import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.factory.BlockFactory @@ -44,6 +45,7 @@ import de.bixilon.minosoft.gui.rendering.tint.TintManager import de.bixilon.minosoft.gui.rendering.tint.TintProvider import de.bixilon.minosoft.gui.rendering.tint.TintedBlock import de.bixilon.minosoft.gui.rendering.tint.tints.grass.TallGrassTintCalculator +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import de.bixilon.minosoft.protocol.versions.Version abstract class DoublePlant(identifier: ResourceLocation, settings: BlockSettings) : Block(identifier, settings), ShearsRequirement, BlockWithItem, FullOutlinedBlock, RandomOffsetBlock, InstantBreakableBlock, ModelChooser, DoubleSizeBlock { @@ -55,6 +57,21 @@ abstract class DoublePlant(identifier: ResourceLocation, settings: BlockSettings list += HALF } + override fun isTop(state: BlockState, connection: PlayConnection): Boolean { + if (connection.version.flattened) return super.isTop(state, connection) + return state.block is UpperFlowerBlock + } + + override fun getTop(state: BlockState, connection: PlayConnection): BlockState { + if (connection.version.flattened) return super.getTop(state, connection) + return connection.registries.block[UpperFlowerBlock]!!.states.default + } + + override fun getBottom(state: BlockState, connection: PlayConnection): BlockState { + if (connection.version.flattened) return super.getTop(state, connection) + Broken("Not enough information to get bottom!") + } + override fun bakeModel(context: RenderContext, model: DirectBlockModel) { if (context.connection.version.flattened) return super.bakeModel(context, model) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoorBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoorBlock.kt index 7801659f1..1795a089c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoorBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoorBlock.kt @@ -19,12 +19,13 @@ import de.bixilon.minosoft.data.entities.entities.player.Hands import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler +import de.bixilon.minosoft.data.registries.blocks.types.properties.size.DoubleSizeBlock import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : DoubleSizeBlock(resourceLocation, registries, data), InteractBlockHandler { +open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), InteractBlockHandler, DoubleSizeBlock { override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { if (target.state.block.identifier.path.startsWith("iron")) { // TODO diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoubleSizeBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoubleSizeBlock.kt deleted file mode 100644 index 897de6bea..000000000 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/DoubleSizeBlock.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Minosoft - * 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. - * - * 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.registries.blocks.types.pixlyzer - -import de.bixilon.kotlinglm.vec3.Vec3i -import de.bixilon.minosoft.data.direction.Directions -import de.bixilon.minosoft.data.entities.block.BlockEntity -import de.bixilon.minosoft.data.registries.blocks.handler.entity.BlockBreakHandler -import de.bixilon.minosoft.data.registries.blocks.handler.entity.BlockPlaceHandler -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties -import de.bixilon.minosoft.data.registries.blocks.properties.Halves -import de.bixilon.minosoft.data.registries.blocks.state.BlockState -import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState -import de.bixilon.minosoft.data.registries.identified.ResourceLocation -import de.bixilon.minosoft.data.registries.registries.Registries -import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus -import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection - -abstract class DoubleSizeBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), BlockBreakHandler, BlockPlaceHandler { - - override fun onBreak(connection: PlayConnection, position: Vec3i, state: BlockState, entity: BlockEntity?) { - if (state !is PropertyBlockState) return - if (state.properties[BlockProperties.STAIR_HALF] == Halves.LOWER) { - connection.world[position + Directions.UP] = null - } else { - connection.world[position + Directions.DOWN] = null - } - } - - override fun onPlace(connection: PlayConnection, position: Vec3i, state: BlockState, entity: BlockEntity?) { - if (state !is PropertyBlockState) return - if (state.properties[BlockProperties.STAIR_HALF] == Halves.LOWER) { - connection.world[position + Directions.UP] = state.withProperties(BlockProperties.STAIR_HALF to Halves.UPPER) - } else { - connection.world[position + Directions.DOWN] = state.withProperties(BlockProperties.STAIR_HALF to Halves.LOWER) - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/DoubleSizeBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/DoubleSizeBlock.kt index 36fb24222..556af7fda 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/DoubleSizeBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/DoubleSizeBlock.kt @@ -13,4 +13,36 @@ package de.bixilon.minosoft.data.registries.blocks.types.properties.size -interface DoubleSizeBlock : MultiSizeBlock +import de.bixilon.kotlinglm.vec3.Vec3i +import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.minosoft.data.direction.Directions +import de.bixilon.minosoft.data.entities.block.BlockEntity +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.Halves +import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState +import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection + +interface DoubleSizeBlock : MultiSizeBlock { + + + fun isTop(state: BlockState, connection: PlayConnection) = state.unsafeCast().properties[BlockProperties.STAIR_HALF] == Halves.UPPER + fun getTop(state: BlockState, connection: PlayConnection): BlockState = state.withProperties(BlockProperties.STAIR_HALF to Halves.UPPER) + fun getBottom(state: BlockState, connection: PlayConnection): BlockState = state.withProperties(BlockProperties.STAIR_HALF to Halves.LOWER) + + override fun onBreak(connection: PlayConnection, position: Vec3i, state: BlockState, entity: BlockEntity?) { + val offset = if (isTop(state, connection)) Directions.DOWN else Directions.UP + connection.world[position + offset] = null + } + + override fun onPlace(connection: PlayConnection, position: Vec3i, state: BlockState, entity: BlockEntity?) { + + val top = isTop(state, connection) + + val offset = if (top) Directions.DOWN else Directions.UP + val otherState = if (top) getTop(state, connection) else getBottom(state, connection) + + connection.world[position + offset] = otherState + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/MultiSizeBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/MultiSizeBlock.kt index fa190a9a0..977fd90f1 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/MultiSizeBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/size/MultiSizeBlock.kt @@ -13,4 +13,10 @@ package de.bixilon.minosoft.data.registries.blocks.types.properties.size -interface MultiSizeBlock +import de.bixilon.minosoft.data.registries.blocks.handler.entity.BlockBreakHandler +import de.bixilon.minosoft.data.registries.blocks.handler.entity.BlockPlaceHandler + +/** + * Something that just exist in multiple blocks (e.g. doors or beds) + */ +interface MultiSizeBlock : BlockBreakHandler, BlockPlaceHandler