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 2b2f6d498..e8a5e5911 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 @@ -29,15 +29,31 @@ class AndCondition( } companion object { + const val KEY = "AND" + + fun deserialize(data: List): BuilderCondition? { + val conditions: MutableSet = mutableSetOf() + + for (entry in data) { + conditions += PropertyCondition.deserialize(entry) ?: continue + } + if (conditions.isEmpty()) return null + + return AndCondition(conditions) // TODO: They can be compacted into one Property condition, could speed up memory usage and performance a bit + } fun deserialize(data: JsonObject): BuilderCondition? { if (data.isEmpty()) return null - val property = PropertyCondition.deserialize(data) - val or = data[OrCondition.KEY]?.let { OrCondition.deserialize(it.unsafeCast()) } ?: return property - if (property == null) return or + val conditions: MutableSet = mutableSetOf() - return AndCondition(mutableSetOf(property, or)) + PropertyCondition.deserialize(data)?.let { conditions += it } + data[KEY]?.let { deserialize(it.unsafeCast>()) }?.let { conditions += it } + data[OrCondition.KEY]?.let { OrCondition.deserialize(it.unsafeCast()) }?.let { conditions += it } + + if (conditions.isEmpty()) return null + + return AndCondition(conditions) } } } 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 05a27c4a0..bd7c3529d 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 @@ -63,6 +63,7 @@ class PropertyCondition( for ((key, value) in data) { if (key == OrCondition.KEY) continue + if (key == AndCondition.KEY) continue if (value is List<*>) { val (property, values) = deserializeOr(key, value.unsafeCast())