mirror of
https://gitlab.bixilon.de/bixilon/minosoft.git
synced 2025-09-13 01:16:46 -04:00
properly implement DoubleSizeBlock
This commit is contained in:
parent
40fb8ad6d7
commit
15d582cc1a
@ -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<Item>, 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)
|
||||
|
||||
|
@ -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<String, Any>) : DoubleSizeBlock(resourceLocation, registries, data), InteractBlockHandler {
|
||||
open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map<String, Any>) : 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
|
||||
|
@ -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 <https://www.gnu.org/licenses/>.
|
||||
*
|
||||
* 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<String, Any>) : 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)
|
||||
}
|
||||
}
|
||||
}
|
@ -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<PropertyBlockState>().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
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user