improve block property cycling

This commit is contained in:
Bixilon 2021-05-25 14:22:20 +02:00
parent 4875909966
commit 868e902fa4
No known key found for this signature in database
GPG Key ID: 5CAD791931B09AC4
2 changed files with 22 additions and 20 deletions

View File

@ -30,12 +30,10 @@ import de.bixilon.minosoft.gui.rendering.chunk.models.loading.BlockModel
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockLikeRenderer
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockRenderer import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.BlockRenderer
import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.MultipartRenderer import de.bixilon.minosoft.gui.rendering.chunk.models.renderable.MultipartRenderer
import de.bixilon.minosoft.util.enum.ValuesEnum
import glm_.vec3.Vec3i import glm_.vec3.Vec3i
import java.util.* import java.util.*
import kotlin.math.abs import kotlin.math.abs
import kotlin.random.Random import kotlin.random.Random
import kotlin.reflect.full.companionObjectInstance
data class BlockState( data class BlockState(
val block: Block, val block: Block,
@ -269,24 +267,16 @@ data class BlockState(
fun cycle(property: BlockProperties): BlockState { fun cycle(property: BlockProperties): BlockState {
val currentValue = properties[property] ?: throw IllegalArgumentException("$this has no property $property") val currentValue = properties[property] ?: throw IllegalArgumentException("$this has no property $property")
when (currentValue) { return withProperties(property to block.properties[property]!!.next(currentValue))
is Boolean -> { }
return withProperties(property to !currentValue)
} private fun <T> List<T>.next(current: T): T {
is Number -> { val index = this.indexOf(current)
return try { check(index >= 0) { "List does not contain $current" }
withProperties(property to (currentValue.toInt() + 1))
} catch (exception: IllegalArgumentException) { if (index == this.size - 1) {
withProperties(property to 0) return this[0]
}
}
is Enum<*> -> {
val values = currentValue::class.companionObjectInstance as ValuesEnum<Enum<*>>
return withProperties(property to values.next(currentValue))
}
else -> {
return this
}
} }
return this[index + 1]
} }
} }

View File

@ -54,6 +54,7 @@ open class Block(
protected set protected set
open lateinit var item: Item open lateinit var item: Item
protected set protected set
open lateinit var properties: Map<BlockProperties, List<Any>>
override fun postInit(registries: Registries) { override fun postInit(registries: Registries) {
item = registries.itemRegistry[itemId] item = registries.itemRegistry[itemId]
@ -107,6 +108,7 @@ open class Block(
else -> Block(resourceLocation, mappings, data) else -> Block(resourceLocation, mappings, data)
} }
val properties: MutableMap<BlockProperties, MutableSet<Any>> = mutableMapOf()
val states: MutableSet<BlockState> = mutableSetOf() val states: MutableSet<BlockState> = mutableSetOf()
for ((stateId, stateJson) in data["states"].asJsonObject.entrySet()) { for ((stateId, stateJson) in data["states"].asJsonObject.entrySet()) {
@ -114,10 +116,20 @@ open class Block(
val state = BlockState.deserialize(block, mappings, stateJson, mappings.models) val state = BlockState.deserialize(block, mappings, stateJson, mappings.models)
mappings.blockStateIdMap[stateId.toInt()] = state mappings.blockStateIdMap[stateId.toInt()] = state
states.add(state) states.add(state)
for ((property, value) in state.properties) {
properties.getOrPut(property) { mutableSetOf() } += value
}
}
val propertiesOut: MutableMap<BlockProperties, List<Any>> = mutableMapOf()
for ((property, values) in properties) {
propertiesOut[property] = values.toList()
} }
block.states = states.toSet() block.states = states.toSet()
block.defaultState = mappings.blockStateIdMap[data["default_state"].asInt]!! block.defaultState = mappings.blockStateIdMap[data["default_state"].asInt]!!
block.properties = propertiesOut.toMap()
return block return block
} }
} }