From 387111ee640a7d2a41d6fb61cded64736ed15ac9 Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Tue, 31 Aug 2021 19:42:05 +0700 Subject: [PATCH] Drive viewer working state and power consumption --- shapenator.js | 30 ++++++- .../mc/otm/block/BlockDriveViewer.java | 20 +++++ .../mc/otm/block/BlockMatterBottler.java | 4 +- .../mc/otm/block/BlockMatterDecomposer.java | 4 +- .../mc/otm/block/BlockMatterReplicator.java | 3 +- .../mc/otm/block/BlockMatterScanner.java | 3 +- .../block/entity/BlockEntityDriveViewer.java | 49 +++++++++++ .../entity/BlockEntityMatterBottler.java | 17 ++-- .../worker/BlockEntityMatteryWorker.java | 19 ++--- .../otm/block/entity/worker/WorkerState.java | 4 + .../mc/otm/menu/DriveViewerMenu.java | 85 ++++++++++++++++--- 11 files changed, 198 insertions(+), 40 deletions(-) diff --git a/shapenator.js b/shapenator.js index a2d3b0fff..b4f80356c 100644 --- a/shapenator.js +++ b/shapenator.js @@ -253,10 +253,12 @@ const facings = [ fs.writeFileSync(_root + 'blockstates/pattern_storage.json', JSON.stringify(blockstate, null, '\t')) } -// Matter scanner +// Машины с WorkerState { - const to_generate = ['matter_scanner', 'matter_replicator', 'matter_decomposer', 'matter_bottler'] + const to_generate = ['matter_scanner', 'matter_replicator', 'matter_decomposer'] + const to_generate_semi = ['matter_bottler', 'drive_viewer'] const states = ['idle', 'working', 'error'] + const states_semi = ['idle', 'working'] for (const machine of to_generate) { const blockstate = { @@ -281,6 +283,30 @@ const facings = [ fs.writeFileSync(_root + 'blockstates/' + machine + '.json', JSON.stringify(blockstate, null, '\t')) } + + for (const machine of to_generate_semi) { + const blockstate = { + multipart: [] + } + + for (const face of facings) { + for (const state of states) { + blockstate.multipart.push({ + when: { + facing: face.facing, + worker: states_semi + }, + + apply: { + model: 'overdrive_that_matters:block/' + machine + '_' + state, + y: face.y ? face.y : undefined + } + }); + } + } + + fs.writeFileSync(_root + 'blockstates/' + machine + '.json', JSON.stringify(blockstate, null, '\t')) + } } // просто дропы блоков diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/BlockDriveViewer.java b/src/main/java/ru/dbotthepony/mc/otm/block/BlockDriveViewer.java index 81f0ecb9d..e8fbf6596 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockDriveViewer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockDriveViewer.java @@ -1,17 +1,37 @@ package ru.dbotthepony.mc.otm.block; import net.minecraft.core.BlockPos; +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 ru.dbotthepony.mc.otm.Registry; import ru.dbotthepony.mc.otm.block.entity.BlockEntityDriveViewer; import javax.annotation.Nullable; +import static ru.dbotthepony.mc.otm.block.entity.worker.WorkerState.SEMI_WORKER_STATE; + public class BlockDriveViewer extends BlockMatteryRotatable implements EntityBlock { @Nullable @Override public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) { return new BlockEntityDriveViewer(blockPos, blockState); } + + @Nullable + @Override + public BlockEntityTicker getTicker(Level p_153212_, BlockState p_153213_, BlockEntityType p_153214_) { + return p_153212_.isClientSide || p_153214_ != Registry.BlockEntities.DRIVE_VIEWER ? null : BlockEntityDriveViewer::ticker; + } + + @Override + protected void createBlockStateDefinition(StateDefinition.Builder builder) { + super.createBlockStateDefinition(builder); + builder.add(SEMI_WORKER_STATE); + } } 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 8d9b03d36..e66336e4c 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.worker.BlockEntityMatteryWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; 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(BlockEntityMatteryWorker.WORKER_STATE); + builder.add(WorkerState.SEMI_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 ca598fea7..7d8104b99 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.worker.BlockEntityMatteryWorker; +import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; 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(BlockEntityMatteryWorker.WORKER_STATE); + builder.add(WorkerState.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 f1d66e9b8..1881ffbfd 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterReplicator.java @@ -16,6 +16,7 @@ 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 javax.annotation.Nullable; @@ -37,7 +38,7 @@ public class BlockMatterReplicator extends BlockMatteryRotatable implements Enti @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryWorker.WORKER_STATE); + builder.add(WorkerState.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 66d92279a..ee8eb28ae 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/BlockMatterScanner.java @@ -16,6 +16,7 @@ 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 javax.annotation.Nullable; @@ -37,7 +38,7 @@ public class BlockMatterScanner extends BlockMatteryRotatable implements EntityB @Override protected void createBlockStateDefinition(StateDefinition.Builder builder) { super.createBlockStateDefinition(builder); - builder.add(BlockEntityMatteryWorker.WORKER_STATE); + builder.add(WorkerState.WORKER_STATE); } private static final List SHAPES; diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityDriveViewer.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityDriveViewer.java index c5dd66709..45fbd3c31 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityDriveViewer.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/BlockEntityDriveViewer.java @@ -7,9 +7,14 @@ 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.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.Registry; +import ru.dbotthepony.mc.otm.block.entity.worker.WorkerState; +import ru.dbotthepony.mc.otm.capability.MatteryCapability; import ru.dbotthepony.mc.otm.capability.MatteryMachineEnergyStorage; import ru.dbotthepony.mc.otm.container.MatteryContainer; import ru.dbotthepony.mc.otm.menu.DriveViewerMenu; @@ -18,6 +23,44 @@ import javax.annotation.Nullable; import java.math.BigDecimal; public class BlockEntityDriveViewer extends BlockEntityMatteryPowered { + public static final BigDecimal MTE_PER_OPERATION = new BigDecimal("3.125"); + + public boolean canIOItems() { + return energy.getBatteryLevel().compareTo(MTE_PER_OPERATION) >= 0; + } + + @Override + public void setChanged() { + super.setChanged(); + + if (level != null) { + if (drive_slot.getItem(0).getCapability(MatteryCapability.DRIVE).isPresent() && canIOItems()) { + if (getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); + } + } else { + if (getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(getBlockPos(), getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + } + } + } + } + + public int getIOItemCount(int desired, boolean simulate) { + if (!canIOItems()) + return 0; + + var extracted = energy.extractEnergyInner(MTE_PER_OPERATION.multiply(new BigDecimal(desired)), true); + var modulo = extracted.divideToIntegralValue(MTE_PER_OPERATION); + + if (simulate) + return modulo.intValue(); + + energy.extractEnergyInner(modulo.multiply(MTE_PER_OPERATION), false); + + return modulo.intValue(); + } + public BlockEntityDriveViewer(BlockPos p_155229_, BlockState p_155230_) { super(Registry.BlockEntities.DRIVE_VIEWER, p_155229_, p_155230_); energy = new MatteryMachineEnergyStorage(this, MatteryMachineEnergyStorage.MachineType.WORKER, new BigDecimal(30_000)); @@ -49,4 +92,10 @@ public class BlockEntityDriveViewer extends BlockEntityMatteryPowered { super.load(nbt); drive_slot.deserializeNBT(nbt.get("drive_slot")); } + + public static void ticker(Level level, BlockPos blockPos, BlockState blockState, T t) { + if (t instanceof BlockEntityDriveViewer tile) { + tile.batteryChargeLoop(); + } + } } 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 191f2c70d..7cedffbf7 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 @@ -18,7 +18,6 @@ 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.WorkerState; import ru.dbotthepony.mc.otm.capability.*; import ru.dbotthepony.mc.otm.container.MatteryContainer; @@ -255,8 +254,8 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen if (tile.work_flow) { if (capability != null) { - 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.getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); } if (tile.matter.getStoredMatter().compareTo(MATTER_EXCHANGE_RATE) < 0) { @@ -298,14 +297,14 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen } } } else { - if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.IDLE) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); } } } else { if (capability != null) { - 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.getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.WORKING) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); } var energy = tile.energy.extractEnergyInner(ENERGY_CONSUMPTION, true); @@ -330,8 +329,8 @@ public class BlockEntityMatterBottler extends BlockEntityMatteryPowered implemen } } } else { - if (tile.getBlockState().getValue(BlockEntityMatteryWorker.WORKER_STATE) != WorkerState.IDLE) { - level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(BlockEntityMatteryWorker.WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); + if (tile.getBlockState().getValue(WorkerState.SEMI_WORKER_STATE) != WorkerState.IDLE) { + level.setBlock(tile.getBlockPos(), tile.getBlockState().setValue(WorkerState.SEMI_WORKER_STATE, WorkerState.IDLE), Block.UPDATE_CLIENTS); } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java index 9a5241126..20c7b45be 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java +++ b/src/main/java/ru/dbotthepony/mc/otm/block/entity/worker/BlockEntityMatteryWorker.java @@ -8,7 +8,6 @@ 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; @@ -91,15 +90,13 @@ abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered return new MachineJobStatus(); } - public static final EnumProperty WORKER_STATE = EnumProperty.create("worker", WorkerState.class); - private int idle_ticks_anim = 0; private int working_ticks_anim = 0; private int error_ticks_anim = 0; protected void workerLoop() { - if (level != null && error_ticks_anim > 20 && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.ERROR) { - level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.ERROR), Block.UPDATE_CLIENTS); + 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); } if (throttle_ticks > 0) { @@ -117,8 +114,8 @@ abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered error_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); + 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); } return; @@ -139,8 +136,8 @@ abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered 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); + 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); } return; @@ -221,8 +218,8 @@ abstract public class BlockEntityMatteryWorker extends BlockEntityMatteryPowered } } - if (level != null && (working_ticks_anim > 20 && error_ticks_anim == 0) && getBlockState().hasProperty(WORKER_STATE) && getBlockState().getValue(WORKER_STATE) != WorkerState.WORKING) { - level.setBlock(getBlockPos(), getBlockState().setValue(WORKER_STATE, WorkerState.WORKING), Block.UPDATE_CLIENTS); + 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); } } 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 index 375b5d0c4..8dba90549 100644 --- 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 @@ -1,6 +1,7 @@ package ru.dbotthepony.mc.otm.block.entity.worker; import net.minecraft.util.StringRepresentable; +import net.minecraft.world.level.block.state.properties.EnumProperty; import javax.annotation.Nonnull; @@ -9,6 +10,9 @@ public enum WorkerState implements StringRepresentable { WORKING, ERROR; + public static final EnumProperty WORKER_STATE = EnumProperty.create("worker", WorkerState.class); + public static final EnumProperty SEMI_WORKER_STATE = EnumProperty.create("worker", WorkerState.class, IDLE, WORKING); + @Override @Nonnull public String getSerializedName() { diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java index 38812a8f2..291e80ee5 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java @@ -230,22 +230,47 @@ public class DriveViewerMenu extends PoweredMatteryMenu { if (item.isEmpty() || item.getCapability(MatteryCapability.DRIVE).isPresent() || item.getCapability(CapabilityEnergy.ENERGY).isPresent()) return super.quickMoveStack(ply, slot_index); - if (last_drive == null) + if (last_drive == null || tile == null) return ItemStack.EMPTY; - var remaining = last_drive.insertItem(item, false); + var tile = (BlockEntityDriveViewer) this.tile; + int amount = tile.getIOItemCount(item.getCount(), true); - if (remaining.getCount() == item.getCount()) + if (amount == 0) return ItemStack.EMPTY; - if (remaining.isEmpty()) { + if (amount == item.getCount()) { + var remaining = last_drive.insertItem(item, false); + + if (remaining.getCount() == item.getCount()) + return ItemStack.EMPTY; + + if (remaining.isEmpty()) { + var copy = item.copy(); + slot.set(ItemStack.EMPTY); + tile.getIOItemCount(item.getCount(), false); + return copy; + } + var copy = item.copy(); - slot.set(ItemStack.EMPTY); + tile.getIOItemCount(item.getCount() - remaining.getCount(), false); + item.shrink(remaining.getCount()); + slot.setChanged(); + return copy; } + var copy_insert = item.copy(); + copy_insert.setCount(amount); + + var remaining = last_drive.insertItem(copy_insert, false); + + if (remaining.getCount() == copy_insert.getCount()) + return ItemStack.EMPTY; + var copy = item.copy(); - item.setCount(item.getCount() - remaining.getCount()); + tile.getIOItemCount(amount - remaining.getCount(), false); + item.shrink(amount - remaining.getCount()); slot.setChanged(); return copy; @@ -284,20 +309,27 @@ public class DriveViewerMenu extends PoweredMatteryMenu { if (menu.last_drive == null) return; + var tile = (BlockEntityDriveViewer) menu.tile; + if (click == ClickType.QUICK_MOVE && stack_id > -1) { + if (!tile.canIOItems()) + return; + var get_state = view.state.get(stack_id); if (get_state == null) { return; } - var extracted = menu.last_drive.extractItem(get_state.id_upstream, action == ClickAction.PRIMARY ? get_state.stack.getMaxStackSize() : Math.max(1, get_state.stack.getMaxStackSize() / 2), true); + int amount = tile.getIOItemCount(action == ClickAction.PRIMARY ? get_state.stack.getMaxStackSize() : Math.max(1, get_state.stack.getMaxStackSize() / 2), true); + var extracted = menu.last_drive.extractItem(get_state.id_upstream, amount, true); if (!extracted.isEmpty()) { var move = menu.quickMoveToInventory(extracted, false); if (move.remaining().getCount() != extracted.getCount()) { menu.last_drive.extractItem(get_state.id_upstream, extracted.getCount() - move.remaining().getCount(), false); + tile.getIOItemCount(extracted.getCount() - move.remaining().getCount(), false); } } @@ -323,18 +355,42 @@ public class DriveViewerMenu extends PoweredMatteryMenu { return; } + if (!tile.canIOItems()) + return; + if (!menu.getCarried().isEmpty() && click != ClickType.QUICK_MOVE) { // try to put if (action == ClickAction.PRIMARY) { - menu.setCarried(menu.last_drive.insertItem(menu.getCarried(), false)); - MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); - menu.setRemoteCarried(menu.getCarried().copy()); + var carried = menu.getCarried(); + int amount = tile.getIOItemCount(carried.getCount(), true); + + if (amount == carried.getCount()) { + var leftover = menu.last_drive.insertItem(menu.getCarried(), false); + menu.setCarried(leftover); + tile.getIOItemCount(amount - leftover.getCount(), false); + + MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); + menu.setRemoteCarried(menu.getCarried().copy()); + } else if (amount != 0) { + var copy = carried.copy(); + copy.setCount(amount); + + var leftover = menu.last_drive.insertItem(copy, false); + tile.getIOItemCount(amount - leftover.getCount(), false); + + leftover.setCount(carried.getCount() - amount + leftover.getCount()); + menu.setCarried(leftover); + + MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); + menu.setRemoteCarried(menu.getCarried().copy()); + } } else { var copy = menu.getCarried().copy(); copy.setCount(1); - if (menu.last_drive.insertItem(copy, false).isEmpty()) { + if (tile.getIOItemCount(1, true) == 1 && menu.last_drive.insertItem(copy, false).isEmpty()) { menu.getCarried().shrink(1); + tile.getIOItemCount(1, false); MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); menu.setRemoteCarried(menu.getCarried().copy()); } @@ -346,7 +402,12 @@ public class DriveViewerMenu extends PoweredMatteryMenu { return; } - menu.setCarried(menu.last_drive.extractItem(get_state.id_upstream, action == ClickAction.PRIMARY ? get_state.stack.getMaxStackSize() : Math.max(1, get_state.stack.getMaxStackSize() / 2), false)); + int amount = tile.getIOItemCount(action == ClickAction.PRIMARY ? get_state.stack.getMaxStackSize() : Math.max(1, get_state.stack.getMaxStackSize() / 2), true); + + var extracted = menu.last_drive.extractItem(get_state.id_upstream, amount, false); + + tile.getIOItemCount(extracted.getCount(), false); + menu.setCarried(extracted); MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); menu.setRemoteCarried(menu.getCarried().copy()); }