aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/api/metatileentity
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/api/metatileentity')
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java1
-rw-r--r--src/main/java/gregtech/api/metatileentity/BaseTileEntity.java412
-rw-r--r--src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java128
-rw-r--r--src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java151
-rw-r--r--src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java14
-rw-r--r--src/main/java/gregtech/api/metatileentity/MetaTileEntity.java166
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java65
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java9
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java323
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java12
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java15
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java92
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java95
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java56
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java9
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java67
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java75
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java18
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java117
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java85
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java65
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java154
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java111
-rw-r--r--src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java38
24 files changed, 1974 insertions, 304 deletions
diff --git a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
index ebf0672815..395c73570c 100644
--- a/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/BaseMetaTileEntity.java
@@ -1671,6 +1671,7 @@ public class BaseMetaTileEntity extends CommonMetaTileEntity
GT_Log.err.println(
"Encountered Exception while rightclicking TileEntity, the Game should've crashed now, but I prevented that. Please report immediately to GregTech Intergalactical!!!");
e.printStackTrace(GT_Log.err);
+ e.printStackTrace();
}
return false;
diff --git a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
index 1f6fb0c68d..23a247468a 100644
--- a/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/BaseTileEntity.java
@@ -7,25 +7,61 @@ import static gregtech.api.enums.GT_Values.NW;
import static gregtech.api.enums.GT_Values.SIDE_DOWN;
import static gregtech.api.enums.GT_Values.SIDE_UP;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ITileWithModularUI;
+import com.gtnewhorizons.modularui.api.screen.ModularUIContext;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
+import gregtech.GT_Mod;
+import gregtech.api.enums.Dyes;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddInventorySlots;
+import gregtech.api.interfaces.modularui.IGetGUITextureSet;
import gregtech.api.interfaces.tileentity.IGTEnet;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.interfaces.tileentity.IHasWorldObjectAndCoords;
import gregtech.api.interfaces.tileentity.IIC2Enet;
import gregtech.api.net.GT_Packet_Block_Event;
+import gregtech.api.net.GT_Packet_SetConfigurationCircuit;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.uifactory.SelectItemUIFactory;
import ic2.api.energy.event.EnergyTileLoadEvent;
import ic2.api.energy.event.EnergyTileUnloadEvent;
import java.util.Arrays;
+import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.Supplier;
import net.minecraft.block.Block;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.FontRenderer;
import net.minecraft.entity.Entity;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.init.Blocks;
import net.minecraft.inventory.IInventory;
+import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
import net.minecraft.util.ChunkCoordinates;
+import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.MathHelper;
+import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraft.world.biome.BiomeGenBase;
import net.minecraft.world.chunk.Chunk;
@@ -38,7 +74,14 @@ import net.minecraftforge.fluids.IFluidHandler;
* <p/>
* Basically everything a TileEntity should have.
*/
-public abstract class BaseTileEntity extends TileEntity implements IHasWorldObjectAndCoords, IIC2Enet, IGTEnet {
+public abstract class BaseTileEntity extends TileEntity
+ implements IHasWorldObjectAndCoords,
+ IIC2Enet,
+ IGTEnet,
+ ITileWithModularUI,
+ IAddGregtechLogo,
+ IGetGUITextureSet,
+ IAddInventorySlots {
protected boolean mInventoryChanged = false;
/**
@@ -138,11 +181,13 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje
}
@Override
+ @Deprecated
public final boolean openGUI(EntityPlayer aPlayer) {
return openGUI(aPlayer, 0);
}
@Override
+ @Deprecated
public final boolean openGUI(EntityPlayer aPlayer, int aID) {
if (aPlayer == null) return false;
aPlayer.openGui(GT, aID, worldObj, xCoord, yCoord, zCoord);
@@ -536,6 +581,37 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje
return GT_Utility.trans(aKey, aEnglish);
}
+ protected Supplier<Boolean> getValidator() {
+ return () -> !this.isDead();
+ }
+
+ public boolean useModularUI() {
+ return false;
+ }
+
+ @Override
+ public ModularWindow createWindow(UIBuildContext buildContext) {
+ if (!useModularUI()) return null;
+
+ buildContext.setValidator(getValidator());
+ final ModularWindow.Builder builder = ModularWindow.builder(getGUIWidth(), getGUIHeight());
+ builder.setBackground(getGUITextureSet().getMainBackground());
+ builder.setGuiTint(getGUIColorization());
+ if (doesBindPlayerInventory()) {
+ bindPlayerInventoryUI(builder, buildContext);
+ }
+ addUIWidgets(builder, buildContext);
+ addTitleToUI(builder);
+ addCoverTabs(builder, buildContext);
+ final IConfigurationCircuitSupport csc = getConfigurationCircuitSupport();
+ if (csc != null && csc.allowSelectCircuit()) {
+ addConfigurationCircuitSlot(builder);
+ } else {
+ addGregTechLogo(builder);
+ }
+ return builder.build();
+ }
+
/*
* IC2 Energy Compat
*/
@@ -571,4 +647,338 @@ public abstract class BaseTileEntity extends TileEntity implements IHasWorldObje
MinecraftForge.EVENT_BUS.post(new EnergyTileUnloadEvent(ic2EnergySink));
}
}
+
+ // === GUI stuff ===
+
+ public ItemStackHandler getInventoryHandler() {
+ return null;
+ }
+
+ protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+
+ // Tooltip localization keys
+ public static final String BATTERY_SLOT_TOOLTIP = "GT5U.machines.battery_slot.tooltip",
+ BATTERY_SLOT_TOOLTIP_ALT = "GT5U.machines.battery_slot.tooltip.alternative",
+ UNUSED_SLOT_TOOLTIP = "GT5U.machines.unused_slot.tooltip",
+ SPECIAL_SLOT_TOOLTIP = "GT5U.machines.special_slot.tooltip",
+ FLUID_INPUT_TOOLTIP = "GT5U.machines.fluid_input_slot.tooltip",
+ FLUID_OUTPUT_TOOLTIP = "GT5U.machines.fluid_output_slot.tooltip",
+ STALLED_STUTTERING_TOOLTIP = "GT5U.machines.stalled_stuttering.tooltip",
+ STALLED_VENT_TOOLTIP = "GT5U.machines.stalled_vent.tooltip",
+ FLUID_TRANSFER_TOOLTIP = "GT5U.machines.fluid_transfer.tooltip",
+ ITEM_TRANSFER_TOOLTIP = "GT5U.machines.item_transfer.tooltip",
+ POWER_SOURCE_KEY = "GT5U.machines.powersource.",
+ NEI_TRANSFER_STEAM_TOOLTIP = "GT5U.machines.nei_transfer.steam.tooltip",
+ NEI_TRANSFER_VOLTAGE_TOOLTIP = "GT5U.machines.nei_transfer.voltage.tooltip";
+
+ public static final int TOOLTIP_DELAY = 5;
+
+ /**
+ * Override this to add {@link com.gtnewhorizons.modularui.api.widget.Widget}s for your UI.
+ */
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {}
+
+ public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.bindPlayerInventory(
+ buildContext.getPlayer(), 7, getGUITextureSet().getItemSlot());
+ }
+
+ public String getLocalName() {
+ return "Unknown";
+ }
+
+ protected void addTitleToUI(ModularWindow.Builder builder) {
+ addTitleToUI(builder, getLocalName());
+ }
+
+ protected void addTitleToUI(ModularWindow.Builder builder, String title) {
+ if (GT_Mod.gregtechproxy.mTitleTabStyle == 2) {
+ addTitleItemIconStyle(builder, title);
+ } else {
+ addTitleTextStyle(builder, title);
+ }
+ }
+
+ protected void addTitleTextStyle(ModularWindow.Builder builder, String title) {
+ final int TAB_PADDING = 3;
+ final int TITLE_PADDING = 2;
+ int titleWidth = 0, titleHeight = 0;
+ if (NetworkUtils.isClient()) {
+ final FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
+ //noinspection unchecked
+ final List<String> titleLines =
+ fontRenderer.listFormattedStringToWidth(title, getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2);
+ titleWidth = titleLines.size() > 1
+ ? getGUIWidth() - (TAB_PADDING + TITLE_PADDING) * 2
+ : fontRenderer.getStringWidth(title);
+ //noinspection PointlessArithmeticExpression
+ titleHeight = titleLines.size() * fontRenderer.FONT_HEIGHT + (titleLines.size() - 1) * 1;
+ }
+
+ final DrawableWidget tab = new DrawableWidget();
+ final TextWidget text = new TextWidget(title)
+ .setDefaultColor(getTitleColor())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(titleWidth);
+ if (GT_Mod.gregtechproxy.mTitleTabStyle == 1) {
+ tab.setDrawable(getGUITextureSet().getTitleTabAngular())
+ .setPos(0, -(titleHeight + TAB_PADDING) + 1)
+ .setSize(getGUIWidth(), titleHeight + TAB_PADDING * 2);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight + TAB_PADDING);
+ } else {
+ tab.setDrawable(getGUITextureSet().getTitleTabDark())
+ .setPos(0, -(titleHeight + TAB_PADDING * 2) + 1)
+ .setSize(titleWidth + (TAB_PADDING + TITLE_PADDING) * 2, titleHeight + TAB_PADDING * 2 - 1);
+ text.setPos(TAB_PADDING + TITLE_PADDING, -titleHeight);
+ }
+ builder.widget(tab).widget(text);
+ }
+
+ protected void addTitleItemIconStyle(ModularWindow.Builder builder, String title) {
+ builder.widget(new MultiChildWidget()
+ .addChild(new DrawableWidget()
+ .setDrawable(getGUITextureSet().getTitleTabNormal())
+ .setPos(0, 0)
+ .setSize(24, 24))
+ .addChild(new ItemDrawable(getStackForm(1)).asWidget().setPos(4, 4))
+ .addTooltip(title)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(0, -24 + 3));
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ protected int getTitleColor() {
+ return COLOR_TITLE.get();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(getGUITextureSet().getGregTechLogo())
+ .setSize(17, 17)
+ .setPos(152, 63));
+ }
+
+ protected int getGUIWidth() {
+ return 176;
+ }
+
+ protected int getGUIHeight() {
+ return 166;
+ }
+
+ protected boolean doesBindPlayerInventory() {
+ return true;
+ }
+
+ @Override
+ public void add1by1Slot(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] {getGUITextureSet().getItemSlot()};
+ }
+ builder.widget(SlotGroup.ofItemHandler(inventoryHandler, 1)
+ .startFromSlot(0)
+ .endAtSlot(0)
+ .background(background)
+ .build()
+ .setPos(79, 34));
+ }
+
+ @Override
+ public void add2by2Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] {getGUITextureSet().getItemSlot()};
+ }
+ builder.widget(SlotGroup.ofItemHandler(inventoryHandler, 2)
+ .startFromSlot(0)
+ .endAtSlot(3)
+ .background(background)
+ .build()
+ .setPos(70, 25));
+ }
+
+ @Override
+ public void add3by3Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] {getGUITextureSet().getItemSlot()};
+ }
+ builder.widget(SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .startFromSlot(0)
+ .endAtSlot(8)
+ .background(background)
+ .build()
+ .setPos(61, 16));
+ }
+
+ @Override
+ public void add4by4Slots(ModularWindow.Builder builder, IDrawable... background) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (background.length == 0) {
+ background = new IDrawable[] {getGUITextureSet().getItemSlot()};
+ }
+ builder.widget(SlotGroup.ofItemHandler(inventoryHandler, 4)
+ .startFromSlot(0)
+ .endAtSlot(15)
+ .background(background)
+ .build()
+ .setPos(52, 7));
+ }
+
+ public void addCoverTabs(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ /* Do nothing */
+ }
+
+ public IConfigurationCircuitSupport getConfigurationCircuitSupport() {
+ if (!(this instanceof IConfigurationCircuitSupport)) return null;
+ return (IConfigurationCircuitSupport) this;
+ }
+
+ protected void addConfigurationCircuitSlot(ModularWindow.Builder builder) {
+ final ItemStackHandler inventoryHandler = getInventoryHandler();
+ if (inventoryHandler == null) return;
+
+ if (!(this instanceof IInventory)) return;
+ final IInventory inv = (IInventory) this;
+
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ final AtomicBoolean dialogOpened = new AtomicBoolean(false);
+ builder.widget(
+ new SlotWidget(new BaseSlot(inventoryHandler, ccs.getCircuitSlot(), true)) {
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ final ItemStack newCircuit;
+ if (clickData.shift) {
+ if (clickData.mouseButton == 0) {
+ if (NetworkUtils.isClient() && !dialogOpened.get()) {
+ openSelectCircuitDialog(getContext(), dialogOpened);
+ }
+ return;
+ } else {
+ newCircuit = null;
+ }
+ } else {
+ final List<ItemStack> tCircuits = ccs.getConfigurationCircuits();
+ final int index = GT_Utility.findMatchingStackInList(tCircuits, cursorStack);
+ if (index < 0) {
+ int curIndex = GT_Utility.findMatchingStackInList(
+ tCircuits, inv.getStackInSlot(ccs.getCircuitSlot()))
+ + 1;
+ if (clickData.mouseButton == 0) {
+ curIndex += 1;
+ } else {
+ curIndex -= 1;
+ }
+ curIndex = Math.floorMod(curIndex, tCircuits.size() + 1) - 1;
+ newCircuit = curIndex < 0 ? null : tCircuits.get(curIndex);
+ } else {
+ // set to whatever it is
+ newCircuit = tCircuits.get(index);
+ }
+ }
+ inv.setInventorySlotContents(ccs.getCircuitSlot(), newCircuit);
+ }
+
+ @Override
+ protected void phantomScroll(int direction) {
+ phantomClick(new ClickData(direction > 0 ? 1 : 0, false, false, false));
+ }
+
+ @Override
+ public List<String> getExtraTooltip() {
+ return Arrays.asList(
+ EnumChatFormatting.DARK_GRAY
+ + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal(
+ "GT5U.machines.select_circuit.tooltip.1")),
+ EnumChatFormatting.DARK_GRAY
+ + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal(
+ "GT5U.machines.select_circuit.tooltip.2")),
+ EnumChatFormatting.DARK_GRAY
+ + EnumChatFormatting.getTextWithoutFormattingCodes(
+ StatCollector.translateToLocal(
+ "GT5U.machines.select_circuit.tooltip.3")));
+ }
+ }.setOverwriteItemStackTooltip(list -> {
+ list.removeIf(line ->
+ line.contains(StatCollector.translateToLocal("gt.integrated_circuit.tooltip.0"))
+ || line.contains(
+ StatCollector.translateToLocal("gt.integrated_circuit.tooltip.1")));
+ return list;
+ })
+ .disableShiftInsert()
+ .setHandlePhantomActionClient(true)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_INT_CIRCUIT)
+ .setGTTooltip(() -> mTooltipCache.getData("GT5U.machines.select_circuit.tooltip"))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(ccs.getCircuitSlotX() - 1, ccs.getCircuitSlotY() - 1));
+ }
+
+ protected void openSelectCircuitDialog(ModularUIContext uiContext, AtomicBoolean dialogOpened) {
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ if (!(this instanceof IInventory)) return;
+ final IInventory inv = (IInventory) this;
+
+ final List<ItemStack> circuits = ccs.getConfigurationCircuits();
+ uiContext.openClientWindow(player -> new SelectItemUIFactory(
+ StatCollector.translateToLocal("GT5U.machines.select_circuit"),
+ getStackForm(0),
+ this::onCircuitSelected,
+ circuits,
+ GT_Utility.findMatchingStackInList(circuits, inv.getStackInSlot(ccs.getCircuitSlot())))
+ .setAnotherWindow(true, dialogOpened)
+ .setGuiTint(getGUIColorization())
+ .setCurrentGetter(() -> inv.getStackInSlot(ccs.getCircuitSlot()))
+ .createWindow(new UIBuildContext(player)));
+ }
+
+ protected void onCircuitSelected(ItemStack selected) {
+ final IConfigurationCircuitSupport ccs = getConfigurationCircuitSupport();
+ if (ccs == null) return;
+
+ if (!(this instanceof IInventory)) return;
+ final IInventory inv = (IInventory) this;
+
+ GT_Values.NW.sendToServer(new GT_Packet_SetConfigurationCircuit(this, selected));
+ // we will not do any validation on client side
+ // it doesn't get to actually decide what inventory contains anyway
+ inv.setInventorySlotContents(ccs.getCircuitSlot(), selected);
+ }
+
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ return defaultColor;
+ }
+
+ protected Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x404040);
+ protected Supplier<Integer> COLOR_TITLE_WHITE = () -> getTextColorOrDefault("title_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_WHITE = () -> getTextColorOrDefault("text_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x404040);
+ protected Supplier<Integer> COLOR_TEXT_RED = () -> getTextColorOrDefault("text_red", 0xff0000);
+
+ public int getGUIColorization() {
+ return GT_Util.getRGBaInt(Dyes.dyeWhite.getRGBA());
+ }
+
+ public ItemStack getStackForm(long aAmount) {
+ return null;
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java
index bf835b51bb..e2860d6292 100644
--- a/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/CommonMetaTileEntity.java
@@ -2,9 +2,18 @@ package gregtech.api.metatileentity;
import static gregtech.GT_Mod.GT_FML_LOGGER;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
+import gregtech.api.interfaces.modularui.IBindPlayerInventoryUI;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.util.GT_Log;
@@ -167,4 +176,123 @@ public abstract class CommonMetaTileEntity extends CoverableTileEntity implement
final IMetaTileEntity meta = getMetaTileEntity();
return meta != null && meta.shouldJoinIc2Enet();
}
+
+ /*
+ * Modular UI Support
+ */
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IAddUIWidgets) {
+ ((IAddUIWidgets) getMetaTileEntity()).addUIWidgets(builder, buildContext);
+ return;
+ }
+ super.addUIWidgets(builder, buildContext);
+ }
+
+ @Override
+ public void bindPlayerInventoryUI(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IBindPlayerInventoryUI) {
+ ((IBindPlayerInventoryUI) getMetaTileEntity()).bindPlayerInventoryUI(builder, buildContext);
+ return;
+ }
+ super.bindPlayerInventoryUI(builder, buildContext);
+ }
+
+ @Override
+ public IConfigurationCircuitSupport getConfigurationCircuitSupport() {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IConfigurationCircuitSupport) {
+ return (IConfigurationCircuitSupport) getMetaTileEntity();
+ }
+ return null;
+ }
+
+ @Override
+ public ItemStackHandler getInventoryHandler() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getInventoryHandler();
+ }
+ return null;
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return hasValidMetaTileEntity() && getMetaTileEntity().useModularUI();
+ }
+
+ @Override
+ public String getLocalName() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getLocalName();
+ return super.getLocalName();
+ }
+
+ @Override
+ protected int getGUIWidth() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getGUIWidth();
+
+ return super.getGUIWidth();
+ }
+
+ @Override
+ protected int getGUIHeight() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().getGUIHeight();
+
+ return super.getGUIHeight();
+ }
+
+ @Override
+ protected boolean doesBindPlayerInventory() {
+ if (hasValidMetaTileEntity()) return getMetaTileEntity().doesBindPlayerInventory();
+
+ return super.doesBindPlayerInventory();
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IAddGregtechLogo) {
+ ((IAddGregtechLogo) getMetaTileEntity()).addGregTechLogo(builder);
+ return;
+ }
+ super.addGregTechLogo(builder);
+ }
+
+ @Override
+ public ItemStack getStackForm(long aAmount) {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getStackForm(aAmount);
+ }
+ return super.getStackForm(aAmount);
+ }
+
+ @Override
+ public int getTitleColor() {
+ if (hasValidMetaTileEntity() && getMetaTileEntity() instanceof IGetTitleColor) {
+ return ((IGetTitleColor) getMetaTileEntity()).getTitleColor();
+ }
+ return super.getTitleColor();
+ }
+
+ @Override
+ public int getGUIColorization() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getGUIColorization();
+ }
+ return super.getGUIColorization();
+ }
+
+ @Override
+ protected int getTextColorOrDefault(String textType, int defaultColor) {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getTextColorOrDefault(textType, defaultColor);
+ }
+ return defaultColor;
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ if (hasValidMetaTileEntity()) {
+ return getMetaTileEntity().getGUITextureSet();
+ }
+ return super.getGUITextureSet();
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
index 9511488a3f..580fc136e6 100644
--- a/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/CoverableTileEntity.java
@@ -6,31 +6,52 @@ import static gregtech.api.enums.GT_Values.NW;
import static gregtech.api.util.GT_LanguageManager.FACES;
import static gregtech.api.util.GT_LanguageManager.getTranslation;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.ItemDrawable;
+import com.gtnewhorizons.modularui.api.math.MainAxisAlignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.Column;
+import com.gtnewhorizons.modularui.common.widget.MultiChildWidget;
+import cpw.mods.fml.relauncher.Side;
+import cpw.mods.fml.relauncher.SideOnly;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
+import gregtech.api.enums.GT_Values;
import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_CoverUIBuildContext;
+import gregtech.api.gui.modularui.GUITextureSet;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.ICoverable;
import gregtech.api.interfaces.tileentity.IGregtechWailaProvider;
import gregtech.api.net.GT_Packet_RequestCoverData;
import gregtech.api.net.GT_Packet_SendCoverData;
+import gregtech.api.net.GT_Packet_TileEntityCoverGUI;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.util.GT_CoverBehavior;
import gregtech.api.util.GT_CoverBehaviorBase;
import gregtech.api.util.ISerializableObject;
import gregtech.common.GT_Client;
import gregtech.common.covers.GT_Cover_Fluidfilter;
+import java.util.ArrayList;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.stream.IntStream;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
+import net.minecraft.client.Minecraft;
import net.minecraft.entity.item.EntityItem;
+import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
+import net.minecraft.util.EnumChatFormatting;
+import net.minecraft.util.StatCollector;
import net.minecraft.world.World;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidRegistry;
@@ -526,4 +547,134 @@ public abstract class CoverableTileEntity extends BaseTileEntity implements ICov
}
}
}
+
+ protected ModularWindow createCoverWindow(EntityPlayer player, byte side) {
+ final GT_CoverBehaviorBase<?> coverBehavior = getCoverBehaviorAtSideNew(side);
+ final GT_CoverUIBuildContext buildContext =
+ new GT_CoverUIBuildContext(player, getCoverIDAtSide(side), side, this, true);
+ return coverBehavior.createWindow(buildContext);
+ }
+
+ protected static final int COVER_WINDOW_ID_START = 1;
+
+ @Override
+ public void addCoverTabs(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final int COVER_TAB_LEFT = -16,
+ COVER_TAB_TOP = 1,
+ COVER_TAB_HEIGHT = 20,
+ COVER_TAB_WIDTH = 18,
+ COVER_TAB_SPACING = 2,
+ ICON_SIZE = 16;
+ final boolean flipHorizontally = GT_Mod.gregtechproxy.mCoverTabsFlipped;
+
+ final Column columnWidget = new Column();
+ builder.widget(columnWidget);
+ final int xPos = flipHorizontally ? (getGUIWidth() - COVER_TAB_LEFT - COVER_TAB_WIDTH) : COVER_TAB_LEFT;
+ if (GT_Mod.gregtechproxy.mCoverTabsVisible) {
+ columnWidget.setPos(xPos, COVER_TAB_TOP).setEnabled(widget -> ((Column) widget)
+ .getChildren().stream().anyMatch(Widget::isEnabled));
+ } else {
+ columnWidget.setEnabled(false);
+ }
+ columnWidget.setAlignment(MainAxisAlignment.SPACE_BETWEEN).setSpace(COVER_TAB_SPACING);
+
+ for (ForgeDirection direction : ForgeDirection.VALID_DIRECTIONS) {
+ final byte side = (byte) direction.ordinal();
+ buildContext.addSyncedWindow(side + COVER_WINDOW_ID_START, player -> createCoverWindow(player, side));
+ columnWidget.addChild(new MultiChildWidget()
+ .addChild(
+ new ButtonWidget() {
+ @Override
+ public IDrawable[] getBackground() {
+ final List<IDrawable> backgrounds = new ArrayList<>();
+ final GUITextureSet tabIconSet = getGUITextureSet();
+
+ if (getCoverBehaviorAtSideNew(side).hasCoverGUI()) {
+ if (isHovering()) {
+ backgrounds.add(
+ flipHorizontally
+ ? tabIconSet.getCoverTabHighlightFlipped()
+ : tabIconSet.getCoverTabHighlight());
+ } else {
+ backgrounds.add(
+ flipHorizontally
+ ? tabIconSet.getCoverTabNormalFlipped()
+ : tabIconSet.getCoverTabNormal());
+ }
+ } else {
+ backgrounds.add(
+ flipHorizontally
+ ? tabIconSet.getCoverTabDisabledFlipped()
+ : tabIconSet.getCoverTabDisabled());
+ }
+ return backgrounds.toArray(new IDrawable[] {});
+ }
+ }.setOnClick((clickData, widget) -> onTabClicked(clickData, widget, side))
+ .dynamicTooltip(() -> getCoverTabTooltip(side))
+ .setSize(COVER_TAB_WIDTH, COVER_TAB_HEIGHT))
+ .addChild(new ItemDrawable(() -> {
+ return getCoverItemAtSide(side);
+ })
+ .asWidget()
+ .setPos(
+ (COVER_TAB_WIDTH - ICON_SIZE) / 2 + (flipHorizontally ? -1 : 1),
+ (COVER_TAB_HEIGHT - ICON_SIZE) / 2))
+ .setEnabled(widget -> {
+ return getCoverItemAtSide(side) != null;
+ }));
+ }
+ }
+
+ @SideOnly(Side.CLIENT)
+ protected List<String> getCoverTabTooltip(byte side) {
+ final String[] SIDE_TOOLTIPS = new String[] {
+ "GT5U.interface.coverTabs.down",
+ "GT5U.interface.coverTabs.up",
+ "GT5U.interface.coverTabs.north",
+ "GT5U.interface.coverTabs.south",
+ "GT5U.interface.coverTabs.west",
+ "GT5U.interface.coverTabs.east"
+ };
+ final ItemStack coverItem = getCoverItemAtSide(side);
+ if (coverItem == null) return Collections.emptyList();
+ boolean coverHasGUI = getCoverBehaviorAtSideNew(side).hasCoverGUI();
+
+ //noinspection unchecked
+ List<String> tooltip = coverItem.getTooltip(Minecraft.getMinecraft().thePlayer, true);
+ for (int i = 0; i < tooltip.size(); i++) {
+ if (i == 0) {
+ tooltip.set(
+ 0,
+ (coverHasGUI ? EnumChatFormatting.UNDERLINE : EnumChatFormatting.DARK_GRAY)
+ + StatCollector.translateToLocal(SIDE_TOOLTIPS[side])
+ + (coverHasGUI ? EnumChatFormatting.RESET + ": " : ": " + EnumChatFormatting.RESET)
+ + tooltip.get(0));
+ } else {
+ tooltip.set(i, EnumChatFormatting.GRAY + tooltip.get(i));
+ }
+ }
+ return tooltip;
+ }
+
+ protected void onTabClicked(Widget.ClickData clickData, Widget widget, byte side) {
+ if (isClientSide()) return;
+
+ final GT_CoverBehaviorBase<?> coverBehavior = getCoverBehaviorAtSideNew(side);
+ if (coverBehavior.useModularUI()) {
+ widget.getContext().openSyncedWindow(side + COVER_WINDOW_ID_START);
+ } else {
+ final GT_Packet_TileEntityCoverGUI packet = new GT_Packet_TileEntityCoverGUI(
+ getXCoord(),
+ getYCoord(),
+ getZCoord(),
+ side,
+ getCoverIDAtSide(side),
+ getComplexCoverDataAtSide(side),
+ getWorld().provider.dimensionId,
+ widget.getContext().getPlayer().getEntityId(),
+ 0);
+ GT_Values.NW.sendToPlayer(
+ packet, (EntityPlayerMP) widget.getContext().getPlayer());
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java
index 105ec073ec..ff9ac7517d 100644
--- a/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/MetaPipeEntity.java
@@ -8,6 +8,7 @@ import cpw.mods.fml.relauncher.SideOnly;
import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
import gregtech.api.interfaces.metatileentity.IConnectable;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IColoredTileEntity;
@@ -1047,4 +1048,17 @@ public abstract class MetaPipeEntity implements IMetaTileEntity, IConnectable {
}
public void reloadLocks() {}
+
+ @Override
+ public int getGUIColorization() {
+ Dyes dye = Dyes.dyeWhite;
+ if (GregTech_API.sColoredGUI) {
+ if (GregTech_API.sMachineMetalGUI) {
+ dye = Dyes.MACHINE_METAL;
+ } else if (getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ }
+ }
+ return GT_Util.getRGBInt(dye.getRGBA());
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
index 5c8f1c33bb..586b52fd99 100644
--- a/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
+++ b/src/main/java/gregtech/api/metatileentity/MetaTileEntity.java
@@ -6,14 +6,19 @@ import appeng.api.networking.energy.IEnergyGrid;
import appeng.api.networking.pathing.IPathingGrid;
import appeng.api.util.AECableType;
import appeng.me.helpers.AENetworkProxy;
+import com.gtnewhorizons.modularui.api.forge.ItemStackHandler;
import cpw.mods.fml.common.Optional;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import gnu.trove.list.TIntList;
import gnu.trove.list.array.TIntArrayList;
import gregtech.api.GregTech_API;
+import gregtech.api.enums.Dyes;
import gregtech.api.enums.SoundResource;
-import gregtech.api.interfaces.metatileentity.IConfigurationCircuitSupport;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GUITextureSet;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
import gregtech.api.interfaces.metatileentity.IMachineCallback;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
@@ -23,12 +28,15 @@ import gregtech.api.util.GT_Config;
import gregtech.api.util.GT_LanguageManager;
import gregtech.api.util.GT_Log;
import gregtech.api.util.GT_ModHandler;
+import gregtech.api.util.GT_TooltipDataCache;
+import gregtech.api.util.GT_Util;
import gregtech.api.util.GT_Utility;
import gregtech.common.GT_Client;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
+import java.util.function.Supplier;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.block.Block;
@@ -71,6 +79,19 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
*/
public final ItemStack[] mInventory;
+ /**
+ * Inventory wrapper for ModularUI
+ */
+ public final ItemStackHandler inventoryHandler;
+
+ protected GT_GUIColorOverride colorOverride;
+ protected GT_TooltipDataCache mTooltipCache = new GT_TooltipDataCache();
+
+ @Override
+ public ItemStackHandler getInventoryHandler() {
+ return inventoryHandler;
+ }
+
public boolean doTickProfilingInThisTick = true;
private MetaTileEntity mCallBackTile;
@@ -107,6 +128,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
getBaseMetaTileEntity().setMetaTileID((short) aID);
GT_LanguageManager.addStringLocalization("gt.blockmachines." + mName + ".name", aRegionalName);
mInventory = new ItemStack[aInvSlotCount];
+ inventoryHandler = new ItemStackHandler(mInventory);
}
/**
@@ -115,6 +137,9 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
public MetaTileEntity(String aName, int aInvSlotCount) {
mInventory = new ItemStack[aInvSlotCount];
mName = aName;
+ inventoryHandler = new ItemStackHandler(mInventory);
+ colorOverride = new GT_GUIColorOverride(
+ getGUITextureSet().getMainBackground().location.getResourcePath());
}
/**
@@ -151,6 +176,7 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
getBaseMetaTileEntity().getMetaTileID());
}
+ @Override
public String getLocalName() {
return GT_LanguageManager.getTranslation("gt.blockmachines." + mName + ".name");
}
@@ -396,6 +422,14 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
}
/**
+ * @return what type of texture does this machine use for GUI,
+ * i.e. Bronze, Steel, or Primitive
+ */
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.NONE;
+ }
+
+ /**
* @return true if this Device emits Energy at all
*/
public boolean isEnetOutput() {
@@ -991,11 +1025,19 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
//
}
+ /**
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
@Override
public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return null;
}
+ /**
+ * @deprecated Use ModularUI
+ */
+ @Deprecated
@Override
public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return null;
@@ -1048,64 +1090,32 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
@Override
public void doExplosion(long aExplosionPower) {
- float tStrength = aExplosionPower < V[0]
- ? 1.0F
- : aExplosionPower < V[1]
- ? 2.0F
- : aExplosionPower < V[2]
- ? 3.0F
- : aExplosionPower < V[3]
- ? 4.0F
- : aExplosionPower < V[4]
- ? 5.0F
- : aExplosionPower < V[4] * 2
- ? 6.0F
- : aExplosionPower < V[5]
- ? 7.0F
- : aExplosionPower < V[6]
- ? 8.0F
- : aExplosionPower < V[7]
- ? 9.0F
- : aExplosionPower < V[8]
- ? 10.0F
- : aExplosionPower < V[8] * 2
- ? 11.0F
- : aExplosionPower < V[9]
- ? 12.0F
- : aExplosionPower
- < V[
- 10]
- ? 13.0F
- : aExplosionPower
- < V[
- 11]
- ? 14.0F
- : aExplosionPower
- < V[
- 12]
- ? 15.0F
- : aExplosionPower
- < V[
- 12]
- * 2
- ? 16.0F
- : aExplosionPower
- < V[
- 13]
- ? 17.0F
- : aExplosionPower
- < V[
- 14]
- ? 18.0F
- : aExplosionPower
- < V[
- 15]
- ? 19.0F
- : 20.0F;
- int tX = getBaseMetaTileEntity().getXCoord(),
- tY = getBaseMetaTileEntity().getYCoord(),
- tZ = getBaseMetaTileEntity().getZCoord();
- World tWorld = getBaseMetaTileEntity().getWorld();
+ // spotless:off
+ float tStrength =
+ aExplosionPower < V[0] ? 1.0F :
+ aExplosionPower < V[1] ? 2.0F :
+ aExplosionPower < V[2] ? 3.0F :
+ aExplosionPower < V[3] ? 4.0F :
+ aExplosionPower < V[4] ? 5.0F :
+ aExplosionPower < V[4] * 2 ? 6.0F :
+ aExplosionPower < V[5] ? 7.0F :
+ aExplosionPower < V[6] ? 8.0F :
+ aExplosionPower < V[7] ? 9.0F :
+ aExplosionPower < V[8] ? 10.0F :
+ aExplosionPower < V[8] * 2 ? 11.0F :
+ aExplosionPower < V[9] ? 12.0F :
+ aExplosionPower < V[10] ? 13.0F :
+ aExplosionPower < V[11] ? 14.0F :
+ aExplosionPower < V[12] ? 15.0F :
+ aExplosionPower < V[12] * 2 ? 16.0F :
+ aExplosionPower < V[13] ? 17.0F :
+ aExplosionPower < V[14] ? 18.0F :
+ aExplosionPower < V[15] ? 19.0F : 20.0F;
+ // spotless:on
+ final int tX = getBaseMetaTileEntity().getXCoord();
+ final int tY = getBaseMetaTileEntity().getYCoord();
+ final int tZ = getBaseMetaTileEntity().getZCoord();
+ final World tWorld = getBaseMetaTileEntity().getWorld();
GT_Utility.sendSoundToPlayers(tWorld, SoundResource.IC2_MACHINES_MACHINE_OVERLOAD, 1.0F, -1, tX, tY, tZ);
tWorld.setBlock(tX, tY, tZ, Blocks.air);
if (GregTech_API.sMachineExplosions)
@@ -1174,6 +1184,8 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
return false;
}
+ // === AE2 compat ===
+
@Optional.Method(modid = "appliedenergistics2")
public AECableType getCableConnectionType(ForgeDirection forgeDirection) {
return AECableType.NONE;
@@ -1187,6 +1199,8 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
@Optional.Method(modid = "appliedenergistics2")
public void gridChanged() {}
+ // === Waila compat ===
+
@Override
public void getWailaBody(
ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor, IWailaConfigHandler config) {
@@ -1218,4 +1232,38 @@ public abstract class MetaTileEntity implements IMetaTileEntity, IMachineCallbac
}
return "";
}
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.DEFAULT;
+ }
+
+ @Override
+ public int getGUIColorization() {
+ Dyes dye = Dyes.dyeWhite;
+ if (this.colorOverride.sLoaded()) {
+ if (this.colorOverride.sGuiTintingEnabled() && getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ return this.colorOverride.getGuiTintOrDefault(dye.mName, GT_Util.getRGBInt(dye.getRGBA()));
+ }
+ } else if (GregTech_API.sColoredGUI) {
+ if (GregTech_API.sMachineMetalGUI) {
+ dye = Dyes.MACHINE_METAL;
+ } else if (getBaseMetaTileEntity() != null) {
+ dye = Dyes.getDyeFromIndex(getBaseMetaTileEntity().getColorization());
+ }
+ }
+ return GT_Util.getRGBInt(dye.getRGBA());
+ }
+
+ @Override
+ public int getTextColorOrDefault(String textType, int defaultColor) {
+ return colorOverride.getTextColorOrDefault(textType, defaultColor);
+ }
+
+ protected Supplier<Integer> COLOR_TITLE = () -> getTextColorOrDefault("title", 0x404040);
+ protected Supplier<Integer> COLOR_TITLE_WHITE = () -> getTextColorOrDefault("title_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_WHITE = () -> getTextColorOrDefault("text_white", 0xfafaff);
+ protected Supplier<Integer> COLOR_TEXT_GRAY = () -> getTextColorOrDefault("text_gray", 0x404040);
+ protected Supplier<Integer> COLOR_TEXT_RED = () -> getTextColorOrDefault("text_red", 0xff0000);
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java
index 67c3c672ae..45c07cf4c3 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicBatteryBuffer.java
@@ -2,17 +2,19 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.GT_Values.V;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import gregtech.api.enums.Textures;
-import gregtech.api.gui.*;
+import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.items.GT_MetaBase_Item;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Utility;
import ic2.api.item.IElectricItem;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
@@ -23,7 +25,8 @@ import net.minecraft.util.EnumChatFormatting;
* This is the main construct for my Basic Machines such as the Automatic Extractor
* Extend this class to make a simple Machine
*/
-public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_TieredMachineBlock {
+public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_TieredMachineBlock
+ implements IAddUIWidgets {
public boolean mCharge = false, mDecharge = false;
public int mBatteryCount = 0, mChargeableCount = 0;
private long count = 0;
@@ -208,42 +211,11 @@ public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_Tier
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mInventory.length) {
- case 1:
- return new GT_Container_1by1(aPlayerInventory, aBaseMetaTileEntity);
- case 4:
- return new GT_Container_2by2(aPlayerInventory, aBaseMetaTileEntity);
- case 9:
- return new GT_Container_3by3(aPlayerInventory, aBaseMetaTileEntity);
- case 16:
- return new GT_Container_4by4(aPlayerInventory, aBaseMetaTileEntity);
- }
- return new GT_Container_1by1(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mInventory.length) {
- case 1:
- return new GT_GUIContainer_1by1(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- case 4:
- return new GT_GUIContainer_2by2(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- case 9:
- return new GT_GUIContainer_3by3(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- case 16:
- return new GT_GUIContainer_4by4(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- }
- return new GT_GUIContainer_1by1(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- }
-
- @Override
public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
if (aBaseMetaTileEntity.isServerSide()) {
mCharge = aBaseMetaTileEntity.getStoredEU() / 2 > aBaseMetaTileEntity.getEUCapacity() / 3;
@@ -357,4 +329,27 @@ public class GT_MetaTileEntity_BasicBatteryBuffer extends GT_MetaTileEntity_Tier
public boolean isGivingInformation() {
return true;
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mInventory.length) {
+ case 4:
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ break;
+ case 9:
+ getBaseMetaTileEntity().add3by3Slots(builder);
+ break;
+ case 16:
+ getBaseMetaTileEntity().add4by4Slots(builder);
+ break;
+ default:
+ getBaseMetaTileEntity().add1by1Slot(builder);
+ break;
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java
index 091c364b4f..ca5f255302 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicGenerator.java
@@ -5,6 +5,7 @@ import static gregtech.api.enums.GT_Values.V;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.Textures;
+import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.ItemData;
@@ -85,8 +86,7 @@ public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@@ -355,4 +355,9 @@ public abstract class GT_MetaTileEntity_BasicGenerator extends GT_MetaTileEntity
public int getTankPressure() {
return -100;
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
index 15ce40cebf..a07fb5fb0d 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine.java
@@ -4,25 +4,57 @@ import static gregtech.api.enums.GT_Values.V;
import static gregtech.api.enums.GT_Values.debugCleanroom;
import static gregtech.api.enums.Textures.BlockIcons.MACHINE_CASINGS;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import static gregtech.api.metatileentity.BaseTileEntity.FLUID_INPUT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.FLUID_OUTPUT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.FLUID_TRANSFER_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.ITEM_TRANSFER_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_STEAM_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.NEI_TRANSFER_VOLTAGE_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.POWER_SOURCE_KEY;
+import static gregtech.api.metatileentity.BaseTileEntity.SPECIAL_SLOT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.STALLED_STUTTERING_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.STALLED_VENT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import static gregtech.api.metatileentity.BaseTileEntity.UNUSED_SLOT_TOOLTIP;
import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import com.gtnewhorizons.modularui.api.drawable.IDrawable;
+import com.gtnewhorizons.modularui.api.drawable.UITexture;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.math.Size;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.api.widget.Widget;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.CycleButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.ProgressBar;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.SoundResource;
import gregtech.api.gui.GT_Container_BasicMachine;
import gregtech.api.gui.GT_GUIContainer_BasicMachine;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.gui.modularui.SteamTexture;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.metatileentity.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.GT_ItemStack;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.*;
import gregtech.api.util.GT_Recipe.GT_Recipe_Map;
+import gregtech.common.gui.modularui.UIHelper;
+import gregtech.common.gui.modularui.widget.FluidDisplaySlotWidget;
import gregtech.common.power.BasicMachineEUPower;
import gregtech.common.power.Power;
import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom;
import java.util.Arrays;
+import java.util.Collections;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
@@ -39,6 +71,7 @@ import net.minecraftforge.common.DimensionManager;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.IFluidHandler;
+import org.apache.commons.lang3.tuple.Pair;
/**
* NEVER INCLUDE THIS FILE IN YOUR MOD!!!
@@ -47,7 +80,7 @@ import net.minecraftforge.fluids.IFluidHandler;
* Extend this class to make a simple Machine
*/
public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_BasicTank
- implements IConfigurationCircuitSupport {
+ implements IConfigurationCircuitSupport, IAddUIWidgets {
/**
* return values for checkRecipe()
@@ -369,6 +402,10 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
return OTHER_SLOT_COUNT + mInputSlotCount;
}
+ public int getSpecialSlotIndex() {
+ return 3;
+ }
+
@Override
public int getStackDisplaySlot() {
return 2;
@@ -482,12 +519,20 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
if (aBaseMetaTileEntity.isClientSide()) return true;
if (!GT_Mod.gregtechproxy.mForceFreeFace) {
- aBaseMetaTileEntity.openGUI(aPlayer);
+ if (useModularUI()) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ } else {
+ aBaseMetaTileEntity.openGUI(aPlayer);
+ }
return true;
}
for (byte i = 0; i < 6; i++) {
if (aBaseMetaTileEntity.getAirAtSide(i)) {
- aBaseMetaTileEntity.openGUI(aPlayer);
+ if (useModularUI()) {
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
+ } else {
+ aBaseMetaTileEntity.openGUI(aPlayer);
+ }
return true;
}
}
@@ -495,11 +540,13 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
return true;
}
+ @Deprecated
@Override
public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return new GT_Container_BasicMachine(aPlayerInventory, aBaseMetaTileEntity);
}
+ @Deprecated
@Override
public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return new GT_GUIContainer_BasicMachine(
@@ -685,7 +732,8 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
|| aBaseMetaTileEntity.hasWorkJustBeenEnabled())
&& hasEnoughEnergyToCheckRecipe()) {
if (checkRecipe() == FOUND_AND_SUCCESSFULLY_USED_RECIPE) {
- if (mInventory[3] != null && mInventory[3].stackSize <= 0) mInventory[3] = null;
+ if (getSpecialSlot() != null && getSpecialSlot().stackSize <= 0)
+ mInventory[getSpecialSlotIndex()] = null;
for (int i = getInputSlot(), j = i + mInputSlotCount; i < j; i++)
if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
for (int i = 0; i < mOutputItems.length; i++) {
@@ -734,7 +782,15 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
@Override
public void updateFluidDisplayItem() {
+ updateFluidOutputDisplayItem();
+ updateFluidInputDisplayItem();
+ }
+
+ public void updateFluidOutputDisplayItem() {
super.updateFluidDisplayItem();
+ }
+
+ public void updateFluidInputDisplayItem() {
if (displaysInputFluid()) {
int tDisplayStackSlot = OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length;
if (getFillableStack() == null) {
@@ -771,7 +827,7 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
}
protected ItemStack getSpecialSlot() {
- return mInventory[3];
+ return mInventory[getSpecialSlotIndex()];
}
protected ItemStack getOutputAt(int aIndex) {
@@ -1231,6 +1287,13 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
return mPower;
}
+ // GUI stuff
+
+ @Override
+ public boolean useModularUI() {
+ return getRecipeList() != null && getRecipeList().useModularUI;
+ }
+
@Override
public int getCircuitSlotX() {
return 153;
@@ -1240,4 +1303,252 @@ public abstract class GT_MetaTileEntity_BasicMachine extends GT_MetaTileEntity_B
public int getCircuitSlotY() {
return 63;
}
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (!isSteampowered()) {
+ builder.widget(createFluidAutoOutputButton());
+ builder.widget(createItemAutoOutputButton());
+ }
+
+ addIOSlots(builder);
+
+ builder.widget(createChargerSlot(79, 62));
+ if (getRecipeList() != null) {
+ builder.widget(setNEITransferRect(
+ createProgressBar(
+ isSteampowered()
+ ? getRecipeList().progressBarTextureSteam.get(getSteamVariant())
+ : getRecipeList().progressBarTexture,
+ getRecipeList().getProgressBarImageSize(),
+ getRecipeList().progressBarDirection,
+ getRecipeList().progressBarPos,
+ getRecipeList().progressBarSize),
+ getRecipeList().mNEIName));
+ addProgressBarSpecialTextures(builder);
+ }
+ builder.widget(createErrorStatusArea(
+ builder,
+ isSteampowered() ? GT_UITextures.PICTURE_STALLED_STEAM : GT_UITextures.PICTURE_STALLED_ELECTRICITY));
+ }
+
+ /**
+ * Adds item I/O, special item, and fluid I/O slots.
+ */
+ protected void addIOSlots(ModularWindow.Builder builder) {
+ final boolean hasFluidInput =
+ getRecipeList() != null ? (getRecipeList().hasFluidInputs()) : (getCapacity() != 0);
+ final boolean hasFluidOutput =
+ getRecipeList() != null && getRecipeList().hasFluidOutputs();
+ UIHelper.forEachSlots(
+ (i, backgrounds, pos) -> builder.widget(createItemInputSlot(i, backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createItemOutputSlot(i, backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createSpecialSlot(backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createFluidInputSlot(backgrounds, pos)),
+ (i, backgrounds, pos) -> builder.widget(createFluidOutputSlot(backgrounds, pos)),
+ getGUITextureSet().getItemSlot(),
+ getGUITextureSet().getFluidSlot(),
+ getRecipeList(),
+ mInputSlotCount,
+ mOutputItems.length,
+ hasFluidInput ? 1 : 0,
+ hasFluidOutput ? 1 : 0,
+ getSteamVariant(),
+ Pos2d.ZERO);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createItemInputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getInputSlot() + index)
+ .setAccess(true, true)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createItemOutputSlot(int index, IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getOutputSlot() + index)
+ .setAccess(true, false)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ /**
+ * Override this as needed instead of calling.
+ */
+ protected SlotWidget createSpecialSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, getSpecialSlotIndex())
+ .setAccess(true, true)
+ .disableShiftInsert()
+ .setGTTooltip(() -> mTooltipCache.getData(
+ getRecipeList() != null && getRecipeList().usesSpecialSlot()
+ ? SPECIAL_SLOT_TOOLTIP
+ : UNUSED_SLOT_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ protected FluidDisplaySlotWidget createFluidInputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return (FluidDisplaySlotWidget) new FluidDisplaySlotWidget(
+ inventoryHandler, OTHER_SLOT_COUNT + mInputSlotCount + mOutputItems.length)
+ .setFluidAccessConstructor(() -> constructFluidAccess(true))
+ .setIHasFluidDisplay(this)
+ .setCanDrain(true)
+ .setCanFill(true)
+ .setActionRealClick(FluidDisplaySlotWidget.Action.TRANSFER)
+ .setBeforeRealClick((clickData, widget) -> {
+ if (NetworkUtils.isClient()) {
+ // propagate display item content to actual fluid stored in this tank
+ setFillableStack(GT_Utility.getFluidFromDisplayStack(
+ widget.getMcSlot().getStack()));
+ }
+ return true;
+ })
+ .setUpdateFluidDisplayItem(this::updateFluidInputDisplayItem)
+ .setGTTooltip(() -> mTooltipCache.getData(FLUID_INPUT_TOOLTIP, GT_Utility.formatNumbers(getCapacity())))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ protected FluidDisplaySlotWidget createFluidOutputSlot(IDrawable[] backgrounds, Pos2d pos) {
+ return (FluidDisplaySlotWidget) createDrainableFluidSlot()
+ .setUpdateFluidDisplayItem(this::updateFluidOutputDisplayItem)
+ .setGTTooltip(
+ () -> mTooltipCache.getData(FLUID_OUTPUT_TOOLTIP, GT_Utility.formatNumbers(getCapacity())))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(backgrounds)
+ .setPos(pos);
+ }
+
+ @Override
+ protected SlotWidget createChargerSlot(int x, int y) {
+ if (isSteampowered()) {
+ return (SlotWidget) createChargerSlot(x, y, UNUSED_SLOT_TOOLTIP, new String[0])
+ .setBackground(getGUITextureSet().getItemSlot());
+ } else {
+ return super.createChargerSlot(x, y);
+ }
+ }
+
+ protected CycleButtonWidget createItemAutoOutputButton() {
+ return (CycleButtonWidget) new CycleButtonWidget()
+ .setToggle(() -> mItemTransfer, val -> mItemTransfer = val)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_ITEM)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setGTTooltip(() -> mTooltipCache.getData(ITEM_TRANSFER_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(25, 62)
+ .setSize(18, 18);
+ }
+
+ protected CycleButtonWidget createFluidAutoOutputButton() {
+ return (CycleButtonWidget) new CycleButtonWidget()
+ .setToggle(() -> mFluidTransfer, val -> mFluidTransfer = val)
+ .setStaticTexture(GT_UITextures.OVERLAY_BUTTON_AUTOOUTPUT_FLUID)
+ .setVariableBackground(GT_UITextures.BUTTON_STANDARD_TOGGLE)
+ .setGTTooltip(() -> mTooltipCache.getData(FLUID_TRANSFER_TOOLTIP))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setPos(7, 62)
+ .setSize(18, 18);
+ }
+
+ protected ProgressBar createProgressBar(
+ UITexture texture, int imageSize, ProgressBar.Direction direction, Pos2d pos, Size size) {
+ final ProgressBar ret = new ProgressBar();
+ ret.setProgress(() -> maxProgresstime() != 0 ? (float) getProgresstime() / maxProgresstime() : 0)
+ .setTexture(texture, imageSize)
+ .setDirection(direction)
+ .setPos(pos)
+ .setSize(size);
+ return ret;
+ }
+
+ public boolean hasNEITransferRect() {
+ return getRecipeList() != null;
+ }
+
+ protected Widget setNEITransferRect(Widget widget, String transferRectID) {
+ if (hasNEITransferRect()) {
+ final Power powerInfo = getPower();
+ final String transferRectTooltip;
+ if (isSteampowered()) {
+ transferRectTooltip =
+ StatCollector.translateToLocalFormatted(NEI_TRANSFER_STEAM_TOOLTIP, powerInfo.getTierString());
+ } else {
+ transferRectTooltip = StatCollector.translateToLocalFormatted(
+ NEI_TRANSFER_VOLTAGE_TOOLTIP, powerInfo.getTierString());
+ }
+ widget.setNEITransferRect(transferRectID, new Object[] {powerInfo}, transferRectTooltip);
+ }
+ return widget;
+ }
+
+ protected void addProgressBarSpecialTextures(ModularWindow.Builder builder) {
+ if (isSteampowered()) {
+ for (Pair<SteamTexture, Pair<Size, Pos2d>> specialTexture : getRecipeList().specialTexturesSteam) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(specialTexture.getLeft().get(getSteamVariant()))
+ .setSize(specialTexture.getRight().getLeft())
+ .setPos(specialTexture.getRight().getRight()));
+ }
+ } else {
+ for (Pair<IDrawable, Pair<Size, Pos2d>> specialTexture : getRecipeList().specialTextures) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(specialTexture.getLeft())
+ .setSize(specialTexture.getRight().getLeft())
+ .setPos(specialTexture.getRight().getRight()));
+ }
+ }
+ }
+
+ protected DrawableWidget createErrorStatusArea(ModularWindow.Builder builder, IDrawable picture) {
+ return (DrawableWidget) new DrawableWidget()
+ .setDrawable(picture)
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setEnabled(widget -> !widget.getTooltip().isEmpty())
+ .dynamicTooltip(this::getErrorDescriptions)
+ .dynamicTooltipShift(this::getErrorDescriptionsShift)
+ .setPos(79, 44)
+ .setSize(18, 18)
+ .attachSyncer(
+ new FakeSyncWidget.BooleanSyncer(() -> mStuttering, val -> mStuttering = val),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange())
+ .attachSyncer(
+ new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)),
+ builder,
+ (widget, val) -> widget.notifyTooltipChange());
+ }
+
+ protected List<String> getErrorDescriptions() {
+ final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip();
+ return tooltip != null ? tooltip.text : Collections.emptyList();
+ }
+
+ protected List<String> getErrorDescriptionsShift() {
+ final GT_TooltipDataCache.TooltipData tooltip = getErrorTooltip();
+ return tooltip != null ? tooltip.shiftText : Collections.emptyList();
+ }
+
+ protected GT_TooltipDataCache.TooltipData getErrorTooltip() {
+ if (isSteampowered()) {
+ if ((getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0) {
+ return mTooltipCache.getData(STALLED_VENT_TOOLTIP);
+ }
+ }
+ if (mStuttering) {
+ return mTooltipCache.getData(
+ STALLED_STUTTERING_TOOLTIP,
+ StatCollector.translateToLocal(POWER_SOURCE_KEY + (isSteampowered() ? "steam" : "power")));
+ }
+ return null;
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java
index aa893c0bc2..049aaa45bf 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Bronze.java
@@ -8,6 +8,8 @@ import gregtech.api.GregTech_API;
import gregtech.api.enums.Dyes;
import gregtech.api.enums.ParticleFX;
import gregtech.api.enums.SoundResource;
+import gregtech.api.enums.SteamVariant;
+import gregtech.api.gui.modularui.GUITextureSet;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.objects.GT_ItemStack;
@@ -427,4 +429,14 @@ public abstract class GT_MetaTileEntity_BasicMachine_Bronze extends GT_MetaTileE
TextureFactory.of(OVERLAY_PIPE_OUT)
};
}
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.BRONZE;
+ }
+
+ @Override
+ public GUITextureSet getGUITextureSet() {
+ return GUITextureSet.STEAM.apply(getSteamVariant());
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java
index d69ab3aa14..592d27f74f 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicMachine_Steel.java
@@ -9,7 +9,9 @@ import static gregtech.api.enums.Textures.BlockIcons.MACHINE_STEEL_TOP;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
import gregtech.api.enums.Dyes;
+import gregtech.api.enums.SteamVariant;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IGetTitleColor;
import gregtech.api.render.TextureFactory;
import gregtech.common.power.Power;
import gregtech.common.power.SteamPower;
@@ -20,7 +22,8 @@ import gregtech.common.power.SteamPower;
* This is the main construct for my Basic Machines such as the Automatic Extractor
* Extend this class to make a simple Machine
*/
-public abstract class GT_MetaTileEntity_BasicMachine_Steel extends GT_MetaTileEntity_BasicMachine_Bronze {
+public abstract class GT_MetaTileEntity_BasicMachine_Steel extends GT_MetaTileEntity_BasicMachine_Bronze
+ implements IGetTitleColor {
public GT_MetaTileEntity_BasicMachine_Steel(
int aID,
String aName,
@@ -188,4 +191,14 @@ public abstract class GT_MetaTileEntity_BasicMachine_Steel extends GT_MetaTileEn
TextureFactory.of(OVERLAY_PIPE_OUT)
};
}
+
+ @Override
+ public SteamVariant getSteamVariant() {
+ return SteamVariant.STEEL;
+ }
+
+ @Override
+ public int getTitleColor() {
+ return COLOR_TITLE_WHITE.get();
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java
index c1b734baf6..0207178559 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_BasicTank.java
@@ -1,12 +1,22 @@
package gregtech.api.metatileentity.implementations;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.api.enums.ItemList;
import gregtech.api.gui.GT_Container_BasicTank;
import gregtech.api.gui.GT_GUIContainer_BasicTank;
+import gregtech.api.gui.modularui.GT_UITextures;
+import gregtech.api.interfaces.IFluidAccess;
import gregtech.api.interfaces.IHasFluidDisplayItem;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.util.GT_Utility;
+import gregtech.common.gui.modularui.widget.FluidDisplaySlotWidget;
import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
@@ -20,7 +30,7 @@ import net.minecraftforge.fluids.FluidTankInfo;
* This is the main construct for my generic Tanks. Filling and emptying behavior have to be implemented manually
*/
public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_TieredMachineBlock
- implements IHasFluidDisplayItem {
+ implements IHasFluidDisplayItem, IAddUIWidgets {
public FluidStack mFluid;
protected int mOpenerCount;
@@ -90,6 +100,9 @@ public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_Tier
public abstract boolean displaysItemStack();
+ /**
+ * @return If fluid amount is shown on FluidDisplayItem
+ */
public abstract boolean displaysStackSize();
public int getInputSlot() {
@@ -141,11 +154,13 @@ public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_Tier
return getDrainableStack();
}
+ @Deprecated
@Override
public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return new GT_Container_BasicTank(aPlayerInventory, aBaseMetaTileEntity);
}
+ @Deprecated
@Override
public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
return new GT_GUIContainer_BasicTank(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
@@ -329,4 +344,79 @@ public abstract class GT_MetaTileEntity_BasicTank extends GT_MetaTileEntity_Tier
protected void onEmptyingContainerWhenEmpty() {
// Do nothing
}
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 16)
+ .setSize(71, 45))
+ .widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_GAUGE)
+ .setPos(79, 34)
+ .setSize(18, 18))
+ .widget(new SlotWidget(inventoryHandler, getInputSlot())
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_IN)
+ .setPos(79, 16))
+ .widget(new SlotWidget(inventoryHandler, getOutputSlot())
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_OUT)
+ .setPos(79, 52))
+ .widget(createDrainableFluidSlot()
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(58, 41))
+ .widget(new TextWidget("Liquid Amount")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 20))
+ .widget(TextWidget.dynamicString(
+ () -> GT_Utility.parseNumberToString(mFluid != null ? mFluid.amount : 0))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(10, 30));
+ }
+
+ protected FluidDisplaySlotWidget createDrainableFluidSlot() {
+ return new FluidDisplaySlotWidget(inventoryHandler, getStackDisplaySlot())
+ .setFluidAccessConstructor(() -> constructFluidAccess(false))
+ .setIHasFluidDisplay(this)
+ .setCanDrain(true)
+ .setCanFill(!isDrainableStackSeparate())
+ .setActionRealClick(FluidDisplaySlotWidget.Action.TRANSFER)
+ .setBeforeRealClick((clickData, widget) -> {
+ if (NetworkUtils.isClient()) {
+ // propagate display item content to actual fluid stored in this tank
+ setDrainableStack(GT_Utility.getFluidFromDisplayStack(
+ widget.getMcSlot().getStack()));
+ }
+ return true;
+ });
+ }
+
+ protected IFluidAccess constructFluidAccess(boolean aIsFillableStack) {
+ return new BasicTankFluidAccess(this, aIsFillableStack);
+ }
+
+ protected static class BasicTankFluidAccess implements IFluidAccess {
+ protected final GT_MetaTileEntity_BasicTank mTank;
+ protected final boolean mIsFillableStack;
+
+ public BasicTankFluidAccess(GT_MetaTileEntity_BasicTank aTank, boolean aIsFillableStack) {
+ this.mTank = aTank;
+ this.mIsFillableStack = aIsFillableStack;
+ }
+
+ @Override
+ public void set(FluidStack stack) {
+ if (mIsFillableStack) mTank.setFillableStack(stack);
+ else mTank.setDrainableStack(stack);
+ }
+
+ @Override
+ public FluidStack get() {
+ return mIsFillableStack ? mTank.getFillableStack() : mTank.getDrainableStack();
+ }
+
+ @Override
+ public int getCapacity() {
+ return mTank.getCapacity();
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java
index 7354546002..6d327646fe 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Buffer.java
@@ -3,6 +3,11 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.GT_Values.V;
import static gregtech.api.enums.Textures.BlockIcons.*;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.render.TextureFactory;
@@ -226,8 +231,7 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@@ -429,4 +433,91 @@ public abstract class GT_MetaTileEntity_Buffer extends GT_MetaTileEntity_TieredM
}
return super.onSolderingToolRightClick(aSide, aWrenchingSide, aPlayer, aX, aY, aZ);
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ protected void addEmitEnergyButton(ModularWindow.Builder builder) {
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bOutput = !bOutput;
+ if (bOutput) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("116", "Emit Energy to Outputside"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("117", "Don't emit Energy"));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EMIT_ENERGY)
+ .setPos(7, 62)
+ .setSize(18, 18));
+ }
+
+ protected void addEmitRedstoneButton(ModularWindow.Builder builder) {
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bRedstoneIfFull = !bRedstoneIfFull;
+ if (bRedstoneIfFull) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(),
+ GT_Utility.trans("118", "Emit Redstone if no Slot is free"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("119", "Don't emit Redstone"));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_EMIT_REDSTONE)
+ .setPos(25, 62)
+ .setSize(18, 18));
+ }
+
+ protected void addInvertRedstoneButton(ModularWindow.Builder builder) {
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bInvert = !bInvert;
+ if (bInvert) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("120", "Invert Redstone"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("121", "Don't invert Redstone"));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_REDSTONE)
+ .setPos(43, 62)
+ .setSize(18, 18));
+ }
+
+ protected void addStockingModeButton(ModularWindow.Builder builder) {
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bStockingMode = !bStockingMode;
+ if (bStockingMode) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(),
+ GT_Utility.trans(
+ "217",
+ "Stocking mode. Keeps this many items in destination input slots. This mode can be server unfriendly."));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(),
+ GT_Utility.trans(
+ "218",
+ "Transfer size mode. Add exactly this many items in destination input slots as long as there is room."));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_STOCKING_MODE)
+ .setPos(61, 62)
+ .setSize(18, 18));
+ }
+
+ protected void addInventorySlots(ModularWindow.Builder builder) {
+ builder.widget(SlotGroup.ofItemHandler(inventoryHandler, 9)
+ .endAtSlot(26)
+ .build()
+ .setPos(7, 4));
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
index bc4b82477d..e60ffe0f58 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_DataAccess.java
@@ -2,21 +2,21 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DATA_ACCESS;
-import gregtech.api.gui.GT_Container_2by2;
-import gregtech.api.gui.GT_Container_4by4;
-import gregtech.api.gui.GT_GUIContainer_2by2;
-import gregtech.api.gui.GT_GUIContainer_4by4;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_AssemblyLineUtils;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch {
+public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
private int timeout = 4;
public GT_MetaTileEntity_Hatch_DataAccess(int aID, String aName, String aNameRegional, int aTier) {
@@ -71,34 +71,11 @@ public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mTier) {
- case 4:
- return new GT_Container_2by2(aPlayerInventory, aBaseMetaTileEntity);
- default:
- return new GT_Container_4by4(aPlayerInventory, aBaseMetaTileEntity);
- }
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mTier) {
- case 4:
- return new GT_GUIContainer_2by2(
- aPlayerInventory, aBaseMetaTileEntity, "Data Access Hatch", "DataAccess");
- default:
- return new GT_GUIContainer_4by4(
- aPlayerInventory, aBaseMetaTileEntity, "Data Access Hatch", "DataAccess");
- }
- }
-
- @Override
public boolean allowPullStack(IGregTechTileEntity aBaseMetaTileEntity, int aIndex, byte aSide, ItemStack aStack) {
return mTier >= 8 && !aBaseMetaTileEntity.isActive();
}
@@ -150,4 +127,23 @@ public class GT_MetaTileEntity_Hatch_DataAccess extends GT_MetaTileEntity_Hatch
super.setInventorySlotContents(aIndex, aStack);
GT_AssemblyLineUtils.processDataStick(aStack);
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTier) {
+ case 4:
+ getBaseMetaTileEntity()
+ .add2by2Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT);
+ break;
+ default:
+ getBaseMetaTileEntity()
+ .add4by4Slots(builder, getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CIRCUIT);
+ break;
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java
index cb2c869edc..ead36c10ab 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Input.java
@@ -4,6 +4,7 @@ import static gregtech.api.enums.Textures.BlockIcons.FLUID_IN_SIGN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_IN;
import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
@@ -93,8 +94,7 @@ public class GT_MetaTileEntity_Hatch_Input extends GT_MetaTileEntity_Hatch {
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@@ -162,4 +162,9 @@ public class GT_MetaTileEntity_Hatch_Input extends GT_MetaTileEntity_Hatch {
public int getTankPressure() {
return -100;
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java
index f9daf9c605..b6ace5a630 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_InputBus.java
@@ -2,10 +2,13 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.Textures.BlockIcons.*;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import gregtech.GT_Mod;
-import gregtech.api.gui.*;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.interfaces.IConfigurationCircuitSupport;
import gregtech.api.interfaces.ITexture;
-import gregtech.api.interfaces.metatileentity.IConfigurationCircuitSupport;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
@@ -18,12 +21,12 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.StatCollector;
-public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch implements IConfigurationCircuitSupport {
+public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch
+ implements IConfigurationCircuitSupport, IAddUIWidgets {
public GT_Recipe_Map mRecipeMap = null;
public boolean disableSort;
public boolean disableFilter = true;
@@ -108,26 +111,11 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch im
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mTier) {
- case 0:
- return new GT_Container_1by1(aPlayerInventory, aBaseMetaTileEntity);
- case 1:
- return new GT_Container_2by2(aPlayerInventory, aBaseMetaTileEntity);
- case 2:
- return new GT_Container_3by3(aPlayerInventory, aBaseMetaTileEntity);
- default:
- return new GT_Container_4by4(aPlayerInventory, aBaseMetaTileEntity);
- }
- }
-
- @Override
public int getCircuitSlotX() {
return 153;
}
@@ -147,22 +135,6 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch im
}
@Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mInventory.length) {
- case 2:
- return new GT_GUIContainer_1by1(aPlayerInventory, aBaseMetaTileEntity, "Input Bus");
- case 5:
- return new GT_GUIContainer_2by2(aPlayerInventory, aBaseMetaTileEntity, "Input Bus");
- case 10:
- return new GT_GUIContainer_3by3(aPlayerInventory, aBaseMetaTileEntity, "Input Bus");
- case 17:
- return new GT_GUIContainer_4by4(aPlayerInventory, aBaseMetaTileEntity, "Input Bus");
- default:
- return new GT_GUIContainer_4by4(aPlayerInventory, aBaseMetaTileEntity, "Input Bus");
- }
- }
-
- @Override
public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTimer) {
if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.hasInventoryBeenModified()) {
updateSlots();
@@ -287,4 +259,27 @@ public class GT_MetaTileEntity_Hatch_InputBus extends GT_MetaTileEntity_Hatch im
public int getCircuitSlot() {
return getSlots(mTier);
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTier) {
+ case 0:
+ getBaseMetaTileEntity().add1by1Slot(builder);
+ break;
+ case 1:
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ break;
+ case 2:
+ getBaseMetaTileEntity().add3by3Slots(builder);
+ break;
+ default:
+ getBaseMetaTileEntity().add4by4Slots(builder);
+ break;
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java
index d0752d9f0d..98164c6863 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Maintenance.java
@@ -7,16 +7,21 @@ import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_AUTOMAINTENANCE_IDL
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_DUCTTAPE;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_MAINTENANCE;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.Materials;
import gregtech.api.enums.OrePrefixes;
-import gregtech.api.gui.GT_Container_2by2;
-import gregtech.api.gui.GT_Container_MaintenanceHatch;
-import gregtech.api.gui.GT_GUIContainer_2by2;
-import gregtech.api.gui.GT_GUIContainer_MaintenanceHatch;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
@@ -28,13 +33,12 @@ import ic2.core.item.ItemToolbox;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.FakePlayer;
-public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch {
+public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
private static ItemStack[] sAutoMaintenanceInputs;
public boolean mWrench = false,
mScrewdriver = false,
@@ -173,27 +177,15 @@ public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch
if (--tStack.stackSize == 0) {
aPlayer.inventory.mainInventory[aPlayer.inventory.currentItem] = null;
}
- } else aBaseMetaTileEntity.openGUI(aPlayer);
+ } else GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
} else {
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
}
return true;
}
return false;
}
- @Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- if (mAuto) return new GT_Container_2by2(aPlayerInventory, aBaseMetaTileEntity);
- return new GT_Container_MaintenanceHatch(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- if (mAuto) return new GT_GUIContainer_2by2(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
- return new GT_GUIContainer_MaintenanceHatch(aPlayerInventory, aBaseMetaTileEntity);
- }
-
public void updateSlots() {
for (int i = 0; i < mInventory.length; i++)
if (mInventory[i] != null && mInventory[i].stackSize <= 0) mInventory[i] = null;
@@ -311,8 +303,8 @@ public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch
}
private void applyToolbox(ItemStack aStack, EntityPlayer aPlayer) {
- ItemToolbox aToolbox = (ItemToolbox) aStack.getItem();
- IHasGui aToolboxGUI = aToolbox.getInventory(aPlayer, aStack);
+ final ItemToolbox aToolbox = (ItemToolbox) aStack.getItem();
+ final IHasGui aToolboxGUI = aToolbox.getInventory(aPlayer, aStack);
for (int i = 0; i < aToolboxGUI.getSizeInventory(); i++) {
if (aToolboxGUI.getStackInSlot(i) != null) {
onToolClick(aToolboxGUI.getStackInSlot(i), aPlayer, aToolboxGUI);
@@ -341,4 +333,43 @@ public class GT_MetaTileEntity_Hatch_Maintenance extends GT_MetaTileEntity_Hatch
}
return false;
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ if (mAuto) {
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ } else {
+ builder.widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.SLOT_MAINTENANCE)
+ .setPos(78, 33)
+ .setSize(20, 20))
+ .widget(
+ new SlotWidget(BaseSlot.empty()) {
+ @Override
+ public boolean handleDragAndDrop(ItemStack draggedStack, int button) {
+ return false;
+ }
+
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ if (cursorStack == null) return;
+ onToolClick(cursorStack, getContext().getPlayer());
+ if (cursorStack.stackSize < 1) {
+ getContext().getPlayer().inventory.setItemStack(null);
+ }
+ if (getContext().getPlayer() instanceof EntityPlayerMP) {
+ ((EntityPlayerMP) getContext().getPlayer()).updateHeldItem();
+ }
+ }
+ }.setBackground(GT_UITextures.TRANSPARENT).setPos(79, 34))
+ .widget(new TextWidget("Click with Tool to repair.")
+ .setDefaultColor(COLOR_TEXT_GRAY.get())
+ .setPos(8, 12));
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java
index d65370901b..3e1b39c1fd 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Muffler.java
@@ -38,12 +38,28 @@ public class GT_MetaTileEntity_Hatch_Muffler extends GT_MetaTileEntity_Hatch {
super(aID, aName, aNameRegional, aTier, 0, "");
}
+ public GT_MetaTileEntity_Hatch_Muffler(
+ int aID,
+ String aName,
+ String aNameRegional,
+ int aTier,
+ int aInvSlotCount,
+ String[] aDescription,
+ ITexture... aTextures) {
+ super(aID, aName, aNameRegional, aTier, aInvSlotCount, aDescription, aTextures);
+ }
+
public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String aDescription, ITexture[][][] aTextures) {
this(aName, aTier, new String[] {aDescription}, aTextures);
}
public GT_MetaTileEntity_Hatch_Muffler(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
- super(aName, aTier, 0, aDescription, aTextures);
+ this(aName, aTier, 0, aDescription, aTextures);
+ }
+
+ public GT_MetaTileEntity_Hatch_Muffler(
+ String aName, int aTier, int aInvSlotCount, String[] aDescription, ITexture[][][] aTextures) {
+ super(aName, aTier, aInvSlotCount, aDescription, aTextures);
setInValidFacings(ForgeDirection.DOWN);
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java
index 3d4b24ef93..66c5401bd7 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_MultiInput.java
@@ -2,21 +2,27 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_INPUT_HATCH_2x2;
+import com.gtnewhorizons.modularui.api.ModularUITextures;
+import com.gtnewhorizons.modularui.api.math.Pos2d;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
import gregtech.api.enums.ItemList;
-import gregtech.api.gui.GT_Container_2by2_Fluid;
-import gregtech.api.gui.GT_GUIContainer_2by2_Fluid;
+import gregtech.api.interfaces.IFluidAccess;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
-import net.minecraft.entity.player.InventoryPlayer;
+import gregtech.common.gui.modularui.widget.FluidDisplaySlotWidget;
+import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import net.minecraftforge.fluids.FluidTankInfo;
-public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_Input {
+public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_Input implements IAddUIWidgets {
public FluidStack[] mStoredFluid;
public int mCapacityPer;
@@ -62,6 +68,11 @@ public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_
}
}
+ @Override
+ public boolean displaysStackSize() {
+ return true;
+ }
+
public FluidStack[] getStoredFluid() {
return mStoredFluid;
}
@@ -245,16 +256,6 @@ public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_
}
@Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_GUIContainer_2by2_Fluid(aPlayerInventory, aBaseMetaTileEntity, "Quadruple Input Hatch");
- }
-
- @Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_Container_2by2_Fluid(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
if (aBaseMetaTileEntity.isServerSide() && mStoredFluid != null) {
for (int i = 0; i < getMaxType(); i++) {
@@ -274,11 +275,89 @@ public class GT_MetaTileEntity_Hatch_MultiInput extends GT_MetaTileEntity_Hatch_
@Override
public void updateFluidDisplayItem() {
for (int i = 0; i < 4; i++) {
- if (getFluid(i) == null || getFluid(i).amount <= 0) {
- if (ItemList.Display_Fluid.isStackEqual(mInventory[i], true, true)) mInventory[i] = null;
- } else {
- mInventory[i] = GT_Utility.getFluidDisplayStack(getFluid(i), true, !displaysStackSize());
- }
+ updateFluidDisplayItem(i);
+ }
+ }
+
+ public void updateFluidDisplayItem(int index) {
+ if (getFluid(index) == null || getFluid(index).amount <= 0) {
+ if (ItemList.Display_Fluid.isStackEqual(mInventory[index], true, true)) mInventory[index] = null;
+ } else {
+ mInventory[index] = GT_Utility.getFluidDisplayStack(getFluid(index), true, !displaysStackSize());
+ }
+ }
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ final int SLOT_NUMBER = 4;
+ final Pos2d[] positions = new Pos2d[] {
+ new Pos2d(70, 25), new Pos2d(88, 25), new Pos2d(70, 43), new Pos2d(88, 43),
+ };
+
+ for (int i = 0; i < SLOT_NUMBER; i++) {
+ final int slotId = i;
+ builder.widget(new FluidDisplaySlotWidget(inventoryHandler, slotId)
+ .setFluidAccessConstructor(() -> constructFluidAccess(slotId))
+ .setIHasFluidDisplay(this)
+ .setCanDrain(true)
+ .setCanFill(!isDrainableStackSeparate())
+ .setActionRealClick(FluidDisplaySlotWidget.Action.TRANSFER)
+ .setBeforeRealClick((clickData, widget) -> {
+ if (NetworkUtils.isClient()) {
+ // propagate display item content to actual fluid stored in this tank
+ setFluid(
+ GT_Utility.getFluidFromDisplayStack(
+ widget.getMcSlot().getStack()),
+ slotId);
+ }
+ ItemStack tStackHeld =
+ widget.getContext().getPlayer().inventory.getItemStack();
+ FluidStack tFluidHeld = GT_Utility.getFluidForFilledItem(tStackHeld, true);
+ return constructFluidAccess(slotId).isMatch(tFluidHeld, slotId);
+ })
+ .setUpdateFluidDisplayItem(() -> updateFluidDisplayItem(slotId))
+ .setBackground(ModularUITextures.FLUID_SLOT)
+ .setPos(positions[slotId]));
+ }
+ }
+
+ protected MultiFluidAccess constructFluidAccess(int aSlot) {
+ return new MultiFluidAccess(this, aSlot);
+ }
+
+ protected static class MultiFluidAccess implements IFluidAccess {
+ private final GT_MetaTileEntity_Hatch_MultiInput mTank;
+ private final int mSlot;
+
+ public MultiFluidAccess(GT_MetaTileEntity_Hatch_MultiInput aTank, int aSlot) {
+ this.mTank = aTank;
+ this.mSlot = aSlot;
+ }
+
+ public boolean isMatch(FluidStack stack, int slot) {
+ if (!mTank.hasFluid(stack)) return true;
+ if (stack == null) return true;
+ return stack.equals(mTank.getFluid(slot));
+ }
+
+ @Override
+ public void set(FluidStack stack) {
+ mTank.setFluid(stack, mSlot);
+ }
+
+ @Override
+ public FluidStack get() {
+ return mTank.getFluid(mSlot);
+ }
+
+ @Override
+ public int getCapacity() {
+ return mTank.getCapacity();
}
}
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java
index dabdd7dbb8..11ffa6e802 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_Output.java
@@ -3,19 +3,27 @@ package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.Textures.BlockIcons.FLUID_OUT_SIGN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
+import com.gtnewhorizons.modularui.api.math.Alignment;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.network.NetworkUtils;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.GT_Mod;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
import gregtech.api.interfaces.metatileentity.IFluidLockable;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_ModHandler;
import gregtech.api.util.GT_Utility;
-import gregtech.common.gui.GT_Container_OutputHatch;
-import gregtech.common.gui.GT_GUIContainer_OutputHatch;
+import gregtech.common.gui.modularui.widget.FluidDisplaySlotWidget;
import java.lang.ref.WeakReference;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumChatFormatting;
@@ -23,7 +31,7 @@ import net.minecraft.util.StatCollector;
import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.*;
-public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch implements IFluidLockable {
+public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch implements IFluidLockable, IAddUIWidgets {
private String lockedFluidName = null;
private WeakReference<EntityPlayer> playerThatLockedfluid = null;
public byte mMode = 0;
@@ -97,8 +105,7 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@@ -181,17 +188,21 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl
return false;
}
+ public int getLockedDisplaySlot() {
+ return 3;
+ }
+
@Override
public void updateFluidDisplayItem() {
super.updateFluidDisplayItem();
- if (lockedFluidName == null || mMode < 8) mInventory[3] = null;
+ if (lockedFluidName == null || mMode < 8) mInventory[getLockedDisplaySlot()] = null;
else {
FluidStack tLockedFluid = FluidRegistry.getFluidStack(lockedFluidName, 1);
// Because getStackDisplaySlot() only allow return one int, this place I only can manually set.
if (tLockedFluid != null) {
- mInventory[3] = GT_Utility.getFluidDisplayStack(tLockedFluid, false, true);
+ mInventory[getLockedDisplaySlot()] = GT_Utility.getFluidDisplayStack(tLockedFluid, false, true);
} else {
- mInventory[3] = null;
+ mInventory[getLockedDisplaySlot()] = null;
}
}
}
@@ -199,17 +210,7 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl
@Override
public boolean isValidSlot(int aIndex) {
// Because getStackDisplaySlot() only allow return one int, this place I only can manually set.
- return aIndex != getStackDisplaySlot() && aIndex != 3;
- }
-
- @Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_Container_OutputHatch(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_GUIContainer_OutputHatch(aPlayerInventory, aBaseMetaTileEntity, getLocalName());
+ return aIndex != getStackDisplaySlot() && aIndex != getLockedDisplaySlot();
}
@Override
@@ -464,4 +465,48 @@ public class GT_MetaTileEntity_Hatch_Output extends GT_MetaTileEntity_Hatch impl
.getUnlocalizedName()))
};
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ super.addUIWidgets(builder, buildContext);
+ builder.widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(98, 16)
+ .setSize(71, 45))
+ .widget(new FluidDisplaySlotWidget(inventoryHandler, getLockedDisplaySlot())
+ .setIHasFluidDisplay(this)
+ .setActionRealClick(FluidDisplaySlotWidget.Action.LOCK)
+ .setActionDragAndDrop(FluidDisplaySlotWidget.Action.LOCK)
+ .setBeforeClick((clickData, widget) -> {
+ if (NetworkUtils.isClient()) {
+ // propagate display item content to actual fluid stored in this tank
+ setDrainableStack(
+ GT_Utility.getFluidFromDisplayStack(mInventory[getStackDisplaySlot()]));
+ }
+ return true;
+ })
+ .setBackground(GT_UITextures.TRANSPARENT)
+ .setPos(149, 41))
+ .widget(new TextWidget("Locked Fluid")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setPos(101, 20))
+ .widget(TextWidget.dynamicString(() -> {
+ ItemStack lockedDisplayStack = mInventory[getLockedDisplaySlot()];
+ return lockedDisplayStack == null ? "None" : lockedDisplayStack.getDisplayName();
+ })
+ .setSynced(false)
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setTextAlignment(Alignment.CenterLeft)
+ .setMaxWidth(65)
+ .setPos(101, 30))
+ // #updateFluidDisplayItem invalidates locked fluid slot
+ // if lockedFluidName == null or mMode is incorrect
+ .widget(new FakeSyncWidget.StringSyncer(() -> lockedFluidName, val -> lockedFluidName = val))
+ .widget(new FakeSyncWidget.ByteSyncer(() -> mMode, val -> mMode = val));
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
index 5b08f7ae69..ad1c799708 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_Hatch_OutputBus.java
@@ -4,20 +4,22 @@ import static gregtech.api.enums.Textures.BlockIcons.ITEM_OUT_SIGN;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_PIPE_OUT;
import static gregtech.api.util.GT_Utility.moveMultipleItemStacks;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
import gregtech.GT_Mod;
-import gregtech.api.gui.*;
+import gregtech.api.gui.modularui.GT_UIInfos;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.api.render.TextureFactory;
import gregtech.api.util.GT_Utility;
import gregtech.api.util.extensions.ArrayExt;
import net.minecraft.entity.player.EntityPlayer;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.inventory.IInventory;
import net.minecraft.item.ItemStack;
-public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch {
+public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch implements IAddUIWidgets {
public GT_MetaTileEntity_Hatch_OutputBus(int aID, String aName, String aNameRegional, int aTier) {
this(aID, aName, aNameRegional, aTier, getSlots(aTier));
}
@@ -101,39 +103,10 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch {
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
- @Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mTier) {
- case 0:
- return new GT_Container_1by1(aPlayerInventory, aBaseMetaTileEntity);
- case 1:
- return new GT_Container_2by2(aPlayerInventory, aBaseMetaTileEntity);
- case 2:
- return new GT_Container_3by3(aPlayerInventory, aBaseMetaTileEntity);
- default:
- return new GT_Container_4by4(aPlayerInventory, aBaseMetaTileEntity);
- }
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- switch (mTier) {
- case 0:
- return new GT_GUIContainer_1by1(aPlayerInventory, aBaseMetaTileEntity, "Output Bus");
- case 1:
- return new GT_GUIContainer_2by2(aPlayerInventory, aBaseMetaTileEntity, "Output Bus");
- case 2:
- return new GT_GUIContainer_3by3(aPlayerInventory, aBaseMetaTileEntity, "Output Bus");
- default:
- return new GT_GUIContainer_4by4(aPlayerInventory, aBaseMetaTileEntity, "Output Bus");
- }
- }
-
/**
* Attempt to store as many items as possible into the internal inventory of this output bus.
* If you need atomicity you should use {@link gregtech.api.interfaces.tileentity.IHasInventory#addStackToSlot(int, ItemStack)}
@@ -185,7 +158,8 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch {
public void onPostTick(IGregTechTileEntity aBaseMetaTileEntity, long aTick) {
super.onPostTick(aBaseMetaTileEntity, aTick);
if (aBaseMetaTileEntity.isServerSide() && aBaseMetaTileEntity.isAllowedToWork() && (aTick & 0x7) == 0) {
- IInventory tTileEntity = aBaseMetaTileEntity.getIInventoryAtSide(aBaseMetaTileEntity.getFrontFacing());
+ final IInventory tTileEntity =
+ aBaseMetaTileEntity.getIInventoryAtSide(aBaseMetaTileEntity.getFrontFacing());
if (tTileEntity != null) {
moveMultipleItemStacks(
aBaseMetaTileEntity,
@@ -208,4 +182,27 @@ public class GT_MetaTileEntity_Hatch_OutputBus extends GT_MetaTileEntity_Hatch {
}
}
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ switch (mTier) {
+ case 0:
+ getBaseMetaTileEntity().add1by1Slot(builder);
+ break;
+ case 1:
+ getBaseMetaTileEntity().add2by2Slots(builder);
+ break;
+ case 2:
+ getBaseMetaTileEntity().add3by3Slots(builder);
+ break;
+ default:
+ getBaseMetaTileEntity().add4by4Slots(builder);
+ break;
+ }
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
index bf0ccd5001..c67785664c 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_MultiBlockBase.java
@@ -5,12 +5,21 @@ import static mcp.mobius.waila.api.SpecialChars.GREEN;
import static mcp.mobius.waila.api.SpecialChars.RED;
import static mcp.mobius.waila.api.SpecialChars.RESET;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.DynamicPositionedColumn;
+import com.gtnewhorizons.modularui.common.widget.FakeSyncWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import com.gtnewhorizons.modularui.common.widget.TextWidget;
import gregtech.GT_Mod;
import gregtech.api.GregTech_API;
import gregtech.api.enums.ConfigCategories;
-import gregtech.api.gui.GT_Container_MultiMachine;
-import gregtech.api.gui.GT_GUIContainer_MultiMachine;
+import gregtech.api.gui.modularui.GT_UIInfos;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.modularui.IAddGregtechLogo;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
import gregtech.api.items.GT_MetaGenerated_Tool;
import gregtech.api.metatileentity.MetaTileEntity;
@@ -19,13 +28,14 @@ import gregtech.api.util.*;
import gregtech.api.util.GT_Recipe.GT_Recipe_Map;
import gregtech.common.GT_Pollution;
import gregtech.common.items.GT_MetaGenerated_Tool_01;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_DrillerBase;
+import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_LargeTurbine;
import java.util.ArrayList;
import java.util.List;
import mcp.mobius.waila.api.IWailaConfigHandler;
import mcp.mobius.waila.api.IWailaDataAccessor;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.entity.player.EntityPlayerMP;
-import net.minecraft.entity.player.InventoryPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.tileentity.TileEntity;
@@ -36,7 +46,8 @@ import net.minecraftforge.common.util.ForgeDirection;
import net.minecraftforge.fluids.FluidStack;
import org.lwjgl.input.Keyboard;
-public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
+public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity
+ implements IAddGregtechLogo, IAddUIWidgets {
public static boolean disableMaintenance;
public boolean mMachine = false,
@@ -241,23 +252,11 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
@Override
public boolean onRightclick(IGregTechTileEntity aBaseMetaTileEntity, EntityPlayer aPlayer) {
- if (aBaseMetaTileEntity.isClientSide()) return true;
- aBaseMetaTileEntity.openGUI(aPlayer);
+ GT_UIInfos.openGTTileEntityUI(aBaseMetaTileEntity, aPlayer);
return true;
}
@Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_Container_MultiMachine(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_GUIContainer_MultiMachine(
- aPlayerInventory, aBaseMetaTileEntity, getLocalName(), "MultiblockDisplay.png");
- }
-
- @Override
public byte getTileEntityBaseType() {
return 2;
}
@@ -1261,7 +1260,7 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
tag.setInteger("maxProgress", mMaxProgresstime);
tag.setBoolean("incompleteStructure", (getBaseMetaTileEntity().getErrorDisplayID() & 64) != 0);
- IGregTechTileEntity tileEntity = getBaseMetaTileEntity();
+ final IGregTechTileEntity tileEntity = getBaseMetaTileEntity();
if (tileEntity != null) {
tag.setBoolean("isActive", tileEntity.isActive());
}
@@ -1269,7 +1268,7 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
protected void setMufflers(boolean state) {
for (GT_MetaTileEntity_Hatch_Muffler aMuffler : mMufflerHatches) {
- IGregTechTileEntity iGTTileEntity = aMuffler.getBaseMetaTileEntity();
+ final IGregTechTileEntity iGTTileEntity = aMuffler.getBaseMetaTileEntity();
if (iGTTileEntity != null && !iGTTileEntity.isDead()) {
iGTTileEntity.setActive(state);
}
@@ -1286,4 +1285,121 @@ public abstract class GT_MetaTileEntity_MultiBlockBase extends MetaTileEntity {
public List<GT_MetaTileEntity_Hatch> getExoticEnergyHatches() {
return mExoticEnergyHatches;
}
+
+ @Override
+ public boolean useModularUI() {
+ return true;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ builder.widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_SCREEN_BLACK)
+ .setPos(7, 4)
+ .setSize(143, 75));
+ final SlotWidget inventorySlot = new SlotWidget(inventoryHandler, 1);
+ builder.widget(inventorySlot.setPos(151, 4));
+
+ final DynamicPositionedColumn screenElements = new DynamicPositionedColumn();
+ drawTexts(screenElements, inventorySlot);
+ builder.widget(screenElements);
+ }
+
+ @Override
+ public void addGregTechLogo(ModularWindow.Builder builder) {}
+
+ protected void drawTexts(DynamicPositionedColumn screenElements, SlotWidget inventorySlot) {
+ screenElements.setSynced(false).setSpace(0).setPos(10, 7);
+
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("132", "Pipe is loose."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mWrench))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mWrench, val -> mWrench = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("133", "Screws are loose."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mScrewdriver))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mScrewdriver, val -> mScrewdriver = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("134", "Something is stuck."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mSoftHammer))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSoftHammer, val -> mSoftHammer = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("135", "Platings are dented."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mHardHammer))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mHardHammer, val -> mHardHammer = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("136", "Circuitry burned out."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mSolderingTool))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mSolderingTool, val -> mSolderingTool = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("137", "That doesn't belong there."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mCrowbar))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mCrowbar, val -> mCrowbar = val));
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("138", "Incomplete Structure."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> !mMachine))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> mMachine, val -> mMachine = val));
+ screenElements.widget(new TextWidget("Too Uncertain.")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 128) != 0));
+ screenElements.widget(new TextWidget("Invalid Parameters.")
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> (getBaseMetaTileEntity().getErrorDisplayID() & 256) != 0));
+
+ screenElements
+ .widget(new TextWidget(GT_Utility.trans("139", "Hit with Soft Mallet"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && !getBaseMetaTileEntity().isActive()))
+ .widget(new FakeSyncWidget.IntegerSyncer(
+ () -> getBaseMetaTileEntity().getErrorDisplayID(),
+ val -> getBaseMetaTileEntity().setErrorDisplayID(val)))
+ .widget(new FakeSyncWidget.BooleanSyncer(
+ () -> getBaseMetaTileEntity().isActive(),
+ val -> getBaseMetaTileEntity().setActive(val)));
+ screenElements.widget(new TextWidget(GT_Utility.trans("140", "to (re-)start the Machine"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && !getBaseMetaTileEntity().isActive()));
+ screenElements.widget(new TextWidget(GT_Utility.trans("141", "if it doesn't start."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && !getBaseMetaTileEntity().isActive()));
+ screenElements.widget(new TextWidget(GT_Utility.trans("142", "Running perfectly."))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && getBaseMetaTileEntity().isActive()));
+
+ screenElements.widget(new TextWidget(GT_Utility.trans("143", "Missing Mining Pipe"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> {
+ if (getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && this instanceof GT_MetaTileEntity_DrillerBase) {
+ final ItemStack tItem = inventorySlot.getMcSlot().getStack();
+ return tItem == null
+ || !GT_Utility.areStacksEqual(tItem, GT_ModHandler.getIC2Item("miningPipe", 1L));
+ }
+ return false;
+ }));
+ screenElements.widget(new TextWidget(GT_Utility.trans("144", "Missing Turbine Rotor"))
+ .setDefaultColor(COLOR_TEXT_WHITE.get())
+ .setEnabled(widget -> {
+ if (getBaseMetaTileEntity().getErrorDisplayID() == 0
+ && this instanceof GT_MetaTileEntity_LargeTurbine) {
+ final ItemStack tItem = inventorySlot.getMcSlot().getStack();
+ return tItem == null
+ || !(tItem.getItem() == GT_MetaGenerated_Tool_01.INSTANCE
+ && tItem.getItemDamage() >= 170
+ && tItem.getItemDamage() <= 177);
+ }
+ return false;
+ }));
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java
index 44d40e5a67..f146b39635 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_SpecialFilter.java
@@ -1,14 +1,24 @@
package gregtech.api.metatileentity.implementations;
-import gregtech.api.gui.GT_Container_SpecialFilter;
-import gregtech.api.gui.GT_GUIContainer_SpecialFilter;
+import com.gtnewhorizons.modularui.api.drawable.Text;
+import com.gtnewhorizons.modularui.api.screen.ModularWindow;
+import com.gtnewhorizons.modularui.api.screen.UIBuildContext;
+import com.gtnewhorizons.modularui.common.internal.wrapper.BaseSlot;
+import com.gtnewhorizons.modularui.common.widget.ButtonWidget;
+import com.gtnewhorizons.modularui.common.widget.DrawableWidget;
+import com.gtnewhorizons.modularui.common.widget.SlotGroup;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
+import gregtech.api.interfaces.modularui.IAddUIWidgets;
import gregtech.api.interfaces.tileentity.IGregTechTileEntity;
-import net.minecraft.entity.player.InventoryPlayer;
+import gregtech.api.util.GT_Utility;
+import java.util.Collections;
+import java.util.List;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
-public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_Buffer {
+public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_Buffer implements IAddUIWidgets {
public static final int BUFFER_SLOT_COUNT = 9;
public static final int SPECIAL_SLOT_INDEX = 9;
public boolean bNBTAllowed = false;
@@ -35,16 +45,6 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_
return aIndex < 9;
}
- @Override
- public Object getServerGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_Container_SpecialFilter(aPlayerInventory, aBaseMetaTileEntity);
- }
-
- @Override
- public Object getClientGUI(int aID, InventoryPlayer aPlayerInventory, IGregTechTileEntity aBaseMetaTileEntity) {
- return new GT_GUIContainer_SpecialFilter(aPlayerInventory, aBaseMetaTileEntity);
- }
-
public abstract void clickTypeIcon(boolean aRightClick, ItemStack aHandStack);
@Override
@@ -69,4 +69,87 @@ public abstract class GT_MetaTileEntity_SpecialFilter extends GT_MetaTileEntity_
}
protected abstract boolean isStackAllowed(ItemStack aStack);
+
+ protected List<Text> getEmptySlotTooltip() {
+ return null;
+ }
+
+ protected List<String> getItemExtraTooltip() {
+ return null;
+ }
+
+ @Override
+ public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
+ addEmitEnergyButton(builder);
+ addEmitRedstoneButton(builder);
+ addInvertRedstoneButton(builder);
+ builder.widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bInvertFilter = !bInvertFilter;
+ if (bInvertFilter) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("124", "Invert Filter"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(),
+ GT_Utility.trans("125", "Don't invert Filter"));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_INVERT_FILTER)
+ .setPos(61, 62)
+ .setSize(18, 18))
+ .widget(new ButtonWidget()
+ .setOnClick((clickData, widget) -> {
+ bNBTAllowed = !bNBTAllowed;
+ if (bNBTAllowed) {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("126", "Ignore NBT"));
+ } else {
+ GT_Utility.sendChatToPlayer(
+ widget.getContext().getPlayer(), GT_Utility.trans("127", "NBT has to match"));
+ }
+ })
+ .setBackground(GT_UITextures.BUTTON_STANDARD, GT_UITextures.OVERLAY_BUTTON_NBT)
+ .setPos(79, 62)
+ .setSize(18, 18))
+ .widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_ARROW_24_WHITE.apply(27, false))
+ .setPos(6, 19)
+ .setSize(27, 24))
+ .widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_ARROW_24_BLUE.apply(42, true))
+ .setPos(53, 19)
+ .setSize(42, 24))
+ .widget(new DrawableWidget()
+ .setDrawable(GT_UITextures.PICTURE_ARROW_24_RED.apply(19, true))
+ .setPos(152, 19)
+ .setSize(19, 24))
+ .widget(
+ new SlotWidget(BaseSlot.phantom(inventoryHandler, 9)) {
+ @Override
+ protected void phantomClick(ClickData clickData, ItemStack cursorStack) {
+ clickTypeIcon(clickData.mouseButton != 0, cursorStack);
+ }
+
+ @Override
+ public void buildTooltip(List<Text> tooltip) {
+ if (getEmptySlotTooltip() != null) {
+ tooltip.addAll(getEmptySlotTooltip());
+ }
+ super.buildTooltip(tooltip);
+ }
+
+ @Override
+ public List<String> getExtraTooltip() {
+ if (getItemExtraTooltip() != null) {
+ return getItemExtraTooltip();
+ }
+ return Collections.emptyList();
+ }
+ }.disableShiftInsert().setPos(34, 22).setBackground(GT_UITextures.BUTTON_STANDARD))
+ .widget(SlotGroup.ofItemHandler(inventoryHandler, 3)
+ .endAtSlot(8)
+ .build()
+ .setPos(97, 4));
+ }
}
diff --git a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java
index a4d6fc0e6b..4b01454a02 100644
--- a/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java
+++ b/src/main/java/gregtech/api/metatileentity/implementations/GT_MetaTileEntity_TieredMachineBlock.java
@@ -1,7 +1,13 @@
package gregtech.api.metatileentity.implementations;
import static gregtech.api.enums.GT_Values.GT;
+import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP;
+import static gregtech.api.metatileentity.BaseTileEntity.BATTERY_SLOT_TOOLTIP_ALT;
+import static gregtech.api.metatileentity.BaseTileEntity.TOOLTIP_DELAY;
+import com.gtnewhorizons.modularui.common.widget.SlotWidget;
+import gregtech.api.enums.GT_Values;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.ITexture;
import gregtech.api.metatileentity.MetaTileEntity;
import gregtech.common.tileentities.machines.multi.GT_MetaTileEntity_Cleanroom;
@@ -111,4 +117,36 @@ public abstract class GT_MetaTileEntity_TieredMachineBlock extends MetaTileEntit
* @param aTextures is the optional Array you can give to the Constructor.
*/
public abstract ITexture[][][] getTextureSet(ITexture[] aTextures);
+
+ protected SlotWidget createChargerSlot(int x, int y) {
+ final String batterySlotTooltipKey;
+ final Object[] batterySlotTooltipArgs;
+ final String pTier1 = powerTierName(mTier);
+ if (mTier == GT_Values.VN.length - 1) {
+ batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP_ALT;
+ batterySlotTooltipArgs = new String[] {pTier1};
+ } else {
+ batterySlotTooltipKey = BATTERY_SLOT_TOOLTIP;
+ batterySlotTooltipArgs = new String[] {pTier1, powerTierName((byte) (mTier + 1))};
+ }
+ return createChargerSlot(x, y, batterySlotTooltipKey, batterySlotTooltipArgs);
+ }
+
+ protected SlotWidget createChargerSlot(int x, int y, String tooltipKey, Object[] tooltipArgs) {
+ return (SlotWidget) new SlotWidget(inventoryHandler, rechargerSlotStartIndex())
+ .disableShiftInsert()
+ .setGTTooltip(() -> mTooltipCache.getData(tooltipKey, tooltipArgs))
+ .setTooltipShowUpDelay(TOOLTIP_DELAY)
+ .setBackground(getGUITextureSet().getItemSlot(), GT_UITextures.OVERLAY_SLOT_CHARGER)
+ .setPos(x, y);
+ }
+
+ /**
+ * Apply proper coloration to a machine's power tier short name
+ * @param machineTier
+ * @return colored power tier short name
+ */
+ private String powerTierName(byte machineTier) {
+ return GT_Values.TIER_COLORS[machineTier] + GT_Values.VN[machineTier];
+ }
}