diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt b/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt index 1e16fc950..f23c5b69a 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/MinosoftSIT.kt @@ -18,6 +18,7 @@ import de.bixilon.minosoft.assets.meta.MinosoftMeta import de.bixilon.minosoft.assets.properties.version.AssetsVersionProperties import de.bixilon.minosoft.data.registries.fallback.FallbackRegistries import de.bixilon.minosoft.data.registries.fallback.tags.FallbackTags +import de.bixilon.minosoft.datafixer.DataFixer import de.bixilon.minosoft.protocol.versions.VersionLoader import de.bixilon.minosoft.test.IT import de.bixilon.minosoft.test.ITUtil @@ -37,6 +38,7 @@ internal object MinosoftSIT { disableGC() Log.log(LogMessageType.OTHER, LogLevels.INFO) { "Setting up integration tests...." } initAssetsManager() + DataFixer.load() loadVersionsJson() loadAssetsProperties() loadDefaultRegistries() diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/flowing/FlowingFluidIT.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/flowing/FlowingFluidIT.kt index e340732f4..f854fcb55 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/flowing/FlowingFluidIT.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/flowing/FlowingFluidIT.kt @@ -18,7 +18,6 @@ import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.data.physics.PhysicsTestUtil.createPlayer import de.bixilon.minosoft.data.physics.PhysicsTestUtil.runTicks -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.stone.StoneTest0 import de.bixilon.minosoft.data.world.World @@ -31,14 +30,14 @@ import kotlin.math.abs abstract class FlowingFluidIT { protected val levels by lazy { arrayOf( - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 6), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 5), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 4), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 3), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 2), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 1), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0), + block!!.states.withProperties(FluidBlock.LEVEL to 7), + block!!.states.withProperties(FluidBlock.LEVEL to 6), + block!!.states.withProperties(FluidBlock.LEVEL to 5), + block!!.states.withProperties(FluidBlock.LEVEL to 4), + block!!.states.withProperties(FluidBlock.LEVEL to 3), + block!!.states.withProperties(FluidBlock.LEVEL to 2), + block!!.states.withProperties(FluidBlock.LEVEL to 1), + block!!.states.withProperties(FluidBlock.LEVEL to 0), ) } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/MixedFluidIT.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/MixedFluidIT.kt index f9ce1befc..aefdb29d1 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/MixedFluidIT.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/MixedFluidIT.kt @@ -21,7 +21,6 @@ import de.bixilon.minosoft.data.physics.PhysicsTestUtil.assertPosition import de.bixilon.minosoft.data.physics.PhysicsTestUtil.assertVelocity import de.bixilon.minosoft.data.physics.PhysicsTestUtil.createPlayer import de.bixilon.minosoft.data.physics.PhysicsTestUtil.runTicks -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.stone.StoneTest0 import de.bixilon.minosoft.data.registries.fluid.fluids.LavaFluid @@ -44,9 +43,9 @@ class MixedFluidIT { } private fun World.fill() { - this[Vec3i(10, 2, 3)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + this[Vec3i(10, 2, 3)] = lava!!.states.withProperties(FluidBlock.LEVEL to 0) this[Vec3i(10, 1, 3)] = StoneTest0.state - this[Vec3i(10, 2, 4)] = water!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + this[Vec3i(10, 2, 4)] = water!!.states.withProperties(FluidBlock.LEVEL to 0) this[Vec3i(10, 1, 4)] = StoneTest0.state } @@ -78,7 +77,7 @@ class MixedFluidIT { fun stillLavaAndLava2() { val player = createPlayer(createConnection(3)) player.connection.world.fill() - player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(FluidBlock.LEVEL to 0) player.forceTeleport(Vec3d(10.0, 2.0, 3.8)) player.input = PlayerMovementInput(forward = true) @@ -92,8 +91,8 @@ class MixedFluidIT { fun mixedHeight1() { val player = createPlayer(createConnection(3)) player.connection.world[Vec3i(10, 1, 4)] = StoneTest0.state - player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) - player.connection.world[Vec3i(10, 3, 4)] = water!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) + player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(FluidBlock.LEVEL to 7) + player.connection.world[Vec3i(10, 3, 4)] = water!!.states.withProperties(FluidBlock.LEVEL to 7) player.forceTeleport(Vec3d(10.0, 2.0, 3.8)) player.runTicks(2) player.input = PlayerMovementInput(jump = true, forward = true) @@ -106,8 +105,8 @@ class MixedFluidIT { fun mixedHeight2() { val player = createPlayer(createConnection(3)) player.connection.world[Vec3i(10, 1, 4)] = StoneTest0.state - player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) - player.connection.world[Vec3i(10, 3, 4)] = water!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) + player.connection.world[Vec3i(10, 2, 4)] = lava!!.states.withProperties(FluidBlock.LEVEL to 7) + player.connection.world[Vec3i(10, 3, 4)] = water!!.states.withProperties(FluidBlock.LEVEL to 7) player.forceTeleport(Vec3d(10.0, 2.0, 3.8)) player.runTicks(2) player.input = PlayerMovementInput(jump = true, forward = true) @@ -120,8 +119,8 @@ class MixedFluidIT { fun mixedHeight3() { val player = createPlayer(createConnection(3)) player.connection.world[Vec3i(10, 1, 4)] = StoneTest0.state - player.connection.world[Vec3i(10, 2, 4)] = water!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) - player.connection.world[Vec3i(10, 3, 4)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) + player.connection.world[Vec3i(10, 2, 4)] = water!!.states.withProperties(FluidBlock.LEVEL to 7) + player.connection.world[Vec3i(10, 3, 4)] = lava!!.states.withProperties(FluidBlock.LEVEL to 7) player.forceTeleport(Vec3d(10.0, 2.0, 3.8)) player.runTicks(2) player.input = PlayerMovementInput(jump = true, forward = true) @@ -134,8 +133,8 @@ class MixedFluidIT { fun mixedHeight4() { val player = createPlayer(createConnection(3)) player.connection.world[Vec3i(10, 1, 4)] = StoneTest0.state - player.connection.world[Vec3i(10, 2, 4)] = water!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) - player.connection.world[Vec3i(10, 3, 4)] = lava!!.states.withProperties(BlockProperties.FLUID_LEVEL to 7) + player.connection.world[Vec3i(10, 2, 4)] = water!!.states.withProperties(FluidBlock.LEVEL to 7) + player.connection.world[Vec3i(10, 3, 4)] = lava!!.states.withProperties(FluidBlock.LEVEL to 7) player.forceTeleport(Vec3d(10.0, 2.0, 3.8)) player.runTicks(2) player.input = PlayerMovementInput(jump = true, forward = true) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/StillFluidIT.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/StillFluidIT.kt index 87834f33e..0b09a27f7 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/StillFluidIT.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/physics/fluid/still/StillFluidIT.kt @@ -18,7 +18,6 @@ import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.entities.entities.player.local.LocalPlayerEntity import de.bixilon.minosoft.data.physics.PhysicsTestUtil.createPlayer import de.bixilon.minosoft.data.physics.PhysicsTestUtil.runTicks -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.stone.StoneTest0 import de.bixilon.minosoft.data.world.WorldTestUtil.fill @@ -32,7 +31,7 @@ abstract class StillFluidIT { connection.world.fill( Vec3i(-10, 16, -10), Vec3i(20, 16, 20), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + block!!.states.withProperties(FluidBlock.LEVEL to 0) ) connection.world.fill(Vec3i(-10, 15, -10), Vec3i(20, 15, 20), StoneTest0.state) @@ -43,7 +42,7 @@ abstract class StillFluidIT { connection.world.fill( Vec3i(-10, 16, -10), Vec3i(20, 20, 20), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + block!!.states.withProperties(FluidBlock.LEVEL to 0) ) connection.world.fill(Vec3i(-10, 15, -10), Vec3i(20, 15, 20), StoneTest0.state) @@ -60,7 +59,7 @@ abstract class StillFluidIT { player.connection.world.fill( Vec3i(4, 5, 7), Vec3i(4, 16, 7), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + block!!.states.withProperties(FluidBlock.LEVEL to 0) ) player.forceTeleport(Vec3d(4.0, 18.0, 7.0)) player.runTicks(10) @@ -72,7 +71,7 @@ abstract class StillFluidIT { player.connection.world.fill( Vec3i(4, 5, 7), Vec3i(4, 16, 7), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + block!!.states.withProperties(FluidBlock.LEVEL to 0) ) player.forceTeleport(Vec3d(4.0, 30.0, 7.0)) player.runTicks(35) @@ -100,7 +99,7 @@ abstract class StillFluidIT { connection.world.fill( Vec3i(-10, 16, -10), Vec3i(20, 17, 20), - block!!.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + block!!.states.withProperties(FluidBlock.LEVEL to 0) ) connection.world.fill(Vec3i(-10, 15, -10), Vec3i(20, 15, 20), StoneTest0.state) diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/fluid/fluids/WaterFluidTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/fluid/fluids/WaterFluidTest.kt index cd82b3e37..56cbd5509 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/fluid/fluids/WaterFluidTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/fluid/fluids/WaterFluidTest.kt @@ -36,22 +36,22 @@ class WaterFluidTest { } fun heightLevel0() { - val state = block.states.withProperties(BlockProperties.FLUID_LEVEL to 0) + val state = block.states.withProperties(FluidBlock.LEVEL to 0) assertEquals(this.water.getHeight(state), 0.8888889f) } fun heightLevel2() { - val state = block.states.withProperties(BlockProperties.FLUID_LEVEL to 2) + val state = block.states.withProperties(FluidBlock.LEVEL to 2) assertEquals(this.water.getHeight(state), 0.6666667f) } fun heightLevel8() { - val state = block.states.withProperties(BlockProperties.FLUID_LEVEL to 8) + val state = block.states.withProperties(FluidBlock.LEVEL to 8) assertEquals(this.water.getHeight(state), 0.8888889f) } fun heightLevel12() { - val state = block.states.withProperties(BlockProperties.FLUID_LEVEL to 12) + val state = block.states.withProperties(FluidBlock.LEVEL to 12) assertEquals(this.water.getHeight(state), 0.8888889f) } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/versions/registries/pixlyzer/PixLyzerLoadingTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/versions/registries/pixlyzer/PixLyzerLoadingTest.kt index 58042ed49..a63043e57 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/versions/registries/pixlyzer/PixLyzerLoadingTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/data/registries/versions/registries/pixlyzer/PixLyzerLoadingTest.kt @@ -24,7 +24,7 @@ abstract class PixLyzerLoadingTest(version: String) : RegistryLoadingTest(versio @Test(priority = 100000) open fun loadRegistries() { - throw SkipException("temp") + throw SkipException("temp") // TODO: remove this._registries = ITUtil.loadPixlyzerData(version) } diff --git a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/block/state/variant/PropertyVariantBlockModelTest.kt b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/block/state/variant/PropertyVariantBlockModelTest.kt index c4cecbdf4..8cabf0d09 100644 --- a/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/block/state/variant/PropertyVariantBlockModelTest.kt +++ b/src/integration-test/kotlin/de/bixilon/minosoft/gui/rendering/models/block/state/variant/PropertyVariantBlockModelTest.kt @@ -13,6 +13,7 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.variant +import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.exception.Broken import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties @@ -46,7 +47,7 @@ class PropertyVariantBlockModelTest { mapOf(BlockProperties.FACING to Directions.WEST, BlockProperties.LIT to false) to B, mapOf(BlockProperties.FACING to Directions.SOUTH) to C, mapOf(BlockProperties.LIT to false) to D, - )) + ).unsafeCast()) assertEquals(model.choose(PropertyBlockState(DummyBlock, mapOf(BlockProperties.FACING to Directions.EAST, BlockProperties.LIT to true), 0)), A) assertEquals(model.choose(PropertyBlockState(DummyBlock, mapOf(BlockProperties.FACING to Directions.WEST, BlockProperties.LIT to false), 0)), B) assertNull(model.choose(PropertyBlockState(DummyBlock, mapOf(BlockProperties.FACING to Directions.WEST, BlockProperties.LIT to true), 0))) diff --git a/src/main/java/de/bixilon/minosoft/data/Axes.kt b/src/main/java/de/bixilon/minosoft/data/Axes.kt index a9a298c33..ad3a49c29 100644 --- a/src/main/java/de/bixilon/minosoft/data/Axes.kt +++ b/src/main/java/de/bixilon/minosoft/data/Axes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum import de.bixilon.minosoft.data.direction.Directions -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Axes { X { @@ -35,7 +34,7 @@ enum class Axes { abstract fun next(): Axes abstract fun previous(): Axes - companion object : ValuesEnum, BlockPropertiesSerializer { + companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) @@ -46,9 +45,5 @@ enum class Axes { Directions.NORTH, Directions.SOUTH -> Z } } - - override fun deserialize(value: Any): Axes { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt index 1bfd7e697..84fa76506 100644 --- a/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt +++ b/src/main/java/de/bixilon/minosoft/data/direction/Directions.kt @@ -16,17 +16,12 @@ import de.bixilon.kotlinglm.mat4x4.Mat4 import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kotlinglm.vec3.Vec3i -import de.bixilon.kotlinglm.vec3.swizzle.xy -import de.bixilon.kotlinglm.vec3.swizzle.xz -import de.bixilon.kotlinglm.vec3.swizzle.yz -import de.bixilon.kotlinglm.vec3.swizzle.zy import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.cast.CastUtil.unsafeNull import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum import de.bixilon.kutil.reflection.ReflectionUtil.forceSet import de.bixilon.minosoft.data.Axes -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.world.chunk.ChunkSection import de.bixilon.minosoft.gui.rendering.util.vec.vec3.Vec3iUtil.get @@ -134,7 +129,7 @@ enum class Directions( } - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { const val O_DOWN = 0 // Directions.DOWN.ordinal const val O_UP = 1 // Directions.UP.ordinal const val O_NORTH = 2 // Directions.NORTH.ordinal @@ -157,10 +152,6 @@ enum class Directions( val XYZ = arrayOf(WEST, EAST, DOWN, UP, NORTH, SOUTH) - override fun deserialize(value: Any): Directions { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } - private const val MIN_ERROR = 0.0001f @Deprecated("outsource") diff --git a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt index 1cef29fbe..b1f8cba19 100644 --- a/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt +++ b/src/main/java/de/bixilon/minosoft/data/entities/block/CampfireBlockEntity.kt @@ -23,8 +23,8 @@ import de.bixilon.minosoft.data.container.ItemStackUtil import de.bixilon.minosoft.data.container.stack.ItemStack import de.bixilon.minosoft.data.direction.DirectionUtil.rotateY import de.bixilon.minosoft.data.direction.Directions -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.getFacing -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isLit +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.getFacing +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.isLit import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.CampfireBlock import de.bixilon.minosoft.data.registries.identified.Namespaces.minecraft diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/BlockRegistry.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/BlockRegistry.kt index faede8798..eafda8fba 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/BlockRegistry.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/BlockRegistry.kt @@ -20,7 +20,7 @@ import de.bixilon.kutil.json.JsonObject import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.blocks.factory.BlockFactories import de.bixilon.minosoft.data.registries.blocks.factory.BlockFactory -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.settings.BlockSettings import de.bixilon.minosoft.data.registries.blocks.state.AdvancedBlockState import de.bixilon.minosoft.data.registries.blocks.state.BlockState @@ -58,7 +58,7 @@ class BlockRegistry( } - val properties: MutableMap> = mutableMapOf() + val properties: MutableMap, MutableSet> = mutableMapOf() val states: MutableSet = ObjectOpenHashSet() for (stateJson in statesData) { @@ -83,7 +83,7 @@ class BlockRegistry( } fun flattened(block: Block, data: JsonObject, registries: Registries) { - val properties: MutableMap> = mutableMapOf() + val properties: MutableMap, MutableSet> = mutableMapOf() val states: MutableSet = ObjectOpenHashSet() for ((stateId, stateJson) in data["states"].asAnyMap()) { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Attachments.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Attachments.kt index 0975aabc2..2777b13aa 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Attachments.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Attachments.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Attachments { FLOOR, @@ -25,13 +24,8 @@ enum class Attachments { DOUBLE_WALL, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Attachments { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } - } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BambooLeaves.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BambooLeaves.kt index d4ef1bc36..0601a5abd 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BambooLeaves.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BambooLeaves.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class BambooLeaves { NONE, @@ -23,12 +22,8 @@ enum class BambooLeaves { LARGE, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): BambooLeaves { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BedParts.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BedParts.kt index 8a0408d2e..cb9591100 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BedParts.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BedParts.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,19 +15,14 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class BedParts { HEAD, FOOT, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): BedParts { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperties.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperties.kt index 289afa17b..51b95a59f 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperties.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperties.kt @@ -15,165 +15,158 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.minosoft.data.Axes import de.bixilon.minosoft.data.direction.Directions -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BooleanBlockPropertiesSerializer -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.IntBlockPropertiesSerializer +import de.bixilon.minosoft.data.registries.blocks.properties.primitives.BooleanProperty +import de.bixilon.minosoft.data.registries.blocks.properties.primitives.IntProperty import de.bixilon.minosoft.data.registries.blocks.state.BlockState -import java.util.* -@Deprecated("Will be split and refactored") -enum class BlockProperties { - 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_TYPE("type", PistonTypes), - PISTON_SHORT("short", BooleanBlockPropertiesSerializer), - RAILS_SHAPE("shape", Shapes), - SNOWY(BooleanBlockPropertiesSerializer), - STAGE(IntBlockPropertiesSerializer), - DISTANCE(IntBlockPropertiesSerializer), - LEAVES_PERSISTENT("persistent", BooleanBlockPropertiesSerializer), - BED_PART("part", BedParts), - BED_OCCUPIED("occupied", BooleanBlockPropertiesSerializer), - TNT_UNSTABLE("unstable", BooleanBlockPropertiesSerializer), - DOOR_HINGE("hinge", Sides), - DOOR_OPEN("open", BooleanBlockPropertiesSerializer), - AGE(IntBlockPropertiesSerializer), - INSTRUMENT(Instruments), - NOTE(IntBlockPropertiesSerializer), - REDSTONE_POWER("power", IntBlockPropertiesSerializer), - - MULTIPART_NORTH("north", MultipartDirectionParser), - MULTIPART_WEST("west", MultipartDirectionParser), - MULTIPART_SOUTH("south", MultipartDirectionParser), - MULTIPART_EAST("east", MultipartDirectionParser), - MULTIPART_UP("up", MultipartDirectionParser), - 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), - STRUCTURE_BLOCK_MODE("mode", StructureBlockModes), - COMMAND_BLOCK_CONDITIONAL("conditional", BooleanBlockPropertiesSerializer), - BUBBLE_COLUMN_DRAG("drag", BooleanBlockPropertiesSerializer), - BELL_ATTACHMENT("attachment", Attachments), - LANTERN_HANGING("hanging", BooleanBlockPropertiesSerializer), - SEA_PICKLE_PICKLES("pickles", IntBlockPropertiesSerializer), - 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), - - CHEST_TYPE("type", ChestTypes), - - CAKE_BITES("bites", IntBlockPropertiesSerializer), - BAMBOO_LEAVES("leaves", BambooLeaves), - REPEATER_LOCKED("locked", BooleanBlockPropertiesSerializer), - REPEATER_DELAY("delay", IntBlockPropertiesSerializer), - PORTAL_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), - - DRIPSTONE_THICKNESS("thickness", Thicknesses), +@Deprecated("Fallback data") +object BlockProperties { + private val list: MutableList> = mutableListOf() - 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), + val POWERED = BooleanProperty("powered").register() + val TRIGGERED = BooleanProperty("triggered").register() + val INVERTED = BooleanProperty("inverted").register() + val LIT = BooleanProperty("lit").register() + val WATERLOGGED = BooleanProperty("waterlogged").register() + val STAIR_DIRECTIONAL = EnumProperty("shape", Shapes).register() + val STAIR_HALF = EnumProperty("half", Halves).register() + val SLAB_TYPE = EnumProperty("type", Halves).register() + val FLUID_LEVEL = IntProperty("level", 0..15).register() + val MOISTURE_LEVEL = IntProperty("moisture").register() + val HONEY_LEVEL = IntProperty("honey_level").register() + val PISTON_EXTENDED = BooleanProperty("extended").register() + val PISTON_TYPE = EnumProperty("type", PistonTypes).register() + val PISTON_SHORT = BooleanProperty("short").register() + val RAILS_SHAPE = EnumProperty("shape", Shapes).register() + val SNOWY = BooleanProperty("snowy").register() + val STAGE = IntProperty("stage").register() + val DISTANCE = IntProperty("distance").register() + val LEAVES_PERSISTENT = BooleanProperty("persistent").register() + val BED_PART = EnumProperty("part", BedParts).register() + val BED_OCCUPIED = BooleanProperty("occupied").register() + val TNT_UNSTABLE = BooleanProperty("unstable").register() + val DOOR_HINGE = EnumProperty("hinge", Sides).register() + val DOOR_OPEN = BooleanProperty("open").register() + val AGE = IntProperty("age").register() + val INSTRUMENT = EnumProperty("instrument", Instruments).register() + val NOTE = IntProperty("note").register() + val REDSTONE_POWER = IntProperty("power").register() + + val MULTIPART_NORTH = EnumProperty("north", MultipartDirections).register() + val MULTIPART_WEST = EnumProperty("west", MultipartDirections).register() + val MULTIPART_SOUTH = EnumProperty("south", MultipartDirections).register() + val MULTIPART_EAST = EnumProperty("east", MultipartDirections).register() + val MULTIPART_UP = EnumProperty("up", MultipartDirections).register() + val MULTIPART_DOWN = EnumProperty("down", MultipartDirections).register() + + val SNOW_LAYERS = IntProperty("layers").register() + val FENCE_IN_WALL = BooleanProperty("in_wall").register() + val SCAFFOLDING_BOTTOM = BooleanProperty("bottom").register() + val TRIPWIRE_DISARMED = BooleanProperty("disarmed").register() + val TRIPWIRE_IN_AIR = BooleanProperty("in_air").register() + val TRIPWIRE_ATTACHED = BooleanProperty("attached").register() + val STRUCTURE_BLOCK_MODE = EnumProperty("mode", StructureBlockModes).register() + val COMMAND_BLOCK_CONDITIONAL = BooleanProperty("conditional").register() + val BUBBLE_COLUMN_DRAG = BooleanProperty("drag").register() + val BELL_ATTACHMENT = EnumProperty("attachment", Attachments).register() + val LANTERN_HANGING = BooleanProperty("hanging").register() + val SEA_PICKLE_PICKLES = IntProperty("pickles").register() + val LECTERN_BOOK = BooleanProperty("has_book").register() + + val BREWING_STAND_BOTTLE_0 = BooleanProperty("has_bottle_0").register() + val BREWING_STAND_BOTTLE_1 = BooleanProperty("has_bottle_1").register() + val BREWING_STAND_BOTTLE_2 = BooleanProperty("has_bottle_2").register() + + val CHEST_TYPE = EnumProperty("type", ChestTypes).register() + + val CAKE_BITES = IntProperty("bites").register() + val BAMBOO_LEAVES = EnumProperty("leaves", BambooLeaves).register() + val REPEATER_LOCKED = BooleanProperty("locked").register() + val REPEATER_DELAY = IntProperty("delay").register() + val PORTAL_FRAME_EYE = BooleanProperty("eye").register() + val JUKEBOX_HAS_RECORD = BooleanProperty("has_record").register() + val CAMPFIRE_SIGNAL_FIRE = BooleanProperty("signal_fire").register() + val TURTLE_EGS_EGGS = IntProperty("eggs").register() + val TURTLE_EGGS_HATCH = IntProperty("hatch").register() + val RESPAWN_ANCHOR_CHARGES = IntProperty("charges").register() + val CANDLES = IntProperty("candles").register() + val FACE = EnumProperty("face", Attachments).register() + val HOPPER_ENABLED = BooleanProperty("enabled").register() + + val DRIPSTONE_THICKNESS = EnumProperty("thickness", Thicknesses).register() - VERTICAL_DIRECTION("vertical_direction", VerticalDirections), + val LEGACY_BLOCK_UPDATE = BooleanProperty("block_update").register() + val LEGACY_SMOOTH = BooleanProperty("smooth").register() + val SCULK_SENSOR_PHASE = EnumProperty("sculk_sensor_phase", SensorPhases).register() + val DRIPSTONE_TILT = EnumProperty("tilt", Tilts).register() + val CAVE_VINES_BERRIES = BooleanProperty("berries").register() - LEGACY_CHECK_DECAY("check_decay", BooleanBlockPropertiesSerializer), - LEGACY_DECAYABLE("decayable", BooleanBlockPropertiesSerializer), - LEGACY_NODROP("nodrop", BooleanBlockPropertiesSerializer), + val VERTICAL_DIRECTION = EnumProperty("vertical_direction", VerticalDirections).register() - AXIS("axis", Axes), - FACING("facing", Directions), - ROTATION("rotation", IntBlockPropertiesSerializer), - ORIENTATION("orientation", Orientations), - BLOOM("bloom", BooleanBlockPropertiesSerializer), + val LEGACY_CHECK_DECAY = BooleanProperty("check_decay").register() + val LEGACY_DECAYABLE = BooleanProperty("decayable").register() + val LEGACY_NODROP = BooleanProperty("nodrop").register() - SHRIEKING("shrieking", BooleanBlockPropertiesSerializer), - CAN_SUMMON("can_summon", BooleanBlockPropertiesSerializer), + val AXIS = EnumProperty("axis", Axes).register() + val FACING = EnumProperty("facing", Directions).register() + val ROTATION = IntProperty("rotation").register() + val ORIENTATION = EnumProperty("orientation", Orientations).register() + + val BLOOM = BooleanProperty("bloom").register() + + val SHRIEKING = BooleanProperty("shrieking").register() + val CAN_SUMMON = BooleanProperty("can_summon").register() // ToDo: used in models - MAP("map", BooleanBlockPropertiesSerializer), + val MAP = BooleanProperty("map").register() - BOOKS_STORED("books_stored", IntBlockPropertiesSerializer), - LAST_INTERACTION_BOOK_SLOT("last_interaction_book_slot", IntBlockPropertiesSerializer), + val BOOKS_STORED = IntProperty("books_stored").register() + val LAST_INTERACTION_BOOK_SLOT = IntProperty("last_interaction_book_slot").register() - BOOK_SLOT_OCCUPIED_0("slot_0_occupied", BooleanBlockPropertiesSerializer), - BOOK_SLOT_OCCUPIED_1("slot_1_occupied", BooleanBlockPropertiesSerializer), - BOOK_SLOT_OCCUPIED_2("slot_2_occupied", BooleanBlockPropertiesSerializer), - BOOK_SLOT_OCCUPIED_3("slot_3_occupied", BooleanBlockPropertiesSerializer), - BOOK_SLOT_OCCUPIED_4("slot_4_occupied", BooleanBlockPropertiesSerializer), - BOOK_SLOT_OCCUPIED_5("slot_5_occupied", BooleanBlockPropertiesSerializer), + val BOOK_SLOT_OCCUPIED_0 = BooleanProperty("slot_0_occupied").register() + val BOOK_SLOT_OCCUPIED_1 = BooleanProperty("slot_1_occupied").register() + val BOOK_SLOT_OCCUPIED_2 = BooleanProperty("slot_2_occupied").register() + val BOOK_SLOT_OCCUPIED_3 = BooleanProperty("slot_3_occupied").register() + val BOOK_SLOT_OCCUPIED_4 = BooleanProperty("slot_4_occupied").register() + val BOOK_SLOT_OCCUPIED_5 = BooleanProperty("slot_5_occupied").register() - DUSTED("dusted", IntBlockPropertiesSerializer), - FLOWER_AMOUNT("flower_amount", IntBlockPropertiesSerializer), + val DUSTED = IntProperty("dusted").register() + val FLOWER_AMOUNT = IntProperty("flower_amount").register() - CRACKED("cracked", BooleanBlockPropertiesSerializer), - ; + val CRACKED = BooleanProperty("cracked").register() - val group: String - val serializer: BlockPropertiesSerializer - constructor(group: String, serializer: BlockPropertiesSerializer) { - this.group = group - this.serializer = serializer - } - - constructor(serializer: BlockPropertiesSerializer) { - this.group = name.lowercase(Locale.getDefault()) - this.serializer = serializer + @Deprecated("should not exist") + fun > T.register(): T { + list += this + return this } - companion object { - val PROPERTIES: Map> = run { - val map: MutableMap> = mutableMapOf() + val PROPERTIES: Map>> = run { + val map: MutableMap>> = mutableMapOf() - for (value in values()) { - map.getOrPut(value.group) { mutableListOf() } += value + for (value in list) { + map.getOrPut(value.name) { mutableListOf() } += value } return@run map } - fun parseProperty(group: String, value: Any): Pair { + fun parseProperty(group: String, value: Any): Pair, Any> { val properties = PROPERTIES[group] ?: throw IllegalArgumentException("Can not find group: $group, expected value $value") - var property: BlockProperties? = null + var property: BlockProperty<*>? = null var retValue: Any? = null for (blockProperty in properties) { retValue = try { - blockProperty.serializer.deserialize(value) + blockProperty.parse(value) } catch (exception: Throwable) { continue } @@ -197,5 +190,4 @@ enum class BlockProperties { fun BlockState.isLit(): Boolean { return this[LIT] } - } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BlockPropertiesSerializer.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperty.kt similarity index 78% rename from src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BlockPropertiesSerializer.kt rename to src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperty.kt index 4c91878ba..cbc3b79af 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BlockPropertiesSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/BlockProperty.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -11,9 +11,12 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.registries.blocks.properties.serializer +package de.bixilon.minosoft.data.registries.blocks.properties -interface BlockPropertiesSerializer { - fun deserialize(value: Any): Any +abstract class BlockProperty( + val name: String, +) { + + abstract fun parse(value: Any): T } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/ChestTypes.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/ChestTypes.kt index 49d7d6f3a..16c2b43e8 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/ChestTypes.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/ChestTypes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class ChestTypes { SINGLE, @@ -23,12 +22,8 @@ enum class ChestTypes { RIGHT, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): ChestTypes { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/EnumProperty.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/EnumProperty.kt new file mode 100644 index 000000000..56f427ca4 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/EnumProperty.kt @@ -0,0 +1,32 @@ +/* + * 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.properties + +import de.bixilon.kutil.enums.ValuesEnum + +class EnumProperty>( + name: String, + private val values: ValuesEnum, + private val allowed: Set? = null, +) : BlockProperty(name) { + + override fun parse(value: Any): T { + val value = values[value] ?: throw IllegalArgumentException("Invalid enum value: $value") + if (allowed != null && value !in allowed) { + throw IllegalArgumentException("Enum value not allowed: $value") + } + + return value + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Halves.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Halves.kt index 9ed91b221..dbc2f7441 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Halves.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Halves.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * 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. * @@ -13,35 +13,23 @@ package de.bixilon.minosoft.data.registries.blocks.properties -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer -import java.util.* +import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.enums.AliasableEnum +import de.bixilon.kutil.enums.EnumUtil +import de.bixilon.kutil.enums.ValuesEnum enum class Halves( - vararg val aliases: Any, -) { + vararg names: String, +) : AliasableEnum { UPPER("top"), LOWER("bottom"), DOUBLE, ; - companion object : BlockPropertiesSerializer { - private val NAME_MAP: Map + override val names: Array = names.unsafeCast() - init { - val names: MutableMap = mutableMapOf() - - for (value in values()) { - names[value.name.lowercase(Locale.getDefault())] = value - for (alias in value.aliases) { - names[alias] = value - } - } - - NAME_MAP = names - } - - override fun deserialize(value: Any): Halves { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } + companion object : ValuesEnum { + override val VALUES = values() + override val NAME_MAP = EnumUtil.getEnumValues(VALUES) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Instruments.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Instruments.kt index eaa91898f..dd8f1dc71 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Instruments.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Instruments.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2020-2022 Moritz Zwerger + * 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. * @@ -13,12 +13,14 @@ package de.bixilon.minosoft.data.registries.blocks.properties -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer -import java.util.* +import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.enums.AliasableEnum +import de.bixilon.kutil.enums.EnumUtil +import de.bixilon.kutil.enums.ValuesEnum enum class Instruments( - vararg val aliases: String, -) { + vararg names: String, +) : AliasableEnum { HARP, BASE_DRUM("basedrum"), SNARE, @@ -45,24 +47,11 @@ enum class Instruments( CUSTOM_HEAD, ; - companion object : BlockPropertiesSerializer { - private val NAME_MAP: Map + override val names: Array = names.unsafeCast() - init { - val names: MutableMap = mutableMapOf() - for (value in values()) { - names[value.name.lowercase(Locale.getDefault())] = value - for (alias in value.aliases) { - names[alias] = value - } - } - - NAME_MAP = names - } - - override fun deserialize(value: Any): Instruments { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } + companion object : ValuesEnum { + override val VALUES = values() + override val NAME_MAP = EnumUtil.getEnumValues(VALUES) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirectionParser.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirectionParser.kt deleted file mode 100644 index 4a31a5135..000000000 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirectionParser.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Minosoft - * Copyright (C) 2020-2022 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.properties - -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer -import java.util.* - -enum class MultipartDirectionParser( - vararg val aliases: Any, -) { - NONE(false, "false"), - LOW, - UP, - SIDE(true, "true"), - TALL, - ; - - companion object : BlockPropertiesSerializer { - private val NAME_MAP: Map - - init { - val names: MutableMap = mutableMapOf() - - for (value in values()) { - names[value.name.lowercase(Locale.getDefault())] = value - for (alias in value.aliases) { - names[alias] = value - } - } - - NAME_MAP = names - } - - override fun deserialize(value: Any): MultipartDirectionParser { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } - } -} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirections.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirections.kt new file mode 100644 index 000000000..6db5843a4 --- /dev/null +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/MultipartDirections.kt @@ -0,0 +1,44 @@ +/* + * 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.properties + +import de.bixilon.kutil.cast.CastUtil.unsafeCast +import de.bixilon.kutil.enums.AliasableEnum +import de.bixilon.kutil.enums.EnumUtil +import de.bixilon.kutil.enums.ValuesEnum + +enum class MultipartDirections( + vararg names: String, +) : AliasableEnum { + NONE("false"), + LOW, + UP, + SIDE("true"), + TALL, + ; + + override val names: Array = names.unsafeCast() + + companion object : ValuesEnum { + override val VALUES: Array = values() + override val NAME_MAP = EnumUtil.getEnumValues(VALUES) + + override fun get(any: Any): MultipartDirections? { + if (any is Boolean) { + return if (any) SIDE else NONE + } + return super.get(any) + } + } +} diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Orientations.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Orientations.kt index 7707d7278..b57bcb211 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Orientations.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Orientations.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Orientations { DOWN_EAST, @@ -32,12 +31,8 @@ enum class Orientations { SOUTH_UP, ; - companion object : ValuesEnum, BlockPropertiesSerializer { + companion object : ValuesEnum { override val VALUES: Array = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Orientations { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/PistonTypes.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/PistonTypes.kt index 970829966..44fbc080a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/PistonTypes.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/PistonTypes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,19 +15,14 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class PistonTypes { NORMAL, STICKY, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): PistonTypes { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/SensorPhases.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/SensorPhases.kt index 0891f97f3..f94ee1031 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/SensorPhases.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/SensorPhases.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class SensorPhases { INACTIVE, @@ -23,12 +22,8 @@ enum class SensorPhases { COOLDOWN, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): SensorPhases { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Shapes.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Shapes.kt index 814ec7484..12b1e48af 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Shapes.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Shapes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Shapes { STRAIGHT, @@ -35,12 +34,8 @@ enum class Shapes { ASCENDING_SOUTH, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Shapes { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Sides.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Sides.kt index 8348ac4db..9b04da83b 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Sides.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Sides.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,19 +15,14 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Sides { LEFT, RIGHT, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Sides { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/StructureBlockModes.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/StructureBlockModes.kt index c0e3bc581..8059787e5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/StructureBlockModes.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/StructureBlockModes.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class StructureBlockModes { SAVE, @@ -26,12 +25,8 @@ enum class StructureBlockModes { SUBTRACT, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): StructureBlockModes { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Thicknesses.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Thicknesses.kt index 8eb338095..4c93cc0fc 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Thicknesses.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Thicknesses.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Thicknesses { TIP_MERGE, @@ -27,12 +26,8 @@ enum class Thicknesses { DOWN, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Thicknesses { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Tilts.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Tilts.kt index 4757d3079..b5fc041cc 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Tilts.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/Tilts.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,7 +15,6 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class Tilts { NONE, @@ -24,12 +23,8 @@ enum class Tilts { FULL, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): Tilts { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/VerticalDirections.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/VerticalDirections.kt index 50c51913b..cb6682eac 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/VerticalDirections.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/VerticalDirections.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -15,19 +15,14 @@ package de.bixilon.minosoft.data.registries.blocks.properties import de.bixilon.kutil.enums.EnumUtil import de.bixilon.kutil.enums.ValuesEnum -import de.bixilon.minosoft.data.registries.blocks.properties.serializer.BlockPropertiesSerializer enum class VerticalDirections { UP, DOWN, ; - companion object : BlockPropertiesSerializer, ValuesEnum { + companion object : ValuesEnum { override val VALUES = values() override val NAME_MAP: Map = EnumUtil.getEnumValues(VALUES) - - override fun deserialize(value: Any): VerticalDirections { - return NAME_MAP[value] ?: throw IllegalArgumentException("No such property: $value") - } } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/BooleanProperty.kt similarity index 73% rename from src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt rename to src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/BooleanProperty.kt index ecebe5123..ce1605f8d 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/BooleanBlockPropertiesSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/BooleanProperty.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -11,13 +11,14 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.registries.blocks.properties.serializer +package de.bixilon.minosoft.data.registries.blocks.properties.primitives import de.bixilon.kutil.primitive.BooleanUtil.toBoolean +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty -object BooleanBlockPropertiesSerializer : BlockPropertiesSerializer { +class BooleanProperty(name: String) : BlockProperty(name) { - override fun deserialize(value: Any): Boolean { + override fun parse(value: Any): Boolean { return value.toBoolean() } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/IntBlockPropertiesSerializer.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/IntProperty.kt similarity index 60% rename from src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/IntBlockPropertiesSerializer.kt rename to src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/IntProperty.kt index 20d121177..9ee5bd0b5 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/serializer/IntBlockPropertiesSerializer.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/properties/primitives/IntProperty.kt @@ -1,6 +1,6 @@ /* * Minosoft - * Copyright (C) 2021 Moritz Zwerger + * 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. * @@ -11,13 +11,21 @@ * This software is not affiliated with Mojang AB, the original developer of Minecraft. */ -package de.bixilon.minosoft.data.registries.blocks.properties.serializer +package de.bixilon.minosoft.data.registries.blocks.properties.primitives import de.bixilon.kutil.primitive.IntUtil.toInt +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty -object IntBlockPropertiesSerializer : BlockPropertiesSerializer { +class IntProperty( + name: String, + val range: IntRange? = null, +) : BlockProperty(name) { - override fun deserialize(value: Any): Int { - return value.toInt() + override fun parse(value: Any): Int { + val value = value.toInt() + + if (range != null && value !in range) throw IllegalArgumentException("Value out of range: $value (expected=$range)") + + return value } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/AdvancedBlockState.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/AdvancedBlockState.kt index 6193a2d6e..82d4cb6d2 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/AdvancedBlockState.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/AdvancedBlockState.kt @@ -14,14 +14,14 @@ package de.bixilon.minosoft.data.registries.blocks.state import de.bixilon.minosoft.data.registries.blocks.light.LightProperties -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.state.builder.BlockStateSettings import de.bixilon.minosoft.data.registries.blocks.types.Block import de.bixilon.minosoft.data.registries.shapes.voxel.AbstractVoxelShape open class AdvancedBlockState( block: Block, - properties: Map, + properties: Map, Any>, luminance: Int, val collisionShape: AbstractVoxelShape?, val outlineShape: AbstractVoxelShape?, diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/BlockState.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/BlockState.kt index 84c3d5328..bb3faff9a 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/BlockState.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/BlockState.kt @@ -12,7 +12,7 @@ */ package de.bixilon.minosoft.data.registries.blocks.state -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.state.builder.BlockStateSettings import de.bixilon.minosoft.data.registries.blocks.state.error.StatelessBlockError import de.bixilon.minosoft.data.registries.blocks.types.Block @@ -42,17 +42,18 @@ open class BlockState( return block.toString() } - open fun withProperties(vararg properties: Pair): BlockState { + open fun withProperties(vararg properties: Pair, Any>): BlockState { if (properties.isEmpty()) return this throw StatelessBlockError(this) } - open fun withProperties(properties: Map): BlockState { + open fun withProperties(properties: Map, Any>): BlockState { if (properties.isEmpty()) return this throw StatelessBlockError(this) } - open fun cycle(property: BlockProperties): BlockState = throw StatelessBlockError(this) + open fun cycle(property: BlockProperty<*>): BlockState = throw StatelessBlockError(this) - open operator fun get(property: BlockProperties): T = throw StatelessBlockError(this) + open operator fun get(property: BlockProperty): T = throw StatelessBlockError(this) + open fun getOrNull(property: BlockProperty): T? = throw StatelessBlockError(this) } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/PropertyBlockState.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/PropertyBlockState.kt index 3c4c72e29..c3c3263ee 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/PropertyBlockState.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/PropertyBlockState.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.data.registries.blocks.state import com.google.common.base.Objects import de.bixilon.kutil.array.ArrayUtil.next import de.bixilon.kutil.cast.CastUtil.unsafeCast -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.state.builder.BlockStateSettings import de.bixilon.minosoft.data.registries.blocks.state.manager.PropertyStateManager import de.bixilon.minosoft.data.registries.blocks.types.Block @@ -25,7 +25,7 @@ import de.bixilon.minosoft.data.text.BaseComponent open class PropertyBlockState( block: Block, - val properties: Map, + val properties: Map, Any>, luminance: Int, ) : BlockState(block, luminance) { private val hash = Objects.hashCode(block, properties) @@ -45,7 +45,7 @@ open class PropertyBlockState( } - override fun withProperties(vararg properties: Pair): BlockState { + override fun withProperties(vararg properties: Pair, Any>): BlockState { val nextProperties = this.properties.toMutableMap() for ((key, value) in properties) { @@ -55,7 +55,7 @@ open class PropertyBlockState( return getStateWith(nextProperties) } - override fun withProperties(properties: Map): BlockState { + override fun withProperties(properties: Map, Any>): BlockState { val nextProperties = this.properties.toMutableMap() for ((key, value) in properties) { @@ -65,7 +65,7 @@ open class PropertyBlockState( return getStateWith(nextProperties) } - private fun getStateWith(properties: Map): BlockState { + private fun getStateWith(properties: Map, Any>): BlockState { for (state in this.block.states) { if (state !is PropertyBlockState) continue @@ -79,16 +79,20 @@ open class PropertyBlockState( throw IllegalArgumentException("Can not find ${this.block} with properties: $properties") } - override fun cycle(property: BlockProperties): BlockState { - val value: Any = this[property] + override fun cycle(property: BlockProperty<*>): BlockState { + val value: Any = this[property]!! return withProperties(property to block.states.unsafeCast().properties[property]!!.next(value)) } - override fun get(property: BlockProperties): T { + override fun get(property: BlockProperty): T { val value = this.properties[property] ?: throw IllegalArgumentException("$this has not property $property") return value.unsafeCast() } + override fun getOrNull(property: BlockProperty): T? { + return this.properties[property]?.unsafeCast() + } + fun withProperties(): BaseComponent { val component = BaseComponent() diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/builder/BlockStateSettings.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/builder/BlockStateSettings.kt index 361b947f2..a453cf6f0 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/builder/BlockStateSettings.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/builder/BlockStateSettings.kt @@ -19,14 +19,14 @@ import de.bixilon.kutil.primitive.BooleanUtil.toBoolean import de.bixilon.kutil.primitive.IntUtil.toInt import de.bixilon.minosoft.data.registries.blocks.light.* import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.registries.Registries import de.bixilon.minosoft.data.registries.shapes.ShapeRegistry import de.bixilon.minosoft.data.registries.shapes.voxel.AbstractVoxelShape import de.bixilon.minosoft.data.registries.shapes.voxel.AbstractVoxelShape.Companion.deserialize -import java.util.* class BlockStateSettings( - val properties: Map?, + val properties: Map, Any>?, val luminance: Int, val collisionShape: AbstractVoxelShape?, val outlineShape: AbstractVoxelShape?, @@ -57,11 +57,11 @@ class BlockStateSettings( return AbstractVoxelShape.EMPTY } - private fun JsonObject.getProperties(): Map? { + private fun JsonObject.getProperties(): Map, Any>? { val data = this["properties"]?.toJsonObject() ?: return null if (data.isEmpty()) return null - val properties: MutableMap = EnumMap(BlockProperties::class.java) + val properties: MutableMap, Any> = HashMap() for ((group, json) in data) { try { diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/BlockStateManager.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/BlockStateManager.kt index d4d9d3a69..1b775b33f 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/BlockStateManager.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/BlockStateManager.kt @@ -13,18 +13,18 @@ package de.bixilon.minosoft.data.registries.blocks.state.manager -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.state.BlockState interface BlockStateManager : Iterable { val default: BlockState - fun withProperties(vararg properties: Pair): BlockState { + fun withProperties(vararg properties: Pair, Any>): BlockState { return this.default.withProperties(*properties) } - fun withProperties(properties: Map): BlockState { + fun withProperties(properties: Map, Any>): BlockState { return this.default.withProperties(properties) } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/PropertyStateManager.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/PropertyStateManager.kt index 6cc9c5dae..c12561910 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/PropertyStateManager.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/state/manager/PropertyStateManager.kt @@ -13,11 +13,11 @@ package de.bixilon.minosoft.data.registries.blocks.state.manager -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.state.BlockState class PropertyStateManager( - val properties: Map>, + val properties: Map, Array>, val states: Set, override val default: BlockState, ) : BlockStateManager { 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 e56c6dda4..ebdcfa228 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,7 +15,7 @@ package de.bixilon.minosoft.data.registries.blocks.types import de.bixilon.kutil.cast.CastUtil.unsafeNull 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 +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.data.registries.blocks.settings.BlockSettings import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.manager.BlockStateManager @@ -50,7 +50,7 @@ abstract class Block( } - fun updateStates(states: Set, default: BlockState, properties: Map>) { + fun updateStates(states: Set, default: BlockState, properties: Map, Array>) { val manager = when { states.size == 1 -> SimpleStateManager(default) else -> PropertyStateManager(properties, states, default) diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt index 1e343a7f3..aefb91aab 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/fluid/FluidBlock.kt @@ -16,6 +16,7 @@ package de.bixilon.minosoft.data.registries.blocks.types.fluid import de.bixilon.kotlinglm.vec3.Vec3 import de.bixilon.kutil.exception.Broken import de.bixilon.minosoft.data.registries.blocks.light.CustomLightProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties import de.bixilon.minosoft.data.registries.blocks.settings.BlockSettings import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.Block @@ -47,5 +48,6 @@ abstract class FluidBlock(identifier: ResourceLocation, settings: BlockSettings) companion object { val LIGHT_PROPERTIES = CustomLightProperties(true, false, true) + val LEVEL = BlockProperties.FLUID_LEVEL } } diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt index c46dfb9d5..e54ca6c90 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/RedstoneTorchBlock.kt @@ -15,7 +15,7 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isLit +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.isLit import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.types.properties.rendering.RandomDisplayTickable import de.bixilon.minosoft.data.registries.identified.ResourceLocation diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TrapdoorBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TrapdoorBlock.kt index d5d0d3a43..bdfccb459 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TrapdoorBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/TrapdoorBlock.kt @@ -19,7 +19,7 @@ import de.bixilon.minosoft.data.entities.entities.Entity import de.bixilon.minosoft.data.registries.blocks.factory.PixLyzerBlockFactory import de.bixilon.minosoft.data.registries.blocks.handler.entity.Climbable 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.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.data.registries.registries.Registries 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 8c39dbf6f..3973fd73a 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 @@ -17,7 +17,7 @@ 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.properties.BlockProperties -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.isPowered +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.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 diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt index ba912c9a5..ac1566033 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/entity/CampfireBlock.kt @@ -21,7 +21,7 @@ import de.bixilon.kutil.random.RandomUtil.chance import de.bixilon.minosoft.data.entities.block.CampfireBlockEntity 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.properties.BlockProperties.Companion.isLit +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.isLit import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState import de.bixilon.minosoft.data.registries.blocks.types.properties.LitBlock 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 3bccf1c81..a502a9bd3 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 @@ -21,8 +21,8 @@ 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.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.properties.BlockProperties.getFacing +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.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.blocks.types.properties.rendering.RandomDisplayTickable diff --git a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/WallMountedBlock.kt b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/WallMountedBlock.kt index 6b34108be..bf6c1da92 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/WallMountedBlock.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/blocks/types/pixlyzer/wall/WallMountedBlock.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.wall import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.registries.blocks.properties.Attachments 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.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState import de.bixilon.minosoft.data.registries.blocks.state.error.StatelessBlockError diff --git a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt index 838cd4036..63ad277c6 100644 --- a/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt +++ b/src/main/java/de/bixilon/minosoft/data/registries/fluid/Fluid.kt @@ -15,8 +15,8 @@ package de.bixilon.minosoft.data.registries.fluid import de.bixilon.kotlinglm.vec3.Vec3d import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.minosoft.data.direction.Directions -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.fluid.FluidBlock import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidFilled import de.bixilon.minosoft.data.registries.blocks.types.fluid.FluidHolder import de.bixilon.minosoft.data.registries.identified.ResourceLocation @@ -130,7 +130,7 @@ abstract class Fluid(override val identifier: ResourceLocation) : RegistryItem() if (state.block is FluidFilled && state.block.fluid == this) { return MAX_LEVEL } - val level = state.get(BlockProperties.FLUID_LEVEL) ?: return 0.0f + val level = state[FluidBlock.LEVEL] if (level <= 0 || level >= 8) { return MAX_LEVEL } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt index 98ea9e37b..016530105 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/sign/SignBlockEntityRenderer.kt @@ -23,7 +23,7 @@ import de.bixilon.minosoft.data.container.stack.ItemStack import de.bixilon.minosoft.data.direction.Directions import de.bixilon.minosoft.data.entities.block.sign.SignBlockEntity 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.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.blocks.state.PropertyBlockState import de.bixilon.minosoft.data.registries.blocks.types.pixlyzer.entity.sign.StandingSignBlock diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt index 9ab1a57da..d5a3936c4 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/DoubleChestRenderer.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.time.DateUtil import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.getFacing +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt index da6a06fa3..1b227c66d 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/chunk/entities/renderer/storage/SingleChestRenderer.kt @@ -16,7 +16,7 @@ package de.bixilon.minosoft.gui.rendering.chunk.entities.renderer.storage import de.bixilon.kotlinglm.vec3.Vec3i import de.bixilon.kutil.time.DateUtil import de.bixilon.minosoft.data.entities.block.container.storage.StorageBlockEntity -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.Companion.getFacing +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties.getFacing import de.bixilon.minosoft.data.registries.blocks.state.BlockState import de.bixilon.minosoft.data.registries.identified.ResourceLocation import de.bixilon.minosoft.gui.rendering.RenderContext diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/AndCondition.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/AndCondition.kt index e8a5e5911..6a4ad27df 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/AndCondition.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/AndCondition.kt @@ -15,13 +15,13 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.json.JsonObject -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty class AndCondition( val conditions: Set, ) : BuilderCondition { - override fun matches(properties: Map): Boolean { + override fun matches(properties: Map, Any>): Boolean { for (condition in conditions) { if (!condition.matches(properties)) return false } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/BuilderCondition.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/BuilderCondition.kt index a78416e5c..69391c245 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/BuilderCondition.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/BuilderCondition.kt @@ -13,9 +13,9 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty interface BuilderCondition { - fun matches(properties: Map): Boolean + fun matches(properties: Map, Any>): Boolean } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/OrCondition.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/OrCondition.kt index 355e1d61f..e4ebfddb1 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/OrCondition.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/OrCondition.kt @@ -14,13 +14,13 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition import de.bixilon.kutil.json.JsonObject -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty class OrCondition( val conditions: Set, ) : BuilderCondition { - override fun matches(properties: Map): Boolean { + override fun matches(properties: Map, Any>): Boolean { for (condition in conditions) { if (condition.matches(properties)) return true } diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PrimitiveCondition.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PrimitiveCondition.kt index 0fea49664..320b355a5 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PrimitiveCondition.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PrimitiveCondition.kt @@ -13,11 +13,11 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty class PrimitiveCondition private constructor(val matches: Boolean) : BuilderCondition { - override fun matches(properties: Map) = matches + override fun matches(properties: Map, Any>) = matches companion object { diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PropertyCondition.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PropertyCondition.kt index bd7c3529d..ca843e751 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PropertyCondition.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/builder/condition/PropertyCondition.kt @@ -16,12 +16,13 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.builder.condition import de.bixilon.kutil.cast.CastUtil.unsafeCast import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty class PropertyCondition( - val conditions: Map, + val conditions: Map, Any>, ) : BuilderCondition { - override fun matches(properties: Map): Boolean { + override fun matches(properties: Map, Any>): Boolean { for ((property, value) in this.conditions) { val target = properties[property] ?: return false if (value is Set<*>) { @@ -36,13 +37,13 @@ class PropertyCondition( companion object { - private fun deserializeOr(property: String, list: List): Pair { + private fun deserializeOr(property: String, list: List): Pair, Any> { if (list.size == 1) { return BlockProperties.parseProperty(property, list.first()) } val values: MutableSet = mutableSetOf() - var blockProperty: BlockProperties? = null + var blockProperty: BlockProperty<*>? = null for (entry in list) { val (entryProperty, entryValue) = BlockProperties.parseProperty(property, entry) @@ -59,7 +60,7 @@ class PropertyCondition( } fun deserialize(data: JsonObject): PropertyCondition? { - val properties: MutableMap = mutableMapOf() + val properties: MutableMap, Any> = mutableMapOf() for ((key, value) in data) { if (key == OrCondition.KEY) continue diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/BlockVariant.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/BlockVariant.kt index fa1c85915..2eeb19671 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/BlockVariant.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/BlockVariant.kt @@ -13,6 +13,6 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.variant -import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty -typealias BlockVariant = Map +typealias BlockVariant = Map, Any> diff --git a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/VariantBlockModel.kt b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/VariantBlockModel.kt index 9a66819c7..75c1af2d3 100644 --- a/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/VariantBlockModel.kt +++ b/src/main/java/de/bixilon/minosoft/gui/rendering/models/block/state/variant/VariantBlockModel.kt @@ -15,6 +15,7 @@ package de.bixilon.minosoft.gui.rendering.models.block.state.variant import de.bixilon.kutil.json.JsonObject import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperties +import de.bixilon.minosoft.data.registries.blocks.properties.BlockProperty import de.bixilon.minosoft.gui.rendering.models.block.state.DirectBlockModel import de.bixilon.minosoft.gui.rendering.models.block.state.apply.BlockStateApply import de.bixilon.minosoft.gui.rendering.models.loader.BlockLoader @@ -27,7 +28,7 @@ interface VariantBlockModel : DirectBlockModel { companion object { private fun parseVariant(variant: String): BlockVariant { - val properties: MutableMap = mutableMapOf() + val properties: MutableMap, Any> = mutableMapOf() for (pair in variant.split(',')) { val (key, rawValue) = pair.split('=', limit = 2)