More test code regarding drives
This commit is contained in:
parent
998ce95f1c
commit
de22ab54c0
@ -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<NetworkEvent.Context> 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<Integer, ViewedItem> state = new HashMap<>();
|
||||
protected final HashMap<UUID, ViewedItem> upstream_state = new HashMap<>();
|
||||
protected final HashMap<Integer, NetworkedItem> state = new HashMap<>();
|
||||
protected final HashMap<UUID, NetworkedItem> upstream_state = new HashMap<>();
|
||||
protected final ArrayList<Object> 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<ItemStack> 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);
|
||||
|
||||
|
@ -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_);
|
||||
}
|
||||
}
|
@ -17,7 +17,10 @@ import java.util.List;
|
||||
|
||||
public class DriveViewerScreen extends MatteryScreen<DriveViewerMenu> 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<DriveViewerMenu> 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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user