diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java index 07f110640..8d9b03d36 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterBottler.java @@ -11,7 +11,7 @@ import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.StateDefinition; import ru.dbotthepony.mc.otm.Registry; import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatterBottler; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPoweredWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; import javax.annotation.Nullable; @@ -31,6 +31,6 @@ public class BlockMatterBottler extends BlockMatteryRotatable implements EntityB @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + builder.add(BlockEntityMatteryWorker.WORKER_STATE); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java index 6b249ad31..ca598fea7 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java @@ -15,7 +15,7 @@ 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.BlockEntityMatterDecomposer; -import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPoweredWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; import ru.dbotthepony.mc.otm.shapes.BlockShapes; import javax.annotation.Nullable; @@ -37,7 +37,7 @@ public class BlockMatterDecomposer extends BlockMatteryRotatable implements Enti @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + builder.add(BlockEntityMatteryWorker.WORKER_STATE); } private static final List SHAPES; diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java index d826ad771..f1d66e9b8 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java @@ -15,7 +15,7 @@ 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.BlockEntityMatteryPoweredWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; import ru.dbotthepony.mc.otm.shapes.BlockShapes; import javax.annotation.Nullable; @@ -31,13 +31,13 @@ public class BlockMatterReplicator extends BlockMatteryRotatable implements Enti @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 : BlockEntityMatteryPoweredWorker::basicTicker; + return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_REPLICATOR ? null : BlockEntityMatteryWorker::basicTicker; } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + builder.add(BlockEntityMatteryWorker.WORKER_STATE); } private static final List SHAPES; diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java index 9a860f1df..66d92279a 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java @@ -15,7 +15,7 @@ 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.BlockEntityMatteryPoweredWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; import ru.dbotthepony.mc.otm.shapes.BlockShapes; import javax.annotation.Nullable; @@ -31,13 +31,13 @@ public class BlockMatterScanner extends BlockMatteryRotatable implements EntityB @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 : BlockEntityMatteryPoweredWorker::basicTicker; + return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_SCANNER ? null : BlockEntityMatteryWorker::basicTicker; } @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + builder.add(BlockEntityMatteryWorker.WORKER_STATE); } private static final List SHAPES; diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java index da2373cf2..191f2c70d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterBottler.java @@ -8,7 +8,6 @@ import net.minecraft.network.chat.TranslatableComponent; 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.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.block.Block; @@ -18,8 +17,9 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; -import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; +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.matter.MatterGrid; @@ -255,8 +255,8 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen if (tile.work_flow) { if (capability != null) { - if (tile.getBlockState().getValue(BlockEntityMatteryPoweredWorker.WORKER_STATE) != BlockEntityMatteryPoweredWorker.WorkerState.WORKING) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryPoweredWorker.WORKER_STATE, BlockEntityMatteryPoweredWorker.WorkerState.WORKING), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); } if (tile.matter.getStoredMatter().compareTo(MATTER_EXCHANGE_RATE) < 0) { @@ -298,14 +298,14 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen } } } else { - if (tile.getBlockState().getValue(BlockEntityMatteryPoweredWorker.WORKER_STATE) != BlockEntityMatteryPoweredWorker.WorkerState.IDLE) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryPoweredWorker.WORKER_STATE, BlockEntityMatteryPoweredWorker.WorkerState.IDLE), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); } } } else { if (capability != null) { - if (tile.getBlockState().getValue(BlockEntityMatteryPoweredWorker.WORKER_STATE) != BlockEntityMatteryPoweredWorker.WorkerState.WORKING) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryPoweredWorker.WORKER_STATE, BlockEntityMatteryPoweredWorker.WorkerState.WORKING), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); } var energy = tile.energy.extractEnergyInner(ENERGY_CONSUMPTION, true); @@ -330,8 +330,8 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen } } } else { - if (tile.getBlockState().getValue(BlockEntityMatteryPoweredWorker.WORKER_STATE) != BlockEntityMatteryPoweredWorker.WorkerState.IDLE) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryPoweredWorker.WORKER_STATE, BlockEntityMatteryPoweredWorker.WorkerState.IDLE), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java index 3f9107ddd..2859b5c6d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterDecomposer.java @@ -17,6 +17,9 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import ru.dbotthepony.mc.otm.*; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJob; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJobStatus; import ru.dbotthepony.mc.otm.capability.*; import ru.dbotthepony.mc.otm.container.MatteryContainer; import ru.dbotthepony.mc.otm.capability.IMatterGridCell; @@ -28,7 +31,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.math.BigDecimal; -public class BlockEntityMatterDecomposer extends BlockEntityMatteryPoweredWorker implements IMatterGridCell { +public class BlockEntityMatterDecomposer extends BlockEntityMatteryWorker implements IMatterGridCell { private static final TranslatableComponent MACHINE_NAME = new TranslatableComponent("block.overdrive_that_matters.matter_decomposer"); private boolean valid = true; public final MatterHandlerCapability matter = new MatterHandlerCapability(this::setChanged, IMatterHandler.MatterDirection.EXTRACT, new BigDecimal("20")); diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.java index 80fd819d9..9e2852d8e 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterReplicator.java @@ -16,6 +16,10 @@ import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; import ru.dbotthepony.mc.otm.Registry; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJob; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJobStatus; +import ru.dbotthepony.mc.otm.block.entity.worker.WorkTickContext; import ru.dbotthepony.mc.otm.capability.*; import ru.dbotthepony.mc.otm.container.MatteryContainer; import ru.dbotthepony.mc.otm.matter.MatterGrid; @@ -26,7 +30,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.math.BigDecimal; -public class BlockEntityMatterReplicator extends BlockEntityMatteryPoweredWorker implements IMatterGridCell { +public class BlockEntityMatterReplicator extends BlockEntityMatteryWorker implements IMatterGridCell { public BlockEntityMatterReplicator(BlockPos p_155229_, BlockState p_155230_) { super(Registry.BlockEntities.MATTER_REPLICATOR, p_155229_, p_155230_); energy = new MatteryMachineEnergyStorage(this, MatteryMachineEnergyStorage.MachineType.WORKER, new BigDecimal(200_000), new BigDecimal(4000), new BigDecimal(4000)); diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.java index d18589bb2..c6e90ad5d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatterScanner.java @@ -15,6 +15,9 @@ import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.IItemHandler; +import ru.dbotthepony.mc.otm.block.entity.worker.BlockEntityMatteryWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJob; +import ru.dbotthepony.mc.otm.block.entity.worker.MachineJobStatus; import ru.dbotthepony.mc.otm.capability.*; import ru.dbotthepony.mc.otm.matter.MatterGrid; import ru.dbotthepony.mc.otm.matter.MatterRegistry; @@ -28,7 +31,7 @@ import java.math.BigDecimal; import java.util.Collection; import java.util.UUID; -public class BlockEntityMatterScanner extends BlockEntityMatteryPoweredWorker implements IMatterGridCell { +public class BlockEntityMatterScanner extends BlockEntityMatteryWorker implements IMatterGridCell { private static final TranslatableComponent NAME = new TranslatableComponent("block.overdrive_that_matters.matter_scanner"); public final MatteryContainer input_slot = new MatteryContainer(this::setChanged, 1); diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java similarity index 61% rename from src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java rename to src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java index ca3b8a5bd..9a5241126 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java @@ -1,92 +1,29 @@ -package ru.dbotthepony.mc.otm.block.entity; +package ru.dbotthepony.mc.otm.block.entity.worker; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.DoubleTag; -import net.minecraft.nbt.StringTag; -import net.minecraft.nbt.Tag; -import net.minecraft.util.StringRepresentable; -import net.minecraft.world.item.ItemStack; 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 net.minecraft.world.level.block.state.properties.EnumProperty; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPowered; import ru.dbotthepony.mc.otm.capability.MatteryCapability; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.math.BigDecimal; -abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMatteryPowered { - public BlockEntityMatteryPoweredWorker(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { +abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered { + public BlockEntityMatteryWorker(BlockEntityType p_155228_, BlockPos p_155229_, BlockState p_155230_) { super(p_155228_, p_155229_, p_155230_); } @Nonnull protected abstract BigDecimal getBaseConsumption(); - public record WorkTickContext(MachineJob job, BigDecimal required_power, BigDecimal extracted_power, BigDecimal work_speed) { - - } - - public record MachineJobStatus(boolean valid, int throttle) { - public MachineJobStatus() { - this(true, 0); - } - - public MachineJobStatus(boolean finished) { - this(finished, 0); - } - } - - public record MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal power_consumption_multiplier, CompoundTag data) { - public MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal power_consumption_multiplier, CompoundTag data) { - this.stack = stack; - this.ticks_processing_time = ticks_processing_time; - this.power_consumption_multiplier = power_consumption_multiplier; - this.data = data; - } - - public MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal 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, BigDecimal.ONE); - } - - public CompoundTag serializeNBT() { - CompoundTag store_job = new CompoundTag(); - - store_job.put("data", data); - store_job.put("stack", stack.serializeNBT()); - store_job.putDouble("ticks_processing_time", ticks_processing_time); - store_job.putString("power_consumption_multiplier", power_consumption_multiplier.toString()); - - return store_job; - } - - @Nullable - public static MachineJob deserializeNBT(@Nullable Tag nbt) { - if (nbt == null) - 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.get("power_consumption_multiplier") instanceof StringTag power_consumption_multiplier) { - ItemStack stack = ItemStack.of(stack_tag); - - if (!stack.isEmpty()) { - return new MachineJob(stack, ticks_processing_time.getAsDouble(), new BigDecimal(power_consumption_multiplier.getAsString()), tag.getCompound("data")); - } - } - } - - return null; - } - } - @Nonnull protected BigDecimal consumptionPerWork() { return getBaseConsumption(); @@ -154,18 +91,6 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery return new MachineJobStatus(); } - public enum WorkerState implements StringRepresentable { - IDLE, - WORKING, - ERROR; - - @Override - @Nonnull - public String getSerializedName() { - return this == IDLE ? "idle" : this == WORKING ? "working" : "error"; - } - } - public static final EnumProperty WORKER_STATE = EnumProperty.create("worker", WorkerState.class); private int idle_ticks_anim = 0; @@ -211,7 +136,7 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery current_job = input; } - if (current_job.power_consumption_multiplier.compareTo(BigDecimal.ZERO) != 0 && energy.getBatteryLevel().compareTo(BigDecimal.ZERO) == 0) { + if (current_job.power_consumption_multiplier().compareTo(BigDecimal.ZERO) != 0 && energy.getBatteryLevel().compareTo(BigDecimal.ZERO) == 0) { idle_ticks_anim++; if (level != null && idle_ticks_anim > 20 && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.IDLE) { @@ -223,17 +148,17 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery idle_ticks_anim = 0; - if (work_ticks < current_job.ticks_processing_time) { - if (current_job.power_consumption_multiplier.compareTo(BigDecimal.ZERO) != 0) { - BigDecimal required_power = consumptionPerWork().multiply(current_job.power_consumption_multiplier); + if (work_ticks < current_job.ticks_processing_time()) { + if (current_job.power_consumption_multiplier().compareTo(BigDecimal.ZERO) != 0) { + BigDecimal required_power = consumptionPerWork().multiply(current_job.power_consumption_multiplier()); BigDecimal extracted_power = energy.extractEnergyInner(required_power, true); BigDecimal work_speed = extracted_power.divide(required_power, MatteryCapability.ROUND_RULES); MachineJobStatus status = onWorkTick(new WorkTickContext(current_job, required_power, extracted_power, work_speed)); - if (!status.valid) { - throttle_ticks += status.throttle; + if (!status.valid()) { + throttle_ticks += status.throttle(); return; } @@ -242,29 +167,29 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery double new_work_ticks = work_speed.doubleValue() + work_ticks; - if (new_work_ticks > current_job.ticks_processing_time) { - work_ticks = current_job.ticks_processing_time; - energy.extractEnergyInner(extracted_power.multiply(new BigDecimal(1d - (new_work_ticks - current_job.ticks_processing_time), MatteryCapability.ROUND_RULES)), false); + if (new_work_ticks > current_job.ticks_processing_time()) { + work_ticks = current_job.ticks_processing_time(); + energy.extractEnergyInner(extracted_power.multiply(new BigDecimal(1d - (new_work_ticks - current_job.ticks_processing_time()), MatteryCapability.ROUND_RULES)), false); } else { work_ticks = new_work_ticks; energy.extractEnergyInner(extracted_power, false); - if (work_ticks >= current_job.ticks_processing_time) { + if (work_ticks >= current_job.ticks_processing_time()) { MachineJobStatus finish = onJobFinish(current_job); - if (finish.valid) { + if (finish.valid()) { current_job = null; work_ticks = 0d; } else { - throttle_ticks += finish.throttle; + throttle_ticks += finish.throttle(); } } } } else { MachineJobStatus status = onWorkTick(new WorkTickContext(current_job, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ONE)); - if (!status.valid) { - throttle_ticks += status.throttle; + if (!status.valid()) { + throttle_ticks += status.throttle(); return; } @@ -272,26 +197,26 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery error_ticks_anim = 0; work_ticks += 1d; - if (work_ticks >= current_job.ticks_processing_time) { + if (work_ticks >= current_job.ticks_processing_time()) { MachineJobStatus finish = onJobFinish(current_job); - if (finish.valid) { + if (finish.valid()) { current_job = null; work_ticks = 0d; } else { - throttle_ticks += finish.throttle; + throttle_ticks += finish.throttle(); } } } } else { MachineJobStatus finish = onJobFinish(current_job); - if (finish.valid) { + if (finish.valid()) { current_job = null; work_ticks = 0d; error_ticks_anim = 0; } else { - throttle_ticks += finish.throttle; + throttle_ticks += finish.throttle(); error_ticks_anim++; } } @@ -309,7 +234,7 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery if (current_job == null) return 0d; - return Math.min(1d, work_ticks / current_job.ticks_processing_time); + return Math.min(1d, work_ticks / current_job.ticks_processing_time()); } /** @@ -320,7 +245,7 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery protected abstract MachineJob getNextJob(); public static void basicTicker(Level level, BlockPos blockPos, BlockState blockState, T t) { - if (t instanceof BlockEntityMatteryPoweredWorker tile) { + if (t instanceof BlockEntityMatteryWorker tile) { tile.batteryChargeLoop(); tile.workerLoop(); } 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 new file mode 100644 index 000000000..a8ad33322 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJob.java @@ -0,0 +1,57 @@ +package ru.dbotthepony.mc.otm.block.entity.worker; + +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 javax.annotation.Nullable; +import java.math.BigDecimal; + +public record MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal power_consumption_multiplier, + CompoundTag data) { + public MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal power_consumption_multiplier, CompoundTag data) { + this.stack = stack; + this.ticks_processing_time = ticks_processing_time; + this.power_consumption_multiplier = power_consumption_multiplier; + this.data = data; + } + + public MachineJob(ItemStack stack, double ticks_processing_time, BigDecimal 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, BigDecimal.ONE); + } + + public CompoundTag serializeNBT() { + CompoundTag store_job = new CompoundTag(); + + store_job.put("data", data); + store_job.put("stack", stack.serializeNBT()); + store_job.putDouble("ticks_processing_time", ticks_processing_time); + store_job.putString("power_consumption_multiplier", power_consumption_multiplier.toString()); + + return store_job; + } + + @Nullable + public static MachineJob deserializeNBT(@Nullable Tag nbt) { + if (nbt == null) + 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.get("power_consumption_multiplier") instanceof StringTag power_consumption_multiplier) { + ItemStack stack = ItemStack.of(stack_tag); + + if (!stack.isEmpty()) { + return new MachineJob(stack, ticks_processing_time.getAsDouble(), new BigDecimal(power_consumption_multiplier.getAsString()), tag.getCompound("data")); + } + } + } + + return null; + } +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJobStatus.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJobStatus.java new file mode 100644 index 000000000..14e2af1dd --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/MachineJobStatus.java @@ -0,0 +1,11 @@ +package ru.dbotthepony.mc.otm.block.entity.worker; + +public record MachineJobStatus(boolean valid, int throttle) { + public MachineJobStatus() { + this(true, 0); + } + + public MachineJobStatus(boolean finished) { + this(finished, 0); + } +} 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 new file mode 100644 index 000000000..6e102cc20 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkTickContext.java @@ -0,0 +1,8 @@ +package ru.dbotthepony.mc.otm.block.entity.worker; + +import java.math.BigDecimal; + +public record WorkTickContext(MachineJob job, BigDecimal required_power, BigDecimal extracted_power, + BigDecimal work_speed) { + +} diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkerState.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkerState.java new file mode 100644 index 000000000..375b5d0c4 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/WorkerState.java @@ -0,0 +1,17 @@ +package ru.dbotthepony.mc.otm.block.entity.worker; + +import net.minecraft.util.StringRepresentable; + +import javax.annotation.Nonnull; + +public enum WorkerState implements StringRepresentable { + IDLE, + WORKING, + ERROR; + + @Override + @Nonnull + public String getSerializedName() { + return this == IDLE ? "idle" : this == WORKING ? "working" : "error"; + } +}