From b0e9a96e503bae99583df2cce8e2b5980024d5da Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Sat, 28 Aug 2021 14:47:01 +0700 Subject: [PATCH] Reasonable interaction with drive viewer --- .../mc/otm/capability/drive/MatteryDrive.java | 8 + .../mc/otm/menu/DriveViewerMenu.java | 441 ++++++++++-------- .../dbotthepony/mc/otm/menu/MatteryMenu.java | 126 ++++- .../mc/otm/network/MatteryNetworking.java | 40 +- .../mc/otm/screen/DriveViewerScreen.java | 13 +- .../overdrive_that_matters/lang/en_us.json | 1 + 6 files changed, 413 insertions(+), 216 deletions(-) diff --git a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java index 06d1814e7..cc51667cb 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java +++ b/src/main/java/ru/dbotthepony/mc/otm/capability/drive/MatteryDrive.java @@ -184,6 +184,8 @@ public class MatteryDrive implements IMatteryDrive { if (!simulate) { different_stacks++; + stored += max_insert; + var copy = item.copy(); copy.setCount(max_insert); var state = new StoredStack(copy, UUID.randomUUID()); @@ -225,12 +227,18 @@ public class MatteryDrive implements IMatteryDrive { if (extract == get.stack().getCount()) { var listing = items.get(get.stack().getItem()); listing.remove(get); + different_stacks--; for (var listener : listeners) { listener.removeViewItem(get.id()); } + + if (listing.size() == 0) { + items.remove(get.stack().getItem()); + } } + stored -= extract; get.stack().shrink(extract); if (get.stack().getCount() != 0) { 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 bfdc4a6fb..cf0d6e162 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/DriveViewerMenu.java @@ -6,8 +6,11 @@ import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.SimpleContainer; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.ClickType; import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; +import net.minecraftforge.energy.CapabilityEnergy; import net.minecraftforge.fmllegacy.network.NetworkEvent; import net.minecraftforge.fmllegacy.network.PacketDistributor; import ru.dbotthepony.mc.otm.Registry; @@ -125,193 +128,6 @@ public class DriveViewerMenu extends PoweredMatteryMenu { } } - public record ClearPacket(int id) { - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(id); - } - - public static ClearPacket read(FriendlyByteBuf buffer) { - return new ClearPacket(buffer.readInt()); - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> { - var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; - - if (get == null) { - throw new IllegalStateException("No such item tracker with id " + id); - } - - get.clear(); - }); - } - } - - public record StackAddPacket(int id, int stack_id, ItemStack stack) { - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(id); - buffer.writeInt(stack_id); - buffer.writeRegistryId(stack.getItem()); - buffer.writeInt(stack.getCount()); - buffer.writeBoolean(stack.getTag() != null); - - if (stack.getTag() != null) - buffer.writeNbt(stack.getShareTag()); - } - - public static StackAddPacket read(FriendlyByteBuf buffer) { - var id = buffer.readInt(); - var stack = buffer.readInt(); - var item = buffer.readRegistryIdSafe(Item.class); - var count = buffer.readInt(); - - var state = new ItemStack(item, count); - - if (buffer.readBoolean()) - state.readShareTag(buffer.readNbt()); - - return new StackAddPacket(id, stack, state); - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> { - var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; - - if (get == null) { - throw new IllegalStateException("No such item tracker with id " + id); - } - - if (get.state.containsKey(stack_id)) { - throw new IllegalStateException("Item tracker " + id + " already has stack with id of " + stack_id); - } - - get.state.put(stack_id, new NetworkedItem(stack_id, stack)); - get.clearCache(); - }); - } - } - - public record StackChangePacket(int id, int stack_id, int new_count) { - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(id); - buffer.writeInt(stack_id); - buffer.writeInt(new_count); - } - - public static StackChangePacket read(FriendlyByteBuf buffer) { - var id = buffer.readInt(); - var stack_id = buffer.readInt(); - var new_count = buffer.readInt(); - - return new StackChangePacket(id, stack_id, new_count); - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> { - var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; - - if (get == null) { - throw new IllegalStateException("No such item tracker with id " + id); - } - - var get_state = get.state.get(stack_id); - - if (get_state == null) { - throw new IllegalStateException("Item tracker " + id + " has no stack with id of " + stack_id); - } - - get_state.stack.setCount(new_count); - get.clearCache(); - }); - } - } - - public record StackRemovePacket(int id, int stack_id) { - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(id); - buffer.writeInt(stack_id); - } - - public static StackRemovePacket read(FriendlyByteBuf buffer) { - var id = buffer.readInt(); - var stack_id = buffer.readInt(); - - return new StackRemovePacket(id, stack_id); - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> { - var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; - - if (get == null) { - throw new IllegalStateException("No such item tracker with id " + id); - } - - var get_state = get.state.remove(stack_id); - - if (get_state == null) { - throw new IllegalStateException("Item tracker " + id + " has no stack with id of " + stack_id); - } - - get.clearCache(); - }); - } - } - - public record InteractPacket(int id, int stack_id) { - public void write(FriendlyByteBuf buffer) { - buffer.writeInt(id); - buffer.writeInt(stack_id); - } - - public static InteractPacket read(FriendlyByteBuf buffer) { - var id = buffer.readInt(); - var stack = buffer.readInt(); - return new InteractPacket(id, stack); - } - - public void play(Supplier context) { - context.get().setPacketHandled(true); - context.get().enqueueWork(() -> { - var ply = context.get().getSender(); - - if (ply.containerMenu instanceof DriveViewerMenu menu) { - var get = menu.containerId == id ? menu.view : null; - - if (get == null) { - return; - } - - ply.resetLastActionTime(); - - if (menu.last_drive == null) - return; - - if (!menu.getCarried().isEmpty()) { - // try to put - menu.setCarried(menu.last_drive.insertItem(menu.getCarried(), false)); - MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); - menu.setRemoteCarried(menu.getCarried().copy()); - } else if (stack_id > -1) { - var get_state = get.state.get(stack_id); - - if (get_state == null) { - return; - } - - menu.setCarried(menu.last_drive.extractItem(get_state.id_upstream, 64, false)); - MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); - menu.setRemoteCarried(menu.getCarried().copy()); - } - } - }); - } - } - protected int next_stack_id = 0; protected final HashMap state = new HashMap<>(); @@ -404,4 +220,255 @@ public class DriveViewerMenu extends PoweredMatteryMenu { backlog.clear(); } } + + @Override + public ItemStack quickMoveStack(Player ply, int slot_index) { + var slot = slots.get(slot_index); + var item = slot.getItem(); + + if (item.isEmpty() || item.getCapability(MatteryCapability.DRIVE).isPresent() || item.getCapability(CapabilityEnergy.ENERGY).isPresent()) + return super.quickMoveStack(ply, slot_index); + + if (last_drive == null) + return ItemStack.EMPTY; + + 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); + return copy; + } + + var copy = item.copy(); + item.setCount(item.getCount() - remaining.getCount()); + slot.setChanged(); + + return copy; + } + + public record InteractPacket(int id, int stack_id, ClickType click, ClickAction action) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(id); + buffer.writeInt(stack_id); + buffer.writeEnum(click); + buffer.writeEnum(action); + } + + public static InteractPacket read(FriendlyByteBuf buffer) { + var id = buffer.readInt(); + var stack = buffer.readInt(); + var click = buffer.readEnum(ClickType.class); + var action = buffer.readEnum(ClickAction.class); + return new InteractPacket(id, stack, click, action); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var ply = context.get().getSender(); + + if (ply.containerMenu instanceof DriveViewerMenu menu) { + var view = menu.containerId == id ? menu.view : null; + + if (view == null) { + return; + } + + ply.resetLastActionTime(); + + if (menu.last_drive == null) + return; + + if (click == ClickType.QUICK_MOVE && stack_id > -1) { + 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); + + 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); + } + } + + 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()); + } else { + var copy = menu.getCarried().copy(); + copy.setCount(1); + + if (menu.last_drive.insertItem(copy, false).isEmpty()) { + menu.getCarried().shrink(1); + MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); + menu.setRemoteCarried(menu.getCarried().copy()); + } + } + } else if (stack_id > -1) { + var get_state = view.state.get(stack_id); + + if (get_state == null) { + 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)); + MatteryNetworking.send(ply, new SetCarriedPacket(menu.getCarried())); + menu.setRemoteCarried(menu.getCarried().copy()); + } + } + }); + } + } + + public record ClearPacket(int id) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(id); + } + + public static ClearPacket read(FriendlyByteBuf buffer) { + return new ClearPacket(buffer.readInt()); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; + + if (get == null) { + throw new IllegalStateException("No such item tracker with id " + id); + } + + get.clear(); + }); + } + } + + public record StackAddPacket(int id, int stack_id, ItemStack stack) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(id); + buffer.writeInt(stack_id); + buffer.writeRegistryId(stack.getItem()); + buffer.writeInt(stack.getCount()); + buffer.writeBoolean(stack.getTag() != null); + + if (stack.getTag() != null) + buffer.writeNbt(stack.getShareTag()); + } + + public static StackAddPacket read(FriendlyByteBuf buffer) { + var id = buffer.readInt(); + var stack = buffer.readInt(); + var item = buffer.readRegistryIdSafe(Item.class); + var count = buffer.readInt(); + + var state = new ItemStack(item, count); + + if (buffer.readBoolean()) + state.readShareTag(buffer.readNbt()); + + return new StackAddPacket(id, stack, state); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; + + if (get == null) { + throw new IllegalStateException("No such item tracker with id " + id); + } + + if (get.state.containsKey(stack_id)) { + throw new IllegalStateException("Item tracker " + id + " already has stack with id of " + stack_id); + } + + get.state.put(stack_id, new NetworkedItemView.NetworkedItem(stack_id, stack)); + get.clearCache(); + }); + } + } + + public record StackChangePacket(int id, int stack_id, int new_count) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(id); + buffer.writeInt(stack_id); + buffer.writeInt(new_count); + } + + public static StackChangePacket read(FriendlyByteBuf buffer) { + var id = buffer.readInt(); + var stack_id = buffer.readInt(); + var new_count = buffer.readInt(); + + return new StackChangePacket(id, stack_id, new_count); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; + + if (get == null) { + throw new IllegalStateException("No such item tracker with id " + id); + } + + var get_state = get.state.get(stack_id); + + if (get_state == null) { + throw new IllegalStateException("Item tracker " + id + " has no stack with id of " + stack_id); + } + + get_state.stack.setCount(new_count); + get.clearCache(); + }); + } + } + + public record StackRemovePacket(int id, int stack_id) { + public void write(FriendlyByteBuf buffer) { + buffer.writeInt(id); + buffer.writeInt(stack_id); + } + + public static StackRemovePacket read(FriendlyByteBuf buffer) { + var id = buffer.readInt(); + var stack_id = buffer.readInt(); + + return new StackRemovePacket(id, stack_id); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var get = Minecraft.getInstance().player.containerMenu instanceof DriveViewerMenu menu && menu.containerId == id ? menu.view : null; + + if (get == null) { + throw new IllegalStateException("No such item tracker with id " + id); + } + + var get_state = get.state.remove(stack_id); + + if (get_state == null) { + throw new IllegalStateException("Item tracker " + id + " has no stack with id of " + stack_id); + } + + get.clearCache(); + }); + } + } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/MatteryMenu.java b/src/main/java/ru/dbotthepony/mc/otm/menu/MatteryMenu.java index c95cf3fb1..9bdbb7ca0 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/MatteryMenu.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/MatteryMenu.java @@ -3,17 +3,18 @@ package ru.dbotthepony.mc.otm.menu; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.player.Inventory; import net.minecraft.world.entity.player.Player; -import net.minecraft.world.inventory.AbstractContainerMenu; -import net.minecraft.world.inventory.ContainerData; -import net.minecraft.world.inventory.MenuType; -import net.minecraft.world.inventory.Slot; +import net.minecraft.world.inventory.*; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.block.entity.BlockEntity; import ru.dbotthepony.mc.otm.menu.slot.MatterySlot; import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget; +import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; import java.util.function.Consumer; public abstract class MatteryMenu extends AbstractContainerMenu { @@ -26,6 +27,15 @@ public abstract class MatteryMenu extends AbstractContainerMenu { public final ArrayList inventory_slots = new ArrayList<>(); public final ArrayList main_slots = new ArrayList<>(); + @Nullable + protected ContainerSynchronizer synchronizer; + + @Override + public void setSynchronizer(ContainerSynchronizer p_150417_) { + synchronizer = p_150417_; + super.setSynchronizer(p_150417_); + } + protected MatteryMenu(@Nullable MenuType p_38851_, int p_38852_, Inventory inventory) { super(p_38851_, p_38852_); this.inventory = inventory; @@ -186,4 +196,112 @@ public abstract class MatteryMenu extends AbstractContainerMenu { notifySlotsUnwatchCurrentStack(); return moved; } + + public MoveResult quickMoveToInventory(ItemStack stack, boolean simulate) { + if (inventory_slot_index_start == 0 && inventory_slot_index_end == 0) { + return new MoveResult(false, stack, Set.of()); + } + + return customMoveItemStackTo(stack, inventory_slot_index_start, inventory_slot_index_end + 1, false, simulate); + } + + @Override + protected boolean moveItemStackTo(ItemStack stack_to_move, int initial_slot, int final_slot, boolean reverse_direction) { + return customMoveItemStackTo(stack_to_move, initial_slot, final_slot, reverse_direction, false).merge_occured; + } + + public record MoveResult(boolean merge_occured, ItemStack remaining, Set changed_slots) { + + } + + @Nonnull + protected MoveResult customMoveItemStackTo(@Nonnull ItemStack stack_to_move, int initial_slot, int final_slot, boolean reverse_direction, boolean simulate) { + boolean merge_occured = false; + + int i = reverse_direction ? final_slot - 1 : initial_slot; + var changed = new HashSet(); + + stack_to_move = stack_to_move.copy(); + + if (stack_to_move.isStackable()) { + while (!stack_to_move.isEmpty()) { + if (reverse_direction) { + if (i < initial_slot) { + break; + } + } else if (i >= final_slot) { + break; + } + + var slot = this.slots.get(i); + var slot_stack = slot.getItem(); + + if (!slot_stack.isEmpty() && ItemStack.isSameItemSameTags(stack_to_move, slot_stack)) { + int j = slot_stack.getCount() + stack_to_move.getCount(); + int maxSize = slot.getMaxStackSize(stack_to_move); + + if (j <= maxSize) { + stack_to_move.setCount(0); + + if (!simulate) { + slot_stack.setCount(j); + slot.setChanged(); + } + + merge_occured = true; + changed.add(slot); + } else if (slot_stack.getCount() < maxSize) { + stack_to_move.shrink(maxSize - slot_stack.getCount()); + + if (!simulate) { + slot_stack.setCount(maxSize); + slot.setChanged(); + } + + merge_occured = true; + changed.add(slot); + } + } + + i += reverse_direction ? -1 : 1; + } + } + + if (!stack_to_move.isEmpty()) { + i = reverse_direction ? final_slot - 1 : initial_slot; + + while (true) { + if (reverse_direction) { + if (i < initial_slot) { + break; + } + } else if (i >= final_slot) { + break; + } + + var slot = this.slots.get(i); + var slot_stack = slot.getItem(); + + if (slot_stack.isEmpty() && slot.mayPlace(stack_to_move)) { + if (!simulate) { + if (stack_to_move.getCount() > slot.getMaxStackSize()) { + slot.set(stack_to_move.split(slot.getMaxStackSize())); + } else { + slot.set(stack_to_move.split(stack_to_move.getCount())); + } + + slot.setChanged(); + } + + merge_occured = true; + changed.add(slot); + break; + } + + i += reverse_direction ? -1 : 1; + } + } + + return new MoveResult(merge_occured, stack_to_move, changed); + } } diff --git a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java index 38c5fcc7b..f06a8567d 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java +++ b/src/main/java/ru/dbotthepony/mc/otm/network/MatteryNetworking.java @@ -149,46 +149,46 @@ public class MatteryNetworking { CHANNEL.registerMessage( next_network_id++, - DriveViewerMenu.NetworkedItemView.ClearPacket.class, - DriveViewerMenu.NetworkedItemView.ClearPacket::write, - DriveViewerMenu.NetworkedItemView.ClearPacket::read, - DriveViewerMenu.NetworkedItemView.ClearPacket::play, + DriveViewerMenu.ClearPacket.class, + DriveViewerMenu.ClearPacket::write, + DriveViewerMenu.ClearPacket::read, + DriveViewerMenu.ClearPacket::play, Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); CHANNEL.registerMessage( next_network_id++, - DriveViewerMenu.NetworkedItemView.StackAddPacket.class, - DriveViewerMenu.NetworkedItemView.StackAddPacket::write, - DriveViewerMenu.NetworkedItemView.StackAddPacket::read, - DriveViewerMenu.NetworkedItemView.StackAddPacket::play, + DriveViewerMenu.StackAddPacket.class, + DriveViewerMenu.StackAddPacket::write, + DriveViewerMenu.StackAddPacket::read, + DriveViewerMenu.StackAddPacket::play, Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); CHANNEL.registerMessage( next_network_id++, - DriveViewerMenu.NetworkedItemView.StackChangePacket.class, - DriveViewerMenu.NetworkedItemView.StackChangePacket::write, - DriveViewerMenu.NetworkedItemView.StackChangePacket::read, - DriveViewerMenu.NetworkedItemView.StackChangePacket::play, + DriveViewerMenu.StackChangePacket.class, + DriveViewerMenu.StackChangePacket::write, + DriveViewerMenu.StackChangePacket::read, + DriveViewerMenu.StackChangePacket::play, Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); CHANNEL.registerMessage( next_network_id++, - DriveViewerMenu.NetworkedItemView.StackRemovePacket.class, - DriveViewerMenu.NetworkedItemView.StackRemovePacket::write, - DriveViewerMenu.NetworkedItemView.StackRemovePacket::read, - DriveViewerMenu.NetworkedItemView.StackRemovePacket::play, + DriveViewerMenu.StackRemovePacket.class, + DriveViewerMenu.StackRemovePacket::write, + DriveViewerMenu.StackRemovePacket::read, + DriveViewerMenu.StackRemovePacket::play, Optional.of(NetworkDirection.PLAY_TO_CLIENT) ); CHANNEL.registerMessage( next_network_id++, - DriveViewerMenu.NetworkedItemView.InteractPacket.class, - DriveViewerMenu.NetworkedItemView.InteractPacket::write, - DriveViewerMenu.NetworkedItemView.InteractPacket::read, - DriveViewerMenu.NetworkedItemView.InteractPacket::play, + DriveViewerMenu.InteractPacket.class, + DriveViewerMenu.InteractPacket::write, + DriveViewerMenu.InteractPacket::read, + DriveViewerMenu.InteractPacket::play, Optional.of(NetworkDirection.PLAY_TO_SERVER) ); diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java b/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java index 326ed1d80..29f0ae551 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java @@ -1,12 +1,11 @@ package ru.dbotthepony.mc.otm.screen; import net.minecraft.network.chat.Component; -import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.world.entity.player.Inventory; +import net.minecraft.world.inventory.ClickAction; +import net.minecraft.world.inventory.ClickType; import net.minecraft.world.item.ItemStack; import ru.dbotthepony.mc.otm.menu.DriveViewerMenu; -import ru.dbotthepony.mc.otm.menu.MatteryMenu; -import ru.dbotthepony.mc.otm.menu.slot.BatterySlot; import ru.dbotthepony.mc.otm.menu.slot.MatterySlot; import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget; import ru.dbotthepony.mc.otm.network.MatteryNetworking; @@ -77,10 +76,14 @@ public class DriveViewerScreen extends MatteryScreen implements } @Override - protected boolean mouseClickedInner(double mouse_x, double mouse_y, int flag) { + protected boolean mouseClickedInner(double mouse_x, double mouse_y, int mouse_click_type) { int findex = index + scroll_bar.getScroll(GRID_WIDTH); var list = menu.view.getItems(); - MatteryNetworking.send(new DriveViewerMenu.NetworkedItemView.InteractPacket(menu.containerId, findex >= list.size() ? -1 : list.get(findex).id())); + var action = mouse_click_type == 0 ? ClickAction.PRIMARY : ClickAction.SECONDARY; + + var type = hasShiftDown() ? ClickType.QUICK_MOVE : ClickType.PICKUP; + + MatteryNetworking.send(new DriveViewerMenu.InteractPacket(menu.containerId, findex >= list.size() ? -1 : list.get(findex).id(), type, action)); return true; } }; diff --git a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json index 3fc19bac8..418cf7dd1 100644 --- a/src/main/resources/assets/overdrive_that_matters/lang/en_us.json +++ b/src/main/resources/assets/overdrive_that_matters/lang/en_us.json @@ -114,6 +114,7 @@ "block.overdrive_that_matters.matter_panel": "Pattern monitor", "block.overdrive_that_matters.matter_replicator": "Matter replicator", "block.overdrive_that_matters.matter_bottler": "Matter bottler", + "block.overdrive_that_matters.drive_viewer": "Drive viewer", "otm.container.matter_panel.number_input": "Input replication task count",