More test code regarding drives

This commit is contained in:
DBotThePony 2021-08-27 18:53:25 +07:00
parent 998ce95f1c
commit de22ab54c0
Signed by: DBot
GPG Key ID: DCC23B5715498507
4 changed files with 117 additions and 13 deletions

View File

@ -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);

View File

@ -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_);
}
}

View File

@ -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);
}
};
}

View File

@ -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;
}