Reasonable interaction with drive viewer
This commit is contained in:
parent
fa72e6ec03
commit
b0e9a96e50
@ -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) {
|
||||||
|
@ -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();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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",
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user