From b2998ccaa5ea92831baaa62f10139933aa3d5aba Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sun, 29 Jan 2023 22:31:50 +0700 Subject: [PATCH] EnumValueCodec writeByIndices --- .../mc/otm/block/entity/RedstoneControl.kt | 2 +- .../dbotthepony/mc/otm/core/util/DataStreams.kt | 17 ++++++++++------- .../mc/otm/network/FieldSynchronizer.kt | 6 ++++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneControl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneControl.kt index bc4adde43..1f0423382 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneControl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneControl.kt @@ -82,7 +82,7 @@ class SynchronizedRedstoneControl( valueChanges.invoke(state, old) } } - }, name = if (fieldNamePrefix != null) "${fieldNamePrefix}_redstoneSetting" else null) + }, name = if (fieldNamePrefix != null) "${fieldNamePrefix}_redstoneSetting" else null, writeByIndices = true) override var redstoneSignal: Int by synchronizer.int(0, setter = { value, access, setByRemote -> if (setByRemote) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt index a41e5a94e..0e5b6303e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/DataStreams.kt @@ -75,21 +75,24 @@ val VarIntValueCodec = StreamCodec(DataInputStream::readVarIntLE, DataOutputStre val VarLongValueCodec = StreamCodec(DataInputStream::readVarLongLE, DataOutputStream::writeVarLongLE) val BinaryStringCodec = StreamCodec(DataInputStream::readBinaryString, DataOutputStream::writeBinaryString) -class EnumValueCodec>(private val clazz: Class) : IStreamCodec { +class EnumValueCodec>(clazz: Class, val writeByIndices: Boolean = false) : IStreamCodec { private val values = clazz.enumConstants override fun read(stream: DataInputStream): V { - val id = stream.readVarIntLE() - - if (id >= values.size) { - throw IndexOutOfBoundsException("Unable to read enum $clazz, no such enum at index $id") + if (writeByIndices) { + val id = stream.readVarIntLE() + return values.getOrNull(id) ?: throw NoSuchElementException("No such enum with index $id") } - return values[id] + val id = stream.readBinaryString() + return values.firstOrNull { id == it.name } ?: throw NoSuchElementException("No such enum $id") } override fun write(stream: DataOutputStream, value: V) { - stream.writeVarIntLE(value.ordinal) + if (writeByIndices) + stream.writeVarIntLE(value.ordinal) + else + stream.writeBinaryString(value.name) } override fun copy(value: V): V { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt index f969f2148..d3b1b5cd7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt @@ -348,9 +348,10 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa value: T = type.enumConstants[0], getter: FieldGetter? = null, setter: FieldSetter? = null, + writeByIndices: Boolean = false, name: String? = nextFieldName(), ): Field { - return Field(value, EnumValueCodec(type), getter, setter, name = name ?: nextFieldName()) + return Field(value, EnumValueCodec(type, writeByIndices = writeByIndices), getter, setter, name = name ?: nextFieldName()) } @JvmOverloads @@ -358,9 +359,10 @@ class FieldSynchronizer(private val callback: Runnable, private val alwaysCallCa value: T, getter: FieldGetter? = null, setter: FieldSetter? = null, + writeByIndices: Boolean = false, name: String? = nextFieldName(), ): Field { - return Field(value, EnumValueCodec(value::class.java), getter, setter, name = name ?: nextFieldName()) + return Field(value, EnumValueCodec(value::class.java, writeByIndices = writeByIndices), getter, setter, name = name ?: nextFieldName()) } @JvmOverloads