Reasonable interaction with drive viewer

This commit is contained in:
DBotThePony 2021-08-28 14:47:01 +07:00
parent fa72e6ec03
commit b0e9a96e50
Signed by: DBot
GPG Key ID: DCC23B5715498507
6 changed files with 413 additions and 216 deletions

View File

@ -184,6 +184,8 @@ public class MatteryDrive implements IMatteryDrive {
if (!simulate) { if (!simulate) {
different_stacks++; different_stacks++;
stored += max_insert;
var copy = item.copy(); var copy = item.copy();
copy.setCount(max_insert); copy.setCount(max_insert);
var state = new StoredStack(copy, UUID.randomUUID()); var state = new StoredStack(copy, UUID.randomUUID());
@ -225,12 +227,18 @@ public class MatteryDrive implements IMatteryDrive {
if (extract == get.stack().getCount()) { if (extract == get.stack().getCount()) {
var listing = items.get(get.stack().getItem()); var listing = items.get(get.stack().getItem());
listing.remove(get); listing.remove(get);
different_stacks--;
for (var listener : listeners) { for (var listener : listeners) {
listener.removeViewItem(get.id()); listener.removeViewItem(get.id());
} }
if (listing.size() == 0) {
items.remove(get.stack().getItem());
}
} }
stored -= extract;
get.stack().shrink(extract); get.stack().shrink(extract);
if (get.stack().getCount() != 0) { if (get.stack().getCount() != 0) {

View File

@ -6,8 +6,11 @@ import net.minecraft.server.level.ServerPlayer;
import net.minecraft.world.SimpleContainer; import net.minecraft.world.SimpleContainer;
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.ClickAction;
import net.minecraft.world.inventory.ClickType;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraftforge.energy.CapabilityEnergy;
import net.minecraftforge.fmllegacy.network.NetworkEvent; import net.minecraftforge.fmllegacy.network.NetworkEvent;
import net.minecraftforge.fmllegacy.network.PacketDistributor; import net.minecraftforge.fmllegacy.network.PacketDistributor;
import ru.dbotthepony.mc.otm.Registry; 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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 int next_stack_id = 0;
protected final HashMap<Integer, NetworkedItem> state = new HashMap<>(); protected final HashMap<Integer, NetworkedItem> state = new HashMap<>();
@ -404,4 +220,255 @@ public class DriveViewerMenu extends PoweredMatteryMenu {
backlog.clear(); 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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<NetworkEvent.Context> 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();
});
}
}
} }

View File

@ -3,17 +3,18 @@ package ru.dbotthepony.mc.otm.menu;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
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.*;
import net.minecraft.world.inventory.ContainerData;
import net.minecraft.world.inventory.MenuType;
import net.minecraft.world.inventory.Slot;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import ru.dbotthepony.mc.otm.menu.slot.MatterySlot; import ru.dbotthepony.mc.otm.menu.slot.MatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget; import ru.dbotthepony.mc.otm.menu.widget.AbstractWidget;
import javax.annotation.Nonnull;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.function.Consumer; import java.util.function.Consumer;
public abstract class MatteryMenu extends AbstractContainerMenu { public abstract class MatteryMenu extends AbstractContainerMenu {
@ -26,6 +27,15 @@ public abstract class MatteryMenu extends AbstractContainerMenu {
public final ArrayList<MatterySlot> inventory_slots = new ArrayList<>(); public final ArrayList<MatterySlot> inventory_slots = new ArrayList<>();
public final ArrayList<MatterySlot> main_slots = new ArrayList<>(); public final ArrayList<MatterySlot> 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) { protected MatteryMenu(@Nullable MenuType<?> p_38851_, int p_38852_, Inventory inventory) {
super(p_38851_, p_38852_); super(p_38851_, p_38852_);
this.inventory = inventory; this.inventory = inventory;
@ -186,4 +196,112 @@ public abstract class MatteryMenu extends AbstractContainerMenu {
notifySlotsUnwatchCurrentStack(); notifySlotsUnwatchCurrentStack();
return moved; 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<Slot> 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<Slot>();
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);
}
} }

View File

@ -149,46 +149,46 @@ public class MatteryNetworking {
CHANNEL.registerMessage( CHANNEL.registerMessage(
next_network_id++, next_network_id++,
DriveViewerMenu.NetworkedItemView.ClearPacket.class, DriveViewerMenu.ClearPacket.class,
DriveViewerMenu.NetworkedItemView.ClearPacket::write, DriveViewerMenu.ClearPacket::write,
DriveViewerMenu.NetworkedItemView.ClearPacket::read, DriveViewerMenu.ClearPacket::read,
DriveViewerMenu.NetworkedItemView.ClearPacket::play, DriveViewerMenu.ClearPacket::play,
Optional.of(NetworkDirection.PLAY_TO_CLIENT) Optional.of(NetworkDirection.PLAY_TO_CLIENT)
); );
CHANNEL.registerMessage( CHANNEL.registerMessage(
next_network_id++, next_network_id++,
DriveViewerMenu.NetworkedItemView.StackAddPacket.class, DriveViewerMenu.StackAddPacket.class,
DriveViewerMenu.NetworkedItemView.StackAddPacket::write, DriveViewerMenu.StackAddPacket::write,
DriveViewerMenu.NetworkedItemView.StackAddPacket::read, DriveViewerMenu.StackAddPacket::read,
DriveViewerMenu.NetworkedItemView.StackAddPacket::play, DriveViewerMenu.StackAddPacket::play,
Optional.of(NetworkDirection.PLAY_TO_CLIENT) Optional.of(NetworkDirection.PLAY_TO_CLIENT)
); );
CHANNEL.registerMessage( CHANNEL.registerMessage(
next_network_id++, next_network_id++,
DriveViewerMenu.NetworkedItemView.StackChangePacket.class, DriveViewerMenu.StackChangePacket.class,
DriveViewerMenu.NetworkedItemView.StackChangePacket::write, DriveViewerMenu.StackChangePacket::write,
DriveViewerMenu.NetworkedItemView.StackChangePacket::read, DriveViewerMenu.StackChangePacket::read,
DriveViewerMenu.NetworkedItemView.StackChangePacket::play, DriveViewerMenu.StackChangePacket::play,
Optional.of(NetworkDirection.PLAY_TO_CLIENT) Optional.of(NetworkDirection.PLAY_TO_CLIENT)
); );
CHANNEL.registerMessage( CHANNEL.registerMessage(
next_network_id++, next_network_id++,
DriveViewerMenu.NetworkedItemView.StackRemovePacket.class, DriveViewerMenu.StackRemovePacket.class,
DriveViewerMenu.NetworkedItemView.StackRemovePacket::write, DriveViewerMenu.StackRemovePacket::write,
DriveViewerMenu.NetworkedItemView.StackRemovePacket::read, DriveViewerMenu.StackRemovePacket::read,
DriveViewerMenu.NetworkedItemView.StackRemovePacket::play, DriveViewerMenu.StackRemovePacket::play,
Optional.of(NetworkDirection.PLAY_TO_CLIENT) Optional.of(NetworkDirection.PLAY_TO_CLIENT)
); );
CHANNEL.registerMessage( CHANNEL.registerMessage(
next_network_id++, next_network_id++,
DriveViewerMenu.NetworkedItemView.InteractPacket.class, DriveViewerMenu.InteractPacket.class,
DriveViewerMenu.NetworkedItemView.InteractPacket::write, DriveViewerMenu.InteractPacket::write,
DriveViewerMenu.NetworkedItemView.InteractPacket::read, DriveViewerMenu.InteractPacket::read,
DriveViewerMenu.NetworkedItemView.InteractPacket::play, DriveViewerMenu.InteractPacket::play,
Optional.of(NetworkDirection.PLAY_TO_SERVER) Optional.of(NetworkDirection.PLAY_TO_SERVER)
); );

View File

@ -1,12 +1,11 @@
package ru.dbotthepony.mc.otm.screen; package ru.dbotthepony.mc.otm.screen;
import net.minecraft.network.chat.Component; import net.minecraft.network.chat.Component;
import net.minecraft.network.chat.TranslatableComponent;
import net.minecraft.world.entity.player.Inventory; 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 net.minecraft.world.item.ItemStack;
import ru.dbotthepony.mc.otm.menu.DriveViewerMenu; 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.slot.MatterySlot;
import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget; import ru.dbotthepony.mc.otm.menu.widget.GaugeWidget;
import ru.dbotthepony.mc.otm.network.MatteryNetworking; import ru.dbotthepony.mc.otm.network.MatteryNetworking;
@ -77,10 +76,14 @@ public class DriveViewerScreen extends MatteryScreen<DriveViewerMenu> implements
} }
@Override @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); int findex = index + scroll_bar.getScroll(GRID_WIDTH);
var list = menu.view.getItems(); 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; return true;
} }
}; };

View File

@ -114,6 +114,7 @@
"block.overdrive_that_matters.matter_panel": "Pattern monitor", "block.overdrive_that_matters.matter_panel": "Pattern monitor",
"block.overdrive_that_matters.matter_replicator": "Matter replicator", "block.overdrive_that_matters.matter_replicator": "Matter replicator",
"block.overdrive_that_matters.matter_bottler": "Matter bottler", "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", "otm.container.matter_panel.number_input": "Input replication task count",