Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/generated/resources/assets/gtceu/lang/en_ud.json
Original file line number Diff line number Diff line change
Expand Up @@ -2476,6 +2476,7 @@
"gtceu.gui.overclock.off": "X",
"gtceu.gui.overclock.range": "]%s '%s[ sɹǝı⟘ ǝןqɐןıɐʌⱯ",
"gtceu.gui.overclock.title": "ɹǝı⟘ ʞɔoןɔɹǝʌO",
"gtceu.gui.pattern_buffer.set_custom_name": " :ǝɯɐN ɯoʇsnƆ ʇǝS",
"gtceu.gui.silktouch.disabled.0": "˙ǝןqɐuƎ oʇ ʞɔıןƆ :pǝןqɐsıᗡ ɥɔno⟘ ʞןıS",
"gtceu.gui.silktouch.disabled.1": "˙ǝuıɥɔɐɯ ǝןpı uɐ sǝɹınbǝɹ buıɥɔʇıʍSㄥ§",
"gtceu.gui.silktouch.enabled.0": "˙ǝןqɐsıᗡ oʇ ʞɔıןƆ :pǝןqɐuƎ ɥɔno⟘ ʞןıS",
Expand Down
1 change: 1 addition & 0 deletions src/generated/resources/assets/gtceu/lang/en_us.json
Original file line number Diff line number Diff line change
Expand Up @@ -2476,6 +2476,7 @@
"gtceu.gui.overclock.off": "X",
"gtceu.gui.overclock.range": "Available Tiers [%s, %s]",
"gtceu.gui.overclock.title": "Overclock Tier",
"gtceu.gui.pattern_buffer.set_custom_name": "Set Custom Name: ",
"gtceu.gui.silktouch.disabled.0": "Silk Touch Disabled: Click to Enable.",
"gtceu.gui.silktouch.disabled.1": "§7Switching requires an idle machine.",
"gtceu.gui.silktouch.enabled.0": "Silk Touch Enabled: Click to Disable.",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,8 @@ public static class IDs {
public static final UITexture OUT_SLOT_OVERLAY_STEEL = fullImage("textures/gui/overlay/out_slot_overlay_steel.png");
public static final UITexture PAPER_OVERLAY = fullImage("textures/gui/overlay/paper_overlay.png",
ColorType.DEFAULT);
public static final UITexture PATTERN_OVERLAY = fullImage("textures/gui/widget/pattern_overlay.png",
ColorType.DEFAULT);
public static final UITexture PRINTED_PAPER_OVERLAY = fullImage("textures/gui/overlay/printed_paper_overlay.png",
ColorType.DEFAULT);
public static final UITexture PIPE_OVERLAY_2 = fullImage("textures/gui/overlay/pipe_overlay_2.png",
Expand All @@ -361,6 +363,8 @@ public static class IDs {
ColorType.DEFAULT);
public static final UITexture PRESS_OVERLAY_4 = fullImage("textures/gui/overlay/press_overlay_4.png",
ColorType.DEFAULT);
public static final UITexture REFUND_OVERLAY = fullImage("textures/gui/widget/refund_overlay.png",
ColorType.DEFAULT);
public static final UITexture SAWBLADE_OVERLAY = fullImage("textures/gui/overlay/sawblade_overlay.png",
ColorType.DEFAULT);
public static final UITexture SOLIDIFIER_OVERLAY = fullImage("textures/gui/overlay/solidifier_overlay.png",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1325,6 +1325,7 @@ public static void init(RegistrateLangProvider provider) {
provider.add("gtceu.gui.content.units.per_tick", "/t");
provider.add("gtceu.gui.content.units.per_second", "/s");

provider.add("gtceu.gui.pattern_buffer.set_custom_name", "Set Custom Name: ");
provider.add("gtceu.gui.me_network.online", "Network Status: §2Online§r");
provider.add("gtceu.gui.me_network.offline", "Network Status: §4Offline§r");
provider.add("gtceu.gui.waiting_list", "Sending Queue:");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,40 @@
import com.gregtechceu.gtceu.api.machine.trait.NotifiableFluidTank;
import com.gregtechceu.gtceu.api.machine.trait.NotifiableItemStackHandler;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList;
import com.gregtechceu.gtceu.api.mui.base.IPanelHandler;
import com.gregtechceu.gtceu.api.mui.base.drawable.IKey;
import com.gregtechceu.gtceu.api.mui.drawable.DrawableStack;
import com.gregtechceu.gtceu.api.mui.drawable.DynamicDrawable;
import com.gregtechceu.gtceu.api.mui.drawable.ItemDrawable;
import com.gregtechceu.gtceu.api.mui.factory.PosGuiData;
import com.gregtechceu.gtceu.api.mui.value.sync.BooleanSyncValue;
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.api.mui.value.sync.SyncHandlers;
import com.gregtechceu.gtceu.api.mui.widgets.ButtonWidget;
import com.gregtechceu.gtceu.api.mui.widgets.SlotGroupWidget;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Column;
import com.gregtechceu.gtceu.api.mui.widgets.layout.Grid;
import com.gregtechceu.gtceu.api.mui.widgets.slot.ItemSlot;
import com.gregtechceu.gtceu.api.mui.widgets.slot.SlotGroup;
import com.gregtechceu.gtceu.api.mui.widgets.textfield.TextFieldWidget;
import com.gregtechceu.gtceu.api.recipe.ingredient.FluidIngredient;
import com.gregtechceu.gtceu.api.recipe.ingredient.SizedIngredient;
import com.gregtechceu.gtceu.api.transfer.item.CustomItemStackHandler;
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.RichTooltip;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
import com.gregtechceu.gtceu.common.data.machines.GTAEMachines;
import com.gregtechceu.gtceu.common.data.mui.GTMuiMachineUtil;
import com.gregtechceu.gtceu.common.data.mui.GTMuiWidgets;
import com.gregtechceu.gtceu.common.item.IntCircuitBehaviour;
import com.gregtechceu.gtceu.common.mui.GTGuiTextures;
import com.gregtechceu.gtceu.common.mui.GTGuis;
import com.gregtechceu.gtceu.integration.ae2.machine.trait.InternalSlotRecipeHandler;
import com.gregtechceu.gtceu.syncsystem.annotations.SaveField;
import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient;
import com.gregtechceu.gtceu.utils.GTMath;
import com.gregtechceu.gtceu.utils.ItemStackHashStrategy;

import com.lowdragmc.lowdraglib.gui.util.ClickData;

import net.minecraft.MethodsReturnNonnullByDefault;
import net.minecraft.core.BlockPos;
import net.minecraft.nbt.CompoundTag;
Expand All @@ -34,6 +55,7 @@
import net.minecraft.world.InteractionResult;
import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.common.util.INBTSerializable;
import net.minecraftforge.fluids.FluidStack;
Expand All @@ -49,21 +71,19 @@
import appeng.api.stacks.*;
import appeng.api.storage.MEStorage;
import appeng.api.storage.StorageHelper;
import appeng.crafting.pattern.EncodedPatternItem;
import appeng.crafting.pattern.ProcessingPatternItem;
import appeng.helpers.patternprovider.PatternContainer;
import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap;
import com.mojang.blaze3d.platform.InputConstants;
import it.unimi.dsi.fastutil.objects.*;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.annotations.UnmodifiableView;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import java.util.*;

import javax.annotation.ParametersAreNonnullByDefault;

Expand Down Expand Up @@ -232,11 +252,9 @@ public Set<MEPatternBufferProxyPartMachine> getProxies() {
return Collections.unmodifiableSet(proxyMachines);
}

private void refundAll(ClickData clickData) {
if (!clickData.isRemote) {
for (InternalSlot internalSlot : internalInventory) {
internalSlot.refund();
}
private void refundAll() {
for (InternalSlot internalSlot : internalInventory) {
internalSlot.refund();
}
}

Expand All @@ -259,66 +277,161 @@ private void onPatternChange(int index) {
//////////////////////////////////////
// ********** GUI ***********//
//////////////////////////////////////
/*
* @Override
* public void attachConfigurators(ConfiguratorPanel configuratorPanel) {
* configuratorPanel.attachConfigurators(new ButtonConfigurator(
* new GuiTextureGroup(GuiTextures.BUTTON, GuiTextures.REFUND_OVERLAY), this::refundAll)
* .setTooltips(List.of(Component.translatable("gui.gtceu.refund_all.desc"))));
* if (isHasCircuitSlot() && isCircuitSlotEnabled()) {
* configuratorPanel.attachConfigurators(new CircuitFancyConfigurator(circuitInventory.storage));
* }
* configuratorPanel.attachConfigurators(new FancyInvConfigurator(
* shareInventory.storage, Component.translatable("gui.gtceu.share_inventory.title"))
* .setTooltips(List.of(
* Component.translatable("gui.gtceu.share_inventory.desc.0"),
* Component.translatable("gui.gtceu.share_inventory.desc.1"))));
* configuratorPanel.attachConfigurators(new FancyTankConfigurator(
* shareTank.getStorages(), Component.translatable("gui.gtceu.share_tank.title"))
* .setTooltips(List.of(
* Component.translatable("gui.gtceu.share_tank.desc.0"),
* Component.translatable("gui.gtceu.share_inventory.desc.1"))));
* }
*
* @Override
* public Widget createUIWidget() {
* int rowSize = 9;
* int colSize = 3;
* var group = new WidgetGroup(0, 0, 18 * rowSize + 16, 18 * colSize + 16);
* int index = 0;
* for (int y = 0; y < colSize; ++y) {
* for (int x = 0; x < rowSize; ++x) {
* int finalI = index;
* var slot = new AEPatternViewSlotWidget(patternInventory, index++, 8 + x * 18, 14 + y * 18)
* .setOccupiedTexture(GuiTextures.SLOT)
* .setItemHook(stack -> {
* if (!stack.isEmpty() && stack.getItem() instanceof EncodedPatternItem iep) {
* final ItemStack out = iep.getOutput(stack);
* if (!out.isEmpty()) {
* return out;
* }
* }
* return stack;
* })
* .setChangeListener(() -> onPatternChange(finalI))
* .setBackground(GuiTextures.SLOT, GuiTextures.PATTERN_OVERLAY);
* group.addWidget(slot);
* }
* }
* // ME Network status
* group.addWidget(new LabelWidget(
* 8,
* 2,
* () -> this.isOnline ? "gtceu.gui.me_network.online" : "gtceu.gui.me_network.offline"));
*
* group.addWidget(new AETextInputButtonWidget(18 * rowSize + 8 - 70, 2, 70, 10)
* .setText(customName)
* .setOnConfirm(this::setCustomName)
* .setButtonTooltips(Component.translatable("gui.gtceu.rename.desc")));
*
* return group;
* }
*/

@Override
public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) {
var panel = GTGuis.createPanel(this, 176, 168);

panel.child(GTMuiWidgets.createTitleBar(getDefinition(), 176));

SlotGroup patternSlotGroup = new SlotGroup("pattern_slots", 9, 0, true);

panel.child(new Grid()
.top(25)
.height(18 * (MAX_PATTERN_COUNT / 9))
.minElementMargin(0, 0)
.minColWidth(18).minRowHeight(18)
.alignX(0.5f)
.mapTo(9, MAX_PATTERN_COUNT, index -> new ItemSlot()
.slot(SyncHandlers.itemSlot(patternInventory, index)
.slotGroup(patternSlotGroup)
.accessibility(true, true)
.filter(stack -> stack.getItem() instanceof EncodedPatternItem)
.changeListener((i, o, c, init) -> onPatternChange(index)))
.background(GTGuiTextures.SLOT, GTGuiTextures.PATTERN_OVERLAY)));

BooleanSyncValue isOnlineValue = SyncHandlers.bool(this::isOnline, this::setOnline);
syncManager.syncValue("is_online", isOnlineValue);

panel.child(IKey.dynamic(() -> isOnlineValue.getBoolValue() ?
Component.translatable("gtceu.gui.me_network.online") :
Component.translatable("gtceu.gui.me_network.offline"))
.asWidget()
.top(10)
.margin(2)
.left(9));

IPanelHandler renamingPanelHandler = syncManager.syncedPanel("renaming", true,
((syncManager1, syncHandler) -> GTGuis.createPopupPanel("renaming_panel", 110, 40)
.child(new Column()
.coverChildren()
.child(IKey.lang("gtceu.gui.pattern_buffer.set_custom_name").asWidget())
.child(new TextFieldWidget()
.size(90, 20)
.value(SyncHandlers.string(() -> this.customName, this::setCustomName)))
.margin(5))));

IPanelHandler sharedItemsPanelHandler = syncManager.syncedPanel("shared_items", true,
(syncManager1, panelHandler) -> {
SlotGroup sharedItemSlotGroup = new SlotGroup("shared_item_slots", 3, false);

return GTGuis.createPopupPanel("shared_items_panel", 80, 86)
.child(IKey.lang("gui.gtceu.share_inventory.title").asWidget().margin(4))
.child(new Grid()
.name("shared_item_grid")
.top(26)
.height(18 * 3)
.minElementMargin(0, 0)
.minColWidth(18).minRowHeight(18)
.alignX(0.5f)
.mapTo(3, 9, index -> new ItemSlot()
.slot(SyncHandlers.itemSlot(shareInventory, index)
.slotGroup(sharedItemSlotGroup)
.accessibility(true, true))));
});

IPanelHandler sharedFluidsPanelHandler = syncManager.syncedPanel("shared_fluids", true,
(syncManager1, panelHandler) -> GTGuis.createPopupPanel("shared_fluids_panel", 85, 86)
.child(IKey.lang("gui.gtceu.share_tank.title").asWidget().margin(4))
.child(GTMuiMachineUtil.createSlotGroupFromInventory(syncManager1, shareTank,
"shared_fluid_slots", 9, 'F',
GTMuiMachineUtil.createSquareMatrix(9, 'F'))
.top(26)
.alignX(0.5f)));

BooleanSyncValue canRefundValue = SyncHandlers.bool(this::canRefund, b -> {});
syncManager.syncValue("can_refund", canRefundValue);

syncManager.registerServerSyncedAction("refundButtonPressed", packet -> refundAll());

panel.child(new Column()
.coverChildren()
.leftRel(1.0f)
.reverseLayout(true)
.bottom(14)
.padding(8, 0, 4, 4)
.childPadding(2)
.background(GTGuiTextures.BACKGROUND.getSubArea(0.25f, 0f, 1.0f, 1.0f))
.child(GTMuiWidgets.createCircuitSlotPanel(this, panel, syncManager))
.child(new ButtonWidget<>() // Shared items subpanel
.size(18)
.onMousePressed((x, y, b) -> {
if (b == InputConstants.MOUSE_BUTTON_LEFT) {
sharedItemsPanelHandler.openPanel();
return true;
}
return false;
})
.overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT)
.tooltip(new RichTooltip()
.addLine(IKey.lang("gui.gtceu.share_inventory.desc.0"))
.addLine(IKey.lang("gui.gtceu.share_inventory.desc.1"))))
.child(new ButtonWidget<>() // Shared fluids subpanel
.size(18)
.onMousePressed((x, y, b) -> {
if (b == InputConstants.MOUSE_BUTTON_LEFT) {
sharedFluidsPanelHandler.openPanel();
return true;
}
return false;
})
.overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT)
.tooltip(new RichTooltip()
.addLine(IKey.lang("gui.gtceu.share_tank.desc.0"))
.addLine(IKey.lang("gui.gtceu.share_inventory.desc.1"))))
.child(new ButtonWidget<>() // Refund button
.size(18)
.onMousePressed((x, y, b) -> {
if (canRefundValue.getBoolValue() && b == InputConstants.MOUSE_BUTTON_LEFT) {
syncManager.callSyncedAction("refundButtonPressed");
return true;
}
return false;
})
.overlay(new DynamicDrawable(() -> {
if (canRefundValue.getBoolValue()) {
return GTGuiTextures.REFUND_OVERLAY
.asIcon().size(16);
} else {
return new DrawableStack(GTGuiTextures.REFUND_OVERLAY, new ItemDrawable(Items.BARRIER))
.asIcon().size(16);
}
}))
.tooltip(new RichTooltip()
.addLine(IKey.lang("gui.gtceu.refund_all.desc"))))
.child(new ButtonWidget<>() // Renaming button
.size(18)
.onMousePressed((x, y, b) -> {
if (b == InputConstants.MOUSE_BUTTON_LEFT) {
renamingPanelHandler.openPanel();
return true;
}
return false;
})
.overlay(IKey.str("✎")
.asIcon()
.size(16))
.tooltip(new RichTooltip()
.addLine(IKey.lang("gui.gtceu.rename.desc")))));

panel.child(SlotGroupWidget.playerInventory(true).bottom(7));

return panel;
}

public boolean canRefund() {
return Arrays.stream(internalInventory).anyMatch(slot -> !slot.isEmpty());
}

@Override
public List<IPatternDetails> getAvailablePatterns() {
Expand Down Expand Up @@ -454,6 +567,10 @@ public boolean isFluidEmpty() {
return fluidInventory.isEmpty();
}

public boolean isEmpty() {
return isItemEmpty() && isFluidEmpty();
}

public void onContentsChanged() {
itemStacks = null;
fluidStacks = null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@
import com.gregtechceu.gtceu.api.machine.feature.IMachineLife;
import com.gregtechceu.gtceu.api.machine.multiblock.part.TieredIOPartMachine;
import com.gregtechceu.gtceu.api.machine.trait.RecipeHandlerList;
import com.gregtechceu.gtceu.api.mui.factory.PosGuiData;
import com.gregtechceu.gtceu.api.mui.value.sync.PanelSyncManager;
import com.gregtechceu.gtceu.client.mui.screen.ModularPanel;
import com.gregtechceu.gtceu.client.mui.screen.UISettings;
import com.gregtechceu.gtceu.integration.ae2.machine.trait.ProxySlotRecipeHandler;
import com.gregtechceu.gtceu.syncsystem.annotations.SaveField;
import com.gregtechceu.gtceu.syncsystem.annotations.SyncToClient;
Expand Down Expand Up @@ -91,13 +95,11 @@ public boolean shouldOpenUI(Player player, InteractionHand hand, BlockHitResult
return getBuffer() != null;
}

/*
* @Override
* public ModularUI createUI(Player entityPlayer) {
* assert getBuffer() != null; // UI should never be able to be opened when buffer is null
* return getBuffer().createUI(entityPlayer);
* }
*/
@Override
public ModularPanel buildUI(PosGuiData data, PanelSyncManager syncManager, UISettings settings) {
assert getBuffer() != null;
return getBuffer().buildUI(data, syncManager, settings);
}

@Override
public void onMachineRemoved() {
Expand Down
Loading