Fix drive viewer blockstate improperly updating

This commit is contained in:
DBotThePony 2021-09-09 14:02:49 +07:00
parent 61b87e02f0
commit 3358b5247e
Signed by: DBot
GPG Key ID: DCC23B5715498507
2 changed files with 45 additions and 29 deletions

View File

@ -7,11 +7,13 @@ import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Inventory;
import net.minecraft.world.entity.player.Player; import net.minecraft.world.entity.player.Player;
import net.minecraft.world.inventory.AbstractContainerMenu; import net.minecraft.world.inventory.AbstractContainerMenu;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import ru.dbotthepony.mc.otm.OverdriveThatMatters;
import ru.dbotthepony.mc.otm.Registry; import ru.dbotthepony.mc.otm.Registry;
import ru.dbotthepony.mc.otm.block.BlockDriveViewer; import ru.dbotthepony.mc.otm.block.BlockDriveViewer;
import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState;
@ -30,37 +32,29 @@ public class BlockEntityDriveViewer extends BlockEntityMatteryPowered {
return energy.getBatteryLevel().compareTo(MTE_PER_OPERATION) >= 0; return energy.getBatteryLevel().compareTo(MTE_PER_OPERATION) >= 0;
} }
@Override private void updateState(Level level) {
public void setChanged() { if (isRemoved())
super.setChanged(); return;
if (level != null) {
var state = getBlockState(); var state = getBlockState();
if (drive_slot.getItem(0).getCapability(MatteryCapability.DRIVE).isPresent()) {
if (!getBlockState().getValue(BlockDriveViewer.DRIVE_PRESENT)) {
state = state.setValue(BlockDriveViewer.DRIVE_PRESENT, true);
}
} else {
if (getBlockState().getValue(BlockDriveViewer.DRIVE_PRESENT)) {
state = state.setValue(BlockDriveViewer.DRIVE_PRESENT, false);
}
}
if (drive_slot.getItem(0).getCapability(MatteryCapability.DRIVE).isPresent() && canIOItems()) { if (drive_slot.getItem(0).getCapability(MatteryCapability.DRIVE).isPresent() && canIOItems()) {
if (getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.WORKING) {
state = state.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING); state = state.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING);
}
} else { } else {
if (getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.IDLE) {
state = state.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE); state = state.setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE);
} }
}
if (state != getBlockState()) { if (state != getBlockState()) {
level.setBlock(getBlockPos(), state, Block.UPDATE_CLIENTS); level.setBlock(getBlockPos(), state, Block.UPDATE_CLIENTS);
} }
} }
@Override
public void setChanged() {
super.setChanged();
if (level != null)
OverdriveThatMatters.tickOnce(level, this::updateState);
} }
public int getIOItemCount(int desired, boolean simulate) { public int getIOItemCount(int desired, boolean simulate) {
@ -85,7 +79,29 @@ public class BlockEntityDriveViewer extends BlockEntityMatteryPowered {
private static final TranslatableComponent NAME = new TranslatableComponent("block.overdrive_that_matters.drive_viewer"); private static final TranslatableComponent NAME = new TranslatableComponent("block.overdrive_that_matters.drive_viewer");
public final MatteryContainer drive_slot = new MatteryContainer(this::setChanged, 1); public final MatteryContainer drive_slot = new MatteryContainer(this::setChanged, 1) {
@Override
public void setChanged(int slot, ItemStack new_state, ItemStack old_state) {
super.setChanged(slot, new_state, old_state);
if (level != null)
OverdriveThatMatters.tickOnce(level, (level) -> {
if (!isRemoved()) {
var state = getBlockState();
if (new_state.getCapability(MatteryCapability.DRIVE).isPresent()) {
state = state.setValue(BlockDriveViewer.DRIVE_PRESENT, true);
} else {
state = state.setValue(BlockDriveViewer.DRIVE_PRESENT, false);
}
if (state != getBlockState()) {
level.setBlock(getBlockPos(), state, Block.UPDATE_CLIENTS);
}
}
});
}
};
@Override @Override
protected Component getDefaultDisplayName() { protected Component getDefaultDisplayName() {

View File

@ -284,7 +284,7 @@ public class MatteryContainer implements Container, Iterable<ItemStack> {
@Override @Override
public ItemStack getItem(int slot) { public ItemStack getItem(int slot) {
return slots[slot]; return slots[slot].isEmpty() ? ItemStack.EMPTY : slots[slot];
} }
@Override @Override