aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech')
-rw-r--r--src/main/java/gregtech/api/enums/ItemList.java2
-rw-r--r--src/main/java/gregtech/api/enums/MetaTileEntityIDs.java6
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java95
-rw-r--r--src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java83
-rw-r--r--src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java28
5 files changed, 156 insertions, 58 deletions
diff --git a/src/main/java/gregtech/api/enums/ItemList.java b/src/main/java/gregtech/api/enums/ItemList.java
index 30eda5b677..4250ada9c9 100644
--- a/src/main/java/gregtech/api/enums/ItemList.java
+++ b/src/main/java/gregtech/api/enums/ItemList.java
@@ -2000,7 +2000,9 @@ public enum ItemList implements IItemContainer {
VOLUMETRIC_FLASK,
+ Hatch_Input_Bus_ME_Basic,
Hatch_Input_Bus_ME,
+ Hatch_Input_ME_Basic,
Hatch_Input_ME,
Hatch_CraftingInput_Bus_ME,
Hatch_CraftingInput_Bus_ME_ItemOnly,
diff --git a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
index 003ff381f7..ace5f620d4 100644
--- a/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
+++ b/src/main/java/gregtech/api/enums/MetaTileEntityIDs.java
@@ -599,12 +599,14 @@ public enum MetaTileEntityIDs {
LONG_DISTANCE_PIPELINE_FLUID(2700),
LONG_DISTANCE_PIPELINE_ITEM(2701),
OUTPUT_BUS_ME(2710),
- INPUT_BUS_ME(2711),
- INPUT_HATCH_ME(2712),
+ INPUT_BUS_ME_ADVANCED(2711),
+ INPUT_HATCH_ME_ADVANCED(2712),
OUTPUT_HATCH_ME(2713),
CRAFTING_INPUT_ME(2714),
CRAFTING_INPUT_ME_BUS(2715),
CRAFTING_INPUT_SLAVE(2716),
+ INPUT_HATCH_ME(2717),
+ INPUT_BUS_ME(2718),
CHEST_BUFFER_ULV(9230),
CHEST_BUFFER_LV(9231),
CHEST_BUFFER_MV(9232),
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java
index a23916dcc8..9a48d9ee64 100644
--- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_InputBus_ME.java
@@ -3,6 +3,7 @@ package gregtech.common.tileentities.machines;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_HATCH_ACTIVE;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.EnumSet;
@@ -82,37 +83,34 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
private final ItemStack[] shadowInventory = new ItemStack[SLOT_COUNT];
private final int[] savedStackSizes = new int[SLOT_COUNT];
private boolean processingRecipe = false;
+ private final boolean autoPullAvailable;
private boolean autoPullItemList = false;
private int minAutoPullStackSize = 1;
private static final int CONFIG_WINDOW_ID = 10;
private boolean additionalConnection = false;
- public GT_MetaTileEntity_Hatch_InputBus_ME(int aID, String aName, String aNameRegional) {
+ public GT_MetaTileEntity_Hatch_InputBus_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) {
super(
aID,
aName,
aNameRegional,
- 3,
+ autoPullAvailable ? 6 : 3,
SLOT_COUNT * 2 + 2,
- new String[] { "Advanced item input for Multiblocks", "Retrieves directly from ME",
- "Keeps 16 item types in stock",
- "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds.",
- "Toggle by right-clicking with screwdriver, or use the GUI.",
- "Use the GUI to limit the minimum stack size for Auto-Pulling.",
- "Change ME connection behavior by right-clicking with wire cutter.",
- "Configuration data can be copy+pasted using a data stick." });
+ getDescriptionArray(autoPullAvailable));
+ this.autoPullAvailable = autoPullAvailable;
disableSort = true;
}
- public GT_MetaTileEntity_Hatch_InputBus_ME(String aName, int aTier, String[] aDescription,
- ITexture[][][] aTextures) {
+ public GT_MetaTileEntity_Hatch_InputBus_ME(String aName, boolean autoPullAvailable, int aTier,
+ String[] aDescription, ITexture[][][] aTextures) {
super(aName, aTier, SLOT_COUNT * 2 + 2, aDescription, aTextures);
+ this.autoPullAvailable = autoPullAvailable;
disableSort = true;
}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_Hatch_InputBus_ME(mName, mTier, mDescriptionArray, mTextures);
+ return new GT_MetaTileEntity_Hatch_InputBus_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures);
}
@Override
@@ -214,6 +212,10 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
}
private void setAutoPullItemList(boolean pullItemList) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
autoPullItemList = pullItemList;
if (!autoPullItemList) {
for (int i = 0; i < SLOT_COUNT; i++) {
@@ -272,6 +274,10 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
@Override
public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
setAutoPullItemList(!autoPullItemList);
aPlayer.addChatMessage(
new ChatComponentTranslation(
@@ -523,7 +529,11 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
@Override
public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
final SlotWidget[] aeSlotWidgets = new SlotWidget[16];
- buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+
+ if (autoPullAvailable) {
+ buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+ }
+
builder.widget(
SlotGroup.ofItemHandler(inventoryHandler, 4)
.startFromSlot(0)
@@ -607,8 +617,10 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
.widget(
new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE)
.setPos(82, 30)
- .setSize(12, 12))
- .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ .setSize(12, 12));
+
+ if (autoPullAvailable) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
if (clickData.mouseButton == 0) {
setAutoPullItemList(!autoPullItemList);
} else if (clickData.mouseButton == 1 && !widget.isClient()) {
@@ -631,18 +643,19 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
StatCollector.translateToLocal("GT5U.machines.stocking_bus.auto_pull.tooltip.2")))
.setSize(16, 16)
.setPos(80, 10))
- .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullItemList, this::setAutoPullItemList))
- .widget(TextWidget.dynamicString(() -> {
- boolean isActive = isActive();
- boolean isPowered = isPowered();
- boolean isBooting = isBooting();
- EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN
- : EnumChatFormatting.DARK_RED;
- return color + WailaText.getPowerState(isActive, isPowered, isBooting);
- })
- .setTextAlignment(Alignment.Center)
- .setSize(90, 9)
- .setPos(43, 84))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullItemList, this::setAutoPullItemList));
+ }
+
+ builder.widget(TextWidget.dynamicString(() -> {
+ boolean isActive = isActive();
+ boolean isPowered = isPowered();
+ boolean isBooting = isBooting();
+ EnumChatFormatting color = (isActive && isPowered) ? EnumChatFormatting.GREEN : EnumChatFormatting.DARK_RED;
+ return color + WailaText.getPowerState(isActive, isPowered, isBooting);
+ })
+ .setTextAlignment(Alignment.Center)
+ .setSize(90, 9)
+ .setPos(43, 84))
.widget(
new SlotWidget(inventoryHandler, getManualSlot())
// ghost slots are prioritized over manual slot
@@ -692,6 +705,11 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
+ if (!autoPullAvailable) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ return;
+ }
+
NBTTagCompound tag = accessor.getNBTData();
boolean autopull = tag.getBoolean("autoPull");
int minSize = tag.getInteger("minStackSize");
@@ -709,8 +727,31 @@ public class GT_MetaTileEntity_Hatch_InputBus_ME extends GT_MetaTileEntity_Hatch
@Override
public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
int z) {
+ if (!autoPullAvailable) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ return;
+ }
+
tag.setBoolean("autoPull", autoPullItemList);
tag.setInteger("minStackSize", minAutoPullStackSize);
super.getWailaNBTData(player, tile, tag, world, x, y, z);
}
+
+ private static String[] getDescriptionArray(boolean autoPullAvailable) {
+ List<String> strings = new ArrayList<>(8);
+ strings.add("Advanced item input for Multiblocks");
+ strings.add("Retrieves directly from ME");
+ strings.add("Keeps 16 item types in stock");
+
+ if (autoPullAvailable) {
+ strings.add(
+ "Auto-Pull from ME mode will automatically stock the first 16 items in the ME system, updated every 5 seconds.");
+ strings.add("Toggle by right-clicking with screwdriver, or use the GUI.");
+ strings.add("Use the GUI to limit the minimum stack size for Auto-Pulling.");
+ }
+
+ strings.add("Change ME connection behavior by right-clicking with wire cutter.");
+ strings.add("Configuration data can be copy+pasted using a data stick.");
+ return strings.toArray(new String[0]);
+ }
}
diff --git a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java
index 55718456f2..718691c6a3 100644
--- a/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java
+++ b/src/main/java/gregtech/common/tileentities/machines/GT_MetaTileEntity_Hatch_Input_ME.java
@@ -3,6 +3,7 @@ package gregtech.common.tileentities.machines;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH;
import static gregtech.api.enums.Textures.BlockIcons.OVERLAY_ME_INPUT_FLUID_HATCH_ACTIVE;
+import java.util.ArrayList;
import java.util.Arrays;
import java.util.EnumSet;
import java.util.Iterator;
@@ -94,6 +95,7 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
@Nullable
protected AENetworkProxy gridProxy = null;
+ private final boolean autoPullAvailable;
protected boolean autoPullFluidList = false;
protected int minAutoPullAmount = 1;
protected boolean processingRecipe = false;
@@ -102,29 +104,20 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
protected static final FluidStack[] EMPTY_FLUID_STACK = new FluidStack[0];
- public GT_MetaTileEntity_Hatch_Input_ME(int aID, String aName, String aNameRegional) {
- super(
- aID,
- aName,
- aNameRegional,
- 3,
- 1,
- new String[] { "Advanced fluid input for Multiblocks", "Retrieves directly from ME",
- "Keeps 16 fluid types in stock",
- "Auto-Pull from ME mode will automatically stock the first 16 fluid in the ME system, updated every 5 seconds.",
- "Toggle by right-clicking with screwdriver, or use the GUI.",
- "Use the GUI to limit the minimum stack size for Auto-Pulling.",
- "Change ME connection behavior by right-clicking with wire cutter.",
- "Configuration data can be copy+pasted using a data stick." });
- }
-
- public GT_MetaTileEntity_Hatch_Input_ME(String aName, int aTier, String[] aDescription, ITexture[][][] aTextures) {
+ public GT_MetaTileEntity_Hatch_Input_ME(int aID, boolean autoPullAvailable, String aName, String aNameRegional) {
+ super(aID, aName, aNameRegional, autoPullAvailable ? 6 : 3, 1, getDescriptionArray(autoPullAvailable));
+ this.autoPullAvailable = autoPullAvailable;
+ }
+
+ public GT_MetaTileEntity_Hatch_Input_ME(String aName, boolean autoPullAvailable, int aTier, String[] aDescription,
+ ITexture[][][] aTextures) {
super(aName, 1, aTier, aDescription, aTextures);
+ this.autoPullAvailable = autoPullAvailable;
}
@Override
public MetaTileEntity newMetaEntity(IGregTechTileEntity aTileEntity) {
- return new GT_MetaTileEntity_Hatch_Input_ME(mName, mTier, mDescriptionArray, mTextures);
+ return new GT_MetaTileEntity_Hatch_Input_ME(mName, autoPullAvailable, mTier, mDescriptionArray, mTextures);
}
@Override
@@ -334,6 +327,10 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
}
private void setAutoPullFluidList(boolean pullFluidList) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
autoPullFluidList = pullFluidList;
if (!autoPullFluidList) {
Arrays.fill(storedFluids, null);
@@ -498,6 +495,10 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
@Override
public void onScrewdriverRightClick(ForgeDirection side, EntityPlayer aPlayer, float aX, float aY, float aZ) {
+ if (!autoPullAvailable) {
+ return;
+ }
+
setAutoPullFluidList(!autoPullFluidList);
aPlayer.addChatMessage(
new ChatComponentTranslation(
@@ -584,7 +585,9 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
@Override
public void addUIWidgets(ModularWindow.Builder builder, UIBuildContext buildContext) {
- buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+ if (autoPullAvailable) {
+ buildContext.addSyncedWindow(CONFIG_WINDOW_ID, this::createStackSizeConfigurationWindow);
+ }
builder.widget(
SlotGroup.ofFluidTanks(
@@ -687,11 +690,8 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
.build()
.setPos(new Pos2d(97, 9)));
- builder.widget(
- new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE)
- .setPos(82, 30)
- .setSize(12, 12))
- .widget(new ButtonWidget().setOnClick((clickData, widget) -> {
+ if (autoPullAvailable) {
+ builder.widget(new ButtonWidget().setOnClick((clickData, widget) -> {
if (clickData.mouseButton == 0) {
setAutoPullFluidList(!autoPullFluidList);
} else if (clickData.mouseButton == 1 && !widget.isClient()) {
@@ -715,7 +715,13 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
StatCollector.translateToLocal("GT5U.machines.stocking_hatch.auto_pull.tooltip.2")))
.setSize(16, 16)
.setPos(80, 10))
- .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullFluidList, this::setAutoPullFluidList))
+ .widget(new FakeSyncWidget.BooleanSyncer(() -> autoPullFluidList, this::setAutoPullFluidList));
+ }
+
+ builder.widget(
+ new DrawableWidget().setDrawable(GT_UITextures.PICTURE_ARROW_DOUBLE)
+ .setPos(82, 30)
+ .setSize(12, 12))
.widget(TextWidget.dynamicString(() -> {
boolean isActive = isActive();
boolean isPowered = isPowered();
@@ -781,6 +787,11 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
@Override
public void getWailaBody(ItemStack itemStack, List<String> currenttip, IWailaDataAccessor accessor,
IWailaConfigHandler config) {
+ if (!autoPullAvailable) {
+ super.getWailaBody(itemStack, currenttip, accessor, config);
+ return;
+ }
+
NBTTagCompound tag = accessor.getNBTData();
boolean autopull = tag.getBoolean("autoPull");
int minSize = tag.getInteger("minAmount");
@@ -798,9 +809,31 @@ public class GT_MetaTileEntity_Hatch_Input_ME extends GT_MetaTileEntity_Hatch_In
@Override
public void getWailaNBTData(EntityPlayerMP player, TileEntity tile, NBTTagCompound tag, World world, int x, int y,
int z) {
+ if (!autoPullAvailable) {
+ super.getWailaNBTData(player, tile, tag, world, x, y, z);
+ return;
+ }
+
tag.setBoolean("autoPull", autoPullFluidList);
tag.setInteger("minAmount", minAutoPullAmount);
super.getWailaNBTData(player, tile, tag, world, x, y, z);
}
+ private static String[] getDescriptionArray(boolean autoPullAvailable) {
+ List<String> strings = new ArrayList<>(8);
+ strings.add("Advanced fluid input for Multiblocks");
+ strings.add("Retrieves directly from ME");
+ strings.add("Keeps 16 fluid types in stock");
+
+ if (autoPullAvailable) {
+ strings.add(
+ "Auto-Pull from ME mode will automatically stock the first 16 fluid in the ME system, updated every 5 seconds.");
+ strings.add("Toggle by right-clicking with screwdriver, or use the GUI.");
+ strings.add("Use the GUI to limit the minimum stack size for Auto-Pulling.");
+ }
+
+ strings.add("Change ME connection behavior by right-clicking with wire cutter.");
+ strings.add("Configuration data can be copy+pasted using a data stick.");
+ return strings.toArray(new String[0]);
+ }
}
diff --git a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
index 971bafc8f8..fb5cafc259 100644
--- a/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
+++ b/src/main/java/gregtech/loaders/preload/GT_Loader_MetaTileEntities.java
@@ -151,6 +151,7 @@ import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_IV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_LuV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ME_ADVANCED;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_MV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_UHV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_BUS_ULV;
@@ -162,6 +163,7 @@ import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_IV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_LuV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME;
+import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ME_ADVANCED;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_MV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_UHV;
import static gregtech.api.enums.MetaTileEntityIDs.INPUT_HATCH_ULV;
@@ -2315,12 +2317,30 @@ public class GT_Loader_MetaTileEntities implements Runnable { // TODO CHECK CIRC
ItemList.Hatch_Output_Bus_ME.set(
new GT_MetaTileEntity_Hatch_OutputBus_ME(OUTPUT_BUS_ME.ID, "hatch.output_bus.me", "Output Bus (ME)")
.getStackForm(1L));
+ ItemList.Hatch_Input_Bus_ME_Basic.set(
+ new GT_MetaTileEntity_Hatch_InputBus_ME(
+ INPUT_BUS_ME.ID,
+ false,
+ "hatch.input_bus.me.basic",
+ "Stocking Input Bus (ME)").getStackForm(1L));
ItemList.Hatch_Input_Bus_ME.set(
- new GT_MetaTileEntity_Hatch_InputBus_ME(INPUT_BUS_ME.ID, "hatch.input_bus.me", "Stocking Input Bus (ME)")
- .getStackForm(1L));
+ new GT_MetaTileEntity_Hatch_InputBus_ME(
+ INPUT_BUS_ME_ADVANCED.ID,
+ true,
+ "hatch.input_bus.me",
+ "Advanced Stocking Input Bus (ME)").getStackForm(1L));
+ ItemList.Hatch_Input_ME_Basic.set(
+ new GT_MetaTileEntity_Hatch_Input_ME(
+ INPUT_HATCH_ME.ID,
+ false,
+ "hatch.input.me.basic",
+ "Stocking Input Hatch (ME)").getStackForm(1L));
ItemList.Hatch_Input_ME.set(
- new GT_MetaTileEntity_Hatch_Input_ME(INPUT_HATCH_ME.ID, "hatch.input.me", "Stocking Input Hatch (ME)")
- .getStackForm(1L));
+ new GT_MetaTileEntity_Hatch_Input_ME(
+ INPUT_HATCH_ME_ADVANCED.ID,
+ true,
+ "hatch.input.me",
+ "Advanced Stocking Input Hatch (ME)").getStackForm(1L));
ItemList.Hatch_Output_ME.set(
new GT_MetaTileEntity_Hatch_Output_ME(OUTPUT_HATCH_ME.ID, "hatch.output.me", "Output Hatch (ME)")
.getStackForm(1L));