Make PatternState be only immutable, completely move it to codecs, write/read binary json with codec
This commit is contained in:
parent
662801df7d
commit
a673ed966e
@ -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
|
||||
|
||||
|
@ -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()
|
||||
}
|
||||
}
|
||||
|
@ -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,
|
||||
))
|
||||
|
@ -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 {
|
||||
|
@ -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<out IPatternState> get() {
|
||||
val streams = ArrayList<Stream<out IPatternState>>()
|
||||
override val patterns: Stream<out PatternState> get() {
|
||||
val streams = ArrayList<Stream<out PatternState>>()
|
||||
|
||||
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)
|
||||
|
||||
|
@ -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?)
|
||||
|
@ -15,21 +15,21 @@ interface IPatternStorage {
|
||||
/**
|
||||
* It must return new stream each time
|
||||
*/
|
||||
val patterns: Stream<out IPatternState>
|
||||
val patterns: Stream<out PatternState>
|
||||
|
||||
fun findPatterns(item: Item): Collection<IPatternState> {
|
||||
fun findPatterns(item: Item): Collection<PatternState> {
|
||||
return findPatterns { item == it.item }
|
||||
}
|
||||
|
||||
fun findPatterns(predicate: Predicate<IPatternState>): Collection<IPatternState> {
|
||||
fun findPatterns(predicate: Predicate<PatternState>): Collection<PatternState> {
|
||||
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)
|
||||
}
|
||||
}
|
||||
|
@ -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 <T : IPatternState> codec(builder: RecordCodecBuilder.Instance<T>): Products.P3<RecordCodecBuilder.Mu<T>, 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<PatternState> 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<MutablePatternState> 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)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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<MatterPanelScreen> {
|
||||
private fun openPattern(pattern: PatternState): FramePanel<MatterPanelScreen> {
|
||||
val frame = FramePanel.padded(this, null, 213f, (ButtonPanel.HEIGHT + 3f) * 4f + 38f, TranslatableComponent("otm.gui.matter_panel.task"))
|
||||
|
||||
frame.behaveAsWindow()
|
||||
|
@ -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 <S> FriendlyByteBuf.writeBinaryJsonWithCodec(codec: Codec<S>, value: S) {
|
||||
writeBinaryJson(codec.encode(value, JsonOps.INSTANCE, JsonOps.INSTANCE.empty())
|
||||
.get().map({ it }, { throw EncoderException("Failed to encode input data: ${it.message()}") }))
|
||||
}
|
||||
|
||||
fun <S> FriendlyByteBuf.readBinaryJsonWithCodec(codec: Codec<S>, 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")
|
||||
}
|
||||
|
@ -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 <T : IReplicationTask<*>> onMatterTaskUpdated(newState: T, oldState: T) {}
|
||||
|
@ -170,7 +170,7 @@ class MatterGraph : Abstract6Graph<MatterNode, MatterGraph>(), 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<MatterNode, MatterGraph>(), 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<MatterNode, MatterGraph>(), IMatterGraphListe
|
||||
return nodes.stream().map { it.getTaskHandler()?.allReplicationTasks }.filterNotNull().flatMap { it }
|
||||
}
|
||||
|
||||
val patterns: Stream<IPatternState> get() {
|
||||
val patterns: Stream<PatternState> get() {
|
||||
return nodes.stream().map { it.getPatternHandler()?.patterns }.filterNotNull().flatMap { it }
|
||||
}
|
||||
|
||||
@ -233,7 +233,7 @@ class MatterGraph : Abstract6Graph<MatterNode, MatterGraph>(), 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<MatterNode, MatterGraph>(), IMatterGraphListe
|
||||
fun hasPattern(state: PatternState) = getPattern(state.id) != null
|
||||
fun hasPattern(id: UUID) = getPattern(id) != null
|
||||
|
||||
fun findPattern(predicate: Predicate<IPatternState>): IPatternState? {
|
||||
fun findPattern(predicate: Predicate<PatternState>): PatternState? {
|
||||
for (node in nodes) {
|
||||
val storage = node.getPatternHandler()
|
||||
|
||||
@ -271,7 +271,7 @@ class MatterGraph : Abstract6Graph<MatterNode, MatterGraph>(), IMatterGraphListe
|
||||
|
||||
fun findPattern(predicate: Item) = findPattern { it.item == predicate }
|
||||
|
||||
fun findPatterns(predicate: Predicate<IPatternState>): List<IPatternState> {
|
||||
fun findPatterns(predicate: Predicate<PatternState>): List<PatternState> {
|
||||
return patterns.filter(predicate).toList()
|
||||
}
|
||||
|
||||
@ -297,17 +297,17 @@ class MatterGraph : Abstract6Graph<MatterNode, MatterGraph>(), 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)
|
||||
}
|
||||
|
@ -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<IPatternStorage> { this }
|
||||
|
||||
override val patterns: Stream<out IPatternState>
|
||||
override val patterns: Stream<out PatternState>
|
||||
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 {
|
||||
|
@ -108,14 +108,14 @@ class PatternStorageItem : Item {
|
||||
return if (cap == MatteryCapability.PATTERN) resolver.cast() else LazyOptional.empty()
|
||||
}
|
||||
|
||||
override val patterns: Stream<out IPatternState> get() {
|
||||
override val patterns: Stream<out PatternState> get() {
|
||||
return stack.tag?.map("otm_patterns") { it: ListTag ->
|
||||
it.stream().map { PatternState.deserializeNBT(it) }.filter { it != null } as Stream<out IPatternState>
|
||||
it.stream().map { PatternState.deserializeNBT(it) }.filter { it != null } as Stream<out PatternState>
|
||||
} ?: 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))
|
||||
|
@ -49,7 +49,7 @@ class CancelTaskPacket(val id: UUID) : MatteryPacket {
|
||||
}
|
||||
}
|
||||
|
||||
class PatternsChangePacket(val isUpdate: Boolean, val patterns: Collection<IPatternState>) : MatteryPacket {
|
||||
class PatternsChangePacket(val isUpdate: Boolean, val patterns: Collection<PatternState>) : 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<IPatternState> { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) }
|
||||
private val actualComparator = Comparator<PatternState> { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) }
|
||||
private val actualTaskComparator = Comparator<IReplicationTask<*>> { o1, o2 -> sorting.comparator.compare(o1.item, o2.item) * (if (isAscending) 1 else -1) }
|
||||
|
||||
private val patterns = ArrayList<IPatternState>()
|
||||
private val patterns = ArrayList<PatternState>()
|
||||
private val tasks = ArrayList<IReplicationTask<*>>()
|
||||
|
||||
val patternsFiltered = ArrayList<IPatternState>()
|
||||
val patternsFiltered = ArrayList<PatternState>()
|
||||
val tasksFiltered = ArrayList<IReplicationTask<*>>()
|
||||
|
||||
fun networkPatternsUpdated(patterns: Collection<IPatternState>) {
|
||||
fun networkPatternsUpdated(patterns: Collection<PatternState>) {
|
||||
for (pattern in patterns) {
|
||||
val index = this.patterns.indexOfFirst(pattern::matchId)
|
||||
|
||||
@ -236,7 +236,7 @@ class MatterPanelMenu @JvmOverloads constructor(
|
||||
}
|
||||
}
|
||||
|
||||
fun networkPatternsRemoved(patterns: Collection<IPatternState>) {
|
||||
fun networkPatternsRemoved(patterns: Collection<PatternState>) {
|
||||
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)))
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user