From de22ab54c0a0ab42bb69239688b8f05ea7cee4da Mon Sep 17 00:00:00 2001 From: DBotThePony Date: Fri, 27 Aug 2021 18:53:25 +0700 Subject: [PATCH] More test code regarding drives --- .../mc/otm/menu/data/NetworkedItemView.java | 54 ++++++++++++++++--- .../mc/otm/menu/slot/ItemViewInputSlot.java | 35 ++++++++++++ .../mc/otm/screen/DriveViewerScreen.java | 32 +++++++++-- .../mc/otm/screen/panels/FlexGridPanel.java | 9 +++- 4 files changed, 117 insertions(+), 13 deletions(-) create mode 100644 src/main/java/ru/dbotthepony/mc/otm/menu/slot/ItemViewInputSlot.java diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java b/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java index 9637d803a..0f773b273 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/data/NetworkedItemView.java @@ -8,7 +8,6 @@ import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraftforge.fmllegacy.network.NetworkEvent; import net.minecraftforge.fmllegacy.network.PacketDistributor; -import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.network.MatteryNetworking; import java.util.ArrayList; @@ -17,9 +16,12 @@ import java.util.List; import java.util.UUID; import java.util.function.Supplier; +/** + * Creates a virtual, slotless container for Player's interaction with. + */ public class NetworkedItemView { - public record ViewedItem(int id, ItemStack stack, UUID id_upstream) { - public ViewedItem(int id, ItemStack stack) { + public record NetworkedItem(int id, ItemStack stack, UUID id_upstream) { + public NetworkedItem(int id, ItemStack stack) { this(id, stack, null); } } @@ -111,12 +113,46 @@ public class NetworkedItemView { throw new IllegalStateException("Item tracker " + id + " already has stack with id of " + stack_id); } - get.state.put(stack_id, new ViewedItem(stack_id, stack)); + get.state.put(stack_id, new NetworkedItem(stack_id, stack)); get.clearCache(); }); } } + public record InteractPacket(UUID id, int stack_id) { + public void write(FriendlyByteBuf buffer) { + buffer.writeLong(id.getMostSignificantBits()); + buffer.writeLong(id.getLeastSignificantBits()); + buffer.writeInt(stack_id); + } + + public static InteractPacket read(FriendlyByteBuf buffer) { + var id = new UUID(buffer.readLong(), buffer.readLong()); + var stack = buffer.readInt(); + return new InteractPacket(id, stack); + } + + public void play(Supplier context) { + context.get().setPacketHandled(true); + context.get().enqueueWork(() -> { + var get = TRACKERS_REMOTE.get(id); + + if (get == null) { + return; + } + + var get_state = get.state.get(stack_id); + + if (get_state == null) { + return; + } + + var ply = context.get().getSender(); + ply.resetLastActionTime(); + }); + } + } + public record StackChangePacket(UUID id, int stack_id, int new_count) { public void write(FriendlyByteBuf buffer) { buffer.writeLong(id.getMostSignificantBits()); @@ -193,8 +229,8 @@ public class NetworkedItemView { public final boolean remote; protected int next_stack_id = 0; - protected final HashMap state = new HashMap<>(); - protected final HashMap upstream_state = new HashMap<>(); + protected final HashMap state = new HashMap<>(); + protected final HashMap upstream_state = new HashMap<>(); protected final ArrayList backlog = new ArrayList<>(); // normally, filled only on server @@ -238,6 +274,10 @@ public class NetworkedItemView { view_cache = null; } + public boolean mayPlace(ItemStack stack) { + return false; + } + public List getItems() { if (view_cache != null) return view_cache; @@ -254,7 +294,7 @@ public class NetworkedItemView { if (upstream_state.containsKey(id_upstream)) throw new IllegalStateException("Already tracking ItemStack with upstream id " + id_upstream + "!"); - var state = new ViewedItem(next_stack_id++, stack, id_upstream); + var state = new NetworkedItem(next_stack_id++, stack, id_upstream); this.state.put(state.id, state); this.upstream_state.put(id_upstream, state); diff --git a/src/main/java/ru/dbotthepony/mc/otm/menu/slot/ItemViewInputSlot.java b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/ItemViewInputSlot.java new file mode 100644 index 000000000..e92a01c75 --- /dev/null +++ b/src/main/java/ru/dbotthepony/mc/otm/menu/slot/ItemViewInputSlot.java @@ -0,0 +1,35 @@ +package ru.dbotthepony.mc.otm.menu.slot; + +import net.minecraft.world.Container; +import net.minecraft.world.item.ItemStack; +import ru.dbotthepony.mc.otm.menu.data.NetworkedItemView; + +public class ItemViewInputSlot extends MatterySlot { + public ItemViewInputSlot(Container p_40223_, int index, int x, int y, boolean auto_bg) { + super(p_40223_, index, x, y, auto_bg); + } + + public ItemViewInputSlot(Container p_40223_, int index, int x, int y) { + super(p_40223_, index, x, y); + } + + public ItemViewInputSlot(Container p_40223_, int index) { + super(p_40223_, index); + } + + public NetworkedItemView view; + + @Override + public boolean mayPlace(ItemStack p_40231_) { + if (view == null || view.remote) { + return true; + } + + return view.mayPlace(p_40231_); + } + + @Override + public void set(ItemStack p_40240_) { + super.set(p_40240_); + } +} 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 7717c1827..b5c5d2aa6 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/DriveViewerScreen.java @@ -17,7 +17,10 @@ import java.util.List; public class DriveViewerScreen extends MatteryScreen implements MatteryScreen.IMatteryScreenGaugeGetter, MatteryScreen.IMatteryScreenBatteryGetter { public static final int FRAME_WIDTH = 210; - public static final int FRAME_HEIGHT = 100; + public static final int FRAME_HEIGHT = 110; + + public static final int GRID_WIDTH = 9; + public static final int GRID_HEIGHT = 5; public DriveViewerScreen(DriveViewerMenu menu, Inventory inventory, Component title) { super(menu, inventory, title); @@ -40,30 +43,49 @@ public class DriveViewerScreen extends MatteryScreen implements autoAttachToFrame(frame); - var grid = new GridPanel(this, frame, 0, 0, 0, 0, 3, 3); + var grid = new GridPanel(this, frame, 0, 0, 0, 0, GRID_WIDTH, GRID_HEIGHT); grid.setDock(Dock.FILL); + grid.setDockMargin(2, 2, 2, 2); + var scroll_bar = new ScrollBarPanel(this, frame, 0, 0, 0); + scroll_bar.setDock(Dock.RIGHT); + scroll_bar.setupRowMultiplier(() -> { + var view = menu.getView(); - for (int i = 0; i < 9; i++) { + if (view != null) { + return view.getItems().size() / GRID_WIDTH; + } + + return 0; + }); + + for (int i = 0; i < GRID_WIDTH * GRID_HEIGHT; i++) { final int index = i; new AbstractSlotPanel(this, grid, 0, 0) { @Nonnull @Override protected ItemStack getItemStack() { + int findex = index + scroll_bar.getScroll(GRID_WIDTH); + var view = menu.getView(); if (view != null) { var list = view.getItems(); - if (index >= list.size()) { + if (findex >= list.size()) { return ItemStack.EMPTY; } - return list.get(index); + return list.get(findex); } return ItemStack.EMPTY; } + + @Override + protected boolean mouseScrolledInner(double mouse_x, double mouse_y, double scroll) { + return scroll_bar.mouseScrolledInner(mouse_x, mouse_y, scroll); + } }; } diff --git a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FlexGridPanel.java b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FlexGridPanel.java index e428f1181..dfad22858 100644 --- a/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FlexGridPanel.java +++ b/src/main/java/ru/dbotthepony/mc/otm/screen/panels/FlexGridPanel.java @@ -1,6 +1,5 @@ package ru.dbotthepony.mc.otm.screen.panels; -import ru.dbotthepony.mc.otm.OverdriveThatMatters; import ru.dbotthepony.mc.otm.screen.MatteryScreen; import javax.annotation.Nonnull; @@ -22,6 +21,7 @@ public class FlexGridPanel extends EditablePanel { } protected FlexAlign align; + public int panels_per_row = 1; public FlexGridPanel(@Nonnull MatteryScreen screen, @Nullable EditablePanel parent, float x, float y, float width, float height) { super(screen, parent, x, y, width, height); @@ -78,6 +78,8 @@ public class FlexGridPanel extends EditablePanel { // определение высоты всех рядов вместе float total_height = 0; + panels_per_row = 0; + boolean calculate_row_width = true; for (int row = 0; row < rows; row++) { float max_height = 0; @@ -90,6 +92,11 @@ public class FlexGridPanel extends EditablePanel { index = i; if (gain_width + total_width > desired_width) { + if (calculate_row_width) { + panels_per_row = i + 1; + calculate_row_width = false; + } + break; }