From 88c38c68bbaad0c26aa96e9fa4c59a90802e92a0 Mon Sep 17 00:00:00 2001 From: Bixilon Date: Sun, 16 May 2021 21:41:04 +0200 Subject: [PATCH] wip block interactions --- .../config/game/controls/KeyBindingsNames.kt | 8 ++ .../data/mappings/blocks/BlockState.kt | 45 ++++++++-- .../data/mappings/blocks/BlockUsages.kt | 37 +++++++++ .../blocks/entites/BlockEntityType.kt | 2 +- .../blocks/entites/BlockEntityTypeRegistry.kt | 13 +-- .../blocks/properties/BlockProperties.kt | 73 +++++++++-------- ...kt => BooleanBlockPropertiesSerializer.kt} | 2 +- .../data/mappings/blocks/{ => types}/Block.kt | 40 ++++++++- .../data/mappings/blocks/types/DoorBlock.kt | 68 +++++++++++++++ .../mappings/blocks/{ => types}/FluidBlock.kt | 2 +- .../minosoft/data/mappings/items/BlockItem.kt | 2 +- .../mappings/materials/DefaultMaterials.kt | 20 +++++ .../data/mappings/registry/Registry.kt | 2 +- .../data/mappings/versions/VersionMapping.kt | 4 +- .../de/bixilon/minosoft/data/world/World.kt | 9 ++ .../minosoft/gui/rendering/RenderWindow.kt | 4 +- .../gui/rendering/chunk/WorldRenderer.kt | 2 +- .../chunk/models/renderable/FluidRenderer.kt | 2 +- .../gui/rendering/input/InteractionHandler.kt | 82 +++++++++++++++++++ .../gui/rendering/input/camera/RaycastHit.kt | 1 + .../input/key/RenderWindowInputHandler.kt | 11 +++ .../minosoft/gui/rendering/util/VecUtil.kt | 2 +- .../packets/c2s/play/BlockBreakC2SP.kt | 2 +- .../packets/c2s/play/BlockPlaceC2SP.kt | 2 +- .../packets/s2c/play/BlockActionS2CP.kt | 2 +- .../packets/s2c/play/ContainerOpenS2CP.kt | 4 +- .../bixilon/minosoft/util/enum/ValuesEnum.kt | 8 ++ 27 files changed, 382 insertions(+), 67 deletions(-) create mode 100644 src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockUsages.kt rename src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/{BooleanBlocKPropertiesSerializer.kt => BooleanBlockPropertiesSerializer.kt} (94%) rename src/main/java/de/bixilon/minosoft/data/mappings/blocks/{ => types}/Block.kt (68%) create mode 100644 src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/DoorBlock.kt rename src/main/java/de/bixilon/minosoft/data/mappings/blocks/{ => types}/FluidBlock.kt (96%) create mode 100644 src/main/java/de/bixilon/minosoft/data/mappings/materials/DefaultMaterials.kt create mode 100644 src/main/java/de/bixilon/minosoft/gui/rendering/input/InteractionHandler.kt diff --git a/src/main/java/de/bixilon/minosoft/config/config/game/controls/KeyBindingsNames.kt b/src/main/java/de/bixilon/minosoft/config/config/game/controls/KeyBindingsNames.kt index 4e7fda6cd..c1bae1e46 100644 --- a/src/main/java/de/bixilon/minosoft/config/config/game/controls/KeyBindingsNames.kt +++ b/src/main/java/de/bixilon/minosoft/config/config/game/controls/KeyBindingsNames.kt @@ -47,6 +47,9 @@ object KeyBindingsNames { val CLOSE = ResourceLocation("minosoft:close") + val BLOCK_INTERACT = ResourceLocation("minosoft:interact_block") + + val SELECT_HOTBAR_SLOTS = arrayOf( ResourceLocation("minosoft:select_hotbar_slot_1"), ResourceLocation("minosoft:select_hotbar_slot_2"), @@ -200,5 +203,10 @@ object KeyBindingsNames { ), ignoreConsumer = true ), + BLOCK_INTERACT to KeyBinding( + mutableMapOf( + KeyAction.CHANGE to mutableSetOf(KeyCodes.MOUSE_BUTTON_RIGHT) + ) + ) ) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt index 81be2bdbc..d038787e2 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockState.kt @@ -19,6 +19,7 @@ import com.google.gson.JsonPrimitive import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.materials.Material import de.bixilon.minosoft.data.mappings.versions.VersionMapping import de.bixilon.minosoft.data.text.RGBColor @@ -28,10 +29,12 @@ import de.bixilon.minosoft.gui.rendering.chunk.models.loading.BlockModel import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockRenderer import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.MultipartRenderer +import de.bixilon.minosoft.util.enum.ValuesEnum import glm_.vec3.Vec3i import java.util.* import kotlin.math.abs import kotlin.random.Random +import kotlin.reflect.full.companionObjectInstance data class BlockState( val block: Block, @@ -111,7 +114,6 @@ data class BlockState( return renderers[abs(random.nextLong().toInt() % renderers.size)] } - companion object { fun deserialize(owner: Block, versionMapping: VersionMapping, data: JsonObject, models: Map): BlockState { @@ -225,10 +227,43 @@ data class BlockState( } } - // properties - fun isPowered(): Boolean? { - return properties[BlockProperties.POWERED] as Boolean? + fun withProperties(vararg properties: Pair): BlockState { + val newProperties = this.properties.toMutableMap() + for ((key, value) in properties) { + newProperties[key] = value + } + val wannabe = WannabeBlockState(resourceLocation = this.block.resourceLocation, properties = newProperties) + for (blockState in this.block.states) { + if (blockState.equals(wannabe)) { + return blockState + } + } + throw IllegalArgumentException("Can not find ${this.block.resourceLocation}, with properties: $properties") + } + + + fun cycle(property: BlockProperties): BlockState { + val currentValue = properties[property] ?: throw IllegalArgumentException("$this has no property $property") + + when (currentValue) { + is Boolean -> { + return withProperties(property to !currentValue) + } + is Number -> { + return try { + withProperties(property to (currentValue.toInt() + 1)) + } catch (exception: IllegalArgumentException) { + withProperties(property to 0) + } + } + is Enum<*> -> { + val values = currentValue::class.companionObjectInstance as ValuesEnum> + return withProperties(property to values.next(currentValue)) + } + else -> { + return this + } + } } - // ToDo } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockUsages.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockUsages.kt new file mode 100644 index 000000000..b2f44701a --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/BlockUsages.kt @@ -0,0 +1,37 @@ +/* + * Minosoft + * Copyright (C) 2021 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.mappings.blocks + +enum class BlockUsages { + /** + * Usage get consumed (like trying to open an iron door) without animation + */ + CONSUME, + + /** + * Usage get consumed (like pressing a button, opening a door, right clicking on block entities) with animation + */ + SUCCESS, + + /** + * Nothing happens from block side (e.g. right clicking on dirt). You can maybe place a block, whatever + */ + PASS, + + /** + * Nothing happens, basically `CONSUME`, but a requirement was not satisfied. + */ + FAIL, + ; +} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityType.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityType.kt index b61be11ae..40c3a5cbb 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityType.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityType.kt @@ -18,7 +18,7 @@ import de.bixilon.minosoft.data.entities.block.BlockEntity import de.bixilon.minosoft.data.entities.block.BlockEntityFactory import de.bixilon.minosoft.data.entities.block.DefaultBlockEntityMetaDataFactory import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.data.mappings.blocks.Block +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.registry.RegistryItem import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer import de.bixilon.minosoft.data.mappings.versions.VersionMapping diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityTypeRegistry.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityTypeRegistry.kt index 500c9b242..df35b244b 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityTypeRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/entites/BlockEntityTypeRegistry.kt @@ -13,25 +13,20 @@ package de.bixilon.minosoft.data.mappings.blocks.entites -import de.bixilon.minosoft.data.mappings.blocks.Block +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.registry.Registry import de.bixilon.minosoft.data.mappings.versions.VersionMapping class BlockEntityTypeRegistry( - private val versionMapping: VersionMapping, - private var parentRegistry: BlockEntityTypeRegistry? = null, -) : Registry() { + parentRegistry: BlockEntityTypeRegistry? = null, +) : Registry(parentRegistry) { private lateinit var blockTypeMap: MutableMap fun getByBlock(block: Block): BlockEntityType? { + val parentRegistry = super.parentRegistry as BlockEntityTypeRegistry? return blockTypeMap[block] ?: parentRegistry?.getByBlock(block) } - fun setParent(parent: BlockEntityTypeRegistry?) { - super.setParent(parent) - this.parentRegistry = parent - } - override fun postInit(versionMapping: VersionMapping) { super.postInit(versionMapping) blockTypeMap = mutableMapOf() diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt index 1428be13b..19c79a70b 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/BlockProperties.kt @@ -16,35 +16,35 @@ package de.bixilon.minosoft.data.mappings.blocks.properties import de.bixilon.minosoft.data.Axes import de.bixilon.minosoft.data.Directions import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BlockPropertiesSerializer -import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BooleanBlocKPropertiesSerializer +import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.BooleanBlockPropertiesSerializer import de.bixilon.minosoft.data.mappings.blocks.properties.serializer.IntBlockPropertiesSerializer import java.util.* enum class BlockProperties { - POWERED(BooleanBlocKPropertiesSerializer), - TRIGGERED(BooleanBlocKPropertiesSerializer), - INVERTED(BooleanBlocKPropertiesSerializer), - LIT(BooleanBlocKPropertiesSerializer), - WATERLOGGED(BooleanBlocKPropertiesSerializer), + POWERED(BooleanBlockPropertiesSerializer), + TRIGGERED(BooleanBlockPropertiesSerializer), + INVERTED(BooleanBlockPropertiesSerializer), + LIT(BooleanBlockPropertiesSerializer), + WATERLOGGED(BooleanBlockPropertiesSerializer), STAIR_DIRECTIONAL("shape", Shapes), STAIR_HALF("half", Halves), SLAB_TYPE("type", Halves), MOISTURE_LEVEL("moisture", IntBlockPropertiesSerializer), FLUID_LEVEL("level", IntBlockPropertiesSerializer), HONEY_LEVEL("honey_level", IntBlockPropertiesSerializer), - PISTON_EXTENDED("extended", BooleanBlocKPropertiesSerializer), + PISTON_EXTENDED("extended", BooleanBlockPropertiesSerializer), PISTON_TYPE("type", PistonTypes), - PISTON_SHORT("short", BooleanBlocKPropertiesSerializer), + PISTON_SHORT("short", BooleanBlockPropertiesSerializer), RAILS_SHAPE("shape", Shapes), - SNOWY(BooleanBlocKPropertiesSerializer), + SNOWY(BooleanBlockPropertiesSerializer), STAGE(IntBlockPropertiesSerializer), DISTANCE(IntBlockPropertiesSerializer), - LEAVES_PERSISTENT("persistent", BooleanBlocKPropertiesSerializer), + LEAVES_PERSISTENT("persistent", BooleanBlockPropertiesSerializer), BED_PART("part", BedParts), - BED_OCCUPIED("occupied", BooleanBlocKPropertiesSerializer), - TNT_UNSTABLE("unstable", BooleanBlocKPropertiesSerializer), + BED_OCCUPIED("occupied", BooleanBlockPropertiesSerializer), + TNT_UNSTABLE("unstable", BooleanBlockPropertiesSerializer), DOOR_HINGE("hinge", Sides), - DOOR_OPEN("open", BooleanBlocKPropertiesSerializer), + DOOR_OPEN("open", BooleanBlockPropertiesSerializer), AGE(IntBlockPropertiesSerializer), INSTRUMENT(Instruments), NOTE(IntBlockPropertiesSerializer), @@ -58,55 +58,55 @@ enum class BlockProperties { MULTIPART_DOWN("down", MultipartDirectionParser), SNOW_LAYERS("layers", IntBlockPropertiesSerializer), - FENCE_IN_WALL("in_wall", BooleanBlocKPropertiesSerializer), - SCAFFOLDING_BOTTOM("bottom", BooleanBlocKPropertiesSerializer), - TRIPWIRE_DISARMED("disarmed", BooleanBlocKPropertiesSerializer), - TRIPWIRE_IN_AIR("in_air", BooleanBlocKPropertiesSerializer), - TRIPWIRE_ATTACHED("attached", BooleanBlocKPropertiesSerializer), + FENCE_IN_WALL("in_wall", BooleanBlockPropertiesSerializer), + SCAFFOLDING_BOTTOM("bottom", BooleanBlockPropertiesSerializer), + TRIPWIRE_DISARMED("disarmed", BooleanBlockPropertiesSerializer), + TRIPWIRE_IN_AIR("in_air", BooleanBlockPropertiesSerializer), + TRIPWIRE_ATTACHED("attached", BooleanBlockPropertiesSerializer), STRUCTURE_BLOCK_MODE("mode", StructureBlockModes), - COMMAND_BLOCK_CONDITIONAL("conditional", BooleanBlocKPropertiesSerializer), - BUBBLE_COLUMN_DRAG("drag", BooleanBlocKPropertiesSerializer), + COMMAND_BLOCK_CONDITIONAL("conditional", BooleanBlockPropertiesSerializer), + BUBBLE_COLUMN_DRAG("drag", BooleanBlockPropertiesSerializer), BELL_ATTACHMENT("attachment", Attachments), - LANTERN_HANGING("hanging", BooleanBlocKPropertiesSerializer), + LANTERN_HANGING("hanging", BooleanBlockPropertiesSerializer), SEA_PICKLE_PICKLES("pickles", IntBlockPropertiesSerializer), - LECTERN_BOOK("has_book", BooleanBlocKPropertiesSerializer), + LECTERN_BOOK("has_book", BooleanBlockPropertiesSerializer), - BREWING_STAND_BOTTLE_0("has_bottle_0", BooleanBlocKPropertiesSerializer), - BREWING_STAND_BOTTLE_1("has_bottle_1", BooleanBlocKPropertiesSerializer), - BREWING_STAND_BOTTLE_2("has_bottle_2", BooleanBlocKPropertiesSerializer), + BREWING_STAND_BOTTLE_0("has_bottle_0", BooleanBlockPropertiesSerializer), + BREWING_STAND_BOTTLE_1("has_bottle_1", BooleanBlockPropertiesSerializer), + BREWING_STAND_BOTTLE_2("has_bottle_2", BooleanBlockPropertiesSerializer), CHEST_TYPE("type", ChestTypes), CAKE_BITES("bites", IntBlockPropertiesSerializer), BAMBOO_LEAVES("leaves", BambooLeaves), - REPEATER_LOCKED("locked", BooleanBlocKPropertiesSerializer), + REPEATER_LOCKED("locked", BooleanBlockPropertiesSerializer), REPEATER_DELAY("delay", IntBlockPropertiesSerializer), - PORTA_FRAME_EYE("eye", BooleanBlocKPropertiesSerializer), - JUKEBOX_HAS_RECORD("has_record", BooleanBlocKPropertiesSerializer), - CAMPFIRE_SIGNAL_FIRE("signal_fire", BooleanBlocKPropertiesSerializer), + PORTA_FRAME_EYE("eye", BooleanBlockPropertiesSerializer), + JUKEBOX_HAS_RECORD("has_record", BooleanBlockPropertiesSerializer), + CAMPFIRE_SIGNAL_FIRE("signal_fire", BooleanBlockPropertiesSerializer), TURTLE_EGS_EGGS("eggs", IntBlockPropertiesSerializer), TURTLE_EGGS_HATCH("hatch", IntBlockPropertiesSerializer), RESPAWN_ANCHOR_CHARGES("charges", IntBlockPropertiesSerializer), CANDLES(IntBlockPropertiesSerializer), FACE("face", Attachments), - HOPPER_ENABLED("enabled", BooleanBlocKPropertiesSerializer), + HOPPER_ENABLED("enabled", BooleanBlockPropertiesSerializer), DRIPSTONE_THICKNESS("thickness", Thicknesses), - LEGACY_BLOCK_UPDATE("block_update", BooleanBlocKPropertiesSerializer), - LEGACY_SMOOTH("smooth", BooleanBlocKPropertiesSerializer), + LEGACY_BLOCK_UPDATE("block_update", BooleanBlockPropertiesSerializer), + LEGACY_SMOOTH("smooth", BooleanBlockPropertiesSerializer), SCULK_SENSOR_PHASE("sculk_sensor_phase", SensorPhases), DRIPSTONE_TILT("tilt", Tilts), - CAVE_VINES_BERRIES("berries", BooleanBlocKPropertiesSerializer), + CAVE_VINES_BERRIES("berries", BooleanBlockPropertiesSerializer), VERTICAL_DIRECTION("vertical_direction", VerticalDirections), - LEGACY_CHECK_DECAY("check_decay", BooleanBlocKPropertiesSerializer), - LEGAVY_DECAYABLE("decayable", BooleanBlocKPropertiesSerializer), - LEGAVY_NODROP("nodrop", BooleanBlocKPropertiesSerializer), + LEGACY_CHECK_DECAY("check_decay", BooleanBlockPropertiesSerializer), + LEGAVY_DECAYABLE("decayable", BooleanBlockPropertiesSerializer), + LEGAVY_NODROP("nodrop", BooleanBlockPropertiesSerializer), AXIS("axis", Axes), FACING("facing", Directions), @@ -128,6 +128,7 @@ enum class BlockProperties { this.serializer = serializer } + companion object { private val PROPERTIES: Map> = run { val map: MutableMap> = mutableMapOf() diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlocKPropertiesSerializer.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt similarity index 94% rename from src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlocKPropertiesSerializer.kt rename to src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt index f66e76299..1be88fc63 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlocKPropertiesSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt @@ -13,7 +13,7 @@ package de.bixilon.minosoft.data.mappings.blocks.properties.serializer -object BooleanBlocKPropertiesSerializer : BlockPropertiesSerializer { +object BooleanBlockPropertiesSerializer : BlockPropertiesSerializer { override fun deserialize(value: Any): Boolean { if (value is Boolean) { diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt similarity index 68% rename from src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt rename to src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt index a046bb23f..f030d18bd 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/Block.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/Block.kt @@ -10,18 +10,28 @@ * * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.mappings.blocks +package de.bixilon.minosoft.data.mappings.blocks.types import com.google.gson.JsonObject +import de.bixilon.minosoft.data.entities.block.BlockEntity +import de.bixilon.minosoft.data.inventory.ItemStack import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.data.mappings.blocks.BlockUsages +import de.bixilon.minosoft.data.mappings.blocks.RandomOffsetTypes import de.bixilon.minosoft.data.mappings.blocks.entites.BlockEntityType +import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties import de.bixilon.minosoft.data.mappings.items.Item import de.bixilon.minosoft.data.mappings.registry.RegistryItem import de.bixilon.minosoft.data.mappings.registry.ResourceLocationDeserializer import de.bixilon.minosoft.data.mappings.versions.VersionMapping +import de.bixilon.minosoft.data.player.Hands import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.gui.rendering.TintColorCalculator import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer +import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit +import de.bixilon.minosoft.protocol.network.connection.PlayConnection +import glm_.vec3.Vec3i open class Block(final override val resourceLocation: ResourceLocation, mappings: VersionMapping, data: JsonObject) : RegistryItem { open val explosionResistance: Float = data["explosion_resistance"]?.asFloat ?: 0.0f @@ -50,12 +60,40 @@ open class Block(final override val resourceLocation: ResourceLocation, mappings return resourceLocation.full } + open fun getPlacementState(connection: PlayConnection, raycastHit: RaycastHit): BlockState { + return defaultState + } + + open fun onBreak(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState, blockEntity: BlockEntity?) { + + } + + open fun onPlace(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState) { + + } + + open fun canPlaceAt(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState): Boolean { + return true + } + + open fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack?): BlockUsages { + if (blockEntityType == null) { + return BlockUsages.PASS + } + return BlockUsages.SUCCESS + } + + fun withProperties(vararg properties: Pair): BlockState { + return this.defaultState.withProperties(*properties) + } + companion object : ResourceLocationDeserializer { override fun deserialize(mappings: VersionMapping?, resourceLocation: ResourceLocation, data: JsonObject): Block { check(mappings != null) { "VersionMapping is null!" } val block = when (data["class"].asString) { "FluidBlock" -> FluidBlock(resourceLocation, mappings, data) + "DoorBlock" -> DoorBlock(resourceLocation, mappings, data) else -> Block(resourceLocation, mappings, data) } diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/DoorBlock.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/DoorBlock.kt new file mode 100644 index 000000000..37a270293 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/DoorBlock.kt @@ -0,0 +1,68 @@ +/* + * Minosoft + * Copyright (C) 2021 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.mappings.blocks.types + +import com.google.gson.JsonObject +import de.bixilon.minosoft.data.Directions +import de.bixilon.minosoft.data.entities.block.BlockEntity +import de.bixilon.minosoft.data.inventory.ItemStack +import de.bixilon.minosoft.data.mappings.ResourceLocation +import de.bixilon.minosoft.data.mappings.blocks.BlockState +import de.bixilon.minosoft.data.mappings.blocks.BlockUsages +import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.mappings.blocks.properties.Halves +import de.bixilon.minosoft.data.mappings.materials.DefaultMaterials +import de.bixilon.minosoft.data.mappings.versions.VersionMapping +import de.bixilon.minosoft.data.player.Hands +import de.bixilon.minosoft.gui.rendering.input.camera.RaycastHit +import de.bixilon.minosoft.gui.rendering.util.VecUtil.plus +import de.bixilon.minosoft.protocol.network.connection.PlayConnection +import glm_.vec3.Vec3i + +open class DoorBlock(resourceLocation: ResourceLocation, mappings: VersionMapping, data: JsonObject) : Block(resourceLocation, mappings, data) { + + + override fun getPlacementState(connection: PlayConnection, raycastHit: RaycastHit): BlockState { + TODO() + } + + override fun onBreak(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState, blockEntity: BlockEntity?) { + if (blockState.properties[BlockProperties.STAIR_HALF] == Halves.LOWER) { + connection.world.forceSetBlock(blockPosition + Directions.UP, null) + } else { + connection.world.forceSetBlock(blockPosition + Directions.DOWN, null) + } + } + + override fun onPlace(connection: PlayConnection, blockPosition: Vec3i, blockState: BlockState) { + if (blockState.properties[BlockProperties.STAIR_HALF] == Halves.LOWER) { + connection.world.forceSetBlock(blockPosition + Directions.UP, blockState.withProperties(BlockProperties.STAIR_HALF to Halves.UPPER)) + } else { + connection.world.forceSetBlock(blockPosition + Directions.DOWN, blockState.withProperties(BlockProperties.STAIR_HALF to Halves.LOWER)) + } + } + + override fun use(connection: PlayConnection, blockState: BlockState, blockPosition: Vec3i, raycastHit: RaycastHit, hands: Hands, itemStack: ItemStack?): BlockUsages { + if (blockState.material.resourceLocation == DefaultMaterials.METAL) { + return BlockUsages.CONSUME + } + + val nextBlockState = blockState.cycle(BlockProperties.DOOR_OPEN) + + connection.world.setBlock(blockPosition, nextBlockState) + + return BlockUsages.SUCCESS + } + +} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/FluidBlock.kt b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/FluidBlock.kt similarity index 96% rename from src/main/java/de/bixilon/minosoft/data/mappings/blocks/FluidBlock.kt rename to src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/FluidBlock.kt index dc16a81fe..d45731846 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/blocks/FluidBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/blocks/types/FluidBlock.kt @@ -11,7 +11,7 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.mappings.blocks +package de.bixilon.minosoft.data.mappings.blocks.types import com.google.gson.JsonObject import de.bixilon.minosoft.data.mappings.ResourceLocation diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt b/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt index 34dd18cbe..76d36b8c3 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/items/BlockItem.kt @@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.mappings.items import com.google.gson.JsonObject import de.bixilon.minosoft.data.mappings.ResourceLocation -import de.bixilon.minosoft.data.mappings.blocks.Block +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.versions.VersionMapping open class BlockItem( diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/materials/DefaultMaterials.kt b/src/main/java/de/bixilon/minosoft/data/mappings/materials/DefaultMaterials.kt new file mode 100644 index 000000000..1624a0b1c --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/mappings/materials/DefaultMaterials.kt @@ -0,0 +1,20 @@ +/* + * Minosoft + * Copyright (C) 2021 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.mappings.materials + +import de.bixilon.minosoft.util.KUtil.asResourceLocation + +object DefaultMaterials { + val METAL = "minecraft:metal".asResourceLocation() +} diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt b/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt index 949403f19..62584ed90 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/registry/Registry.kt @@ -20,7 +20,7 @@ import de.bixilon.minosoft.util.collections.Clearable import de.bixilon.minosoft.util.json.ResourceLocationJsonMap.toResourceLocationMap open class Registry( - private var parentRegistry: Registry? = null, + protected var parentRegistry: Registry? = null, ) : Iterable, Clearable, Parentable> { private var initialized = false protected val idValueMap: MutableMap = mutableMapOf() diff --git a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt index 87923b199..6d3b89412 100644 --- a/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt +++ b/src/main/java/de/bixilon/minosoft/data/mappings/versions/VersionMapping.kt @@ -23,10 +23,10 @@ import de.bixilon.minosoft.data.mappings.* import de.bixilon.minosoft.data.mappings.biomes.Biome import de.bixilon.minosoft.data.mappings.biomes.BiomeCategory import de.bixilon.minosoft.data.mappings.biomes.BiomePrecipitation -import de.bixilon.minosoft.data.mappings.blocks.Block import de.bixilon.minosoft.data.mappings.blocks.BlockState import de.bixilon.minosoft.data.mappings.blocks.entites.BlockEntityType import de.bixilon.minosoft.data.mappings.blocks.entites.BlockEntityTypeRegistry +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.effects.StatusEffect import de.bixilon.minosoft.data.mappings.entities.EntityType import de.bixilon.minosoft.data.mappings.entities.villagers.VillagerProfession @@ -93,7 +93,7 @@ class VersionMapping { val entityMetaIndexMap: MutableMap = mutableMapOf() val entityRegistry: Registry = Registry() - val blockEntityTypeRegistry = BlockEntityTypeRegistry(this) + val blockEntityTypeRegistry = BlockEntityTypeRegistry() val blockEntityMetaDataTypeRegistry: Registry = Registry() val containerTypeRegistry: Registry = Registry() diff --git a/src/main/java/de/bixilon/minosoft/data/world/World.kt b/src/main/java/de/bixilon/minosoft/data/world/World.kt index 88d66e803..82f2d52da 100644 --- a/src/main/java/de/bixilon/minosoft/data/world/World.kt +++ b/src/main/java/de/bixilon/minosoft/data/world/World.kt @@ -80,6 +80,11 @@ class World( } else { VersionTweaker.transformBlock(blockState, sections, blockPosition.inChunkSectionPosition, blockPosition.sectionHeight) } + val inChunkPosition = blockPosition.inChunkPosition + it.getBlockState(inChunkPosition)?.let { oldBlockState -> + oldBlockState.block.onBreak(connection, blockPosition, oldBlockState, it.getBlockEntity(inChunkPosition)) + } + blockState?.block?.onPlace(connection, blockPosition, blockState) it.setBlockState(blockPosition.inChunkPosition, transformedBlockState) connection.fireEvent(BlockSetEvent( connection = connection, @@ -89,6 +94,10 @@ class World( } } + fun forceSetBlock(blockPosition: Vec3i, blockState: BlockState?) { + chunks[blockPosition.chunkPosition]?.setBlockState(blockPosition.inChunkPosition, blockState) + } + fun unloadChunk(chunkPosition: Vec2i) { chunks.remove(chunkPosition)?.let { connection.fireEvent(ChunkUnloadEvent(connection, chunkPosition)) diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt index 77360c7ab..1b36593ef 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/RenderWindow.kt @@ -260,8 +260,10 @@ class RenderWindow( glfwSetCursorPosCallback(windowId, inputHandler::mouseMove) + inputHandler.init() registerGlobalKeyCombinations() + connection.fireEvent(ScreenResizeEvent(previousScreenDimensions = Vec2i(0, 0), screenDimensions = screenDimensions)) @@ -327,7 +329,7 @@ class RenderWindow( glfwSwapBuffers(windowId) glfwPollEvents() - inputHandler.camera.draw() + inputHandler.draw() inputHandler.camera.handleInput(deltaFrameTime) // handle opengl context tasks, but limit it per frame diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt index d2b0a70d9..8da2fa5b0 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/WorldRenderer.kt @@ -18,8 +18,8 @@ import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames import de.bixilon.minosoft.data.Directions import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.data.mappings.blocks.BlockState -import de.bixilon.minosoft.data.mappings.blocks.FluidBlock import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.mappings.blocks.types.FluidBlock import de.bixilon.minosoft.data.mappings.versions.VersionMapping import de.bixilon.minosoft.data.world.Chunk import de.bixilon.minosoft.data.world.ChunkSection diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/FluidRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/FluidRenderer.kt index 181fe2c46..12f604a3f 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/FluidRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/models/renderable/FluidRenderer.kt @@ -2,9 +2,9 @@ package de.bixilon.minosoft.gui.rendering.chunk.models.renderable import de.bixilon.minosoft.data.Directions import de.bixilon.minosoft.data.mappings.biomes.Biome -import de.bixilon.minosoft.data.mappings.blocks.Block import de.bixilon.minosoft.data.mappings.blocks.BlockState import de.bixilon.minosoft.data.mappings.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.data.mappings.fluid.Fluid import de.bixilon.minosoft.data.text.RGBColor import de.bixilon.minosoft.data.world.World diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/InteractionHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/InteractionHandler.kt new file mode 100644 index 000000000..b4cbc6e3f --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/InteractionHandler.kt @@ -0,0 +1,82 @@ +/* + * Minosoft + * Copyright (C) 2021 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.gui.rendering.input + +import de.bixilon.minosoft.config.config.game.controls.KeyBindingsNames +import de.bixilon.minosoft.data.Directions +import de.bixilon.minosoft.data.mappings.blocks.BlockUsages +import de.bixilon.minosoft.data.player.Hands +import de.bixilon.minosoft.gui.rendering.RenderConstants +import de.bixilon.minosoft.gui.rendering.RenderWindow +import de.bixilon.minosoft.protocol.packets.c2s.play.ArmSwingC2SP +import de.bixilon.minosoft.protocol.packets.c2s.play.BlockPlaceC2SP +import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition + +class InteractionHandler( + val renderWindow: RenderWindow, +) { + private var lastInteraction = 0L + private var lastInteractionSent = 0L + + fun init() { + renderWindow.inputHandler.registerCheckCallback(KeyBindingsNames.BLOCK_INTERACT) + } + + private fun checkInteraction(isKeyDown: Boolean) { + val currentTime = System.currentTimeMillis() + if (!isKeyDown) { + lastInteraction = 0L + return + } + if (currentTime - lastInteraction < ProtocolDefinition.TICK_TIME * 5) { + return + } + + val raycastHit = renderWindow.inputHandler.camera.getTargetBlock() ?: return + + if (raycastHit.distance > RenderConstants.MAX_BLOCK_OUTLINE_RAYCAST_DISTANCE) { + return + } + + val usage = raycastHit.blockState.block.use(renderWindow.connection, raycastHit.blockState, raycastHit.blockPosition, raycastHit, Hands.MAIN_HAND, null) // ToDo + + when (usage) { + BlockUsages.SUCCESS -> { + if (currentTime - lastInteractionSent < ProtocolDefinition.TICK_TIME) { + return + } + renderWindow.connection.sendPacket(ArmSwingC2SP(Hands.MAIN_HAND)) + + renderWindow.connection.sendPacket(BlockPlaceC2SP( + position = raycastHit.blockPosition, + direction = Directions.NORTH, // ToDo + cursorPosition = raycastHit.hitPosition, + item = null, // ToDo + hand = Hands.MAIN_HAND, + insideBlock = false, // ToDo + )) + lastInteractionSent = currentTime + lastInteraction = currentTime + } + BlockUsages.PASS -> { + // use item or place block + } + } + + } + + fun draw() { + checkInteraction(renderWindow.inputHandler.isKeyBindingDown(KeyBindingsNames.BLOCK_INTERACT)) + } +} diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt index 7023402b8..c75d8429b 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/camera/RaycastHit.kt @@ -24,4 +24,5 @@ data class RaycastHit( val steps: Int, ) { val blockPosition = position.floor + val hitPosition = position.minus(blockPosition) } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt index e5eb62d51..6cccc8206 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/input/key/RenderWindowInputHandler.kt @@ -21,6 +21,7 @@ import de.bixilon.minosoft.data.mappings.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderConstants import de.bixilon.minosoft.gui.rendering.RenderWindow import de.bixilon.minosoft.gui.rendering.hud.elements.input.KeyConsumer +import de.bixilon.minosoft.gui.rendering.input.InteractionHandler import de.bixilon.minosoft.gui.rendering.input.camera.Camera import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.util.logging.Log @@ -41,6 +42,7 @@ class RenderWindowInputHandler( private var skipNextCharPress = false + private val interactionHandler = InteractionHandler(renderWindow) init { registerKeyCallback(KeyBindingsNames.DEBUG_MOUSE_CATCH) { @@ -54,6 +56,10 @@ class RenderWindowInputHandler( } } + fun init() { + interactionHandler.init() + } + var currentKeyConsumer: KeyConsumer? = null @@ -266,4 +272,9 @@ class RenderWindowInputHandler( } return false } + + fun draw() { + camera.draw() + interactionHandler.draw() + } } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt index 39d23d02a..c029bf137 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/util/VecUtil.kt @@ -19,8 +19,8 @@ import com.google.gson.JsonObject import de.bixilon.minosoft.Minosoft import de.bixilon.minosoft.data.Axes import de.bixilon.minosoft.data.Directions -import de.bixilon.minosoft.data.mappings.blocks.Block import de.bixilon.minosoft.data.mappings.blocks.RandomOffsetTypes +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.gui.rendering.chunk.models.loading.BlockModelElement import de.bixilon.minosoft.protocol.protocol.ProtocolDefinition import glm_.func.common.clamp diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt index 931c89bd2..8b20ee9f7 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockBreakC2SP.kt @@ -39,7 +39,7 @@ class BlockBreakC2SP( } else { buffer.writePosition(position) } - buffer.writeByte(direction?.ordinal ?: 0xFF) + buffer.writeByte(direction?.ordinal ?: 0x00) } override fun log() { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockPlaceC2SP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockPlaceC2SP.kt index e4fb9ed09..dcb994dee 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockPlaceC2SP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/c2s/play/BlockPlaceC2SP.kt @@ -27,7 +27,7 @@ class BlockPlaceC2SP( val position: Vec3i, val direction: Directions, val cursorPosition: Vec3, - val item: ItemStack, + val item: ItemStack?, val hand: Hands, val insideBlock: Boolean, ) : PlayC2SPacket { diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockActionS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockActionS2CP.kt index aa7ab5060..895bd56a4 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockActionS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/BlockActionS2CP.kt @@ -14,7 +14,7 @@ package de.bixilon.minosoft.protocol.packets.s2c.play import de.bixilon.minosoft.data.entities.block.BlockActionEntity import de.bixilon.minosoft.data.entities.block.DefaultBlockEntityMetaDataFactory -import de.bixilon.minosoft.data.mappings.blocks.Block +import de.bixilon.minosoft.data.mappings.blocks.types.Block import de.bixilon.minosoft.protocol.network.connection.PlayConnection import de.bixilon.minosoft.protocol.packets.s2c.PlayS2CPacket import de.bixilon.minosoft.protocol.protocol.PlayInByteBuffer diff --git a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ContainerOpenS2CP.kt b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ContainerOpenS2CP.kt index 87fc4dabe..3a186ee5d 100644 --- a/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ContainerOpenS2CP.kt +++ b/src/main/java/de/bixilon/minosoft/protocol/packets/s2c/play/ContainerOpenS2CP.kt @@ -26,9 +26,9 @@ import de.bixilon.minosoft.util.logging.LogMessageType class ContainerOpenS2CP(buffer: PlayInByteBuffer) : PlayS2CPacket() { val containerId: Byte = buffer.readByte() val containerType: ContainerType = if (buffer.versionId < V_14W03B) { - buffer.connection.mapping.containerTypeRegistry.get(buffer.readUnsignedByte()) + buffer.connection.mapping.containerTypeRegistry[buffer.readUnsignedByte()] } else { - buffer.connection.mapping.containerTypeRegistry.get(buffer.readResourceLocation())!! + buffer.connection.mapping.containerTypeRegistry[buffer.readResourceLocation()]!! } val title: ChatComponent = buffer.readChatComponent() val slotCount: Int = if (buffer.versionId < V_19W02A || buffer.versionId >= V_19W11A) { diff --git a/src/main/java/de/bixilon/minosoft/util/enum/ValuesEnum.kt b/src/main/java/de/bixilon/minosoft/util/enum/ValuesEnum.kt index ab31371ed..660bfeee4 100644 --- a/src/main/java/de/bixilon/minosoft/util/enum/ValuesEnum.kt +++ b/src/main/java/de/bixilon/minosoft/util/enum/ValuesEnum.kt @@ -24,4 +24,12 @@ interface ValuesEnum> { operator fun get(name: String): T { return NAME_MAP[name]!! } + + fun next(current: T): T { + val ordinal = current.ordinal + if (ordinal + 1 > VALUES.size) { + return VALUES[0] + } + return VALUES[ordinal + 1] + } }