From 6e044a8146d79721adaa1e9838d97323fb2a64f1 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Mon, 29 Nov 2021 20:52:48 +0100 Subject: [PATCH] fix block interacting --- .../minosoft/data/registries/blocks/types/Block.kt | 3 ++- .../data/registries/blocks/types/CampfireBlock.kt | 12 ++++++------ .../data/registries/blocks/types/DoorBlock.kt | 8 ++++---- .../data/registries/blocks/types/NoteBlock.kt | 6 ++---- .../blocks/types/button/AbstractButtonBlock.kt | 10 ++++------ .../blocks/types/redstone/ComparatorBlock.kt | 6 +++--- .../blocks/types/redstone/RepeaterBlock.kt | 6 +++--- .../data/registries/blocks/types/wall/LeverBlock.kt | 9 +++++---- .../data/registries/items/block/BlockItem.kt | 8 +++++++- .../input/interaction/InteractInteractionHandler.kt | 6 ++++++ 10 files changed, 42 insertions(+), 32 deletions(-) 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 e86280b1e..87fbacd69 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 @@ -28,6 +28,7 @@ import de.bixilon.minosoft.data.registries.items.Item 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.ResourceLocationDeserializer +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.gui.rendering.tint.TintProvider @@ -83,7 +84,7 @@ open class Block( open fun canPlaceAt(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState): Boolean = true - open fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + open fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { if (blockEntityType == null) { return InteractionResults.PASS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/CampfireBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/CampfireBlock.kt index 0c7db6aaa..9a7d91100 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/CampfireBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/CampfireBlock.kt @@ -21,7 +21,7 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.items.tools.ShovelItem import de.bixilon.minosoft.data.registries.registries.Registries -import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.campfire.CampfireSmokeParticle import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.fire.SmokeParticle @@ -92,13 +92,13 @@ open class CampfireBlock(resourceLocation: ResourceLocation, registries: Registr } } - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { // ToDo: Ignite (flint and steel, etc) - if (itemStack?.item !is ShovelItem || blockState.properties[BlockProperties.LIT] != true) { - return super.onUse(connection, blockState, blockPosition, raycastHit, hand, itemStack) + if (itemStack?.item !is ShovelItem || hit.blockState.properties[BlockProperties.LIT] != true) { + return super.onUse(connection, hit, hand, itemStack) } - connection.world.setBlockState(blockPosition, blockState.withProperties(BlockProperties.LIT to false)) - extinguish(connection, blockState, blockPosition) + connection.world.setBlockState(hit.blockPosition, hit.blockState.withProperties(BlockProperties.LIT to false)) + extinguish(connection, hit.blockState, hit.blockPosition) return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/DoorBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/DoorBlock.kt index 1d0e4da76..e77b6eeb6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/DoorBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/DoorBlock.kt @@ -21,10 +21,10 @@ import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.materials.DefaultMaterials import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import glm_.vec3.Vec3i open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : DoubleSizeBlock(resourceLocation, registries, data) { @@ -32,12 +32,12 @@ open class DoorBlock(resourceLocation: ResourceLocation, registries: Registries, TODO() } - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { - if (blockState.material.resourceLocation == DefaultMaterials.METAL) { + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + if (hit.blockState.material.resourceLocation == DefaultMaterials.METAL) { return InteractionResults.CONSUME } - connection.world[blockPosition] = blockState.cycle(BlockProperties.DOOR_OPEN) + connection.world[hit.blockPosition] = hit.blockState.cycle(BlockProperties.DOOR_OPEN) return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt index 2c2fceac2..8f5397aef 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/NoteBlock.kt @@ -17,16 +17,14 @@ import de.bixilon.minosoft.data.inventory.ItemStack import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.data.registries.ResourceLocation import de.bixilon.minosoft.data.registries.blocks.BlockFactory -import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.registries.Registries -import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import glm_.vec3.Vec3i open class NoteBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : Block(resourceLocation, registries, data) { - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/button/AbstractButtonBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/button/AbstractButtonBlock.kt index 3304cd298..1ba312be8 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/button/AbstractButtonBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/button/AbstractButtonBlock.kt @@ -16,22 +16,20 @@ package de.bixilon.minosoft.data.registries.blocks.types.button import de.bixilon.minosoft.data.inventory.ItemStack import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.data.registries.ResourceLocation -import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.registries.Registries -import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import glm_.vec3.Vec3i abstract class AbstractButtonBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : Block(resourceLocation, registries, data) { - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { - if (blockState.properties[BlockProperties.POWERED] == true) { + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + if (hit.blockState.properties[BlockProperties.POWERED] == true) { return InteractionResults.CONSUME } - connection.world[blockPosition] = blockState.withProperties(BlockProperties.POWERED to true) + connection.world[hit.blockPosition] = hit.blockState.withProperties(BlockProperties.POWERED to true) return InteractionResults.SUCCESS } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/ComparatorBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/ComparatorBlock.kt index fff74aa72..f0b7e70a7 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/ComparatorBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/ComparatorBlock.kt @@ -20,10 +20,10 @@ import de.bixilon.minosoft.data.registries.blocks.BlockFactory import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import glm_.vec3.Vec3i open class ComparatorBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data) { @@ -31,8 +31,8 @@ open class ComparatorBlock(resourceLocation: ResourceLocation, registries: Regis TODO() } - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { - connection.world[blockPosition] = blockState.cycle(BlockProperties.STRUCTURE_BLOCK_MODE) + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + connection.world[hit.blockPosition] = hit.blockState.cycle(BlockProperties.STRUCTURE_BLOCK_MODE) return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/RepeaterBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/RepeaterBlock.kt index 8905ad9f8..2ce5c9430 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/RepeaterBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/redstone/RepeaterBlock.kt @@ -20,10 +20,10 @@ import de.bixilon.minosoft.data.registries.blocks.BlockFactory import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.registries.Registries +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.protocol.network.connection.play.PlayConnection -import glm_.vec3.Vec3i open class RepeaterBlock(resourceLocation: ResourceLocation, registries: Registries, data: Map) : RedstoneGateBlock(resourceLocation, registries, data) { @@ -31,8 +31,8 @@ open class RepeaterBlock(resourceLocation: ResourceLocation, registries: Registr TODO() } - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { - connection.world[blockPosition] = blockState.cycle(BlockProperties.REPEATER_DELAY) + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + connection.world[hit.blockPosition] = hit.blockState.cycle(BlockProperties.REPEATER_DELAY) return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wall/LeverBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wall/LeverBlock.kt index d61f4c241..135620e1c 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wall/LeverBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/wall/LeverBlock.kt @@ -23,6 +23,7 @@ import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.particle.data.DustParticleData import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.text.Colors +import de.bixilon.minosoft.gui.rendering.input.camera.hit.BlockRaycastHit import de.bixilon.minosoft.gui.rendering.input.camera.hit.RaycastHit import de.bixilon.minosoft.gui.rendering.input.interaction.InteractionResults import de.bixilon.minosoft.gui.rendering.particle.types.render.texture.simple.dust.DustParticle @@ -59,10 +60,10 @@ open class LeverBlock(resourceLocation: ResourceLocation, registries: Registries TODO() } - override fun onUse(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { - val nextState = blockState.cycle(BlockProperties.POWERED) - connection.world[blockPosition] = nextState - spawnParticles(connection, nextState, blockPosition, 1.0f) + override fun onUse(connection: PlayConnection, hit: BlockRaycastHit, hand: Hands, itemStack: ItemStack?): InteractionResults { + val nextState = hit.blockState.cycle(BlockProperties.POWERED) + connection.world[hit.blockPosition] = nextState + spawnParticles(connection, nextState, hit.blockPosition, 1.0f) return InteractionResults.SUCCESS } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/items/block/BlockItem.kt b/src/main/java/de/bixilon/minosoft/data/registries/items/block/BlockItem.kt index 9e08c1f8e..b52faf727 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/items/block/BlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/items/block/BlockItem.kt @@ -17,6 +17,7 @@ import de.bixilon.minosoft.data.abilities.Gamemodes import de.bixilon.minosoft.data.inventory.ItemStack import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.data.registries.ResourceLocation +import de.bixilon.minosoft.data.registries.blocks.BlockState import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.items.Item import de.bixilon.minosoft.data.registries.registries.Registries @@ -56,7 +57,12 @@ open class BlockItem( } - val placeBlockState = block!!.getPlacementState(connection, raycastHit) ?: return InteractionResults.PASS + var placeBlockState: BlockState = block!!.defaultState + try { + placeBlockState = block.getPlacementState(connection, raycastHit) ?: return InteractionResults.PASS + } catch (exception: Exception) { + exception.printStackTrace() + } val collisionShape = placeBlockState.collisionShape + placePosition for (entity in connection.world.entities) { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt index cb5b55d8d..7a786e9e8 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/interaction/InteractInteractionHandler.kt @@ -85,10 +85,16 @@ class InteractInteractionHandler( hand = hand, insideBlock = false, // ToDo: insideBlock )) + if (connection.player.gamemode == Gamemodes.SPECTATOR) { return InteractionResults.SUCCESS } + val result = hit.blockState.block.onUse(connection, hit, hand, item) + if (result == InteractionResults.SUCCESS) { + return InteractionResults.SUCCESS + } + if (item == null) { return InteractionResults.PASS }