Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
80c036a
stuff
serenibyss Dec 10, 2023
0ecf58e
group slots, fix shift clicking
serenibyss Dec 10, 2023
73bdff2
clean up toggle buttons
serenibyss Dec 10, 2023
a45911e
cleanups
serenibyss Dec 10, 2023
d3b6537
2.4 fix
serenibyss Dec 17, 2023
aa1c706
Logo as part of GTGuiTheme
serenibyss Dec 17, 2023
d785613
clickable progress bar (partial)
serenibyss Dec 17, 2023
da6bd38
finish previous commit
serenibyss Dec 17, 2023
fa9423f
fix progress bar sync
serenibyss Dec 17, 2023
f8d55ce
fix button/toggle button theme builder calls
serenibyss Dec 17, 2023
f74621c
fix rebase
ghzdude Feb 28, 2025
c02e0cb
move mui2 related methods into builder
ghzdude Feb 28, 2025
c038912
use unary operator instead
ghzdude Feb 28, 2025
de0abd8
port arc, assembler, autoclave
ghzdude Feb 28, 2025
b3111c1
spotless
ghzdude Feb 28, 2025
c3e29f3
simplify builder to modify map ui directly
ghzdude Feb 28, 2025
47a6d1f
move back to consumer
ghzdude Feb 28, 2025
1e80d1e
add comment clarifying null supression
ghzdude May 17, 2025
986e562
set mui2 for map ui
ghzdude May 17, 2025
5f836dd
use progress value directly in widget
ghzdude May 17, 2025
1464e89
rework slot overlay methods
ghzdude May 19, 2025
99f9c7e
port steam machines to mui2
ghzdude May 19, 2025
1343a78
actually port steam machines to mui2
ghzdude May 19, 2025
93be426
port singleblock generators to mui2
ghzdude May 19, 2025
0fa918b
spotless
ghzdude May 19, 2025
f82e897
improve/cleanup existing mui2 code
ghzdude May 19, 2025
fb726d9
spotless
ghzdude May 19, 2025
8956506
null check ui builder and simplify
ghzdude May 19, 2025
5fd3a98
Actually merge master in properly :facepalm:
Zorbatron Jul 2, 2025
90aeafe
remove old ui code from SteamBoiler and extending classes
ghzdude Aug 15, 2025
e569fda
fix SteamLavaBoiler lava fluid slot
ghzdude Aug 15, 2025
66f11b4
use `slotOverlay()` directly
ghzdude Aug 15, 2025
7022f65
rename mui2 special drawable
ghzdude Aug 15, 2025
fb895d5
rename mui2 special drawable and method
ghzdude Aug 15, 2025
ec8b808
remove irrelevant todo
ghzdude Aug 15, 2025
fa36420
remove commented code
ghzdude Aug 15, 2025
8153cb6
actually sync the sync value and remove todo
ghzdude Aug 15, 2025
6ba5df3
spotless
ghzdude Aug 15, 2025
8712ea0
initial rework of `addInventorySlotGroup()` for mui2
ghzdude Aug 17, 2025
5ec6db6
more work on the rewrite
ghzdude Aug 18, 2025
615f324
use modular panel instead of redundant parent widget
ghzdude Sep 20, 2025
2b2c110
rework mostly done
ghzdude Sep 27, 2025
d605b65
clean + spotless
ghzdude Sep 27, 2025
8405bc6
cleanup pt 2
ghzdude Sep 28, 2025
42ac7af
fix no energy indicator
ghzdude Sep 28, 2025
06e7563
replace special texture with a widget consumer
ghzdude Sep 28, 2025
62e9357
fix special textures
ghzdude Sep 28, 2025
15e8bd5
remove if condition for simple machines
ghzdude Sep 28, 2025
bcc4100
increase progress widget margin
ghzdude Sep 29, 2025
50e402a
improve centering slots around progress widget
ghzdude Sep 29, 2025
db93ac9
improve item/fluid groups
ghzdude Sep 29, 2025
f6d6b1d
make `setSize()` a builder method
ghzdude Sep 29, 2025
5c2a656
create CalculatedGrid to simplify and cleanup logic
ghzdude Sep 30, 2025
353212d
fix logo in SimpleGeneratorMetaTileEntity
ghzdude Sep 30, 2025
2c3cb8f
remove unused field
ghzdude Oct 16, 2025
1b226d5
fix rebase
ghzdude Nov 13, 2025
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
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import gregtech.api.gui.ModularUI;
import gregtech.api.gui.widgets.LabelWidget;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.mui.GTGuiTextures;
import gregtech.api.recipes.RecipeMap;
import gregtech.client.renderer.ICubeRenderer;
import gregtech.client.renderer.texture.Textures;
Expand All @@ -28,10 +29,17 @@
import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import com.cleanroommc.modularui.api.drawable.IKey;
import com.cleanroommc.modularui.factory.PosGuiData;
import com.cleanroommc.modularui.screen.ModularPanel;
import com.cleanroommc.modularui.screen.UISettings;
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
import com.cleanroommc.modularui.widget.Widget;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.List;
import java.util.Objects;
import java.util.function.Function;

public class SimpleGeneratorMetaTileEntity extends WorkableTieredMetaTileEntity implements IActiveOutputSide {
Expand Down Expand Up @@ -128,6 +136,40 @@ protected void renderOverlays(CCRenderState renderState, Matrix4 translation, IV
workable.isWorkingEnabled());
}

@Override
public boolean usesMui2() {
RecipeMap<?> map = getRecipeMap();
return map != null && map.getRecipeMapUI().usesMui2();
}

@Override
public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) {
RecipeMap<?> workableRecipeMap = Objects.requireNonNull(workable.getRecipeMap(), "recipe map is null");
int yOffset = 0;
if (workableRecipeMap.getMaxInputs() >= 6 || workableRecipeMap.getMaxFluidInputs() >= 6 ||
workableRecipeMap.getMaxOutputs() >= 6 || workableRecipeMap.getMaxFluidOutputs() >= 6) {
yOffset = FONT_HEIGHT;
}

ModularPanel panel = workableRecipeMap.getRecipeMapUI()
.setSize(176, 166 + yOffset)
.constructPanel(this, workable::getProgressPercent,
importItems, exportItems,
importFluids, exportFluids,
yOffset, panelSyncManager)
.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5))
.bindPlayerInventory();

if (exportItems.getSlots() + exportFluids.getTanks() <= 9) {
panel.child(new Widget<>()
.size(17)
.right(7)
.top(45 + yOffset)
.background(GTGuiTextures.getLogo(getUITheme())));
}
return panel;
}

@Override
protected ModularUI createUI(EntityPlayer entityPlayer) {
return createGuiTemplate(entityPlayer).build(getHolder(), entityPlayer);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,10 @@
import gregtech.api.gui.GuiTextures;
import gregtech.api.gui.ModularUI;
import gregtech.api.gui.resources.TextureArea;
import gregtech.api.gui.widgets.GhostCircuitSlotWidget;
import gregtech.api.gui.widgets.ImageWidget;
import gregtech.api.gui.widgets.LabelWidget;
import gregtech.api.gui.widgets.SlotWidget;
import gregtech.api.gui.widgets.ToggleButtonWidget;
import gregtech.api.items.itemhandlers.GTItemStackHandler;
import gregtech.api.metatileentity.interfaces.IGregTechTileEntity;
import gregtech.api.mui.GTGuiTextures;
import gregtech.api.mui.widget.GhostCircuitSlotWidget;
import gregtech.api.recipes.RecipeMap;
import gregtech.api.util.GTTransferUtils;
import gregtech.api.util.GTUtility;
Expand Down Expand Up @@ -54,11 +51,24 @@
import codechicken.lib.render.CCRenderState;
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import com.cleanroommc.modularui.api.drawable.IKey;
import com.cleanroommc.modularui.factory.PosGuiData;
import com.cleanroommc.modularui.screen.ModularPanel;
import com.cleanroommc.modularui.screen.UISettings;
import com.cleanroommc.modularui.value.sync.BooleanSyncValue;
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
import com.cleanroommc.modularui.value.sync.SyncHandlers;
import com.cleanroommc.modularui.widget.Widget;
import com.cleanroommc.modularui.widgets.SlotGroupWidget;
import com.cleanroommc.modularui.widgets.ToggleButton;
import com.cleanroommc.modularui.widgets.layout.Flow;
import com.cleanroommc.modularui.widgets.slot.ItemSlot;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.function.Function;

import static gregtech.api.capability.GregtechDataCodes.*;
Expand Down Expand Up @@ -478,6 +488,92 @@ public void clearMachineInventory(@NotNull List<@NotNull ItemStack> itemBuffer)
clearInventory(itemBuffer, chargerInventory);
}

@Override
public boolean usesMui2() {
RecipeMap<?> map = getRecipeMap();
return map != null && map.getRecipeMapUI().usesMui2();
}

@Override
public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) {
RecipeMap<?> workableRecipeMap = Objects.requireNonNull(workable.getRecipeMap(), "recipe map is null");
int yOffset = 0;
if (workableRecipeMap.getMaxInputs() >= 6 || workableRecipeMap.getMaxFluidInputs() >= 6 ||
workableRecipeMap.getMaxOutputs() >= 6 || workableRecipeMap.getMaxFluidOutputs() >= 6) {
yOffset = FONT_HEIGHT;
}

Flow col = Flow.column()
.name("col:special.buttons")
.right(7).bottom(7)
.height(18 * 4 + 4)
.width(18);

BooleanSyncValue hasEnergy = new BooleanSyncValue(workable::isHasNotEnoughEnergy);
panelSyncManager.syncValue("has_energy", hasEnergy);

ModularPanel panel = workableRecipeMap.getRecipeMapUI()
.setSize(176 + 20, 166 + yOffset)
.constructPanel(this, workable::getProgressPercent,
importItems, exportItems,
importFluids, exportFluids,
yOffset, panelSyncManager)
.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5))
.child(GTGuiTextures.INDICATOR_NO_ENERGY.asWidget()
.name("energy.indicator")
.size(18)
.alignX(0.5f)
.top(42 + yOffset + 18)
.setEnabledIf($ -> hasEnergy.getBoolValue()))
.child(col)
.child(SlotGroupWidget.playerInventory(true).left(7));

if (exportItems.getSlots() > 0) {
col.child(new ToggleButton()
.overlay(GTGuiTextures.BUTTON_ITEM_OUTPUT)
.value(new BooleanSyncValue(() -> autoOutputItems, val -> autoOutputItems = val))
.addTooltip(true, IKey.lang("gregtech.gui.item_auto_output.tooltip.enabled"))
.addTooltip(false, IKey.lang("gregtech.gui.item_auto_output.tooltip.disabled")));
}

if (exportFluids.getTanks() > 0) {
col.child(new ToggleButton()
.overlay(GTGuiTextures.BUTTON_FLUID_OUTPUT)
.value(new BooleanSyncValue(() -> autoOutputFluids, val -> autoOutputFluids = val))
.addTooltip(true, IKey.lang("gregtech.gui.fluid_auto_output.tooltip.enabled"))
.addTooltip(false, IKey.lang("gregtech.gui.fluid_auto_output.tooltip.disabled")));
}

col.child(new ItemSlot()
.name("charger.slot")
.slot(SyncHandlers.itemSlot(chargerInventory, 0))
.background(GTGuiTextures.SLOT, GTGuiTextures.CHARGER_OVERLAY)
.bottom(18 + 4)
.addTooltipLine(IKey.lang("gregtech.gui.charger_slot.tooltip",
GTValues.VNF[getTier()], GTValues.VNF[getTier()])));

col.child(new Widget<>()
.size(17)
.marginTop(1)
.marginRight(1)
.top(-17 - 2)
.background(GTGuiTextures.getLogo(getUITheme())));

if (hasGhostCircuitInventory() && circuitInventory != null) {
col.child(new GhostCircuitSlotWidget()
.bottom(0)
.slot(circuitInventory, 0)
.background(GTGuiTextures.SLOT, GTGuiTextures.INT_CIRCUIT_OVERLAY));
}
return panel;
}

@Override
protected ModularUI createUI(EntityPlayer entityPlayer) {
return createGuiTemplate(entityPlayer).build(getHolder(), entityPlayer);
}

@Deprecated
protected ModularUI.Builder createGuiTemplate(EntityPlayer player) {
RecipeMap<?> workableRecipeMap = workable.getRecipeMap();
int yOffset = 0;
Expand All @@ -489,38 +585,42 @@ protected ModularUI.Builder createGuiTemplate(EntityPlayer player) {
ModularUI.Builder builder = workableRecipeMap.getRecipeMapUI()
.createUITemplate(workable::getProgressPercent, importItems, exportItems, importFluids, exportFluids,
yOffset)
.widget(new LabelWidget(5, 5, getMetaFullName()))
.widget(new SlotWidget(chargerInventory, 0, 79, 62 + yOffset, true, true, false)
.setBackgroundTexture(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY)
.setTooltipText("gregtech.gui.charger_slot.tooltip", GTValues.VNF[getTier()],
GTValues.VNF[getTier()]))
.widget(new ImageWidget(79, 42 + yOffset, 18, 18, GuiTextures.INDICATOR_NO_ENERGY).setIgnoreColor(true)
.setPredicate(workable::isHasNotEnoughEnergy))
.widget(new gregtech.api.gui.widgets.LabelWidget(5, 5, getMetaFullName()))
.widget(new gregtech.api.gui.widgets.SlotWidget(chargerInventory, 0, 79, 62 + yOffset, true, true,
false)
.setBackgroundTexture(GuiTextures.SLOT, GuiTextures.CHARGER_OVERLAY)
.setTooltipText("gregtech.gui.charger_slot.tooltip", GTValues.VNF[getTier()],
GTValues.VNF[getTier()]))
.widget(new gregtech.api.gui.widgets.ImageWidget(79, 42 + yOffset, 18, 18,
GuiTextures.INDICATOR_NO_ENERGY).setIgnoreColor(true)
.setPredicate(workable::isHasNotEnoughEnergy))
.bindPlayerInventory(player.inventory, GuiTextures.SLOT, yOffset);

int leftButtonStartX = 7;

if (exportItems.getSlots() > 0) {
builder.widget(new ToggleButtonWidget(leftButtonStartX, 62 + yOffset, 18, 18,
builder.widget(new gregtech.api.gui.widgets.ToggleButtonWidget(leftButtonStartX, 62 + yOffset, 18, 18,
GuiTextures.BUTTON_ITEM_OUTPUT, this::isAutoOutputItems, this::setAutoOutputItems)
.setTooltipText("gregtech.gui.item_auto_output.tooltip")
.shouldUseBaseBackground());
leftButtonStartX += 18;
}
if (exportFluids.getTanks() > 0) {
builder.widget(new ToggleButtonWidget(leftButtonStartX, 62 + yOffset, 18, 18,
builder.widget(new gregtech.api.gui.widgets.ToggleButtonWidget(leftButtonStartX, 62 + yOffset, 18, 18,
GuiTextures.BUTTON_FLUID_OUTPUT, this::isAutoOutputFluids, this::setAutoOutputFluids)
.setTooltipText("gregtech.gui.fluid_auto_output.tooltip")
.shouldUseBaseBackground());
}

if (exportItems.getSlots() + exportFluids.getTanks() <= 9) {
ImageWidget logo = new ImageWidget(152, 63 + yOffset, 17, 17,
gregtech.api.gui.widgets.ImageWidget logo = new gregtech.api.gui.widgets.ImageWidget(152, 63 + yOffset, 17,
17,
GTValues.XMAS.get() ? getXmasLogo() : getLogo()).setIgnoreColor(true);

if (this.circuitInventory != null) {
SlotWidget circuitSlot = new GhostCircuitSlotWidget(circuitInventory, 0, 124, 62 + yOffset)
.setBackgroundTexture(GuiTextures.SLOT, getCircuitSlotOverlay());
gregtech.api.gui.widgets.SlotWidget circuitSlot = new gregtech.api.gui.widgets.GhostCircuitSlotWidget(
circuitInventory, 0, 124, 62 + yOffset)
.setBackgroundTexture(GuiTextures.SLOT, getCircuitSlotOverlay());
builder.widget(circuitSlot.setConsumer(this::getCircuitSlotTooltip)).widget(logo);
}
}
Expand All @@ -546,7 +646,7 @@ protected TextureArea getCircuitSlotOverlay() {
}

// Method provided to override
protected void getCircuitSlotTooltip(SlotWidget widget) {
protected void getCircuitSlotTooltip(gregtech.api.gui.widgets.SlotWidget widget) {
String configString;
if (circuitInventory == null || circuitInventory.getCircuitValue() == GhostCircuitItemStackHandler.NO_CONFIG) {
configString = new TextComponentTranslation("gregtech.gui.configurator_slot.no_value").getFormattedText();
Expand All @@ -557,11 +657,6 @@ protected void getCircuitSlotTooltip(SlotWidget widget) {
widget.setTooltipText("gregtech.gui.configurator_slot.tooltip", configString);
}

@Override
protected ModularUI createUI(EntityPlayer entityPlayer) {
return createGuiTemplate(entityPlayer).build(getHolder(), entityPlayer);
}

@Override
public void addInformation(ItemStack stack, @Nullable World player, List<String> tooltip, boolean advanced) {
super.addInformation(stack, player, tooltip, advanced);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import gregtech.api.gui.GuiTextures;
import gregtech.api.gui.ModularUI;
import gregtech.api.gui.widgets.ImageWidget;
import gregtech.api.mui.GTGuiTheme;
import gregtech.api.recipes.RecipeMap;
import gregtech.api.util.GTUtility;
import gregtech.client.particle.VanillaParticleEffects;
Expand All @@ -22,7 +23,12 @@
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.SoundEvents;
import net.minecraft.item.ItemStack;
import net.minecraft.util.*;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.EnumHand;
import net.minecraft.util.EnumParticleTypes;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundCategory;
import net.minecraft.util.SoundEvent;
import net.minecraft.util.math.BlockPos;
import net.minecraft.world.World;
import net.minecraftforge.fluids.FluidTank;
Expand All @@ -34,6 +40,11 @@
import codechicken.lib.render.pipeline.ColourMultiplier;
import codechicken.lib.render.pipeline.IVertexOperation;
import codechicken.lib.vec.Matrix4;
import com.cleanroommc.modularui.api.drawable.IKey;
import com.cleanroommc.modularui.factory.PosGuiData;
import com.cleanroommc.modularui.screen.ModularPanel;
import com.cleanroommc.modularui.screen.UISettings;
import com.cleanroommc.modularui.value.sync.PanelSyncManager;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.tuple.Pair;
import org.jetbrains.annotations.Nullable;
Expand All @@ -43,6 +54,8 @@

public abstract class SteamMetaTileEntity extends MetaTileEntity {

// todo quick and dirty fix to not show input tank in ui, find better solution
protected static final FluidTankList EMPTY = new FluidTankList(false);
protected static final int STEAM_CAPACITY = 16000;

protected final boolean isHighPressure;
Expand Down Expand Up @@ -127,6 +140,31 @@ public FluidTankList createImportFluidHandler() {
return new FluidTankList(false, steamFluidTank);
}

@Override
public boolean usesMui2() {
RecipeMap<?> map = getRecipeMap();
return map != null && map.getRecipeMapUI().usesMui2();
}

@Override
public ModularPanel buildUI(PosGuiData guiData, PanelSyncManager panelSyncManager, UISettings settings) {
RecipeMap<?> map = Objects.requireNonNull(getRecipeMap());

// todo remove logo from background and use a widget
return map.getRecipeMapUI()
.constructPanel(this, workableHandler::getProgressPercent,
importItems, exportItems,
EMPTY, exportFluids,
0, panelSyncManager)
.child(IKey.lang(getMetaFullName()).asWidget().pos(5, 5))
.bindPlayerInventory();
}

@Override
public GTGuiTheme getUITheme() {
return isHighPressure ? GTGuiTheme.STEEL : GTGuiTheme.BRONZE;
}

public ModularUI.Builder createUITemplate(EntityPlayer player) {
return ModularUI.builder(GuiTextures.BACKGROUND_STEAM.get(isHighPressure), 176, 166)
.label(6, 6, getMetaFullName()).shouldColor(false)
Expand Down
4 changes: 3 additions & 1 deletion src/main/java/gregtech/api/mui/GTGuiTheme.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package gregtech.api.mui;

import gregtech.api.GTValues;
import gregtech.api.cover.CoverWithUI;
import gregtech.common.ConfigHolder;

Expand All @@ -21,7 +22,7 @@
import java.util.function.Consumer;
import java.util.function.Supplier;

import static gregtech.api.mui.GTGuiTextures.*;
import static gregtech.api.mui.GTGuiTextures.IDs;

public class GTGuiTheme {

Expand Down Expand Up @@ -56,6 +57,7 @@ private static String gregtech(String s) {
.simpleToggleButton(IDs.STANDARD_BUTTON,
IDs.STANDARD_SLOT,
ConfigHolder.client.defaultUIColor)
.logo(() -> GTValues.XMAS.get() ? GTGuiTextures.GREGTECH_LOGO_XMAS : GTGuiTextures.GREGTECH_LOGO)
.build();

public static final GTGuiTheme COVER = templateBuilder(Names.COVER)
Expand Down
Loading
Loading