diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterPanelBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterPanelBlockEntity.kt index 12b9fc174..6663c1747 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterPanelBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterPanelBlockEntity.kt @@ -11,7 +11,6 @@ import net.minecraft.world.inventory.AbstractContainerMenu import ru.dbotthepony.mc.otm.capability.MatteryCapability import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.ListTag -import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraftforge.common.util.INBTSerializable import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity @@ -22,9 +21,7 @@ import ru.dbotthepony.mc.otm.core.nbt.map import ru.dbotthepony.mc.otm.core.nbt.mapString import ru.dbotthepony.mc.otm.core.nbt.set import ru.dbotthepony.mc.otm.core.util.ItemSorter -import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.MatterGraph -import ru.dbotthepony.mc.otm.graph.matter.MatterNode import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode import ru.dbotthepony.mc.otm.registry.MBlockEntities import java.util.* @@ -195,7 +192,7 @@ class MatterPanelBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : setChanged() } - fun addTask(state: IPatternState, count: Int): IReplicationTask<*> { + fun addTask(state: PatternState, count: Int): IReplicationTask<*> { val task = ReplicationTask(UUID.randomUUID(), Optional.of(state.id), state.item, 0, 0, count) _tasks[task.id] = task diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt index 74976f0ba..55c2c0d9d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReconstructorBlockEntity.kt @@ -21,7 +21,7 @@ import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.IMatterStorage -import ru.dbotthepony.mc.otm.capability.matter.IPatternState +import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.capability.matter.MatterStorageImpl import ru.dbotthepony.mc.otm.capability.matter.ProfiledMatterStorage import ru.dbotthepony.mc.otm.config.EnergyBalanceValues @@ -68,15 +68,15 @@ class MatterReconstructorBlockEntity(blockPos: BlockPos, blockState: BlockState) return matter } - override fun onPatternAdded(state: IPatternState) { + override fun onPatternAdded(state: PatternState) { containerChanged() } - override fun onPatternRemoved(state: IPatternState) { + override fun onPatternRemoved(state: PatternState) { containerChanged() } - override fun onPatternUpdated(newState: IPatternState, oldState: IPatternState) { + override fun onPatternUpdated(newState: PatternState, oldState: PatternState) { containerChanged() } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt index 5df4e5218..1e42b8a95 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterReplicatorBlockEntity.kt @@ -91,7 +91,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : jobEventLoops[0].notify(MachineJobEventLoop.IdleReason.OBSERVING) } - override fun onPatternAdded(state: IPatternState) { + override fun onPatternAdded(state: PatternState) { jobEventLoops[0].notify(MachineJobEventLoop.IdleReason.OBSERVING) } } @@ -182,7 +182,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : matterPerTick = matter.matter / ticks, task = allocation.task.id, matterValue = matter.matter, - pattern = Optional.ofNullable(allocation.pattern?.asImmutable()), + pattern = Optional.ofNullable(allocation.pattern), asDust = (level?.random?.nextDouble() ?: 1.0) * upgrades.failureMultiplier > (allocation.pattern?.researchPercent ?: 2.0), ticks = ticks, )) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterScannerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterScannerBlockEntity.kt index 6869bd9e5..2009e343d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterScannerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterScannerBlockEntity.kt @@ -7,32 +7,22 @@ import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState -import net.minecraftforge.common.ForgeConfigSpec import ru.dbotthepony.mc.otm.block.entity.JobContainer import ru.dbotthepony.mc.otm.block.entity.JobStatus import ru.dbotthepony.mc.otm.block.entity.ItemJob import ru.dbotthepony.mc.otm.block.entity.MachineJobEventLoop -import ru.dbotthepony.mc.otm.config.EnergyBalanceValues import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.capability.IMatteryUpgrade -import ru.dbotthepony.mc.otm.capability.energy.BlockEnergyStorageImpl import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.UpgradeType import ru.dbotthepony.mc.otm.capability.energy.ProfiledEnergyStorage import ru.dbotthepony.mc.otm.capability.energy.WorkerEnergyStorage -import ru.dbotthepony.mc.otm.capability.matter.IPatternState import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.config.MachinesConfig import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.HandlerFilter import ru.dbotthepony.mc.otm.container.UpgradeContainer -import ru.dbotthepony.mc.otm.core.math.Decimal -import ru.dbotthepony.mc.otm.core.math.DecimalConfigValue -import ru.dbotthepony.mc.otm.core.math.defineDecimal import ru.dbotthepony.mc.otm.menu.matter.MatterScannerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.registry.MNames -import ru.dbotthepony.mc.otm.core.util.WriteOnce import ru.dbotthepony.mc.otm.graph.matter.MatterNode import ru.dbotthepony.mc.otm.matter.MatterManager import java.util.* @@ -58,15 +48,15 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val energyConfig = ConfigurableEnergy(energy) val matterNode = object : MatterNode() { - override fun onPatternAdded(state: IPatternState) { + override fun onPatternAdded(state: PatternState) { jobEventLoops[0].notify(MachineJobEventLoop.IdleReason.PATTERN) } - override fun onPatternRemoved(state: IPatternState) { + override fun onPatternRemoved(state: PatternState) { jobEventLoops[0].notify(MachineJobEventLoop.IdleReason.PATTERN) } - override fun onPatternUpdated(newState: IPatternState, oldState: IPatternState) { + override fun onPatternUpdated(newState: PatternState, oldState: PatternState) { jobEventLoops[0].notify(MachineJobEventLoop.IdleReason.PATTERN) } } @@ -96,7 +86,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val stack = status.job.itemStack if (stack.isEmpty || !MatterManager.hasMatterValue(stack)) return status.success() - var findState: IPatternState? = null + var findState: PatternState? = null for (state in matterNode.graph.patterns.filter { it.item === stack.item }) { if (findState == null && state.researchPercent < 1.0) { @@ -108,7 +98,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val researchAdvance = MatterManager.getResearchAdvance(stack.item) - val new: IPatternState = + val new: PatternState = if (findState != null) { PatternState(findState.id, stack.item, (findState.researchPercent + researchAdvance).coerceAtMost(1.0)) } else { @@ -128,7 +118,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val stack = container.getItem(0) if (stack.isEmpty || !MatterManager.canDecompose(stack)) return JobContainer.noItem() - var findState: IPatternState? = null + var findState: PatternState? = null for (state in matterNode.graph.patterns.filter { it.item === stack.item }) { if (state.researchPercent < 1.0) { @@ -142,7 +132,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val researchAdvance = MatterManager.getResearchAdvance(stack.item) - val new: IPatternState = + val new: PatternState = if (findState != null) { PatternState(findState.id, stack.item, (findState.researchPercent + researchAdvance).coerceAtMost(1.0)) } else { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt index 1e4e0a821..81f4d9375 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/PatternStorageBlockEntity.kt @@ -13,14 +13,11 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import ru.dbotthepony.mc.otm.menu.matter.PatternStorageMenu import net.minecraft.MethodsReturnNonnullByDefault -import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.block.entity.MatteryDeviceBlockEntity import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.core.collect.iterator -import ru.dbotthepony.mc.otm.graph.Graph6Node -import ru.dbotthepony.mc.otm.graph.matter.MatterGraph import ru.dbotthepony.mc.otm.graph.matter.SimpleMatterNode import ru.dbotthepony.mc.otm.registry.MBlockEntities import java.util.ArrayList @@ -97,8 +94,8 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : return PatternStorageMenu(containerID, inventory, this) } - override val patterns: Stream get() { - val streams = ArrayList>() + override val patterns: Stream get() { + val streams = ArrayList>() for (provider in this.container.iterator(MatteryCapability.PATTERN)) { streams.add(provider.second.patterns) @@ -130,7 +127,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : matterNode.isValid = false } - override fun insertPattern(pattern: IPatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { + override fun insertPattern(pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { for (pair in this.container.iterator(MatteryCapability.PATTERN)) { val status = pair.second.insertPattern(pattern, onlyUpdate, simulate) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/Data.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/Data.kt index 78df561cc..64b6d75cf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/Data.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/Data.kt @@ -8,8 +8,8 @@ private enum class PatternInsertResult { sealed class PatternInsertStatus( private val status: PatternInsertResult, - val newState: IPatternState?, - val oldState: IPatternState? + val newState: PatternState?, + val oldState: PatternState? ) { val isFailed get() = status == PatternInsertResult.FAIL val isUpdated get() = status == PatternInsertResult.UPDATED @@ -17,8 +17,8 @@ sealed class PatternInsertStatus( } object PatternInsertFailure : PatternInsertStatus(PatternInsertResult.FAIL, null, null) -class PatternInsertUpdated(new: IPatternState, old: IPatternState) : PatternInsertStatus(PatternInsertResult.UPDATED, new, old) -class PatternInsertInserted(new: IPatternState) : PatternInsertStatus(PatternInsertResult.INSERTED, new, null) +class PatternInsertUpdated(new: PatternState, old: PatternState) : PatternInsertStatus(PatternInsertResult.UPDATED, new, old) +class PatternInsertInserted(new: PatternState) : PatternInsertStatus(PatternInsertResult.INSERTED, new, null) @JvmRecord -data class ReplicationTaskAllocation(val task: IReplicationTask<*>, val pattern: IPatternState?) +data class ReplicationTaskAllocation(val task: IReplicationTask<*>, val pattern: PatternState?) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt index b43508eb6..4730b3291 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/IPatternStorage.kt @@ -15,21 +15,21 @@ interface IPatternStorage { /** * It must return new stream each time */ - val patterns: Stream + val patterns: Stream - fun findPatterns(item: Item): Collection { + fun findPatterns(item: Item): Collection { return findPatterns { item == it.item } } - fun findPatterns(predicate: Predicate): Collection { + fun findPatterns(predicate: Predicate): Collection { return patterns.filter(predicate).collect(Collectors.toList()) } - fun findPattern(item: Item): IPatternState? { + fun findPattern(item: Item): PatternState? { return patterns.filter { it.item == item }.findAny().orElse(null) } - fun getPattern(id: UUID?): IPatternState? { + fun getPattern(id: UUID?): PatternState? { return patterns.filter { it.id == id }.findAny().orElse(null) } @@ -37,7 +37,7 @@ interface IPatternStorage { return patterns.filter { it.item == item }.findAny().isPresent } - fun hasPattern(state: IPatternState): Boolean { + fun hasPattern(state: PatternState): Boolean { return hasPattern(state.id) } @@ -57,13 +57,13 @@ interface IPatternStorage { * @param simulate whenever to affect state * @return record of status of the operation (at status() FAIL, UPDATED, INSERTED) as well as new_state and old_state */ - fun insertPattern(pattern: IPatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus + fun insertPattern(pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus - fun insertPattern(pattern: IPatternState, simulate: Boolean): PatternInsertStatus { + fun insertPattern(pattern: PatternState, simulate: Boolean): PatternInsertStatus { return insertPattern(pattern, false, simulate) } - fun updatePattern(pattern: IPatternState, simulate: Boolean): PatternInsertStatus { + fun updatePattern(pattern: PatternState, simulate: Boolean): PatternInsertStatus { return insertPattern(pattern, true, simulate) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/PatternState.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/PatternState.kt index 4fd31a930..d3ae04379 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/PatternState.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/PatternState.kt @@ -1,101 +1,39 @@ package ru.dbotthepony.mc.otm.capability.matter -import com.mojang.datafixers.Products import com.mojang.serialization.Codec import com.mojang.serialization.codecs.RecordCodecBuilder import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtOps import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf -import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries -import ru.dbotthepony.mc.otm.core.* -import ru.dbotthepony.mc.otm.core.nbt.contains -import ru.dbotthepony.mc.otm.core.nbt.set +import ru.dbotthepony.mc.otm.core.util.readBinaryJsonWithCodec +import ru.dbotthepony.mc.otm.core.util.writeBinaryJsonWithCodec import ru.dbotthepony.mc.otm.data.UUIDCodec import java.util.* -sealed interface IPatternState { - val id: UUID - val item: Item - val researchPercent: Double - - fun asMutable(): MutablePatternState - fun asImmutable() : PatternState - - fun matchId(other: IPatternState): Boolean { +data class PatternState( + val id: UUID, + val item: Item, + val researchPercent: Double, +) { + fun matchId(other: PatternState): Boolean { return other.id == id } - fun copyAsMutable( - id: UUID = this.id, - item: Item = this.item, - researchPercent: Double = this.researchPercent, - ): MutablePatternState { - return MutablePatternState(id, item, researchPercent) - } - - fun copyAsImmutable( - id: UUID = this.id, - item: Item = this.item, - researchPercent: Double = this.researchPercent, - ) : PatternState { - return PatternState(id, item, researchPercent) - } - fun stack(count: Int = 1): ItemStack { return ItemStack(item, count) } - fun serializeNBT(): CompoundTag - fun write(buff: FriendlyByteBuf) { - buff.writeUUID(id) - buff.writeItemType(item) - buff.writeDouble(researchPercent) - } -} - -private fun codec(builder: RecordCodecBuilder.Instance): Products.P3, UUID, Item, Double> { - return builder.group( - UUIDCodec.fieldOf("id").forGetter(IPatternState::id), - ForgeRegistries.ITEMS.codec.fieldOf("item").forGetter(IPatternState::item), - Codec.doubleRange(0.0, 1.0).fieldOf("researchPercent").forGetter(IPatternState::researchPercent) - ) -} - -private fun read(buff: FriendlyByteBuf, mutable: Boolean): IPatternState? { - val id = buff.readUUID() - val item = buff.readItemType() - val researchPercent = buff.readDouble() - - item ?: return null - - if (mutable) { - return MutablePatternState(id, item, researchPercent) - } else { - return PatternState(id, item, researchPercent) - } -} - -data class PatternState( - override val id: UUID, - override val item: Item, - override val researchPercent: Double, -) : IPatternState { - override fun asMutable(): MutablePatternState { - return MutablePatternState(id, item, researchPercent) + buff.writeBinaryJsonWithCodec(CODEC, this) } - override fun asImmutable(): PatternState { - return this - } - - override fun serializeNBT(): CompoundTag { - return CODEC.encode(this, NbtOps.INSTANCE, NbtOps.INSTANCE.empty()).get().map({ it as CompoundTag }, { throw RuntimeException("Failed to serialize PatternState: ${it.message()}") }) + fun serializeNBT(): CompoundTag { + return CODEC.encode(this, NbtOps.INSTANCE, NbtOps.INSTANCE.empty()).get() + .map({ it as CompoundTag }, { throw RuntimeException("Failed to serialize PatternState: ${it.message()}") }) } companion object { @@ -104,48 +42,17 @@ data class PatternState( return CODEC.decode(NbtOps.INSTANCE, tag).result().map { it.first }.orElse(null) } - fun read(buff: FriendlyByteBuf): PatternState? { - return read(buff, false) as PatternState? + fun read(buff: FriendlyByteBuf): PatternState { + return buff.readBinaryJsonWithCodec(CODEC) } val CODEC: Codec by lazy { RecordCodecBuilder.create { - codec(it).apply(it, ::PatternState) - } - } - } -} - -data class MutablePatternState( - override val id: UUID, - override val item: Item, - override var researchPercent: Double, -) : IPatternState { - override fun asMutable(): MutablePatternState { - return this - } - - override fun asImmutable(): PatternState { - return PatternState(id, item, researchPercent) - } - - override fun serializeNBT(): CompoundTag { - return CODEC.encode(this, NbtOps.INSTANCE, NbtOps.INSTANCE.empty()).get().map({ it as CompoundTag }, { throw RuntimeException("Failed to serialize MutablePatternState: ${it.message()}") }) - } - - companion object { - fun deserializeNBT(tag: Tag?): MutablePatternState? { - tag ?: return null - return CODEC.decode(NbtOps.INSTANCE, tag).result().map { it.first }.orElse(null) - } - - fun read(buff: FriendlyByteBuf): MutablePatternState? { - return read(buff, true) as MutablePatternState? - } - - val CODEC: Codec by lazy { - RecordCodecBuilder.create { - codec(it).apply(it, ::MutablePatternState) + it.group( + UUIDCodec.fieldOf("id").forGetter(PatternState::id), + ForgeRegistries.ITEMS.codec.fieldOf("item").forGetter(PatternState::item), + Codec.doubleRange(0.0, 1.0).fieldOf("researchPercent").forGetter(PatternState::researchPercent) + ).apply(it, ::PatternState) } } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt index c21d4a1ce..e39e56d9d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/matter/MatterPanelScreen.kt @@ -2,11 +2,10 @@ package ru.dbotthepony.mc.otm.client.screen.matter import net.minecraft.ChatFormatting import net.minecraft.client.gui.GuiGraphics -import net.minecraft.client.gui.components.EditBox import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.capability.matter.IPatternState +import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.capability.matter.IReplicationTask import ru.dbotthepony.mc.otm.client.ShiftPressedCond import ru.dbotthepony.mc.otm.client.render.* @@ -16,7 +15,6 @@ import ru.dbotthepony.mc.otm.client.screen.panels.button.ButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.DeviceControls import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeBooleanRectangleButtonPanel import ru.dbotthepony.mc.otm.client.screen.panels.button.LargeEnumRectangleButtonPanel -import ru.dbotthepony.mc.otm.client.screen.panels.input.EditBoxPanel import ru.dbotthepony.mc.otm.client.screen.panels.input.TextInputPanel import ru.dbotthepony.mc.otm.client.screen.panels.slot.AbstractSlotPanel import ru.dbotthepony.mc.otm.client.screen.panels.util.DiscreteScrollBarPanel @@ -299,7 +297,7 @@ class MatterPanelScreen( return frame } - private fun openPattern(pattern: IPatternState): FramePanel { + private fun openPattern(pattern: PatternState): FramePanel { val frame = FramePanel.padded(this, null, 213f, (ButtonPanel.HEIGHT + 3f) * 4f + 38f, TranslatableComponent("otm.gui.matter_panel.task")) frame.behaveAsWindow() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/FriendlyStreams.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/FriendlyStreams.kt index 308563fa2..0b3b95b53 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/FriendlyStreams.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/util/FriendlyStreams.kt @@ -7,8 +7,11 @@ import com.google.gson.JsonObject import com.google.gson.JsonParseException import com.google.gson.JsonPrimitive import com.google.gson.JsonSyntaxException +import com.mojang.serialization.Codec +import com.mojang.serialization.JsonOps import io.netty.buffer.ByteBufInputStream import io.netty.buffer.ByteBufOutputStream +import io.netty.handler.codec.DecoderException import io.netty.handler.codec.EncoderException import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.NbtAccounter @@ -273,6 +276,16 @@ fun FriendlyByteBuf.writeBinaryJson(value: JsonElement) { ByteBufOutputStream(this).writeBinaryJson(value) } +fun FriendlyByteBuf.writeBinaryJsonWithCodec(codec: Codec, value: S) { + writeBinaryJson(codec.encode(value, JsonOps.INSTANCE, JsonOps.INSTANCE.empty()) + .get().map({ it }, { throw EncoderException("Failed to encode input data: ${it.message()}") })) +} + +fun FriendlyByteBuf.readBinaryJsonWithCodec(codec: Codec, sizeLimit: NbtAccounter = NbtAccounter(1L shl 18)): S { + return codec.decode(JsonOps.INSTANCE, readBinaryJson(sizeLimit)) + .get().map({ it.first }, { throw DecoderException("Failed to decode data from network: ${it.message()}") }) +} + fun FriendlyByteBuf.readBinaryComponent(): Component { return Component.Serializer.fromJson(readBinaryJson()) ?: throw NullPointerException("Received null component") } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/IMatterGraphListener.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/IMatterGraphListener.kt index 1d2177c8e..462f431e2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/IMatterGraphListener.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/IMatterGraphListener.kt @@ -3,9 +3,9 @@ package ru.dbotthepony.mc.otm.graph.matter import ru.dbotthepony.mc.otm.capability.matter.* interface IMatterGraphListener { - fun onPatternAdded(state: IPatternState) {} - fun onPatternRemoved(state: IPatternState) {} - fun onPatternUpdated(newState: IPatternState, oldState: IPatternState) {} + fun onPatternAdded(state: PatternState) {} + fun onPatternRemoved(state: PatternState) {} + fun onPatternUpdated(newState: PatternState, oldState: PatternState) {} fun onMatterTaskCreated(task: IReplicationTask<*>) {} fun > onMatterTaskUpdated(newState: T, oldState: T) {} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/MatterGraph.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/MatterGraph.kt index 86f0e6b26..08bc17579 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/MatterGraph.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/matter/MatterGraph.kt @@ -170,7 +170,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe return received } - private fun doInsertPattern(state: IPatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { + private fun doInsertPattern(state: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { for (node in nodes) { val storage = node.getPatternHandler() @@ -186,7 +186,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe return PatternInsertFailure } - fun insertPattern(state: IPatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { + fun insertPattern(state: PatternState, onlyUpdate: Boolean, simulate: Boolean): PatternInsertStatus { if (onlyUpdate) return doInsertPattern(state, true, simulate) val status = doInsertPattern(state, true, simulate) if (!status.isFailed) return status @@ -201,7 +201,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe return nodes.stream().map { it.getTaskHandler()?.allReplicationTasks }.filterNotNull().flatMap { it } } - val patterns: Stream get() { + val patterns: Stream get() { return nodes.stream().map { it.getPatternHandler()?.patterns }.filterNotNull().flatMap { it } } @@ -233,7 +233,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe return value } - fun getPattern(id: UUID): IPatternState? { + fun getPattern(id: UUID): PatternState? { for (node in nodes) { val storage = node.getPatternHandler() @@ -253,7 +253,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe fun hasPattern(state: PatternState) = getPattern(state.id) != null fun hasPattern(id: UUID) = getPattern(id) != null - fun findPattern(predicate: Predicate): IPatternState? { + fun findPattern(predicate: Predicate): PatternState? { for (node in nodes) { val storage = node.getPatternHandler() @@ -271,7 +271,7 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe fun findPattern(predicate: Item) = findPattern { it.item == predicate } - fun findPatterns(predicate: Predicate): List { + fun findPatterns(predicate: Predicate): List { return patterns.filter(predicate).toList() } @@ -297,17 +297,17 @@ class MatterGraph : Abstract6Graph(), IMatterGraphListe return nodes.any { it.getTaskHandler()?.notifyTaskCompletion(taskId) == true } } - override fun onPatternAdded(state: IPatternState) { + override fun onPatternAdded(state: PatternState) { for (node in nodes) node.onPatternAdded(state) for (node in listeners) node.onPatternAdded(state) } - override fun onPatternRemoved(state: IPatternState) { + override fun onPatternRemoved(state: PatternState) { for (node in nodes) node.onPatternRemoved(state) for (node in listeners) node.onPatternRemoved(state) } - override fun onPatternUpdated(newState: IPatternState, oldState: IPatternState) { + override fun onPatternUpdated(newState: PatternState, oldState: PatternState) { for (node in nodes) node.onPatternUpdated(newState, oldState) for (node in listeners) node.onPatternUpdated(newState, oldState) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/CreativePatternItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/CreativePatternItem.kt index 8dd5a4659..b07ed0744 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/CreativePatternItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/CreativePatternItem.kt @@ -14,11 +14,10 @@ import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.capability.MatteryCapability -import ru.dbotthepony.mc.otm.capability.matter.IPatternState +import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.capability.matter.IPatternStorage import ru.dbotthepony.mc.otm.capability.matter.PatternInsertFailure import ru.dbotthepony.mc.otm.capability.matter.PatternInsertStatus -import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.getID import ru.dbotthepony.mc.otm.matter.MatterManager @@ -29,7 +28,7 @@ class CreativePatternItem : Item(Properties().rarity(Rarity.EPIC).stacksTo(1)) { private object Patterns : IPatternStorage, ICapabilityProvider { private val resolver = LazyOptional.of { this } - override val patterns: Stream + override val patterns: Stream get() = MatterManager.map.keys.stream().map { PatternState(UUID(34783464838L, 4463458382L + ForgeRegistries.ITEMS.getID(it)), it, 1.0) } override val patternCapacity: Int @@ -43,7 +42,7 @@ class CreativePatternItem : Item(Properties().rarity(Rarity.EPIC).stacksTo(1)) { } override fun insertPattern( - pattern: IPatternState, + pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean ): PatternInsertStatus { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt index 0f91e014e..03924bd0a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/matter/PatternStorageItem.kt @@ -108,14 +108,14 @@ class PatternStorageItem : Item { return if (cap == MatteryCapability.PATTERN) resolver.cast() else LazyOptional.empty() } - override val patterns: Stream get() { + override val patterns: Stream get() { return stack.tag?.map("otm_patterns") { it: ListTag -> - it.stream().map { PatternState.deserializeNBT(it) }.filter { it != null } as Stream + it.stream().map { PatternState.deserializeNBT(it) }.filter { it != null } as Stream } ?: Stream.empty() } override fun insertPattern( - pattern: IPatternState, + pattern: PatternState, onlyUpdate: Boolean, simulate: Boolean ): PatternInsertStatus { @@ -128,7 +128,7 @@ class PatternStorageItem : Item { if (simulate) { if (patternCapacity > 0) - return PatternInsertInserted(pattern.asImmutable()) + return PatternInsertInserted(pattern) else return PatternInsertFailure } @@ -148,7 +148,7 @@ class PatternStorageItem : Item { list[i] = pattern.serializeNBT() } - return PatternInsertUpdated(pattern.asImmutable(), state) + return PatternInsertUpdated(pattern, state) } } else { invalidCounter++ @@ -160,7 +160,7 @@ class PatternStorageItem : Item { if (invalidCounter > 0) { if (simulate) - return PatternInsertInserted(pattern.asImmutable()) + return PatternInsertInserted(pattern) for (i in list.indices) { val state = PatternState.deserializeNBT(list.getCompound(i)) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt index 71578aae5..589564d7e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/matter/MatterPanelMenu.kt @@ -49,7 +49,7 @@ class CancelTaskPacket(val id: UUID) : MatteryPacket { } } -class PatternsChangePacket(val isUpdate: Boolean, val patterns: Collection) : MatteryPacket { +class PatternsChangePacket(val isUpdate: Boolean, val patterns: Collection) : MatteryPacket { override fun write(buff: FriendlyByteBuf) { buff.writeBoolean(isUpdate) buff.writeInt(patterns.size) @@ -205,16 +205,16 @@ class MatterPanelMenu @JvmOverloads constructor( val sortingGS = GetterSetter.of(::sorting, changeSorting::input) val isAscendingGS = GetterSetter.of(::isAscending, changeIsAscending::input) - private val actualComparator = Comparator { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) } + private val actualComparator = Comparator { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) } private val actualTaskComparator = Comparator> { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) } - private val patterns = ArrayList() + private val patterns = ArrayList() private val tasks = ArrayList>() - val patternsFiltered = ArrayList() + val patternsFiltered = ArrayList() val tasksFiltered = ArrayList>() - fun networkPatternsUpdated(patterns: Collection) { + fun networkPatternsUpdated(patterns: Collection) { for (pattern in patterns) { val index = this.patterns.indexOfFirst(pattern::matchId) @@ -236,7 +236,7 @@ class MatterPanelMenu @JvmOverloads constructor( } } - fun networkPatternsRemoved(patterns: Collection) { + fun networkPatternsRemoved(patterns: Collection) { for (pattern in patterns) { this.patterns.remove(pattern) } @@ -310,15 +310,15 @@ class MatterPanelMenu @JvmOverloads constructor( MenuNetworkChannel.sendToServer(CancelTaskPacket(id)) } - override fun onPatternAdded(state: IPatternState) { + override fun onPatternAdded(state: PatternState) { sendNetwork(PatternsChangePacket(true, listOf(state))) } - override fun onPatternRemoved(state: IPatternState) { + override fun onPatternRemoved(state: PatternState) { sendNetwork(PatternsChangePacket(false, listOf(state))) } - override fun onPatternUpdated(newState: IPatternState, oldState: IPatternState) { + override fun onPatternUpdated(newState: PatternState, oldState: PatternState) { sendNetwork(PatternsChangePacket(true, listOf(newState))) }