Worker blockstate property

This commit is contained in:
DBotThePony 2021-08-18 16:40:05 +07:00
parent c719917035
commit d3286c30de
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 76 additions and 2 deletions

View File

@ -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<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE);
}
private static final List<VoxelShape> SHAPES;
static {

View File

@ -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<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE);
}
private static final List<VoxelShape> SHAPES;
static {

View File

@ -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<Block, BlockState> builder) {
super.createBlockStateDefinition(builder);
builder.add(BlockEntityMatteryPoweredWorker.WORKER_STATE);
}
private static final List<VoxelShape> SHAPES;
static {

View File

@ -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<WorkerState> 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() {