Skip to content

Commit

Permalink
Add a button to the QIO crafting windows to allow emptying the grid t…
Browse files Browse the repository at this point in the history
…o the QIO storage/player's inventory
  • Loading branch information
pupnewfster committed Jul 28, 2022
1 parent 94fe7c6 commit c4c9737
Show file tree
Hide file tree
Showing 9 changed files with 105 additions and 6 deletions.
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
// 1.19 2022-07-28T14:42:43.4374534 Languages: en_us: mekanism
00299ad845351c79bcaaac6748e01a8435eab248 assets/mekanism/lang/en_ud.json
97c144f7a8902b1c06eded4b81597c1cab835429 assets/mekanism/lang/en_us.json
// 1.19 2022-07-28T15:54:04.7130404 Languages: en_us: mekanism
9b52eac698f6422e6fc5b856cb96dffef256e794 assets/mekanism/lang/en_ud.json
b67eb9332d1a183dc1891e60fa85e0a53efd038a assets/mekanism/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,7 @@
"gui.mekanism.compass": "ssɐdɯoƆ",
"gui.mekanism.crafting.tab": "(%2$s/%1$s) ᵷuᴉʇɟɐɹƆ",
"gui.mekanism.crafting.window": "%s ʍopuᴉM ᵷuᴉʇɟɐɹƆ",
"gui.mekanism.crafting.window.clear": "˙pɐǝʇsuᴉ ʎɹoʇuǝʌuᴉ ɹǝʎɐꞁd oʇuᴉ ʎʇdɯǝ oʇ ʇɟᴉɥs pꞁoɥ 'ǝᵷɐɹoʇs oʇuᴉ sʇuǝʇuoɔ ʍopuᴉM ᵷuᴉʇɟɐɹƆ ʎʇdɯƎ",
"gui.mekanism.danger": "ɹǝᵷuɐᗡ",
"gui.mekanism.default": "ʇꞁnɐɟǝᗡ",
"gui.mekanism.delay": "ʇ%s :ʎɐꞁǝᗡ",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -940,6 +940,7 @@
"gui.mekanism.compass": "Compass",
"gui.mekanism.crafting.tab": "Crafting (%1$s/%2$s)",
"gui.mekanism.crafting.window": "Crafting Window %1$s",
"gui.mekanism.crafting.window.clear": "Empty Crafting Window contents into storage, hold shift to empty into player inventory instead.",
"gui.mekanism.danger": "Danger",
"gui.mekanism.default": "Default",
"gui.mekanism.delay": "Delay: %1$st",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -830,6 +830,7 @@ private void addMisc() {
add(MekanismLang.HEIGHT, "Height");
add(MekanismLang.CRAFTING_TAB, "Crafting (%1$s/%2$s)");
add(MekanismLang.CRAFTING_WINDOW, "Crafting Window %1$s");
add(MekanismLang.CRAFTING_WINDOW_CLEAR, "Empty Crafting Window contents into storage, hold shift to empty into player inventory instead.");
add(MekanismLang.MIN, "Min: %1$s");
add(MekanismLang.MAX, "Max: %1$s");
add(MekanismLang.INFINITE, "Infinite");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,37 +5,48 @@
import java.util.List;
import mekanism.client.gui.IGuiWrapper;
import mekanism.client.gui.element.GuiRightArrow;
import mekanism.client.gui.element.button.MekanismImageButton;
import mekanism.client.gui.element.slot.GuiVirtualSlot;
import mekanism.client.gui.element.slot.SlotType;
import mekanism.common.Mekanism;
import mekanism.common.MekanismLang;
import mekanism.common.inventory.container.QIOItemViewerContainer;
import mekanism.common.inventory.container.SelectedWindowData;
import mekanism.common.inventory.container.SelectedWindowData.WindowType;
import mekanism.common.network.to_server.PacketQIOClearCraftingWindow;
import net.minecraft.client.gui.screens.Screen;

public class GuiCraftingWindow extends GuiWindow {

private final List<GuiVirtualSlot> slots;
private final byte index;
private QIOItemViewerContainer container;

public GuiCraftingWindow(IGuiWrapper gui, int x, int y, QIOItemViewerContainer container, byte index) {
super(gui, x, y, 118, 80, new SelectedWindowData(WindowType.CRAFTING, index));
this.index = index;
this.container = container;
interactionStrategy = InteractionStrategy.ALL;
slots = new ArrayList<>();
for (int row = 0; row < 3; row++) {
for (int column = 0; column < 3; column++) {
slots.add(addChild(new GuiVirtualSlot(this, SlotType.NORMAL, gui, relativeX + 8 + column * 18, relativeY + 18 + row * 18,
container.getCraftingWindowSlot(this.index, row * 3 + column))));
this.container.getCraftingWindowSlot(this.index, row * 3 + column))));
}
}
addChild(new GuiRightArrow(gui, relativeX + 66, relativeY + 38).jeiCrafting());
slots.add(addChild(new GuiVirtualSlot(this, SlotType.NORMAL, gui, relativeX + 92, relativeY + 36, container.getCraftingWindowSlot(this.index, 9))));
slots.add(addChild(new GuiVirtualSlot(this, SlotType.NORMAL, gui, relativeX + 92, relativeY + 36,
this.container.getCraftingWindowSlot(this.index, 9))));
addChild(new MekanismImageButton(gui, relativeX + width - 20, relativeY + height - 20, 14, getButtonLocation("clear_sides"),
() -> Mekanism.packetHandler().sendToServer(new PacketQIOClearCraftingWindow(index, Screen.hasShiftDown())), getOnHover(MekanismLang.CRAFTING_WINDOW_CLEAR)));
}

public void updateContainer(QIOItemViewerContainer container) {
//Update container so that it can properly proxy the call to the container so that it can be synced properly based on tile vs item impl
this.container = container;
//Lookup the slots again and update the stored lookup method
for (int i = 0; i < slots.size(); i++) {
slots.get(i).updateVirtualSlot(this, container.getCraftingWindowSlot(index, i));
slots.get(i).updateVirtualSlot(this, this.container.getCraftingWindowSlot(index, i));
}
}

Expand Down
1 change: 1 addition & 0 deletions src/main/java/mekanism/common/MekanismLang.java
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ public enum MekanismLang implements ILangEntry {
WIDTH("gui", "width"),
CRAFTING_TAB("gui", "crafting.tab"),
CRAFTING_WINDOW("gui", "crafting.window"),
CRAFTING_WINDOW_CLEAR("gui", "crafting.window.clear"),
PROGRESS("gui", "progress"),
PROCESS_RATE("gui", "process_rate"),
PROCESS_RATE_MB("gui", "process_rate_mb"),
Expand Down
36 changes: 36 additions & 0 deletions src/main/java/mekanism/common/content/qio/QIOCraftingWindow.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
import java.util.Collections;
import java.util.List;
import java.util.function.IntFunction;
import java.util.function.UnaryOperator;
import mekanism.api.Action;
import mekanism.api.AutomationType;
import mekanism.api.IContentsListener;
Expand Down Expand Up @@ -263,6 +264,41 @@ private void useInput(IInventorySlot inputSlot) {
MekanismUtils.logMismatchedStackSize(inputSlot.shrinkStack(1, Action.EXECUTE), 1);
}

/**
* @apiNote Only call from the server
*/
public void emptyTo(boolean toPlayerInv, List<HotBarSlot> hotBarSlots, List<MainInventorySlot> mainInventorySlots) {
if (toPlayerInv) {
emptyTo(toTransfer -> {
ItemStack remainder = MekanismContainer.insertItem(hotBarSlots, toTransfer, true, windowData);
remainder = MekanismContainer.insertItem(mainInventorySlots, remainder, true, windowData);
remainder = MekanismContainer.insertItem(hotBarSlots, remainder, false, windowData);
return MekanismContainer.insertItem(mainInventorySlots, remainder, false, windowData);
});
} else {
QIOFrequency frequency = holder.getFrequency();
//NO-OP if the frequency is null and that is the target
if (frequency != null) {
emptyTo(frequency::addItem);
}
}
}

/**
* @param inserter Unary operator that takes the stack to transfer and returns remainder
*/
private void emptyTo(UnaryOperator<ItemStack> inserter) {
for (CraftingWindowInventorySlot inputSlot : inputSlots) {
if (!inputSlot.isEmpty()) {
ItemStack toTransfer = inputSlot.extractItem(inputSlot.getCount(), Action.SIMULATE, AutomationType.INTERNAL);
if (!toTransfer.isEmpty()) {
ItemStack remainder = inserter.apply(toTransfer);
inputSlot.extractItem(toTransfer.getCount() - remainder.getCount(), Action.EXECUTE, AutomationType.INTERNAL);
}
}
}
}

/**
* @apiNote For use with shift clicking
*/
Expand Down
2 changes: 2 additions & 0 deletions src/main/java/mekanism/common/network/PacketHandler.java
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
import mekanism.common.network.to_server.PacketNewFilter;
import mekanism.common.network.to_server.PacketOpenGui;
import mekanism.common.network.to_server.PacketPortableTeleporterTeleport;
import mekanism.common.network.to_server.PacketQIOClearCraftingWindow;
import mekanism.common.network.to_server.PacketQIOFillCraftingWindow;
import mekanism.common.network.to_server.PacketQIOItemViewerSlotInteract;
import mekanism.common.network.to_server.PacketRadialModeChange;
Expand Down Expand Up @@ -70,6 +71,7 @@ public void initialize() {
registerClientToServer(PacketNewFilter.class, PacketNewFilter::decode);
registerClientToServer(PacketOpenGui.class, PacketOpenGui::decode);
registerClientToServer(PacketPortableTeleporterTeleport.class, PacketPortableTeleporterTeleport::decode);
registerClientToServer(PacketQIOClearCraftingWindow.class, PacketQIOClearCraftingWindow::decode);
registerClientToServer(PacketQIOFillCraftingWindow.class, PacketQIOFillCraftingWindow::decode);
registerClientToServer(PacketQIOItemViewerSlotInteract.class, PacketQIOItemViewerSlotInteract::decode);
registerClientToServer(PacketRadialModeChange.class, PacketRadialModeChange::decode);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package mekanism.common.network.to_server;

import mekanism.common.Mekanism;
import mekanism.common.content.qio.QIOCraftingWindow;
import mekanism.common.inventory.container.QIOItemViewerContainer;
import mekanism.common.network.IMekanismPacket;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.server.level.ServerPlayer;
import net.minecraftforge.network.NetworkEvent;

public class PacketQIOClearCraftingWindow implements IMekanismPacket {

private final byte window;
private final boolean toPlayerInv;

public PacketQIOClearCraftingWindow(byte window, boolean toPlayerInv) {
this.window = window;
this.toPlayerInv = toPlayerInv;
}

@Override
public void handle(NetworkEvent.Context context) {
ServerPlayer player = context.getSender();
if (player != null && player.containerMenu instanceof QIOItemViewerContainer container) {
byte selectedCraftingGrid = container.getSelectedCraftingGrid(player.getUUID());
if (selectedCraftingGrid == -1) {
Mekanism.logger.warn("Received clear request from: {}, but they do not currently have a crafting window open.", player);
} else if (selectedCraftingGrid != window) {
Mekanism.logger.warn("Received clear request from: {}, but they currently have a different crafting window open.", player);
} else {
QIOCraftingWindow craftingWindow = container.getCraftingWindow(selectedCraftingGrid);
craftingWindow.emptyTo(toPlayerInv, container.getHotBarSlots(), container.getMainInventorySlots());
}
}
}

@Override
public void encode(FriendlyByteBuf buffer) {
buffer.writeByte(window);
buffer.writeBoolean(toPlayerInv);
}

public static PacketQIOClearCraftingWindow decode(FriendlyByteBuf buffer) {
return new PacketQIOClearCraftingWindow(buffer.readByte(), buffer.readBoolean());
}
}

0 comments on commit c4c9737

Please sign in to comment.