diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryStreamCodec.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryStreamCodec.kt index a217ec302..c685fb861 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryStreamCodec.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/MatteryStreamCodec.kt @@ -189,6 +189,35 @@ interface MatteryStreamCodec : StreamCodec<@UnsafeVariance S, val values: List = listOf(*this.clazz.enumConstants!!) val valuesMap = values.associateBy { it.name } + private val nullable = object : MatteryStreamCodec { + override fun decode(stream: S): V? { + val value = stream.readVarInt() + + if (value == 0) { + return null + } else { + val id = value ushr 1 + return values.getOrNull(id) ?: throw NoSuchElementException("No such enum with index $id") + } + } + + override fun encode(stream: S, value: V?) { + if (value == null) { + stream.writeVarInt(0) + } else { + stream.writeVarInt(1 or (value.ordinal shl 1)) + } + } + + override fun copy(value: V?): V? { + return value + } + + override fun compare(a: V?, b: V?): Boolean { + return a === b + } + } + override fun decode(stream: S): V { val id = stream.readVarInt() return values.getOrNull(id) ?: throw NoSuchElementException("No such enum with index $id") @@ -206,6 +235,10 @@ interface MatteryStreamCodec : StreamCodec<@UnsafeVariance S, return a === b } + fun nullable(): MatteryStreamCodec { + return nullable + } + companion object { /** * FIXME: enums with abstract methods which get compiled to subclasses, whose DO NOT expose "parent's" enum constants array