From d80c1915f6127f273c03e69dfe3e0701c75ad8d1 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 19:31:56 +0700 Subject: [PATCH 01/39] Remove item handler cacher since it is useless --- .../mc/otm/container/MatteryContainer.kt | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) 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 83dbf75de..7396cabc4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt @@ -142,33 +142,31 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont return false } - protected var handler: MatteryContainerHandler? = null - fun handler( insert_validator: (slot: Int, stack: ItemStack) -> Boolean, extract_validator: (slot: Int, amount: Int, stack: ItemStack) -> Boolean ): MatteryContainerHandler { - return handler ?: MatteryContainerHandler(this, object : MatteryContainerFilter { + return MatteryContainerHandler(this, object : MatteryContainerFilter { override fun canInsert(slot: Int, stack: ItemStack) = insert_validator(slot, stack) override fun canExtract(slot: Int, amount: Int, stack: ItemStack) = extract_validator(slot, amount, stack) - }).also { handler = it } + }) } fun handler( filter: MatteryContainerFilter ): MatteryContainerHandler { - return handler ?: MatteryContainerHandler(this, filter).also { handler = it } + return MatteryContainerHandler(this, filter) } fun handler(insert_validator: (Int, ItemStack) -> Boolean): MatteryContainerHandler { - return handler ?: MatteryContainerHandler(this, object : MatteryContainerFilter { + return MatteryContainerHandler(this, object : MatteryContainerFilter { override fun canInsert(slot: Int, stack: ItemStack) = insert_validator(slot, stack) override fun canExtract(slot: Int, amount: Int, stack: ItemStack) = false - }).also { handler = it } + }) } fun handler(): MatteryContainerHandler { - return handler ?: MatteryContainerHandler(this).also { handler = it } + return MatteryContainerHandler(this) } open fun getMaxStackSize(slot: Int) = maxStackSize From 427fd43ea050d3c9df8f97096c2a27c1e3dbc92b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 19:32:24 +0700 Subject: [PATCH 02/39] CompoundTag.map and CompoundTag.ifCompound --- src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt index 4e8ea0863..e71a7cbed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt @@ -111,6 +111,26 @@ operator fun IItemHandler.get(index: Int): ItemStack = getStackInSlot(index) operator fun JsonObject.set(s: String, value: JsonElement) = add(s, value) +inline fun CompoundTag.map(s: String, consumer: (T) -> R): R? { + val tag = get(s) + + if (tag is T) { + return consumer(tag) + } + + return null +} + +inline fun CompoundTag.ifCompound(s: String, consumer: (CompoundTag) -> T): T? { + val tag = get(s) + + if (tag is CompoundTag) { + return consumer(tag) + } + + return null +} + inline fun CompoundTag.ifHas(s: String, consumer: (Tag) -> Unit) { val tag = get(s) From b35cb71a80a7e032df794bf76d4bddd6a04ae15b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 20:41:29 +0700 Subject: [PATCH 03/39] Redo mattery worker machine --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 2 +- .../blocks/MatteryBlockStateProvider.kt | 2 +- .../mc/otm/block/ChemicalGeneratorBlock.kt | 2 +- .../otm/block/GravitationStabilizerBlock.kt | 2 +- .../mc/otm/block/PlatePressBlock.kt | 2 +- .../entity/ChemicalGeneratorBlockEntity.kt | 1 - .../GravitationStabilizerBlockEntity.kt | 1 - .../block/entity/MatteryWorkerBlockEntity.kt | 341 ++++++++++++++++++ .../otm/block/entity/PlatePressBlockEntity.kt | 44 +-- .../mc/otm/block/entity/WorkerState.kt | 21 ++ .../entity/matter/MatterBottlerBlockEntity.kt | 2 +- .../matter/MatterDecomposerBlockEntity.kt | 90 +++-- .../matter/MatterRecyclerBlockEntity.kt | 60 ++- .../matter/MatterReplicatorBlockEntity.kt | 155 ++++---- .../entity/matter/MatterScannerBlockEntity.kt | 71 ++-- .../entity/storage/DriveViewerBlockEntity.kt | 2 +- .../entity/worker/MatteryWorkerBlockEntity.kt | 261 -------------- .../mc/otm/block/entity/worker/WorkerLogic.kt | 85 ----- .../mc/otm/block/matter/MatterBottlerBlock.kt | 2 +- .../otm/block/matter/MatterDecomposerBlock.kt | 2 +- .../otm/block/matter/MatterRecyclerBlock.kt | 2 +- .../otm/block/matter/MatterReplicatorBlock.kt | 2 +- .../mc/otm/block/matter/MatterScannerBlock.kt | 2 +- .../mc/otm/block/storage/DriveViewerBlock.kt | 2 +- .../GravitationStabilizerRenderer.kt | 2 +- .../mc/otm/core/ImpreciseFraction.kt | 6 + 26 files changed, 613 insertions(+), 551 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/WorkerState.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/MatteryWorkerBlockEntity.kt delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/WorkerLogic.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index e9002aed7..6e251e9bf 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -14,7 +14,7 @@ import net.minecraftforge.fml.common.Mod import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.block.* -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.matter.PatternStorageBlock import ru.dbotthepony.mc.otm.block.storage.DriveViewerBlock diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt index add36a39e..0d5458351 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt @@ -7,7 +7,7 @@ import net.minecraftforge.client.model.generators.BlockStateProvider import net.minecraftforge.client.model.generators.ConfiguredModel import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.getValueNullable import ru.dbotthepony.mc.otm.datagen.toXRotBlockstate diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/ChemicalGeneratorBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/ChemicalGeneratorBlock.kt index bcc9e7de2..79784fab9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/ChemicalGeneratorBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/ChemicalGeneratorBlock.kt @@ -15,7 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.block.entity.ChemicalGeneratorBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/GravitationStabilizerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/GravitationStabilizerBlock.kt index 1ab676aca..5e1766dee 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/GravitationStabilizerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/GravitationStabilizerBlock.kt @@ -25,7 +25,7 @@ import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.block.entity.GravitationStabilizerBlockEntity import ru.dbotthepony.mc.otm.block.entity.blackhole.BlackHoleBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.core.plus import ru.dbotthepony.mc.otm.core.times import ru.dbotthepony.mc.otm.registry.MBlockEntities diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/PlatePressBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/PlatePressBlock.kt index 31fedcad5..448956867 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/PlatePressBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/PlatePressBlock.kt @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.StateDefinition import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.entity.PlatePressBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt index aa1909a33..4c7c813eb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt @@ -19,7 +19,6 @@ import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.energy.IEnergyStorage import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt index bbeb3c1d6..ae924813c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt @@ -14,7 +14,6 @@ import ru.dbotthepony.mc.otm.block.BlockGravitationStabilizer import ru.dbotthepony.mc.otm.block.BlockGravitationStabilizerLens import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.blackhole.BlackHoleBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState import ru.dbotthepony.mc.otm.core.plus import ru.dbotthepony.mc.otm.core.times import ru.dbotthepony.mc.otm.registry.MBlockEntities diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt new file mode 100644 index 000000000..381ee6ed5 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt @@ -0,0 +1,341 @@ +package ru.dbotthepony.mc.otm.block.entity + +import net.minecraft.world.level.block.entity.BlockEntityType +import net.minecraft.core.BlockPos +import net.minecraft.world.level.block.state.BlockState +import net.minecraft.nbt.CompoundTag +import net.minecraft.world.item.ItemStack +import net.minecraft.world.level.block.Block +import ru.dbotthepony.mc.otm.core.* +import ru.dbotthepony.mc.otm.map +import ru.dbotthepony.mc.otm.set + +private fun isReason(status: Any?, reason: Any) = status == null || status == reason + +abstract class MatteryWorkerBlockEntity( + type: BlockEntityType<*>, + blockPos: BlockPos, + blockState: BlockState, + val jobDeserializer: (tag: CompoundTag) -> JobType +) : MatteryPoweredBlockEntity(type, blockPos, blockState) { + open class Job( + open val ticks: Double, + open val powerUsage: ImpreciseFraction = ImpreciseFraction.ZERO + ) { + constructor( + tag: CompoundTag + ) : this(tag.getDouble("ticks"), tag.getImpreciseFraction("power")) + + open fun serializeNBT(): CompoundTag { + return CompoundTag().also { + it["ticks"] = ticks + it["power"] = powerUsage + } + } + } + + @Suppress("LeakingThis") + open class ItemJob : Job { + open val itemStack: ItemStack + + constructor( + itemStack: ItemStack, + ticks: Double, + power: ImpreciseFraction = ImpreciseFraction.ZERO + ) : super(ticks, power) { + this.itemStack = itemStack + } + + constructor( + tag: CompoundTag + ) : super(tag) { + this.itemStack = (tag["item"] as? CompoundTag)?.let { ItemStack.of(it) } ?: ItemStack.EMPTY + } + + override fun serializeNBT(): CompoundTag { + return super.serializeNBT().also { + it["item"] = itemStack.serializeNBT() + } + } + } + + enum class IdleReason { + ITEM, + POWER, + MATTER, + + /** + * Observing external factor, such as waiting for matter/item network tasks + */ + OBSERVING + } + + data class Status(val success: Boolean, val throttleTicks: Int = 0, val idleReason: IdleReason? = null) { + companion object { + val SUCCESS = Status(true) + val FAILURE = Status(false) + val FAILURE_ITEM = Status(false, 20, IdleReason.ITEM) + val FAILURE_MATTER = Status(false, 20, IdleReason.MATTER) + val FAILURE_WAIT = Status(false, 100) + val FAILURE_WAIT_FAST = Status(false, 20) + } + } + + var workTicks = 0.0 + protected set + + var throttleTicks = 0 + protected set + + var currentJob: JobType? = null + protected set + + /** + * Can be whatever you want, but [IdleReason] certainly contains all cases + */ + var idleReason: Any? = null + private set + + var isIdling = false + protected set + + val isUnableToProcess: Boolean get() = throttleTicks > 0 + + val workProgress: Float + get() { + val currentJob = currentJob ?: return 0.0f + return (workTicks / currentJob.ticks).coerceAtMost(1.0).toFloat() + } + + override fun saveAdditional(nbt: CompoundTag) { + super.saveAdditional(nbt) + nbt["work_ticks"] = workTicks + currentJob?.let { nbt["job"] = it.serializeNBT() } + } + + override fun load(nbt: CompoundTag) { + super.load(nbt) + + workTicks = nbt.getDouble("work_ticks") + currentJob = nbt.map("job", jobDeserializer::invoke) + + if (currentJob == null) + workTicks = 0.0 + } + + override fun setChanged() { + super.setChanged() + isIdling = false + } + + override fun setChangedLight() { + super.setChangedLight() + isIdling = false + } + + protected fun powerLevelUpdated() { + super.setChangedLight() + + if (isReason(idleReason, IdleReason.POWER)) { + isIdling = false + throttleTicks = 0 + } + } + + protected fun itemContainerUpdated() { + super.setChanged() + + if (isReason(idleReason, IdleReason.ITEM)) { + isIdling = false + throttleTicks = 0 + } + } + + protected fun matterLevelUpdated() { + super.setChangedLight() + + if (isReason(idleReason, IdleReason.MATTER)) { + isIdling = false + throttleTicks = 0 + } + } + + /** + * Called whenever reaching desired amount of ticks at job + */ + protected abstract fun onJobFinish(job: JobType): Status + + /** + * [Pair.second] is reason why job can't be performed + * + * If not null, it is written to [idleReason] + */ + protected abstract fun computeNextJob(): Pair + + protected open fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { + return Status.SUCCESS + } + + private var idleTicksAnim = 0 + private var workingTicksAnim = 0 + private var errorTicksAnim = 0 + + override fun redstoneStatusUpdated(new_blocked: Boolean, old_blocked: Boolean) { + super.redstoneStatusUpdated(new_blocked, old_blocked) + isIdling = new_blocked + } + + protected fun workerLoop() { + if (errorTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.ERROR) { + level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.ERROR), Block.UPDATE_CLIENTS) + } + + if (throttleTicks > 0) { + workingTicksAnim = 0 + idleTicksAnim = 0 + throttleTicks-- + errorTicksAnim++ + + if (throttleTicks > 0) + return + } + + if (isIdling) { + workingTicksAnim = 0 + errorTicksAnim = 0 + idleTicksAnim++ + + if (idleTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue( + WorkerState.WORKER_STATE + ) != WorkerState.IDLE + ) { + level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) + } + + return + } + + var availableTicks = 1.0 + + while (!isIdling && weakGreaterThan(availableTicks, 0.0)) { + if (isBlockedByRedstone) { + isIdling = true + break + } + + var currentJob = currentJob + + if (currentJob == null) { + if (isBlockedByRedstone) { + isIdling = true + break + } + + val (job, reason) = computeNextJob() + + if (job == null) { + idleReason = reason + isIdling = reason != null + workingTicksAnim = 0 + break + } + + this.currentJob = job + currentJob = job + } + + if (!currentJob.powerUsage.isZero && energy.batteryLevel.isZero) { + idleReason = IdleReason.POWER + isIdling = true + idleTicksAnim++ + + if (idleTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue( + WorkerState.WORKER_STATE + ) != WorkerState.IDLE + ) { + level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) + } + + break + } + + idleTicksAnim = 0 + + if (weakLessThan(workTicks, currentJob.ticks)) { + val ticksLeft = currentJob.ticks - workTicks + val ticksAdvanced: Double + + var requiredPower: ImpreciseFraction? = null + var extractedPower: ImpreciseFraction? = null + + if (currentJob.powerUsage.isZero) { + ticksAdvanced = availableTicks.coerceAtMost(ticksLeft) + } else { + requiredPower = currentJob.powerUsage * ticksLeft.coerceAtMost(availableTicks) + extractedPower = energy.extractEnergyInner(requiredPower, true) + ticksAdvanced = (extractedPower / requiredPower).toDouble().coerceAtMost(ticksLeft).coerceAtMost(availableTicks) + } + + if (weakEqualDoubles(ticksAdvanced, 0.0)) { + break + } + + val status = onWorkTick(requiredPower ?: ImpreciseFraction.ZERO, extractedPower ?: ImpreciseFraction.ZERO, ticksAdvanced) + + if (!status.success) { + throttleTicks += status.throttleTicks + + if (status.idleReason != null) { + idleReason = status.idleReason + isIdling = true + } + + break + } + + workingTicksAnim++ + errorTicksAnim = 0 + + workTicks += ticksAdvanced + availableTicks -= ticksAdvanced + + if (extractedPower != null) { + energy.extractEnergyInner(extractedPower, false) + } + + continue + } + + val status = onJobFinish(currentJob) + + if (status.success) { + this.currentJob = null + workTicks = 0.0 + errorTicksAnim = 0 + } else { + throttleTicks += status.throttleTicks + + if (status.idleReason != null) { + idleReason = status.idleReason + isIdling = true + } + + errorTicksAnim++ + } + } + + if (workingTicksAnim > 20 && + errorTicksAnim == 0 && + blockState.hasProperty(WorkerState.WORKER_STATE) && + blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.WORKING + ) + { + level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS) + } + } + + fun basicTicker() { + batteryChargeLoop() + workerLoop() + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt index c02389e33..e2a6e0b3b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt @@ -10,12 +10,9 @@ import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent -import ru.dbotthepony.mc.otm.block.entity.worker.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJob -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJobStatus import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilter @@ -25,7 +22,10 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.set -class PlatePressBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.PLATE_PRESS, p_155229_, p_155230_) { +class PlatePressBlockEntity( + p_155229_: BlockPos, + p_155230_: BlockState +) : MatteryWorkerBlockEntity(MBlockEntities.PLATE_PRESS, p_155229_, p_155230_, ::ItemJob) { val container = MatteryContainer(this::setChangedLight, 2) override val energy = WorkerEnergyStorage(this::setChangedLight) @@ -50,7 +50,7 @@ class PlatePressBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matter } override fun getCapability(cap: Capability, side: Direction?): LazyOptional { - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) + if (cap == ForgeCapabilities.ITEM_HANDLER) return itemHandler.get().cast() return super.getCapability(cap, side) @@ -73,32 +73,24 @@ class PlatePressBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : Matter return PlatePressMenu(containerID, inventory, this) } - override fun onJobFinish(job: WorkerJob): WorkerJobStatus { - val resultTag = job.data["result"] as? CompoundTag ?: return WorkerJobStatus() - val result = ItemStack.of(resultTag) + override fun onJobFinish(job: ItemJob): Status { + if (job.itemStack.isEmpty) + return Status.SUCCESS - if (result.isEmpty) - return WorkerJobStatus() + if (!container.fullyAddItem(job.itemStack, start = SLOT_OUTPUT, end = SLOT_OUTPUT)) + return Status.FAILURE_ITEM - if (!container.fullyAddItem(result, start = SLOT_OUTPUT, end = SLOT_OUTPUT)) { - return WorkerJobStatus(false, 20) - } - - return WorkerJobStatus() + return Status.SUCCESS } - override fun computeNextJob(): WorkerJob? { - val level = level ?: return null - val recipe = level.recipeManager.getRecipeFor(MRecipes.PLATE_PRESS, container, level).orElse(null) ?: return null + override fun computeNextJob(): Pair { + if (energy.batteryLevel.isZero) { + return null to IdleReason.POWER + } - val copy = container[SLOT_INPUT].copy() + val recipe = level?.recipeManager?.getRecipeFor(MRecipes.PLATE_PRESS, container, level!!)?.orElse(null) ?: return null to IdleReason.ITEM container[SLOT_INPUT].shrink(1) - container.setChanged(SLOT_INPUT) - copy.count = 1 - - return WorkerJob(copy, recipe.workTime.toDouble(), BASELINE_CONSUMPTION, CompoundTag().also { - it["result"] = recipe.resultItem.serializeNBT() - }) + return ItemJob(recipe.resultItem, recipe.workTime.toDouble(), BASELINE_CONSUMPTION) to null } companion object { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/WorkerState.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/WorkerState.kt new file mode 100644 index 000000000..2c592bb86 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/WorkerState.kt @@ -0,0 +1,21 @@ +package ru.dbotthepony.mc.otm.block.entity + +import net.minecraft.util.StringRepresentable +import net.minecraft.world.level.block.state.properties.EnumProperty + +enum class WorkerState : StringRepresentable { + IDLE, + WORKING, + ERROR; + + companion object { + @JvmField + val WORKER_STATE: EnumProperty = EnumProperty.create("worker", WorkerState::class.java) + @JvmField + val SEMI_WORKER_STATE: EnumProperty = EnumProperty.create("worker", WorkerState::class.java, IDLE, WORKING) + } + + override fun getSerializedName(): String { + return if (this == IDLE) "idle" else if (this == WORKING) "working" else "error" + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt index 7d42b525a..bdfe096af 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt @@ -18,7 +18,7 @@ import net.minecraftforge.items.CapabilityItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index 1b97ca714..0c8400f15 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -12,20 +12,21 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import net.minecraftforge.items.IItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent -import ru.dbotthepony.mc.otm.block.entity.worker.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJob -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJobStatus +import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler import ru.dbotthepony.mc.otm.capability.matter.MatterDirection import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl import ru.dbotthepony.mc.otm.container.MatteryContainer +import ru.dbotthepony.mc.otm.container.MatteryContainerFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction +import ru.dbotthepony.mc.otm.core.getImpreciseFraction +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph @@ -93,7 +94,29 @@ fun moveMatterAsDustIntoContainer(_matterValue: ImpreciseFraction, container: Ma } class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) - : MatteryWorkerBlockEntity(MBlockEntities.MATTER_DECOMPOSER, pos, state), IMatterGraphNode { + : MatteryWorkerBlockEntity(MBlockEntities.MATTER_DECOMPOSER, pos, state, ::DecomposerJob), IMatterGraphNode { + + class DecomposerJob : Job { + val toDust: Boolean + var matterValue: ImpreciseFraction + + constructor(tag: CompoundTag) : super(tag) { + toDust = tag.getBoolean("to_dust") + matterValue = tag.getImpreciseFraction("value") + } + + constructor(toDust: Boolean, matterValue: ImpreciseFraction, ticks: Double) : super(ticks, BASE_CONSUMPTION) { + this.toDust = toDust + this.matterValue = matterValue + } + + override fun serializeNBT(): CompoundTag { + return super.serializeNBT().also { + it["to_dust"] = toDust + it["value"] = matterValue + } + } + } override val energy = WorkerEnergyStorage(this, ENERGY_STORAGE, MAX_IO) private var valid = true @@ -110,13 +133,18 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) private var resolverNode = LazyOptional.of { this } // вход, выход - @JvmField val container = MatteryContainer(this::setChangedLight, 3) private val itemHandler = LazyOptional.of { - container.handler( - { slot: Int, stack: ItemStack -> slot == INPUT_SLOT && canDecompose(stack) }, - { slot: Int, _: Int, _: ItemStack -> slot != INPUT_SLOT }) + container.handler(object : MatteryContainerFilter { + override fun canInsert(slot: Int, stack: ItemStack): Boolean { + return slot == INPUT_SLOT && canDecompose(stack) + } + + override fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean { + return slot != INPUT_SLOT + } + }) } override val defaultDisplayName: Component @@ -156,39 +184,35 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) override fun getCapability(cap: Capability, side: Direction?): LazyOptional { if (valid) { - if (cap === MatteryCapability.MATTER) return resolverMatter.cast() - if (cap === MatteryCapability.MATTER_NODE) return resolverNode.cast() - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return itemHandler.cast() + if (cap == MatteryCapability.MATTER) return resolverMatter.cast() + if (cap == MatteryCapability.MATTER_NODE) return resolverNode.cast() + if (cap == ForgeCapabilities.ITEM_HANDLER) return itemHandler.cast() } return super.getCapability(cap, side) } - override fun onJobFinish(job: WorkerJob): WorkerJobStatus { - var matterValue = ImpreciseFraction.deserializeNBT(job.data["value"]) + override fun onJobFinish(job: DecomposerJob): Status { + if (job.toDust) { + job.matterValue = moveMatterAsDustIntoContainer(job.matterValue, container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING) - if (job.data.getBoolean("to_dust")) { - matterValue = moveMatterAsDustIntoContainer(matterValue, container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING) - - if (!matterValue.isZero) { - job.data["value"] = matterValue.serializeNBT() - return WorkerJobStatus(20) + if (!job.matterValue.isZero) { + return Status.FAILURE_WAIT_FAST } - return WorkerJobStatus() + return Status.SUCCESS } - matterValue -= matter.receiveMatterInner(matterValue, false) + job.matterValue -= matter.receiveMatterInner(job.matterValue, false) - if (matterValue.isPositive) { - job.data["value"] = matterValue.serializeNBT() - return WorkerJobStatus(false, 20) + if (job.matterValue.isPositive) { + return Status.FAILURE_MATTER } - return WorkerJobStatus() + return Status.SUCCESS } - override fun computeNextJob(): WorkerJob? { + override fun computeNextJob(): Pair { val stack = container[INPUT_SLOT] if (!stack.isEmpty) { @@ -197,19 +221,13 @@ class MatterDecomposerBlockEntity(pos: BlockPos, state: BlockState) if (canDecompose(copy)) { val matter = getMatterValue(copy) + stack.count-- - if (!matter.isZero) { - stack.count-- - - return WorkerJob(copy, matter.complexity * baselineComplexityDecomposeTicks, BASE_CONSUMPTION, CompoundTag().also { - it["to_dust"] = (level?.random?.nextDouble() ?: 1.0) <= 0.2 - it["value"] = matter.value.serializeNBT() - }) - } + return DecomposerJob((level?.random?.nextDouble() ?: 1.0) <= 0.2, matter.value, matter.complexity * baselineComplexityDecomposeTicks) to null } } - return null + return null to IdleReason.ITEM } override fun setRemoved() { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index 13c847970..e29f1a301 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -12,13 +12,10 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent -import ru.dbotthepony.mc.otm.block.entity.worker.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJob -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJobStatus -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerTickContext +import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler @@ -30,26 +27,26 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.ifHas import ru.dbotthepony.mc.otm.item.MatterDustItem +import ru.dbotthepony.mc.otm.map import ru.dbotthepony.mc.otm.menu.MatterRecyclerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.set class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) - : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState), IMatterGraphNode { + : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode { val matter = MatterHandlerImpl( - this::setChangedLight, + this::matterLevelUpdated, MatterDirection.EXTRACT, STORAGE ) - val container = MatteryContainer(this::setChangedLight, 1) + val container = MatteryContainer(this::itemContainerUpdated, 1) override val matterNode = Graph6Node(this) private var resolverNode = LazyOptional.of { this } private var valid = true - override val energy = WorkerEnergyStorage(this, MAX_POWER) + override val energy = WorkerEnergyStorage(this::powerLevelUpdated, MAX_POWER) override fun getMatterHandler(): IMatterHandler { return matter @@ -99,7 +96,7 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) override fun load(nbt: CompoundTag) { super.load(nbt) - nbt.ifHas("matter", CompoundTag::class.java, matter::deserializeNBT) + nbt.map("matter", matter::deserializeNBT) container.deserializeNBT(nbt["container"]) } @@ -107,15 +104,12 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) if (!valid) return super.getCapability(cap, side) - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) { - return itemHandler.get().cast() - } else if (cap === MatteryCapability.MATTER) { - return matter.get().cast() - } else if (cap === MatteryCapability.MATTER_NODE) { - return resolverNode.cast() + return when (cap) { + ForgeCapabilities.ITEM_HANDLER -> itemHandler.get().cast() + MatteryCapability.MATTER -> matter.get().cast() + MatteryCapability.MATTER_NODE -> resolverNode.cast() + else -> super.getCapability(cap, side) } - - return super.getCapability(cap, side) } override val defaultDisplayName: Component @@ -125,41 +119,39 @@ class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) return MatterRecyclerMenu(containerID, inventory, this) } - override fun onJobFinish(job: WorkerJob): WorkerJobStatus { + override fun onJobFinish(job: Job): Status { // вся логика в onWorkTick - return WorkerJobStatus() + return Status.SUCCESS } - override fun computeNextJob(): WorkerJob? { + override fun computeNextJob(): Pair { if (matter.missingMatter.isZero) - return null + return null to IdleReason.ITEM val stack = container[0] if (stack.isEmpty || stack.item !is MatterDustItem) { - return null + return null to IdleReason.ITEM } - val copy = stack.copy() - copy.count = 1 - - val dustMatter = (stack.item as MatterDustItem).getMatterValue(copy) ?: return null + val dustMatter = (stack.item as MatterDustItem).getMatterValue(stack.copy().also { it.count = 1 }) ?: return null to IdleReason.ITEM stack.shrink(1) - return WorkerJob(copy, dustMatter.value.toDouble() * MATTER_TICKS, POWER_CONSUMPTION) + container.setChanged(0) + return Job(dustMatter.value.toDouble() * MATTER_TICKS, POWER_CONSUMPTION) to null } - override fun onWorkTick(context: WorkerTickContext): WorkerJobStatus { + override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { if ((level?.random?.nextDouble() ?: 1.0) <= 0.4) - return WorkerJobStatus() + return Status.SUCCESS - val receive = if (context.ticksAdvanced == 1.0) MATTER_PER_TICK else MATTER_PER_TICK * context.ticksAdvanced + val receive = MATTER_PER_TICK * ticksAdvanced val received = matter.receiveMatterInner(receive, true) if (receive != received) - return WorkerJobStatus(false, 20) + return Status.FAILURE_MATTER matter.receiveMatterInner(receive, false) - return WorkerJobStatus() + return Status.SUCCESS } fun tick() { 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 bdcdc5286..c7eec86c1 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 @@ -8,26 +8,25 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player 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.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent -import ru.dbotthepony.mc.otm.block.entity.worker.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJob -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJobStatus -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerTickContext +import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilterOnlyOut import ru.dbotthepony.mc.otm.core.ImpreciseFraction +import ru.dbotthepony.mc.otm.core.getImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.map import ru.dbotthepony.mc.otm.matter.baselineComplexityReplicateTicks import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu @@ -35,22 +34,51 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.set class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : - MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_), IMatterGraphNode { + MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_, ::ReplicatorJob), IMatterGraphNode { - override val energy = WorkerEnergyStorage(this, STORAGE, MAX_IO) + class ReplicatorJob : ItemJob { + val matterPerTick: ImpreciseFraction + val task: MatterTask + var matterValue: ImpreciseFraction + val pattern: PatternState? + val asDust: Boolean + + constructor(tag: CompoundTag) : super(tag) { + matterPerTick = tag.getImpreciseFraction("matter_per_tick") + matterValue = tag.getImpreciseFraction("value") + pattern = tag.map("pattern", PatternState::deserializeNBT) + asDust = tag.getBoolean("as_dust") + task = tag.map("task", MatterTask::deserializeNBT) ?: throw NullPointerException("Unable to deserialize matter task") + } + + constructor( + itemStack: ItemStack, + matterPerTick: ImpreciseFraction, + task: MatterTask, + matterValue: ImpreciseFraction, + pattern: PatternState?, + asDust: Boolean, + ticks: Double, + ) : super(itemStack, ticks, BASE_CONSUMPTION) { + this.matterPerTick = matterPerTick + this.task = task + this.matterValue = matterValue + this.pattern = pattern + this.asDust = asDust + } + } + + override val energy = WorkerEnergyStorage(this::powerLevelUpdated, STORAGE, MAX_IO) override val matterNode = Graph6Node(this) private val resolverNode = LazyOptional.of { this } - @JvmField val matter = MatterHandlerImpl( - this::setChangedLight, + this::matterLevelUpdated, MatterDirection.RECEIVE, ImpreciseFraction(2) ) - // обычные запросы - @JvmField - val container = MatteryContainer(this::setChangedLight, 5) + val container = MatteryContainer(this::itemContainerUpdated, 5) private val itemHandler = container.handler(MatteryContainerFilterOnlyOut) override val defaultDisplayName: Component @@ -60,38 +88,42 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : return MatterReplicatorMenu(containerID, inventory, this) } - override fun onJobFinish(job: WorkerJob): WorkerJobStatus { - if (job.data.getBoolean("as_dust")) { - val matterValue = moveMatterAsDustIntoContainer(ImpreciseFraction.deserializeNBT(job["matter"]), container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING) + override fun onJobFinish(job: ReplicatorJob): Status { + if (job.asDust) { + job.matterValue = moveMatterAsDustIntoContainer(job.matterValue, container, OUTPUT_DUST_MAIN, OUTPUT_DUST_STACKING) - if (!matterValue.isZero) { - job["matter"] = matterValue.serializeNBT() - return WorkerJobStatus(false, 20) + if (!job.matterValue.isZero) { + return Status.FAILURE_WAIT } - (matterNode.graph as MatterNetworkGraph?)?.notifyTaskCompletion(MatterTask.deserializeNBT(job["task"])!!) - - return WorkerJobStatus() + (matterNode.graph as MatterNetworkGraph?)?.notifyTaskCompletion(job.task) + return Status.SUCCESS } - if (!container.fullyAddItem(job.stack, FIRST_ACTUAL_OUTPUT_SLOT .. LAST_ACTUAL_OUTPUT_SLOT)) { - return WorkerJobStatus(false, 20) + if (!container.fullyAddItem(job.itemStack, FIRST_ACTUAL_OUTPUT_SLOT .. LAST_ACTUAL_OUTPUT_SLOT)) { + return Status.FAILURE_ITEM } - (matterNode.graph as MatterNetworkGraph?)?.notifyTaskCompletion(MatterTask.deserializeNBT(job["task"])!!) - return WorkerJobStatus() + (matterNode.graph as MatterNetworkGraph?)?.notifyTaskCompletion(job.task) + return Status.SUCCESS } override fun onMatterTaskCreated(task: MatterTask) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } override fun onMatterTaskUpdated(new_state: MatterTask, old_state: MatterTask) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } override fun onPatternAdded(state: PatternState) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } override fun setRemoved() { @@ -106,33 +138,31 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatterNetworkGraph.discoverFull(this, matterNode) } - override fun computeNextJob(): WorkerJob? { - val graph = matterNode.graph as MatterNetworkGraph? ?: return null - val allocation = graph.allocateTask(false) ?: return null + override fun computeNextJob(): Pair { + val graph = matterNode.graph as MatterNetworkGraph? ?: return null to null + val allocation = graph.allocateTask(simulate = false) ?: return null to IdleReason.OBSERVING val stack = allocation.task.stack(1) val matter = getMatterValue(stack) // ???????? - if (matter.isZero) return null + if (matter.isZero) return null to null val ticks = matter.complexity * baselineComplexityReplicateTicks - return WorkerJob(stack, ticks, BASE_CONSUMPTION, CompoundTag().also { - it["matter_per_tick"] = (matter.value / ticks).serializeNBT() - it["task"] = allocation.task.serializeNBT() - it["matter"] = matter.value.serializeNBT() - - if (allocation.pattern != null) - it["pattern"] = allocation.pattern.serializeNBT() - - if ((level?.random?.nextDouble() ?: 1.0) > (allocation.pattern?.research ?: 2.0)) - it["as_dust"] = true - }) + return ReplicatorJob( + itemStack = stack, + matterPerTick = matter.value / ticks, + task = allocation.task, + matterValue = matter.value, + pattern = allocation.pattern, + asDust = (level?.random?.nextDouble() ?: 1.0) > (allocation.pattern?.research ?: 2.0), + ticks = ticks, + ) to null } - override fun onWorkTick(context: WorkerTickContext): WorkerJobStatus { - val drainPerTick = ImpreciseFraction.deserializeNBT(context.job.data["matter_per_tick"]) - val graph = matterNode.graph as MatterNetworkGraph? ?: return WorkerJobStatus(false, 20) + override fun onWorkTick(requiredPower: ImpreciseFraction, extractedPower: ImpreciseFraction, ticksAdvanced: Double): Status { + val drainPerTick = currentJob!!.matterPerTick * ticksAdvanced + val graph = matterNode.graph as MatterNetworkGraph? ?: return Status.FAILURE_WAIT_FAST if (matter.extractMatterInner(drainPerTick, true) < drainPerTick) { // в машине недостаточно материи @@ -142,44 +172,42 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : val toExtract = drainPerTick - matter.extractMatterInner(drainPerTick, true) val drain = graph.extractMatter(toExtract, true) - if (drain < toExtract) { + if (drain != toExtract) { // недостаточно материи в сети - return WorkerJobStatus(false, 200) + return Status.FAILURE_MATTER } // достаточно материи в сети + внутри машины matter.extractMatterInner(drainPerTick, false) graph.extractMatter(drain, false) - return WorkerJobStatus() + return Status.SUCCESS } else { // в тик требуется меньше материи, чем её может хранить репликатор // примем из сети недостающее количество бака материи, или 200 тиков репликации, что меньше - val toExtract = - matter.missingMatter.coerceAtMost(drainPerTick.times(DRAIN_MULT)) - - val drain = graph.extractMatter(toExtract, true) + val drain = graph.extractMatter(matter.missingMatter.coerceAtMost(drainPerTick * DRAIN_MULT), true) if (drain.isZero) { // в сети нет материи - return WorkerJobStatus(false, 200) + return Status.FAILURE_MATTER } val received = matter.receiveMatterOuter(drain, false) graph.extractMatter(received, false) // получили материю, проверяем возможность работы - if (matter.extractMatterInner(drainPerTick, false) >= drainPerTick) { - return WorkerJobStatus() + if (matter.extractMatterInner(drainPerTick, true) >= drainPerTick) { + matter.extractMatterInner(drainPerTick, false) + return Status.SUCCESS } else { // :( - return WorkerJobStatus(false, 200) + return Status.FAILURE_WAIT } } } // в машине достаточно материи matter.extractMatterInner(drainPerTick, false) - return WorkerJobStatus() + return Status.SUCCESS } override fun saveAdditional(nbt: CompoundTag) { @@ -191,10 +219,7 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun load(nbt: CompoundTag) { super.load(nbt) container.deserializeNBT(nbt["container"]) - - nbt.ifHas("matter", CompoundTag::class.java) { - matter.deserializeNBT(it) - } + nbt.map("matter", matter::deserializeNBT) } private var valid = true @@ -213,8 +238,8 @@ class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun getCapability(cap: Capability, side: Direction?): LazyOptional { if (valid) { - if (cap === MatteryCapability.MATTER_NODE) return resolverNode.cast() - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return itemHandler.get().cast() + if (cap == MatteryCapability.MATTER_NODE) return resolverNode.cast() + if (cap == ForgeCapabilities.ITEM_HANDLER) return itemHandler.get().cast() } return super.getCapability(cap, side) 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 020e67d48..6ef44800b 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 @@ -12,16 +12,16 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.CapabilityItemHandler import ru.dbotthepony.mc.otm.TranslatableComponent -import ru.dbotthepony.mc.otm.block.entity.worker.MatteryWorkerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJob -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerJobStatus +import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.PatternState import ru.dbotthepony.mc.otm.container.MatteryContainer +import ru.dbotthepony.mc.otm.container.MatteryContainerFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode @@ -32,26 +32,38 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities import java.util.* class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : - MatteryWorkerBlockEntity(MBlockEntities.MATTER_SCANNER, p_155229_, p_155230_), IMatterGraphNode { + MatteryWorkerBlockEntity(MBlockEntities.MATTER_SCANNER, p_155229_, p_155230_, ::ItemJob), IMatterGraphNode { - val container = MatteryContainer(this::setChanged, 1) - override val energy = WorkerEnergyStorage(this, STORAGE, MAX_IO) - private val itemHandler = container.handler( - { _: Int, stack: ItemStack -> canDecompose(stack) }, - { _: Int, _: Int, _: ItemStack -> isIdling } - ) + val container = MatteryContainer(this::itemContainerUpdated, 1) + override val energy = WorkerEnergyStorage(this::powerLevelUpdated, STORAGE, MAX_IO) + + private val itemHandler = container.handler(object : MatteryContainerFilter { + override fun canInsert(slot: Int, stack: ItemStack): Boolean { + return canDecompose(stack) + } + + override fun canExtract(slot: Int, amount: Int, stack: ItemStack): Boolean { + return isIdling + } + }) // IMatterGraphNode override fun onPatternAdded(state: PatternState) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } override fun onPatternRemoved(state: PatternState) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } override fun onPatternUpdated(new_state: PatternState, old_state: PatternState) { - isIdling = false + if (idleReason == IdleReason.OBSERVING) { + isIdling = false + } } // /IMatterGraphNode @@ -61,7 +73,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun getCapability(cap: Capability, side: Direction?): LazyOptional { if (valid) { - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return itemHandler.get().cast() + if (cap == ForgeCapabilities.ITEM_HANDLER) return itemHandler.get().cast() if (cap == MatteryCapability.MATTER_NODE) return resolverNode.cast() } @@ -105,11 +117,11 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : super.load(nbt) } - override fun onJobFinish(job: WorkerJob): WorkerJobStatus { - val grid = matterNode.graph as MatterNetworkGraph? ?: return WorkerJobStatus(false, 100) + override fun onJobFinish(job: ItemJob): Status { + val grid = matterNode.graph as MatterNetworkGraph? ?: return Status.FAILURE_WAIT - val stack = job.stack - if (stack.isEmpty || !hasMatterValue(stack)) return WorkerJobStatus() + val stack = job.itemStack + if (stack.isEmpty || !hasMatterValue(stack)) return Status.SUCCESS val getState = grid.findPatterns(stack.item) var findState: PatternState? = null @@ -132,17 +144,21 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } if (!grid.insertPattern(new, onlyUpdate = false, simulate = false).isFailed) { - return WorkerJobStatus() + return Status.SUCCESS } else { - return WorkerJobStatus(false, 200) + return Status.FAILURE_WAIT } } - override fun computeNextJob(): WorkerJob? { - val grid = matterNode.graph as MatterNetworkGraph? ?: return null + override fun computeNextJob(): Pair { + if (energy.batteryLevel.isZero) { + return null to IdleReason.POWER + } + + val grid = matterNode.graph as MatterNetworkGraph? ?: return null to null val stack = container.getItem(0) - if (stack.isEmpty || !canDecompose(stack)) return null + if (stack.isEmpty || !canDecompose(stack)) return null to IdleReason.ITEM val getState = grid.findPatterns(stack.item) var findState: PatternState? = null @@ -151,7 +167,7 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : if (state.item === stack.item && state.research < 1.0) { findState = state } else if (state.item === stack.item && state.research >= 1.0) { - return null + return null to IdleReason.OBSERVING } } @@ -163,14 +179,13 @@ class MatterScannerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } if (!grid.insertPattern(new, onlyUpdate = false, simulate = true).isFailed) { - val copy = stack.copy() - copy.count = 1 + val copy = stack.copy().also { it.count = 1 } stack.shrink(1) container.setChanged() - return WorkerJob(copy, getMatterValue(copy).complexity * baselineComplexityScanTicks, BASE_CONSUMPTION) + return ItemJob(copy, getMatterValue(copy).complexity * baselineComplexityScanTicks, BASE_CONSUMPTION) to null } - return null + return null to IdleReason.ITEM } override fun setLevel(p_155231_: Level) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt index eb83c3295..a1075a2e6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt @@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.storage.DriveViewerBlock -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/MatteryWorkerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/MatteryWorkerBlockEntity.kt deleted file mode 100644 index bb3991c28..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/MatteryWorkerBlockEntity.kt +++ /dev/null @@ -1,261 +0,0 @@ -package ru.dbotthepony.mc.otm.block.entity.worker - -import net.minecraft.world.level.block.entity.BlockEntityType -import net.minecraft.core.BlockPos -import net.minecraft.world.level.block.state.BlockState -import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.DoubleTag -import net.minecraft.world.level.block.Block -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.weakGreaterOrEqual -import ru.dbotthepony.mc.otm.core.weakLessThan -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set - -abstract class MatteryWorkerBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : - MatteryPoweredBlockEntity(p_155228_, p_155229_, p_155230_) { - var workTicks = 0.0 - protected set - - var throttleTicks = 0 - protected set - - var currentJob: WorkerJob? = null - protected set - - // если isIdling То ничего не делать - // isIdling должна быть выставлена в true если что то изменилось, что могло создать работу - var isIdling = false - protected set - - val isUnableToProcess: Boolean get() = throttleTicks > 0 - - val workProgress: Float - get() { - val currentJob = currentJob ?: return 0.0f - return (workTicks / currentJob.ticks).coerceAtMost(1.0).toFloat() - } - - override fun saveAdditional(nbt: CompoundTag) { - super.saveAdditional(nbt) - nbt["work_ticks"] = workTicks - currentJob?.let { nbt["current_job"] = it.serializeNBT() } - } - - override fun load(nbt: CompoundTag) { - super.load(nbt) - - nbt.ifHas("work_ticks", DoubleTag::class.java) { - workTicks = it.asDouble - } - - currentJob = WorkerJob.deserializeNBT(nbt["current_job"]) - - if (currentJob == null) - workTicks = 0.0 - } - - override fun setChanged() { - super.setChanged() - isIdling = false - } - - override fun setChangedLight() { - super.setChangedLight() - isIdling = false - } - - /** - * @param job current job - * @return whenever machine can finish it's job. return false if machine for whatever reason can't finish it's job, - * waiting on conditions to be met - */ - protected abstract fun onJobFinish(job: WorkerJob): WorkerJobStatus - - /** - * @param context context for current job - * @return whenever machine can perform it - */ - protected open fun onWorkTick(context: WorkerTickContext): WorkerJobStatus { - return WorkerJobStatus() - } - - private var idleTicksAnim = 0 - private var workingTicksAnim = 0 - private var errorTicksAnim = 0 - - override fun redstoneStatusUpdated(new_blocked: Boolean, old_blocked: Boolean) { - super.redstoneStatusUpdated(new_blocked, old_blocked) - isIdling = new_blocked - } - - protected fun workerLoop() { - if (errorTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.ERROR) { - level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.ERROR), Block.UPDATE_CLIENTS) - } - - if (throttleTicks > 0) { - workingTicksAnim = 0 - idleTicksAnim = 0 - throttleTicks-- - errorTicksAnim++ - - if (throttleTicks > 0) - return - } - - if (isIdling) { - workingTicksAnim = 0 - errorTicksAnim = 0 - idleTicksAnim++ - - if (idleTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.IDLE) { - level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) - } - - return - } - - var currentJob = currentJob - - if (currentJob == null) { - if (isBlockedByRedstone) { - isIdling = true - return - } - - val input = computeNextJob() - - if (input == null) { - isIdling = true - workingTicksAnim = 0 - return - } - - this.currentJob = input - currentJob = input - } - - if (isBlockedByRedstone) { - isIdling = true - return - } - - if (!currentJob.power.isZero && energy.batteryLevel.isZero) { - idleTicksAnim++ - - if (idleTicksAnim > 20 && blockState.hasProperty(WorkerState.WORKER_STATE) && blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.IDLE) { - level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS) - } - - return - } - - idleTicksAnim = 0 - - if (weakLessThan(workTicks, currentJob.ticks)) { - if (!currentJob.power.isZero) { - // сколько осталось тиков работать - val ticksLeft = currentJob.ticks - workTicks - val requiredPower: ImpreciseFraction - - // запрос энергии на то количество, сколько действительно осталось работать - if (ticksLeft > 1.0) { - requiredPower = currentJob.power - } else { - requiredPower = currentJob.power * ticksLeft - } - - val extractedPower = if (requiredPower.isZero) ImpreciseFraction.ZERO else energy.extractEnergyInner(requiredPower, true) - - // сколько тиков мы "проработали" - // может быть меньше, чем единица, если недостаточно питания или мы завершаем работу, - // для которой осталось дробное количество тиков - val ticksAdvanced = (extractedPower / requiredPower).toDouble().coerceAtMost(ticksLeft) - val ticksAdvancedWeak = if (requiredPower.isZero) 1.0 else ticksAdvanced - val status = onWorkTick(WorkerTickContext(currentJob, requiredPower, extractedPower, ticksAdvanced)) - - if (!status.valid) { - throttleTicks += status.throttle - return - } - - workingTicksAnim++ - errorTicksAnim = 0 - - val updatedWorkTicks = (workTicks + ticksAdvancedWeak).coerceAtMost(currentJob.ticks) - - if (weakGreaterOrEqual(updatedWorkTicks, currentJob.ticks)) { - workTicks = currentJob.ticks - energy.extractEnergyInner(extractedPower * (1.0 - (updatedWorkTicks - currentJob.ticks)), false) - - val finish = onJobFinish(currentJob) - - if (finish.valid) { - this.currentJob = null - workTicks = 0.0 - } else { - throttleTicks += finish.throttle - } - } else { - workTicks = updatedWorkTicks - energy.extractEnergyInner(extractedPower, false) - } - } else { - val ticksLeft = (currentJob.ticks - workTicks).coerceAtMost(1.0) - val status = onWorkTick(WorkerTickContext(currentJob, ImpreciseFraction.ZERO, ImpreciseFraction.ZERO, ticksLeft)) - - if (!status.valid) { - throttleTicks += status.throttle - return - } - - workingTicksAnim++ - errorTicksAnim = 0 - workTicks = (workTicks + 1.0).coerceAtMost(currentJob.ticks) - - if (weakGreaterOrEqual(workTicks, currentJob.ticks)) { - val finish = onJobFinish(currentJob) - - if (finish.valid) { - this.currentJob = null - workTicks = 0.0 - } else { - throttleTicks += finish.throttle - } - } - } - } else { - val finish = onJobFinish(currentJob) - - if (finish.valid) { - this.currentJob = null - workTicks = 0.0 - errorTicksAnim = 0 - } else { - throttleTicks += finish.throttle - errorTicksAnim++ - } - } - - if (workingTicksAnim > 20 && - errorTicksAnim == 0 && - blockState.hasProperty(WorkerState.WORKER_STATE) && - blockState.getValue(WorkerState.WORKER_STATE) != WorkerState.WORKING) - { - level?.setBlock(blockPos, blockState.setValue(WorkerState.WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS) - } - } - - /** - * Determine which item can be processed from input slots if idling - * @return any item in input slots. null if no work is available - */ - protected abstract fun computeNextJob(): WorkerJob? - - fun basicTicker() { - batteryChargeLoop() - workerLoop() - } -} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/WorkerLogic.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/WorkerLogic.kt deleted file mode 100644 index 87c73438d..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/WorkerLogic.kt +++ /dev/null @@ -1,85 +0,0 @@ -package ru.dbotthepony.mc.otm.block.entity.worker - -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.DoubleTag -import net.minecraft.nbt.Tag -import net.minecraft.util.StringRepresentable -import net.minecraft.world.item.ItemStack -import net.minecraft.world.level.block.state.properties.EnumProperty -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.set - -@JvmRecord -data class WorkerTickContext( - val job: WorkerJob, - val requiredPower: ImpreciseFraction, - val extractedPower: ImpreciseFraction, - val ticksAdvanced: Double -) - -enum class WorkerState : StringRepresentable { - IDLE, - WORKING, - ERROR; - - companion object { - @JvmField - val WORKER_STATE: EnumProperty = EnumProperty.create("worker", WorkerState::class.java) - @JvmField - val SEMI_WORKER_STATE: EnumProperty = EnumProperty.create("worker", WorkerState::class.java, IDLE, WORKING) - } - - override fun getSerializedName(): String { - return if (this == IDLE) "idle" else if (this == WORKING) "working" else "error" - } -} - -@JvmRecord -data class WorkerJobStatus @JvmOverloads constructor(val valid: Boolean = true, val throttle: Int = 0) { - constructor(throttle: Int) : this(false, throttle) -} - -@JvmRecord -data class WorkerJob @JvmOverloads constructor( - val stack: ItemStack, - val ticks: Double, - val power: ImpreciseFraction = ImpreciseFraction.ZERO, - val data: CompoundTag = CompoundTag()) { - - fun serializeNBT(): CompoundTag { - return CompoundTag().also { - it["stack"] = stack.serializeNBT() - it["ticks"] = ticks - it["power"] = power.serializeNBT() - it["data"] = data - } - } - - operator fun get(index: String) = data[index] - operator fun set(index: String, value: Tag) { data[index] = value } - operator fun set(index: String, value: Int) { data[index] = value } - operator fun set(index: String, value: Byte) { data[index] = value } - operator fun set(index: String, value: Short) { data[index] = value } - operator fun set(index: String, value: Long) { data[index] = value } - operator fun set(index: String, value: Float) { data[index] = value } - operator fun set(index: String, value: Double) { data[index] = value } - operator fun set(index: String, value: String) { data[index] = value } - operator fun set(index: String, value: Boolean) { data[index] = value } - operator fun set(index: String, value: ByteArray) { data[index] = value } - operator fun set(index: String, value: IntArray) { data[index] = value } - operator fun set(index: String, value: LongArray) { data[index] = value } - - companion object { - @JvmStatic - fun deserializeNBT(tag: Tag?): WorkerJob? { - val nbt = tag as? CompoundTag ?: return null - - return WorkerJob( - ItemStack.of(nbt["stack"] as? CompoundTag ?: return null), - (nbt["ticks"] as? DoubleTag ?: return null).asDouble, - ImpreciseFraction.deserializeNBT(nbt["power"]), - nbt["data"] as? CompoundTag ?: return null - ) - } - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterBottlerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterBottlerBlock.kt index 3ce941a6b..e6542499d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterBottlerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterBottlerBlock.kt @@ -19,7 +19,7 @@ import net.minecraft.world.level.block.state.properties.BooleanProperty import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterDecomposerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterDecomposerBlock.kt index 992109b78..faf3065c4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterDecomposerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterDecomposerBlock.kt @@ -17,7 +17,7 @@ import net.minecraft.world.level.block.Block import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterRecyclerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterRecyclerBlock.kt index 276657139..d8c99395a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterRecyclerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterRecyclerBlock.kt @@ -15,7 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.matter.MatterRecyclerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterReplicatorBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterReplicatorBlock.kt index 9d3fed1d3..1d15fbbc6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterReplicatorBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterReplicatorBlock.kt @@ -15,7 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.matter.MatterReplicatorBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterScannerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterScannerBlock.kt index f58763a77..51b3a72c3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterScannerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/matter/MatterScannerBlock.kt @@ -15,7 +15,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.matter.MatterScannerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt index a3a815d1c..f0776f5b8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/DriveViewerBlock.kt @@ -17,7 +17,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.storage.DriveViewerBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt index ab12d926a..f4f2e2429 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt @@ -15,7 +15,7 @@ import ru.dbotthepony.mc.otm.block.BlackHoleBlock import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.GravitationStabilizerBlockEntity import ru.dbotthepony.mc.otm.block.entity.blackhole.BlackHoleBlockEntity -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.block.entity.WorkerState import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.core.* import kotlin.math.PI diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt index fe3c159c2..b045dde31 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.core import net.minecraft.nbt.ByteArrayTag +import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.StringTag import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf @@ -660,3 +661,8 @@ fun OutputStream.writeImpreciseFraction(value: ImpreciseFraction) { write(bytes) writeDouble(value.decimal) } + +fun CompoundTag.getImpreciseFraction(key: String) = ImpreciseFraction.deserializeNBT(this[key]) +fun CompoundTag.putImpreciseFraction(key: String, value: ImpreciseFraction) = put(key, value.serializeNBT()) + +operator fun CompoundTag.set(key: String, value: ImpreciseFraction) = putImpreciseFraction(key, value) From f902d466b3b56bee0857f49d53e1d81b3b2f185a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 20:56:33 +0700 Subject: [PATCH 04/39] Move extension functions around --- .../ru/dbotthepony/mc/otm/datagen/DataGen.kt | 2 +- .../blocks/MatteryBlockStateProvider.kt | 2 +- .../datagen/items/MatteryItemModelProvider.kt | 2 +- .../otm/datagen/models/MatteryModelBuilder.kt | 2 +- .../datagen/models/MatteryModelProvider.kt | 2 +- .../datagen/recipes/CraftingTableRecipes.kt | 4 +- .../mc/otm/datagen/recipes/MatteryRecipe.kt | 2 +- .../recipes/PlatePressFinishedRecipe.kt | 2 +- .../mc/otm/capability/matter/MatterTask.java | 3 +- .../otm/capability/matter/PatternState.java | 3 +- .../otm/client/screen/MatterPanelScreen.java | 4 +- src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt | 233 ------------------ .../mc/otm/android/AndroidFeature.kt | 6 +- .../mc/otm/android/AndroidFeatureType.kt | 2 +- .../mc/otm/android/AndroidResearch.kt | 6 +- .../mc/otm/android/AndroidResearchBuilder.kt | 8 +- .../mc/otm/android/AndroidResearchType.kt | 4 +- .../mc/otm/android/feature/NanobotsArmor.kt | 2 +- .../android/feature/NanobotsRegeneration.kt | 2 +- .../mc/otm/block/AndroidStationBlock.kt | 2 +- .../block/entity/AndroidStationBlockEntity.kt | 2 +- .../block/entity/BatteryBankBlockEntity.kt | 2 +- .../otm/block/entity/CargoCrateBlockEntity.kt | 5 +- .../entity/ChemicalGeneratorBlockEntity.kt | 3 +- .../block/entity/EnergyCounterBlockEntity.kt | 2 +- .../GravitationStabilizerBlockEntity.kt | 2 +- .../mc/otm/block/entity/MatteryBlockEntity.kt | 4 +- .../block/entity/MatteryPoweredBlockEntity.kt | 7 +- .../block/entity/MatteryWorkerBlockEntity.kt | 4 +- .../block/entity/PatternStorageBlockEntity.kt | 6 +- .../otm/block/entity/PlatePressBlockEntity.kt | 4 +- .../mc/otm/block/entity/RedstoneSetting.kt | 2 +- .../entity/blackhole/BlackHoleBlockEntity.kt | 2 +- .../otm/block/entity/blackhole/Explosions.kt | 2 +- .../entity/matter/MatterBottlerBlockEntity.kt | 8 +- .../matter/MatterCapacitorBankBlockEntity.kt | 4 +- .../matter/MatterDecomposerBlockEntity.kt | 5 +- .../entity/matter/MatterPanelBlockEntity.kt | 2 +- .../matter/MatterRecyclerBlockEntity.kt | 6 +- .../matter/MatterReplicatorBlockEntity.kt | 6 +- .../entity/matter/MatterScannerBlockEntity.kt | 3 +- .../entity/storage/DriveRackBlockEntity.kt | 6 +- .../entity/storage/DriveViewerBlockEntity.kt | 4 +- .../entity/storage/ItemMonitorBlockEntity.kt | 9 +- .../entity/storage/StorageBusBlockEntity.kt | 5 +- .../block/entity/storage/StorageInterfaces.kt | 3 +- .../StoragePowerSupplierBlockEntity.kt | 4 +- .../mc/otm/block/storage/StorageBusBlock.kt | 2 +- .../mc/otm/block/storage/StorageInterfaces.kt | 2 +- .../mc/otm/capability/EnergyStorageImpl.kt | 7 +- .../ru/dbotthepony/mc/otm/capability/Ext.kt | 2 +- .../otm/capability/MatteryPlayerCapability.kt | 3 +- .../capability/drive/AbstractMatteryDrive.kt | 8 +- .../otm/capability/drive/ItemMatteryDrive.kt | 4 +- .../capability/matter/MatterHandlerImpl.kt | 2 +- .../dbotthepony/mc/otm/client/MatteryGUI.kt | 5 +- .../render/blockentity/BlackHoleRenderer.kt | 2 +- .../blockentity/EnergyCounterRenderer.kt | 2 +- .../GravitationStabilizerRenderer.kt | 2 +- .../otm/client/screen/AndroidStationScreen.kt | 4 +- .../client/screen/ChemicalGeneratorScreen.kt | 3 +- .../mc/otm/client/screen/DriveViewerScreen.kt | 2 +- .../otm/client/screen/EnergyCounterScreen.kt | 2 +- .../client/screen/ExoSuitInventoryScreen.kt | 3 +- .../mc/otm/client/screen/ItemMonitorScreen.kt | 2 +- .../otm/client/screen/MatterBottlerScreen.kt | 2 +- .../mc/otm/client/screen/StorageBusScreen.kt | 3 +- .../client/screen/StorageExporterScreen.kt | 3 +- .../client/screen/StorageImporterScreen.kt | 3 +- .../screen/StoragePowerSupplierScreen.kt | 3 +- .../otm/client/screen/panels/ButtonPanel.kt | 6 +- .../otm/client/screen/panels/EditBoxPanel.kt | 2 +- .../mc/otm/client/screen/panels/Label.kt | 2 +- .../client/screen/panels/NumberInputPanel.kt | 2 +- .../mc/otm/client/screen/widget/Gauges.kt | 2 +- .../mc/otm/compat/mekanism/Tooltips.kt | 2 +- .../mc/otm/container/ItemFilter.kt | 4 +- .../dbotthepony/mc/otm/container/Iterators.kt | 2 +- .../mc/otm/container/MatteryContainer.kt | 6 +- .../mc/otm/core/CompoundTagDelegates.kt | 78 ++++++ .../dbotthepony/mc/otm/core/CompoundTagExt.kt | 61 +++++ .../ru/dbotthepony/mc/otm/core/EuclidMath.kt | 23 ++ .../kotlin/ru/dbotthepony/mc/otm/core/Ext.kt | 122 ++++++--- .../ru/dbotthepony/mc/otm/core/Formatting.kt | 2 - .../mc/otm/{ => core}/FriendlyStreams.kt | 2 +- .../mc/otm/core/ImpreciseFraction.kt | 11 +- .../mc/otm/{ => core}/UnOverengineering.kt | 2 +- .../mc/otm/data/LootTableAppender.kt | 2 +- .../otm/graph/storage/StorageNetworkGraph.kt | 2 +- .../ru/dbotthepony/mc/otm/item/BatteryItem.kt | 4 +- .../mc/otm/item/EnergySwordItem.kt | 3 +- .../mc/otm/item/ExoSuitProbeItem.kt | 2 +- .../mc/otm/item/GravitationalDisruptorItem.kt | 2 +- .../mc/otm/item/MatterCapacitorItem.kt | 2 +- .../dbotthepony/mc/otm/item/MatterDustItem.kt | 4 +- .../mc/otm/item/PatternStorageItem.kt | 4 +- .../ru/dbotthepony/mc/otm/item/PillItem.kt | 2 +- .../otm/item/PortableCondensationDriveItem.kt | 6 +- .../item/PortableGravitationStabilizerItem.kt | 2 +- .../mc/otm/item/QuantumBatteryItem.kt | 8 +- .../mc/otm/item/weapon/PlasmaRifleItem.kt | 2 +- .../mc/otm/item/weapon/PlasmaWeaponItem.kt | 5 +- .../mc/otm/matter/MatterRegistry.kt | 3 - .../mc/otm/menu/BatteryBankMenu.kt | 4 +- .../dbotthepony/mc/otm/menu/CargoCrateMenu.kt | 2 +- .../dbotthepony/mc/otm/menu/DriveRackMenu.kt | 2 +- .../mc/otm/menu/DriveViewerMenu.kt | 2 +- .../mc/otm/menu/ItemMonitorMenu.kt | 2 +- .../mc/otm/menu/MatterBottlerMenu.kt | 4 +- .../mc/otm/menu/MatterCapacitorBankMenu.kt | 2 +- .../mc/otm/menu/MatterDecomposerMenu.kt | 2 +- .../mc/otm/menu/MatterReplicatorMenu.kt | 2 +- .../mc/otm/menu/PatternStorageMenu.kt | 2 +- .../ru/dbotthepony/mc/otm/menu/Slots.kt | 2 +- .../mc/otm/menu/data/NetworkedItemView.kt | 2 +- .../mc/otm/network/FieldSynchronizer.kt | 7 +- .../ru/dbotthepony/mc/otm/recipe/Helpers.kt | 4 +- .../mc/otm/recipe/PlatePressRecipe.kt | 5 +- .../mc/otm/registry/AndroidResearch.kt | 4 +- .../mc/otm/registry/DamageSources.kt | 2 +- .../ru/dbotthepony/mc/otm/registry/MItems.kt | 2 +- .../mc/otm/saveddata/SavedCountingMap.kt | 2 +- .../mc/otm/storage/ItemStackWrapper.kt | 5 +- .../mc/otm/tests/FriendlyStreams.kt | 8 +- 124 files changed, 437 insertions(+), 488 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt rename src/main/kotlin/ru/dbotthepony/mc/otm/{ => core}/FriendlyStreams.kt (99%) rename src/main/kotlin/ru/dbotthepony/mc/otm/{ => core}/UnOverengineering.kt (96%) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt index 6e251e9bf..10e63ae72 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/DataGen.kt @@ -30,7 +30,7 @@ import ru.dbotthepony.mc.otm.datagen.models.BlockMatteryModelProvider import ru.dbotthepony.mc.otm.datagen.recipes.MatteryRecipeProvider import ru.dbotthepony.mc.otm.datagen.recipes.has import ru.dbotthepony.mc.otm.registry.* -import ru.dbotthepony.mc.otm.* +import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.datagen.lang.MatteryLanguageProvider import ru.dbotthepony.mc.otm.datagen.loot.addLootModifiers import ru.dbotthepony.mc.otm.datagen.recipes.addCraftingTableRecipes diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt index 0d5458351..4857cc46b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/blocks/MatteryBlockStateProvider.kt @@ -12,7 +12,7 @@ import ru.dbotthepony.mc.otm.datagen.DataGen import ru.dbotthepony.mc.otm.datagen.getValueNullable import ru.dbotthepony.mc.otm.datagen.toXRotBlockstate import ru.dbotthepony.mc.otm.datagen.toYRotBlockstate -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName typealias AdvancedBlockStateFunction = (BlockState, ConfiguredModel.Builder<*>, String) -> String? private data class AdvancedBlockStateEntry(val block: Block, val func: AdvancedBlockStateFunction) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt index 5962da99c..88fc2ec00 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/items/MatteryItemModelProvider.kt @@ -6,7 +6,7 @@ import net.minecraftforge.client.model.generators.ItemModelProvider import net.minecraftforge.data.event.GatherDataEvent import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.datagen.DataGen -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName private data class SimpleItemModel(val item: String, val path: ResourceLocation) { val traceback = IllegalArgumentException("Failed to register model") diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt index f61057840..6fa6c91d5 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt @@ -9,7 +9,7 @@ import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import net.minecraftforge.client.model.generators.ModelBuilder import net.minecraftforge.common.data.ExistingFileHelper -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set data class TextureSize(val width: Float, val height: Float) { constructor(arr: JsonArray) : this(arr[0].asFloat, arr[1].asFloat) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt index cf68574cb..c87fc106d 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelProvider.kt @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Block import net.minecraftforge.client.model.generators.ModelProvider import net.minecraftforge.data.event.GatherDataEvent import ru.dbotthepony.mc.otm.datagen.DataGen -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName private typealias Callback = (MatteryModelProvider) -> Unit diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 36d922695..7fc4d0d44 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -4,8 +4,6 @@ import net.minecraft.data.recipes.FinishedRecipe import net.minecraft.data.recipes.ShapedRecipeBuilder import net.minecraft.data.recipes.ShapelessRecipeBuilder import net.minecraft.resources.ResourceLocation -import net.minecraft.tags.TagKey -import net.minecraft.world.item.Item import net.minecraft.world.item.Items import net.minecraft.world.item.crafting.Ingredient import net.minecraftforge.common.Tags @@ -15,7 +13,7 @@ import ru.dbotthepony.mc.otm.registry.MBlocks import ru.dbotthepony.mc.otm.registry.MItemTags import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName import java.util.function.Consumer fun addCraftingTableRecipes(consumer: Consumer) { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt index bf112878b..898f2760b 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/MatteryRecipe.kt @@ -11,7 +11,7 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.ItemLike import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName import java.util.function.Consumer private interface RecipeCell { diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt index d6b85c78f..89e9017b7 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeSerializer import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipeFactory -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class PlatePressFinishedRecipe(private val recipe: PlatePressRecipe) : FinishedRecipe { override fun serializeRecipeData(it: JsonObject) { diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/MatterTask.java b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/MatterTask.java index 75f4b0f14..d42f81cae 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/MatterTask.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/MatterTask.java @@ -10,8 +10,7 @@ import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.RegistryManager; -import ru.dbotthepony.mc.otm.UnOverengineeringKt; +import ru.dbotthepony.mc.otm.core.UnOverengineeringKt; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/PatternState.java b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/PatternState.java index 7cdf85a33..cb3d3b889 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/matter/PatternState.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/matter/PatternState.java @@ -8,8 +8,7 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.registries.ForgeRegistries; import net.minecraftforge.registries.ForgeRegistry; -import net.minecraftforge.registries.RegistryManager; -import ru.dbotthepony.mc.otm.UnOverengineeringKt; +import ru.dbotthepony.mc.otm.core.UnOverengineeringKt; import javax.annotation.Nonnull; import javax.annotation.Nullable; diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java b/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java index 5ac14491d..a6cbc3309 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java @@ -17,8 +17,8 @@ import javax.annotation.Nullable; import java.util.ArrayList; import java.util.List; -import static ru.dbotthepony.mc.otm.UnOverengineeringKt.TextComponent; -import static ru.dbotthepony.mc.otm.UnOverengineeringKt.TranslatableComponent; +import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TextComponent; +import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TranslatableComponent; public class MatterPanelScreen extends MatteryScreen { private static final int MODAL_WIDTH = 213; diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt deleted file mode 100644 index e71a7cbed..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/Ext.kt +++ /dev/null @@ -1,233 +0,0 @@ - -@file:Suppress("unused") - -package ru.dbotthepony.mc.otm - -import com.google.common.collect.ImmutableList -import com.google.gson.JsonElement -import com.google.gson.JsonObject -import net.minecraft.core.BlockPos -import net.minecraft.core.Direction -import net.minecraft.core.Vec3i -import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.LongArrayTag -import net.minecraft.nbt.Tag -import net.minecraft.world.Container -import net.minecraft.world.entity.Entity -import net.minecraft.world.item.ItemStack -import net.minecraft.world.phys.Vec3 -import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.IItemHandler -import java.util.* -import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KProperty - -operator fun Direction.unaryMinus(): Direction = this.opposite -operator fun Vec3i.unaryMinus(): Vec3i = Vec3i(-x, -y, -z) -operator fun BlockPos.unaryMinus(): BlockPos = BlockPos(-x, -y, -z) - -operator fun CompoundTag.set(index: String, value: Tag) = put(index, value) -operator fun CompoundTag.set(index: String, value: Int) = putInt(index, value) -operator fun CompoundTag.set(index: String, value: Byte) = putByte(index, value) -operator fun CompoundTag.set(index: String, value: Short) = putShort(index, value) -operator fun CompoundTag.set(index: String, value: Long) = putLong(index, value) -operator fun CompoundTag.set(index: String, value: Float) = putFloat(index, value) -operator fun CompoundTag.set(index: String, value: Double) = putDouble(index, value) -operator fun CompoundTag.set(index: String, value: String) = putString(index, value) -operator fun CompoundTag.set(index: String, value: Boolean) = putBoolean(index, value) -operator fun CompoundTag.set(index: String, value: ByteArray) = putByteArray(index, value) -operator fun CompoundTag.set(index: String, value: IntArray) = putIntArray(index, value) -operator fun CompoundTag.set(index: String, value: LongArray) = putLongArray(index, value) - -@JvmInline -value class CompoundTagInt(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getInt(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) = tag.putInt(property.name, value) -} - -@JvmInline -value class CompoundTagLong(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getLong(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Long) = tag.putLong(property.name, value) -} - -@JvmInline -value class CompoundTagByte(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getByte(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Byte) = tag.putByte(property.name, value) -} - -@JvmInline -value class CompoundTagShort(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getShort(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Short) = tag.putShort(property.name, value) -} - -@JvmInline -value class CompoundTagFloat(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getFloat(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Float) = tag.putFloat(property.name, value) -} - -@JvmInline -value class CompoundTagBoolean(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getBoolean(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Boolean) = tag.putBoolean(property.name, value) -} - -@JvmInline -value class CompoundTagDouble(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getDouble(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: Double) = tag.putDouble(property.name, value) -} - -@JvmInline -value class CompoundTagString(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>): String = tag.getString(property.name) - override fun setValue(thisRef: Any, property: KProperty<*>, value: String) = tag.putString(property.name, value) -} - -val EMPTY_UUID = UUID(0L, 0L) - -@JvmInline -value class CompoundTagUUID(val tag: CompoundTag) : ReadWriteProperty { - override fun getValue(thisRef: Any, property: KProperty<*>) = (tag.get(property.name) as LongArrayTag?)?.asLongArray?.let { UUID(it[0], it[1]) } ?: EMPTY_UUID - override fun setValue(thisRef: Any, property: KProperty<*>, value: UUID) = tag.putLongArray(property.name, longArrayOf(value.mostSignificantBits, value.leastSignificantBits)) -} - -val CompoundTag.ints get() = CompoundTagInt(this) -val CompoundTag.longs get() = CompoundTagLong(this) -val CompoundTag.bytes get() = CompoundTagByte(this) -val CompoundTag.shorts get() = CompoundTagShort(this) -val CompoundTag.floats get() = CompoundTagFloat(this) -val CompoundTag.doubles get() = CompoundTagDouble(this) -val CompoundTag.booleans get() = CompoundTagBoolean(this) -val CompoundTag.strings get() = CompoundTagString(this) -val CompoundTag.uuids get() = CompoundTagUUID(this) - -operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) -operator fun Container.get(index: Int): ItemStack = getItem(index) -operator fun IItemHandler.get(index: Int): ItemStack = getStackInSlot(index) - -operator fun JsonObject.set(s: String, value: JsonElement) = add(s, value) - -inline fun CompoundTag.map(s: String, consumer: (T) -> R): R? { - val tag = get(s) - - if (tag is T) { - return consumer(tag) - } - - return null -} - -inline fun CompoundTag.ifCompound(s: String, consumer: (CompoundTag) -> T): T? { - val tag = get(s) - - if (tag is CompoundTag) { - return consumer(tag) - } - - return null -} - -inline fun CompoundTag.ifHas(s: String, consumer: (Tag) -> Unit) { - val tag = get(s) - - if (tag != null) { - consumer(tag) - } -} - -inline fun CompoundTag.ifHas(s: String, type: Byte, consumer: (Tag) -> Unit) { - val tag = get(s) - - if (tag != null && tag.id == type) { - consumer(tag) - } -} - -inline fun CompoundTag.ifHas(s: String, type: Class, consumer: (T) -> Unit) { - val tag = get(s) - - if (tag != null && tag::class.java === type) { - consumer(tag as T) - } -} - -fun LazyOptional.orNull(): T? { - if (!isPresent) { - return null - } - - return resolve().orElse(null) -} - -fun LazyOptional.orThrow(): T { - if (!isPresent) { - throw IllegalStateException("Capability was expected to be not null") - } - - return resolve().orElse(null) ?: throw IllegalStateException("Capability was expected to be not null") -} - -inline fun LazyOptional.ifPresentK(lambda: (T) -> Unit) { - if (isPresent) { - val value = resolve().orElse(null) ?: throw IllegalStateException("Capability was expected to be not null") - lambda.invoke(value) - } -} - -val ItemStack.tagNotNull: CompoundTag get() = orCreateTag - -inline var Entity.position: Vec3 - get() = position() - set(value) { setPos(value) } - -inline val > T.next: T get() { - val values = enumValues() - val next = (ordinal + 1) % values.size - return values[next] -} - -inline val > T.prev: T get() { - val values = enumValues() - var next = ordinal - 1 - - if (next < 0) { - next = values.size - 1 - } - - return values[next] -} - -fun > T.next(values: Array): T { - val next = (ordinal + 1) % values.size - return values[next] -} - -fun > T.prev(values: Array): T { - var next = ordinal - 1 - - if (next < 0) { - next = values.size - 1 - } - - return values[next] -} - -inline fun ImmutableList(size: Int, initializer: (index: Int) -> T): ImmutableList { - require(size >= 0) { "Invalid list size $size" } - - return when (size) { - 0 -> ImmutableList.of() - 1 -> ImmutableList.of(initializer(0)) - else -> ImmutableList.Builder().let { - for (i in 0 until size) { - it.add(initializer(i)) - } - - it.build() - } - } -} 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 28bc2521b..8d2995144 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt @@ -4,9 +4,9 @@ import net.minecraft.nbt.CompoundTag 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.readNbt -import ru.dbotthepony.mc.otm.set -import ru.dbotthepony.mc.otm.writeNbt +import ru.dbotthepony.mc.otm.core.readNbt +import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeatureType.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeatureType.kt index f2e501014..c4630ae21 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeatureType.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeatureType.kt @@ -5,7 +5,7 @@ import net.minecraft.network.chat.ComponentContents import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.contents.TranslatableContents import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability -import ru.dbotthepony.mc.otm.getKeyNullable +import ru.dbotthepony.mc.otm.core.getKeyNullable import ru.dbotthepony.mc.otm.registry.MRegistry open class AndroidFeatureType { 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 97860c3dc..877147834 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -7,9 +7,9 @@ import net.minecraft.world.item.ItemStack import net.minecraftforge.common.util.INBTSerializable import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.client.render.SkinElement -import ru.dbotthepony.mc.otm.readNbt -import ru.dbotthepony.mc.otm.set -import ru.dbotthepony.mc.otm.writeNbt +import ru.dbotthepony.mc.otm.core.readNbt +import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt index 43c6b481d..11404474b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt @@ -6,7 +6,7 @@ import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.registry.MRegistry @@ -335,7 +335,8 @@ class AndroidResearchBuilder( } if (experience != 0) { - builder.add(TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle( + builder.add( + TranslatableComponent("otm.android_station.research.xp_cost", experience).withStyle( if (capability.ply.experienceLevel >= experience) ChatFormatting.DARK_GREEN else @@ -346,7 +347,8 @@ class AndroidResearchBuilder( for (value in this.type.flatPrerequisites) { val instance = capability.getResearch(value) - builder.add(TranslatableComponent("android_research.status.requires", instance.screenTooltipHeader).withStyle( + builder.add( + TranslatableComponent("android_research.status.requires", instance.screenTooltipHeader).withStyle( if (instance.isResearched) ChatFormatting.DARK_GREEN else diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt index 56e9ea9fc..762070f98 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchType.kt @@ -6,9 +6,9 @@ import net.minecraft.network.chat.Component import net.minecraft.network.chat.ComponentContents import net.minecraft.network.chat.MutableComponent import net.minecraft.network.chat.contents.TranslatableContents -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability -import ru.dbotthepony.mc.otm.getKeyNullable +import ru.dbotthepony.mc.otm.core.getKeyNullable import ru.dbotthepony.mc.otm.registry.MRegistry import java.util.* import kotlin.collections.HashSet diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt index a6c46cf51..28adbae4e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt @@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt class NanobotsArmor(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt index aee96f7d8..aa25381df 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt @@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt class NanobotsRegeneration(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_REGENERATION, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/AndroidStationBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/AndroidStationBlock.kt index 779fe6683..8c958eb0a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/AndroidStationBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/AndroidStationBlock.kt @@ -16,7 +16,7 @@ import net.minecraft.world.phys.shapes.CollisionContext import net.minecraft.world.phys.shapes.VoxelShape import ru.dbotthepony.mc.otm.block.entity.AndroidStationBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/AndroidStationBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/AndroidStationBlockEntity.kt index ca6bb8e4a..dadc3dd85 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/AndroidStationBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/AndroidStationBlockEntity.kt @@ -9,7 +9,7 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.AABB -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.core.ImpreciseFraction diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BatteryBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BatteryBankBlockEntity.kt index 9d45286d8..b6a0fea83 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BatteryBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BatteryBankBlockEntity.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.block.BatteryBankBlock import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.ImpreciseFraction +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.menu.BatteryBankMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import javax.annotation.ParametersAreNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index 4eacf3bb0..8c1017719 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -12,13 +12,12 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.CargoCrateBlock import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.ifHas import ru.dbotthepony.mc.otm.menu.CargoCrateMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class CargoCrateBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt index 4c7c813eb..7cc7b630e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/ChemicalGeneratorBlockEntity.kt @@ -21,8 +21,7 @@ import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.menu.ChemicalGeneratorMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import java.lang.ref.WeakReference diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/EnergyCounterBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/EnergyCounterBlockEntity.kt index 0ca893883..ccf4efca9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/EnergyCounterBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/EnergyCounterBlockEntity.kt @@ -25,7 +25,7 @@ import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.block.EnergyCounterBlock import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.compat.mekanism.MatteryToMekanismEnergyWrapper -import ru.dbotthepony.mc.otm.core.ImpreciseFraction +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.menu.EnergyCounterMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.network.WorldNetworkChannel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt index ae924813c..9a14c3332 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/GravitationStabilizerBlockEntity.kt @@ -9,7 +9,7 @@ import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.minecraft.world.phys.AABB -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.BlockGravitationStabilizer import ru.dbotthepony.mc.otm.block.BlockGravitationStabilizerLens import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock 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 d4b280222..b3015f563 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 @@ -23,8 +23,8 @@ import net.minecraft.network.chat.Component import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability import ru.dbotthepony.mc.otm.addPreWorldTickerOnce -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.ifHas +import ru.dbotthepony.mc.otm.core.set abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : BlockEntity(p_155228_, p_155229_, p_155230_), MenuProvider { var customDisplayName: Component? = null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt index a097856de..1a6992a54 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt @@ -8,13 +8,12 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.energy.CapabilityEnergy import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.ifPresentK -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.ifHas +import ru.dbotthepony.mc.otm.core.ifPresentK +import ru.dbotthepony.mc.otm.core.set abstract class MatteryPoweredBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : MatteryBlockEntity(p_155228_, p_155229_, p_155230_) { abstract val energy: BlockEnergyStorageImpl diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt index 381ee6ed5..8444518c4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt @@ -7,8 +7,8 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.core.* -import ru.dbotthepony.mc.otm.map -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.map +import ru.dbotthepony.mc.otm.core.set private fun isReason(status: Any?, reason: Any) = status == null || status == reason diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt index d531dbaa1..ea0ff7f61 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt @@ -21,14 +21,14 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import java.util.ArrayList @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt index e2a6e0b3b..b11e4198a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt @@ -12,7 +12,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilter @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.PlatePressMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MRecipes -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class PlatePressBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneSetting.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneSetting.kt index bbc5a14a3..4c353f217 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneSetting.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/RedstoneSetting.kt @@ -1,7 +1,7 @@ package ru.dbotthepony.mc.otm.block.entity import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent enum class RedstoneSetting(val label: Component, val description: Component) { IGNORED(TranslatableComponent("otm.gui.redstone.ignored"), TranslatableComponent("otm.gui.redstone.ignored.description")), diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt index f9f828478..9a9a0e7e5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt import kotlin.math.sqrt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt index c5cb83b06..6658bee64 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt @@ -23,7 +23,7 @@ import ru.dbotthepony.mc.otm.block.BlockExplosionDebugger import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import java.util.* import kotlin.collections.ArrayList import kotlin.collections.HashMap diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt index bdfe096af..3df8e9272 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.CapabilityItemHandler -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.entity.WorkerState @@ -29,11 +29,11 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, p_155229_, p_155230_), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt index 5a87cf830..16a61ba03 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt @@ -15,7 +15,7 @@ import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.BatteryBankBlock import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability @@ -28,7 +28,7 @@ import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index 0c8400f15..e0424ec1f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -15,7 +15,7 @@ import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.IItemHandler -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage @@ -30,7 +30,7 @@ import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.item.MatterDustItem import ru.dbotthepony.mc.otm.matter.baselineComplexityDecomposeTicks import ru.dbotthepony.mc.otm.matter.canDecompose @@ -38,7 +38,6 @@ import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterDecomposerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MItems -import ru.dbotthepony.mc.otm.set fun moveMatterAsDustIntoContainer(_matterValue: ImpreciseFraction, container: MatteryContainer, OUTPUT_DUST_MAIN: Int, OUTPUT_DUST_STACKING: Int): ImpreciseFraction { var matterValue = _matterValue 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 ac0da2868..d26a57718 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 @@ -23,7 +23,7 @@ import net.minecraft.network.chat.Component import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryBlockEntity import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index e29f1a301..32ad74dc3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage @@ -28,10 +28,10 @@ import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.item.MatterDustItem -import ru.dbotthepony.mc.otm.map +import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.menu.MatterRecyclerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode { 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 c7eec86c1..ea4739a2a 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 @@ -14,7 +14,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage @@ -26,12 +26,12 @@ import ru.dbotthepony.mc.otm.core.getImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.map +import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.matter.baselineComplexityReplicateTicks import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_, ::ReplicatorJob), IMatterGraphNode { 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 6ef44800b..cfa8e5e8b 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 @@ -14,8 +14,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt index 2e2e46026..bdbf858b5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt @@ -13,16 +13,16 @@ import net.minecraft.world.level.Level import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.DriveRackMenu -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.storage.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt index a1075a2e6..d59a2ded3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt @@ -11,7 +11,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.Block import net.minecraft.world.level.block.state.BlockState import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.storage.DriveViewerBlock import ru.dbotthepony.mc.otm.block.entity.WorkerState @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.DriveViewerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt index 4aefec61e..eae1e3bd4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt @@ -26,26 +26,25 @@ import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.network.NetworkEvent import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.get +import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.* import java.util.function.Supplier import kotlin.collections.HashMap -import kotlin.collections.HashSet class ItemMonitorPlayerSettings : INBTSerializable, MatteryPacket { enum class RefillSource(val component: Component) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt index e073ba5da..1ba36b88d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageBusBlockEntity.kt @@ -25,10 +25,7 @@ import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.ItemFilter -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.isPositive -import ru.dbotthepony.mc.otm.core.isZero -import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.GraphNodeListener import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt index 729105d70..a2a63c5ff 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StorageInterfaces.kt @@ -23,8 +23,7 @@ import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.capability.* import ru.dbotthepony.mc.otm.container.ItemFilter -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.plus +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.GraphNodeListener import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt index 5194289da..ab7eec48b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt @@ -13,7 +13,7 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage @@ -24,7 +24,7 @@ import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MNames -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class StoragePowerSupplierBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.STORAGE_POWER_SUPPLIER, blockPos, blockState) { override val defaultDisplayName: Component diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageBusBlock.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageBusBlock.kt index f9fae0cf3..baf657dbf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageBusBlock.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageBusBlock.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.block.StorageCableBlock import ru.dbotthepony.mc.otm.block.entity.storage.StorageBusBlockEntity import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes -import ru.dbotthepony.mc.otm.unaryMinus +import ru.dbotthepony.mc.otm.core.unaryMinus class StorageBusBlock : RotatableMatteryBlock(), EntityBlock { override val hasFreeRotation: Boolean get() = true diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageInterfaces.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageInterfaces.kt index 62196cf8b..35a169791 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageInterfaces.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/storage/StorageInterfaces.kt @@ -23,7 +23,7 @@ import ru.dbotthepony.mc.otm.block.entity.storage.StorageExporterBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.StorageImporterBlockEntity import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.shapes.BlockShapes -import ru.dbotthepony.mc.otm.unaryMinus +import ru.dbotthepony.mc.otm.core.unaryMinus class StorageImporterBlock : RotatableMatteryBlock(), EntityBlock { override val hasFreeRotation: Boolean get() = true diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt index d8c4d90a4..661685bea 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt @@ -12,12 +12,11 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.energy.CapabilityEnergy import ru.dbotthepony.mc.otm.compat.mekanism.MatteryToMekanismEnergyWrapper import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set -import ru.dbotthepony.mc.otm.tagNotNull +import ru.dbotthepony.mc.otm.core.ifHas +import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.core.tagNotNull private enum class EnergyFlow { INPUT, OUTPUT, BI_DIRECTIONAL diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 3207d6527..171556ca2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -10,7 +10,7 @@ import net.minecraftforge.fml.ModList import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull val ICapabilityProvider.matteryPlayer: MatteryPlayerCapability? get() = getCapability(MatteryCapability.MATTERY_PLAYER).orNull() 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 2de4a936d..d2d8912b8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -2,7 +2,6 @@ package ru.dbotthepony.mc.otm.capability import it.unimi.dsi.fastutil.objects.ObjectArraySet import net.minecraft.ChatFormatting -import net.minecraft.advancements.CriteriaTriggers import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.ListTag @@ -39,7 +38,7 @@ import ru.dbotthepony.mc.otm.android.AndroidFeatureType import ru.dbotthepony.mc.otm.android.AndroidResearch import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.ImpreciseFraction +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.menu.ExoSuitInventoryMenu import ru.dbotthepony.mc.otm.network.* import ru.dbotthepony.mc.otm.registry.AndroidFeatures diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt index a9039d0c9..66af62358 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt @@ -1,21 +1,17 @@ package ru.dbotthepony.mc.otm.capability.drive -import it.unimi.dsi.fastutil.longs.Long2ObjectAVLTreeMap -import it.unimi.dsi.fastutil.objects.Object2ObjectAVLTreeMap import it.unimi.dsi.fastutil.objects.ObjectArraySet import kotlin.jvm.JvmOverloads import java.util.UUID import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.ListTag -import net.minecraft.nbt.LongTag import net.minecraft.nbt.Tag import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.core.BigInteger -import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.isPositive import ru.dbotthepony.mc.otm.core.serializeNBT -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.ifHas +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt index 74a66ad21..f9b5eec28 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt @@ -6,12 +6,10 @@ import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries -import net.minecraftforge.registries.RegistryManager import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.core.BigInteger -import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.serializeNBT -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.storage.IStorageTuple import ru.dbotthepony.mc.otm.storage.ItemStackWrapper import ru.dbotthepony.mc.otm.storage.StorageStackType diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt index 45a24fc9a..056bbfc91 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt @@ -4,7 +4,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set open class MatterHandlerImpl @JvmOverloads constructor( protected val listener: Runnable?, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/MatteryGUI.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/MatteryGUI.kt index c5d02ded5..d8080072d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/MatteryGUI.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/MatteryGUI.kt @@ -18,14 +18,13 @@ import net.minecraftforge.client.gui.overlay.GuiOverlayManager import net.minecraftforge.eventbus.api.EventPriority import net.minecraftforge.eventbus.api.SubscribeEvent import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TextComponent -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.core.RGBAColor -import ru.dbotthepony.mc.otm.ifPresentK +import ru.dbotthepony.mc.otm.core.ifPresentK import java.util.* object MatteryGUI { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BlackHoleRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BlackHoleRenderer.kt index 1c4715b39..d0e455e9c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BlackHoleRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/BlackHoleRenderer.kt @@ -11,7 +11,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.world.phys.Vec3 import org.lwjgl.opengl.GL30 -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.GravitationStabilizerBlockEntity import ru.dbotthepony.mc.otm.block.entity.blackhole.BlackHoleBlockEntity import ru.dbotthepony.mc.otm.capability.matteryPlayer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/EnergyCounterRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/EnergyCounterRenderer.kt index 2d299b81c..e6cf2ac62 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/EnergyCounterRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/EnergyCounterRenderer.kt @@ -6,7 +6,7 @@ import net.minecraft.client.renderer.MultiBufferSource import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.core.Direction -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.EnergyCounterBlock import ru.dbotthepony.mc.otm.block.entity.EnergyCounterBlockEntity import ru.dbotthepony.mc.otm.client.render.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt index f4f2e2429..79dd06175 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/render/blockentity/GravitationStabilizerRenderer.kt @@ -10,7 +10,7 @@ import net.minecraft.client.renderer.blockentity.BlockEntityRenderer import net.minecraft.client.renderer.blockentity.BlockEntityRendererProvider import net.minecraft.client.renderer.texture.OverlayTexture import net.minecraft.core.Direction -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.BlackHoleBlock import ru.dbotthepony.mc.otm.block.RotatableMatteryBlock import ru.dbotthepony.mc.otm.block.entity.GravitationStabilizerBlockEntity diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/AndroidStationScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/AndroidStationScreen.kt index 4760d6eb1..a82248570 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/AndroidStationScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/AndroidStationScreen.kt @@ -11,7 +11,7 @@ import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.network.chat.Component import net.minecraft.sounds.SoundEvents import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.android.AndroidResearch import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability @@ -24,7 +24,7 @@ import ru.dbotthepony.mc.otm.client.render.drawRect import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.core.RGBAColor -import ru.dbotthepony.mc.otm.ifPresentK +import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.menu.AndroidStationMenu import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel import ru.dbotthepony.mc.otm.network.AndroidResearchRequestPacket diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt index 0f6a6ffe3..af265b0ec 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ChemicalGeneratorScreen.kt @@ -2,9 +2,8 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.menu.ChemicalGeneratorMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt index 6700bd60a..f3e12490c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt @@ -4,7 +4,7 @@ import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/EnergyCounterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/EnergyCounterScreen.kt index 9caf1f4b5..54c8dc5d3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/EnergyCounterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/EnergyCounterScreen.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.core.formatPower import ru.dbotthepony.mc.otm.menu.EnergyCounterMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt index cac0ee43c..30f142f04 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt @@ -3,9 +3,8 @@ package ru.dbotthepony.mc.otm.client.screen import com.mojang.blaze3d.vertex.PoseStack import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap import it.unimi.dsi.fastutil.ints.Int2ObjectFunction -import net.minecraft.client.gui.screens.inventory.InventoryScreen import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.element import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.menu.ExoSuitInventoryMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt index cba5b969d..70ee942a8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt @@ -8,7 +8,7 @@ import net.minecraft.world.entity.player.Inventory import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import org.lwjgl.opengl.GL11 -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.Widgets8 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterBottlerScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterBottlerScreen.kt index 869172e13..4e42721fa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterBottlerScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterBottlerScreen.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.MatterGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageBusScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageBusScreen.kt index 342a0dfea..ce186d984 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageBusScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageBusScreen.kt @@ -2,9 +2,8 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.menu.StorageBusMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageExporterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageExporterScreen.kt index 7ea5b4169..12fadc33e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageExporterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageExporterScreen.kt @@ -2,9 +2,8 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.menu.StorageExporterMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageImporterScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageImporterScreen.kt index d6aff0902..866f259f6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageImporterScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StorageImporterScreen.kt @@ -2,9 +2,8 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.menu.StorageImporterMenu diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt index 7e0f0d90e..a8ba11059 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt @@ -2,9 +2,8 @@ package ru.dbotthepony.mc.otm.client.screen import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel import ru.dbotthepony.mc.otm.core.formatPower diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt index b07c2e14a..1024a0f6c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt @@ -8,12 +8,12 @@ import net.minecraft.client.gui.components.Button.OnPress import net.minecraft.client.resources.sounds.SimpleSoundInstance import net.minecraft.network.chat.Component import net.minecraft.sounds.SoundEvents -import ru.dbotthepony.mc.otm.TextComponent +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.client.screen.MatteryScreen -import ru.dbotthepony.mc.otm.next -import ru.dbotthepony.mc.otm.prev +import ru.dbotthepony.mc.otm.core.next +import ru.dbotthepony.mc.otm.core.prev import java.util.* import kotlin.collections.ArrayList import kotlin.reflect.KMutableProperty0 diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt index 25c472cec..b5f7a3b42 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/EditBoxPanel.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen.panels import net.minecraft.client.gui.components.EditBox import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TextComponent +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.client.screen.MatteryScreen open class EditBoxPanel( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt index 19dc546fc..92e95a7f0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/Label.kt @@ -2,7 +2,7 @@ package ru.dbotthepony.mc.otm.client.screen.panels import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TextComponent +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.core.RGBAColor import ru.dbotthepony.mc.otm.client.screen.MatteryScreen diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt index 86410a442..e8ab11c7a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/NumberInputPanel.kt @@ -1,7 +1,7 @@ package ru.dbotthepony.mc.otm.client.screen.panels import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TextComponent +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.menu.widget.NumberPlayerInputWidget import java.math.BigDecimal diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt index 649ccb3b1..5ea9b5862 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt @@ -4,7 +4,7 @@ import com.mojang.blaze3d.systems.RenderSystem import com.mojang.blaze3d.vertex.PoseStack import net.minecraft.ChatFormatting import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.client.screen.MatteryScreen import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt index dc840a76d..d4558d04a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/compat/mekanism/Tooltips.kt @@ -4,7 +4,7 @@ import mekanism.common.registries.MekanismItems import net.minecraft.ChatFormatting import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.eventbus.api.SubscribeEvent -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.isMekanismLoaded private val BLACKHOLE_IMMUNITY = TranslatableComponent("otm.item.blackhole_immunity").withStyle(ChatFormatting.DARK_GRAY) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt index f96b4eacd..cca0c9991 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt @@ -11,10 +11,10 @@ import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.network.NetworkEvent import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.client.minecraft -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.network.MatteryPacket -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import java.util.Arrays import java.util.LinkedList import java.util.function.Supplier diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index f067db281..4d80d79e6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.container import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set import java.util.function.Consumer class ContainerIteratorItemStack(private val container: Container) : MutableIterator, Iterable { 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 7396cabc4..fb41c3afe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt @@ -9,9 +9,9 @@ import kotlin.jvm.JvmOverloads import net.minecraft.world.entity.player.Player import net.minecraft.world.level.block.entity.BlockEntity import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.get -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.core.ifHas +import ru.dbotthepony.mc.otm.core.set import java.util.* import java.util.function.Consumer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt new file mode 100644 index 000000000..828ff6520 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt @@ -0,0 +1,78 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.LongArrayTag +import java.util.* +import kotlin.properties.ReadWriteProperty +import kotlin.reflect.KProperty + +@JvmInline +value class CompoundTagInt(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getInt(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Int) = tag.putInt(property.name, value) +} + +@JvmInline +value class CompoundTagLong(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getLong(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Long) = tag.putLong(property.name, value) +} + +@JvmInline +value class CompoundTagByte(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getByte(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Byte) = tag.putByte(property.name, value) +} + +@JvmInline +value class CompoundTagShort(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getShort(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Short) = tag.putShort(property.name, value) +} + +@JvmInline +value class CompoundTagFloat(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getFloat(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Float) = tag.putFloat(property.name, value) +} + +@JvmInline +value class CompoundTagBoolean(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getBoolean(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Boolean) = tag.putBoolean(property.name, value) +} + +@JvmInline +value class CompoundTagDouble(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = tag.getDouble(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: Double) = tag.putDouble(property.name, value) +} + +@JvmInline +value class CompoundTagString(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>): String = tag.getString(property.name) + override fun setValue(thisRef: Any, property: KProperty<*>, value: String) = tag.putString(property.name, value) +} + +val EMPTY_UUID = UUID(0L, 0L) + +@JvmInline +value class CompoundTagUUID(val tag: CompoundTag) : ReadWriteProperty { + override fun getValue(thisRef: Any, property: KProperty<*>) = (tag.get(property.name) as LongArrayTag?)?.asLongArray?.let { + UUID( + it[0], + it[1] + ) + } ?: EMPTY_UUID + override fun setValue(thisRef: Any, property: KProperty<*>, value: UUID) = tag.putLongArray(property.name, longArrayOf(value.mostSignificantBits, value.leastSignificantBits)) +} + +val CompoundTag.ints get() = CompoundTagInt(this) +val CompoundTag.longs get() = CompoundTagLong(this) +val CompoundTag.bytes get() = CompoundTagByte(this) +val CompoundTag.shorts get() = CompoundTagShort(this) +val CompoundTag.floats get() = CompoundTagFloat(this) +val CompoundTag.doubles get() = CompoundTagDouble(this) +val CompoundTag.booleans get() = CompoundTagBoolean(this) +val CompoundTag.strings get() = CompoundTagString(this) +val CompoundTag.uuids get() = CompoundTagUUID(this) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt new file mode 100644 index 000000000..7c78e7105 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt @@ -0,0 +1,61 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.Tag + +operator fun CompoundTag.set(index: String, value: Tag) = put(index, value) +operator fun CompoundTag.set(index: String, value: Int) = putInt(index, value) +operator fun CompoundTag.set(index: String, value: Byte) = putByte(index, value) +operator fun CompoundTag.set(index: String, value: Short) = putShort(index, value) +operator fun CompoundTag.set(index: String, value: Long) = putLong(index, value) +operator fun CompoundTag.set(index: String, value: Float) = putFloat(index, value) +operator fun CompoundTag.set(index: String, value: Double) = putDouble(index, value) +operator fun CompoundTag.set(index: String, value: String) = putString(index, value) +operator fun CompoundTag.set(index: String, value: Boolean) = putBoolean(index, value) +operator fun CompoundTag.set(index: String, value: ByteArray) = putByteArray(index, value) +operator fun CompoundTag.set(index: String, value: IntArray) = putIntArray(index, value) +operator fun CompoundTag.set(index: String, value: LongArray) = putLongArray(index, value) + +inline fun CompoundTag.map(s: String, consumer: (T) -> R): R? { + val tag = get(s) + + if (tag is T) { + return consumer(tag) + } + + return null +} + +inline fun CompoundTag.ifCompound(s: String, consumer: (CompoundTag) -> T): T? { + val tag = get(s) + + if (tag is CompoundTag) { + return consumer(tag) + } + + return null +} + +inline fun CompoundTag.ifHas(s: String, consumer: (Tag) -> Unit) { + val tag = get(s) + + if (tag != null) { + consumer(tag) + } +} + +inline fun CompoundTag.ifHas(s: String, type: Byte, consumer: (Tag) -> Unit) { + val tag = get(s) + + if (tag != null && tag.id == type) { + consumer(tag) + } +} + +inline fun CompoundTag.ifHas(s: String, type: Class, consumer: (T) -> Unit) { + val tag = get(s) + + if (tag != null && tag::class.java === type) { + consumer(tag as T) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt index 348a52b90..e73b62447 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt @@ -2,7 +2,9 @@ package ru.dbotthepony.mc.otm.core import com.mojang.math.Quaternion import com.mojang.math.Vector3f +import net.minecraft.core.BlockPos import net.minecraft.core.Direction +import net.minecraft.core.Vec3i import net.minecraft.world.phys.Vec3 import kotlin.math.* @@ -338,6 +340,7 @@ fun bezierCurve(t: Double, vararg values: Vector): Vector { } } } + fun bezierCurve(t: Double, values: DoubleArray): Double { when (values.size) { 0, 1 -> throw IllegalArgumentException("Provided array has only ${values.size} entries in it") @@ -359,3 +362,23 @@ fun bezierCurve(t: Double, values: DoubleArray): Double { } } } + +operator fun BlockPos.plus(direction: Vec3i): BlockPos = this.offset(direction) +operator fun BlockPos.plus(direction: Direction): BlockPos = this.offset(direction.normal) +operator fun BlockPos.minus(direction: Vec3i): BlockPos = this.subtract(direction) +operator fun BlockPos.minus(direction: Direction): BlockPos = this.subtract(direction.normal) + +operator fun Vec3i.plus(direction: Vec3i): Vec3i = this.offset(direction) +operator fun Vec3i.plus(direction: Direction): Vec3i = this.offset(direction.normal) +operator fun Vec3i.minus(direction: Vec3i): Vec3i = this.subtract(direction) +operator fun Vec3i.minus(direction: Direction): Vec3i = this.subtract(direction.normal) +operator fun Vec3i.times(int: Int): Vec3i = this.multiply(int) +operator fun Vec3i.times(double: Double): Vector = Vector(x * double, y * double, z * double) + +fun BlockPos.asVector(): Vector { + return Vector(x + 0.5, y + 0.5, z + 0.5) +} + +operator fun Direction.unaryMinus(): Direction = this.opposite +operator fun Vec3i.unaryMinus(): Vec3i = Vec3i(-x, -y, -z) +operator fun BlockPos.unaryMinus(): BlockPos = BlockPos(-x, -y, -z) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index 569d8e7c8..c9a9e6c94 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -3,31 +3,21 @@ package ru.dbotthepony.mc.otm.core -import net.minecraft.core.BlockPos -import net.minecraft.core.Direction -import net.minecraft.core.Vec3i +import com.google.common.collect.ImmutableList +import com.google.gson.JsonElement +import com.google.gson.JsonObject import net.minecraft.nbt.ByteArrayTag +import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf +import net.minecraft.world.Container +import net.minecraft.world.entity.Entity +import net.minecraft.world.item.ItemStack +import net.minecraft.world.phys.Vec3 +import net.minecraftforge.common.util.LazyOptional +import net.minecraftforge.items.IItemHandler import java.math.BigInteger -operator fun BlockPos.plus(direction: Vec3i): BlockPos = this.offset(direction) -operator fun BlockPos.plus(direction: Direction): BlockPos = this.offset(direction.normal) -operator fun BlockPos.minus(direction: Vec3i): BlockPos = this.subtract(direction) -operator fun BlockPos.minus(direction: Direction): BlockPos = this.subtract(direction.normal) - -operator fun Vec3i.plus(direction: Vec3i): Vec3i = this.offset(direction) -operator fun Vec3i.plus(direction: Direction): Vec3i = this.offset(direction.normal) -operator fun Vec3i.minus(direction: Vec3i): Vec3i = this.subtract(direction) -operator fun Vec3i.minus(direction: Direction): Vec3i = this.subtract(direction.normal) - -operator fun Vec3i.times(int: Int): Vec3i = this.multiply(int) -operator fun Vec3i.times(double: Double): Vector = Vector(x * double, y * double, z * double) - -fun BlockPos.asVector(): Vector { - return Vector(x + 0.5, y + 0.5, z + 0.5) -} - /** * Performs type check+cast and sums two numbers. * @@ -213,14 +203,6 @@ fun Number.toImpreciseFraction(): ImpreciseFraction { } } -fun Float.toImpreciseFraction() = ImpreciseFraction(this) -fun Double.toImpreciseFraction() = ImpreciseFraction(this) -fun Int.toImpreciseFraction() = ImpreciseFraction(this) -fun Byte.toImpreciseFraction() = ImpreciseFraction(this) -fun Short.toImpreciseFraction() = ImpreciseFraction(this) -fun Long.toImpreciseFraction() = ImpreciseFraction(this) -fun ImpreciseFraction.toImpreciseFraction() = this - fun BigInteger(tag: Tag?): BigInteger { if (tag !is ByteArrayTag) return BigInteger.ZERO @@ -237,3 +219,87 @@ fun FriendlyByteBuf.writeBigInteger(value: BigInteger) { } fun FriendlyByteBuf.readBigInteger(byteLimit: Int = 128) = BigInteger(readByteArray(byteLimit)) + +operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) +operator fun Container.get(index: Int): ItemStack = getItem(index) + +operator fun IItemHandler.get(index: Int): ItemStack = getStackInSlot(index) + +operator fun JsonObject.set(s: String, value: JsonElement) = add(s, value) + +fun LazyOptional.orNull(): T? { + if (!isPresent) { + return null + } + + return resolve().orElse(null) +} + +fun LazyOptional.orThrow(): T { + if (!isPresent) { + throw IllegalStateException("Capability was expected to be not null") + } + + return resolve().get() ?: throw IllegalStateException("Capability was expected to be not null") +} + +inline fun LazyOptional.ifPresentK(lambda: (T) -> Unit) { + if (isPresent) { + val value = resolve().orElse(null) ?: throw IllegalStateException("Capability was expected to be not null") + lambda.invoke(value) + } +} + +val ItemStack.tagNotNull: CompoundTag get() = orCreateTag + +inline var Entity.position: Vec3 + get() = position() + set(value) { setPos(value) } + +inline val > T.next: T get() { + val values = enumValues() + val next = (ordinal + 1) % values.size + return values[next] +} + +inline val > T.prev: T get() { + val values = enumValues() + var next = ordinal - 1 + + if (next < 0) { + next = values.size - 1 + } + + return values[next] +} + +fun > T.next(values: Array): T { + val next = (ordinal + 1) % values.size + return values[next] +} + +fun > T.prev(values: Array): T { + var next = ordinal - 1 + + if (next < 0) { + next = values.size - 1 + } + + return values[next] +} + +inline fun ImmutableList(size: Int, initializer: (index: Int) -> T): ImmutableList { + require(size >= 0) { "Invalid list size $size" } + + return when (size) { + 0 -> ImmutableList.of() + 1 -> ImmutableList.of(initializer(0)) + else -> ImmutableList.Builder().let { + for (i in 0 until size) { + it.add(initializer(i)) + } + + it.build() + } + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Formatting.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Formatting.kt index ecb9d6f78..27a892f8a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Formatting.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Formatting.kt @@ -2,8 +2,6 @@ package ru.dbotthepony.mc.otm.core import com.google.common.collect.ImmutableList import net.minecraft.network.chat.Component -import ru.dbotthepony.mc.otm.TextComponent -import ru.dbotthepony.mc.otm.TranslatableComponent import java.math.BigDecimal import java.math.BigInteger diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/FriendlyStreams.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/FriendlyStreams.kt similarity index 99% rename from src/main/kotlin/ru/dbotthepony/mc/otm/FriendlyStreams.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/core/FriendlyStreams.kt index 90cba80aa..b0125637b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/FriendlyStreams.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/FriendlyStreams.kt @@ -1,4 +1,4 @@ -package ru.dbotthepony.mc.otm +package ru.dbotthepony.mc.otm.core import io.netty.handler.codec.EncoderException import net.minecraft.nbt.CompoundTag diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt index b045dde31..e84b3e9de 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ImpreciseFraction.kt @@ -5,10 +5,6 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.StringTag import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf -import ru.dbotthepony.mc.otm.readDouble -import ru.dbotthepony.mc.otm.readVarIntLE -import ru.dbotthepony.mc.otm.writeDouble -import ru.dbotthepony.mc.otm.writeVarIntLE import java.io.InputStream import java.io.OutputStream import java.math.BigDecimal @@ -666,3 +662,10 @@ fun CompoundTag.getImpreciseFraction(key: String) = ImpreciseFraction.deserializ fun CompoundTag.putImpreciseFraction(key: String, value: ImpreciseFraction) = put(key, value.serializeNBT()) operator fun CompoundTag.set(key: String, value: ImpreciseFraction) = putImpreciseFraction(key, value) +fun Float.toImpreciseFraction() = ImpreciseFraction(this) +fun Double.toImpreciseFraction() = ImpreciseFraction(this) +fun Int.toImpreciseFraction() = ImpreciseFraction(this) +fun Byte.toImpreciseFraction() = ImpreciseFraction(this) +fun Short.toImpreciseFraction() = ImpreciseFraction(this) +fun Long.toImpreciseFraction() = ImpreciseFraction(this) +fun ImpreciseFraction.toImpreciseFraction() = this \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/UnOverengineering.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/UnOverengineering.kt similarity index 96% rename from src/main/kotlin/ru/dbotthepony/mc/otm/UnOverengineering.kt rename to src/main/kotlin/ru/dbotthepony/mc/otm/core/UnOverengineering.kt index 4a48fdd83..276203b8e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/UnOverengineering.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/UnOverengineering.kt @@ -1,4 +1,4 @@ -package ru.dbotthepony.mc.otm +package ru.dbotthepony.mc.otm.core import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.chat.MutableComponent diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt index 68b92888d..47a4e6b68 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/data/LootTableAppender.kt @@ -17,7 +17,7 @@ import net.minecraft.world.level.storage.loot.predicates.LootItemCondition import net.minecraftforge.common.loot.IGlobalLootModifier import net.minecraftforge.common.loot.LootModifier import net.minecraftforge.registries.ForgeRegistries -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName // 1.19 do be like overengineering already overengineered stuff beyond any recognition private fun getJson(it: Dynamic): JsonElement { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/storage/StorageNetworkGraph.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/storage/StorageNetworkGraph.kt index d53d90d52..87422a09a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/graph/storage/StorageNetworkGraph.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/graph/storage/StorageNetworkGraph.kt @@ -10,7 +10,7 @@ import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.graph.Abstract6Graph import ru.dbotthepony.mc.otm.graph.Graph6Node -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.storage.* import java.util.LinkedList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt index e392d9476..7065ae104 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/BatteryItem.kt @@ -10,12 +10,12 @@ import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.EnergyCapacitorItem import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.formatPower -import ru.dbotthepony.mc.otm.ifPresentK +import ru.dbotthepony.mc.otm.core.ifPresentK class BatteryItem : Item { private inner class BatteryMatteryCapability(stack: ItemStack) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/EnergySwordItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/EnergySwordItem.kt index f510b065f..a71176ad2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/EnergySwordItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/EnergySwordItem.kt @@ -22,8 +22,7 @@ import net.minecraft.world.level.material.Material import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.* -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.formatPower +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.registry.EMPDamageSource class EnergySwordItem : Item(Properties().stacksTo(1).rarity(Rarity.RARE).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/ExoSuitProbeItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/ExoSuitProbeItem.kt index ca8a10461..e9b80a138 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/ExoSuitProbeItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/ExoSuitProbeItem.kt @@ -10,7 +10,7 @@ import net.minecraft.world.entity.player.Player import net.minecraft.world.item.* import net.minecraft.world.level.Level import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.addPostTickTimer import ru.dbotthepony.mc.otm.capability.matteryPlayer import ru.dbotthepony.mc.otm.client.minecraft diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/GravitationalDisruptorItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/GravitationalDisruptorItem.kt index 31726c74a..df6c8e937 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/GravitationalDisruptorItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/GravitationalDisruptorItem.kt @@ -8,7 +8,7 @@ import net.minecraft.network.chat.Component import net.minecraft.world.item.Item import net.minecraft.world.item.Rarity import net.minecraft.world.level.Level -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent class GravitationalDisruptorItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB).stacksTo(1).rarity(Rarity.EPIC)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterCapacitorItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterCapacitorItem.kt index 86fef7b4d..d7bdd7b49 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterCapacitorItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterCapacitorItem.kt @@ -14,7 +14,7 @@ import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler import ru.dbotthepony.mc.otm.capability.matter.MatterDirection diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt index e2bb0dc54..8461b09f3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt @@ -7,11 +7,11 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.TooltipFlag import net.minecraft.world.level.Level import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.matter.MatterTuple -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB).stacksTo(64)), IMatterItem { private fun matter(stack: ItemStack): ImpreciseFraction { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PatternStorageItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PatternStorageItem.kt index 8c15cc9e4..d0b542d6d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PatternStorageItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PatternStorageItem.kt @@ -14,9 +14,9 @@ import net.minecraft.network.chat.Component import net.minecraft.world.item.Item import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.matter.* -import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.core.ifHas import java.util.* class PatternStorageItem : Item { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PillItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PillItem.kt index 8060e36a6..ac7026454 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PillItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PillItem.kt @@ -13,7 +13,7 @@ import net.minecraft.world.item.* import net.minecraft.world.level.Level import net.minecraftforge.common.util.FakePlayer import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.MatteryCapability enum class PillType { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableCondensationDriveItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableCondensationDriveItem.kt index 746d2b61a..fedb6b256 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableCondensationDriveItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableCondensationDriveItem.kt @@ -21,12 +21,10 @@ import net.minecraftforge.event.ForgeEventFactory import net.minecraftforge.eventbus.api.SubscribeEvent import net.minecraftforge.event.entity.player.EntityItemPickupEvent import net.minecraftforge.eventbus.api.EventPriority -import ru.dbotthepony.mc.otm.TextComponent +import ru.dbotthepony.mc.otm.core.TextComponent import ru.dbotthepony.mc.otm.capability.drive.DrivePool import ru.dbotthepony.mc.otm.container.ItemFilter -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.ifHas -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.ifHas import java.math.BigInteger import java.util.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableGravitationStabilizerItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableGravitationStabilizerItem.kt index bf7522b40..16c39dc80 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableGravitationStabilizerItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/PortableGravitationStabilizerItem.kt @@ -12,7 +12,7 @@ import net.minecraft.world.item.crafting.Ingredient import net.minecraft.world.level.Level import net.minecraftforge.client.extensions.common.IClientItemExtensions import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.model.GravitationStabilizerModel import java.util.function.Consumer diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt index 01fada0aa..9915197ba 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt @@ -3,7 +3,6 @@ package ru.dbotthepony.mc.otm.item import net.minecraft.ChatFormatting import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag -import net.minecraft.nbt.IntTag import net.minecraft.network.chat.Component import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack @@ -13,13 +12,11 @@ import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider -import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.MatteryCapability -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.formatPower +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.saveddata.SavedCountingMap import ru.dbotthepony.mc.otm.saveddata.SavedMapDelegate @@ -209,7 +206,8 @@ class QuantumBatteryItem : Item { components.add(TranslatableComponent("otm.item.quantum_battery.creative2").withStyle(ChatFormatting.DARK_GRAY)) } else { components.add(TranslatableComponent("otm.item.power.normal.storage", power.batteryLevel.formatPower(), capacity!!.formatPower()).withStyle(ChatFormatting.GRAY)) - components.add(TranslatableComponent( + components.add( + TranslatableComponent( "otm.item.power.normal.throughput", throughput!!.formatPower(), throughput.formatPower() diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaRifleItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaRifleItem.kt index f13e00e28..86a5c6de9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaRifleItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaRifleItem.kt @@ -10,7 +10,7 @@ import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.entity.PlasmaProjectile -import ru.dbotthepony.mc.otm.position +import ru.dbotthepony.mc.otm.core.position import ru.dbotthepony.mc.otm.registry.MSoundEvents import java.util.* import kotlin.math.PI diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaWeaponItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaWeaponItem.kt index 8ff4602c0..6dc3909b4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaWeaponItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/weapon/PlasmaWeaponItem.kt @@ -15,12 +15,9 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.energy.CapabilityEnergy import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.* -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.bezierCurve -import ru.dbotthepony.mc.otm.core.formatPower +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.registry.MSoundEvents import kotlin.reflect.KClass diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterRegistry.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterRegistry.kt index a4b47044a..bd5b1915c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterRegistry.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/matter/MatterRegistry.kt @@ -4,14 +4,11 @@ import com.mojang.blaze3d.platform.InputConstants import net.minecraft.ChatFormatting import net.minecraft.client.Minecraft import net.minecraft.network.FriendlyByteBuf -import net.minecraft.server.dedicated.DedicatedServer import net.minecraft.server.level.ServerPlayer import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack import net.minecraftforge.event.entity.player.ItemTooltipEvent import net.minecraftforge.event.entity.player.PlayerEvent -import net.minecraftforge.event.server.ServerStartedEvent -import net.minecraftforge.event.server.ServerStoppingEvent import net.minecraftforge.eventbus.api.SubscribeEvent import net.minecraftforge.network.NetworkEvent import net.minecraftforge.network.PacketDistributor diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/BatteryBankMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/BatteryBankMenu.kt index 9cb34abd8..9cd7da508 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/BatteryBankMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/BatteryBankMenu.kt @@ -7,10 +7,10 @@ import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.block.entity.BatteryBankBlockEntity import net.minecraft.world.SimpleContainer import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.capability.MatteryCapability -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MMenus class BatteryBankMenu @JvmOverloads constructor( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/CargoCrateMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/CargoCrateMenu.kt index 01697b220..ca384b4ff 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/CargoCrateMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/CargoCrateMenu.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.menu import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.block.entity.CargoCrateBlockEntity import ru.dbotthepony.mc.otm.registry.MMenus diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveRackMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveRackMenu.kt index 5d2d5451d..c65d34795 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveRackMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveRackMenu.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.menu import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.block.entity.storage.DriveRackBlockEntity import ru.dbotthepony.mc.otm.registry.MMenus diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt index f0ba4fe8c..8656ee98d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.kt @@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.block.entity.storage.DriveViewerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.drive.IMatteryDrive import ru.dbotthepony.mc.otm.container.ItemFilter -import ru.dbotthepony.mc.otm.ifPresentK +import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt index f6a840f38..f19022acb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -10,7 +10,7 @@ import net.minecraft.world.item.ItemStack import net.minecraftforge.network.PacketDistributor import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings -import ru.dbotthepony.mc.otm.get +import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView import ru.dbotthepony.mc.otm.network.MenuNetworkChannel diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.kt index 44920deb3..242a84bb4 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterBottlerMenu.kt @@ -4,13 +4,13 @@ import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.block.entity.matter.MatterBottlerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.menu.widget.BooleanPlayerInputWidget import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MMenus class MatterBottlerMenu @JvmOverloads constructor( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterCapacitorBankMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterCapacitorBankMenu.kt index b20cd9789..e8fa42f17 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterCapacitorBankMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterCapacitorBankMenu.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.menu import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.block.entity.matter.MatterCapacitorBankBlockEntity import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.kt index 2d1d57858..38d1f3391 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.kt @@ -11,7 +11,7 @@ import net.minecraft.world.inventory.Slot import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.matter.canDecompose -import ru.dbotthepony.mc.otm.orNull +import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MMenus class MatterDecomposerMenu @JvmOverloads constructor( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.kt index 73f509ba6..39e16d5d3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.kt @@ -7,7 +7,7 @@ import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget import net.minecraft.world.SimpleContainer import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.registry.MMenus class MatterReplicatorMenu @JvmOverloads constructor( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PatternStorageMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PatternStorageMenu.kt index bb64c1874..b26c70b99 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PatternStorageMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PatternStorageMenu.kt @@ -3,7 +3,7 @@ package ru.dbotthepony.mc.otm.menu import net.minecraft.world.SimpleContainer import net.minecraft.world.entity.player.Inventory import net.minecraft.world.inventory.Slot -import ru.dbotthepony.mc.otm.ImmutableList +import ru.dbotthepony.mc.otm.core.ImmutableList import ru.dbotthepony.mc.otm.block.entity.PatternStorageBlockEntity import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt index b0ebffbb5..df7e019eb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/Slots.kt @@ -7,7 +7,7 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.energy.CapabilityEnergy import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.matter.MatterDirection -import ru.dbotthepony.mc.otm.ifPresentK +import ru.dbotthepony.mc.otm.core.ifPresentK open class MatterySlot @JvmOverloads constructor(p_40223_: Container, index: Int, x: Int = 0, y: Int = 0) : Slot(p_40223_, index, x, y) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.kt index f13cadc5b..1da47bdb9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.kt @@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.core.readBigInteger import ru.dbotthepony.mc.otm.core.writeBigInteger import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.network.* -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt index d7943d2bb..6ad6e783b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/FieldSynchronizer.kt @@ -2,10 +2,7 @@ package ru.dbotthepony.mc.otm.network import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import net.minecraft.world.item.ItemStack -import ru.dbotthepony.mc.otm.* -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.readImpreciseFraction -import ru.dbotthepony.mc.otm.core.writeImpreciseFraction +import ru.dbotthepony.mc.otm.core.* import java.io.DataInputStream import java.io.DataOutputStream import java.io.InputStream @@ -13,8 +10,6 @@ import java.math.BigDecimal import java.util.* import kotlin.collections.ArrayList import kotlin.properties.ReadWriteProperty -import kotlin.reflect.KClass -import kotlin.reflect.KMutableProperty import kotlin.reflect.KMutableProperty0 import kotlin.reflect.KProperty diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt index 613795358..b4a9b54ca 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt @@ -7,8 +7,8 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries -import ru.dbotthepony.mc.otm.registryName -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.registryName +import ru.dbotthepony.mc.otm.core.set fun stackFromJson(obj: JsonElement, field: String = ""): ItemStack { if (obj is JsonPrimitive) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt index e4e7dfd37..88e403183 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt @@ -15,10 +15,9 @@ import net.minecraft.world.level.Level import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.block.entity.PlatePressBlockEntity -import ru.dbotthepony.mc.otm.get -import ru.dbotthepony.mc.otm.registry.MNames +import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.registry.MRecipes -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName class PlatePressRecipe( private val id: ResourceLocation, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidResearch.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidResearch.kt index 956568741..96a1978a1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/AndroidResearch.kt @@ -8,8 +8,8 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.RegistryObject import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TextComponent -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TextComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.android.AndroidResearchBuilder import ru.dbotthepony.mc.otm.android.AndroidResearchType import ru.dbotthepony.mc.otm.android.feature.NanobotsArmor diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/DamageSources.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/DamageSources.kt index e2c54aa84..ed4425028 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/DamageSources.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/DamageSources.kt @@ -6,7 +6,7 @@ import net.minecraft.world.entity.Entity import net.minecraft.world.entity.LivingEntity import net.minecraft.world.item.ItemStack import net.minecraft.world.phys.Vec3 -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent class ImmutableDamageSource(private val parent: DamageSource) : DamageSource(parent.msgId) { override fun equals(other: Any?): Boolean { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 0cd5bfc60..8400e18a8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -14,7 +14,7 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext import net.minecraftforge.registries.DeferredRegister import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.OverdriveThatMatters -import ru.dbotthepony.mc.otm.TranslatableComponent +import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.item.* import ru.dbotthepony.mc.otm.item.weapon.PlasmaRifleItem diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt index 39c570b7d..60031c7de 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt @@ -8,7 +8,7 @@ import net.minecraft.nbt.ListTag import net.minecraft.nbt.Tag import net.minecraft.world.level.saveddata.SavedData import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.set +import ru.dbotthepony.mc.otm.core.set class SavedMapDelegate(val parent: SavedCountingMap>?, val index: Int, value: V) { constructor(value: V) : this(null, -1, value) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/ItemStackWrapper.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/ItemStackWrapper.kt index c8c046fa2..4ba6e3e5d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/storage/ItemStackWrapper.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/storage/ItemStackWrapper.kt @@ -1,13 +1,10 @@ package ru.dbotthepony.mc.otm.storage import net.minecraft.network.FriendlyByteBuf -import net.minecraft.world.item.Item import net.minecraft.world.item.ItemStack -import net.minecraftforge.registries.ForgeRegistries -import net.minecraftforge.registries.ForgeRegistry import org.jetbrains.annotations.ApiStatus import ru.dbotthepony.mc.otm.core.* -import ru.dbotthepony.mc.otm.registryName +import ru.dbotthepony.mc.otm.core.registryName import java.math.BigInteger /** diff --git a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FriendlyStreams.kt b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FriendlyStreams.kt index 1d5fcc692..61525fff7 100644 --- a/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FriendlyStreams.kt +++ b/src/test/kotlin/ru/dbotthepony/mc/otm/tests/FriendlyStreams.kt @@ -5,10 +5,10 @@ import it.unimi.dsi.fastutil.io.FastByteArrayOutputStream import org.junit.jupiter.api.Assertions.assertEquals import org.junit.jupiter.api.DisplayName import org.junit.jupiter.api.Test -import ru.dbotthepony.mc.otm.readInt -import ru.dbotthepony.mc.otm.readVarIntLE -import ru.dbotthepony.mc.otm.writeInt -import ru.dbotthepony.mc.otm.writeVarIntLE +import ru.dbotthepony.mc.otm.core.readInt +import ru.dbotthepony.mc.otm.core.readVarIntLE +import ru.dbotthepony.mc.otm.core.writeInt +import ru.dbotthepony.mc.otm.core.writeVarIntLE object FriendlyStreams { @Test From 4972ae5de73ae872247013b666cb0a9f25137d39 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 20:58:13 +0700 Subject: [PATCH 05/39] A little removal --- .../mc/otm/core/CompoundTagDelegates.kt | 2 +- .../dbotthepony/mc/otm/core/CompoundTagExt.kt | 10 ------- .../ru/dbotthepony/mc/otm/core/EuclidMath.kt | 26 +++++++++---------- 3 files changed, 14 insertions(+), 24 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt index 828ff6520..2abb0af3a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagDelegates.kt @@ -75,4 +75,4 @@ val CompoundTag.floats get() = CompoundTagFloat(this) val CompoundTag.doubles get() = CompoundTagDouble(this) val CompoundTag.booleans get() = CompoundTagBoolean(this) val CompoundTag.strings get() = CompoundTagString(this) -val CompoundTag.uuids get() = CompoundTagUUID(this) \ No newline at end of file +val CompoundTag.uuids get() = CompoundTagUUID(this) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt index 7c78e7105..5e8f59e33 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CompoundTagExt.kt @@ -26,16 +26,6 @@ inline fun CompoundTag.map(s: String, consumer: (T) -> R): return null } -inline fun CompoundTag.ifCompound(s: String, consumer: (CompoundTag) -> T): T? { - val tag = get(s) - - if (tag is CompoundTag) { - return consumer(tag) - } - - return null -} - inline fun CompoundTag.ifHas(s: String, consumer: (Tag) -> Unit) { val tag = get(s) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt index e73b62447..d398711fa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/EuclidMath.kt @@ -10,12 +10,12 @@ import kotlin.math.* typealias Vector = Vec3 -@JvmField val VECTOR_UP = Vector(0.0, 1.0, 0.0) -@JvmField val VECTOR_FORWARD = Vector(1.0, 0.0, 0.0) -@JvmField val VECTOR_BACKWARD = Vector(-1.0, 0.0, 0.0) -@JvmField val VECTOR_DOWN = Vector(0.0, -1.0, 0.0) -@JvmField val VECTOR_RIGHT = Vector(0.0, 0.0, 1.0) -@JvmField val VECTOR_LEFT = Vector(0.0, 0.0, -1.0) +val VECTOR_UP = Vector(0.0, 1.0, 0.0) +val VECTOR_FORWARD = Vector(1.0, 0.0, 0.0) +val VECTOR_BACKWARD = Vector(-1.0, 0.0, 0.0) +val VECTOR_DOWN = Vector(0.0, -1.0, 0.0) +val VECTOR_RIGHT = Vector(0.0, 0.0, 1.0) +val VECTOR_LEFT = Vector(0.0, 0.0, -1.0) fun Vector.asAngle(): Angle { val norm = normalize() @@ -245,13 +245,13 @@ data class Angle(override val pitch: Double = 0.0, override val yaw: Double = 0. return Angle(Math.toRadians(pitch), Math.toRadians(yaw), Math.toRadians(roll)) } - @JvmField val ZERO = Angle() - @JvmField val UP = Angle(pitch = PI / 2) - @JvmField val DOWN = Angle(pitch = -PI / 2) - @JvmField val NORTH = Angle() - @JvmField val SOUTH = Angle(yaw = PI) - @JvmField val WEST = Angle(yaw = PI / 2) - @JvmField val EAST = Angle(yaw = -PI / 2) + val ZERO = Angle() + val UP = Angle(pitch = PI / 2) + val DOWN = Angle(pitch = -PI / 2) + val NORTH = Angle() + val SOUTH = Angle(yaw = PI) + val WEST = Angle(yaw = PI / 2) + val EAST = Angle(yaw = -PI / 2) } } From ea701e70c917458769dfb476d79e8609458298b3 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Thu, 1 Sep 2022 21:20:15 +0700 Subject: [PATCH 06/39] Fix plate press recipe --- .../datagen/recipes/CraftingTableRecipes.kt | 16 ++++++++++++++ .../ru/dbotthepony/mc/otm/registry/Tags.kt | 2 ++ .../data/forge/tags/items/pistons.json | 6 ++++++ .../recipes/machines/plate_press.json | 21 ------------------- 4 files changed, 24 insertions(+), 21 deletions(-) create mode 100644 src/main/resources/data/forge/tags/items/pistons.json delete mode 100644 src/main/resources/data/overdrive_that_matters/recipes/machines/plate_press.json diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt index 7fc4d0d44..f1b60c234 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/CraftingTableRecipes.kt @@ -53,6 +53,22 @@ fun addCraftingTableRecipes(consumer: Consumer) { .build(consumer) } + MatteryRecipe(MBlocks.PLATE_PRESS) + .row(MItems.ELECTRIC_PARTS, MItems.ENERGY_BUS, MItems.ELECTRIC_PARTS) + .row(MItemTags.INGOT_TRITANIUM, Items.BLAST_FURNACE, MItemTags.INGOT_TRITANIUM) + .row(MItemTags.PISTONS, MItemTags.INGOT_TRITANIUM, MItemTags.PISTONS) + .unlockedBy(MItemTags.INGOT_TRITANIUM) + .unlockedBy(MItems.ELECTRIC_PARTS) + .build(consumer) + + MatteryRecipe(MBlocks.PLATE_PRESS) + .rowB(MItemTags.BASIC_CIRCUIT) + .row(MItemTags.PLATE_TRITANIUM, MItems.MACHINE_FRAME, MItemTags.PLATE_TRITANIUM) + .rowAC(MItemTags.PISTONS, MItemTags.PISTONS) + .unlockedBy(MItemTags.INGOT_TRITANIUM) + .unlockedBy(MItems.ELECTRIC_PARTS) + .build(consumer, "advanced") + MatteryRecipe(MBlocks.TRITANIUM_STRIPED_BLOCK, 24) .rowB(MItemTags.PLATE_TRITANIUM) .row(MItemTags.PLATE_TRITANIUM, COBBLESTONE, MItemTags.PLATE_TRITANIUM) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt index 4b2d7c53e..bc34bc02f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/Tags.kt @@ -18,4 +18,6 @@ object MItemTags { val COPPER_WIRES: TagKey = ItemTags.create(ResourceLocation("forge", "wires/copper")) val GOLD_WIRES: TagKey = ItemTags.create(ResourceLocation("forge", "wires/gold")) + + val PISTONS: TagKey = ItemTags.create(ResourceLocation("forge", "pistons")) } diff --git a/src/main/resources/data/forge/tags/items/pistons.json b/src/main/resources/data/forge/tags/items/pistons.json new file mode 100644 index 000000000..35e87b669 --- /dev/null +++ b/src/main/resources/data/forge/tags/items/pistons.json @@ -0,0 +1,6 @@ +{ + "replace": false, + "values": [ + "minecraft:piston" + ] +} \ No newline at end of file diff --git a/src/main/resources/data/overdrive_that_matters/recipes/machines/plate_press.json b/src/main/resources/data/overdrive_that_matters/recipes/machines/plate_press.json deleted file mode 100644 index 6278d483c..000000000 --- a/src/main/resources/data/overdrive_that_matters/recipes/machines/plate_press.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "type": "minecraft:crafting_shaped", - - "pattern": [ - " E ", - "TFT", - "P P" - ], - - "key": { - "P": {"item": "minecraft:piston"}, - "T": {"tag": "forge:ingots/tritanium"}, - "E": {"item": "overdrive_that_matters:electric_parts"}, - "F": {"item": "overdrive_that_matters:machine_frame"} - }, - - "result": { - "item": "overdrive_that_matters:plate_press", - "count": 1 - } -} \ No newline at end of file From e6b8b9b409265df8e00b2e6d546701ba98b5fc00 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 00:00:07 +0700 Subject: [PATCH 07/39] Clean up container iterators and move container extensions --- .../otm/datagen/models/MatteryModelBuilder.kt | 2 +- .../recipes/PlatePressFinishedRecipe.kt | 2 +- .../mc/otm/android/AndroidFeature.kt | 2 +- .../mc/otm/android/AndroidResearch.kt | 2 +- .../mc/otm/android/AndroidResearchBuilder.kt | 4 +- .../mc/otm/android/feature/NanobotsArmor.kt | 2 +- .../android/feature/NanobotsRegeneration.kt | 2 +- .../otm/block/entity/CargoCrateBlockEntity.kt | 2 +- .../mc/otm/block/entity/MatteryBlockEntity.kt | 2 +- .../block/entity/MatteryPoweredBlockEntity.kt | 2 +- .../block/entity/MatteryWorkerBlockEntity.kt | 1 - .../block/entity/PatternStorageBlockEntity.kt | 18 +- .../otm/block/entity/PlatePressBlockEntity.kt | 2 +- .../entity/blackhole/BlackHoleBlockEntity.kt | 2 +- .../otm/block/entity/blackhole/Explosions.kt | 1 - .../entity/matter/MatterBottlerBlockEntity.kt | 2 +- .../matter/MatterCapacitorBankBlockEntity.kt | 2 +- .../matter/MatterDecomposerBlockEntity.kt | 2 +- .../matter/MatterRecyclerBlockEntity.kt | 2 +- .../matter/MatterReplicatorBlockEntity.kt | 2 +- .../entity/storage/DriveRackBlockEntity.kt | 2 +- .../entity/storage/DriveViewerBlockEntity.kt | 2 +- .../entity/storage/ItemMonitorBlockEntity.kt | 4 +- .../StoragePowerSupplierBlockEntity.kt | 2 +- .../mc/otm/capability/EnergyStorageImpl.kt | 2 +- .../ru/dbotthepony/mc/otm/capability/Ext.kt | 1 + .../capability/drive/AbstractMatteryDrive.kt | 2 +- .../otm/capability/drive/ItemMatteryDrive.kt | 2 +- .../capability/matter/MatterHandlerImpl.kt | 2 +- .../ru/dbotthepony/mc/otm/container/Ext.kt | 69 +++++++ .../mc/otm/container/ItemFilter.kt | 2 +- .../dbotthepony/mc/otm/container/Iterators.kt | 188 ++++++++++++------ .../mc/otm/container/MatteryContainer.kt | 133 +------------ .../kotlin/ru/dbotthepony/mc/otm/core/Ext.kt | 4 - .../dbotthepony/mc/otm/item/MatterDustItem.kt | 2 +- .../mc/otm/menu/ItemMonitorMenu.kt | 7 +- .../ru/dbotthepony/mc/otm/recipe/Helpers.kt | 2 +- .../mc/otm/recipe/PlatePressRecipe.kt | 2 +- .../mc/otm/saveddata/SavedCountingMap.kt | 2 +- 39 files changed, 252 insertions(+), 234 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt index 6fa6c91d5..2161c17e1 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt @@ -9,7 +9,7 @@ import net.minecraft.core.Direction import net.minecraft.resources.ResourceLocation import net.minecraftforge.client.model.generators.ModelBuilder import net.minecraftforge.common.data.ExistingFileHelper -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set data class TextureSize(val width: Float, val height: Float) { constructor(arr: JsonArray) : this(arr[0].asFloat, arr[1].asFloat) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt index 89e9017b7..63bc0b607 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt @@ -7,7 +7,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.crafting.RecipeSerializer import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipeFactory -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class PlatePressFinishedRecipe(private val recipe: PlatePressRecipe) : FinishedRecipe { override fun serializeRecipeData(it: JsonObject) { 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 8d2995144..c66373f78 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt @@ -5,7 +5,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.readNbt -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream 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 877147834..265b2300d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -8,7 +8,7 @@ import net.minecraftforge.common.util.INBTSerializable import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.core.readNbt -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt index 11404474b..6084ce9d9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt @@ -8,7 +8,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.SkinElement -import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.container.nonEmptyIterator import ru.dbotthepony.mc.otm.registry.MRegistry import kotlin.collections.ArrayList @@ -260,7 +260,7 @@ class AndroidResearchBuilder( for (item in items) { var required = item.count - val iterator = capability.ply.inventory.iterator() + val iterator = capability.ply.inventory.nonEmptyIterator() for (invItem in iterator) { if (ItemStack.isSameItemSameTags(invItem, item)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt index 28adbae4e..02634802f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt @@ -9,7 +9,7 @@ import ru.dbotthepony.mc.otm.capability.extractEnergyInnerExact import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt class NanobotsArmor(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt index aa25381df..035e9682a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt @@ -8,7 +8,7 @@ import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt class NanobotsRegeneration(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_REGENERATION, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index 8c1017719..16bf06923 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -17,7 +17,7 @@ import ru.dbotthepony.mc.otm.block.CargoCrateBlock import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.CargoCrateMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class CargoCrateBlockEntity( p_155229_: BlockPos, 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 b3015f563..101207242 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 @@ -24,7 +24,7 @@ import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : BlockEntity(p_155228_, p_155229_, p_155230_), MenuProvider { var customDisplayName: Component? = null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt index 1a6992a54..dc51e3aec 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt @@ -13,7 +13,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.core.ifPresentK -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set abstract class MatteryPoweredBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : MatteryBlockEntity(p_155228_, p_155229_, p_155230_) { abstract val energy: BlockEnergyStorageImpl diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt index 8444518c4..7c1c07db1 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryWorkerBlockEntity.kt @@ -8,7 +8,6 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.level.block.Block import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.map -import ru.dbotthepony.mc.otm.core.set private fun isReason(status: Any?, reason: Any) = status == null || status == reason diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt index ea0ff7f61..7ab535bbe 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt @@ -21,13 +21,17 @@ import net.minecraft.server.level.ServerLevel import net.minecraft.world.level.Level import net.minecraft.world.level.block.Block import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ForgeCapabilities import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.matter.* +import ru.dbotthepony.mc.otm.container.forEachCapability +import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.registry.MBlockEntities +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.set import java.util.ArrayList @@ -130,9 +134,9 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun getCapability(cap: Capability, side: Direction?): LazyOptional { if (valid) { - if (cap === MatteryCapability.PATTERN) return resolverPatterns.cast() - if (cap === MatteryCapability.MATTER_NODE) return resolverNode.cast() - if (cap === CapabilityItemHandler.ITEM_HANDLER_CAPABILITY) return resolverItem.get().cast() + if (cap == MatteryCapability.PATTERN) return resolverPatterns.cast() + if (cap == MatteryCapability.MATTER_NODE) return resolverNode.cast() + if (cap == ForgeCapabilities.ITEM_HANDLER) return resolverItem.get().cast() } return super.getCapability(cap, side) @@ -147,14 +151,14 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val storedPatterns: Collection get() { val list = ArrayList() - patterns.consumeCapability(MatteryCapability.PATTERN) { capability: IPatternStorage -> list.addAll(capability.storedPatterns) } + patterns.forEachCapability(MatteryCapability.PATTERN) { capability: IPatternStorage -> list.addAll(capability.storedPatterns) } return list } override val capacity: Int get() { var stored = 0L - for (pattern in patterns.capabilityIterator(MatteryCapability.PATTERN)) + for ((_, pattern) in patterns.iterator(MatteryCapability.PATTERN)) stored += pattern.capacity.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -163,7 +167,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override val stored: Int get() { var stored = 0L - for (pattern in patterns.capabilityIterator(MatteryCapability.PATTERN)) + for ((_, pattern) in patterns.iterator(MatteryCapability.PATTERN)) stored += pattern.stored.toLong() return if (stored > Int.MAX_VALUE) Int.MAX_VALUE else stored.toInt() @@ -175,7 +179,7 @@ class PatternStorageBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } override fun insertPattern(pattern: PatternState, only_update: Boolean, simulate: Boolean): PatternInsertStatus { - for (storage in patterns.capabilityIterator(MatteryCapability.PATTERN)) { + for ((_, storage) in patterns.iterator(MatteryCapability.PATTERN)) { val status = storage.insertPattern(pattern, only_update, simulate) if (!status.isFailed) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt index b11e4198a..11b53bd64 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.menu.PlatePressMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MRecipes -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class PlatePressBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt index 9a9a0e7e5..4a2d7a605 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import kotlin.math.roundToInt import kotlin.math.sqrt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt index 6658bee64..128e2bd75 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/Explosions.kt @@ -23,7 +23,6 @@ import ru.dbotthepony.mc.otm.block.BlockExplosionDebugger import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.core.Vector import ru.dbotthepony.mc.otm.registry.MRegistry -import ru.dbotthepony.mc.otm.core.set import java.util.* import kotlin.collections.ArrayList import kotlin.collections.HashMap diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt index 3df8e9272..b532fdfd9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt @@ -33,7 +33,7 @@ import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, p_155229_, p_155230_), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt index 16a61ba03..32e578c82 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt @@ -28,7 +28,7 @@ import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index e0424ec1f..137f61053 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -26,7 +26,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilter import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.getImpreciseFraction -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index 32ad74dc3..f2a05c9bb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.item.MatterDustItem import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.menu.MatterRecyclerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode { 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 ea4739a2a..dc507cba0 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 @@ -31,7 +31,7 @@ import ru.dbotthepony.mc.otm.matter.baselineComplexityReplicateTicks import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_, ::ReplicatorJob), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt index bdbf858b5..e6eccd271 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.DriveRackMenu -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.storage.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt index d59a2ded3..550e0e9c0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt @@ -20,7 +20,7 @@ import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.DriveViewerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt index eae1e3bd4..053f12a74 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt @@ -32,14 +32,14 @@ import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.graph.storage.BasicStorageGraphNode import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt index ab7eec48b..0f60e574a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt @@ -24,7 +24,7 @@ import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MNames -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class StoragePowerSupplierBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.STORAGE_POWER_SUPPLIER, blockPos, blockState) { override val defaultDisplayName: Component diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt index 661685bea..ea34cb555 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt @@ -15,7 +15,7 @@ import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.compat.mekanism.MatteryToMekanismEnergyWrapper import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.tagNotNull private enum class EnergyFlow { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 171556ca2..314235255 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.capability import net.minecraft.core.Direction import net.minecraft.world.entity.LivingEntity +import net.minecraft.world.entity.player.Player import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt index 66af62358..ba8b3f94c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt @@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.core.BigInteger import ru.dbotthepony.mc.otm.core.isPositive import ru.dbotthepony.mc.otm.core.serializeNBT import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt index f9b5eec28..34915f30c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt @@ -9,7 +9,7 @@ import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.core.BigInteger import ru.dbotthepony.mc.otm.core.serializeNBT -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.storage.IStorageTuple import ru.dbotthepony.mc.otm.storage.ItemStackWrapper import ru.dbotthepony.mc.otm.storage.StorageStackType diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt index 056bbfc91..957363eb0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt @@ -4,7 +4,7 @@ import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set open class MatterHandlerImpl @JvmOverloads constructor( protected val listener: Runnable?, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt new file mode 100644 index 000000000..4968ceb58 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Ext.kt @@ -0,0 +1,69 @@ +package ru.dbotthepony.mc.otm.container + +import net.minecraft.world.Container +import net.minecraft.world.item.ItemStack + +operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) +operator fun Container.get(index: Int): ItemStack = getItem(index) + +fun Container.addItem(stack: ItemStack, range: IntRange, simulate: Boolean = false): ItemStack { + if (this is MatteryContainer) { + return this.addItem(stack, range, simulate) + } + + if (range.last >= containerSize || range.first < 0) + throw IllegalArgumentException("Invalid range: $range") + + if (stack.isEmpty) + return stack + + val copy = stack.copy() + + // двигаем в одинаковые слоты + for (slot in range) { + if (ItemStack.isSameItemSameTags(this[slot], copy)) { + val slotStack = this[slot] + val slotLimit = maxStackSize.coerceAtMost(slotStack.maxStackSize) + + if (slotStack.count < slotLimit) { + val newCount = (slotStack.count + copy.count).coerceAtMost(slotLimit) + val diff = newCount - slotStack.count + + if (!simulate) { + slotStack.count = newCount + setChanged() + } + + copy.shrink(diff) + + if (copy.isEmpty) { + return copy + } + } + } + } + + // двигаем в пустые слоты + for (slot in range) { + if (this[slot].isEmpty) { + val diff = copy.count.coerceAtMost(maxStackSize.coerceAtMost(copy.maxStackSize)) + + if (!simulate) { + val copyToPut = copy.copy() + copyToPut.count = diff + this[slot] = copyToPut + setChanged() + } + + copy.shrink(diff) + + if (copy.isEmpty) { + return copy + } + } + } + + return copy +} + +fun Container.addItem(stack: ItemStack, simulate: Boolean): ItemStack = addItem(stack, 0 until containerSize, simulate) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt index cca0c9991..a0bcb3fbc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt @@ -14,7 +14,7 @@ import ru.dbotthepony.mc.otm.client.minecraft import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.network.MatteryPacket -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set import java.util.Arrays import java.util.LinkedList import java.util.function.Supplier diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index 4d80d79e6..815fc66b7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -3,95 +3,163 @@ package ru.dbotthepony.mc.otm.container import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.core.ifPresentK import java.util.function.Consumer -class ContainerIteratorItemStack(private val container: Container) : MutableIterator, Iterable { - private var scanIndex = 0 - private var nextStack: ItemStack? = null - private var nextIndex = 0 +class ContainerIterator(private val container: Container) : MutableIterator { + private var index = 0 override fun hasNext(): Boolean { - if (scanIndex >= container.containerSize && nextStack == null) - return false - - while (nextStack == null && scanIndex < container.containerSize) { - val get = container.getItem(scanIndex) - - if (!get.isEmpty) { - nextStack = get - nextIndex = scanIndex - } - - scanIndex++ - } - - return nextStack != null + return index < container.containerSize } override fun next(): ItemStack { - if (!hasNext()) { - throw NoSuchElementException() + if (index >= container.containerSize) { + throw IllegalStateException("Already finished iterating") } - val nextStack = nextStack!! - this.nextStack = null - return nextStack + return container[index++] } override fun remove() { - container[nextIndex] = ItemStack.EMPTY - } - - override fun iterator(): Iterator { - return this - } - - fun consume(consumer: Consumer) { - for (t in this) { - consumer.accept(t) + if (index == 0) { + throw IllegalStateException("Never called next()") } + + container[index - 1] = ItemStack.EMPTY } } -fun Container.iterator() = ContainerIteratorItemStack(this) +fun Container.iterator() = ContainerIterator(this) -class ContainerIteratorCapability(private val container: Container, private val cap: Capability) : Iterator, Iterable { - private var index = 0 - private var nextStack: T? = null +class NonEmptyContainerIterator(container: Container) : MutableIterator { + private val parent = ContainerIterator(container) + private var itemStack: ItemStack? = null + private var searched = false + + private fun search() { + searched = true + + if (itemStack != null) { + return + } + + for (stack in parent) { + if (!stack.isEmpty) { + itemStack = stack + return + } + } + } override fun hasNext(): Boolean { - if (index >= container.containerSize && nextStack == null) - return false + if (!searched) { + search() + } - while (nextStack == null && index < container.containerSize) { - val get = container.getItem(index) + return itemStack != null + } - if (!get.isEmpty) { - get.getCapability(cap).ifPresent { t: T -> nextStack = t } + override fun next(): ItemStack { + if (!searched) { + search() + } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + this.itemStack = null + this.searched = false + return itemStack + } + + override fun remove() { + parent.remove() + } +} + +fun Container.nonEmptyIterator() = NonEmptyContainerIterator(this) + +class ContainerIteratorCapability(container: Container, private val cap: Capability) : MutableIterator> { + private val parent = NonEmptyContainerIterator(container) + private var itemStack: ItemStack? = null + private var capability: T? = null + private var searched = false + + private fun search() { + searched = true + + if (itemStack != null) { + return + } + + for (item in parent) { + item.getCapability(cap).ifPresentK { + itemStack = item + capability = it + return } + } + } - index++ + override fun hasNext(): Boolean { + if (!searched) { + search() } - return nextStack != null + return itemStack != null } - override fun next(): T { - val nextStack = nextStack!! - this.nextStack = null - return nextStack - } - - override fun iterator(): Iterator { - return this - } - - fun consume(consumer: Consumer) { - for (t in this) { - consumer.accept(t) + override fun next(): Pair { + if (!searched) { + search() } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + val capability = capability ?: throw IllegalStateException("No next element") + this.itemStack = null + this.capability = null + this.searched = false + return itemStack to capability + } + + override fun remove() { + parent.remove() } } fun Container.iterator(cap: Capability) = ContainerIteratorCapability(this, cap) + +inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { + for (value in iterator(cap)) { + consumer(value) + } +} + +inline fun Container.forEach(cap: Capability, consumer: (ItemStack, T) -> Unit) { + for ((a, b) in iterator(cap)) { + consumer(a, b) + } +} + +inline fun Container.forEachItem(cap: Capability, consumer: (ItemStack) -> Unit) { + for (pair in iterator(cap)) { + consumer(pair.first) + } +} + +inline fun Container.forEachCapability(cap: Capability, consumer: (T) -> Unit) { + for (pair in iterator(cap)) { + consumer(pair.second) + } +} + +inline fun Container.forEach(lambda: (ItemStack) -> Unit) { + for (value in iterator()) { + lambda(value) + } +} + +inline fun Container.forEachNonEmpty(lambda: (ItemStack) -> Unit) { + for (value in nonEmptyIterator()) { + lambda(value) + } +} 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 fb41c3afe..f0b721bcd 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/MatteryContainer.kt @@ -8,12 +8,8 @@ import net.minecraft.world.Container import kotlin.jvm.JvmOverloads import net.minecraft.world.entity.player.Player import net.minecraft.world.level.block.entity.BlockEntity -import net.minecraftforge.common.capabilities.Capability -import ru.dbotthepony.mc.otm.core.get import ru.dbotthepony.mc.otm.core.ifHas -import ru.dbotthepony.mc.otm.core.set import java.util.* -import java.util.function.Consumer @Suppress("UNUSED") open class MatteryContainer(val watcher: Runnable, private val size: Int) : Container, Iterable { @@ -71,7 +67,6 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont return } - // нам не интересен размер for (i in 0 until tag.size.coerceAtMost(size)) { slots[i] = ItemStack.of(tag[i] as CompoundTag) } @@ -80,46 +75,16 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont } fun deserializeNBT(tag: Tag?) { - if (tag is CompoundTag) { - deserializeNBT(tag) - } else if (tag is ListTag) { - deserializeNBT(tag) - } else { - Arrays.fill(slots, ItemStack.EMPTY) - setChanged() - } - } - - fun stacks(): ContainerIteratorItemStack { - return ContainerIteratorItemStack(this) - } - - fun forEachNonEmpty(consumer: (ItemStack) -> Unit) { - for (item in slots) { - if (!item.isEmpty) { - consumer(item) + when (tag) { + is CompoundTag -> deserializeNBT(tag) + is ListTag -> deserializeNBT(tag) + else -> { + Arrays.fill(slots, ItemStack.EMPTY) + setChanged() } } } - fun forEachNonEmpty(consumer: (ItemStack, Int) -> Unit) { - for (i in 0 until size) { - val item = slots[i] - - if (!item.isEmpty) { - consumer(item, i) - } - } - } - - fun capabilityIterator(cap: Capability): ContainerIteratorCapability { - return ContainerIteratorCapability(this, cap) - } - - fun consumeCapability(cap: Capability, consumer: Consumer) { - capabilityIterator(cap).consume(consumer) - } - open fun setChanged(slot: Int, new: ItemStack, old: ItemStack) { if (ignoreChangeNotifications == 0) watcher.run() } @@ -345,90 +310,6 @@ open class MatteryContainer(val watcher: Runnable, private val size: Int) : Cont } final override fun iterator(): MutableIterator { - return object : MutableIterator { - private var index = 0 - - override fun hasNext(): Boolean { - return index < size - } - - override fun next(): ItemStack { - if (index >= size) { - throw IllegalStateException("Already finished iterating") - } - - return slots[index++] - } - - override fun remove() { - if (index == 0) { - throw IllegalStateException("Never called next()") - } - - set(index - 1, ItemStack.EMPTY) - } - } + return ContainerIterator(this) } } - -fun Container.addItem(stack: ItemStack, range: IntRange, simulate: Boolean = false): ItemStack { - if (this is MatteryContainer) { - return this.addItem(stack, range, simulate) - } - - if (range.last >= containerSize || range.first < 0) - throw IllegalArgumentException("Invalid range: $range") - - if (stack.isEmpty) - return stack - - val copy = stack.copy() - - // двигаем в одинаковые слоты - for (slot in range) { - if (ItemStack.isSameItemSameTags(this[slot], copy)) { - val slotStack = this[slot] - val slotLimit = maxStackSize.coerceAtMost(slotStack.maxStackSize) - - if (slotStack.count < slotLimit) { - val newCount = (slotStack.count + copy.count).coerceAtMost(slotLimit) - val diff = newCount - slotStack.count - - if (!simulate) { - slotStack.count = newCount - setChanged() - } - - copy.shrink(diff) - - if (copy.isEmpty) { - return copy - } - } - } - } - - // двигаем в пустые слоты - for (slot in range) { - if (this[slot].isEmpty) { - val diff = copy.count.coerceAtMost(maxStackSize.coerceAtMost(copy.maxStackSize)) - - if (!simulate) { - val copyToPut = copy.copy() - copyToPut.count = diff - this[slot] = copyToPut - setChanged() - } - - copy.shrink(diff) - - if (copy.isEmpty) { - return copy - } - } - } - - return copy -} - -fun Container.addItem(stack: ItemStack, simulate: Boolean): ItemStack = addItem(stack, 0 until containerSize, simulate) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt index c9a9e6c94..668d540bf 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Ext.kt @@ -10,7 +10,6 @@ import net.minecraft.nbt.ByteArrayTag import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.Tag import net.minecraft.network.FriendlyByteBuf -import net.minecraft.world.Container import net.minecraft.world.entity.Entity import net.minecraft.world.item.ItemStack import net.minecraft.world.phys.Vec3 @@ -220,9 +219,6 @@ fun FriendlyByteBuf.writeBigInteger(value: BigInteger) { fun FriendlyByteBuf.readBigInteger(byteLimit: Int = 128) = BigInteger(readByteArray(byteLimit)) -operator fun Container.set(index: Int, value: ItemStack) = setItem(index, value) -operator fun Container.get(index: Int): ItemStack = getItem(index) - operator fun IItemHandler.get(index: Int): ItemStack = getStackInSlot(index) operator fun JsonObject.set(s: String, value: JsonElement) = add(s, value) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt index 8461b09f3..e85d9e570 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt @@ -11,7 +11,7 @@ import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.matter.MatterTuple -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB).stacksTo(64)), IMatterItem { private fun matter(stack: ItemStack): ImpreciseFraction { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt index f19022acb..41d888b5f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -10,7 +10,8 @@ import net.minecraft.world.item.ItemStack import net.minecraftforge.network.PacketDistributor import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings -import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.container.get +import ru.dbotthepony.mc.otm.container.nonEmptyIterator import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView import ru.dbotthepony.mc.otm.network.MenuNetworkChannel @@ -197,7 +198,7 @@ class ItemMonitorMenu @JvmOverloads constructor( var maxStack = 64 if (settings.craftingAmount == ItemMonitorPlayerSettings.Amount.FULL) { - for (gridItem in tile.craftingGrid.stacks()) { + for (gridItem in tile.craftingGrid.nonEmptyIterator()) { if (!gridItem.isStackable) { hasUnstackables = true break @@ -206,7 +207,7 @@ class ItemMonitorMenu @JvmOverloads constructor( } else { maxStack = 0 - for (gridItem in tile.craftingGrid.stacks()) { + for (gridItem in tile.craftingGrid.nonEmptyIterator()) { maxStack = maxStack.coerceAtLeast(gridItem.maxStackSize) } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt index b4a9b54ca..87036055d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt @@ -8,7 +8,7 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.core.registryName -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set fun stackFromJson(obj: JsonElement, field: String = ""): ItemStack { if (obj is JsonPrimitive) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt index 88e403183..9b365def3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/PlatePressRecipe.kt @@ -15,7 +15,7 @@ import net.minecraft.world.level.Level import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.block.entity.PlatePressBlockEntity -import ru.dbotthepony.mc.otm.core.get +import ru.dbotthepony.mc.otm.container.get import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.core.registryName diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt index 60031c7de..083855b66 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt @@ -8,7 +8,7 @@ import net.minecraft.nbt.ListTag import net.minecraft.nbt.Tag import net.minecraft.world.level.saveddata.SavedData import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.container.set class SavedMapDelegate(val parent: SavedCountingMap>?, val index: Int, value: V) { constructor(value: V) : this(null, -1, value) From 70dac3ba936cfef2d9db9e3fc1fb2047c2ac1f52 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 00:15:04 +0700 Subject: [PATCH 08/39] More streamlined iterators --- .../dbotthepony/mc/otm/container/Iterators.kt | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index 815fc66b7..465be0375 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -3,8 +3,8 @@ package ru.dbotthepony.mc.otm.container import net.minecraft.world.Container import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.core.ifPresentK -import java.util.function.Consumer class ContainerIterator(private val container: Container) : MutableIterator { private var index = 0 @@ -30,10 +30,7 @@ class ContainerIterator(private val container: Container) : MutableIterator { - private val parent = ContainerIterator(container) +open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { private var itemStack: ItemStack? = null private var searched = false @@ -70,30 +67,29 @@ class NonEmptyContainerIterator(container: Container) : MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { override fun remove() { parent.remove() } } -fun Container.nonEmptyIterator() = NonEmptyContainerIterator(this) - -class ContainerIteratorCapability(container: Container, private val cap: Capability) : MutableIterator> { - private val parent = NonEmptyContainerIterator(container) - private var itemStack: ItemStack? = null +open class CapabilityIterator

(protected open val parent: Iterator

, private val cap: Capability) : Iterator> { + private var provider: P? = null private var capability: T? = null private var searched = false private fun search() { searched = true - if (itemStack != null) { + if (provider != null) { return } - for (item in parent) { - item.getCapability(cap).ifPresentK { - itemStack = item + for (provider in parent) { + provider.getCapability(cap).ifPresentK { + this.provider = provider capability = it return } @@ -105,28 +101,38 @@ class ContainerIteratorCapability(container: Container, private val cap: Capa search() } - return itemStack != null + return provider != null } - override fun next(): Pair { + override fun next(): Pair { if (!searched) { search() } - val itemStack = itemStack ?: throw IllegalStateException("No next element") + val provider = provider ?: throw IllegalStateException("No next element") val capability = capability ?: throw IllegalStateException("No next element") - this.itemStack = null + this.provider = null this.capability = null this.searched = false - return itemStack to capability + return provider to capability } +} +class MutableCapabilityIterator

(override val parent: MutableIterator

, cap: Capability) : CapabilityIterator(parent, cap), MutableIterator> { override fun remove() { parent.remove() } } -fun Container.iterator(cap: Capability) = ContainerIteratorCapability(this, cap) +fun Container.iterator() = ContainerIterator(this) +fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) +fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) +fun Container.nonEmptyIterator() = iterator().nonEmpty() + +fun Container.iterator(cap: Capability) = CapabilityIterator(nonEmptyIterator(), cap) + +fun

Iterator

.filtered(cap: Capability) = CapabilityIterator(this, cap) +fun

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { for (value in iterator(cap)) { From ee3dbda0fb8abd844d02e9cfef45321009164eee Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 11:12:48 +0700 Subject: [PATCH 09/39] mmm --- .../kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt | 1 + .../kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt | 1 + .../ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt | 1 + .../mc/otm/android/feature/NanobotsRegeneration.kt | 1 + .../dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt | 1 + .../ru/dbotthepony/mc/otm/block/entity/MatteryBlockEntity.kt | 1 + .../mc/otm/block/entity/MatteryPoweredBlockEntity.kt | 1 + .../dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt | 1 + .../mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt | 1 + .../mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt | 5 +---- .../block/entity/matter/MatterCapacitorBankBlockEntity.kt | 1 + .../otm/block/entity/matter/MatterDecomposerBlockEntity.kt | 5 +---- .../mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt | 1 + .../otm/block/entity/matter/MatterReplicatorBlockEntity.kt | 5 +---- .../mc/otm/block/entity/storage/DriveRackBlockEntity.kt | 1 + .../mc/otm/block/entity/storage/DriveViewerBlockEntity.kt | 1 + .../mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt | 1 + .../block/entity/storage/StoragePowerSupplierBlockEntity.kt | 1 + .../ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt | 1 + .../mc/otm/capability/drive/AbstractMatteryDrive.kt | 5 +---- .../dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt | 1 + .../mc/otm/capability/matter/MatterHandlerImpl.kt | 1 + .../kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt | 1 + src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt | 1 + .../kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt | 2 +- src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt | 1 + .../ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt | 1 + 27 files changed, 27 insertions(+), 17 deletions(-) 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 c66373f78..5c335adb3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidFeature.kt @@ -6,6 +6,7 @@ import net.minecraftforge.event.entity.living.LivingHurtEvent import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.core.readNbt import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream 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 265b2300d..9d1181152 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearch.kt @@ -9,6 +9,7 @@ import ru.dbotthepony.mc.otm.capability.MatteryPlayerCapability import ru.dbotthepony.mc.otm.client.render.SkinElement import ru.dbotthepony.mc.otm.core.readNbt import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.writeNbt import java.io.InputStream import java.io.OutputStream diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt index 02634802f..bc61f5055 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsArmor.kt @@ -10,6 +10,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt class NanobotsArmor(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_ARMOR, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt index 035e9682a..611d9e688 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/feature/NanobotsRegeneration.kt @@ -9,6 +9,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.registry.AndroidFeatures import ru.dbotthepony.mc.otm.registry.StatNames import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt class NanobotsRegeneration(android: MatteryPlayerCapability) : AndroidFeature(AndroidFeatures.NANOBOTS_REGENERATION, android) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt index 16bf06923..42810e5cb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/CargoCrateBlockEntity.kt @@ -18,6 +18,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.CargoCrateMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class CargoCrateBlockEntity( p_155229_: BlockPos, 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 101207242..95c0ad057 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 @@ -25,6 +25,7 @@ import net.minecraftforge.common.capabilities.Capability import ru.dbotthepony.mc.otm.addPreWorldTickerOnce import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set abstract class MatteryBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : BlockEntity(p_155228_, p_155229_, p_155230_), MenuProvider { var customDisplayName: Component? = null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt index dc51e3aec..ae82e2dd0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/MatteryPoweredBlockEntity.kt @@ -14,6 +14,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.core.ifPresentK import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set abstract class MatteryPoweredBlockEntity(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : MatteryBlockEntity(p_155228_, p_155229_, p_155230_) { abstract val energy: BlockEnergyStorageImpl diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt index 11b53bd64..85a24a20b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PlatePressBlockEntity.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.menu.PlatePressMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MRecipes import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class PlatePressBlockEntity( p_155229_: BlockPos, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt index 4a2d7a605..e5d9fd8c2 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/blackhole/BlackHoleBlockEntity.kt @@ -32,6 +32,7 @@ import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MItems import ru.dbotthepony.mc.otm.registry.MRegistry import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import kotlin.math.roundToInt import kotlin.math.sqrt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt index b532fdfd9..54c36c604 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterBottlerBlockEntity.kt @@ -15,7 +15,6 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.CapabilityItemHandler -import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.matter.MatterBottlerBlock import ru.dbotthepony.mc.otm.block.entity.MatteryPoweredBlockEntity import ru.dbotthepony.mc.otm.block.entity.WorkerState @@ -25,15 +24,13 @@ import ru.dbotthepony.mc.otm.capability.matter.IMatterHandler import ru.dbotthepony.mc.otm.capability.matter.MatterDirection import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl import ru.dbotthepony.mc.otm.container.MatteryContainer -import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatterBottlerMenu -import ru.dbotthepony.mc.otm.core.orNull import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.* class MatterBottlerBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.MATTER_BOTTLER, p_155229_, p_155230_), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt index 32e578c82..55f026f69 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterCapacitorBankBlockEntity.kt @@ -29,6 +29,7 @@ import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.menu.MatterCapacitorBankMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt index 137f61053..94990d288 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterDecomposerBlockEntity.kt @@ -15,7 +15,6 @@ import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional import net.minecraftforge.items.IItemHandler -import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage @@ -24,13 +23,11 @@ import ru.dbotthepony.mc.otm.capability.matter.MatterDirection import ru.dbotthepony.mc.otm.capability.matter.MatterHandlerImpl import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilter -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.getImpreciseFraction import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.item.MatterDustItem import ru.dbotthepony.mc.otm.matter.baselineComplexityDecomposeTicks import ru.dbotthepony.mc.otm.matter.canDecompose diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt index f2a05c9bb..286254d3a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/matter/MatterRecyclerBlockEntity.kt @@ -32,6 +32,7 @@ import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.menu.MatterRecyclerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class MatterRecyclerBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_RECYCLER, blockPos, blockState, ::Job), IMatterGraphNode { 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 dc507cba0..aaa58728c 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 @@ -14,24 +14,21 @@ import net.minecraft.world.level.block.state.BlockState import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.util.LazyOptional -import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.block.entity.MatteryWorkerBlockEntity import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.capability.WorkerEnergyStorage import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.container.MatteryContainerFilterOnlyOut -import ru.dbotthepony.mc.otm.core.ImpreciseFraction -import ru.dbotthepony.mc.otm.core.getImpreciseFraction import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph -import ru.dbotthepony.mc.otm.core.map import ru.dbotthepony.mc.otm.matter.baselineComplexityReplicateTicks import ru.dbotthepony.mc.otm.matter.getMatterValue import ru.dbotthepony.mc.otm.menu.MatterReplicatorMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.* class MatterReplicatorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : MatteryWorkerBlockEntity(MBlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_, ::ReplicatorJob), IMatterGraphNode { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt index e6eccd271..eafe1d9d7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveRackBlockEntity.kt @@ -23,6 +23,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.DriveRackMenu import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.graph.storage.StorageNetworkGraph import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.storage.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt index 550e0e9c0..015fac0e0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/DriveViewerBlockEntity.kt @@ -21,6 +21,7 @@ import ru.dbotthepony.mc.otm.container.MatteryContainer import ru.dbotthepony.mc.otm.menu.DriveViewerMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import javax.annotation.ParametersAreNonnullByDefault @MethodsReturnNonnullByDefault diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt index 053f12a74..21a9b6e56 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt @@ -40,6 +40,7 @@ import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.* diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt index 0f60e574a..499b66901 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/StoragePowerSupplierBlockEntity.kt @@ -25,6 +25,7 @@ import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu import ru.dbotthepony.mc.otm.registry.MBlockEntities import ru.dbotthepony.mc.otm.registry.MNames import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class StoragePowerSupplierBlockEntity(blockPos: BlockPos, blockState: BlockState) : MatteryPoweredBlockEntity(MBlockEntities.STORAGE_POWER_SUPPLIER, blockPos, blockState) { override val defaultDisplayName: Component diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt index ea34cb555..01f9bd87a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt @@ -16,6 +16,7 @@ import ru.dbotthepony.mc.otm.compat.mekanism.MatteryToMekanismEnergyWrapper import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.core.tagNotNull private enum class EnergyFlow { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt index ba8b3f94c..1fbda2ec0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/AbstractMatteryDrive.kt @@ -7,11 +7,8 @@ import net.minecraft.nbt.CompoundTag import net.minecraft.nbt.ListTag import net.minecraft.nbt.Tag import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.core.BigInteger -import ru.dbotthepony.mc.otm.core.isPositive -import ru.dbotthepony.mc.otm.core.serializeNBT -import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.storage.* import java.math.BigInteger import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt index 34915f30c..6cd728abb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/drive/ItemMatteryDrive.kt @@ -10,6 +10,7 @@ import ru.dbotthepony.mc.otm.OverdriveThatMatters import ru.dbotthepony.mc.otm.core.BigInteger import ru.dbotthepony.mc.otm.core.serializeNBT import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import ru.dbotthepony.mc.otm.storage.IStorageTuple import ru.dbotthepony.mc.otm.storage.ItemStackWrapper import ru.dbotthepony.mc.otm.storage.StorageStackType diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt index 957363eb0..4adc14a74 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/matter/MatterHandlerImpl.kt @@ -5,6 +5,7 @@ import net.minecraftforge.common.util.INBTSerializable import net.minecraftforge.common.util.LazyOptional import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set open class MatterHandlerImpl @JvmOverloads constructor( protected val listener: Runnable?, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt index a0bcb3fbc..eec65f30c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ItemFilter.kt @@ -15,6 +15,7 @@ import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.menu.MatteryMenu import ru.dbotthepony.mc.otm.network.MatteryPacket import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set import java.util.Arrays import java.util.LinkedList import java.util.function.Supplier diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt index e85d9e570..9fbf9aab8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/MatterDustItem.kt @@ -12,6 +12,7 @@ import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.matter.IMatterItem import ru.dbotthepony.mc.otm.matter.MatterTuple import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class MatterDustItem : Item(Properties().tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB).stacksTo(64)), IMatterItem { private fun matter(stack: ItemStack): ImpreciseFraction { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt index 41d888b5f..47da9e5e8 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -131,7 +131,7 @@ class ItemMonitorMenu @JvmOverloads constructor( override val storageSlots: List = listOf(batterySlot) override fun quickMoveStack(ply: Player, slotIndex: Int): ItemStack { - if (slotIndex in inventorySlotIndexStart..inventorySlotIndexEnd) { + if (playerInventorySlots.any { it.index == slotIndex }) { if (tile == null) { return ItemStack.EMPTY } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt index 87036055d..d0500fc95 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/recipe/Helpers.kt @@ -9,6 +9,7 @@ import net.minecraft.world.item.Items import net.minecraftforge.registries.ForgeRegistries import ru.dbotthepony.mc.otm.core.registryName import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set fun stackFromJson(obj: JsonElement, field: String = ""): ItemStack { if (obj is JsonPrimitive) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt index 083855b66..59fb89ec3 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt @@ -9,6 +9,7 @@ import net.minecraft.nbt.Tag import net.minecraft.world.level.saveddata.SavedData import org.apache.logging.log4j.LogManager import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class SavedMapDelegate(val parent: SavedCountingMap>?, val index: Int, value: V) { constructor(value: V) : this(null, -1, value) From 1ff15879514565dcaf15ebd5584384e34921b821 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 11:16:16 +0700 Subject: [PATCH 10/39] can you not --- .../ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt | 1 + .../mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt | 1 + 2 files changed, 2 insertions(+) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt index 2161c17e1..b5eda7286 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/models/MatteryModelBuilder.kt @@ -10,6 +10,7 @@ import net.minecraft.resources.ResourceLocation import net.minecraftforge.client.model.generators.ModelBuilder import net.minecraftforge.common.data.ExistingFileHelper import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set data class TextureSize(val width: Float, val height: Float) { constructor(arr: JsonArray) : this(arr[0].asFloat, arr[1].asFloat) diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt index 63bc0b607..948b8ac53 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/recipes/PlatePressFinishedRecipe.kt @@ -8,6 +8,7 @@ import net.minecraft.world.item.crafting.RecipeSerializer import ru.dbotthepony.mc.otm.recipe.PlatePressRecipe import ru.dbotthepony.mc.otm.recipe.PlatePressRecipeFactory import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.set class PlatePressFinishedRecipe(private val recipe: PlatePressRecipe) : FinishedRecipe { override fun serializeRecipeData(it: JsonObject) { From da3ae55d380c4000898b8dd8b40c99f576bec894 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 11:17:05 +0700 Subject: [PATCH 11/39] extendedItemIterator for player --- .../ru/dbotthepony/mc/otm/capability/Ext.kt | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 314235255..4e0ede534 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -1,8 +1,10 @@ package ru.dbotthepony.mc.otm.capability import net.minecraft.core.Direction +import net.minecraft.world.Container import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player +import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional @@ -10,6 +12,7 @@ import net.minecraftforge.energy.IEnergyStorage import net.minecraftforge.fml.ModList import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy +import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.orNull @@ -118,3 +121,58 @@ fun ICapabilityProvider.getMatteryEnergySided(side: Direction? = null): LazyOpti return getCapability(MatteryCapability.ENERGY, side) } + +fun Player.extendedItemIterator(): MutableIterator { + return object : MutableIterator { + private val regular = this@extendedItemIterator.inventory.iterator() + private val mattery: MutableIterator + private var isSecond = false + + init { + val get = this@extendedItemIterator.matteryPlayer + + if (get != null && get.hasExoSuit) { + mattery = get.exoSuitContainer.iterator() + } else { + mattery = object : MutableIterator { + override fun hasNext(): Boolean { + return false + } + + override fun next(): ItemStack { + throw UnsupportedOperationException() + } + + override fun remove() { + throw UnsupportedOperationException() + } + } + } + } + + override fun hasNext(): Boolean { + return regular.hasNext() || mattery.hasNext() + } + + override fun next(): ItemStack { + if (isSecond) { + return mattery.next() + } + + if (!regular.hasNext()) { + isSecond = true + return mattery.next() + } + + return regular.next() + } + + override fun remove() { + if (isSecond) { + mattery.remove() + } else { + regular.remove() + } + } + } +} \ No newline at end of file From 915f3821db6034d41db98e581d81d2de4bc86bad Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 11:21:02 +0700 Subject: [PATCH 12/39] ah yes, enslaved bonus slots in all menus --- .../otm/capability/MatteryPlayerCapability.kt | 6 +- .../client/screen/ExoSuitInventoryScreen.kt | 40 +------ .../mc/otm/client/screen/MatteryScreen.kt | 112 ++++++++++++++++-- .../mc/otm/menu/ExoSuitInventoryMenu.kt | 60 ++-------- .../ru/dbotthepony/mc/otm/menu/MatteryMenu.kt | 81 +++++++++---- 5 files changed, 182 insertions(+), 117 deletions(-) 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 d2d8912b8..3d13c0e1e 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/MatteryPlayerCapability.kt @@ -78,6 +78,10 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn private set(value) { _exoSuitMenu = null + if (ply.containerMenu.slots.any { it.container == field }) { + ply.closeContainer() + } + for (i in 0 until value.containerSize.coerceAtMost(field.containerSize)) { if (!field[i].isEmpty) { value[i] = field[i] @@ -626,7 +630,7 @@ class MatteryPlayerCapability(val ply: Player) : ICapabilityProvider, IMatteryEn shouldSendIteration = false } - if (hasExoSuit && ply.containerMenu != exoSuitMenu) { + if (hasExoSuit && ply.containerMenu == ply.inventoryMenu) { exoSuitMenu.broadcastChanges() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt index 30f142f04..1b027f2fc 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ExoSuitInventoryScreen.kt @@ -12,36 +12,6 @@ import ru.dbotthepony.mc.otm.network.ExoSuitMenuOpen import ru.dbotthepony.mc.otm.network.MatteryPlayerNetworkChannel class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen(menu, TranslatableComponent("otm.gui.exosuit")) { - private val slotRows = Int2ObjectAVLTreeMap() - - private fun getSlotsRow(index: Int): EditablePanel { - return slotRows.computeIfAbsent(index, Int2ObjectFunction { - val canvas = object : EditablePanel(this@ExoSuitInventoryScreen, null, width = AbstractSlotPanel.SIZE * 9f, height = AbstractSlotPanel.SIZE) { - override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { - return false - } - } - - val offset = it * 9 - - if (menu.combinedInventorySlots.size <= offset) { - return@Int2ObjectFunction canvas - } - - for (i in 0 .. (8).coerceAtMost(menu.combinedInventorySlots.size - offset - 1)) { - val slot = object : SlotPanel(this@ExoSuitInventoryScreen, canvas, menu.combinedInventorySlots[offset + i]) { - override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { - return false - } - } - - slot.dock = Dock.LEFT - } - - return@Int2ObjectFunction canvas - }) - } - override fun makeMainFrame(): FramePanel { val frame = FramePanel(this, width = 200f, height = 180f, title = this.title) @@ -52,16 +22,16 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen for (i in old .. old + 2) { - getSlotsRow(i).visible = false + getInventorySlotsRow(i).visible = false } for (i in new .. new + 2) { - val row = getSlotsRow(i) + val row = getInventorySlotsRow(i) row.visible = true row.y = (i - new) * AbstractSlotPanel.SIZE row.parent = mainInventoryLine @@ -82,7 +52,7 @@ class ExoSuitInventoryScreen(menu: ExoSuitInventoryMenu) : MatteryScreen(menu: T, inventory: Inventory, tit val quickCraftingType get() = quickCraftingType val isQuickCrafting get() = isQuickCrafting + private val inventorySlotsRows = Int2ObjectAVLTreeMap() + init { if (menu.playerInventorySlots.isNotEmpty() && menu.autoCreateInventoryFrame) { - inventoryFrame = FramePanel(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH, INVENTORY_FRAME_HEIGHT, inventory.displayName).also(this::addPanel) + if (menu.playerExoSuitSlots.isEmpty()) { + inventoryFrame = FramePanel(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH, INVENTORY_FRAME_HEIGHT, inventory.displayName).also(this::addPanel) - for (slot in menu.playerInventorySlots) { - SlotPanel(this, inventoryFrame, slot, slot.x.toFloat(), slot.y.toFloat()) + val hotbarStrip = EditablePanel(this, inventoryFrame, height = AbstractSlotPanel.SIZE) + hotbarStrip.dock = Dock.BOTTOM + + for (slot in menu.playerHotbarSlots) { + SlotPanel(this, hotbarStrip, slot).also { it.dock = Dock.LEFT } + } + + for (i in 0 .. 2) { + getInventorySlotsRow(i).also { + it.parent = inventoryFrame + it.y = i * AbstractSlotPanel.SIZE + } + } + } else { + inventoryFrame = FramePanel(this, null, 0f, 0f, INVENTORY_FRAME_WIDTH_EXTENDED, INVENTORY_FRAME_HEIGHT, inventory.displayName).also(this::addPanel) + + var slotListCanvas: EditablePanel? = null + + val scrollbar = DiscreteScrollBarPanel(this, inventoryFrame, { ((menu.playerCombinedInventorySlots.size - 27) + 8) / 9 }, { + _, old, new -> + + for (i in old .. old + 2) { + getInventorySlotsRow(i).visible = false + } + + for (i in new .. new + 2) { + getInventorySlotsRow(i).also { + it.visible = true + it.parent = slotListCanvas + it.y = (i - new) * AbstractSlotPanel.SIZE + } + } + + menu.ply.matteryPlayer?.exoSuitMenu?.lastScroll = new + }) + + slotListCanvas = object : EditablePanel(this@MatteryScreen, inventoryFrame, height = AbstractSlotPanel.SIZE * 3f) { + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + scrollbar.mouseScrolledInner(x, y, scroll) + return true + } + } + + slotListCanvas.dock = Dock.TOP + + val hotbarStrip = EditablePanel(this, inventoryFrame, height = AbstractSlotPanel.SIZE) + hotbarStrip.dock = Dock.BOTTOM + + for (slot in menu.playerHotbarSlots) { + SlotPanel(this, hotbarStrip, slot).also { it.dock = Dock.LEFT } + } + + scrollbar.parent = slotListCanvas + scrollbar.dock = Dock.RIGHT + + scrollbar.scroll = menu.ply.matteryPlayer?.exoSuitMenu?.lastScroll ?: 0 + + for (i in scrollbar.scroll .. scrollbar.scroll + 2) { + getInventorySlotsRow(i).also { + it.parent = slotListCanvas + it.y = (i - scrollbar.scroll) * AbstractSlotPanel.SIZE + } + } } } } + protected fun getInventorySlotsRow(index: Int): EditablePanel { + return inventorySlotsRows.computeIfAbsent(index, Int2ObjectFunction { + val canvas = object : EditablePanel(this@MatteryScreen, null, width = AbstractSlotPanel.SIZE * 9f, height = AbstractSlotPanel.SIZE) { + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + return false + } + } + + val offset = it * 9 + + if (menu.playerCombinedInventorySlots.size <= offset) { + return@Int2ObjectFunction canvas + } + + for (i in 0 .. (8).coerceAtMost(menu.playerCombinedInventorySlots.size - offset - 1)) { + val slot = object : SlotPanel(this@MatteryScreen, canvas, menu.playerCombinedInventorySlots[offset + i]) { + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + return false + } + } + + slot.dock = Dock.LEFT + } + + return@Int2ObjectFunction canvas + }) + } + override fun init() { super.init() @@ -354,10 +447,13 @@ abstract class MatteryScreen(menu: T, inventory: Inventory, tit } companion object { - const val DEFAULT_FRAME_WIDTH = 18f * 9f + 16f + const val DEFAULT_FRAME_WIDTH = AbstractSlotPanel.SIZE * 9f + 16f const val DEFAULT_FRAME_HEIGHT = 100f + const val INVENTORY_FRAME_WIDTH = DEFAULT_FRAME_WIDTH - const val INVENTORY_FRAME_HEIGHT = 3f * 18f + 18f + 24f + const val INVENTORY_FRAME_WIDTH_EXTENDED = DEFAULT_FRAME_WIDTH + ScrollBarConstants.WIDTH + 2f + const val INVENTORY_FRAME_HEIGHT = 3f * AbstractSlotPanel.SIZE + AbstractSlotPanel.SIZE + 24f + const val GAUGE_TOP_WITH_SLOT = 17f const val GAUGE_TOP_WITHOUT_SLOT = 26f const val SLOT_TOP_UNDER_GAUGE = 70f diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt index 68fb22471..f9e19ed83 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt @@ -25,29 +25,6 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen } } - val hotbarSlots: List - val mainInventorySlots: List - - init { - val builder = ImmutableList.builder() - - for (i in 0 .. 8) { - builder.add(InventorySlot(capability.ply.inventory, i)) - } - - hotbarSlots = builder.build() - } - - init { - val builder = ImmutableList.builder() - - for (i in 9 .. 35) { - builder.add(InventorySlot(capability.ply.inventory, i)) - } - - mainInventorySlots = builder.build() - } - val armorSlots: List = makeArmorSlots() val offhandSlot = object : InventorySlot(capability.ply.inventory, 40) { @@ -56,26 +33,6 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen } } - val exoSuitSlots: List - val combinedInventorySlots: List - - init { - val builder = ImmutableList.builder() - - for (i in 0 until capability.exoSuitContainer.containerSize) { - builder.add(MatterySlot(capability.exoSuitContainer, i)) - } - - exoSuitSlots = builder.build() - } - - init { - val builder = ImmutableList.builder() - builder.addAll(mainInventorySlots) - builder.addAll(exoSuitSlots) - combinedInventorySlots = builder.build() - } - val craftingGrid: CraftingContainer val craftingSlots: List @@ -94,11 +51,10 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen craftingSlots = builder.build() - exoSuitSlots.forEach(this::addSlot) + addInventorySlots(autoFrame = false) + craftingSlots.forEach(this::addSlot) addSlot(offhandSlot) - hotbarSlots.forEach(this::addSlot) - mainInventorySlots.forEach(this::addSlot) armorSlots.forEach(this::addSlot) } @@ -152,26 +108,26 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen if (slotIndex == craftingResultSlot.index) { val item = craftingResultSlot.item - val leftover = moveItemStackToSlots(item, combinedInventorySlots, simulate = true) + val leftover = moveItemStackToSlots(item, playerCombinedInventorySlots, simulate = true) if (leftover.isEmpty) { val copy = item.copy() - moveItemStackToSlots(item, combinedInventorySlots, simulate = false) + moveItemStackToSlots(item, playerCombinedInventorySlots, simulate = false) item.count = 0 craftingResultSlot.onTake(ply, copy) return copy } return ItemStack.EMPTY - } else if (combinedInventorySlots.any { it.index == slotIndex }) { + } else if (playerCombinedInventorySlots.any { it.index == slotIndex }) { val item = slots[slotIndex].item val copy = item.copy() - moveItemStackTo(item, hotbarSlots) + moveItemStackTo(item, playerHotbarSlots) return copy - } else if (hotbarSlots.any { it.index == slotIndex } || craftingSlots.any { it.index == slotIndex }) { + } else if (playerHotbarSlots.any { it.index == slotIndex } || craftingSlots.any { it.index == slotIndex }) { val item = slots[slotIndex].item val copy = item.copy() - moveItemStackTo(item, combinedInventorySlots) + moveItemStackTo(item, playerCombinedInventorySlots) return copy } 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 849e690ff..d9135285f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatteryMenu.kt @@ -2,6 +2,7 @@ package ru.dbotthepony.mc.otm.menu import com.google.common.collect.ImmutableList import com.mojang.datafixers.util.Pair +import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap import net.minecraft.resources.ResourceLocation import net.minecraft.server.level.ServerPlayer import net.minecraft.world.Container @@ -12,6 +13,11 @@ import net.minecraft.world.item.ItemStack import net.minecraft.world.item.enchantment.EnchantmentHelper.hasBindingCurse import net.minecraft.world.level.block.entity.BlockEntity import net.minecraftforge.network.PacketDistributor +import ru.dbotthepony.mc.otm.capability.matteryPlayer +import ru.dbotthepony.mc.otm.client.screen.panels.AbstractSlotPanel +import ru.dbotthepony.mc.otm.client.screen.panels.Dock +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.client.screen.panels.SlotPanel import ru.dbotthepony.mc.otm.container.ItemFilter import ru.dbotthepony.mc.otm.container.ItemFilterNetworkSlot import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget @@ -33,8 +39,36 @@ abstract class MatteryMenu @JvmOverloads protected constructor( val matteryWidgets: List = Collections.unmodifiableList(_matteryWidgets) private val _playerInventorySlots = ArrayList() + private val _playerHotbarSlots = ArrayList() + private val _playerMainSlots = ArrayList() + private val _playerExoSuitSlots = ArrayList() + private val _playerCombinedInventorySlots = ArrayList() + + /** + * inventory + exosuit + hotbar (in this order) + */ val playerInventorySlots: List = Collections.unmodifiableList(_playerInventorySlots) + /** + * hotbar only + */ + val playerHotbarSlots: List = Collections.unmodifiableList(_playerHotbarSlots) + + /** + * inventory only + */ + val playerMainSlots: List = Collections.unmodifiableList(_playerMainSlots) + + /** + * exosuit only + */ + val playerExoSuitSlots: List = Collections.unmodifiableList(_playerExoSuitSlots) + + /** + * inventory + exosuit (in this order) + */ + val playerCombinedInventorySlots: List = Collections.unmodifiableList(_playerCombinedInventorySlots) + var autoCreateInventoryFrame = true private set @@ -121,33 +155,38 @@ abstract class MatteryMenu @JvmOverloads protected constructor( } protected fun addInventorySlots(autoFrame: Boolean = true) { + check(_playerInventorySlots.isEmpty()) { "Already created inventory slots" } autoCreateInventoryFrame = autoFrame - var first = true - for (row in 0..2) { - for (column in 0..8) { - val slot = InventorySlot(inventory, column + row * 9 + 9, 8 + column * 18, 14 + row * 18) + for (i in 9 .. 35) { + val slot = InventorySlot(inventory, i) + + _playerInventorySlots.add(slot) + _playerMainSlots.add(slot) + _playerCombinedInventorySlots.add(slot) + addSlot(slot) + } + + val mattery = ply.matteryPlayer + + if (mattery != null && mattery.hasExoSuit) { + for (i in 0 until mattery.exoSuitContainer.containerSize) { + val slot = InventorySlot(mattery.exoSuitContainer, i) _playerInventorySlots.add(slot) + _playerExoSuitSlots.add(slot) + _playerCombinedInventorySlots.add(slot) addSlot(slot) - - if (first) { - first = false - inventorySlotIndexStart = slot.index - } } } - var last: MatterySlot? = null + for (i in 0..8) { + val slot = InventorySlot(inventory, i) - for (k in 0..8) { - last = InventorySlot(inventory, k, 8 + k * 18, 14 + 58) - - addSlot(last) - _playerInventorySlots.add(last) + addSlot(slot) + _playerInventorySlots.add(slot) + _playerHotbarSlots.add(slot) } - - inventorySlotIndexEnd = last!!.index } override fun broadcastChanges() { @@ -226,7 +265,7 @@ abstract class MatteryMenu @JvmOverloads protected constructor( moveToPlayer = true } - if (moveToPlayer == null && playerInventorySlots.any { it.index == slotIndex }) { + if (moveToPlayer == null && _playerInventorySlots.any { it.index == slotIndex }) { moveToPlayer = false } @@ -246,7 +285,7 @@ abstract class MatteryMenu @JvmOverloads protected constructor( moved = initialItem.copy() if (moveToPlayer) { - if (!moveItemStackTo(initialItem, playerInventorySlots)) { + if (!moveItemStackTo(initialItem, _playerInventorySlots)) { return ItemStack.EMPTY } } else { @@ -266,11 +305,11 @@ abstract class MatteryMenu @JvmOverloads protected constructor( } fun quickMoveToInventory(stack: ItemStack, simulate: Boolean): ItemStack { - if (inventorySlotIndexStart == 0 && inventorySlotIndexEnd == 0) { + if (_playerInventorySlots.isEmpty()) { return stack } - return moveItemStackToSlots(stack, inventorySlotIndexStart, inventorySlotIndexEnd, simulate = simulate) + return moveItemStackToSlots(stack, _playerInventorySlots, simulate = simulate) } override fun moveItemStackTo( From 4e2928dbc7059ec453c3414d18042ea96aec649d Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 11:25:34 +0700 Subject: [PATCH 13/39] fix popup code being invalid --- .../kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt index d5ce7f1bb..b2c5b5f4a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatteryScreen.kt @@ -195,7 +195,7 @@ abstract class MatteryScreen(menu: T, inventory: Inventory, tit require(indexOf != -1) { "No such panel $panel" } - if (indexOf == panels.size - 1) { + if (indexOf == 0) { return } From cbea8873e965d62a10666ce98b7f39618bdc8c6a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 12:54:02 +0700 Subject: [PATCH 14/39] Extract observed map from saved counting map --- .../ru/dbotthepony/mc/otm/core/ObservedMap.kt | 315 +++++++++++++++++ .../mc/otm/saveddata/SavedCountingMap.kt | 334 ++---------------- 2 files changed, 347 insertions(+), 302 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/ObservedMap.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ObservedMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ObservedMap.kt new file mode 100644 index 000000000..9276a08d9 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ObservedMap.kt @@ -0,0 +1,315 @@ +package ru.dbotthepony.mc.otm.core + +abstract class ObservedMap(protected val backingMap: MutableMap = HashMap()) : MutableMap { + protected abstract fun onClear() + protected abstract fun onValueAdded(key: K, value: V) + protected abstract fun onValueRemoved(key: K, value: V) + + final override val size: Int + get() = backingMap.size + + final override fun containsKey(key: K): Boolean { + return backingMap.containsKey(key) + } + + final override fun containsValue(value: V): Boolean { + return backingMap.containsValue(value) + } + + final override fun get(key: K): V? { + return backingMap[key] + } + + final override fun isEmpty(): Boolean { + return backingMap.isEmpty() + } + + final override val entries: MutableSet> by lazy { + object : MutableSet> { + override fun add(element: MutableMap.MutableEntry): Boolean { + this@ObservedMap[element.key] = element.value + return true + } + + override fun addAll(elements: Collection>): Boolean { + for (value in elements) { + add(value) + } + + return true + } + + override fun clear() { + this@ObservedMap.clear() + } + + private val setParent = this@ObservedMap.backingMap.entries + + override fun iterator(): MutableIterator> { + return object : MutableIterator> { + private val parent = setParent.iterator() + private var last: MutableMap.MutableEntry? = null + + override fun hasNext(): Boolean { + return parent.hasNext() + } + + override fun next(): MutableMap.MutableEntry { + return parent.next().also { last = it } + } + + override fun remove() { + val last = last ?: throw IllegalStateException("Never called next()") + parent.remove() + onValueRemoved(last.key, last.value) + } + } + } + + override fun remove(element: MutableMap.MutableEntry): Boolean { + if (setParent.remove(element)) { + onValueRemoved(element.key, element.value) + return true + } + + return false + } + + override fun removeAll(elements: Collection>): Boolean { + var any = false + + for (element in elements) { + any = remove(element) || any + } + + return any + } + + override fun retainAll(elements: Collection>): Boolean { + val iterator = this.iterator() + var any = false + + for (value in iterator) { + if (value !in elements) { + iterator.remove() + any = true + } + } + + return any + } + + override val size: Int + get() = setParent.size + + override fun contains(element: MutableMap.MutableEntry): Boolean { + return setParent.contains(element) + } + + override fun containsAll(elements: Collection>): Boolean { + return setParent.containsAll(elements) + } + + override fun isEmpty(): Boolean { + return setParent.isEmpty() + } + } + } + + final override val keys: MutableSet by lazy { + object : MutableSet { + val parent = this@ObservedMap.backingMap.keys + + override fun add(element: K): Boolean { + throw UnsupportedOperationException() + } + + override fun addAll(elements: Collection): Boolean { + throw UnsupportedOperationException() + } + + override fun clear() { + this@ObservedMap.clear() + } + + override fun iterator(): MutableIterator { + return object : MutableIterator { + private val parentIterator = parent.iterator() + private var last: K? = null + + override fun hasNext(): Boolean { + return parentIterator.hasNext() + } + + override fun next(): K { + return parentIterator.next().also { last = it } + } + + override fun remove() { + val last = last ?: throw IllegalStateException("Never called next()") + val value = this@ObservedMap[last] ?: throw ConcurrentModificationException() + parentIterator.remove() + onValueRemoved(last, value) + } + } + } + + override fun remove(element: K): Boolean { + return this@ObservedMap.remove(element) != null + } + + override fun removeAll(elements: Collection): Boolean { + var changes = false + + for (element in elements) { + changes = remove(element) || changes + } + + return changes + } + + override fun retainAll(elements: Collection): Boolean { + val iterator = this.iterator() + var any = false + + for (element in iterator) { + if (element !in elements) { + iterator.remove() + any = true + } + } + + return any + } + + override val size: Int + get() = parent.size + + override fun contains(element: K): Boolean { + return parent.contains(element) + } + + override fun containsAll(elements: Collection): Boolean { + return parent.containsAll(elements) + } + + override fun isEmpty(): Boolean { + return parent.isEmpty() + } + } + } + + final override val values: MutableCollection by lazy { + object : MutableCollection { + private val parent = this@ObservedMap.backingMap.values + + override val size: Int + get() = parent.size + + override fun contains(element: V): Boolean { + return parent.contains(element) + } + + override fun containsAll(elements: Collection): Boolean { + return parent.containsAll(elements) + } + + override fun isEmpty(): Boolean { + return parent.isEmpty() + } + + override fun add(element: V): Boolean { + throw UnsupportedOperationException() + } + + override fun addAll(elements: Collection): Boolean { + throw UnsupportedOperationException() + } + + override fun clear() { + this@ObservedMap.clear() + } + + override fun iterator(): MutableIterator { + return object : MutableIterator { + private val parentIterator = parent.iterator() + + override fun hasNext(): Boolean { + return parentIterator.hasNext() + } + + override fun next(): V { + return parentIterator.next() + } + + override fun remove() { + parentIterator.remove() + } + } + } + + override fun remove(element: V): Boolean { + val indexOf = this@ObservedMap.backingMap.firstNotNullOfOrNull { if (it.value == element) it.key else null } ?: return false + this@ObservedMap.remove(indexOf) + return true + } + + override fun removeAll(elements: Collection): Boolean { + var changes = false + + for (element in elements) { + changes = remove(element) || changes + } + + return changes + } + + override fun retainAll(elements: Collection): Boolean { + val iterator = this.iterator() + var changes = false + + for (element in iterator) { + if (element !in elements) { + iterator.remove() + changes = true + } + } + + return changes + } + } + } + + override fun clear() { + onClear() + return backingMap.clear() + } + + override fun put(key: K, value: V): V? { + val existing = backingMap.put(key, value) + + if (existing == value) { + return existing + } + + onValueAdded(key, value) + return existing + } + + final override fun putAll(from: Map) { + for ((k, v) in from) { + this[k] = v + } + } + + override fun remove(key: K): V? { + val removed = backingMap.remove(key) + + if (removed != null) { + onValueRemoved(key, removed) + } + + return removed + } +} + diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt index 59fb89ec3..8dd1ab17f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/saveddata/SavedCountingMap.kt @@ -8,8 +8,9 @@ import net.minecraft.nbt.ListTag import net.minecraft.nbt.Tag import net.minecraft.world.level.saveddata.SavedData import org.apache.logging.log4j.LogManager -import ru.dbotthepony.mc.otm.container.set +import ru.dbotthepony.mc.otm.core.ObservedMap import ru.dbotthepony.mc.otm.core.set +import ru.dbotthepony.mc.otm.registry.WriteOnce class SavedMapDelegate(val parent: SavedCountingMap>?, val index: Int, value: V) { constructor(value: V) : this(null, -1, value) @@ -37,11 +38,38 @@ class SavedMapDelegate(val parent: SavedCountingMap>?, va } } -class SavedCountingMap( +private class ObservedCountingMap : ObservedMap(Int2ObjectAVLTreeMap()) { + var parent: SavedCountingMap by WriteOnce() + + override fun onClear() { + parent.isDirty = true + } + + override fun onValueAdded(key: Int, value: T) { + parent.isDirty = true + } + + override fun onValueRemoved(key: Int, value: T) { + parent.isDirty = true + } +} + +class SavedCountingMap private constructor( val serializer: (map: SavedCountingMap, value: T, index: Int) -> Tag, val deserializer: (map: SavedCountingMap, nbt: Tag, index: Int) -> T, - val factory: (map: SavedCountingMap, index: Int) -> T -) : SavedData(), MutableMap { + val factory: (map: SavedCountingMap, index: Int) -> T, + private val map: ObservedCountingMap +) : SavedData(), MutableMap by map { + constructor( + serializer: (map: SavedCountingMap, value: T, index: Int) -> Tag, + deserializer: (map: SavedCountingMap, nbt: Tag, index: Int) -> T, + factory: (map: SavedCountingMap, index: Int) -> T, + ) : this(serializer, deserializer, factory, ObservedCountingMap()) + + init { + map.parent = this + } + var nextIndex = 0 private set @@ -56,304 +84,6 @@ class SavedCountingMap( return computeIfAbsent(nextIndex++) } - private val map = Int2ObjectAVLTreeMap() - - override val size: Int - get() = map.size - - override fun containsKey(key: Int): Boolean { - return map.containsKey(key) - } - - override fun containsValue(value: T): Boolean { - return map.containsValue(value) - } - - override fun get(key: Int): T? { - return map[key] - } - - override fun isEmpty(): Boolean { - return map.isEmpty() - } - - override val entries: MutableSet> by lazy { - object : MutableSet> { - override fun add(element: MutableMap.MutableEntry): Boolean { - this@SavedCountingMap[element.key] = element.value - return true - } - - override fun addAll(elements: Collection>): Boolean { - for (value in elements) { - add(value) - } - - return true - } - - override fun clear() { - this@SavedCountingMap.clear() - } - - private val setParent = this@SavedCountingMap.map.int2ObjectEntrySet() - - override fun iterator(): MutableIterator> { - return object : MutableIterator> { - private val parent = setParent.iterator() - - override fun hasNext(): Boolean { - return parent.hasNext() - } - - override fun next(): MutableMap.MutableEntry { - return parent.next() - } - - override fun remove() { - parent.remove() - isDirty = true - } - } - } - - override fun remove(element: MutableMap.MutableEntry): Boolean { - if (setParent.remove(element)) { - isDirty = true - return true - } - - return false - } - - override fun removeAll(elements: Collection>): Boolean { - if (setParent.removeAll(elements)) { - isDirty = true - return true - } - - return false - } - - override fun retainAll(elements: Collection>): Boolean { - if (setParent.retainAll(elements)) { - isDirty = true - return true - } - - return false - } - - override val size: Int - get() = setParent.size - - override fun contains(element: MutableMap.MutableEntry): Boolean { - return setParent.contains(element) - } - - override fun containsAll(elements: Collection>): Boolean { - return setParent.containsAll(elements) - } - - override fun isEmpty(): Boolean { - return setParent.isEmpty() - } - } - } - - override val keys: MutableSet by lazy { - object : MutableSet { - val parent = this@SavedCountingMap.map.keys - - override fun add(element: Int): Boolean { - throw UnsupportedOperationException() - } - - override fun addAll(elements: Collection): Boolean { - throw UnsupportedOperationException() - } - - override fun clear() { - this@SavedCountingMap.clear() - } - - override fun iterator(): MutableIterator { - return object : MutableIterator { - private val parentIterator = parent.iterator() - - override fun hasNext(): Boolean { - return parentIterator.hasNext() - } - - override fun next(): Int { - return parentIterator.nextInt() - } - - override fun remove() { - parentIterator.remove() - isDirty = true - } - } - } - - override fun remove(element: Int): Boolean { - return this@SavedCountingMap.remove(element) != null - } - - override fun removeAll(elements: Collection): Boolean { - var changes = false - - for (element in elements) { - changes = remove(element) || changes - } - - return changes - } - - override fun retainAll(elements: Collection): Boolean { - val iterator = this.iterator() - var changes = false - - for (element in iterator) { - if (element !in elements) { - iterator.remove() - changes = true - } - } - - return changes - } - - override val size: Int - get() = parent.size - - override fun contains(element: Int): Boolean { - return parent.contains(element) - } - - override fun containsAll(elements: Collection): Boolean { - return parent.containsAll(elements) - } - - override fun isEmpty(): Boolean { - return parent.isEmpty() - } - } - } - - override val values: MutableCollection by lazy { - object : MutableCollection { - private val parent = this@SavedCountingMap.map.values - - override val size: Int - get() = parent.size - - override fun contains(element: T): Boolean { - return parent.contains(element) - } - - override fun containsAll(elements: Collection): Boolean { - return parent.containsAll(elements) - } - - override fun isEmpty(): Boolean { - return parent.isEmpty() - } - - override fun add(element: T): Boolean { - throw UnsupportedOperationException() - } - - override fun addAll(elements: Collection): Boolean { - throw UnsupportedOperationException() - } - - override fun clear() { - this@SavedCountingMap.clear() - } - - override fun iterator(): MutableIterator { - return object : MutableIterator { - private val parentIterator = parent.iterator() - - override fun hasNext(): Boolean { - return parentIterator.hasNext() - } - - override fun next(): T { - return parentIterator.next() - } - - override fun remove() { - parentIterator.remove() - isDirty = true - } - } - } - - override fun remove(element: T): Boolean { - val indexOf = this@SavedCountingMap.map.firstNotNullOfOrNull { if (it.value == element) it.key else null } ?: return false - this@SavedCountingMap.remove(indexOf) - return true - } - - override fun removeAll(elements: Collection): Boolean { - var changes = false - - for (element in elements) { - changes = remove(element) || changes - } - - return changes - } - - override fun retainAll(elements: Collection): Boolean { - val iterator = this.iterator() - var changes = false - - for (element in iterator) { - if (element !in elements) { - iterator.remove() - changes = true - } - } - - return changes - } - } - } - - override fun clear() { - isDirty = true - return map.clear() - } - - override fun put(key: Int, value: T): T? { - val existing = map.put(key, value) - - if (existing == value) { - return existing - } - - isDirty = true - return existing - } - - override fun putAll(from: Map) { - isDirty = true - return map.putAll(from) - } - - override fun remove(key: Int): T? { - val removed = map.remove(key) - - if (removed != null) { - isDirty = true - } - - return removed - } - override fun save(output: CompoundTag): CompoundTag { output["map"] = ListTag().also { for ((key, value) in this.map) { From a9d78fc31a23e8aba360f591ccc0942333940629 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 13:49:37 +0700 Subject: [PATCH 15/39] Quantum battery now display power level on client --- .../mc/otm/OverdriveThatMatters.java | 3 + .../dbotthepony/mc/otm/GlobalEventHandler.kt | 6 +- .../mc/otm/container/ContainerIterator.kt | 28 ++++++ .../dbotthepony/mc/otm/container/Iterators.kt | 24 ----- .../dbotthepony/mc/otm/core/MenuIterator.kt | 30 ++++++ .../mc/otm/item/QuantumBatteryItem.kt | 93 ++++++++++++++++++- .../mc/otm/network/GenericNetworkChannel.kt | 13 +++ 7 files changed, 166 insertions(+), 31 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java index ab93ceed1..3a1c6cdcc 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java +++ b/src/main/java/ru/dbotthepony/mc/otm/OverdriveThatMatters.java @@ -24,6 +24,7 @@ import ru.dbotthepony.mc.otm.client.model.TritaniumArmorModel; import ru.dbotthepony.mc.otm.compat.mekanism.QIOKt; import ru.dbotthepony.mc.otm.compat.mekanism.TooltipsKt; import ru.dbotthepony.mc.otm.core.ImpreciseFraction; +import ru.dbotthepony.mc.otm.item.QuantumBatteryItem; import ru.dbotthepony.mc.otm.item.weapon.AbstractWeaponItem; import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem; import ru.dbotthepony.mc.otm.matter.MatterDataKt; @@ -88,6 +89,7 @@ public final class OverdriveThatMatters { MinecraftForge.EVENT_BUS.register(MatterDataKt.class); MinecraftForge.EVENT_BUS.register(ExplosionQueue.Companion); MinecraftForge.EVENT_BUS.register(AbstractWeaponItem.Companion); + MinecraftForge.EVENT_BUS.addListener(QuantumBatteryItem.Companion::tick); FMLJavaModLoadingContext.get().getModEventBus().register(MatteryCapability.class); @@ -105,6 +107,7 @@ public final class OverdriveThatMatters { WeaponNetworkChannel.INSTANCE.register(); RegistryNetworkChannel.INSTANCE.register(); WorldNetworkChannel.INSTANCE.register(); + GenericNetworkChannel.INSTANCE.register(); ITEM_STORAGE = StorageRegistry.register(ItemStackWrapper.class, ItemStackWrapper.EMPTY, new ImpreciseFraction("3.125")); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt index 076683ed5..b61ca6dee 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/GlobalEventHandler.kt @@ -118,6 +118,8 @@ private var _server: MinecraftServer? = null private var _serverThread: Thread? = null private var _clientThread: Thread? = null +val isClient: Boolean get() = _clientThread !== null + fun recordClientThread() { if (_clientThread != null) { throw IllegalStateException("Already have client channel") @@ -127,13 +129,13 @@ fun recordClientThread() { } fun runIfClient(lambda: () -> Unit) { - if (_clientThread !== null) { + if (isClient) { lambda.invoke() } } fun runIfClient(value: V, lambda: () -> V): V { - if (_clientThread !== null) { + if (isClient) { return lambda.invoke() } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt new file mode 100644 index 000000000..73036c966 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt @@ -0,0 +1,28 @@ +package ru.dbotthepony.mc.otm.container + +import net.minecraft.world.Container +import net.minecraft.world.item.ItemStack + +class ContainerIterator(private val container: Container) : MutableIterator { + private var index = 0 + + override fun hasNext(): Boolean { + return index < container.containerSize + } + + override fun next(): ItemStack { + if (index >= container.containerSize) { + throw IllegalStateException("Already finished iterating") + } + + return container[index++] + } + + override fun remove() { + if (index == 0) { + throw IllegalStateException("Never called next()") + } + + container[index - 1] = ItemStack.EMPTY + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt index 465be0375..e1ce0b281 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt @@ -6,30 +6,6 @@ import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ICapabilityProvider import ru.dbotthepony.mc.otm.core.ifPresentK -class ContainerIterator(private val container: Container) : MutableIterator { - private var index = 0 - - override fun hasNext(): Boolean { - return index < container.containerSize - } - - override fun next(): ItemStack { - if (index >= container.containerSize) { - throw IllegalStateException("Already finished iterating") - } - - return container[index++] - } - - override fun remove() { - if (index == 0) { - throw IllegalStateException("Never called next()") - } - - container[index - 1] = ItemStack.EMPTY - } -} - open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { private var itemStack: ItemStack? = null private var searched = false diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt new file mode 100644 index 000000000..836534a6a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt @@ -0,0 +1,30 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.item.ItemStack + +class MenuIterator(private val menu: AbstractContainerMenu) : MutableIterator { + private var index = 0 + + override fun hasNext(): Boolean { + return index < menu.slots.size + } + + override fun next(): ItemStack { + if (index >= menu.slots.size) { + throw IllegalStateException("Already finished iterating") + } + + return menu.slots[index++].item + } + + override fun remove() { + if (index == 0) { + throw IllegalStateException("Never called next()") + } + + menu.slots[index - 1].set(ItemStack.EMPTY) + } +} + +fun AbstractContainerMenu.itemStackIterator() : MutableIterator = MenuIterator(this) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt index 9915197ba..a323f0d7a 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt @@ -1,24 +1,35 @@ package ru.dbotthepony.mc.otm.item +import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap +import it.unimi.dsi.fastutil.ints.IntAVLTreeSet import net.minecraft.ChatFormatting import net.minecraft.core.Direction import net.minecraft.nbt.CompoundTag +import net.minecraft.network.FriendlyByteBuf import net.minecraft.network.chat.Component -import net.minecraft.world.item.Item -import net.minecraft.world.item.ItemStack -import net.minecraft.world.item.Rarity -import net.minecraft.world.item.TooltipFlag +import net.minecraft.world.item.* import net.minecraft.world.level.Level import net.minecraftforge.common.capabilities.Capability import net.minecraftforge.common.capabilities.ForgeCapabilities import net.minecraftforge.common.capabilities.ICapabilityProvider import net.minecraftforge.common.util.LazyOptional +import net.minecraftforge.event.TickEvent +import net.minecraftforge.event.TickEvent.ServerTickEvent +import net.minecraftforge.network.NetworkEvent +import net.minecraftforge.registries.ForgeRegistries +import net.minecraftforge.registries.ForgeRegistry import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.core.itemStackIterator +import ru.dbotthepony.mc.otm.container.nonEmpty import ru.dbotthepony.mc.otm.core.* +import ru.dbotthepony.mc.otm.network.GenericNetworkChannel +import ru.dbotthepony.mc.otm.network.MatteryPacket +import ru.dbotthepony.mc.otm.network.packetHandled import ru.dbotthepony.mc.otm.saveddata.SavedCountingMap import ru.dbotthepony.mc.otm.saveddata.SavedMapDelegate +import java.util.function.Supplier class QuantumBatteryItem : Item { private inner class Power(private val stack: ItemStack) : IMatteryEnergyStorage, ICapabilityProvider { @@ -112,6 +123,10 @@ class QuantumBatteryItem : Item { determineQuantumLink() } + if (isClientThread()) { + return clientPowerMap[delegate.index] ?: delegate.value + } + return delegate.value } @@ -142,7 +157,23 @@ class QuantumBatteryItem : Item { delegate = saveData?.computeIfAbsent(existing) ?: SavedMapDelegate(null, existing, delegate.value) } } else if (!isServerThread()) { - // client + // client ? + val existing = stack.tag?.getInt("link_id") ?: return + + if (existing != delegate.index) { + delegate = SavedMapDelegate(delegate.parent, existing, delegate.value) + } + } + } + + fun determineQuantumLinkWeak() { + if (delegate.parent == null && isServerThread()) { + val existing = stack.tag?.getInt("link_id") + + if (existing != null) { + delegate = saveData?.computeIfAbsent(existing) ?: SavedMapDelegate(null, existing, delegate.value) + } + } else if (!isServerThread()) { val existing = stack.tag?.getInt("link_id") ?: return if (existing != delegate.index) { @@ -170,6 +201,11 @@ class QuantumBatteryItem : Item { return null } + val clientPowerMap: Int2ObjectAVLTreeMap by lazy { + check(isClient) { "Invalid side" } + Int2ObjectAVLTreeMap() + } + constructor(saveDataID: String) : super(Properties().stacksTo(1).rarity(Rarity.EPIC).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB)) { isCreative = true capacity = null @@ -216,4 +252,51 @@ class QuantumBatteryItem : Item { components.add(TranslatableComponent("otm.item.quantum_link_id", power.delegate.index).withStyle(ChatFormatting.DARK_GRAY)) } + + companion object { + fun readPacket(buff: FriendlyByteBuf): ChargePacket { + return ChargePacket( + (ForgeRegistries.ITEMS as ForgeRegistry).getValue(buff.readInt()) as QuantumBatteryItem, + buff.readInt(), + buff.readImpreciseFraction() + ) + } + + fun tick(event: ServerTickEvent) { + if (event.phase == TickEvent.Phase.END) { + for (ply in event.server.playerList.players) { + val networkedChannels = IntAVLTreeSet() + + for (item in ply.containerMenu.itemStackIterator().nonEmpty()) { + if (item.item is QuantumBatteryItem) { + val power = item.getCapability(MatteryCapability.ENERGY).orThrow() as Power + + power.determineQuantumLinkWeak() + + if (power.delegate.index < 0) { + continue + } + + if (networkedChannels.add(power.delegate.index)) { + GenericNetworkChannel.send(ply, ChargePacket(item.item as QuantumBatteryItem, power.delegate.index, power.batteryLevel)) + } + } + } + } + } + } + } + + class ChargePacket(val type: QuantumBatteryItem, val channel: Int, val value: ImpreciseFraction) : MatteryPacket { + override fun write(buff: FriendlyByteBuf) { + buff.writeInt((ForgeRegistries.ITEMS as ForgeRegistry).getID(type)) + buff.writeInt(channel) + buff.writeImpreciseFraction(value) + } + + override fun play(context: Supplier) { + context.packetHandled = true + type.clientPowerMap[channel] = value + } + } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt new file mode 100644 index 000000000..be695f2e8 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/network/GenericNetworkChannel.kt @@ -0,0 +1,13 @@ +package ru.dbotthepony.mc.otm.network + +import net.minecraftforge.network.NetworkDirection +import ru.dbotthepony.mc.otm.item.QuantumBatteryItem + +object GenericNetworkChannel : MatteryNetworkChannel( + version = "1", + name = "generic" +) { + fun register() { + add(QuantumBatteryItem.ChargePacket::class.java, QuantumBatteryItem.Companion::readPacket, NetworkDirection.PLAY_TO_CLIENT) + } +} From a355767ea6f8605fe950a24e4d3dca4e7d56bac7 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 13:55:56 +0700 Subject: [PATCH 16/39] Move iterators to more appropriate places --- .../mc/otm/android/AndroidResearchBuilder.kt | 5 +- .../block/entity/PatternStorageBlockEntity.kt | 4 +- .../ru/dbotthepony/mc/otm/capability/Ext.kt | 4 +- .../mc/otm/container/ContainerIterator.kt | 4 +- .../ru/dbotthepony/mc/otm/container/Ext.kt | 39 +++++ .../dbotthepony/mc/otm/container/Iterators.kt | 147 ------------------ .../mc/otm/core/CapabilityIterators.kt | 59 +++++++ .../mc/otm/core/ItemStackIterators.kt | 51 ++++++ .../mc/otm/item/QuantumBatteryItem.kt | 2 +- .../mc/otm/menu/ItemMonitorMenu.kt | 6 +- 10 files changed, 161 insertions(+), 160 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt index 6084ce9d9..4f9d5ca5d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/android/AndroidResearchBuilder.kt @@ -8,7 +8,8 @@ import net.minecraft.resources.ResourceLocation import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.SkinElement -import ru.dbotthepony.mc.otm.container.nonEmptyIterator +import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.registry.MRegistry import kotlin.collections.ArrayList @@ -260,7 +261,7 @@ class AndroidResearchBuilder( for (item in items) { var required = item.count - val iterator = capability.ply.inventory.nonEmptyIterator() + val iterator = capability.ply.inventory.iterator().nonEmpty() for (invItem in iterator) { if (ItemStack.isSameItemSameTags(invItem, item)) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt index 7ab535bbe..3e20f6baa 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/PatternStorageBlockEntity.kt @@ -9,7 +9,6 @@ import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.block.matter.PatternStorageBlock import net.minecraft.nbt.CompoundTag import net.minecraftforge.common.util.LazyOptional -import net.minecraftforge.items.CapabilityItemHandler import net.minecraft.world.entity.player.Inventory import net.minecraft.world.entity.player.Player import net.minecraft.world.inventory.AbstractContainerMenu @@ -25,13 +24,12 @@ import net.minecraftforge.common.capabilities.ForgeCapabilities import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.capability.matter.* import ru.dbotthepony.mc.otm.container.forEachCapability -import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.iterator import ru.dbotthepony.mc.otm.graph.Graph6Node import ru.dbotthepony.mc.otm.graph.matter.IMatterGraphNode import ru.dbotthepony.mc.otm.graph.matter.MatterNetworkGraph import ru.dbotthepony.mc.otm.core.ifHas import ru.dbotthepony.mc.otm.registry.MBlockEntities -import ru.dbotthepony.mc.otm.container.set import ru.dbotthepony.mc.otm.core.set import java.util.ArrayList diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 4e0ede534..039326589 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -1,8 +1,6 @@ package ru.dbotthepony.mc.otm.capability import net.minecraft.core.Direction -import net.minecraft.world.Container -import net.minecraft.world.entity.LivingEntity import net.minecraft.world.entity.player.Player import net.minecraft.world.item.ItemStack import net.minecraftforge.common.capabilities.ForgeCapabilities @@ -12,7 +10,7 @@ import net.minecraftforge.energy.IEnergyStorage import net.minecraftforge.fml.ModList import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy -import ru.dbotthepony.mc.otm.container.iterator +import ru.dbotthepony.mc.otm.core.iterator import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.orNull diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt index 73036c966..01dcca7c0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/container/ContainerIterator.kt @@ -25,4 +25,6 @@ class ContainerIterator(private val container: Container) : MutableIterator Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { + for (value in iterator(cap)) { + consumer(value) + } +} + +inline fun Container.forEach(cap: Capability, consumer: (ItemStack, T) -> Unit) { + for ((a, b) in iterator(cap)) { + consumer(a, b) + } +} + +inline fun Container.forEachItem(cap: Capability, consumer: (ItemStack) -> Unit) { + for (pair in iterator(cap)) { + consumer(pair.first) + } +} + +inline fun Container.forEachCapability(cap: Capability, consumer: (T) -> Unit) { + for (pair in iterator(cap)) { + consumer(pair.second) + } +} + +inline fun Container.forEach(lambda: (ItemStack) -> Unit) { + for (value in iterator()) { + lambda(value) + } +} + +inline fun Container.forEachNonEmpty(lambda: (ItemStack) -> Unit) { + for (value in iterator().nonEmpty()) { + lambda(value) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt deleted file mode 100644 index e1ce0b281..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/container/Iterators.kt +++ /dev/null @@ -1,147 +0,0 @@ -package ru.dbotthepony.mc.otm.container - -import net.minecraft.world.Container -import net.minecraft.world.item.ItemStack -import net.minecraftforge.common.capabilities.Capability -import net.minecraftforge.common.capabilities.ICapabilityProvider -import ru.dbotthepony.mc.otm.core.ifPresentK - -open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { - private var itemStack: ItemStack? = null - private var searched = false - - private fun search() { - searched = true - - if (itemStack != null) { - return - } - - for (stack in parent) { - if (!stack.isEmpty) { - itemStack = stack - return - } - } - } - - override fun hasNext(): Boolean { - if (!searched) { - search() - } - - return itemStack != null - } - - override fun next(): ItemStack { - if (!searched) { - search() - } - - val itemStack = itemStack ?: throw IllegalStateException("No next element") - this.itemStack = null - this.searched = false - return itemStack - } -} - -class NonEmptyMutableItemStackIterator(override val parent: MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { - override fun remove() { - parent.remove() - } -} - -open class CapabilityIterator

(protected open val parent: Iterator

, private val cap: Capability) : Iterator> { - private var provider: P? = null - private var capability: T? = null - private var searched = false - - private fun search() { - searched = true - - if (provider != null) { - return - } - - for (provider in parent) { - provider.getCapability(cap).ifPresentK { - this.provider = provider - capability = it - return - } - } - } - - override fun hasNext(): Boolean { - if (!searched) { - search() - } - - return provider != null - } - - override fun next(): Pair { - if (!searched) { - search() - } - - val provider = provider ?: throw IllegalStateException("No next element") - val capability = capability ?: throw IllegalStateException("No next element") - this.provider = null - this.capability = null - this.searched = false - return provider to capability - } -} - -class MutableCapabilityIterator

(override val parent: MutableIterator

, cap: Capability) : CapabilityIterator(parent, cap), MutableIterator> { - override fun remove() { - parent.remove() - } -} - -fun Container.iterator() = ContainerIterator(this) -fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) -fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) -fun Container.nonEmptyIterator() = iterator().nonEmpty() - -fun Container.iterator(cap: Capability) = CapabilityIterator(nonEmptyIterator(), cap) - -fun

Iterator

.filtered(cap: Capability) = CapabilityIterator(this, cap) -fun

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) - -inline fun Container.forEach(cap: Capability, consumer: (Pair) -> Unit) { - for (value in iterator(cap)) { - consumer(value) - } -} - -inline fun Container.forEach(cap: Capability, consumer: (ItemStack, T) -> Unit) { - for ((a, b) in iterator(cap)) { - consumer(a, b) - } -} - -inline fun Container.forEachItem(cap: Capability, consumer: (ItemStack) -> Unit) { - for (pair in iterator(cap)) { - consumer(pair.first) - } -} - -inline fun Container.forEachCapability(cap: Capability, consumer: (T) -> Unit) { - for (pair in iterator(cap)) { - consumer(pair.second) - } -} - -inline fun Container.forEach(lambda: (ItemStack) -> Unit) { - for (value in iterator()) { - lambda(value) - } -} - -inline fun Container.forEachNonEmpty(lambda: (ItemStack) -> Unit) { - for (value in nonEmptyIterator()) { - lambda(value) - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt new file mode 100644 index 000000000..c8c756788 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/CapabilityIterators.kt @@ -0,0 +1,59 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.Container +import net.minecraftforge.common.capabilities.Capability +import net.minecraftforge.common.capabilities.ICapabilityProvider +import ru.dbotthepony.mc.otm.container.iterator + +open class CapabilityIterator

(protected open val parent: Iterator

, private val cap: Capability) : Iterator> { + private var provider: P? = null + private var capability: T? = null + private var searched = false + + private fun search() { + searched = true + + if (provider != null) { + return + } + + for (provider in parent) { + provider.getCapability(cap).ifPresentK { + this.provider = provider + capability = it + return + } + } + } + + override fun hasNext(): Boolean { + if (!searched) { + search() + } + + return provider != null + } + + override fun next(): Pair { + if (!searched) { + search() + } + + val provider = provider ?: throw IllegalStateException("No next element") + val capability = capability ?: throw IllegalStateException("No next element") + this.provider = null + this.capability = null + this.searched = false + return provider to capability + } +} + +class MutableCapabilityIterator

(override val parent: MutableIterator

, cap: Capability) : CapabilityIterator(parent, cap), MutableIterator> { + override fun remove() { + parent.remove() + } +} + +fun Container.iterator(cap: Capability) = CapabilityIterator(iterator().nonEmpty(), cap) +fun

Iterator

.filtered(cap: Capability) = CapabilityIterator(this, cap) +fun

MutableIterator

.filtered(cap: Capability) = MutableCapabilityIterator(this, cap) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt new file mode 100644 index 000000000..01bbe5fbc --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/ItemStackIterators.kt @@ -0,0 +1,51 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.item.ItemStack + +open class NonEmptyItemStackIterator(protected open val parent: Iterator) : Iterator { + private var itemStack: ItemStack? = null + private var searched = false + + private fun search() { + searched = true + + if (itemStack != null) { + return + } + + for (stack in parent) { + if (!stack.isEmpty) { + itemStack = stack + return + } + } + } + + override fun hasNext(): Boolean { + if (!searched) { + search() + } + + return itemStack != null + } + + override fun next(): ItemStack { + if (!searched) { + search() + } + + val itemStack = itemStack ?: throw IllegalStateException("No next element") + this.itemStack = null + this.searched = false + return itemStack + } +} + +class NonEmptyMutableItemStackIterator(override val parent: MutableIterator) : NonEmptyItemStackIterator(parent), MutableIterator { + override fun remove() { + parent.remove() + } +} + +fun Iterator.nonEmpty() = NonEmptyItemStackIterator(this) +fun MutableIterator.nonEmpty() = NonEmptyMutableItemStackIterator(this) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt index a323f0d7a..c25b015ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/QuantumBatteryItem.kt @@ -22,7 +22,7 @@ import ru.dbotthepony.mc.otm.* import ru.dbotthepony.mc.otm.capability.IMatteryEnergyStorage import ru.dbotthepony.mc.otm.capability.MatteryCapability import ru.dbotthepony.mc.otm.core.itemStackIterator -import ru.dbotthepony.mc.otm.container.nonEmpty +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.core.* import ru.dbotthepony.mc.otm.network.GenericNetworkChannel import ru.dbotthepony.mc.otm.network.MatteryPacket diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt index 47da9e5e8..789d5c7ac 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ItemMonitorMenu.kt @@ -11,7 +11,7 @@ import net.minecraftforge.network.PacketDistributor import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorBlockEntity import ru.dbotthepony.mc.otm.block.entity.storage.ItemMonitorPlayerSettings import ru.dbotthepony.mc.otm.container.get -import ru.dbotthepony.mc.otm.container.nonEmptyIterator +import ru.dbotthepony.mc.otm.core.nonEmpty import ru.dbotthepony.mc.otm.menu.data.INetworkedItemViewProvider import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView import ru.dbotthepony.mc.otm.network.MenuNetworkChannel @@ -198,7 +198,7 @@ class ItemMonitorMenu @JvmOverloads constructor( var maxStack = 64 if (settings.craftingAmount == ItemMonitorPlayerSettings.Amount.FULL) { - for (gridItem in tile.craftingGrid.nonEmptyIterator()) { + for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { if (!gridItem.isStackable) { hasUnstackables = true break @@ -207,7 +207,7 @@ class ItemMonitorMenu @JvmOverloads constructor( } else { maxStack = 0 - for (gridItem in tile.craftingGrid.nonEmptyIterator()) { + for (gridItem in tile.craftingGrid.iterator().nonEmpty()) { maxStack = maxStack.coerceAtLeast(gridItem.maxStackSize) } } From 96eb3c3491e3aaca671e4af354be4ceaa5e74464 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 14:00:13 +0700 Subject: [PATCH 17/39] a --- src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt index 039326589..49f341a1f 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/Ext.kt @@ -10,6 +10,7 @@ import net.minecraftforge.energy.IEnergyStorage import net.minecraftforge.fml.ModList import ru.dbotthepony.mc.otm.compat.mekanism.getMekanismEnergySided import ru.dbotthepony.mc.otm.compat.mekanism.mekanismEnergy +import ru.dbotthepony.mc.otm.container.iterator import ru.dbotthepony.mc.otm.core.iterator import ru.dbotthepony.mc.otm.core.ImpreciseFraction import ru.dbotthepony.mc.otm.core.orNull @@ -173,4 +174,4 @@ fun Player.extendedItemIterator(): MutableIterator { } } } -} \ No newline at end of file +} From 732039b321eda22ca83be2799b3ac8c5d532c587 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 14:04:20 +0700 Subject: [PATCH 18/39] Generalize slot iterator --- .../dbotthepony/mc/otm/core/MenuIterator.kt | 30 ------------------- .../dbotthepony/mc/otm/core/SlotIterator.kt | 26 ++++++++++++++++ 2 files changed, 26 insertions(+), 30 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt deleted file mode 100644 index 836534a6a..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/MenuIterator.kt +++ /dev/null @@ -1,30 +0,0 @@ -package ru.dbotthepony.mc.otm.core - -import net.minecraft.world.inventory.AbstractContainerMenu -import net.minecraft.world.item.ItemStack - -class MenuIterator(private val menu: AbstractContainerMenu) : MutableIterator { - private var index = 0 - - override fun hasNext(): Boolean { - return index < menu.slots.size - } - - override fun next(): ItemStack { - if (index >= menu.slots.size) { - throw IllegalStateException("Already finished iterating") - } - - return menu.slots[index++].item - } - - override fun remove() { - if (index == 0) { - throw IllegalStateException("Never called next()") - } - - menu.slots[index - 1].set(ItemStack.EMPTY) - } -} - -fun AbstractContainerMenu.itemStackIterator() : MutableIterator = MenuIterator(this) \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt new file mode 100644 index 000000000..e61bcf4d2 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt @@ -0,0 +1,26 @@ +package ru.dbotthepony.mc.otm.core + +import net.minecraft.world.inventory.AbstractContainerMenu +import net.minecraft.world.inventory.Slot +import net.minecraft.world.item.ItemStack + +private class SlotIterator(private val parent: Iterator) : MutableIterator { + private var last: Slot? = null + + override fun hasNext(): Boolean { + return parent.hasNext() + } + + override fun next(): ItemStack { + return parent.next().also { last = it }.item + } + + override fun remove() { + val last = last ?: throw IllegalStateException("Never called next()") + last.set(ItemStack.EMPTY) + } +} + +fun AbstractContainerMenu.itemStackIterator() : MutableIterator = SlotIterator(slots.iterator()) +fun List.itemStackIterator() : MutableIterator = SlotIterator(iterator()) +fun Iterator.asItemStackIterator() : MutableIterator = SlotIterator(this) From 17e1f58a13dea0c405b22419589adb925e94fb52 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 14:15:16 +0700 Subject: [PATCH 19/39] actually --- src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt index e61bcf4d2..e8bcb616c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/SlotIterator.kt @@ -22,5 +22,5 @@ private class SlotIterator(private val parent: Iterator) : MutableIterator } fun AbstractContainerMenu.itemStackIterator() : MutableIterator = SlotIterator(slots.iterator()) -fun List.itemStackIterator() : MutableIterator = SlotIterator(iterator()) +fun Iterable.itemStackIterator() : MutableIterator = SlotIterator(iterator()) fun Iterator.asItemStackIterator() : MutableIterator = SlotIterator(this) From 37234e6503c06a2d8c30fd22fc73bc1f8550a66c Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 15:59:01 +0700 Subject: [PATCH 20/39] Refactor widgets atlas --- .../client/screen/panels/AbstractSlotPanel.kt | 10 ++++---- .../mc/otm/client/screen/panels/CheckBox.kt | 8 +++---- .../mc/otm/client/screen/widget/Gauges.kt | 22 +++++++++--------- .../textures/gui/widgets.png | Bin 3270 -> 3051 bytes .../textures/gui/widgets.xcf | 4 ++-- 5 files changed, 21 insertions(+), 23 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt index b9b59d0b7..04da77a37 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/AbstractSlotPanel.kt @@ -23,9 +23,8 @@ abstract class AbstractSlotPanel @JvmOverloads constructor( ) : EditablePanel( screen, parent, x, y, width, height ) { - protected open fun renderSlotBackground(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float) { - RenderSystem.setShaderTexture(0, WidgetLocation.WIDGETS) - drawTexturedRectAuto(stack, 0f, 0f, 18f, 18f, 0f, 96f, 256f, 256f) + protected open fun renderSlotBackground(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + SLOT_BACKGROUND.render(stack, width = width, height = height) } protected open fun renderRegular(stack: PoseStack, itemstack: ItemStack, count_override: String? = null) { @@ -119,10 +118,9 @@ abstract class AbstractSlotPanel @JvmOverloads constructor( } companion object { - @JvmField val SLOT_HIGHLIGHT = RGBAColor(255, 255, 255, 100) - @JvmField val SLOT_HIGHLIGHT_DRAG = RGBAColor(200, 200, 200, 150) const val SIZE = 18f + val SLOT_BACKGROUND = WidgetLocation.WIDGETS.element(0f, 0f, SIZE, SIZE) } -} \ No newline at end of file +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt index 203385113..d9c736923 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/CheckBox.kt @@ -42,16 +42,16 @@ open class CheckBoxPanel( val CHECKBOX_UNCHECKED = SkinElement( WidgetLocation.WIDGETS, - x = 18f, - y = 65f, + x = 59f, + y = 241f, w = REGULAR_DIMENSIONS, h = REGULAR_DIMENSIONS, ) val CHECKBOX_CHECKED = SkinElement( WidgetLocation.WIDGETS, - x = 18f, - y = 80f, + x = 44f, + y = 241f, w = REGULAR_DIMENSIONS, h = REGULAR_DIMENSIONS, ) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt index 5ea9b5862..edcbea89d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt @@ -13,7 +13,7 @@ import ru.dbotthepony.mc.otm.core.formatPowerLevel import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget -open class PowerGaugePanel @JvmOverloads constructor( +open class PowerGaugePanel( screen: MatteryScreen<*>, parent: EditablePanel? = null, val widget: LevelGaugeWidget, @@ -65,8 +65,8 @@ open class PowerGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 48f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 48f, w = 9f, h = 48f) + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 202f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 211f, y = 0f, w = 9f, h = 48f) val GAUGE_BACKGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 238f, y = 0f, w = 18f, h = 48f) val GAUGE_FOREGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 220f, y = 0f, w = 18f, h = 48f) @@ -86,7 +86,7 @@ fun WidePowerGaugePanel( height: Float = 48f ) = PowerGaugePanel(screen, parent, widget, x, y, width, height) -open class MatterGaugePanel @JvmOverloads constructor( +open class MatterGaugePanel( screen: MatteryScreen<*>, parent: EditablePanel? = null, val widget: LevelGaugeWidget, @@ -120,12 +120,12 @@ open class MatterGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 0f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 0f, w = 9f, h = 48f) + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 184f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 193f, y = 0f, w = 9f, h = 48f) } } -open class PatternGaugePanel @JvmOverloads constructor( +open class PatternGaugePanel( screen: MatteryScreen<*>, parent: EditablePanel? = null, val widget: LevelGaugeWidget, @@ -159,8 +159,8 @@ open class PatternGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 148f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 9f, y = 148f, w = 9f, h = 48f) + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 166f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 175f, y = 0f, w = 9f, h = 48f) } } @@ -230,7 +230,7 @@ open class ProgressGaugePanel @JvmOverloads constructor( } companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 132f, w = 22f, h = 16f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 132f, w = 22f, h = 16f) + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 240f, w = 22f, h = 16f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 240f, w = 22f, h = 16f) } } diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.png b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.png index 8401ea7507420177e0839686c6759546241b76ef..de2812a3d57245cc92eb48493bbf3f9198303f7f 100644 GIT binary patch delta 2433 zcmaJ?dpOj27ytgoV2#_>8kEcQl4um!w3t`Sv}$v$CYKPS3nfINkmfh2*xF1rZo3J) zxsws)(qKmI&{9T;aT_ykO=C!MXUx3QAN%k7$9bObInQ&>`JB)Bp6AoHMXXaj2Ei(b z?`%z0PqelIpz_JtiQpMGIK$&yIK$lnzRcc8vbNmgu4@+a!*LhH=a+`L2j`IrimLRG z{9Ov0-x#ZXf_}V4-=VFwhUA?k1|K6F(5^*k-Euxh8m#otd7nwIDhlIOggMv2%(HEM znNP%xeanw#CGU>m92~ly{@K&hqYJAkgEFC_=g#vMdP0jkXJ|p$&WIt><|7hDVmX}NTfv#{&TDPjl$x3vAHB3g11356HNf)M z*Z||%=W&T>o;k@+{KANnrD%?CXp;4q(&g+GJ}gBurE9Y*LVkYbhHWJ5%LC+v(S=6R z@;^@g#Q(Wsn?<;;}ot>@X-n*%L< zW*Jo-W_*|zFYaoFrzFqz+FjebVf*_@!$j#GIgCS8TJ+z~u47&Ltv8sbN?XXhx7_f~ zl!pm|;G#r2w^Lq1&QkQwFl&@_tiNXaQ5^~UX|S{4#e62U-Y#-AE@1Otjjyt)r@zgo zscA_&;1+4Q{ifKDp7z@AEsbzrDf$(^yOm%=s@**cN0_fz49L#tt<)S>YFCtYi?=xB4NdQY64z(yuPr+HUA@5^ zR1EE@$z~XZ+bZq(-6?nf$z98wKd6u!@P-|FlN-V>#Y#y>?wd8=5L1MG21WAHD%yI6_9MEC-o z#L3$~R670n#cAU6{7LxUv0ZXt9uC!RsRovkO*PWM1h{L6)xfS{xBE4jl;sB^roSfyzX?>=<%}G33sI$5>^)Fx zw9Q8cOo&*lfGXf|^Ih}#1E`=qx`hKF zhI-lS?k&=ZiNa$Sc=hPyXvo=RC7vBmQ1x? zFCBVggMj~;cOZ->;m-gYT?tzl@ln>iu$1l%CgWwr1k#Msn|0|y;^97s73lLVHr0h! zrxDV%%81LRV&E6jlYzVT_F8;;i?dFFy$yYl`RWW{H^H$aincMtcEXo0D0u?zi8@Jr zXTjd@UUyhgPLDVa`hc>N8^X|i_l&1up}}+wBFD{~ayLZbqh7K##?c#MX_!+&HR5{85e@HQe!c0o;g?pF zEHR{=AgMJ-u0-Bg_m)$Gd~*ev?0+1}xPr{fZ4Pb1urlpr;cDRG5ydYxek#_(XxpOq zVU+n`8@wX8<_E<*!{9@=38KH>_6O504fPFQ%ySGrV?^y)99*p(sa}Yn1pEfYRAcZH z1Fn?!r(KRhEJK(I#nfW(f#)SdM2J<_4siXNL4nfx#4Xh*aAluTcPkk*evs(UfZaYz zWlvB&gDR*Nk->e}3K_8sD=#7S2J?C|%L+MEXyW~hJV5pVy_u9JTtwl(P)hqt{~HM; z&@V&<^$9I!6}pQNhim_G{N?EnQMX^0&AGzKUZ6W^oGEn}dnT1$YGSB;MX!UV4bi2) zG2V{dL-~dz?KM?@gz%;zi|VM~-YVCZJPd4`o;KHqrHILSv6!C`0uN8nqhBprM|fUH z);^vj-$bu2YsakWJtLxD-G5&5M$r9vtJCLn1S>0pul4>FE=>RcEkjL@R-mT&|7;%s zQ6!UWO29YS>`aHhiu&22ZaEsu{ZdxZDX#oZvJGNS;bOkb^`3eB&TQmzs6hIFmZ!Xx zR;B!%+0r9*LjO*^sy9@ zazuOi?pDJF>*+y}NL2IK!Yx(9p(P>Qdh2tHg04pD>JD;u?&T$M@=SjzLhi@QZ}H(_ z#Ll7*g=bHeWNx{8=!t*n!AtEn$P~c13NY-FA4)x~oO{=ccj@S?eQRVq>Bi>bjWwS7=bScMo|tl1nV zS-JFB0Iw~S@uh}xPD58Oaf`>zo12k)bk&GV{;a)9;_76!t3tE>M6zsYt}lpjEv#BO zqU4MB^RMi2uawvT61=h4A%N$`4*Jz;d~2QOa2>l6@~24NdN(|`dPm2S*onO7qX;j? z*?m%Uv|b)@N5b4-IN--JC59k%w+~>T$OO&*R)H%95?1UpR0+=;2g#ASn5N&1Jhz delta 2766 zcmaKuc{J2}AIHDHF%6@PYYE8~g*M~fWQj7iEKjneL}IENCCg+D<@ck7C|#FZ8fy}j zm?9>`Op7QnsjDdyCTol#%gkhE%sg|S^ZfIi(|P{*zW(~0@ArM)=e*yaFGus$nuo&> zte}ti#pn~qp%MVa7w*muerNi*176vOm}}(O0xc&po^7n9IPfz6==o-?o3G24(3jFL z_z#+NA!vyLW^3IZet?ZCT8M4Fyzh8#TEUjk{ia$igEuUzKU|F4o@mi5w3h*RcT zK|=C!DqJ&L)xZ0=wN5QBX@S);lVCNl>p|V#fm)*m7Wd0!oVLEX_SK`Zo9xf=nc_la zSX2M(51+H&zebNRrEQm`%M&4U9Evmt7IS@g*~Qh4!A~B!M^?qJCG1;QyQ#AhMg{H9 ztZqyk;D)1}ou8(vF*glfvkyE>d8;&*>tO0S+-y9$#eX-ih=(F}|ap|ZLc1T`LOcq0GE#Lta|jb1iA48cT7Q-gag z!={_;(1(c$*WprrOjT3LS=?Z_-?P)EWQqTZA4R?|ueWRqNnJWF{xJeyyV?sEW2vdM zQp|Y=y;Yc{s?yZJ7W$WE4}w-p6Hl zE`NWaoWgSoNW4TFJkzNAxf)ZU{ua{llPg#ynS2vT&ox2RRqkm^7sd{sj~|(-bsaAJ zL>=VoT&RSpoeT$K1P*Vbv@z|il1hC&mfEv5tt?-(zCQb`yj%yDF*!QAeztkd#)O<0 zoWWQC=5D1N#cp(Q(ZWlaw|%wCTV8JQmA9;%P9B9C^$g$7H&#pLOE)0rBS2E%kKD@3 z#5qceHZJ2-G45<$?$eD~c=EeL{tev7m4S|b09+MRk(qA{yF&Muko<)QMI0AWOpI!4 zFy+y;iv0I77leb^aH0Cc2LTWAP*)^6p{N2|bb%&%X{sQZ!pzS1OdEi+FV?j#MUlr>U*BFTJklx@KezN$z!Ia?2s>LT{g)Xw6UW2QyUqz010SU@Pp72% z6FI90K|VVg zBsF@GjzL7tu;rybC)AT39eTtNEnIPOw;2WwY|v)hAEroZu?A4kZD`ajcRU9EO&%Oy zk7U}l0Ml-+Qjq(~jofLnK=`ZBGXa|F7{4lU1I!cPUWsI3z0zp*a{9$8=}g_XJt#xy z=`8vWvr4H66ZLYM%$_X2nc7Ucf;Dh0(MTbiDIM6V5QE7LQj-g{6_>S%a0!3N8IuP2SWXb_8d2cinLDiquSrlB~Zqz|tDs-NW! zZ0_`Lr!O6~0;UF#-yDsMKKP3wa=TcrKoZcpt6(alZXEbVx)@}DvI6uUcqIwJ0ZY`7 zPMFDI6x~3RrPyB{ih)(-%ZhA}&W3ua@7C4e_*-bSzhfOlScf(64AHYQYjwUmr!N~n zsV$84+YD7@76qxU$|wTC(s}b?<>FWJPbFhtUEa|iuO~IigV~MHQ*o27U{{lb`RRKM zyJ-*cdxoP-hO5-4hXlD zi2G3_8*`nK$34};oQ`9Z!IgI`k^MX1;+_Mipon^1{05wD6ks0Czs=;dzsOJ?S{l}C z4aWO=XoKm_tzOUxfMCG?$86TL2rqtW^>K}nRY_EP_w%9z&r9|^it7l%A1e3_-A-oa+QX;5<+J-~GG?g$X zm!)rAG%VNx03dwEoPTC}Q=im~|59{_ER*!VM~Av-men{kTb1bZI2ZHr|%!X>g#(l(2oC8d&rB5bsw~ znG#Wa12!9ymJWto6^Dg|)l)ZL2G;M<-fQPLSc8&*xh>Co8BkHNi(Ol6(n~l32eM9p z`rK4u8&4edav`%m>=u^ZYlSo!+GkVyLXcz8pet15iFU-sg6srr1u)$Vy)9L-X6XW1 zLV34gh%w^^y!}v_{=MN1q3#3}@?MobYG}}|>|%^eBpL-KQY_`!3TpJlaQYdc<#0qY z>Ya-#$k_q;)k{A3*q1OlLs1|<7u;6|>ILAasuX`trYgq{`umz_bF#H!VU7Iv>AfRw z2=qq`$gg90g1G`H7RcSr5qUAt7O*_numQ>125!;O<|5)u1GFAk&!ZpS?QAsz>VJaq zP*L^a^aIr!Ai`-ZJK|5EZZCVqcqjWWG-&UEto6Zq;0ZiDK*Q=Znb&oCK>aUJ!Z3j{ zP+y;@Av{pVMiX}eb9ou8^*+i0EV0`La3I37SnyE}Nr%-4?a9EKh$=WIoA{48*l$6= z)D+qySmJPGJwakCl`SvN8tv#-J^@QbS{avRJsn)a5 zyOvj_sOa%e-JF82P2X!SxnWP;?$57>;&x<*LbfHvy3K;ueXQNLb4@M@rmhE90SiEo z`zdg}+|2fg3ML*iEF_y@P>8_L<)81?lGtu|uvK9;dS*Ec#@#?2!-01IDE$n1K3GG| bgm2PU8_`qlS)puMfPlNpUgugzV*0-UYZ(*c diff --git a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf index a2d1f7936..d92884c98 100644 --- a/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf +++ b/src/main/resources/assets/overdrive_that_matters/textures/gui/widgets.xcf @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:23dae5bfdcdfdd4937f3b107a5553773a0f0c2dc99819e6c07892a0b7a3358df -size 48490 +oid sha256:7b4c94442e8d563837693ab8743838a20c8643979d2e0be369d0784c9a5b9a6a +size 52633 From 93ffd8bbd354acdeac1a15f20525177c467c30ab Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 16:35:52 +0700 Subject: [PATCH 21/39] Matter, but flowing --- .../mc/otm/client/screen/widget/Gauges.kt | 48 +++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt index edcbea89d..f03ffab02 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt @@ -1,9 +1,14 @@ package ru.dbotthepony.mc.otm.client.screen.widget import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.BufferUploader +import com.mojang.blaze3d.vertex.DefaultVertexFormat import com.mojang.blaze3d.vertex.PoseStack +import com.mojang.blaze3d.vertex.VertexFormat import net.minecraft.ChatFormatting +import net.minecraft.client.renderer.GameRenderer import net.minecraft.network.chat.Component +import org.lwjgl.opengl.GL11 import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.render.* import ru.dbotthepony.mc.otm.client.screen.MatteryScreen @@ -12,6 +17,9 @@ import ru.dbotthepony.mc.otm.core.formatMatterLevel import ru.dbotthepony.mc.otm.core.formatPowerLevel import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget +import java.util.Random +import kotlin.math.cos +import kotlin.math.sin open class PowerGaugePanel( screen: MatteryScreen<*>, @@ -106,8 +114,42 @@ open class MatterGaugePanel( override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { GAUGE_BACKGROUND.render(stack) - val height = this.height * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, y = this.height - height, height = height, winding = UVWindingOrder.U0_V1_U1_V0) + val height = this.height * (1f - widget.percentage()) + + RenderSystem.setShader(GameRenderer::getPositionTexShader) + RenderSystem.enableTexture() + RenderSystem.enableBlend() + RenderSystem.defaultBlendFunc() + RenderSystem.depthFunc(GL11.GL_ALWAYS) + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f) + + val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth + val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth + val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.h) / GAUGE_FOREGROUND.imageHeight + + val matrix = stack.last().pose() + val builder = tesselator.builder + + builder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_TEX) + + builder.vertex(matrix, 0f, this.height, 0f).uv(u0, v1).endVertex() + builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex() + + for (i in 4 downTo 0) { + val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat() + val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() + + val thisX = (width * (i / 4f)) + val thisY = (height + sin + cos).coerceAtLeast(0f) + + builder.vertex(matrix, thisX, thisY, 0f).uv( + (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth, + (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, + ).endVertex() + } + + BufferUploader.drawWithShader(builder.end()) } override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { @@ -164,7 +206,7 @@ open class PatternGaugePanel( } } -open class ProgressGaugePanel @JvmOverloads constructor( +open class ProgressGaugePanel( screen: MatteryScreen<*>, parent: EditablePanel? = null, val widget: ProgressGaugeWidget, From 276cfeda001b01077457babbff079bf48dee884e Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 17:23:29 +0700 Subject: [PATCH 22/39] Zero Point Module battery --- .../mc/otm/datagen/lang/English.kt | 8 ++ .../mc/otm/datagen/loot/LootModifiersData.kt | 3 +- .../mc/otm/capability/EnergyStorageImpl.kt | 8 +- .../mc/otm/item/SingleUseBatteryItem.kt | 81 +++++++++++++++++++ .../ru/dbotthepony/mc/otm/registry/MItems.kt | 1 + .../ru/dbotthepony/mc/otm/registry/MNames.kt | 2 + 6 files changed, 100 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/item/SingleUseBatteryItem.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index ec110f063..281f1eac8 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -53,6 +53,8 @@ private fun misc(provider: MatteryLanguageProvider) { gui("exosuit.already_activated", "You already have exosuit following you") + misc("battery.single_use", "Single use battery, can not be recharged.") + misc("exosuit.granted1", "As you keep pressing fingerprint reader, you are getting hurt in finger.") misc("exosuit.granted2", "After you raise your finger, fingerprint reader glows very bright.") misc("exosuit.granted3", "Then, fingerprint reader fades, leaving faint trace not of your finger, but of your very soul.") @@ -128,6 +130,9 @@ private fun misc(provider: MatteryLanguageProvider) { misc("item.power.normal.storage", "Stored energy: %s / %s") misc("item.power.normal.throughput", "Max I/O %s / %s") + misc("item.power.output_only", "Max output %s") + misc("item.power.input_only", "Max input %s") + misc("item.pattern.stored", "Stored patterns: %s / %s") misc("item.pattern.infinite.stored", "Stored patterns %s") misc("item.pattern.line", "%s [%s%%]") @@ -377,6 +382,9 @@ private fun items(provider: MatteryLanguageProvider) { add(MItems.TRITANIUM_ORE_CLUMP, "Raw Tritanium") add(MItems.PATTERN_DRIVE_NORMAL, "Pattern Drive") add(MItems.PATTERN_DRIVE_CREATIVE, "Creative Pattern Drive") + + add(MItems.ZPM_BATTERY, "Zero Point Module") + add(MItems.ZPM_BATTERY, "description", "Can be found in hands of those who travel between dimensions, if they ever reached different reality of origin of these constructs...") } } diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt index 5e7bf7912..eb9bfb77e 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/loot/LootModifiersData.kt @@ -39,11 +39,12 @@ fun addLootModifiers(it: LootModifiers) { ItemStack(MItems.PILL_ANDROID, 1) to 0.5 )) - it.add("end_city_pill", LootTableBasicAppender( + it.add("end_city_modifications", LootTableBasicAppender( arrayOf(LootTableIdCondition.Builder(ResourceLocation("chests/end_city_treasure")).build()), ItemStack(MItems.PILL_ANDROID, 1) to 0.1, ItemStack(MItems.PILL_HUMANE, 1) to 0.3, ItemStack(MItems.PILL_OBLIVION, 1) to 0.5, + ItemStack(MItems.ZPM_BATTERY, 1) to 0.005, )) it.add("shipwreck_supply_pill", LootTableBasicAppender( diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt index 01f9bd87a..444d78bce 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/capability/EnergyStorageImpl.kt @@ -47,9 +47,9 @@ sealed class ItemEnergyStorageImpl( protected set override var batteryLevel: ImpreciseFraction - get() = itemStack.tag?.get("energy")?.let { ImpreciseFraction.deserializeNBT(it) } ?: ImpreciseFraction.ZERO + get() = itemStack.tag?.get(NBT_KEY)?.let { ImpreciseFraction.deserializeNBT(it) } ?: ImpreciseFraction.ZERO protected set(value) { - itemStack.tagNotNull.put("energy", value.serializeNBT()) + itemStack.tagNotNull.put(NBT_KEY, value.serializeNBT()) } override fun extractEnergyOuter(howMuch: ImpreciseFraction, simulate: Boolean): ImpreciseFraction { @@ -127,6 +127,10 @@ sealed class ItemEnergyStorageImpl( override fun canReceive(): Boolean { return type != EnergyFlow.OUTPUT } + + companion object { + const val NBT_KEY = "energy" + } } open class EnergyConsumerItem(stack: ItemStack, maxBatteryLevel: ImpreciseFraction, maxInput: ImpreciseFraction? = null, maxOutput: ImpreciseFraction? = maxInput) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/item/SingleUseBatteryItem.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/item/SingleUseBatteryItem.kt new file mode 100644 index 000000000..29921c549 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/item/SingleUseBatteryItem.kt @@ -0,0 +1,81 @@ +package ru.dbotthepony.mc.otm.item + +import net.minecraft.ChatFormatting +import net.minecraft.nbt.CompoundTag +import net.minecraft.network.chat.Component +import net.minecraft.world.item.Item +import net.minecraft.world.item.ItemStack +import net.minecraft.world.item.Rarity +import net.minecraft.world.item.TooltipFlag +import net.minecraft.world.level.Level +import net.minecraftforge.common.capabilities.ICapabilityProvider +import ru.dbotthepony.mc.otm.OverdriveThatMatters +import ru.dbotthepony.mc.otm.capability.EnergyProducerItem +import ru.dbotthepony.mc.otm.capability.MatteryCapability +import ru.dbotthepony.mc.otm.core.* + +open class SingleUseBatteryItem( + val storage: ImpreciseFraction, + val throughput: ImpreciseFraction? = null, + properties: Properties = Properties().stacksTo(1).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB) +) : Item(properties) { + private inner class Power(itemStack: ItemStack) : EnergyProducerItem(itemStack, storage, throughput) { + init { + if (!itemStack.tagNotNull.contains(NBT_KEY)) { + batteryLevel = storage + } + } + } + + private val throughputText = throughput?.let { TranslatableComponent("otm.item.power.output_only", it.formatPower()).withStyle(ChatFormatting.GRAY) } + + override fun appendHoverText( + itemStack: ItemStack, + p_41422_: Level?, + list: MutableList, + p_41424_: TooltipFlag + ) { + super.appendHoverText(itemStack, p_41422_, list, p_41424_) + + list.add(SINGLE_USE) + + if (throughputText != null) { + list.add(throughputText) + } + + itemStack.getCapability(MatteryCapability.ENERGY).ifPresentK { + list.add(TranslatableComponent( + "otm.item.power.normal.storage", + it.batteryLevel.formatPower(), + it.maxBatteryLevel.formatPower() + ).withStyle(ChatFormatting.GRAY)) + } + } + + override fun initCapabilities(stack: ItemStack, nbt: CompoundTag?): ICapabilityProvider { + return Power(stack) + } + + companion object { + private val SINGLE_USE = TranslatableComponent("otm.battery.single_use").withStyle(ChatFormatting.GRAY) + } +} + +class ZPMItem : SingleUseBatteryItem(MAX_STORAGE, THROUGHPUT, Properties().stacksTo(1).rarity(Rarity.EPIC).tab(OverdriveThatMatters.INSTANCE.CREATIVE_TAB)) { + override fun appendHoverText( + itemStack: ItemStack, + p_41422_: Level?, + list: MutableList, + p_41424_: TooltipFlag + ) { + super.appendHoverText(itemStack, p_41422_, list, p_41424_) + list.add(DESCRIPTION) + } + + companion object { + val MAX_STORAGE = ImpreciseFraction(200_000_000_000_000L) + val THROUGHPUT = ImpreciseFraction(200_000_000L) + + private val DESCRIPTION = TranslatableComponent("item.${OverdriveThatMatters.MOD_ID}.zpm_battery.description").withStyle(ChatFormatting.DARK_GRAY) + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt index 8400e18a8..d2dcdd00b 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MItems.kt @@ -181,6 +181,7 @@ object MItems { val QUANTUM_BATTERY: Item by registry.register(MNames.QUANTUM_BATTERY) { QuantumBatteryItem(MNames.QUANTUM_BATTERY, ImpreciseFraction(20_000_000), ImpreciseFraction(10_000)) } val QUANTUM_CAPACITOR: Item by registry.register(MNames.QUANTUM_CAPACITOR) { QuantumBatteryItem(MNames.QUANTUM_CAPACITOR, ImpreciseFraction(1_000_000), ImpreciseFraction(200_000)) } val QUANTUM_BATTERY_CREATIVE: Item by registry.register(MNames.QUANTUM_BATTERY_CREATIVE) { QuantumBatteryItem(MNames.QUANTUM_BATTERY_CREATIVE) } + val ZPM_BATTERY: Item by registry.register(MNames.ZPM_BATTERY) { ZPMItem() } val BATTERIES = LazyList( { BATTERY_CRUDE }, diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt index fedfbbe83..9835bb743 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/registry/MNames.kt @@ -82,6 +82,8 @@ object MNames { const val PATTERN_DRIVE_NORMAL = "pattern_drive_normal" const val PATTERN_DRIVE_CREATIVE = "pattern_drive_creative" + const val ZPM_BATTERY = "zpm_battery" + const val NUTRIENT_PASTE = "nutrient_paste" const val PORTABLE_CONDENSATION_DRIVE = "portable_condensation_drive" From 8df7cf76a85ccb8056b4e4eab55cfbe1ca34ca4f Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 17:35:03 +0700 Subject: [PATCH 23/39] Split gauge panels file --- .../mc/otm/client/screen/widget/Gauges.kt | 278 ------------------ .../client/screen/widget/MatterGaugePanel.kt | 96 ++++++ .../client/screen/widget/PatternGaugePanel.kt | 53 ++++ .../client/screen/widget/PowerGaugePanel.kt | 83 ++++++ .../screen/widget/ProgressGaugePanel.kt | 84 ++++++ 5 files changed, 316 insertions(+), 278 deletions(-) delete mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt deleted file mode 100644 index f03ffab02..000000000 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/Gauges.kt +++ /dev/null @@ -1,278 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen.widget - -import com.mojang.blaze3d.systems.RenderSystem -import com.mojang.blaze3d.vertex.BufferUploader -import com.mojang.blaze3d.vertex.DefaultVertexFormat -import com.mojang.blaze3d.vertex.PoseStack -import com.mojang.blaze3d.vertex.VertexFormat -import net.minecraft.ChatFormatting -import net.minecraft.client.renderer.GameRenderer -import net.minecraft.network.chat.Component -import org.lwjgl.opengl.GL11 -import ru.dbotthepony.mc.otm.core.TranslatableComponent -import ru.dbotthepony.mc.otm.client.render.* -import ru.dbotthepony.mc.otm.client.screen.MatteryScreen -import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel -import ru.dbotthepony.mc.otm.core.formatMatterLevel -import ru.dbotthepony.mc.otm.core.formatPowerLevel -import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget -import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget -import java.util.Random -import kotlin.math.cos -import kotlin.math.sin - -open class PowerGaugePanel( - screen: MatteryScreen<*>, - parent: EditablePanel? = null, - val widget: LevelGaugeWidget, - x: Float = 0f, - y: Float = 0f, - width: Float = 9f, - height: Float = 48f -) : EditablePanel(screen, parent, x, y, width, height) { - init { - scissor = true - } - - protected open fun makeTooltip(): MutableList { - return mutableListOf( - TranslatableComponent("otm.gui.power.percentage_level", String.format("%.2f", widget.percentage() * 100.0)), - formatPowerLevel(widget.level(), widget.maxLevel()) - ) - } - - override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { - val height = this.height * widget.percentage() - - if (width >= 18f) { - GAUGE_BACKGROUND_WIDE.render(stack, width = width, height = this.height) - GAUGE_FOREGROUND_WIDE.renderPartial( - stack, - y = this.height - height, - height = height, - width = width, - winding = UVWindingOrder.U0_V1_U1_V0) - } else { - GAUGE_BACKGROUND.render(stack, width = width, height = this.height) - GAUGE_FOREGROUND.renderPartial( - stack, - y = this.height - height, - height = height, - width = width, - winding = UVWindingOrder.U0_V1_U1_V0) - } - } - - override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { - if (isHovered) { - screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) - return true - } - - return false - } - - companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 202f, y = 0f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 211f, y = 0f, w = 9f, h = 48f) - - val GAUGE_BACKGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 238f, y = 0f, w = 18f, h = 48f) - val GAUGE_FOREGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 220f, y = 0f, w = 18f, h = 48f) - } -} - -/** - * Shortcut to [PowerGaugePanel] with doubled width - */ -fun WidePowerGaugePanel( - screen: MatteryScreen<*>, - parent: EditablePanel? = null, - widget: LevelGaugeWidget, - x: Float = 0f, - y: Float = 0f, - width: Float = 18f, - height: Float = 48f -) = PowerGaugePanel(screen, parent, widget, x, y, width, height) - -open class MatterGaugePanel( - screen: MatteryScreen<*>, - parent: EditablePanel? = null, - val widget: LevelGaugeWidget, - x: Float = 0f, - y: Float = 0f -): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { - init { - scissor = true - } - - protected open fun makeTooltip(): MutableList { - return mutableListOf( - TranslatableComponent("otm.gui.matter.percentage_level", String.format("%.2f", widget.percentage() * 100.0)), - formatMatterLevel(widget.level(), widget.maxLevel()) - ) - } - - override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { - GAUGE_BACKGROUND.render(stack) - val height = this.height * (1f - widget.percentage()) - - RenderSystem.setShader(GameRenderer::getPositionTexShader) - RenderSystem.enableTexture() - RenderSystem.enableBlend() - RenderSystem.defaultBlendFunc() - RenderSystem.depthFunc(GL11.GL_ALWAYS) - - RenderSystem.setShaderColor(1f, 1f, 1f, 1f) - - val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth - val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth - val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.h) / GAUGE_FOREGROUND.imageHeight - - val matrix = stack.last().pose() - val builder = tesselator.builder - - builder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_TEX) - - builder.vertex(matrix, 0f, this.height, 0f).uv(u0, v1).endVertex() - builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex() - - for (i in 4 downTo 0) { - val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat() - val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() - - val thisX = (width * (i / 4f)) - val thisY = (height + sin + cos).coerceAtLeast(0f) - - builder.vertex(matrix, thisX, thisY, 0f).uv( - (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth, - (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, - ).endVertex() - } - - BufferUploader.drawWithShader(builder.end()) - } - - override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { - if (isHovered) { - screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) - return true - } - - return false - } - - companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 184f, y = 0f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 193f, y = 0f, w = 9f, h = 48f) - } -} - -open class PatternGaugePanel( - screen: MatteryScreen<*>, - parent: EditablePanel? = null, - val widget: LevelGaugeWidget, - x: Float = 0f, - y: Float = 0f -): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { - init { - scissor = true - } - - protected open fun makeTooltip(): MutableList { - return mutableListOf( - TranslatableComponent("otm.gui.pattern.percentage_level", String.format("%.2f", widget.percentage() * 100.0)), - TranslatableComponent("otm.gui.pattern.format", widget.level().toString(0), widget.maxLevel().toString(0)) - ) - } - - override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { - GAUGE_BACKGROUND.render(stack) - val height = this.height * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, y = this.height - height, height = height, winding = UVWindingOrder.U0_V1_U1_V0) - } - - override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { - if (isHovered) { - screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) - return true - } - - return false - } - - companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 166f, y = 0f, w = 9f, h = 48f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 175f, y = 0f, w = 9f, h = 48f) - } -} - -open class ProgressGaugePanel( - screen: MatteryScreen<*>, - parent: EditablePanel? = null, - val widget: ProgressGaugeWidget, - x: Float = 0f, - y: Float = 0f -): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { - init { - scissor = true - } - - var flop = false - - protected open fun makeTooltip(): MutableList { - val tooltip: MutableList - - if (widget.isStuck()) { - tooltip = mutableListOf( - TranslatableComponent( - "otm.gui.progress_widget", - String.format("%.2f", widget.percentage() * 100f) - ), - TranslatableComponent("otm.gui.progress_widget_stuck").withStyle(ChatFormatting.DARK_RED) - ) - } else { - tooltip = mutableListOf( - TranslatableComponent( - "otm.gui.progress_widget", - String.format("%.2f", widget.percentage() * 100f) - ) - ) - } - - return tooltip - } - - override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { - if (widget.isStuck() && tick % 40 <= 20) { - RenderSystem.setShaderColor(0.75f, 0.4f, 0.4f, 1f) - } - - if (flop) { - GAUGE_BACKGROUND.render(stack, winding = UVWindingOrder.U1_V0_U0_V1) - val width = this.width * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, x = this.width - width, width = width, winding = UVWindingOrder.U1_V0_U0_V1) - } else { - GAUGE_BACKGROUND.render(stack) - val width = this.width * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, width = width) - } - - if (widget.isStuck() && tick % 40 <= 20) { - RenderSystem.setShaderColor(1f, 1f, 1f, 1f) - } - } - - override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { - if (isHovered) { - screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) - return true - } - - return false - } - - companion object { - val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 240f, w = 22f, h = 16f) - val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 240f, w = 22f, h = 16f) - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt new file mode 100644 index 000000000..093d1e2e2 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/MatterGaugePanel.kt @@ -0,0 +1,96 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.BufferUploader +import com.mojang.blaze3d.vertex.DefaultVertexFormat +import com.mojang.blaze3d.vertex.PoseStack +import com.mojang.blaze3d.vertex.VertexFormat +import net.minecraft.client.renderer.GameRenderer +import net.minecraft.network.chat.Component +import org.lwjgl.opengl.GL11 +import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.render.tesselator +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.formatMatterLevel +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget +import kotlin.math.cos +import kotlin.math.sin + +open class MatterGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + val widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f +): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { + init { + scissor = true + } + + protected open fun makeTooltip(): MutableList { + return mutableListOf( + TranslatableComponent( + "otm.gui.matter.percentage_level", + String.format("%.2f", widget.percentage() * 100.0) + ), + formatMatterLevel(widget.level(), widget.maxLevel()) + ) + } + + override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + GAUGE_BACKGROUND.render(stack) + val height = this.height * (1f - widget.percentage()) + + RenderSystem.setShader(GameRenderer::getPositionTexShader) + RenderSystem.enableTexture() + RenderSystem.enableBlend() + RenderSystem.defaultBlendFunc() + RenderSystem.depthFunc(GL11.GL_ALWAYS) + + RenderSystem.setShaderColor(1f, 1f, 1f, 1f) + + val u0 = GAUGE_FOREGROUND.x / GAUGE_FOREGROUND.imageWidth + val u1 = (GAUGE_FOREGROUND.x + GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth + val v1 = (GAUGE_FOREGROUND.y + GAUGE_FOREGROUND.h) / GAUGE_FOREGROUND.imageHeight + + val matrix = stack.last().pose() + val builder = tesselator.builder + + builder.begin(VertexFormat.Mode.TRIANGLE_FAN, DefaultVertexFormat.POSITION_TEX) + + builder.vertex(matrix, 0f, this.height, 0f).uv(u0, v1).endVertex() + builder.vertex(matrix, width, this.height, 0f).uv(u1, v1).endVertex() + + for (i in 4 downTo 0) { + val sin = sin((System.currentTimeMillis() / 50L + i * 2L).toDouble() / 4.0).toFloat() + val cos = cos((System.currentTimeMillis() / 50L + i * 3L + 27L).toDouble() / 4.0).toFloat() + + val thisX = (width * (i / 4f)) + val thisY = (height + sin + cos).coerceAtLeast(0f) + + builder.vertex(matrix, thisX, thisY, 0f).uv( + (GAUGE_FOREGROUND.x + (i / 4f) * GAUGE_FOREGROUND.w) / GAUGE_FOREGROUND.imageWidth, + (GAUGE_FOREGROUND.y + thisY) / GAUGE_FOREGROUND.imageHeight, + ).endVertex() + } + + BufferUploader.drawWithShader(builder.end()) + } + + override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { + if (isHovered) { + screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) + return true + } + + return false + } + + companion object { + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 184f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 193f, y = 0f, w = 9f, h = 48f) + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt new file mode 100644 index 000000000..46c989386 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PatternGaugePanel.kt @@ -0,0 +1,53 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.network.chat.Component +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget + +open class PatternGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + val widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f +): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { + init { + scissor = true + } + + protected open fun makeTooltip(): MutableList { + return mutableListOf( + TranslatableComponent( + "otm.gui.pattern.percentage_level", + String.format("%.2f", widget.percentage() * 100.0) + ), + TranslatableComponent("otm.gui.pattern.format", widget.level().toString(0), widget.maxLevel().toString(0)) + ) + } + + override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + GAUGE_BACKGROUND.render(stack) + val height = this.height * widget.percentage() + GAUGE_FOREGROUND.renderPartial(stack, y = this.height - height, height = height, winding = UVWindingOrder.U0_V1_U1_V0) + } + + override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { + if (isHovered) { + screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) + return true + } + + return false + } + + companion object { + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 166f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 175f, y = 0f, w = 9f, h = 48f) + } +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt new file mode 100644 index 000000000..b0cf7b40b --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt @@ -0,0 +1,83 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.network.chat.Component +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.client.render.* +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.core.formatPowerLevel +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget + +open class PowerGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + val widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = 9f, + height: Float = 48f +) : EditablePanel(screen, parent, x, y, width, height) { + init { + scissor = true + } + + protected open fun makeTooltip(): MutableList { + return mutableListOf( + TranslatableComponent("otm.gui.power.percentage_level", String.format("%.2f", widget.percentage() * 100.0)), + formatPowerLevel(widget.level(), widget.maxLevel()) + ) + } + + override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + val height = this.height * widget.percentage() + + if (width >= 18f) { + GAUGE_BACKGROUND_WIDE.render(stack, width = width, height = this.height) + GAUGE_FOREGROUND_WIDE.renderPartial( + stack, + y = this.height - height, + height = height, + width = width, + winding = UVWindingOrder.U0_V1_U1_V0) + } else { + GAUGE_BACKGROUND.render(stack, width = width, height = this.height) + GAUGE_FOREGROUND.renderPartial( + stack, + y = this.height - height, + height = height, + width = width, + winding = UVWindingOrder.U0_V1_U1_V0) + } + } + + override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { + if (isHovered) { + screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) + return true + } + + return false + } + + companion object { + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 202f, y = 0f, w = 9f, h = 48f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 211f, y = 0f, w = 9f, h = 48f) + + val GAUGE_BACKGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 238f, y = 0f, w = 18f, h = 48f) + val GAUGE_FOREGROUND_WIDE = WidgetLocation.WIDGETS.element(x = 220f, y = 0f, w = 18f, h = 48f) + } +} + +/** + * Shortcut to [PowerGaugePanel] with doubled width + */ +fun WidePowerGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = 18f, + height: Float = 48f +) = PowerGaugePanel(screen, parent, widget, x, y, width, height) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt new file mode 100644 index 000000000..5c7789a82 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt @@ -0,0 +1,84 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import com.mojang.blaze3d.systems.RenderSystem +import com.mojang.blaze3d.vertex.PoseStack +import net.minecraft.ChatFormatting +import net.minecraft.network.chat.Component +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.menu.widget.ProgressGaugeWidget + +open class ProgressGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + val widget: ProgressGaugeWidget, + x: Float = 0f, + y: Float = 0f +): EditablePanel(screen, parent, x, y, width = GAUGE_BACKGROUND.w, height = GAUGE_BACKGROUND.h) { + init { + scissor = true + } + + var flop = false + + protected open fun makeTooltip(): MutableList { + val tooltip: MutableList + + if (widget.isStuck()) { + tooltip = mutableListOf( + TranslatableComponent( + "otm.gui.progress_widget", + String.format("%.2f", widget.percentage() * 100f) + ), + TranslatableComponent("otm.gui.progress_widget_stuck").withStyle(ChatFormatting.DARK_RED) + ) + } else { + tooltip = mutableListOf( + TranslatableComponent( + "otm.gui.progress_widget", + String.format("%.2f", widget.percentage() * 100f) + ) + ) + } + + return tooltip + } + + override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + if (widget.isStuck() && tick % 40 <= 20) { + RenderSystem.setShaderColor(0.75f, 0.4f, 0.4f, 1f) + } + + if (flop) { + GAUGE_BACKGROUND.render(stack, winding = UVWindingOrder.U1_V0_U0_V1) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND.renderPartial(stack, x = this.width - width, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + } else { + GAUGE_BACKGROUND.render(stack) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND.renderPartial(stack, width = width) + } + + if (widget.isStuck() && tick % 40 <= 20) { + RenderSystem.setShaderColor(1f, 1f, 1f, 1f) + } + } + + override fun innerRenderTooltips(stack: PoseStack, mouse_x: Float, mouse_y: Float, flag: Float): Boolean { + if (isHovered) { + screen.renderComponentTooltip(stack, makeTooltip(), mouse_x.toInt(), mouse_y.toInt()) + return true + } + + return false + } + + companion object { + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 0f, y = 240f, w = 22f, h = 16f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 22f, y = 240f, w = 22f, h = 16f) + } +} \ No newline at end of file From bc68b9b9effe10ab250a1e907b0041797402ecee Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 18:04:24 +0700 Subject: [PATCH 24/39] Improve power supplier menu --- .../mc/otm/datagen/lang/English.kt | 2 + .../screen/StoragePowerSupplierScreen.kt | 45 +++++++++++-- .../mc/otm/client/screen/panels/FramePanel.kt | 2 +- .../widget/HorizontalPowerGaugePanel.kt | 66 +++++++++++++++++++ .../client/screen/widget/PowerGaugePanel.kt | 4 +- .../screen/widget/ProgressGaugePanel.kt | 8 +-- .../mc/otm/menu/StoragePowerSupplierMenu.kt | 6 +- 7 files changed, 118 insertions(+), 15 deletions(-) create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt diff --git a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt index 281f1eac8..349bbdbf5 100644 --- a/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt +++ b/src/data/kotlin/ru/dbotthepony/mc/otm/datagen/lang/English.kt @@ -53,6 +53,8 @@ private fun misc(provider: MatteryLanguageProvider) { gui("exosuit.already_activated", "You already have exosuit following you") + gui("power_supplier.active_nodes", "Currently demanding nodes: %s") + misc("battery.single_use", "Single use battery, can not be recharged.") misc("exosuit.granted1", "As you keep pressing fingerprint reader, you are getting hurt in finger.") diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt index a8ba11059..4f0a44c30 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/StoragePowerSupplierScreen.kt @@ -4,7 +4,7 @@ import net.minecraft.network.chat.Component import net.minecraft.world.entity.player.Inventory import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* -import ru.dbotthepony.mc.otm.client.screen.widget.WidePowerGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.HorizontalPowerGaugePanel import ru.dbotthepony.mc.otm.core.formatPower import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu @@ -12,12 +12,32 @@ import ru.dbotthepony.mc.otm.menu.StoragePowerSupplierMenu class StoragePowerSupplierScreen(menu: StoragePowerSupplierMenu, inventory: Inventory, title: Component) : MatteryScreen(menu, inventory, title) { override fun makeMainFrame(): FramePanel { - val frame = super.makeMainFrame()!! + val frame = FramePanel(this, width = 200f, height = 60f, title) - WidePowerGaugePanel(this, frame, menu.powerWidget, LEFT_MARGIN, GAUGE_TOP_WITH_SLOT) - BatterySlotPanel(this, frame, menu.batterySlot, LEFT_MARGIN, SLOT_TOP_UNDER_GAUGE) + HorizontalPowerGaugePanel(this, frame, menu.powerWidget).also { + it.dock = Dock.BOTTOM + it.dockResize = DockResizeMode.NONE + } + + val topStrip = EditablePanel(this, frame, height = AbstractSlotPanel.SIZE) + + topStrip.dock = Dock.TOP + topStrip.dockTop = 3f + + BatterySlotPanel(this, topStrip, menu.batterySlot).also { + it.dock = Dock.LEFT + it.dockRight = 3f + } + + val labels = EditablePanel(this, topStrip) + + labels.dock = Dock.FILL + + object : Label(this@StoragePowerSupplierScreen, labels) { + init { + dock = Dock.TOP + } - object : Label(this@StoragePowerSupplierScreen, frame, 28f, 17f, width = 140f) { override fun tick() { super.tick() @@ -28,6 +48,21 @@ class StoragePowerSupplierScreen(menu: StoragePowerSupplierMenu, inventory: Inve } } + object : Label(this@StoragePowerSupplierScreen, labels) { + init { + dock = Dock.TOP + } + + override fun tick() { + super.tick() + + text = TranslatableComponent( + "otm.gui.power_supplier.active_nodes", + menu.activeNodes + ) + } + } + return frame } } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt index ec89b89c4..6a02631d6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/FramePanel.kt @@ -116,7 +116,7 @@ open class FramePanel( onClose?.run() } - override fun mouseClickedInner(x: Double, y: Double, flag: Int): Boolean { + override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean { if (isActive) { return true } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt new file mode 100644 index 000000000..162d10ff2 --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/HorizontalPowerGaugePanel.kt @@ -0,0 +1,66 @@ +package ru.dbotthepony.mc.otm.client.screen.widget + +import com.mojang.blaze3d.vertex.PoseStack +import ru.dbotthepony.mc.otm.client.render.UVWindingOrder +import ru.dbotthepony.mc.otm.client.render.WidgetLocation +import ru.dbotthepony.mc.otm.client.render.element +import ru.dbotthepony.mc.otm.client.screen.MatteryScreen +import ru.dbotthepony.mc.otm.client.screen.panels.EditablePanel +import ru.dbotthepony.mc.otm.menu.widget.LevelGaugeWidget + +open class HorizontalPowerGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = GAUGE_BACKGROUND.w, + height: Float = GAUGE_BACKGROUND.h +) : PowerGaugePanel(screen, parent, widget, x, y, width, height) { + var flop = false + + override fun innerRender(stack: PoseStack, mouseX: Float, mouseY: Float, partialTick: Float) { + if (height >= 18f) { + if (flop) { + GAUGE_BACKGROUND_TALL.render(stack, height = height, width = this.width, winding = UVWindingOrder.U1_V0_U0_V1) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND_TALL.renderPartial(stack, x = this.width - width, height = height, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + } else { + GAUGE_BACKGROUND_TALL.render(stack, height = height, width = this.width) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND_TALL.renderPartial(stack, height = height, width = width) + } + } else { + if (flop) { + GAUGE_BACKGROUND.render(stack, height = height, width = this.width, winding = UVWindingOrder.U1_V0_U0_V1) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND.renderPartial(stack, x = this.width - width, height = height, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + } else { + GAUGE_BACKGROUND.render(stack, height = height, width = this.width) + val width = this.width * widget.percentage() + GAUGE_FOREGROUND.renderPartial(stack, height = height, width = width) + } + } + } + + companion object { + val GAUGE_BACKGROUND = WidgetLocation.WIDGETS.element(x = 160f, y = 238f, w = 96f, h = 9f) + val GAUGE_FOREGROUND = WidgetLocation.WIDGETS.element(x = 160f, y = 247f, w = 96f, h = 9f) + + val GAUGE_BACKGROUND_TALL = WidgetLocation.WIDGETS.element(x = 160f, y = 202f, w = 96f, h = 18f) + val GAUGE_FOREGROUND_TALL = WidgetLocation.WIDGETS.element(x = 160f, y = 220f, w = 96f, h = 18f) + } +} + +/** + * Shortcut to [HorizontalPowerGaugePanel] with doubled height + */ +fun TallHorizontalPowerGaugePanel( + screen: MatteryScreen<*>, + parent: EditablePanel? = null, + widget: LevelGaugeWidget, + x: Float = 0f, + y: Float = 0f, + width: Float = HorizontalPowerGaugePanel.GAUGE_BACKGROUND_TALL.w, + height: Float = HorizontalPowerGaugePanel.GAUGE_BACKGROUND_TALL.h +) = HorizontalPowerGaugePanel(screen, parent, widget, x, y, width, height) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt index b0cf7b40b..2ab2179de 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/PowerGaugePanel.kt @@ -15,8 +15,8 @@ open class PowerGaugePanel( val widget: LevelGaugeWidget, x: Float = 0f, y: Float = 0f, - width: Float = 9f, - height: Float = 48f + width: Float = GAUGE_BACKGROUND.w, + height: Float = GAUGE_BACKGROUND.h ) : EditablePanel(screen, parent, x, y, width, height) { init { scissor = true diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt index 5c7789a82..706865097 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/widget/ProgressGaugePanel.kt @@ -54,13 +54,13 @@ open class ProgressGaugePanel( } if (flop) { - GAUGE_BACKGROUND.render(stack, winding = UVWindingOrder.U1_V0_U0_V1) + GAUGE_BACKGROUND.render(stack, height = height, width = this.width, winding = UVWindingOrder.U1_V0_U0_V1) val width = this.width * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, x = this.width - width, width = width, winding = UVWindingOrder.U1_V0_U0_V1) + GAUGE_FOREGROUND.renderPartial(stack, x = this.width - width, height = height, width = width, winding = UVWindingOrder.U1_V0_U0_V1) } else { - GAUGE_BACKGROUND.render(stack) + GAUGE_BACKGROUND.render(stack, height = height, width = this.width) val width = this.width * widget.percentage() - GAUGE_FOREGROUND.renderPartial(stack, width = width) + GAUGE_FOREGROUND.renderPartial(stack, height = height, width = width) } if (widget.isStuck() && tick % 40 <= 20) { diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/StoragePowerSupplierMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/StoragePowerSupplierMenu.kt index 1041a30aa..8a9d8971c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/StoragePowerSupplierMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/StoragePowerSupplierMenu.kt @@ -9,10 +9,9 @@ class StoragePowerSupplierMenu @JvmOverloads constructor( p_38852_: Int, inventory: Inventory, tile: StoragePowerSupplierBlockEntity? = null -) : MatteryPoweredMenu( - MMenus.STORAGE_POWER_SUPPLIER, p_38852_, inventory, tile -) { +) : MatteryPoweredMenu(MMenus.STORAGE_POWER_SUPPLIER, p_38852_, inventory, tile) { var totalTransferred by mSynchronizer.fraction() + var activeNodes by mSynchronizer.int() init { addInventorySlots() @@ -21,6 +20,7 @@ class StoragePowerSupplierMenu @JvmOverloads constructor( override fun broadcastChanges() { if (tile is StoragePowerSupplierBlockEntity) { totalTransferred = tile.powerSupplied + activeNodes = tile.cell.storageGraph?.powerDemandingNodes?.size ?: 0 } super.broadcastChanges() From 48df8f4ef2a45ba02fc0a8ecd69255cc9ada3be5 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 18:13:27 +0700 Subject: [PATCH 25/39] 1% better item monitor menu --- .../mc/otm/client/screen/ItemMonitorScreen.kt | 21 ++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt index 70ee942a8..e299c52a9 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt @@ -14,6 +14,7 @@ import ru.dbotthepony.mc.otm.client.render.UVWindingOrder import ru.dbotthepony.mc.otm.client.render.Widgets8 import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel +import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalPowerGaugePanel import ru.dbotthepony.mc.otm.core.equalDownDivision import ru.dbotthepony.mc.otm.core.formatReadableNumber import ru.dbotthepony.mc.otm.core.formatSiComponent @@ -24,7 +25,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp MatteryScreen(menu, inventory, title) { override fun makeMainFrame(): FramePanel { - val frame = FramePanel(this@ItemMonitorScreen, null, 0f, 0f, FRAME_WIDTH, FRAME_HEIGHT, getTitle()) + val frame = FramePanel(this@ItemMonitorScreen, null, 0f, 0f, 1f, 1f, getTitle()) val topPanel = EditablePanel(this, frame) topPanel.height = ITEM_GRID_HEIGHT * 18f @@ -35,7 +36,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp bottomPanel.dock = Dock.TOP bottomPanel.setDockMargin(top = 6f) - frame.height = topPanel.height + bottomPanel.height + frame.dockPadding.top + frame.dockPadding.bottom + 6f + frame.height = topPanel.height + bottomPanel.height + frame.dockPadding.top + frame.dockPadding.bottom + 26f frame.width = 178f + frame.dockPadding.left + frame.dockPadding.right val viewScrollBar = ContinuousScrollBarPanel(this, topPanel, 28f + ITEM_GRID_WIDTH * 18f + 2f, 16f, ITEM_GRID_HEIGHT * 18f) @@ -184,13 +185,23 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp } } + val bottomStrip = EditablePanel(this, frame, height = AbstractSlotPanel.SIZE) + bottomStrip.dock = Dock.BOTTOM + + BatterySlotPanel(this, bottomStrip, menu.batterySlot).also { + it.dock = Dock.LEFT + it.dockRight = 3f + } + + TallHorizontalPowerGaugePanel(this, bottomStrip, menu.powerWidget).also { + it.dock = Dock.FILL + it.dockResize = DockResizeMode.NONE + } + return frame } companion object { - const val FRAME_WIDTH = 240f - const val FRAME_HEIGHT = 210f - const val ITEM_GRID_WIDTH = 9 const val ITEM_GRID_HEIGHT = 5 From 0aa8bc0b31482558b3fcac689adac2471b67a6cc Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 18:41:01 +0700 Subject: [PATCH 26/39] Get rid of Continuous scrollbar panel in Kotlin code --- .../mc/otm/client/screen/DriveViewerScreen.kt | 11 ++++++----- .../mc/otm/client/screen/ItemMonitorScreen.kt | 14 ++++++++------ src/main/kotlin/ru/dbotthepony/mc/otm/core/Math.kt | 8 ++++---- 3 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt index f3e12490c..2ef781e9c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/DriveViewerScreen.kt @@ -7,6 +7,7 @@ import net.minecraft.world.item.ItemStack import ru.dbotthepony.mc.otm.core.TranslatableComponent import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.PowerGaugePanel +import ru.dbotthepony.mc.otm.core.maxScrollDivision import ru.dbotthepony.mc.otm.item.PortableCondensationDriveItem import ru.dbotthepony.mc.otm.menu.DriveViewerMenu @@ -51,15 +52,15 @@ class DriveViewerScreen(menu: DriveViewerMenu, inventory: Inventory, title: Comp val grid = GridPanel(this, frame, 28f, 16f, GRID_WIDTH * 18f, GRID_HEIGHT * 18f, GRID_WIDTH, GRID_HEIGHT) - val scrollBar = ContinuousScrollBarPanel(this, frame, 192f, 14f, 92f) - scrollBar.setupRowMultiplier { menu.networkedItemView.itemCount / GRID_WIDTH } + val scrollBar = DiscreteScrollBarPanel(this, frame, { maxScrollDivision(menu.networkedItemView.itemCount, GRID_WIDTH) }, { _, _, _ -> }, 192f, 14f, 92f) + views.add(grid) views.add(scrollBar) for (i in 0 until GRID_WIDTH * GRID_HEIGHT) { object : AbstractSlotPanel(this@DriveViewerScreen, grid, 0f, 0f) { override fun getItemStack(): ItemStack { - val index = i + scrollBar.getScroll(menu.networkedItemView.sortedView.size / GRID_WIDTH) + val index = i + scrollBar.scroll * GRID_WIDTH return menu.networkedItemView.sortedView.getOrNull(index)?.stack?.item ?: ItemStack.EMPTY } @@ -68,7 +69,7 @@ class DriveViewerScreen(menu: DriveViewerMenu, inventory: Inventory, title: Comp } override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean { - val index = i + scrollBar.getScroll(GRID_WIDTH) + val index = i + scrollBar.scroll * GRID_WIDTH menu.networkedItemView.mouseClick(index, button) return true } @@ -81,7 +82,7 @@ class DriveViewerScreen(menu: DriveViewerMenu, inventory: Inventory, title: Comp override fun getItemStackTooltip(stack: ItemStack): List { return super.getItemStackTooltip(stack).also { it as MutableList - val index = i + scrollBar.getScroll(menu.networkedItemView.sortedView.size / GRID_WIDTH) + val index = i + scrollBar.scroll * GRID_WIDTH val realStack = menu.networkedItemView.sortedView.getOrNull(index)!!.stack it.add(TranslatableComponent("otm.gui.item_amount", realStack.count.toString())) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt index e299c52a9..81a145ef0 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/ItemMonitorScreen.kt @@ -15,7 +15,7 @@ import ru.dbotthepony.mc.otm.client.render.Widgets8 import ru.dbotthepony.mc.otm.client.screen.panels.* import ru.dbotthepony.mc.otm.client.screen.widget.ProgressGaugePanel import ru.dbotthepony.mc.otm.client.screen.widget.TallHorizontalPowerGaugePanel -import ru.dbotthepony.mc.otm.core.equalDownDivision +import ru.dbotthepony.mc.otm.core.maxScrollDivision import ru.dbotthepony.mc.otm.core.formatReadableNumber import ru.dbotthepony.mc.otm.core.formatSiComponent import ru.dbotthepony.mc.otm.menu.ItemMonitorMenu @@ -39,8 +39,10 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp frame.height = topPanel.height + bottomPanel.height + frame.dockPadding.top + frame.dockPadding.bottom + 26f frame.width = 178f + frame.dockPadding.left + frame.dockPadding.right - val viewScrollBar = ContinuousScrollBarPanel(this, topPanel, 28f + ITEM_GRID_WIDTH * 18f + 2f, 16f, ITEM_GRID_HEIGHT * 18f) - viewScrollBar.setupRowMultiplier { equalDownDivision(menu.networkedItemView.itemCount, ITEM_GRID_WIDTH) } + val viewScrollBar = DiscreteScrollBarPanel(this, topPanel, + { maxScrollDivision(menu.networkedItemView.itemCount, ITEM_GRID_WIDTH) }, + { _, _, _ -> }, + 28f + ITEM_GRID_WIDTH * 18f + 2f, 16f, ITEM_GRID_HEIGHT * 18f) viewScrollBar.dock = Dock.RIGHT viewScrollBar.setDockMargin(left = 2f) @@ -50,7 +52,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp for (i in 0 until ITEM_GRID_WIDTH * ITEM_GRID_HEIGHT) { object : AbstractSlotPanel(this@ItemMonitorScreen, gridPanel) { - private val index get() = i + viewScrollBar.getScroll(equalDownDivision(menu.networkedItemView.itemCount, ITEM_GRID_WIDTH)) * ITEM_GRID_WIDTH + private val index get() = i + viewScrollBar.scroll * ITEM_GRID_WIDTH override fun getItemStack(): ItemStack { return menu.networkedItemView.sortedView.getOrNull(index)?.stack?.item ?: ItemStack.EMPTY @@ -117,7 +119,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp arrowAndButtons.dock = Dock.LEFT arrowAndButtons.setDockMargin(left = 4f) - val arrowLineTop = EditablePanel(this, arrowAndButtons, y = 0f, height = 8f, width = arrowAndButtons.width) + EditablePanel(this, arrowAndButtons, y = 0f, height = 8f, width = arrowAndButtons.width) val arrowLine = EditablePanel(this, arrowAndButtons, y = 38f, height = 8f, width = arrowAndButtons.width) @@ -169,7 +171,7 @@ class ItemMonitorScreen(menu: ItemMonitorMenu, inventory: Inventory, title: Comp craftingHistory.dock = Dock.LEFT craftingHistory.setDockMargin(left = 4f) - val craftingHistoryScroll = ContinuousScrollBarPanel(this, bottomPanel, 0f, 0f, 0f) + val craftingHistoryScroll = DiscreteScrollBarPanel(this, bottomPanel, { 0 }, { _, _, _ -> }) craftingHistoryScroll.dock = Dock.LEFT craftingHistoryScroll.setDockMargin(left = 2f) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Math.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Math.kt index df4454846..5ffd435ed 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/core/Math.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/core/Math.kt @@ -32,10 +32,10 @@ fun BigInteger.toIntSafe(): Int { } @Suppress("SameParameterValue") -fun equalDownDivision(a: Int, b: Int): Int { - if (a % b == 0) { - return a / b - 1 +fun maxScrollDivision(elements: Int, elementsPerRow: Int): Int { + if (elements % elementsPerRow == 0) { + return elements / elementsPerRow - 1 } - return a / b + return elements / elementsPerRow } From 77f79f3f4863693f667ba34a558fc378ece70a6b Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 18:48:51 +0700 Subject: [PATCH 27/39] Disallow double click pickup from crafting result slot --- .../kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt index f9e19ed83..dbf2a952d 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/ExoSuitInventoryMenu.kt @@ -134,6 +134,10 @@ class ExoSuitInventoryMenu(val capability: MatteryPlayerCapability) : MatteryMen return ItemStack.EMPTY } + override fun canTakeItemForPickAll(p_38908_: ItemStack, p_38909_: Slot): Boolean { + return p_38909_.container != craftingResultContainer && super.canTakeItemForPickAll(p_38908_, p_38909_) + } + companion object : ContainerSynchronizer { // ServerPlayer#nextContainerCounter // this.containerCounter = this.containerCounter % 100 + 1; From 519be9389e0058c5ac0f2ff536065953c3d7b051 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 2 Sep 2022 19:20:45 +0700 Subject: [PATCH 28/39] Add conditional exception throw at setItem Since it is called after craft if we have no valid crafting recipe after --- .../mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt index 21a9b6e56..b7137365c 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/storage/ItemMonitorBlockEntity.kt @@ -296,6 +296,7 @@ class ItemMonitorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : override fun stillValid(p_18946_: Player) = true override fun getItem(p_18941_: Int): ItemStack { + require(p_18941_ == 1) { "Invalid slot ID: $p_18941_" } return craftingRecipe?.resultItem?.copy() ?: ItemStack.EMPTY } @@ -423,12 +424,13 @@ class ItemMonitorBlockEntity(p_155229_: BlockPos, p_155230_: BlockState) : } override fun removeItemNoUpdate(p_18951_: Int): ItemStack { - // return removeItem(p_18951_, craftingRecipe?.resultItem?.count ?: Int.MAX_VALUE) throw UnsupportedOperationException() } override fun setItem(p_18944_: Int, p_18945_: ItemStack) { - throw UnsupportedOperationException() + if ((craftingRecipe != null && !craftingRecipe!!.resultItem.isEmpty) || !p_18945_.isEmpty) { + throw RuntimeException("BUG-DETECT: Tried to set crafting result slot item to something, and either we have crafting recipe which have valid result, or we are trying to set slot to non empty item: $p_18945_") + } } override fun setChanged() {} From cc3e5f55509841bd9edce04823de88326301f61a Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 3 Sep 2022 01:32:12 +0700 Subject: [PATCH 29/39] Move pattern monitor screen to Kotlin --- .../otm/client/screen/MatterPanelScreen.java | 401 ------------------ .../mc/otm/client/screen/MatterPanelScreen.kt | 294 +++++++++++++ .../otm/client/screen/panels/ButtonPanel.kt | 18 +- .../mc/otm/client/screen/panels/FramePanel.kt | 22 +- .../mc/otm/menu/MatterPanelMenu.kt | 6 + .../mc/otm/network/MenuNetworking.kt | 6 +- 6 files changed, 339 insertions(+), 408 deletions(-) delete mode 100644 src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java create mode 100644 src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt diff --git a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java b/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java deleted file mode 100644 index a6cbc3309..000000000 --- a/src/main/java/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.java +++ /dev/null @@ -1,401 +0,0 @@ -package ru.dbotthepony.mc.otm.client.screen; - -import net.minecraft.ChatFormatting; -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.MatterTask; -import ru.dbotthepony.mc.otm.capability.matter.PatternState; -import ru.dbotthepony.mc.otm.menu.MatterPanelMenu; -import ru.dbotthepony.mc.otm.menu.ReplicationRequestPacket; -import ru.dbotthepony.mc.otm.network.MenuNetworkChannel; -import ru.dbotthepony.mc.otm.client.screen.panels.*; - -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.ArrayList; -import java.util.List; - -import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TextComponent; -import static ru.dbotthepony.mc.otm.core.UnOverengineeringKt.TranslatableComponent; - -public class MatterPanelScreen extends MatteryScreen { - private static final int MODAL_WIDTH = 213; - private static final int MODAL_HEIGHT = 110; - - public MatterPanelScreen(MatterPanelMenu p_97741_, Inventory p_97742_, Component p_97743_) { - super(p_97741_, p_97742_, p_97743_); - - imageWidth = 176; - imageHeight = 187; - - titleLabelY = 5; - } - - public static final int GRID_WIDTH = 8; - public static final int GRID_HEIGHT = 9; - - private final ArrayList pattern_slots = new ArrayList<>(); - private final ArrayList task_slots = new ArrayList<>(); - - @Nullable - @Override - protected FramePanel makeMainFrame() { - float width = GRID_WIDTH * AbstractSlotPanel.SIZE + ScrollBarConstants.WIDTH + FramePanel.PADDING * 2 + 8; - float height = GRID_HEIGHT * AbstractSlotPanel.SIZE + FramePanel.PADDING_TOP + FramePanel.PADDING; - - var scroll_panel = new ContinuousScrollBarPanel(this, null, 0, 0, 0); - - var frame = new FramePanel(this, null, 0, 0, width, height, getTitle()) { - @Override - protected boolean mouseScrolledInner(double x, double y, double scroll) { - return scroll_panel.mouseScrolledInner(x, y, scroll); - } - }; - - var patterns_tab = frame.addTab(FramePanel.Position.TOP, () -> { - for (var slot : pattern_slots) { - slot.setVisible(true); - } - }, () -> { - for (var slot : pattern_slots) { - slot.setVisible(false); - } - }); - - var tasks_tab = frame.addTab(FramePanel.Position.TOP, () -> { - for (var slot : task_slots) { - slot.setVisible(true); - } - }, () -> { - for (var slot : task_slots) { - slot.setVisible(false); - } - }); - - scroll_panel.setParent(frame); - scroll_panel.setDock(Dock.RIGHT); - scroll_panel.setupRowMultiplier(() -> { - if (tasks_tab.isActive()) { - return menu.getTasks().size() / GRID_WIDTH; - } - - return menu.getPatterns().size() / GRID_WIDTH; - }); - - var grid = new GridPanel(this, frame, 0, 0, GRID_WIDTH * AbstractSlotPanel.SIZE, 0, GRID_WIDTH, GRID_HEIGHT) { - @Override - protected boolean mouseScrolledInner(double x, double y, double scroll) { - return scroll_panel.mouseScrolledInner(x, y, scroll); - } - }; - - grid.setDock(Dock.LEFT); - grid.setDockMargin(4, 0, 0, 0); - - for (int i = 0; i < GRID_WIDTH * GRID_HEIGHT; i++) { - int slot = i; - - pattern_slots.add(new AbstractSlotPanel(this, grid, 0, 0) { - @Nonnull - @Override - protected ItemStack getItemStack() { - var slot1 = slot + scroll_panel.getScroll(menu.getPatterns().size() / GRID_WIDTH) * GRID_WIDTH; - - if (slot1 >= menu.getPatterns().size()) { - return ItemStack.EMPTY; - } - - return menu.getPatterns().get(slot1).stack(); - } - - @Nonnull - @Override - protected List getItemStackTooltip(@Nonnull ItemStack stack) { - var slot1 = slot + scroll_panel.getScroll(menu.getPatterns().size() / GRID_WIDTH) * GRID_WIDTH; - - if (slot1 >= menu.getPatterns().size()) { - return List.of(); - } - - return getPatternTooltip(super.getItemStackTooltip(stack), menu.getPatterns().get(slot1)); - } - - @Override - protected boolean mouseScrolledInner(double x, double y, double scroll) { - return scroll_panel.mouseScrolledInner(x, y, scroll); - } - - @Override - protected boolean mouseClickedInner(double x, double y, int flag) { - if (slot >= menu.getPatterns().size()) { - return true; - } - - openPattern(menu.getPatterns().get(slot)); - - return true; - } - }); - - task_slots.add(new AbstractSlotPanel(this, grid, 0, 0) { - @Nonnull - @Override - protected ItemStack getItemStack() { - var slot1 = slot + scroll_panel.getScroll(menu.getTasks().size() / GRID_WIDTH) * GRID_WIDTH; - - if (slot1 >= menu.getTasks().size()) { - return ItemStack.EMPTY; - } - - var task = menu.getTasks().get(slot1); - return task.stack(Math.max(task.required(), 1)); - } - - @Nonnull - @Override - protected List getItemStackTooltip(@Nonnull ItemStack stack) { - var slot1 = slot + scroll_panel.getScroll(menu.getTasks().size() / GRID_WIDTH) * GRID_WIDTH; - - if (slot1 >= menu.getTasks().size()) { - return List.of(); - } - - return getTaskTooltip(super.getItemStackTooltip(stack), menu.getTasks().get(slot1)); - } - - @Override - protected boolean mouseScrolledInner(double x, double y, double scroll) { - return scroll_panel.mouseScrolledInner(x, y, scroll); - } - - @Override - protected boolean mouseClickedInner(double x, double y, int flag) { - if (slot >= menu.getTasks().size()) { - return true; - } - - openTask(menu.getTasks().get(slot)); - - return true; - } - }); - } - - for (var slot : task_slots) { - slot.setVisible(false); - } - - return frame; - } - - private List getTaskTooltip(List input, MatterTask task) { - input.add(TranslatableComponent("otm.gui.matter_task.total", task.total()).withStyle(ChatFormatting.GRAY)); - input.add(TranslatableComponent("otm.gui.matter_task.required", task.required()).withStyle(ChatFormatting.GRAY)); - input.add(TranslatableComponent("otm.gui.matter_task.in_progress", task.in_progress()).withStyle(ChatFormatting.GRAY)); - input.add(TranslatableComponent("otm.gui.matter_task.finished", task.finished()).withStyle(ChatFormatting.GRAY)); - - return input; - } - - private List getPatternTooltip(List input, PatternState pattern) { - input.add(TranslatableComponent("otm.item.pattern.research", String.format("%.2f", pattern.research() * 100d)).withStyle(ChatFormatting.AQUA)); - - return input; - } - - private void openTask(MatterTask task) { - var task_frame = new FramePanel(this, null, 0, 0, 170, 40, TranslatableComponent("otm.container.matter_panel.task")) { - @Override - public void tick() { - super.tick(); - - if (!menu.getTasks().contains(task)) { - remove(); - } - } - }; - - var slot = new AbstractSlotPanel(this, task_frame, 0, 0) { - @Nonnull - @Override - protected ItemStack getItemStack() { - var task1_index = menu.getTasks().indexOf(task); - - if (task1_index != -1) { - var task1 = menu.getTasks().get(task1_index); - return task1.stack(Math.max(task1.required(), 1)); - } - - return ItemStack.EMPTY; - } - - @Nonnull - @Override - protected List getItemStackTooltip(@Nonnull ItemStack stack) { - var task1_index = menu.getTasks().indexOf(task); - List get_list = super.getItemStackTooltip(stack); - - if (task1_index != -1) { - getTaskTooltip(get_list, menu.getTasks().get(task1_index)); - } - - return get_list; - } - }; - - slot.setDock(Dock.LEFT); - - var button = new ButtonPanel(this, task_frame, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.close")); - button.setDock(Dock.RIGHT); - button.setDockMargin(2, 0, 0, 0); - button.bind(task_frame::remove); - - button = new ButtonPanel(this, task_frame, 0, 0, 80, 20, TranslatableComponent("otm.container.matter_panel.cancel_task")); - button.setDock(Dock.RIGHT); - button.setDockMargin(2, 0, 0, 0); - button.bind(() -> { - menu.requestTaskCancel(task.id()); - task_frame.remove(); - }); - - task_frame.toScreenCenter(); - addPanel(task_frame); - } - - private void openPattern(PatternState state) { - var pattern_frame = new FramePanel(this, null, 0, 0, MODAL_WIDTH, MODAL_HEIGHT, TranslatableComponent("otm.container.matter_panel.label")){ - @Override - public void tick() { - super.tick(); - - if (!menu.getPatterns().contains(state)) { - remove(); - } - } - }; - - var row_1 = new EditablePanel(this, pattern_frame); - var row_2 = new EditablePanel(this, pattern_frame); - var row_3 = new EditablePanel(this, pattern_frame); - var row_4 = new EditablePanel(this, pattern_frame); - - row_1.setDock(Dock.TOP); - row_2.setDock(Dock.TOP); - row_3.setDock(Dock.TOP); - row_4.setDock(Dock.TOP); - - row_1.setHeight(20); - row_2.setHeight(20); - row_3.setHeight(20); - row_4.setHeight(20); - - row_1.setDockMargin(0, 2, 0, 0); - row_2.setDockMargin(0, 2, 0, 0); - row_3.setDockMargin(0, 2, 0, 0); - row_4.setDockMargin(0, 2, 0, 0); - - var slot = new AbstractSlotPanel(this, row_2, 0, 0) { - @Nonnull - @Override - protected ItemStack getItemStack() { - return new ItemStack(state.item(), 1); - } - - @Nonnull - @Override - protected List getItemStackTooltip(@Nonnull ItemStack stack) { - return getPatternTooltip(super.getItemStackTooltip(stack), state); - } - }; - - var input_amount = new EditBoxPanel(this, row_2, 0, 0, 10, 20, TextComponent("Input amount")) { - @Override - protected void configureNew(@Nonnull EditBox widget, boolean recreation) { - super.configureNew(widget, recreation); - - widget.setMaxLength(6); - - if (!recreation) { - widget.setValue("1"); - } - } - - private void increase(int amount) { - int value = 1; - - try { - value = Integer.parseInt(getOrCreateWidget().getValue()); - } catch (Exception ignored) { - - } - - if (value == 1 && amount > 0) - getOrCreateWidget().setValue(Integer.toString(amount)); - else - getOrCreateWidget().setValue(Integer.toString(Math.max(1, Math.min(99999, value + amount)))); - } - }; - - var button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 8)); - button.bind(() -> input_amount.increase(8)); - button.setDock(Dock.RIGHT); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 64)); - button.setDock(Dock.RIGHT); - button.bind(() -> input_amount.increase(64)); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_1, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.increase_by", 256)); - button.setDock(Dock.RIGHT); - button.bind(() -> input_amount.increase(256)); - button.setDockMargin(2, 0, 0, 0); - - slot.setDock(Dock.LEFT); - slot.setDockMargin(0, 0, 4, 0); - input_amount.setDock(Dock.FILL); - - button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 8)); - button.bind(() -> input_amount.increase(-8)); - button.setDock(Dock.RIGHT); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 64)); - button.setDock(Dock.RIGHT); - button.bind(() -> input_amount.increase(-64)); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_3, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.decrease_by", 256)); - button.setDock(Dock.RIGHT); - button.bind(() -> input_amount.increase(-256)); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_4, 0, 0, 40, 20, TranslatableComponent("otm.container.matter_panel.cancel")); - button.setDock(Dock.RIGHT); - button.bind(pattern_frame::remove); - button.setDockMargin(2, 0, 0, 0); - - button = new ButtonPanel(this, row_4, 0, 0, 82, 20, TranslatableComponent("otm.container.matter_panel.send")); - button.setDock(Dock.RIGHT); - button.bind(() -> { - int value = 1; - - try { - value = Integer.parseInt(input_amount.getOrCreateWidget().getValue()); - } catch (Exception ignored) { - - } - - MenuNetworkChannel.INSTANCE.sendToServer(new ReplicationRequestPacket(state, value)); - pattern_frame.remove(); - }); - - button.setDockMargin(2, 0, 0, 0); - - addPanel(pattern_frame); - pattern_frame.toScreenCenter(); - popup(pattern_frame); - } -} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt new file mode 100644 index 000000000..fab73529a --- /dev/null +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/MatterPanelScreen.kt @@ -0,0 +1,294 @@ +package ru.dbotthepony.mc.otm.client.screen + +import net.minecraft.ChatFormatting +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.MatterTask +import ru.dbotthepony.mc.otm.capability.matter.PatternState +import ru.dbotthepony.mc.otm.client.screen.panels.* +import ru.dbotthepony.mc.otm.core.TranslatableComponent +import ru.dbotthepony.mc.otm.core.maxScrollDivision +import ru.dbotthepony.mc.otm.menu.MatterPanelMenu +import ru.dbotthepony.mc.otm.menu.ReplicationRequestPacket +import ru.dbotthepony.mc.otm.network.MenuNetworkChannel + +class MatterPanelScreen( + menu: MatterPanelMenu, + inventory: Inventory, + title: Component +) : MatteryScreen(menu, inventory, title) { + override fun makeMainFrame(): FramePanel { + var isPatternView = true + + val frame = FramePanel.padded(this, null, GRID_WIDTH * AbstractSlotPanel.SIZE + ScrollBarConstants.WIDTH + 4f, GRID_HEIGHT * AbstractSlotPanel.SIZE, title) + + val scrollBar = DiscreteScrollBarPanel(this, frame, { + if (isPatternView) { + maxScrollDivision(menu.patterns.size, GRID_WIDTH) + } else { + maxScrollDivision(menu.tasks.size, GRID_WIDTH) + } + }, { _, _, _ -> }) + + scrollBar.dock = Dock.RIGHT + + frame.addTab(FramePanel.Position.TOP, open = { isPatternView = true }) + frame.addTab(FramePanel.Position.TOP, open = { isPatternView = false }) + + val canvas = object : EditablePanel(this@MatterPanelScreen, frame, width = GRID_WIDTH * AbstractSlotPanel.SIZE) { + init { + dock = Dock.LEFT + } + + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + return scrollBar.mouseScrolledInner(x, y, scroll) + } + } + + for (row in 0 until GRID_HEIGHT) { + val rowCanvas = object : EditablePanel(this@MatterPanelScreen, canvas, height = AbstractSlotPanel.SIZE) { + init { + dock = Dock.TOP + } + + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + return false + } + } + + for (i in 0 until GRID_WIDTH) { + object : AbstractSlotPanel(this@MatterPanelScreen, rowCanvas) { + init { + dock = Dock.LEFT + } + + private val index: Int get() = (scrollBar.scroll + row) * GRID_WIDTH + i + + override fun getItemStack(): ItemStack { + if (isPatternView) { + return menu.patterns.getOrNull(index)?.stack() ?: ItemStack.EMPTY + } else { + return menu.tasks.getOrNull(index)?.stack() ?: ItemStack.EMPTY + } + } + + override fun getItemStackTooltip(stack: ItemStack): List { + val list = super.getItemStackTooltip(stack).toMutableList() + + if (isPatternView) { + menu.patterns.getOrNull(index)?.let { + list.add(TranslatableComponent( + "otm.item.pattern.research", + String.format("%.2f", it.research() * 100.0) + ).withStyle(ChatFormatting.AQUA)) } + } else { + menu.tasks.getOrNull(index)?.let { + list.add(TranslatableComponent("otm.gui.matter_task.total", it.total()).withStyle(ChatFormatting.GRAY)) + list.add(TranslatableComponent("otm.gui.matter_task.required", it.required()).withStyle(ChatFormatting.GRAY)) + list.add(TranslatableComponent("otm.gui.matter_task.in_progress", it.in_progress()).withStyle(ChatFormatting.GRAY)) + list.add(TranslatableComponent("otm.gui.matter_task.finished", it.finished()).withStyle(ChatFormatting.GRAY)) + } + } + + return list + } + + override fun mouseClickedInner(x: Double, y: Double, button: Int): Boolean { + if (isPatternView) { + menu.patterns.getOrNull(index)?.let(this@MatterPanelScreen::openPattern) + } else { + menu.tasks.getOrNull(index)?.let(this@MatterPanelScreen::openTask) + } + + return true + } + + override fun mouseScrolledInner(x: Double, y: Double, scroll: Double): Boolean { + return false + } + } + } + } + + return frame + } + + private fun openTask(task: MatterTask) { + val frame = FramePanel.padded(this, null, 170f, 20f, TranslatableComponent("otm.container.matter_panel.task")) + + object : AbstractSlotPanel(this@MatterPanelScreen, frame) { + init { + dock = Dock.LEFT + } + + override fun getItemStack(): ItemStack { + return menu.tasks.firstOrNull { it.id == task.id }?.let { it.stack(it.required.coerceAtLeast(1)) } ?: task.stack(task.required.coerceAtLeast(1)) + } + + override fun tick() { + super.tick() + + if (!menu.tasks.any { it.id == task.id }) { + frame.remove() + } + } + } + + ButtonPanel(this@MatterPanelScreen, frame, width = 40f, label = TranslatableComponent("otm.container.matter_panel.close"), onPress = frame::remove).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this@MatterPanelScreen, frame, width = 80f, label = TranslatableComponent("otm.container.matter_panel.cancel_task"), onPress = { + menu.requestTaskCancel(task.id) + frame.remove() + }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + addPanel(frame) + popup(frame) + + frame.toScreenCenter() + } + + private fun openPattern(pattern: PatternState) { + val frame = FramePanel.padded(this, null, 213f, (ButtonPanel.HEIGHT + 3f) * 4f, TranslatableComponent("otm.container.matter_panel.task")) + + val rowTop = EditablePanel(this, frame, height = ButtonPanel.HEIGHT) + val rowInput = EditablePanel(this, frame, height = ButtonPanel.HEIGHT) + val rowBottom = EditablePanel(this, frame, height = ButtonPanel.HEIGHT) + val rowControls = EditablePanel(this, frame, height = ButtonPanel.HEIGHT) + + rowTop.dock = Dock.TOP + rowTop.dockTop = 3f + rowInput.dock = Dock.TOP + rowInput.dockTop = 3f + rowBottom.dock = Dock.TOP + rowBottom.dockTop = 3f + rowControls.dock = Dock.TOP + rowControls.dockTop = 3f + + object : AbstractSlotPanel(this@MatterPanelScreen, rowInput) { + init { + dock = Dock.LEFT + dockRight = 2f + } + + override fun getItemStack(): ItemStack { + return pattern.stack() + } + + override fun getItemStackTooltip(stack: ItemStack): List { + return super.getItemStackTooltip(stack).toMutableList().also { + it.add(TranslatableComponent( + "otm.item.pattern.research", + String.format("%.2f", pattern.research() * 100.0) + ).withStyle(ChatFormatting.AQUA)) + } + } + + override fun tick() { + super.tick() + + if (!menu.patterns.any { it.id == pattern.id }) { + frame.remove() + } + } + } + + val input = object : EditBoxPanel(this@MatterPanelScreen, rowInput) { + init { + dock = Dock.FILL + } + + override fun configureNew(widget: EditBox, recreation: Boolean) { + super.configureNew(widget, recreation) + widget.setMaxLength(6) + + if (!recreation) { + widget.value = "1" + } + } + + fun increase(amount: Int) { + var value = 1 + + try { + value = getOrCreateWidget().value.toInt() + } catch (_: NumberFormatException) { + } + + if (value == 1 && amount > 0) + getOrCreateWidget().value = amount.toString() + else + getOrCreateWidget().value = 1.coerceAtLeast(99999.coerceAtMost(value + amount)).toString() + } + + fun send() { + var value = 1 + + try { + value = getOrCreateWidget().value.toInt() + } catch (_: NumberFormatException) { + } + + MenuNetworkChannel.sendToServer(ReplicationRequestPacket(pattern, value)) + frame.remove() + } + } + + ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 8), onPress = { input.increase(8) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 64), onPress = { input.increase(64) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowTop, width = 40f, label = TranslatableComponent("otm.container.matter_panel.increase_by", 256), onPress = { input.increase(256) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 8), onPress = { input.increase(-8) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 64), onPress = { input.increase(-64) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowBottom, width = 40f, label = TranslatableComponent("otm.container.matter_panel.decrease_by", 256), onPress = { input.increase(-256) }).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowControls, width = 40f, label = TranslatableComponent("otm.container.matter_panel.cancel"), onPress = frame::remove).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + ButtonPanel(this, rowControls, width = 82f, label = TranslatableComponent("otm.container.matter_panel.send"), onPress = input::send).also { + it.dock = Dock.RIGHT + it.dockLeft = 2f + } + + addPanel(frame) + popup(frame) + + frame.toScreenCenter() + } + + companion object { + const val GRID_HEIGHT = 8 + const val GRID_WIDTH = 9 + } +} diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt index 1024a0f6c..894f97933 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/client/screen/panels/ButtonPanel.kt @@ -24,10 +24,22 @@ open class ButtonPanel( x: Float = 0f, y: Float = 0f, width: Float = 40f, - height: Float = 20f, + height: Float = HEIGHT, label: Component ) : MinecraftWidgetPanel