diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt index 736a3da2c..fc9fb84d9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt @@ -6,7 +6,7 @@ import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.event.entity.living.LivingHurtEvent import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.network.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import java.io.InputStream abstract class AndroidFeature(val type: AndroidFeatureType<*>, val android: MatteryPlayerCapability) : INBTSerializable { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt index 154d7dba9..c9cc9e664 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.core.nbt.getCompoundList import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.milliTime -import ru.dbotthepony.mc.otm.network.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger import java.io.InputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt index 1e8dd0ef1..d8d125c92 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt @@ -53,7 +53,7 @@ import ru.dbotthepony.mc.otm.core.math.plus import ru.dbotthepony.mc.otm.core.util.Savetables import ru.dbotthepony.mc.otm.core.util.TickList import ru.dbotthepony.mc.otm.network.BlockEntitySyncPacket -import ru.dbotthepony.mc.otm.network.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import ru.dbotthepony.mc.otm.network.WorldNetworkChannel import ru.dbotthepony.mc.otm.once import ru.dbotthepony.mc.otm.onceServer 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 a93faed9a..8316ed787 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 @@ -4,7 +4,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.INBTSerializable import ru.dbotthepony.mc.otm.core.nbt.mapString import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.network.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer interface IRedstoneControlled { val redstoneControl: AbstractRedstoneControl diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt index 4f67fa783..05c431d45 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -68,6 +68,7 @@ import ru.dbotthepony.mc.otm.core.util.TickList import ru.dbotthepony.mc.otm.core.util.UUIDValueCodec import ru.dbotthepony.mc.otm.menu.ExoPackInventoryMenu import ru.dbotthepony.mc.otm.network.* +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.triggers.AndroidResearchTrigger diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/AndroidPowerSource.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/AndroidPowerSource.kt index f7c63478c..75550ca61 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/AndroidPowerSource.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/energy/AndroidPowerSource.kt @@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.core.math.getDecimal import ru.dbotthepony.mc.otm.core.nbt.getItemStack import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.core.nbt.set -import ru.dbotthepony.mc.otm.network.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer import ru.dbotthepony.mc.otm.registry.StatNames import ru.dbotthepony.mc.otm.triggers.AndroidBatteryTrigger diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt index b0af02659..6fc6f998f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt @@ -14,17 +14,15 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.Items import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.registries.ForgeRegistries -import ru.dbotthepony.mc.otm.core.forValidRefs import ru.dbotthepony.mc.otm.core.nbt.map import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.core.util.ItemValueCodec import ru.dbotthepony.mc.otm.core.util.VarIntValueCodec -import ru.dbotthepony.mc.otm.network.FieldSynchronizer -import ru.dbotthepony.mc.otm.network.IField +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.IField import java.lang.ref.WeakReference import java.util.* -import kotlin.collections.ArrayList @Suppress("UNUSED") open class MatteryContainer(protected val watcher: Runnable, private val size: Int) : Container, Iterable, INBTSerializable { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt index bb5872939..a0b080b93 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt @@ -37,8 +37,8 @@ import ru.dbotthepony.mc.otm.core.util.ItemValueCodec import ru.dbotthepony.mc.otm.core.util.NullValueCodec import ru.dbotthepony.mc.otm.core.util.VarIntValueCodec import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget -import ru.dbotthepony.mc.otm.network.FieldSynchronizer -import ru.dbotthepony.mc.otm.network.IField +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.IField import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel import ru.dbotthepony.mc.otm.network.MenuFieldPacket diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldAccess.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldAccess.kt new file mode 100644 index 000000000..c43201a31 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldAccess.kt @@ -0,0 +1,41 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +interface FieldAccess { + fun read(): V + fun write(value: V) +} + +interface FloatFieldAccess : FieldAccess { + override fun write(value: Float) + @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readFloat()")) + override fun read() = readFloat() + fun readFloat(): Float +} + +interface DoubleFieldAccess : FieldAccess { + override fun write(value: Double) + @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readDouble()")) + override fun read() = readDouble() + fun readDouble(): Double +} + +interface IntFieldAccess : FieldAccess { + override fun write(value: Int) + @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readInt()")) + override fun read() = readInt() + fun readInt(): Int +} + +interface LongFieldAccess : FieldAccess { + override fun write(value: Long) + @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readLong()")) + override fun read() = readLong() + fun readLong(): Long +} + +interface BooleanFieldAccess : FieldAccess { + override fun write(value: Boolean) + @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readBoolean()")) + override fun read() = readBoolean() + fun readBoolean(): Boolean +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldGetter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldGetter.kt new file mode 100644 index 000000000..4389e1ca3 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldGetter.kt @@ -0,0 +1,50 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +fun interface FieldGetter { + fun invoke(field: FieldAccess): V +} + +fun interface FloatFieldGetter : FieldGetter { + fun invoke(field: FloatFieldAccess): Float + + @Deprecated("Use type specific invoke") + override fun invoke(field: FieldAccess): Float { + return invoke(field as FloatFieldAccess) + } +} + +fun interface DoubleFieldGetter : FieldGetter { + fun invoke(field: DoubleFieldAccess): Double + + @Deprecated("Use type specific invoke") + override fun invoke(field: FieldAccess): Double { + return invoke(field as DoubleFieldAccess) + } +} + +fun interface IntFieldGetter : FieldGetter { + fun invoke(field: IntFieldAccess): Int + + @Deprecated("Use type specific invoke") + override fun invoke(field: FieldAccess): Int { + return invoke(field as IntFieldAccess) + } +} + +fun interface LongFieldGetter : FieldGetter { + fun invoke(field: LongFieldAccess): Long + + @Deprecated("Use type specific invoke") + override fun invoke(field: FieldAccess): Long { + return invoke(field as LongFieldAccess) + } +} + +fun interface BooleanFieldGetter : FieldGetter { + fun invoke(field: BooleanFieldAccess): Boolean + + @Deprecated("Use type specific invoke") + override fun invoke(field: FieldAccess): Boolean { + return invoke(field as BooleanFieldAccess) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSetter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSetter.kt new file mode 100644 index 000000000..3a5e4fb40 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSetter.kt @@ -0,0 +1,50 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +fun interface FieldSetter { + fun invoke(value: V, access: FieldAccess, setByRemote: Boolean) +} + +fun interface FloatFieldSetter : FieldSetter { + fun invoke(value: Float, access: FloatFieldAccess, setByRemote: Boolean) + + @Deprecated("Use type specific invoke") + override fun invoke(value: Float, access: FieldAccess, setByRemote: Boolean) { + invoke(value, access as FloatFieldAccess, setByRemote) + } +} + +fun interface DoubleFieldSetter : FieldSetter { + fun invoke(value: Double, access: DoubleFieldAccess, setByRemote: Boolean) + + @Deprecated("Use type specific invoke") + override fun invoke(value: Double, access: FieldAccess, setByRemote: Boolean) { + invoke(value, access as DoubleFieldAccess, setByRemote) + } +} + +fun interface IntFieldSetter : FieldSetter { + fun invoke(value: Int, access: IntFieldAccess, setByRemote: Boolean) + + @Deprecated("Use type specific invoke") + override fun invoke(value: Int, access: FieldAccess, setByRemote: Boolean) { + invoke(value, access as IntFieldAccess, setByRemote) + } +} + +fun interface LongFieldSetter : FieldSetter { + fun invoke(value: Long, access: LongFieldAccess, setByRemote: Boolean) + + @Deprecated("Use type specific invoke") + override fun invoke(value: Long, access: FieldAccess, setByRemote: Boolean) { + invoke(value, access as LongFieldAccess, setByRemote) + } +} + +fun interface BooleanFieldSetter : FieldSetter { + fun invoke(value: Boolean, access: BooleanFieldAccess, setByRemote: Boolean) + + @Deprecated("Use type specific invoke") + override fun invoke(value: Boolean, access: FieldAccess, setByRemote: Boolean) { + invoke(value, access as BooleanFieldAccess, setByRemote) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt similarity index 78% rename from src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt index 4fee277fc..e7e65743e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/FieldSynchronizer.kt @@ -1,6 +1,6 @@ @file:Suppress("DeprecatedCallableAddReplaceWith") -package ru.dbotthepony.mc.otm.network +package ru.dbotthepony.mc.otm.network.synchronizer import it.unimi.dsi.fastutil.booleans.BooleanConsumer import it.unimi.dsi.fastutil.floats.FloatConsumer @@ -41,488 +41,12 @@ import java.util.function.IntSupplier import java.util.function.LongConsumer import java.util.function.LongSupplier import java.util.function.Supplier -import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KMutableProperty0 import kotlin.reflect.KProperty import kotlin.reflect.KProperty0 -interface FieldAccess { - fun read(): V - fun write(value: V) -} - -interface FloatFieldAccess : FieldAccess { - override fun write(value: Float) - @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readFloat()")) - override fun read() = readFloat() - fun readFloat(): Float -} - -interface DoubleFieldAccess : FieldAccess { - override fun write(value: Double) - @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readDouble()")) - override fun read() = readDouble() - fun readDouble(): Double -} - -interface IntFieldAccess : FieldAccess { - override fun write(value: Int) - @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readInt()")) - override fun read() = readInt() - fun readInt(): Int -} - -interface LongFieldAccess : FieldAccess { - override fun write(value: Long) - @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readLong()")) - override fun read() = readLong() - fun readLong(): Long -} - -interface BooleanFieldAccess : FieldAccess { - override fun write(value: Boolean) - @Deprecated("Use type specific method", replaceWith = ReplaceWith("this.readBoolean()")) - override fun read() = readBoolean() - fun readBoolean(): Boolean -} - -fun interface FieldGetter { - fun invoke(field: FieldAccess): V -} - -fun interface FloatFieldGetter : FieldGetter { - fun invoke(field: FloatFieldAccess): Float - - @Deprecated("Use type specific invoke") - override fun invoke(field: FieldAccess): Float { - return invoke(field as FloatFieldAccess) - } -} - -fun interface DoubleFieldGetter : FieldGetter { - fun invoke(field: DoubleFieldAccess): Double - - @Deprecated("Use type specific invoke") - override fun invoke(field: FieldAccess): Double { - return invoke(field as DoubleFieldAccess) - } -} - -fun interface IntFieldGetter : FieldGetter { - fun invoke(field: IntFieldAccess): Int - - @Deprecated("Use type specific invoke") - override fun invoke(field: FieldAccess): Int { - return invoke(field as IntFieldAccess) - } -} - -fun interface LongFieldGetter : FieldGetter { - fun invoke(field: LongFieldAccess): Long - - @Deprecated("Use type specific invoke") - override fun invoke(field: FieldAccess): Long { - return invoke(field as LongFieldAccess) - } -} - -fun interface BooleanFieldGetter : FieldGetter { - fun invoke(field: BooleanFieldAccess): Boolean - - @Deprecated("Use type specific invoke") - override fun invoke(field: FieldAccess): Boolean { - return invoke(field as BooleanFieldAccess) - } -} - -fun interface FieldSetter { - fun invoke(value: V, access: FieldAccess, setByRemote: Boolean) -} - -fun interface FloatFieldSetter : FieldSetter { - fun invoke(value: Float, access: FloatFieldAccess, setByRemote: Boolean) - - @Deprecated("Use type specific invoke") - override fun invoke(value: Float, access: FieldAccess, setByRemote: Boolean) { - invoke(value, access as FloatFieldAccess, setByRemote) - } -} - -fun interface DoubleFieldSetter : FieldSetter { - fun invoke(value: Double, access: DoubleFieldAccess, setByRemote: Boolean) - - @Deprecated("Use type specific invoke") - override fun invoke(value: Double, access: FieldAccess, setByRemote: Boolean) { - invoke(value, access as DoubleFieldAccess, setByRemote) - } -} - -fun interface IntFieldSetter : FieldSetter { - fun invoke(value: Int, access: IntFieldAccess, setByRemote: Boolean) - - @Deprecated("Use type specific invoke") - override fun invoke(value: Int, access: FieldAccess, setByRemote: Boolean) { - invoke(value, access as IntFieldAccess, setByRemote) - } -} - -fun interface LongFieldSetter : FieldSetter { - fun invoke(value: Long, access: LongFieldAccess, setByRemote: Boolean) - - @Deprecated("Use type specific invoke") - override fun invoke(value: Long, access: FieldAccess, setByRemote: Boolean) { - invoke(value, access as LongFieldAccess, setByRemote) - } -} - -fun interface BooleanFieldSetter : FieldSetter { - fun invoke(value: Boolean, access: BooleanFieldAccess, setByRemote: Boolean) - - @Deprecated("Use type specific invoke") - override fun invoke(value: Boolean, access: FieldAccess, setByRemote: Boolean) { - invoke(value, access as BooleanFieldAccess, setByRemote) - } -} - -sealed interface IField : ReadOnlyProperty, Supplier, () -> V { - fun observe(): Boolean - fun markDirty() - fun markDirty(endpoint: FieldSynchronizer.Endpoint) - val value: V - val isRemoved: Boolean - - fun remove() - - fun write(stream: DataOutputStream, endpoint: FieldSynchronizer.Endpoint) - fun read(stream: DataInputStream) - - override fun getValue(thisRef: Any?, property: KProperty<*>): V { - return this.value - } - - override fun get(): V { - return value - } - - override fun invoke(): V { - return value - } -} - -interface IFloatProperty { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Float -} - -sealed interface IFloatField : IField, FloatSupplier { - val float: Float - val property: IFloatProperty - - override val value: Float - get() = float - - @Deprecated("Use type specific Supplier interface") - override fun get(): Float { - return float - } - - override fun getAsFloat(): Float { - return float - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Float { - return float - } -} - -interface IDoubleProperty { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Double -} - -sealed interface IDoubleField : IField, DoubleSupplier { - val double: Double - val property: IDoubleProperty - - @Deprecated("Use type specific Supplier interface") - override fun get(): Double { - return double - } - - override val value: Double - get() = double - - override fun getAsDouble(): Double { - return double - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Double { - return double - } -} - -interface IIntProperty { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Int -} - -sealed interface IIntField : IField, IntSupplier { - val int: Int - val property: IIntProperty - - @Deprecated("Use type specific Supplier interface") - override fun get(): Int { - return int - } - - override val value: Int - get() = int - - override fun getAsInt(): Int { - return int - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Int { - return int - } -} - -interface ILongProperty { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Long -} - -sealed interface ILongField : IField, LongSupplier { - val long: Long - val property: ILongProperty - - @Deprecated("Use type specific Supplier interface") - override fun get(): Long { - return long - } - - override val value: Long - get() = long - - override fun getAsLong(): Long { - return long - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Long { - return long - } -} - -interface IBooleanProperty { - operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean -} - -sealed interface IBooleanField : IField, BooleanSupplier { - val boolean: Boolean - val property: IBooleanProperty - - @Deprecated("Use type specific Supplier interface") - override fun get(): Boolean { - return boolean - } - - override val value: Boolean - get() = boolean - - override fun getAsBoolean(): Boolean { - return boolean - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean { - return boolean - } -} - -sealed interface IMutableField : IField, GetterSetter { - override fun getValue(thisRef: Any?, property: KProperty<*>): V { - return this.value - } - - override var value: V - - override fun accept(t: V) { - value = t - } - - override fun invoke(): V { - return this.value - } -} - -interface IMutableFloatProperty : IFloatProperty { - operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Float) -} - -sealed interface IMutableFloatField : IMutableField, IFloatField, FloatConsumer { - override var float: Float - override val property: IMutableFloatProperty - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.float")) - override var value: Float - get() = float - set(value) { float = value } - - override fun accept(t: Float) { - float = t - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Float { - return float - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Float) { - float = value - } -} - -interface IMutableDoubleProperty : IDoubleProperty { - operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) -} - -sealed interface IMutableDoubleField : IMutableField, IDoubleField, DoubleConsumer { - override var double: Double - override val property: IMutableDoubleProperty - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.double")) - override var value: Double - get() = double - set(value) { double = value } - - override fun accept(t: Double) { - double = t - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Double { - return double - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) { - double = value - } -} - -interface IMutableIntProperty : IIntProperty { - operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) -} - -sealed interface IMutableIntField : IMutableField, IIntField, IntConsumer { - override var int: Int - override val property: IMutableIntProperty - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.int")) - override var value: Int - get() = int - set(value) { int = value } - - override fun accept(t: Int) { - int = t - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Int { - return int - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) { - int = value - } -} - -interface IMutableLongProperty : ILongProperty { - operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Long) -} - -sealed interface IMutableLongField : IMutableField, ILongField, LongConsumer { - override var long: Long - override val property: IMutableLongProperty - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.long")) - override var value: Long - get() = long - set(value) { long = value } - - override fun accept(t: Long) { - long = t - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Long { - return long - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Long) { - long = value - } -} - -interface IMutableBooleanProperty : IBooleanProperty { - operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) -} - -sealed interface IMutableBooleanField : IMutableField, IBooleanField, BooleanConsumer { - override var boolean: Boolean - override val property: IMutableBooleanProperty - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.boolean")) - override var value: Boolean - get() = boolean - set(value) { boolean = value } - - override fun accept(t: Boolean) { - boolean = t - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean { - return boolean - } - - @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) - override fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { - boolean = value - } -} - -data class MapChangeset( - val action: MapAction, - val key: K?, - val value: V? -) { - inline fun map(add: (K, V) -> Unit, remove: (K) -> Unit) { - when (action) { - MapAction.ADD -> add.invoke(key!!, value!!) - MapAction.REMOVE -> remove.invoke(key!!) - else -> {} - } - } - - inline fun map(add: (K, V) -> Unit, remove: (K) -> Unit, clear: () -> Unit) { - when (action) { - MapAction.CLEAR -> clear.invoke() - MapAction.ADD -> add.invoke(key!!, value!!) - MapAction.REMOVE -> remove.invoke(key!!) - } - } -} - -enum class MapAction { - CLEAR, ADD, REMOVE -} - /** - * Universal one-to-many value synchronizer, allowing to synchronize values from server to client + * Universal, one-to-many value synchronizer, allowing to synchronize values from server to client * anywhere, where input/output streams are supported */ @Suppress("unused") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/Fields.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/Fields.kt new file mode 100644 index 000000000..2985be01a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/Fields.kt @@ -0,0 +1,167 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +import mekanism.api.functions.FloatSupplier +import java.io.DataInputStream +import java.io.DataOutputStream +import java.util.function.BooleanSupplier +import java.util.function.DoubleSupplier +import java.util.function.IntSupplier +import java.util.function.LongSupplier +import java.util.function.Supplier +import kotlin.properties.ReadOnlyProperty +import kotlin.reflect.KProperty + +sealed interface IField : ReadOnlyProperty, Supplier, () -> V { + fun observe(): Boolean + fun markDirty() + fun markDirty(endpoint: FieldSynchronizer.Endpoint) + val value: V + val isRemoved: Boolean + + fun remove() + + fun write(stream: DataOutputStream, endpoint: FieldSynchronizer.Endpoint) + fun read(stream: DataInputStream) + + override fun getValue(thisRef: Any?, property: KProperty<*>): V { + return this.value + } + + override fun get(): V { + return value + } + + override fun invoke(): V { + return value + } +} + +interface IFloatProperty { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Float +} + +sealed interface IFloatField : IField, FloatSupplier { + val float: Float + val property: IFloatProperty + + override val value: Float + get() = float + + @Deprecated("Use type specific Supplier interface") + override fun get(): Float { + return float + } + + override fun getAsFloat(): Float { + return float + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Float { + return float + } +} + +interface IDoubleProperty { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Double +} + +sealed interface IDoubleField : IField, DoubleSupplier { + val double: Double + val property: IDoubleProperty + + @Deprecated("Use type specific Supplier interface") + override fun get(): Double { + return double + } + + override val value: Double + get() = double + + override fun getAsDouble(): Double { + return double + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Double { + return double + } +} + +interface IIntProperty { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Int +} + +sealed interface IIntField : IField, IntSupplier { + val int: Int + val property: IIntProperty + + @Deprecated("Use type specific Supplier interface") + override fun get(): Int { + return int + } + + override val value: Int + get() = int + + override fun getAsInt(): Int { + return int + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Int { + return int + } +} + +interface ILongProperty { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Long +} + +sealed interface ILongField : IField, LongSupplier { + val long: Long + val property: ILongProperty + + @Deprecated("Use type specific Supplier interface") + override fun get(): Long { + return long + } + + override val value: Long + get() = long + + override fun getAsLong(): Long { + return long + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Long { + return long + } +} + +interface IBooleanProperty { + operator fun getValue(thisRef: Any?, property: KProperty<*>): Boolean +} + +sealed interface IBooleanField : IField, BooleanSupplier { + val boolean: Boolean + val property: IBooleanProperty + + @Deprecated("Use type specific Supplier interface") + override fun get(): Boolean { + return boolean + } + + override val value: Boolean + get() = boolean + + override fun getAsBoolean(): Boolean { + return boolean + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean { + return boolean + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapAction.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapAction.kt new file mode 100644 index 000000000..2065e8c65 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapAction.kt @@ -0,0 +1,5 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +enum class MapAction { + CLEAR, ADD, REMOVE +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapChangeset.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapChangeset.kt new file mode 100644 index 000000000..f7cf986e4 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MapChangeset.kt @@ -0,0 +1,23 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +data class MapChangeset( + val action: MapAction, + val key: K?, + val value: V? +) { + inline fun map(add: (K, V) -> Unit, remove: (K) -> Unit) { + when (action) { + MapAction.ADD -> add.invoke(key!!, value!!) + MapAction.REMOVE -> remove.invoke(key!!) + else -> {} + } + } + + inline fun map(add: (K, V) -> Unit, remove: (K) -> Unit, clear: () -> Unit) { + when (action) { + MapAction.CLEAR -> clear.invoke() + MapAction.ADD -> add.invoke(key!!, value!!) + MapAction.REMOVE -> remove.invoke(key!!) + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MutableFields.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MutableFields.kt new file mode 100644 index 000000000..a6937cf89 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/synchronizer/MutableFields.kt @@ -0,0 +1,165 @@ +package ru.dbotthepony.mc.otm.network.synchronizer + +import it.unimi.dsi.fastutil.booleans.BooleanConsumer +import it.unimi.dsi.fastutil.floats.FloatConsumer +import ru.dbotthepony.mc.otm.core.GetterSetter +import java.util.function.DoubleConsumer +import java.util.function.IntConsumer +import java.util.function.LongConsumer +import kotlin.reflect.KProperty + +sealed interface IMutableField : IField, GetterSetter { + override fun getValue(thisRef: Any?, property: KProperty<*>): V { + return this.value + } + + override var value: V + + override fun accept(t: V) { + value = t + } + + override fun invoke(): V { + return this.value + } +} + +interface IMutableFloatProperty : IFloatProperty { + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Float) +} + +sealed interface IMutableFloatField : IMutableField, IFloatField, FloatConsumer { + override var float: Float + override val property: IMutableFloatProperty + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.float")) + override var value: Float + get() = float + set(value) { float = value } + + override fun accept(t: Float) { + float = t + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Float { + return float + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Float) { + float = value + } +} + +interface IMutableDoubleProperty : IDoubleProperty { + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) +} + +sealed interface IMutableDoubleField : IMutableField, IDoubleField, DoubleConsumer { + override var double: Double + override val property: IMutableDoubleProperty + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.double")) + override var value: Double + get() = double + set(value) { double = value } + + override fun accept(t: Double) { + double = t + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Double { + return double + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Double) { + double = value + } +} + +interface IMutableIntProperty : IIntProperty { + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) +} + +sealed interface IMutableIntField : IMutableField, IIntField, IntConsumer { + override var int: Int + override val property: IMutableIntProperty + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.int")) + override var value: Int + get() = int + set(value) { int = value } + + override fun accept(t: Int) { + int = t + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Int { + return int + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Int) { + int = value + } +} + +interface IMutableLongProperty : ILongProperty { + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Long) +} + +sealed interface IMutableLongField : IMutableField, ILongField, LongConsumer { + override var long: Long + override val property: IMutableLongProperty + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.long")) + override var value: Long + get() = long + set(value) { long = value } + + override fun accept(t: Long) { + long = t + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Long { + return long + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Long) { + long = value + } +} + +interface IMutableBooleanProperty : IBooleanProperty { + operator fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) +} + +sealed interface IMutableBooleanField : IMutableField, IBooleanField, BooleanConsumer { + override var boolean: Boolean + override val property: IMutableBooleanProperty + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.boolean")) + override var value: Boolean + get() = boolean + set(value) { boolean = value } + + override fun accept(t: Boolean) { + boolean = t + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun getValue(thisRef: Any?, property: KProperty<*>): Boolean { + return boolean + } + + @Deprecated("Use type specific property", replaceWith = ReplaceWith("this.property")) + override fun setValue(thisRef: Any?, property: KProperty<*>, value: Boolean) { + boolean = value + } +} diff --git a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FieldSynchronizerTests.kt b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FieldSynchronizerTests.kt index dae1dc541..001768a4e 100644 --- a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FieldSynchronizerTests.kt +++ b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FieldSynchronizerTests.kt @@ -3,8 +3,8 @@ package ru.dbotthepony.mc.otm.tests import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import ru.dbotthepony.mc.otm.network.FieldSynchronizer -import ru.dbotthepony.mc.otm.network.IMutableField +import ru.dbotthepony.mc.otm.network.synchronizer.FieldSynchronizer +import ru.dbotthepony.mc.otm.network.synchronizer.IMutableField import java.io.ByteArrayInputStream object FieldSynchronizerTests {