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 2c0a32ec8..6b249ad31 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterDecomposer.java @@ -4,15 +4,18 @@ 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.BlockEntityMatterDecomposer; +import ru.dbotthepony.mc.otm.block.entity.BlockEntityMatteryPoweredWorker; import ru.dbotthepony.mc.otm.shapes.BlockShapes; import javax.annotation.Nullable; @@ -31,6 +34,12 @@ public class BlockMatterDecomposer extends BlockMatteryRotatable implements Enti return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_DECOMPOSER ? null : BlockEntityMatterDecomposer::tick; } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + } + private static final List SHAPES; static { 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 9609fa72f..d826ad771 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java @@ -4,11 +4,13 @@ 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; @@ -32,6 +34,12 @@ public class BlockMatterReplicator extends BlockMatteryRotatable implements Enti return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_REPLICATOR ? null : BlockEntityMatteryPoweredWorker::basicTicker; } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + } + private static final List SHAPES; static { 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 9bd0b3cc5..9a860f1df 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java @@ -4,11 +4,13 @@ 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; @@ -32,6 +34,12 @@ public class BlockMatterScanner extends BlockMatteryRotatable implements EntityB return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.MATTER_SCANNER ? null : BlockEntityMatteryPoweredWorker::basicTicker; } + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE); + } + private static final List SHAPES; static { diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java index 93732bf4c..3f8f18131 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityMatteryPoweredWorker.java @@ -5,11 +5,14 @@ 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.capability.MatteryCapability; import javax.annotation.Nonnull; @@ -151,8 +154,31 @@ 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; + private int working_ticks_anim = 0; + protected void workerLoop() { if (throttle_ticks > 0) { + if (level != null && throttle_ticks > 40 && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.ERROR) { + level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.ERROR), Block.UPDATE_CLIENTS); + } + + working_ticks_anim = 0; + idle_ticks_anim = 0; throttle_ticks--; if (throttle_ticks > 0) @@ -160,6 +186,13 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery } if (is_idling) { + working_ticks_anim = 0; + idle_ticks_anim++; + + if (level != null && idle_ticks_anim > 20 && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + } + return; } @@ -168,14 +201,24 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery if (input == null) { is_idling = true; + working_ticks_anim = 0; return; } 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) { + level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + } + return; + } + + idle_ticks_anim = 0; if (work_ticks < current_job.ticks_processing_time) { if (current_job.power_consumption_multiplier.compareTo(BigDecimal.ZERO) != 0) { @@ -191,6 +234,8 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery return; } + working_ticks_anim++; + double new_work_ticks = work_speed.doubleValue() + work_ticks; if (new_work_ticks > current_job.ticks_processing_time) { @@ -212,7 +257,6 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery } } } else { - MachineJobStatus status = onWorkTick(new WorkTickContext(current_job, BigDecimal.ZERO, BigDecimal.ZERO, BigDecimal.ONE)); if (!status.valid) { @@ -220,6 +264,7 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery return; } + working_ticks_anim++; work_ticks += 1d; if (work_ticks >= current_job.ticks_processing_time) { @@ -243,6 +288,10 @@ abstract public class BlockEntityMatteryPoweredWorker extends BlockEntityMattery throttle_ticks += finish.throttle; } } + + if (level != null && working_ticks_anim > 20 && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); + } } public double getWorkTicks() {