From 757f395004acb57a6917e7830e5124e461ba42c6 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 14 Jan 2022 12:12:10 +0700 Subject: [PATCH] Move mattery worker to kotlin and revise its code --- .../otm/block/entity/worker/MachineJob.java | 14 +- .../block/entity/worker/WorkTickContext.java | 4 +- .../mc/otm/menu/MatterDecomposerMenu.java | 2 +- .../mc/otm/menu/MatterReplicatorMenu.java | 2 +- .../mc/otm/block/BlockMatterDecomposer.kt | 2 +- .../mc/otm/block/BlockMatterReplicator.kt | 113 +++--- .../mc/otm/block/BlockMatterScanner.kt | 113 +++--- .../entity/BlockEntityMatterDecomposer.kt | 8 +- .../entity/BlockEntityMatterReplicator.kt | 18 +- .../block/entity/BlockEntityMatterScanner.kt | 16 +- .../entity/worker/BlockEntityMatteryWorker.kt | 331 +++++++++--------- .../mc/otm/menu/MatterScannerMenu.kt | 2 +- .../mc/otm/menu/PoweredMatteryMenu.kt | 2 + 13 files changed, 301 insertions(+), 326 deletions(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java index da86f3f3f..1822c5afc 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java @@ -3,25 +3,23 @@ package ru.dbotthepony.mc.otm.block.entity.worker; import net.minecraft.MethodsReturnNonnullByDefault; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; -import net.minecraft.nbt.StringTag; import net.minecraft.nbt.Tag; import net.minecraft.world.item.ItemStack; import ru.dbotthepony.mc.otm.core.Fraction; import javax.annotation.Nullable; import javax.annotation.ParametersAreNonnullByDefault; -import java.math.BigDecimal; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public record MachineJob(ItemStack stack, double ticks_processing_time, Fraction power_consumption_multiplier, +public record MachineJob(ItemStack stack, double ticks, Fraction power, CompoundTag data) { public MachineJob(ItemStack stack, double ticks_processing_time, Fraction power_consumption_multiplier) { this(stack, ticks_processing_time, power_consumption_multiplier, new CompoundTag()); } public MachineJob(ItemStack stack, double ticks_processing_time) { - this(stack, ticks_processing_time, Fraction.ONE); + this(stack, ticks_processing_time, Fraction.ZERO); } public CompoundTag serializeNBT() { @@ -29,8 +27,8 @@ public record MachineJob(ItemStack stack, double ticks_processing_time, Fraction store_job.put("data", data); store_job.put("stack", stack.serializeNBT()); - store_job.putDouble("ticks_processing_time", ticks_processing_time); - store_job.put("power_consumption_multiplier", power_consumption_multiplier.serializeNBT()); + store_job.putDouble("ticks", ticks); + store_job.put("power", power.serializeNBT()); return store_job; } @@ -41,11 +39,11 @@ public record MachineJob(ItemStack stack, double ticks_processing_time, Fraction return null; if (nbt instanceof CompoundTag tag) { - if (tag.get("stack") instanceof CompoundTag stack_tag && tag.get("ticks_processing_time") instanceof DoubleTag ticks_processing_time && tag.contains("power_consumption_multiplier")) { + if (tag.get("stack") instanceof CompoundTag stack_tag && tag.get("ticks") instanceof DoubleTag ticks_processing_time && tag.contains("power")) { ItemStack stack = ItemStack.of(stack_tag); if (!stack.isEmpty()) { - return new MachineJob(stack, ticks_processing_time.getAsDouble(), Fraction.deserializeNBT(tag.get("power_consumption_multiplier")), tag.getCompound("data")); + return new MachineJob(stack, ticks_processing_time.getAsDouble(), Fraction.deserializeNBT(tag.get("power")), tag.getCompound("data")); } } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkTickContext.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkTickContext.java index ad02c1099..55cb029df 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkTickContext.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkTickContext.java @@ -4,11 +4,9 @@ import net.minecraft.MethodsReturnNonnullByDefault; import ru.dbotthepony.mc.otm.core.Fraction; import javax.annotation.ParametersAreNonnullByDefault; -import java.math.BigDecimal; @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault -public record WorkTickContext(MachineJob job, Fraction required_power, Fraction extracted_power, - Fraction work_speed) { +public record WorkTickContext(MachineJob job, Fraction requiredPower, Fraction extractedPower, Fraction workSpeed) { } diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.java index be8835d2d..25322071d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterDecomposerMenu.java @@ -46,7 +46,7 @@ public class MatterDecomposerMenu extends PoweredMatteryMenu { progress = new ProgressGaugeWidget(this); } else { matter_widget = new LevelGaugeWidget(this, tile.getCapability(MatteryCapability.MATTER).resolve().get()); - progress = new ProgressGaugeWidget(this, () -> (float) tile.getWorkProgress(), tile::cantProcessJob); + progress = new ProgressGaugeWidget(this, () -> (float) tile.getWorkProgress(), tile::isUnableToProcess); } addInventorySlots(); diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.java index 98935cbb6..6d487fb91 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/MatterReplicatorMenu.java @@ -29,7 +29,7 @@ public class MatterReplicatorMenu extends PoweredMatteryMenu { if (tile != null) { matter_widget = new LevelGaugeWidget(this, tile.matter); - progress = new ProgressGaugeWidget(this, () -> (float) tile.getWorkProgress(), tile::cantProcessJob); + progress = new ProgressGaugeWidget(this, () -> (float) tile.getWorkProgress(), tile::isUnableToProcess); } else { matter_widget = new LevelGaugeWidget(this); progress = new ProgressGaugeWidget(this); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.kt index 4d22ac117..663f4b8b6 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.kt @@ -25,7 +25,7 @@ import ru.dbotthepony.mc.otm.shapes.BlockShapes @MethodsReturnNonnullByDefault @ParametersAreNonnullByDefault class BlockMatterDecomposer : BlockMatteryRotatable(), EntityBlock { - override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity? { + override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity { return BlockEntityMatterDecomposer(blockPos, blockState) } diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.kt index 9a8c0b42e..901973007 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.kt @@ -1,68 +1,67 @@ -package ru.dbotthepony.mc.otm.block; +package ru.dbotthepony.mc.otm.block -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -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.Registry; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterReplicator; -import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; -import ru.dbotthepony.mc.otm.shapes.BlockShapes; +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.EntityBlock +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.entity.BlockEntityTicker +import net.minecraft.world.level.block.entity.BlockEntityType +import net.minecraft.world.level.block.state.BlockState +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.Registry +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterReplicator +import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.shapes.BlockShapes -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class BlockMatterReplicator extends BlockMatteryRotatable implements EntityBlock { - @Nullable - @Override - public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { - return new BlockEntityMatterReplicator(blockPos, blockState); +class BlockMatterReplicator : BlockMatteryRotatable(), EntityBlock { + override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity { + return BlockEntityMatterReplicator(blockPos, blockState) } - @Nullable - @Override - public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { - return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_REPLICATOR ? null : BlockEntityMatteryWorker::basicTicker; + override fun getTicker( + p_153212_: Level, + p_153213_: BlockState, + p_153214_: BlockEntityType + ): BlockEntityTicker? { + if (p_153212_.isClientSide || p_153214_ !== Registry.BlockEntities.MATTER_REPLICATOR) + return null + + return BlockEntityTicker { _, _, _, tile -> if (tile is BlockEntityMatterReplicator) tile.basicTicker() } } - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(WorkerState.WORKER_STATE); + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + builder.add(WorkerState.WORKER_STATE) } - private static final List SHAPES; - - static { - var def = BlockShapes.MATTER_REPLICATOR.computeShape(); - - SHAPES = List.of( - def, - def, - def, - BlockShapes.MATTER_REPLICATOR.rotate(Direction.NORTH).computeShape(), - BlockShapes.MATTER_REPLICATOR.rotate(Direction.WEST).computeShape(), - BlockShapes.MATTER_REPLICATOR.rotate(Direction.EAST).computeShape() - ); + override fun getShape( + p_60555_: BlockState, + p_60556_: BlockGetter, + p_60557_: BlockPos, + p_60558_: CollisionContext + ): VoxelShape { + return SHAPES[p_60555_.getValue(FACING).ordinal] } - @Override - @SuppressWarnings("deprecation") - public VoxelShape getShape(BlockState p_60555_, BlockGetter p_60556_, BlockPos p_60557_, CollisionContext p_60558_) { - return SHAPES.get(p_60555_.getValue(FACING).ordinal()); + companion object { + private val SHAPES: Array + + init { + val def = BlockShapes.MATTER_REPLICATOR.computeShape() + + SHAPES = arrayOf( + def, + def, + def, + BlockShapes.MATTER_REPLICATOR.rotate(Direction.NORTH).computeShape(), + BlockShapes.MATTER_REPLICATOR.rotate(Direction.WEST).computeShape(), + BlockShapes.MATTER_REPLICATOR.rotate(Direction.EAST).computeShape() + ) + } } -} +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterScanner.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterScanner.kt index ebffddf66..6a58f7c76 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterScanner.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/BlockMatterScanner.kt @@ -1,68 +1,67 @@ -package ru.dbotthepony.mc.otm.block; +package ru.dbotthepony.mc.otm.block -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.core.Direction; -import net.minecraft.world.level.BlockGetter; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.EntityBlock; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityTicker; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -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.Registry; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterScanner; -import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; -import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; -import ru.dbotthepony.mc.otm.shapes.BlockShapes; +import net.minecraft.core.BlockPos +import net.minecraft.core.Direction +import net.minecraft.world.level.BlockGetter +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.EntityBlock +import net.minecraft.world.level.block.entity.BlockEntity +import net.minecraft.world.level.block.entity.BlockEntityTicker +import net.minecraft.world.level.block.entity.BlockEntityType +import net.minecraft.world.level.block.state.BlockState +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.Registry +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterScanner +import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState +import ru.dbotthepony.mc.otm.shapes.BlockShapes -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.util.List; - -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -public class BlockMatterScanner extends BlockMatteryRotatable implements EntityBlock { - @Nullable - @Override - public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { - return new BlockEntityMatterScanner(blockPos, blockState); +class BlockMatterScanner : BlockMatteryRotatable(), EntityBlock { + override fun newBlockEntity(blockPos: BlockPos, blockState: BlockState): BlockEntity { + return BlockEntityMatterScanner(blockPos, blockState) } - @Nullable - @Override - public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { - return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_SCANNER ? null : BlockEntityMatteryWorker::basicTicker; + override fun getTicker( + p_153212_: Level, + p_153213_: BlockState, + p_153214_: BlockEntityType + ): BlockEntityTicker? { + if (p_153212_.isClientSide || p_153214_ !== Registry.BlockEntities.MATTER_SCANNER) + return null + + return BlockEntityTicker { _, _, _, tile -> if (tile is BlockEntityMatterScanner) tile.basicTicker() } } - @Override - protected void createBlockStateDefinition(StateDefinition.Builder builder) { - super.createBlockStateDefinition(builder); - builder.add(WorkerState.WORKER_STATE); + override fun createBlockStateDefinition(builder: StateDefinition.Builder) { + super.createBlockStateDefinition(builder) + builder.add(WorkerState.WORKER_STATE) } - private static final List SHAPES; - - static { - var def = BlockShapes.MATTER_SCANNER.computeShape(); - - SHAPES = List.of( - def, - def, - def, - BlockShapes.MATTER_SCANNER.rotate(Direction.NORTH).computeShape(), - BlockShapes.MATTER_SCANNER.rotate(Direction.WEST).computeShape(), - BlockShapes.MATTER_SCANNER.rotate(Direction.EAST).computeShape() - ); + override fun getShape( + p_60555_: BlockState, + p_60556_: BlockGetter, + p_60557_: BlockPos, + p_60558_: CollisionContext + ): VoxelShape { + return SHAPES[p_60555_.getValue(FACING).ordinal] } - @Override - @SuppressWarnings("deprecation") - public VoxelShape getShape(BlockState p_60555_, BlockGetter p_60556_, BlockPos p_60557_, CollisionContext p_60558_) { - return SHAPES.get(p_60555_.getValue(FACING).ordinal()); + companion object { + private val SHAPES: Array + + init { + val def = BlockShapes.MATTER_SCANNER.computeShape() + + SHAPES = arrayOf( + def, + def, + def, + BlockShapes.MATTER_SCANNER.rotate(Direction.NORTH).computeShape(), + BlockShapes.MATTER_SCANNER.rotate(Direction.WEST).computeShape(), + BlockShapes.MATTER_SCANNER.rotate(Direction.EAST).computeShape() + ) + } } -} +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.kt index 71c552249..4fafd7bbb 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.kt @@ -129,7 +129,7 @@ class BlockEntityMatterDecomposer(pos: BlockPos, state: BlockState) return MachineJobStatus() } - override fun getNextJob(): MachineJob? { + override fun computeNextJob(): MachineJob? { val stack = itemContainer.getItem(0) if (!stack.isEmpty) { @@ -141,7 +141,7 @@ class BlockEntityMatterDecomposer(pos: BlockPos, state: BlockState) if (value != Fraction.ZERO && matter.canReceiveAll(value)) { stack.shrink(1) - return MachineJob(copy, value.toDouble() * 12500.0) + return MachineJob(copy, value.toDouble() * 12500.0, BASE_CONSUMPTION) } } } @@ -165,10 +165,6 @@ class BlockEntityMatterDecomposer(pos: BlockPos, state: BlockState) return matter } - override fun getBaseConsumption(): Fraction { - return BASE_CONSUMPTION - } - fun tick() { batteryChargeLoop(); workerLoop(); diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.kt index 67bebdc99..1c6f97eef 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.kt @@ -70,10 +70,6 @@ class BlockEntityMatterReplicator(p_155229_: BlockPos, p_155230_: BlockState) : return MatterReplicatorMenu(containerID, inventory, this) } - override fun getBaseConsumption(): Fraction { - return BASE_CONSUMPTION - } - override fun onJobFinish(job: MachineJob): MachineJobStatus { if (!regularSlots.fullyAddItem(job.stack())) { return MachineJobStatus(false, 20) @@ -84,15 +80,15 @@ class BlockEntityMatterReplicator(p_155229_: BlockPos, p_155230_: BlockState) : } override fun onMatterTaskCreated(task: MatterTask) { - is_idling = false + isIdling = false } override fun onMatterTaskUpdated(new_state: MatterTask, old_state: MatterTask) { - is_idling = false + isIdling = false } override fun onPatternAdded(state: PatternState) { - is_idling = false + isIdling = false } override fun setRemoved() { @@ -107,14 +103,14 @@ class BlockEntityMatterReplicator(p_155229_: BlockPos, p_155230_: BlockState) : MatterNetworkGraph.discoverFull(this, node) } - override fun getNextJob(): MachineJob? { + override fun computeNextJob(): MachineJob? { val graph = node.graph as MatterNetworkGraph? ?: return null val allocation = graph.allocateTask(false) ?: return null val stack = allocation.task().stack(1) // ???????? if (!MatterRegistry.hasMatterValue(stack)) return null - val job = MachineJob(stack, MatterRegistry.getMatterValue(stack).toDouble() * TICKS_PER_MTU) + val job = MachineJob(stack, MatterRegistry.getMatterValue(stack).toDouble() * TICKS_PER_MTU, BASE_CONSUMPTION) job.data["task"] = allocation.task.serializeNBT() if (allocation.pattern != null) job.data["pattern"] = allocation.pattern!!.serializeNBT() @@ -123,8 +119,8 @@ class BlockEntityMatterReplicator(p_155229_: BlockPos, p_155230_: BlockState) : } override fun onWorkTick(context: WorkTickContext): MachineJobStatus { - val drainPerTick = MTU_PER_TICK_BD.times(context.work_speed()) - val graph = node.graph as MatterNetworkGraph? ?: return MachineJobStatus(false, 20) + val drainPerTick = MTU_PER_TICK_BD.times(context.workSpeed()) + val graph = node.graph as? MatterNetworkGraph ?: return MachineJobStatus(false, 20) if (matter.extractMatterInner(drainPerTick, true) < drainPerTick) { // в машине недостаточно материи diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.kt index e18def1a4..bea09ce87 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.kt @@ -38,7 +38,7 @@ class BlockEntityMatterScanner(p_155229_: BlockPos, p_155230_: BlockState) : private val inputHandler = input_slot.handler( { slot: Int, stack: ItemStack? -> MatterRegistry.canDecompose(stack) }, - { slot: Int, amount: Int, stack: ItemStack? -> is_idling } + { slot: Int, amount: Int, stack: ItemStack? -> isIdling } ) // IMatterGraphNode @@ -47,15 +47,15 @@ class BlockEntityMatterScanner(p_155229_: BlockPos, p_155230_: BlockState) : } override fun onPatternAdded(state: PatternState) { - is_idling = false + isIdling = false } override fun onPatternRemoved(state: PatternState) { - is_idling = false + isIdling = false } override fun onPatternUpdated(new_state: PatternState, old_state: PatternState) { - is_idling = false + isIdling = false } // /IMatterGraphNode @@ -111,10 +111,6 @@ class BlockEntityMatterScanner(p_155229_: BlockPos, p_155230_: BlockState) : super.load(nbt) } - override fun getBaseConsumption(): Fraction { - return BASE_CONSUMPTION - } - override fun onJobFinish(job: MachineJob): MachineJobStatus { val grid = matterNode.graph as MatterNetworkGraph? ?: return MachineJobStatus(false, 100) @@ -148,7 +144,7 @@ class BlockEntityMatterScanner(p_155229_: BlockPos, p_155230_: BlockState) : } } - override fun getNextJob(): MachineJob? { + override fun computeNextJob(): MachineJob? { val grid = matterNode.graph as MatterNetworkGraph? ?: return null val stack = input_slot.getItem(0) @@ -177,7 +173,7 @@ class BlockEntityMatterScanner(p_155229_: BlockPos, p_155230_: BlockState) : copy.count = 1 stack.shrink(1) input_slot.setChanged() - return MachineJob(copy, MatterRegistry.getMatterValue(copy).toDouble() * 35000.0) + return MachineJob(copy, MatterRegistry.getMatterValue(copy).toDouble() * 35000.0, BASE_CONSUMPTION) } return null diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.kt index f6d16a83d..736cffff5 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.kt @@ -1,267 +1,258 @@ -package ru.dbotthepony.mc.otm.block.entity.worker; +package ru.dbotthepony.mc.otm.block.entity.worker -import net.minecraft.MethodsReturnNonnullByDefault; -import net.minecraft.core.BlockPos; -import net.minecraft.nbt.CompoundTag; -import net.minecraft.nbt.DoubleTag; -import net.minecraft.world.level.Level; -import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.entity.BlockEntity; -import net.minecraft.world.level.block.entity.BlockEntityType; -import net.minecraft.world.level.block.state.BlockState; -import ru.dbotthepony.mc.otm.OverdriveThatMatters; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered; -import ru.dbotthepony.mc.otm.capability.MatteryCapability; -import ru.dbotthepony.mc.otm.core.Fraction; +import net.minecraft.MethodsReturnNonnullByDefault +import javax.annotation.ParametersAreNonnullByDefault +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.BlockEntityMatteryPowered +import net.minecraft.nbt.CompoundTag +import net.minecraft.nbt.DoubleTag +import net.minecraft.world.level.Level +import net.minecraft.world.level.block.Block +import net.minecraft.world.level.block.entity.BlockEntity +import ru.dbotthepony.mc.otm.core.Fraction +import ru.dbotthepony.mc.otm.ifHas +import ru.dbotthepony.mc.otm.set -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.ParametersAreNonnullByDefault; -import java.math.BigDecimal; +abstract class BlockEntityMatteryWorker(p_155228_: BlockEntityType<*>, p_155229_: BlockPos, p_155230_: BlockState) : + BlockEntityMatteryPowered(p_155228_, p_155229_, p_155230_) { + var workTicks = 0.0 + protected set -@MethodsReturnNonnullByDefault -@ParametersAreNonnullByDefault -abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered { - public BlockEntityMatteryWorker(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { - super(p_155228_, p_155229_, p_155230_); - } + var throttleTicks = 0 + protected set - protected abstract Fraction getBaseConsumption(); + var currentJob: MachineJob? = null + protected set - protected Fraction consumptionPerWork() { - return getBaseConsumption(); - } + // если isIdling То ничего не делать + // isIdling должна быть выставлена в true если что то изменилось, что могло создать работу + var isIdling = false + protected set - protected double work_ticks = 0; - protected int throttle_ticks = 0; - protected MachineJob current_job; + val isUnableToProcess: Boolean get() = throttleTicks > 0 - // if is_idling is true, then workerLoop() does nothing - protected boolean is_idling = false; - - @Nullable - public MachineJob getCurrentJob() { - return current_job; - } - - public boolean cantProcessJob() { - return throttle_ticks > 0; - } - - @Override - public void saveAdditional(CompoundTag nbt) { - super.saveAdditional(nbt); - nbt.putDouble("work_ticks", work_ticks); - - if (current_job != null) { - nbt.put("current_job", current_job.serializeNBT()); + val workProgress: Double + get() { + val currentJob = currentJob ?: return 0.0 + return (workTicks / currentJob.ticks()).coerceAtMost(1.0) } + + override fun saveAdditional(nbt: CompoundTag) { + super.saveAdditional(nbt) + nbt["work_ticks"] = workTicks + currentJob?.let { nbt["current_job"] = it.serializeNBT() } } - @Override - public void load(CompoundTag nbt) { - super.load(nbt); + override fun load(nbt: CompoundTag) { + super.load(nbt) - if (nbt.get("work_ticks") instanceof DoubleTag tag) - work_ticks = tag.getAsDouble(); + nbt.ifHas("work_ticks", DoubleTag::class.java) { + workTicks = it.asDouble + } - current_job = MachineJob.deserializeNBT(nbt.get("current_job")); - - if (current_job == null) - work_ticks = 0d; + currentJob = MachineJob.deserializeNBT(nbt["current_job"]) + if (currentJob == null) + workTicks = 0.0 } - @Override - public void setChanged() { - super.setChanged(); - is_idling = false; + 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 + * waiting on conditions to be met */ - abstract protected MachineJobStatus onJobFinish(MachineJob job); + protected abstract fun onJobFinish(job: MachineJob): MachineJobStatus /** * @param context context for current job * @return whenever machine can perform it */ - protected MachineJobStatus onWorkTick(WorkTickContext context) { - return new MachineJobStatus(); + protected open fun onWorkTick(context: WorkTickContext): MachineJobStatus { + return MachineJobStatus() } - private int idle_ticks_anim = 0; - private int working_ticks_anim = 0; - private int error_ticks_anim = 0; + private var idleTicksAnim = 0 + private var workingTicksAnim = 0 + private var errorTicksAnim = 0 - @Override - protected void redstoneStatusUpdated(boolean new_blocked, boolean old_blocked) { - super.redstoneStatusUpdated(new_blocked, old_blocked); - is_idling = new_blocked; + override fun redstoneStatusUpdated(new_blocked: Boolean, old_blocked: Boolean) { + super.redstoneStatusUpdated(new_blocked, old_blocked) + isIdling = new_blocked } - protected void workerLoop() { - if (level != null && error_ticks_anim > 20 && getBlockState().hasProperty(WorkerState.WORKER_STATE) && getBlockState().getValue(WorkerState.WORKER_STATE) != WorkerState.ERROR) { - level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.WORKER_STATE, WorkerState.ERROR), Block.UPDATE_CLIENTS); + protected fun workerLoop() { + val level = level ?: return + + 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 (throttle_ticks > 0) { - working_ticks_anim = 0; - idle_ticks_anim = 0; - throttle_ticks--; - error_ticks_anim++; + if (throttleTicks > 0) { + workingTicksAnim = 0 + idleTicksAnim = 0 + throttleTicks-- + errorTicksAnim++ - if (throttle_ticks > 0) - return; + if (throttleTicks > 0) + return } - if (is_idling) { - working_ticks_anim = 0; - error_ticks_anim = 0; - idle_ticks_anim++; + if (isIdling) { + workingTicksAnim = 0 + errorTicksAnim = 0 + idleTicksAnim++ - if (level != null && idle_ticks_anim > 20 && getBlockState().hasProperty(WorkerState.WORKER_STATE) && getBlockState().getValue(WorkerState.WORKER_STATE) != WorkerState.IDLE) { - level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + 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; + return } - if (current_job == null) { - if (isBlockedByRedstone()) { - is_idling = true; - return; + var currentJob = currentJob + + if (currentJob == null) { + if (isBlockedByRedstone) { + isIdling = true + return } - MachineJob input = getNextJob(); + val input = computeNextJob() if (input == null) { - is_idling = true; - working_ticks_anim = 0; - return; + isIdling = true + workingTicksAnim = 0 + return } - current_job = input; + this.currentJob = input + currentJob = input } - if (isBlockedByRedstone()) { - is_idling = true; - return; + if (isBlockedByRedstone) { + isIdling = true + return } - if (current_job.power_consumption_multiplier().compareTo(Fraction.ZERO) != 0 && energy.getBatteryLevel().compareTo(Fraction.ZERO) == 0) { - idle_ticks_anim++; + if (!currentJob.power.isZero() && energy.batteryLevel.isZero()) { + idleTicksAnim++ - if (level != null && idle_ticks_anim > 20 && getBlockState().hasProperty(WorkerState.WORKER_STATE) && getBlockState().getValue(WorkerState.WORKER_STATE) != WorkerState.IDLE) { - level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + 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; + return } - idle_ticks_anim = 0; + idleTicksAnim = 0 - if (work_ticks < current_job.ticks_processing_time()) { - if (current_job.power_consumption_multiplier().compareTo(Fraction.ZERO) != 0) { - var required_power = consumptionPerWork().times(current_job.power_consumption_multiplier()); - var extracted_power = energy.extractEnergyInner(required_power, true); - var work_speed = extracted_power.div(required_power); + if (workTicks < currentJob.ticks) { + if (!currentJob.power.isZero()) { + val extractedPower = energy.extractEnergyInner(currentJob.power, true) + val workSpeed = extractedPower.div(currentJob.power) - MachineJobStatus status = onWorkTick(new WorkTickContext(current_job, required_power, extracted_power, work_speed)); + val status = onWorkTick(WorkTickContext(currentJob, currentJob.power, extractedPower, workSpeed)) if (!status.valid()) { - throttle_ticks += status.throttle(); - return; + throttleTicks += status.throttle + return } - working_ticks_anim++; - error_ticks_anim = 0; + workingTicksAnim++ + errorTicksAnim = 0 - double new_work_ticks = work_speed.toDouble() + work_ticks; + val updatedWorkTicks = workSpeed.toDouble() + workTicks - if (new_work_ticks > current_job.ticks_processing_time()) { - work_ticks = current_job.ticks_processing_time(); - energy.extractEnergyInner(extracted_power.times(1d - (new_work_ticks - current_job.ticks_processing_time())), false); + if (updatedWorkTicks > currentJob.ticks) { + workTicks = currentJob.ticks + + energy.extractEnergyInner( + extractedPower.times(1.0 - (updatedWorkTicks - currentJob.ticks())), + false + ) } else { - work_ticks = new_work_ticks; - energy.extractEnergyInner(extracted_power, false); + workTicks = updatedWorkTicks + energy.extractEnergyInner(extractedPower, false) - if (work_ticks >= current_job.ticks_processing_time()) { - MachineJobStatus finish = onJobFinish(current_job); + if (workTicks >= currentJob.ticks) { + val finish = onJobFinish(currentJob) - if (finish.valid()) { - current_job = null; - work_ticks = 0d; + if (finish.valid) { + this.currentJob = null + workTicks = 0.0 } else { - throttle_ticks += finish.throttle(); + throttleTicks += finish.throttle } } } } else { - MachineJobStatus status = onWorkTick(new WorkTickContext(current_job, Fraction.ZERO, Fraction.ZERO, Fraction.ONE)); + val status = onWorkTick(WorkTickContext(currentJob, Fraction.ZERO, Fraction.ZERO, Fraction.ONE)) - if (!status.valid()) { - throttle_ticks += status.throttle(); - return; + if (!status.valid) { + throttleTicks += status.throttle() + return } - working_ticks_anim++; - error_ticks_anim = 0; - work_ticks += 1d; + workingTicksAnim++ + errorTicksAnim = 0 + workTicks += 1.0 - if (work_ticks >= current_job.ticks_processing_time()) { - MachineJobStatus finish = onJobFinish(current_job); + if (workTicks >= currentJob.ticks) { + val finish = onJobFinish(currentJob) if (finish.valid()) { - current_job = null; - work_ticks = 0d; + this.currentJob = null + workTicks = 0.0 } else { - throttle_ticks += finish.throttle(); + throttleTicks += finish.throttle } } } } else { - MachineJobStatus finish = onJobFinish(current_job); + val finish = onJobFinish(currentJob) if (finish.valid()) { - current_job = null; - work_ticks = 0d; - error_ticks_anim = 0; + this.currentJob = null + workTicks = 0.0 + errorTicksAnim = 0 } else { - throttle_ticks += finish.throttle(); - error_ticks_anim++; + throttleTicks += finish.throttle + errorTicksAnim++ } } - if (level != null && (working_ticks_anim > 20 && error_ticks_anim == 0) && getBlockState().hasProperty(WorkerState.WORKER_STATE) && getBlockState().getValue(WorkerState.WORKER_STATE) != WorkerState.WORKING) { - level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); + 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) } } - public double getWorkTicks() { - return work_ticks; - } - - public double getWorkProgress() { - if (current_job == null) - return 0d; - - return Math.min(1d, work_ticks / current_job.ticks_processing_time()); - } - /** * Determine which item can be processed from input slots if idling * @return any item in input slots. null if no work is available */ - @Nullable - protected abstract MachineJob getNextJob(); + protected abstract fun computeNextJob(): MachineJob? - public static void basicTicker(Level level, BlockPos blockPos, BlockState blockState, T t) { - if (t instanceof BlockEntityMatteryWorker tile) { - tile.batteryChargeLoop(); - tile.workerLoop(); - } + fun basicTicker() { + batteryChargeLoop() + workerLoop() } -} +} \ No newline at end of file diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterScannerMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterScannerMenu.kt index 4ca0a1445..d37272cb7 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterScannerMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/MatterScannerMenu.kt @@ -34,7 +34,7 @@ class MatterScannerMenu @JvmOverloads constructor( addSlot(input) if (tile != null) { - progress = ProgressGaugeWidget(this, { tile.workProgress.toFloat() }) { tile.cantProcessJob() } + progress = ProgressGaugeWidget(this, { tile.workProgress.toFloat() }, tile::isUnableToProcess) patterns = LevelGaugeWidget(this, { Fraction(tile.getAsMatterGraph()?.getPatternCount()?.toBigInteger() ?: BigInteger.ZERO) }, { Fraction(tile.getAsMatterGraph()?.getPatternCapacity()?.toBigInteger() ?: BigInteger.ZERO) }) diff --git a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt index fa12643fb..2165ac962 100644 --- a/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt +++ b/src/main/kotlin/ru/dbotthepony/mc/otm/menu/PoweredMatteryMenu.kt @@ -24,5 +24,7 @@ abstract class PoweredMatteryMenu protected constructor( powerWidget = LevelGaugeWidget(this, tile.getCapability(MatteryCapability.ENERGY).resolve().get()) batterySlot = BatterySlot(tile.batteryContainer, 0) } + + addSlot(batterySlot) } }