diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt index ae6878e3c..c1350f085 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/Block.kt @@ -15,8 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.types import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.minosoft.camera.target.targets.BlockTarget -import de.bixilon.minosoft.data.container.stack.ItemStack -import de.bixilon.minosoft.data.entities.entities.player.Hands import de.bixilon.minosoft.data.language.LanguageUtil.translation import de.bixilon.minosoft.data.language.translate.Translatable import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties @@ -31,7 +29,6 @@ import de.bixilon.minosoft.data.registries.blocks.types.properties.physics.Pushi import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem import de.bixilon.minosoft.gui.rendering.tint.TintProvider -import de.bixilon.minosoft.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* import kotlin.reflect.jvm.javaField @@ -56,12 +53,6 @@ abstract class Block( @Deprecated("Interface") open fun getPlacementState(connection: PlayConnection, target: BlockTarget): BlockState? = states.default - @Deprecated("Interface") - open fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { - return InteractionResults.IGNORED - } - - @Deprecated("Interface") open fun randomTick(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, random: Random) = Unit diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/CraftingTableBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/CraftingTableBlock.kt index 599122134..ae954b83c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/CraftingTableBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/CraftingTableBlock.kt @@ -17,16 +17,15 @@ import de.bixilon.minosoft.camera.target.targets.BlockTarget import de.bixilon.minosoft.data.container.stack.ItemStack 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.types.properties.InteractBlockHandler 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 CraftingTableBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data) { +open class CraftingTableBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), InteractBlockHandler { - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { - return InteractionResults.SUCCESS - } + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?) = InteractionResults.SUCCESS companion object : PixLyzerBlockFactory { 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 e90cf9698..5da277a13 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,18 +19,19 @@ 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.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler 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) { +open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : DoubleSizeBlock(resourceLocation, registries, data), InteractBlockHandler { override fun getPlacementState(connection: PlayConnection, target: BlockTarget): BlockState? { TODO() } - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { if (target.state.block.identifier.path.startsWith("iron")) { // TODO return InteractionResults.FAILED } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/button/AbstractButtonBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/button/AbstractButtonBlock.kt index c82f7a1e3..8c39dbf6f 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/button/AbstractButtonBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/button/AbstractButtonBlock.kt @@ -19,14 +19,15 @@ import de.bixilon.minosoft.data.entities.entities.player.Hands import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isPowered import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.PixLyzerBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler 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 -abstract class AbstractButtonBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data) { +abstract class AbstractButtonBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), InteractBlockHandler { - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { if (target.state.isPowered()) { return InteractionResults.FAILED } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/BlockWithEntity.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/BlockWithEntity.kt index 071cd3df3..e52137a1b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/BlockWithEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/BlockWithEntity.kt @@ -19,6 +19,7 @@ import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.entities.entities.player.Hands import de.bixilon.minosoft.data.registries.blocks.entites.BlockEntityType import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.PixLyzerBlock +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.registries.registry.RegistryItem @@ -26,16 +27,14 @@ import de.bixilon.minosoft.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import kotlin.reflect.jvm.javaField -abstract class BlockWithEntity(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data) { +abstract class BlockWithEntity(resourceLocation: ResourceLocation, registries: Registries, data: Map) : PixLyzerBlock(resourceLocation, registries, data), InteractBlockHandler { val factory: BlockEntityType? = null init { FACTORY_FIELD.inject(this) } - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { - return InteractionResults.SUCCESS - } + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?) = InteractionResults.SUCCESS private companion object { val FACTORY_FIELD = BlockWithEntity<*>::factory.javaField!! diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/ComparatorBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/ComparatorBlock.kt index bdcff18e2..e2362ee2a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/ComparatorBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/ComparatorBlock.kt @@ -19,19 +19,20 @@ 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.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler 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 // ToDo: This is a block with entity -open class ComparatorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data) { +open class ComparatorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data), InteractBlockHandler { override fun getPlacementState(connection: PlayConnection, target: BlockTarget): BlockState? { TODO() } - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { connection.world[target.blockPosition] = target.state.cycle(BlockProperties.STRUCTURE_BLOCK_MODE) return InteractionResults.SUCCESS diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/RepeaterBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/RepeaterBlock.kt index def2cdb4a..a59c2e14e 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/RepeaterBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/redstone/RepeaterBlock.kt @@ -19,18 +19,19 @@ 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.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler 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 RepeaterBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data) { +open class RepeaterBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data), InteractBlockHandler { override fun getPlacementState(connection: PlayConnection, target: BlockTarget): BlockState? { TODO() } - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { connection.world[target.blockPosition] = target.state.cycle(BlockProperties.REPEATER_DELAY) return InteractionResults.SUCCESS diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt index c9a311911..76a4e35c1 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/LeverBlock.kt @@ -24,6 +24,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.getFacing import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isPowered import de.bixilon.minosoft.data.registries.blocks.state.BlockState +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.particle.data.DustParticleData import de.bixilon.minosoft.data.registries.registries.Registries @@ -34,7 +35,7 @@ import de.bixilon.minosoft.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection import java.util.* -open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : WallMountedBlock(resourceLocation, registries, data) { +open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : WallMountedBlock(resourceLocation, registries, data), InteractBlockHandler { private val dustParticleType = registries.particleType[DustParticle] private fun spawnParticles(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, scale: Float) { @@ -60,7 +61,7 @@ open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries TODO() } - override fun onUse(connection: PlayConnection, target: BlockTarget, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults { val nextState = target.state.cycle(BlockProperties.POWERED) connection.world[target.blockPosition] = nextState spawnParticles(connection, nextState, target.blockPosition, 1.0f) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/InteractBlockHandler.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/InteractBlockHandler.kt new file mode 100644 index 000000000..a5f60da46 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/properties/InteractBlockHandler.kt @@ -0,0 +1,25 @@ +/* + * 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.properties + +import de.bixilon.minosoft.camera.target.targets.BlockTarget +import de.bixilon.minosoft.data.container.stack.ItemStack +import de.bixilon.minosoft.data.entities.entities.player.Hands +import de.bixilon.minosoft.input.interaction.InteractionResults +import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection + +interface InteractBlockHandler { + + fun interact(connection: PlayConnection, target: BlockTarget, hand: Hands, stack: ItemStack?): InteractionResults +} diff --git a/src/main/java/de/bixilon/minosoft/input/interaction/use/ShortUseHandler.kt b/src/main/java/de/bixilon/minosoft/input/interaction/use/ShortUseHandler.kt index 18d72d3c8..9d6976515 100644 --- a/src/main/java/de/bixilon/minosoft/input/interaction/use/ShortUseHandler.kt +++ b/src/main/java/de/bixilon/minosoft/input/interaction/use/ShortUseHandler.kt @@ -20,6 +20,7 @@ import de.bixilon.minosoft.camera.target.targets.GenericTarget import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.container.stack.ItemStack import de.bixilon.minosoft.data.entities.entities.player.Hands +import de.bixilon.minosoft.data.registries.blocks.types.properties.InteractBlockHandler import de.bixilon.minosoft.data.registries.item.handler.ItemInteractBlockHandler import de.bixilon.minosoft.data.registries.item.handler.item.ItemUseHandler import de.bixilon.minosoft.input.interaction.InteractionResults @@ -49,9 +50,9 @@ class ShortUseHandler( return InteractionResults.SUCCESS } - var result = target.state.block.onUse(connection, target, hand, stack) - if (result != InteractionResults.IGNORED) { - return result + if (target.state.block is InteractBlockHandler) { + val result = target.state.block.interact(connection, target, hand, stack) + if (result != InteractionResults.IGNORED) return result } if (stack == null) { @@ -62,8 +63,7 @@ class ShortUseHandler( } val item = stack.item.item if (item is ItemInteractBlockHandler) { - result = item.interactBlock(connection.player, target, hand, stack) - return result + return item.interactBlock(connection.player, target, hand, stack) } return InteractionResults.IGNORED