aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/gregtech/nei
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/gregtech/nei')
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_AssLineHandler.java21
-rw-r--r--src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java878
-rw-r--r--src/main/java/gregtech/nei/HeatingCoilSpecialValueFormatter.java22
-rw-r--r--src/main/java/gregtech/nei/IMCForNEI.java71
-rw-r--r--src/main/java/gregtech/nei/INEISpecialInfoFormatter.java21
-rw-r--r--src/main/java/gregtech/nei/NEIRecipeInfo.java45
-rw-r--r--src/main/java/gregtech/nei/NEI_GT_Config.java149
-rw-r--r--src/main/java/gregtech/nei/NEI_TransferRectHost.java14
-rw-r--r--src/main/java/gregtech/nei/RecipeDisplayInfo.java99
-rw-r--r--src/main/java/gregtech/nei/RecipeMapHandler.java39
-rw-r--r--src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java36
-rw-r--r--src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java27
-rw-r--r--src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java (renamed from src/main/java/gregtech/nei/FusionSpecialValueFormatter.java)25
-rw-r--r--src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java30
-rw-r--r--src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java24
-rw-r--r--src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java49
16 files changed, 682 insertions, 868 deletions
diff --git a/src/main/java/gregtech/nei/GT_NEI_AssLineHandler.java b/src/main/java/gregtech/nei/GT_NEI_AssLineHandler.java
deleted file mode 100644
index bb14a02618..0000000000
--- a/src/main/java/gregtech/nei/GT_NEI_AssLineHandler.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package gregtech.nei;
-
-import gregtech.api.util.GT_Recipe;
-
-@Deprecated
-public class GT_NEI_AssLineHandler extends RecipeMapHandler {
-
- public GT_NEI_AssLineHandler(GT_Recipe.GT_Recipe_Map aRecipeMap) {
- super(aRecipeMap);
- }
-
- @Override
- public String getGuiTexture() {
- return null;
- }
-
- @Override
- public String getRecipeName() {
- return null;
- }
-}
diff --git a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
index f61bd7621f..dd99b6bb0e 100644
--- a/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
+++ b/src/main/java/gregtech/nei/GT_NEI_DefaultHandler.java
@@ -1,12 +1,12 @@
package gregtech.nei;
-import static codechicken.nei.recipe.RecipeInfo.getGuiOffset;
+import static gregtech.api.enums.GT_Values.V;
-import java.awt.Point;
import java.awt.Rectangle;
import java.lang.ref.SoftReference;
import java.text.DecimalFormat;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
@@ -16,14 +16,15 @@ import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.stream.Collectors;
+import java.util.stream.Stream;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.FontRenderer;
-import net.minecraft.client.gui.inventory.GuiContainer;
import net.minecraft.item.ItemStack;
+import net.minecraft.util.StatCollector;
import net.minecraftforge.fluids.FluidStack;
import org.apache.commons.lang3.Range;
@@ -38,58 +39,62 @@ import com.gtnewhorizons.modularui.api.screen.ModularWindow;
import com.gtnewhorizons.modularui.api.widget.Widget;
import com.gtnewhorizons.modularui.common.widget.SlotWidget;
-import codechicken.lib.gui.GuiDraw;
import codechicken.nei.NEIClientUtils;
import codechicken.nei.PositionedStack;
-import codechicken.nei.guihook.GuiContainerManager;
-import codechicken.nei.guihook.IContainerInputHandler;
-import codechicken.nei.guihook.IContainerTooltipHandler;
-import codechicken.nei.recipe.GuiCraftingRecipe;
import codechicken.nei.recipe.GuiRecipe;
-import codechicken.nei.recipe.GuiUsageRecipe;
import codechicken.nei.recipe.ICraftingHandler;
import codechicken.nei.recipe.IUsageHandler;
import codechicken.nei.recipe.RecipeCatalysts;
import codechicken.nei.recipe.TemplateRecipeHandler;
import gregtech.GT_Mod;
-import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
import gregtech.api.enums.OrePrefixes;
import gregtech.api.enums.SteamVariant;
-import gregtech.api.gui.GT_GUIContainer;
+import gregtech.api.gui.GT_GUIColorOverride;
+import gregtech.api.gui.modularui.GT_UITextures;
import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.IOverclockDescriptionProvider;
import gregtech.api.objects.ItemData;
-import gregtech.api.util.GT_LanguageManager;
-import gregtech.api.util.GT_Log;
+import gregtech.api.objects.overclockdescriber.EUNoOverclockDescriber;
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.BasicUIProperties;
+import gregtech.api.recipe.NEIRecipeProperties;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeCategorySetting;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMapFrontend;
import gregtech.api.util.GT_OreDictUnificator;
+import gregtech.api.util.GT_OverclockCalculator;
import gregtech.api.util.GT_Recipe;
import gregtech.api.util.GT_Utility;
import gregtech.common.blocks.GT_Item_Machines;
import gregtech.common.gui.modularui.UIHelper;
-import gregtech.common.power.Power;
-public class GT_NEI_DefaultHandler extends RecipeMapHandler {
+public class GT_NEI_DefaultHandler extends TemplateRecipeHandler {
- public static final int sOffsetX = 5;
- public static final int sOffsetY = 11;
+ private static final int offsetX = 5;
+ private static final int offsetY = 11;
+ protected static final Pos2d WINDOW_OFFSET = new Pos2d(-offsetX, -offsetY);
- private static final ConcurrentMap<GT_Recipe.GT_Recipe_Map, SortedRecipeListCache> CACHE = new ConcurrentHashMap<>();
+ private static final ConcurrentMap<RecipeCategory, SortedRecipeListCache> CACHE = new ConcurrentHashMap<>();
- protected Power mPower;
- private String mRecipeName; // Name of the handler displayed on top
- private NEIHandlerAbsoluteTooltip mRecipeNameTooltip;
private static final int RECIPE_NAME_WIDTH = 140;
/**
* Static version of {@link TemplateRecipeHandler#cycleticks}. Can be referenced from cached recipes.
*/
- public static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis());
+ private static int cycleTicksStatic = Math.abs((int) System.currentTimeMillis());
/**
* Basically {@link #cycleTicksStatic} but always updated even while holding shift
*/
private static int drawTicks;
+ private static final int PROGRESSBAR_CYCLE_TICKS = 200;
- protected static final int PROGRESSBAR_CYCLE_TICKS = 200;
+ protected final RecipeCategory recipeCategory;
+ protected final RecipeMap<?> recipeMap;
+ protected final RecipeMapFrontend frontend;
+ protected final BasicUIProperties uiProperties;
+ protected final NEIRecipeProperties neiProperties;
protected final ModularWindow modularWindow;
protected final ItemStackHandler itemInputsInventory;
@@ -97,80 +102,117 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
protected final ItemStackHandler specialSlotInventory;
protected final ItemStackHandler fluidInputsInventory;
protected final ItemStackHandler fluidOutputsInventory;
- protected static final Pos2d WINDOW_OFFSET = new Pos2d(-sOffsetX, -sOffsetY);
- static {
- GuiContainerManager.addInputHandler(new GT_RectHandler());
- GuiContainerManager.addTooltipHandler(new GT_RectHandler());
- }
-
- public GT_NEI_DefaultHandler(GT_Recipe.GT_Recipe_Map aRecipeMap) {
- super(aRecipeMap);
- Rectangle transferRect = new Rectangle(aRecipeMap.neiTransferRect);
- transferRect.translate(WINDOW_OFFSET.x, WINDOW_OFFSET.y);
- this.transferRects.add(new RecipeTransferRect(transferRect, getOverlayIdentifier()));
-
- if (mRecipeMap.useModularUI) {
- ModularWindow.Builder builder = mRecipeMap.createNEITemplate(
- itemInputsInventory = new ItemStackHandler(mRecipeMap.mUsualInputCount),
- itemOutputsInventory = new ItemStackHandler(mRecipeMap.mUsualOutputCount),
- specialSlotInventory = new ItemStackHandler(1),
- fluidInputsInventory = new ItemStackHandler(mRecipeMap.getUsualFluidInputCount()),
- fluidOutputsInventory = new ItemStackHandler(mRecipeMap.getUsualFluidOutputCount()),
- () -> ((float) getDrawTicks() % PROGRESSBAR_CYCLE_TICKS) / PROGRESSBAR_CYCLE_TICKS,
- WINDOW_OFFSET);
- modularWindow = builder.build();
- UIInfos.initializeWindow(Minecraft.getMinecraft().thePlayer, modularWindow);
- } else {
- itemInputsInventory = itemOutputsInventory = specialSlotInventory = fluidInputsInventory = fluidOutputsInventory = null;
- modularWindow = null;
- }
- }
-
- @Deprecated
- public List<GT_Recipe> getSortedRecipes() {
- List<GT_Recipe> result = new ArrayList<>(this.mRecipeMap.mRecipeList);
- Collections.sort(result);
- return result;
+ protected OverclockDescriber overclockDescriber;
+ /**
+ * Localized name of this handler displayed on the top.
+ */
+ private String recipeNameDisplay;
+ /**
+ * Tooltip shown while hovering over header of this handler. Can be null if the full name fits in the screen.
+ */
+ private NEIHandlerAbsoluteTooltip recipeNameTooltip;
+
+ protected final GT_GUIColorOverride colorOverride = GT_GUIColorOverride
+ .get(GT_UITextures.BACKGROUND_NEI_SINGLE_RECIPE.location);
+ private int neiTextColorOverride = -1;
+
+ public GT_NEI_DefaultHandler(RecipeCategory recipeCategory) {
+ this.recipeCategory = recipeCategory;
+ this.recipeMap = recipeCategory.recipeMap;
+ this.frontend = recipeMap.getFrontend();
+ this.uiProperties = frontend.getUIProperties();
+ this.neiProperties = frontend.getNEIProperties();
+ uiProperties.neiTransferRect.forEach(transferRect -> {
+ transferRect = new Rectangle(transferRect);
+ transferRect.translate(WINDOW_OFFSET.x, WINDOW_OFFSET.y);
+ this.transferRects.add(new RecipeTransferRect(transferRect, recipeMap.unlocalizedName));
+ });
+
+ ModularWindow.Builder builder = frontend.createNEITemplate(
+ itemInputsInventory = new ItemStackHandler(uiProperties.maxItemInputs),
+ itemOutputsInventory = new ItemStackHandler(uiProperties.maxItemOutputs),
+ specialSlotInventory = new ItemStackHandler(1),
+ fluidInputsInventory = new ItemStackHandler(uiProperties.maxFluidInputs),
+ fluidOutputsInventory = new ItemStackHandler(uiProperties.maxFluidOutputs),
+ () -> ((float) getDrawTicks() % PROGRESSBAR_CYCLE_TICKS) / PROGRESSBAR_CYCLE_TICKS,
+ WINDOW_OFFSET);
+ modularWindow = builder.build();
+ UIInfos.initializeWindow(Minecraft.getMinecraft().thePlayer, modularWindow);
+ }
+
+ public RecipeMap<?> getRecipeMap() {
+ return recipeMap;
}
private SortedRecipeListCache getCacheHolder() {
- return CACHE.computeIfAbsent(mRecipeMap, m -> new SortedRecipeListCache());
+ return CACHE.computeIfAbsent(recipeCategory, m -> new SortedRecipeListCache());
}
public List<CachedDefaultRecipe> getCache() {
SortedRecipeListCache cacheHolder = getCacheHolder();
List<CachedDefaultRecipe> cache;
- if (cacheHolder.getCachedRecipesVersion() != GT_Mod.gregtechproxy.getReloadCount()
+ if (cacheHolder.getCachedRecipesVersion() != GT_Mod.gregtechproxy.getNEIReloadCount()
|| (cache = cacheHolder.getCachedRecipes()) == null) {
- cache = mRecipeMap.mRecipeList.stream() // do not use parallel stream. This is already parallelized by NEI
+ RecipeCategory defaultCategory = recipeMap.getDefaultRecipeCategory();
+ Collection<GT_Recipe> recipes;
+ if (this.recipeCategory == defaultCategory) {
+ // This is main category, so merge categories that are configured as such
+ Stream<GT_Recipe> recipesToMerge = recipeMap.getBackend()
+ .getRecipeCategoryMap()
+ .entrySet()
+ .stream()
+ .flatMap(entry -> {
+ boolean merge = entry.getKey() != defaultCategory && GT_Mod.gregtechproxy.recipeCategorySettings
+ .getOrDefault(entry.getKey(), RecipeCategorySetting.getDefault())
+ == RecipeCategorySetting.MERGE;
+ return merge ? entry.getValue()
+ .stream() : Stream.empty();
+ });
+ recipes = Stream.concat(
+ recipesToMerge,
+ recipeMap.getBackend()
+ .getRecipesByCategory(defaultCategory)
+ .stream())
+ .collect(Collectors.toList());
+ } else {
+ // This is "sub" category
+ if (GT_Mod.gregtechproxy.recipeCategorySettings
+ .getOrDefault(recipeCategory, RecipeCategorySetting.getDefault()) == RecipeCategorySetting.ENABLE) {
+ recipes = recipeMap.getBackend()
+ .getRecipesByCategory(recipeCategory);
+ } else {
+ recipes = Collections.emptyList();
+ }
+ }
+ cache = recipes.stream() // do not use parallel stream. This is already parallelized by NEI
.filter(r -> !r.mHidden)
- .sorted()
+ .sorted(neiProperties.comparator)
.map(CachedDefaultRecipe::new)
.collect(Collectors.toList());
// while the NEI parallelize handlers, for each individual handler it still uses sequential execution model,
// so we do not need any synchronization here
// even if it does break, at worst case it's just recreating the cache multiple times, which should be fine
cacheHolder.setCachedRecipes(cache);
- cacheHolder.setCachedRecipesVersion(GT_Mod.gregtechproxy.getReloadCount());
+ cacheHolder.setCachedRecipesVersion(GT_Mod.gregtechproxy.getNEIReloadCount());
}
return cache;
}
@Override
public TemplateRecipeHandler newInstance() {
- return new GT_NEI_DefaultHandler(this.mRecipeMap);
+ return new GT_NEI_DefaultHandler(recipeCategory);
}
@Override
public void loadCraftingRecipes(String outputId, Object... results) {
- if (outputId.equals(getOverlayIdentifier())) {
- if (results.length > 0 && results[0] instanceof Power) {
- mPower = (Power) results[0];
- if (mRecipeMap.useComparatorForNEI) {
- loadTieredCraftingRecipesWithPower(mPower);
+ if (outputId.equals(recipeMap.unlocalizedName)) {
+ if (results.length > 0 && results[0] instanceof OverclockDescriber) {
+ overclockDescriber = (OverclockDescriber) results[0];
+ if (neiProperties.useCustomFilter) {
+ loadTieredRecipesWithCustomFilter(overclockDescriber);
} else {
- loadTieredCraftingRecipesUpTo(mPower.getTier());
+ loadTieredRecipesUpTo(overclockDescriber.getTier());
}
} else {
arecipes.addAll(getCache());
@@ -218,29 +260,27 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
}
}
- private void loadTieredCraftingRecipesWithPower(Power power) {
- arecipes.addAll(getTieredRecipes(power));
+ private void loadTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) {
+ arecipes.addAll(getTieredRecipesWithCustomFilter(overclockDescriber));
}
- private List<CachedDefaultRecipe> getTieredRecipes(Power power) {
+ private List<CachedDefaultRecipe> getTieredRecipesWithCustomFilter(OverclockDescriber overclockDescriber) {
List<CachedDefaultRecipe> recipes = getCache();
- if (recipes.size() > 0) {
+ if (!recipes.isEmpty()) {
recipes = recipes.stream()
- .filter(
- recipe -> power.compareTo(GT_Utility.getTier(recipe.mRecipe.mEUt), recipe.mRecipe.mSpecialValue)
- >= 0)
+ .filter(recipe -> overclockDescriber.canHandle(recipe.mRecipe))
.collect(Collectors.toList());
}
return recipes;
}
- private void loadTieredCraftingRecipesUpTo(byte upperTier) {
+ private void loadTieredRecipesUpTo(byte upperTier) {
arecipes.addAll(getTieredRecipes(upperTier));
}
private List<CachedDefaultRecipe> getTieredRecipes(byte upperTier) {
List<CachedDefaultRecipe> recipes = getCache();
- if (recipes.size() > 0) {
+ if (!recipes.isEmpty()) {
Range<Integer> indexRange = getCacheHolder().getIndexRangeForTiers((byte) 0, upperTier);
recipes = recipes.subList(indexRange.getMinimum(), indexRange.getMaximum() + 1);
}
@@ -271,14 +311,14 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
ItemStack candidate = (ItemStack) ingredients[0];
GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) newInstance();
if (RecipeCatalysts.containsCatalyst(handler, candidate)) {
- IMetaTileEntity gtTileEntity = GT_Item_Machines.getMetaTileEntity(candidate);
- Power power;
- if (gtTileEntity != null) {
- power = gtTileEntity.getPower();
+ IMetaTileEntity metaTile = GT_Item_Machines.getMetaTileEntity(candidate);
+ OverclockDescriber overclockDescriber;
+ if (metaTile instanceof IOverclockDescriptionProvider provider) {
+ overclockDescriber = provider.getOverclockDescriber();
} else {
- power = null;
+ overclockDescriber = null;
}
- handler.loadCraftingRecipes(getOverlayIdentifier(), power);
+ handler.loadCraftingRecipes(recipeMap.unlocalizedName, overclockDescriber);
return handler;
}
}
@@ -288,37 +328,27 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
@Override
public ICraftingHandler getRecipeHandler(String outputId, Object... results) {
GT_NEI_DefaultHandler handler = (GT_NEI_DefaultHandler) super.getRecipeHandler(outputId, results);
- if (results.length > 0 && results[0] instanceof Power) {
- handler.mPower = (Power) results[0];
+ if (results.length > 0 && results[0] instanceof OverclockDescriber) {
+ handler.overclockDescriber = (OverclockDescriber) results[0];
}
return handler;
}
@Override
public String getOverlayIdentifier() {
- return this.mRecipeMap.mNEIName;
+ return recipeCategory.unlocalizedName;
}
@Override
public void drawBackground(int recipe) {
- if (modularWindow != null) {
- drawUI(modularWindow);
- } else {
- GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
- GuiDraw.changeTexture(getGuiTexture());
- GuiDraw.drawTexturedModalRect(-4, -8, 1, 3, 174, 78);
- }
+ drawUI(modularWindow);
}
@Override
public void drawForeground(int recipe) {
- if (mRecipeMap.useModularUI) {
- GL11.glColor4f(1, 1, 1, 1);
- GL11.glDisable(GL11.GL_LIGHTING);
- drawExtras(recipe);
- } else {
- super.drawForeground(recipe);
- }
+ GL11.glColor4f(1, 1, 1, 1);
+ GL11.glDisable(GL11.GL_LIGHTING);
+ drawExtras(recipe);
}
@Override
@@ -335,71 +365,69 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
@Override
public String getRecipeName() {
- if (mRecipeName == null) {
- mRecipeName = computeRecipeName();
- updateOverrideTextColor();
- mRecipeMap.updateNEITextColorOverride();
+ if (recipeNameDisplay == null) {
+ recipeNameDisplay = computeRecipeName();
+ neiTextColorOverride = colorOverride.getTextColorOrDefault("nei", -1);
}
- return mRecipeName;
+ return recipeNameDisplay;
}
private String computeRecipeName() {
- String recipeName = GT_LanguageManager.getTranslation(this.mRecipeMap.mUnlocalizedName);
- if (mPower != null) {
- recipeName = addSuffixToRecipeName(recipeName, mPower.getTierString() + ")");
+ String recipeName = StatCollector.translateToLocal(recipeCategory.unlocalizedName);
+ if (overclockDescriber != null) {
+ String suffix = "(" + overclockDescriber.getTierString() + ")";
+ // Space will be cropped if title exceeds
+ return shrinkRecipeName(recipeName + " ", suffix);
+ } else {
+ return shrinkRecipeName(recipeName, "");
}
- return recipeName;
}
- private String addSuffixToRecipeName(final String aRecipeName, final String suffix) {
- final String recipeName;
- final String separator;
+ private String shrinkRecipeName(final String originalRecipeName, final String suffix) {
FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
- int recipeNameWidth = fontRenderer.getStringWidth(aRecipeName);
- int targetWidth = RECIPE_NAME_WIDTH - fontRenderer.getStringWidth(suffix);
- if (recipeNameWidth + fontRenderer.getStringWidth(" (") <= targetWidth) {
- recipeName = aRecipeName;
- separator = " (";
- } else {
- setupRecipeNameTooltip(aRecipeName + " (" + suffix);
- separator = "...(";
- recipeName = shrinkRecipeName(aRecipeName, targetWidth - fontRenderer.getStringWidth(separator));
+ int suffixWidth = fontRenderer.getStringWidth(suffix);
+ if (fontRenderer.getStringWidth(originalRecipeName) + suffixWidth <= RECIPE_NAME_WIDTH) {
+ return originalRecipeName + suffix;
}
- return recipeName + separator + suffix;
- }
- private String shrinkRecipeName(String recipeName, int targetWidth) {
- FontRenderer fontRenderer = Minecraft.getMinecraft().fontRenderer;
+ final String ellipsis = "...";
+ final int ellipsisWidth = fontRenderer.getStringWidth(ellipsis);
+ String recipeName = originalRecipeName;
do {
- recipeName = recipeName.substring(0, recipeName.length() - 2);
- } while (fontRenderer.getStringWidth(recipeName) > targetWidth);
- return recipeName;
+ recipeName = recipeName.substring(0, recipeName.length() - 1);
+ } while (fontRenderer.getStringWidth(recipeName) + ellipsisWidth + suffixWidth > RECIPE_NAME_WIDTH);
+ setupRecipeNameTooltip(originalRecipeName + suffix);
+ return recipeName + ellipsis + suffix;
}
private void setupRecipeNameTooltip(String tooltip) {
- mRecipeNameTooltip = new NEIHandlerAbsoluteTooltip(tooltip, new Rectangle(13, -34, RECIPE_NAME_WIDTH - 1, 11));
+ recipeNameTooltip = new NEIHandlerAbsoluteTooltip(tooltip, new Rectangle(13, -34, RECIPE_NAME_WIDTH - 1, 11));
}
@Override
public String getRecipeTabName() {
- return GT_LanguageManager.getTranslation(this.mRecipeMap.mUnlocalizedName);
+ return StatCollector.translateToLocal(recipeCategory.unlocalizedName);
}
@Override
public String getGuiTexture() {
- return this.mRecipeMap.mNEIGUIPath;
+ // not called
+ return "";
}
@Override
public List<String> handleItemTooltip(GuiRecipe<?> gui, ItemStack aStack, List<String> currentTip,
int aRecipeIndex) {
- CachedRecipe tObject = this.arecipes.get(aRecipeIndex);
- if (tObject instanceof CachedDefaultRecipe) {
- currentTip = mRecipeMap.handleNEIItemTooltip(aStack, currentTip, (CachedDefaultRecipe) tObject);
+ if (recipeNameTooltip != null) {
+ recipeNameTooltip.handleTooltip(currentTip, aRecipeIndex);
+ }
+ if (aStack == null) {
+ return currentTip;
}
- if (mRecipeNameTooltip != null) {
- mRecipeNameTooltip.handleTooltip(currentTip, aRecipeIndex);
+ CachedRecipe tObject = this.arecipes.get(aRecipeIndex);
+ if (tObject instanceof CachedDefaultRecipe) {
+ currentTip = frontend.handleNEIItemTooltip(aStack, currentTip, (CachedDefaultRecipe) tObject);
}
return currentTip;
}
@@ -409,40 +437,42 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
CachedDefaultRecipe cachedRecipe = ((CachedDefaultRecipe) this.arecipes.get(aRecipeIndex));
drawDescription(cachedRecipe);
- mRecipeMap.drawNEIOverlays(cachedRecipe);
+ frontend.drawNEIOverlays(cachedRecipe);
}
private void drawDescription(CachedDefaultRecipe cachedRecipe) {
GT_Recipe recipe = cachedRecipe.mRecipe;
- if (mPower == null) {
- mPower = mRecipeMap.getPowerFromRecipeMap();
+ if (overclockDescriber == null) {
+ // By default, assume generic LV EU with no overclocks
+ overclockDescriber = new EUNoOverclockDescriber((byte) 1, uiProperties.amperage);
}
- mPower.computePowerUsageAndDuration(recipe.mEUt, recipe.mDuration, recipe.mSpecialValue);
-
- mRecipeMap
- .drawNEIDescription(new NEIRecipeInfo(recipe, mRecipeMap, cachedRecipe, mPower, getDescriptionYOffset()));
- }
- @Deprecated
- protected String getSpecialInfo(int specialValue) {
- return "";
- }
+ GT_OverclockCalculator calculator = overclockDescriber.createCalculator(
+ new GT_OverclockCalculator().setRecipeEUt(recipe.mEUt)
+ .setDuration(recipe.mDuration),
+ recipe);
+ calculator.calculate();
- @Deprecated
- protected void drawLine(int lineNumber, String line) {
- drawText(10, getDescriptionYOffset() + lineNumber * 10, line, 0xFF000000);
+ frontend.drawDescription(
+ new RecipeDisplayInfo(
+ recipe,
+ recipeMap,
+ overclockDescriber,
+ calculator,
+ getDescriptionYOffset(),
+ neiTextColorOverride));
}
protected int getDescriptionYOffset() {
- return mRecipeMap.neiBackgroundSize.height + mRecipeMap.neiBackgroundOffset.y + WINDOW_OFFSET.y + 3;
+ return neiProperties.recipeBackgroundSize.height + neiProperties.recipeBackgroundOffset.y + WINDOW_OFFSET.y + 3;
}
protected void drawUI(ModularWindow window) {
for (IDrawable background : window.getBackground()) {
GlStateManager.pushMatrix();
GlStateManager.translate(
- WINDOW_OFFSET.x + mRecipeMap.neiBackgroundOffset.x,
- WINDOW_OFFSET.y + mRecipeMap.neiBackgroundOffset.y,
+ WINDOW_OFFSET.x + neiProperties.recipeBackgroundOffset.x,
+ WINDOW_OFFSET.y + neiProperties.recipeBackgroundOffset.y,
0);
GlStateManager.color(1f, 1f, 1f, 1f);
background.draw(Pos2d.ZERO, window.getSize(), 0);
@@ -469,99 +499,6 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
return drawTicks;
}
- public static class GT_RectHandler implements IContainerInputHandler, IContainerTooltipHandler {
-
- @Override
- public boolean mouseClicked(GuiContainer gui, int mouseX, int mouseY, int button) {
- if (canHandle(gui)) {
- NEI_TransferRectHost host = (NEI_TransferRectHost) gui;
- if (hostRectContainsMouse(host, getMousePos(gui, mouseX, mouseY))) {
- if (button == 0) {
- return handleTransferRectMouseClick(host, false);
- }
- if (button == 1) {
- return handleTransferRectMouseClick(host, true);
- }
- }
- }
- return false;
- }
-
- private Point getMousePos(GuiContainer gui, int mouseX, int mouseY) {
- return new Point(
- mouseX - ((GT_GUIContainer) gui).getLeft() - getGuiOffset(gui)[0],
- mouseY - ((GT_GUIContainer) gui).getTop() - getGuiOffset(gui)[1]);
- }
-
- private boolean hostRectContainsMouse(NEI_TransferRectHost host, Point mousePos) {
- return host.getNeiTransferRect()
- .contains(mousePos);
- }
-
- private boolean handleTransferRectMouseClick(NEI_TransferRectHost gui, boolean usage) {
- String mNEI = gui.getNeiTransferRectString();
- Object[] args = gui.getNeiTransferRectArgs();
- return usage ? GuiUsageRecipe.openRecipeGui(mNEI) : GuiCraftingRecipe.openRecipeGui(mNEI, args);
- }
-
- @Override
- public boolean lastKeyTyped(GuiContainer gui, char keyChar, int keyCode) {
- return false;
- }
-
- public boolean canHandle(GuiContainer gui) {
- return gui instanceof NEI_TransferRectHost
- && GT_Utility.isStringValid(((NEI_TransferRectHost) gui).getNeiTransferRectString());
- }
-
- @Override
- public List<String> handleTooltip(GuiContainer gui, int mouseX, int mouseY, List<String> currentTip) {
- if ((canHandle(gui)) && (currentTip.isEmpty())) {
- NEI_TransferRectHost host = (NEI_TransferRectHost) gui;
- if (hostRectContainsMouse(host, getMousePos(gui, mouseX, mouseY))) {
- currentTip.add(host.getNeiTransferRectTooltip());
- }
- }
- return currentTip;
- }
-
- @Override
- public List<String> handleItemDisplayName(GuiContainer gui, ItemStack itemstack, List<String> currentTip) {
- return currentTip;
- }
-
- @Override
- public List<String> handleItemTooltip(GuiContainer gui, ItemStack itemstack, int mouseX, int mouseY,
- List<String> currentTip) {
- return currentTip;
- }
-
- @Override
- public boolean keyTyped(GuiContainer gui, char keyChar, int keyCode) {
- return false;
- }
-
- @Override
- public void onKeyTyped(GuiContainer gui, char keyChar, int keyID) {}
-
- @Override
- public void onMouseClicked(GuiContainer gui, int mouseX, int mouseY, int button) {}
-
- @Override
- public void onMouseUp(GuiContainer gui, int mouseX, int mouseY, int button) {}
-
- @Override
- public boolean mouseScrolled(GuiContainer gui, int mouseX, int mouseY, int scrolled) {
- return false;
- }
-
- @Override
- public void onMouseScrolled(GuiContainer gui, int mouseX, int mouseY, int scrolled) {}
-
- @Override
- public void onMouseDragged(GuiContainer gui, int mouseX, int mouseY, int button, long heldTime) {}
- }
-
public static class FixedPositionedStack extends PositionedStack {
public static final DecimalFormat chanceFormat = new DecimalFormat("##0.##%");
@@ -569,26 +506,6 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public final int realStackSize;
public final boolean renderRealStackSize;
- @Deprecated
- public FixedPositionedStack(Object object, int x, int y) {
- this(object, true, x, y, 0, true);
- }
-
- @Deprecated
- public FixedPositionedStack(Object object, int x, int y, boolean aUnificate) {
- this(object, true, x, y, 0, aUnificate);
- }
-
- @Deprecated
- public FixedPositionedStack(Object object, int x, int y, int aChance) {
- this(object, true, x, y, aChance, true);
- }
-
- @Deprecated
- public FixedPositionedStack(Object object, int x, int y, int aChance, boolean aUnificate) {
- this(object, true, x, y, aChance, aUnificate);
- }
-
public FixedPositionedStack(Object object, boolean renderRealStackSizes, int x, int y) {
this(object, renderRealStackSizes, x, y, 0, true);
}
@@ -633,366 +550,138 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
public final List<PositionedStack> mOutputs;
public final List<PositionedStack> mInputs;
- // Draws a grid of items for NEI rendering.
- private void drawNEIItemGrid(ItemStack[] ItemArray, int x_coord_origin, int y_coord_origin, int x_dir_max_items,
- int y_max_dir_max_items, GT_Recipe Recipe, boolean is_input) {
- if (ItemArray.length > x_dir_max_items * y_max_dir_max_items) {
- GT_Log.err.println("Recipe cannot be properly displayed in NEI due to too many items.");
- }
- // 18 pixels to get to a new grid for placing an item tile since they are 16x16 and have 1 pixel buffers
- // around them.
- int x_max = x_coord_origin + x_dir_max_items * 18;
-
- // Temp variables to keep track of current coordinates to place item at.
- int x_coord = x_coord_origin;
- int y_coord = y_coord_origin;
-
- // Iterate over all items in array and display them.
- int special_counter = 0;
- for (ItemStack item : ItemArray) {
- if (item != GT_Values.NI) {
- if (is_input) {
- mInputs.add(
- new FixedPositionedStack(
- item,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- x_coord,
- y_coord,
- true));
- } else {
- mOutputs.add(
- new FixedPositionedStack(
- item,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- x_coord,
- y_coord,
- Recipe.getOutputChance(special_counter),
- GT_NEI_DefaultHandler.this.mRecipeMap.mNEIUnificateOutput));
- special_counter++;
- }
- x_coord += 18;
- if (x_coord == x_max) {
- x_coord = x_coord_origin;
- y_coord += 18;
- }
- }
- }
- }
-
- @SuppressWarnings("deprecation")
public CachedDefaultRecipe(GT_Recipe aRecipe) {
super();
this.mRecipe = aRecipe;
- List<PositionedStack> maybeIn;
- List<PositionedStack> maybeOut;
-
- try {
- maybeIn = GT_NEI_DefaultHandler.this.mRecipeMap.getInputPositionedStacks(aRecipe);
- } catch (NullPointerException npe) {
- maybeIn = null;
- GT_Log.err.println("CachedDefaultRecipe - Invalid InputPositionedStacks " + aRecipe);
- npe.printStackTrace(GT_Log.err);
- }
- try {
- maybeOut = GT_NEI_DefaultHandler.this.mRecipeMap.getOutputPositionedStacks(aRecipe);
- } catch (NullPointerException npe) {
- maybeOut = null;
- GT_Log.err.println("CachedDefaultRecipe - Invalid OutputPositionedStacks " + aRecipe);
- npe.printStackTrace(GT_Log.err);
- }
-
- if (maybeOut != null && maybeIn != null) {
- mOutputs = maybeOut;
- mInputs = maybeIn;
- return;
- }
-
- try {
- maybeIn = aRecipe.getInputPositionedStacks();
- } catch (NullPointerException npe) {
- maybeIn = null;
- GT_Log.err.println("CachedDefaultRecipe - Invalid InputPositionedStacks " + aRecipe);
- npe.printStackTrace(GT_Log.err);
- }
- try {
- maybeOut = aRecipe.getOutputPositionedStacks();
- } catch (NullPointerException npe) {
- maybeOut = null;
- GT_Log.err.println("CachedDefaultRecipe - Invalid OutputPositionedStacks " + aRecipe);
- npe.printStackTrace(GT_Log.err);
- }
-
- if (maybeOut != null && maybeIn != null) {
- mOutputs = maybeOut;
- mInputs = maybeIn;
- return;
- }
-
mOutputs = new ArrayList<>();
mInputs = new ArrayList<>();
- if (GT_NEI_DefaultHandler.this.mRecipeMap.useModularUI) {
- for (Widget child : modularWindow.getChildren()) {
- if (child instanceof SlotWidget widget) {
- if (widget.getMcSlot()
- .getItemHandler() == itemInputsInventory) {
+ for (Widget child : modularWindow.getChildren()) {
+ if (child instanceof SlotWidget widget) {
+ if (widget.getMcSlot()
+ .getItemHandler() == itemInputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ Object input = aRecipe instanceof GT_Recipe.GT_Recipe_WithAlt
+ ? ((GT_Recipe.GT_Recipe_WithAlt) aRecipe).getAltRepresentativeInput(i)
+ : aRecipe.getRepresentativeInput(i);
+ if (input != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ input,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ widget.getPos().x + 1,
+ widget.getPos().y + 1,
+ true));
+ }
+ } else if (widget.getMcSlot()
+ .getItemHandler() == itemOutputsInventory) {
int i = widget.getMcSlot()
.getSlotIndex();
- Object input = aRecipe instanceof GT_Recipe.GT_Recipe_WithAlt
- ? ((GT_Recipe.GT_Recipe_WithAlt) aRecipe).getAltRepresentativeInput(i)
- : aRecipe.getRepresentativeInput(i);
- if (input != null) {
- mInputs.add(
+ ItemStack output = aRecipe.getRepresentativeOutput(i);
+ if (output != null) {
+ mOutputs.add(
new FixedPositionedStack(
- input,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
+ output,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
widget.getPos().x + 1,
widget.getPos().y + 1,
- true));
+ aRecipe.getOutputChance(i),
+ GT_NEI_DefaultHandler.this.neiProperties.unificateOutput));
}
} else if (widget.getMcSlot()
- .getItemHandler() == itemOutputsInventory) {
- int i = widget.getMcSlot()
- .getSlotIndex();
-
- ItemStack output = aRecipe.getRepresentativeOutput(i);
- if (output != null) {
- mOutputs.add(
+ .getItemHandler() == specialSlotInventory) {
+ if (aRecipe.mSpecialItems != null) {
+ mInputs.add(
new FixedPositionedStack(
- output,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
+ aRecipe.mSpecialItems,
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
widget.getPos().x + 1,
- widget.getPos().y + 1,
- aRecipe.getOutputChance(i),
- GT_NEI_DefaultHandler.this.mRecipeMap.mNEIUnificateOutput));
+ widget.getPos().y + 1));
}
} else if (widget.getMcSlot()
- .getItemHandler() == specialSlotInventory) {
- if (aRecipe.mSpecialItems != null) {
+ .getItemHandler() == fluidInputsInventory) {
+ int i = widget.getMcSlot()
+ .getSlotIndex();
+ if (aRecipe.mFluidInputs.length > i && aRecipe.mFluidInputs[i] != null
+ && aRecipe.mFluidInputs[i].getFluid() != null) {
mInputs.add(
new FixedPositionedStack(
- aRecipe.mSpecialItems,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
widget.getPos().x + 1,
widget.getPos().y + 1));
}
} else if (widget.getMcSlot()
- .getItemHandler() == fluidInputsInventory) {
+ .getItemHandler() == fluidOutputsInventory) {
int i = widget.getMcSlot()
.getSlotIndex();
- if (aRecipe.mFluidInputs.length > i && aRecipe.mFluidInputs[i] != null
- && aRecipe.mFluidInputs[i].getFluid() != null) {
- mInputs.add(
+ if (aRecipe.mFluidOutputs.length > i && aRecipe.mFluidOutputs[i] != null
+ && aRecipe.mFluidOutputs[i].getFluid() != null) {
+ mOutputs.add(
new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
widget.getPos().x + 1,
widget.getPos().y + 1));
}
- } else if (widget.getMcSlot()
- .getItemHandler() == fluidOutputsInventory) {
- int i = widget.getMcSlot()
- .getSlotIndex();
- if (aRecipe.mFluidOutputs.length > i && aRecipe.mFluidOutputs[i] != null
- && aRecipe.mFluidOutputs[i].getFluid() != null) {
- mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- widget.getPos().x + 1,
- widget.getPos().y + 1));
- }
- }
- }
+ }
}
+ }
- // items and fluids that exceed usual count
- UIHelper.forEachSlots((i, backgrounds, pos) -> {
- if (i >= GT_NEI_DefaultHandler.this.mRecipeMap.mUsualInputCount && aRecipe.mInputs[i] != null) {
- mInputs.add(
- new FixedPositionedStack(
- aRecipe.mInputs[i],
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- pos.x + 1,
- pos.y + 1,
- true));
- }
- }, (i, backgrounds, pos) -> {
- if (i >= GT_NEI_DefaultHandler.this.mRecipeMap.mUsualOutputCount && aRecipe.mOutputs[i] != null) {
- mOutputs.add(
- new FixedPositionedStack(
- aRecipe.mOutputs[i],
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- pos.x + 1,
- pos.y + 1,
- aRecipe.getOutputChance(i),
- GT_NEI_DefaultHandler.this.mRecipeMap.mNEIUnificateOutput));
- }
- }, (i, backgrounds, pos) -> {}, (i, backgrounds, pos) -> {
- if (i >= GT_NEI_DefaultHandler.this.mRecipeMap.getUsualFluidInputCount()
- && aRecipe.mFluidInputs[i] != null
- && aRecipe.mFluidInputs[i].getFluid() != null) {
- mInputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- pos.x + 1,
- pos.y + 1));
- }
- }, (i, backgrounds, pos) -> {
- if (i >= GT_NEI_DefaultHandler.this.mRecipeMap.getUsualFluidOutputCount()
- && aRecipe.mFluidOutputs[i] != null
- && aRecipe.mFluidOutputs[i].getFluid() != null) {
- mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- pos.x + 1,
- pos.y + 1));
- }
- },
- null,
- null,
- GT_NEI_DefaultHandler.this.mRecipeMap,
- aRecipe.mInputs.length,
- aRecipe.mOutputs.length,
- aRecipe.mFluidInputs.length,
- aRecipe.mFluidOutputs.length,
- SteamVariant.NONE,
- WINDOW_OFFSET);
- } else {
- // todo remove after all the migrations are done
- // Default GT NEI handler for drawing fluids/items on screen.
- switch (GT_NEI_DefaultHandler.this.mRecipeMap.mUsualInputCount) {
- case 0:
- break;
- case 1: // 1x1
- drawNEIItemGrid(aRecipe.mInputs, 48, 14, 1, 1, aRecipe, true);
- break;
- case 2: // 2x1
- drawNEIItemGrid(aRecipe.mInputs, 30, 14, 2, 1, aRecipe, true);
- break;
- case 3: //
- drawNEIItemGrid(aRecipe.mInputs, 12, 14, 3, 1, aRecipe, true);
- break;
- case 4:
- case 5:
- drawNEIItemGrid(aRecipe.mInputs, 12, 14, 3, 2, aRecipe, true);
- break;
- case 6:
- drawNEIItemGrid(aRecipe.mInputs, 12, 5, 3, 2, aRecipe, true);
- break;
- default:
- drawNEIItemGrid(aRecipe.mInputs, 12, -4, 3, 3, aRecipe, true);
+ // items and fluids that exceed usual count
+ UIHelper.forEachSlots((i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemInputs && aRecipe.mInputs[i] != null) {
+ mInputs.add(
+ new FixedPositionedStack(
+ aRecipe.mInputs[i],
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1,
+ true));
}
-
- switch (GT_NEI_DefaultHandler.this.mRecipeMap.mUsualOutputCount) {
- case 0:
- break;
- case 1:
- drawNEIItemGrid(aRecipe.mOutputs, 102, 14, 1, 1, aRecipe, false);
- break;
- case 2:
- drawNEIItemGrid(aRecipe.mOutputs, 102, 14, 2, 1, aRecipe, false);
- break;
- case 3:
- drawNEIItemGrid(aRecipe.mOutputs, 102, 14, 3, 1, aRecipe, false);
- break;
- case 4:
- drawNEIItemGrid(aRecipe.mOutputs, 102, 5, 2, 2, aRecipe, false);
- break;
- case 5:
- case 6:
- drawNEIItemGrid(aRecipe.mOutputs, 102, 5, 3, 2, aRecipe, false);
- break;
- default:
- drawNEIItemGrid(aRecipe.mOutputs, 102, -4, 3, 3, aRecipe, false);
+ }, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxItemOutputs && aRecipe.mOutputs[i] != null) {
+ mOutputs.add(
+ new FixedPositionedStack(
+ aRecipe.mOutputs[i],
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1,
+ aRecipe.getOutputChance(i),
+ GT_NEI_DefaultHandler.this.neiProperties.unificateOutput));
}
-
- // ??? No idea what this does. Leaving it alone.
- if (aRecipe.mSpecialItems != null) {
- this.mInputs.add(
+ }, (i, backgrounds, pos) -> {}, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidInputs && aRecipe.mFluidInputs[i] != null
+ && aRecipe.mFluidInputs[i].getFluid() != null) {
+ mInputs.add(
new FixedPositionedStack(
- aRecipe.mSpecialItems,
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 120,
- 52));
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1));
}
-
- if ((aRecipe.mFluidInputs.length > 0) && (aRecipe.mFluidInputs[0] != null)
- && (aRecipe.mFluidInputs[0].getFluid() != null)) {
- this.mInputs.add(
+ }, (i, backgrounds, pos) -> {
+ if (i >= GT_NEI_DefaultHandler.this.uiProperties.maxFluidOutputs && aRecipe.mFluidOutputs[i] != null
+ && aRecipe.mFluidOutputs[i].getFluid() != null) {
+ mOutputs.add(
new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[0], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 48,
- 52));
- if ((aRecipe.mFluidInputs.length > 1) && (aRecipe.mFluidInputs[1] != null)
- && (aRecipe.mFluidInputs[1].getFluid() != null)) {
- this.mInputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidInputs[1], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 30,
- 52));
- }
+ GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[i], true),
+ GT_NEI_DefaultHandler.this.neiProperties.renderRealStackSizes,
+ pos.x + 1,
+ pos.y + 1));
}
-
- if (aRecipe.mFluidOutputs.length > 1) {
- if (aRecipe.mFluidOutputs[0] != null && (aRecipe.mFluidOutputs[0].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[0], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 120,
- 5));
- }
- if (aRecipe.mFluidOutputs[1] != null && (aRecipe.mFluidOutputs[1].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[1], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 138,
- 5));
- }
- if (aRecipe.mFluidOutputs.length > 2 && aRecipe.mFluidOutputs[2] != null
- && (aRecipe.mFluidOutputs[2].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[2], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 102,
- 23));
- }
- if (aRecipe.mFluidOutputs.length > 3 && aRecipe.mFluidOutputs[3] != null
- && (aRecipe.mFluidOutputs[3].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[3], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 120,
- 23));
- }
- if (aRecipe.mFluidOutputs.length > 4 && aRecipe.mFluidOutputs[4] != null
- && (aRecipe.mFluidOutputs[4].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[4], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 138,
- 23));
- }
- } else if ((aRecipe.mFluidOutputs.length > 0) && (aRecipe.mFluidOutputs[0] != null)
- && (aRecipe.mFluidOutputs[0].getFluid() != null)) {
- this.mOutputs.add(
- new FixedPositionedStack(
- GT_Utility.getFluidDisplayStack(aRecipe.mFluidOutputs[0], true),
- GT_NEI_DefaultHandler.this.mRecipeMap.renderRealStackSizes,
- 102,
- 52));
- }
- }
+ },
+ IDrawable.EMPTY,
+ IDrawable.EMPTY,
+ GT_NEI_DefaultHandler.this.frontend.getUIProperties(),
+ aRecipe.mInputs.length,
+ aRecipe.mOutputs.length,
+ aRecipe.mFluidInputs.length,
+ aRecipe.mFluidOutputs.length,
+ SteamVariant.NONE,
+ WINDOW_OFFSET);
}
@Override
@@ -1011,11 +700,6 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
}
}
- @Deprecated
- public String trans(String aKey, String aEnglish) {
- return GT_Utility.trans(aKey, aEnglish);
- }
-
private class SortedRecipeListCache {
private int mCachedRecipesVersion = -1;
@@ -1052,7 +736,7 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
private void computeTierIndexes() {
// Holds 16 elements without rehashing
- mTierIndexes = new HashMap<>(GT_Values.V.length + 1, 1f);
+ mTierIndexes = new HashMap<>(V.length + 1, 1f);
assert mCachedRecipes != null;
Iterator<CachedDefaultRecipe> iterator = Objects.requireNonNull(mCachedRecipes.get())
.iterator();
@@ -1065,7 +749,7 @@ public class GT_NEI_DefaultHandler extends RecipeMapHandler {
while (iterator.hasNext()) {
CachedDefaultRecipe recipe = iterator.next();
byte recipeTier = GT_Utility
- .getTier(recipe.mRecipe.mEUt / GT_NEI_DefaultHandler.this.mRecipeMap.mAmperage);
+ .getTier(recipe.mRecipe.mEUt / GT_NEI_DefaultHandler.this.recipeMap.getAmperage());
if (recipeTier != previousTier) {
if (maxIndex != -1) {
mTierIndexes.put(previousTier, Range.between(minIndex, maxIndex));
diff --git a/src/main/java/gregtech/nei/HeatingCoilSpecialValueFormatter.java b/src/main/java/gregtech/nei/HeatingCoilSpecialValueFormatter.java
deleted file mode 100644
index 936aa6b715..0000000000
--- a/src/main/java/gregtech/nei/HeatingCoilSpecialValueFormatter.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package gregtech.nei;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-
-import gregtech.api.enums.HeatingCoilLevel;
-
-public class HeatingCoilSpecialValueFormatter implements INEISpecialInfoFormatter {
-
- public static final HeatingCoilSpecialValueFormatter INSTANCE = new HeatingCoilSpecialValueFormatter();
-
- @Override
- public List<String> format(NEIRecipeInfo recipeInfo, Function<Integer, String> applyPrefixAndSuffix) {
- int heat = recipeInfo.recipe.mSpecialValue;
-
- List<String> result = new ArrayList<>();
- result.add(applyPrefixAndSuffix.apply(heat));
- result.add(" (" + HeatingCoilLevel.getDisplayNameFromHeat(heat, false) + ")");
- return result;
- }
-}
diff --git a/src/main/java/gregtech/nei/IMCForNEI.java b/src/main/java/gregtech/nei/IMCForNEI.java
deleted file mode 100644
index 2fdda9893c..0000000000
--- a/src/main/java/gregtech/nei/IMCForNEI.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package gregtech.nei;
-
-import static gregtech.api.enums.Mods.GregTech;
-import static gregtech.api.enums.Mods.NotEnoughItems;
-
-import net.minecraft.nbt.NBTTagCompound;
-
-import cpw.mods.fml.common.event.FMLInterModComms;
-
-public class IMCForNEI {
-
- public static void IMCSender() {
- if (!NotEnoughItems.isModLoaded()) {
- return;
- }
-
- sendHandler("gt.recipe.transcendentplasmamixerrecipes", "gregtech:gt.blockmachines:1006", 1);
- sendCatalyst("gt.recipe.transcendentplasmamixerrecipes", "gregtech:gt.blockmachines:1006");
-
- sendHandler("gt.recipe.plasmaforge", "gregtech:gt.blockmachines:1004", 1);
- sendCatalyst("gt.recipe.plasmaforge", "gregtech:gt.blockmachines:1004");
-
- sendHandler("gt.recipe.complexfusionreactor", "gregtech:gt.blockmachines:1193");
- sendCatalyst("gt.recipe.complexfusionreactor", "gregtech:gt.blockmachines:1193");
- sendCatalyst("gt.recipe.complexfusionreactor", "gregtech:gt.blockmachines:1194");
- sendCatalyst("gt.recipe.complexfusionreactor", "gregtech:gt.blockmachines:1195");
-
- sendCatalyst("gt.recipe.gasturbinefuel", "gregtech:gt.blockmachines:1005", -1);
- sendCatalyst("gt.recipe.gasturbinefuel", "gregtech:gt.blockmachines:1118");
- sendCatalyst("gt.recipe.gasturbinefuel", "gregtech:gt.blockmachines:1119");
-
- // overwrite yShift to 6
- sendHandler("gt.recipe.fakeAssemblylineProcess", "gregtech:gt.blockmachines:1170");
- sendHandler("gt.recipe.nanoforge", "gregtech:gt.blockmachines:357");
- sendCatalyst("gt.recipe.nanoforge", "gregtech:gt.blockmachines:357");
- sendHandler("gt.recipe.pcbfactory", "gregtech:gt.blockmachines:356");
- sendCatalyst("gt.recipe.pcbfactory", "gregtech:gt.blockmachines:356");
- sendHandler("gt.recipe.ic2nuke", "IC2:blockGenerator:5");
- sendCatalyst("gt.recipe.ic2nuke", "IC2:blockGenerator:5");
- }
-
- private static void sendHandler(String aName, String aBlock, int aMaxRecipesPerPage) {
- NBTTagCompound aNBT = new NBTTagCompound();
- aNBT.setString("handler", aName);
- aNBT.setString("modName", "GregTech");
- aNBT.setString("modId", GregTech.ID);
- aNBT.setBoolean("modRequired", true);
- aNBT.setString("itemName", aBlock);
- aNBT.setInteger("handlerHeight", 135);
- aNBT.setInteger("handlerWidth", 166);
- aNBT.setInteger("maxRecipesPerPage", aMaxRecipesPerPage);
- aNBT.setInteger("yShift", 6);
- FMLInterModComms.sendMessage("NotEnoughItems", "registerHandlerInfo", aNBT);
- }
-
- private static void sendHandler(String aName, String aBlock) {
- sendHandler(aName, aBlock, 2);
- }
-
- private static void sendCatalyst(String aName, String aStack, int aPriority) {
- NBTTagCompound aNBT = new NBTTagCompound();
- aNBT.setString("handlerID", aName);
- aNBT.setString("itemName", aStack);
- aNBT.setInteger("priority", aPriority);
- FMLInterModComms.sendMessage("NotEnoughItems", "registerCatalystInfo", aNBT);
- }
-
- private static void sendCatalyst(String aName, String aStack) {
- sendCatalyst(aName, aStack, 0);
- }
-}
diff --git a/src/main/java/gregtech/nei/INEISpecialInfoFormatter.java b/src/main/java/gregtech/nei/INEISpecialInfoFormatter.java
deleted file mode 100644
index ef2ba880eb..0000000000
--- a/src/main/java/gregtech/nei/INEISpecialInfoFormatter.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package gregtech.nei;
-
-import java.util.List;
-import java.util.function.Function;
-
-/**
- * Getter for description for {@link gregtech.api.util.GT_Recipe#mSpecialValue} etc. that will be drawn on NEI.
- */
-@FunctionalInterface
-public interface INEISpecialInfoFormatter {
-
- /**
- * @param recipeInfo Recipe info to draw description. You can retrieve special value with
- * {@code recipeInfo.recipe.mSpecialValue}.
- * @param applyPrefixAndSuffix Function to apply
- * {@link gregtech.api.util.GT_Recipe.GT_Recipe_Map#formatSpecialValue}.
- * @return List of strings containing info for special value etc.
- */
- @SuppressWarnings("JavadocReference")
- List<String> format(NEIRecipeInfo recipeInfo, Function<Integer, String> applyPrefixAndSuffix);
-}
diff --git a/src/main/java/gregtech/nei/NEIRecipeInfo.java b/src/main/java/gregtech/nei/NEIRecipeInfo.java
deleted file mode 100644
index 85db921ade..0000000000
--- a/src/main/java/gregtech/nei/NEIRecipeInfo.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package gregtech.nei;
-
-import gregtech.api.util.GT_Recipe;
-import gregtech.common.power.Power;
-
-/**
- * Holds info used for drawing descriptions on NEI.
- */
-public class NEIRecipeInfo {
-
- /**
- * Recipe to show description.
- */
- public final GT_Recipe recipe;
-
- /**
- * RecipeMap the recipe belongs to.
- */
- public final GT_Recipe.GT_Recipe_Map recipeMap;
-
- /**
- * Recipe object for NEI.
- */
- public final GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe;
-
- /**
- * When user looks up usage for machine, NEI will show all the recipes that the machine can process, taking tier of
- * the machine into consideration. This object can be used to show info around overclocked EU/t and duration.
- */
- public final Power power;
-
- /**
- * Current Y position for drawing description.
- */
- public int yPos;
-
- public NEIRecipeInfo(GT_Recipe recipe, GT_Recipe.GT_Recipe_Map recipeMap,
- GT_NEI_DefaultHandler.CachedDefaultRecipe neiCachedRecipe, Power power, int descriptionYOffset) {
- this.recipe = recipe;
- this.recipeMap = recipeMap;
- this.neiCachedRecipe = neiCachedRecipe;
- this.power = power;
- this.yPos = descriptionYOffset;
- }
-}
diff --git a/src/main/java/gregtech/nei/NEI_GT_Config.java b/src/main/java/gregtech/nei/NEI_GT_Config.java
index 324b4cf303..cb51380539 100644
--- a/src/main/java/gregtech/nei/NEI_GT_Config.java
+++ b/src/main/java/gregtech/nei/NEI_GT_Config.java
@@ -1,21 +1,31 @@
package gregtech.nei;
-import java.util.ArrayList;
+import java.util.Collection;
import java.util.Comparator;
-import java.util.List;
+import java.util.Map;
+import com.google.common.collect.ImmutableListMultimap;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ListMultimap;
import codechicken.nei.api.API;
import codechicken.nei.api.IConfigureNEI;
+import codechicken.nei.event.NEIRegisterHandlerInfosEvent;
import codechicken.nei.recipe.GuiCraftingRecipe;
import codechicken.nei.recipe.GuiUsageRecipe;
+import codechicken.nei.recipe.HandlerInfo;
import codechicken.nei.recipe.TemplateRecipeHandler;
-import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.event.FMLInterModComms;
+import cpw.mods.fml.common.eventhandler.SubscribeEvent;
+import gregtech.api.GregTech_API;
import gregtech.api.enums.GT_Values;
import gregtech.api.enums.ItemList;
-import gregtech.api.util.GT_Recipe;
+import gregtech.api.interfaces.metatileentity.IMetaTileEntity;
+import gregtech.api.interfaces.tileentity.RecipeMapWorkable;
+import gregtech.api.recipe.RecipeCategory;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.recipe.RecipeMaps;
+import gregtech.api.util.GT_ModHandler;
import gregtech.common.items.GT_MetaGenerated_Item_01;
import gregtech.common.items.GT_MetaGenerated_Item_02;
import gregtech.common.items.GT_MetaGenerated_Item_03;
@@ -36,14 +46,17 @@ public class NEI_GT_Config implements IConfigureNEI {
* Handlers will be displayed in ascending order of integer value. Any recipe map that is not present in this map
* will be assigned a value of 0. Negative values are fine.
*/
- private static final ImmutableMap<GT_Recipe.GT_Recipe_Map, Integer> RECIPE_MAP_ORDERING = ImmutableMap.<GT_Recipe.GT_Recipe_Map, Integer>builder()
- .put(GT_Recipe.GT_Recipe_Map.sAssemblylineVisualRecipes, 1)
- .put(GT_Recipe.GT_Recipe_Map.sScannerFakeRecipes, 2)
+ private static final ImmutableMap<RecipeMap<?>, Integer> RECIPE_MAP_ORDERING = ImmutableMap
+ .<RecipeMap<?>, Integer>builder()
+ .put(RecipeMaps.assemblylineVisualRecipes, 1)
+ .put(RecipeMaps.scannerFakeRecipes, 2)
.build();
- private static final Comparator<RecipeMapHandler> RECIPE_MAP_HANDLER_COMPARATOR = Comparator
+ private static final Comparator<GT_NEI_DefaultHandler> RECIPE_MAP_HANDLER_COMPARATOR = Comparator
.comparingInt(handler -> RECIPE_MAP_ORDERING.getOrDefault(handler.getRecipeMap(), 0));
+ private static ListMultimap<RecipeCategory, RecipeMapWorkable> RECIPE_CATALYST_INDEX;
+
public static boolean sIsAdded = true;
private static void addHandler(TemplateRecipeHandler handler) {
@@ -59,33 +72,107 @@ public class NEI_GT_Config implements IConfigureNEI {
@Override
public void loadConfig() {
sIsAdded = false;
- if (FMLCommonHandler.instance()
- .getEffectiveSide()
- .isClient()) {
- List<RecipeMapHandler> handlers = new ArrayList<>();
-
- for (GT_Recipe.GT_Recipe_Map tMap : GT_Recipe.GT_Recipe_Map.sMappings) {
- if (tMap.mNEIAllowed) {
- handlers.add(new GT_NEI_DefaultHandler(tMap));
- }
- }
+ registerHandlers();
+ registerCatalysts();
+ registerItemEntries();
+ registerDumpers();
+ sIsAdded = true;
+ }
- handlers.sort(RECIPE_MAP_HANDLER_COMPARATOR);
- handlers.forEach(NEI_GT_Config::addHandler);
+ private void registerHandlers() {
+ RecipeCategory.ALL_RECIPE_CATEGORIES.values()
+ .stream()
+ .filter(
+ recipeCategory -> recipeCategory.recipeMap.getFrontend()
+ .getNEIProperties().registerNEI)
+ .map(GT_NEI_DefaultHandler::new)
+ .sorted(RECIPE_MAP_HANDLER_COMPARATOR)
+ .forEach(NEI_GT_Config::addHandler);
+ }
- API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1));
+ private void registerCatalysts() {
+ for (Map.Entry<RecipeCategory, Collection<RecipeMapWorkable>> entry : RECIPE_CATALYST_INDEX.asMap()
+ .entrySet()) {
+ entry.getValue()
+ .forEach(
+ recipeMapWorkable -> API.addRecipeCatalyst(
+ recipeMapWorkable.getStackForm(1),
+ entry.getKey().unlocalizedName,
+ recipeMapWorkable.getRecipeCatalystPriority()));
+ }
+ API.addRecipeCatalyst(
+ GT_ModHandler.getIC2Item("nuclearReactor", 1, null),
+ RecipeMaps.ic2NuclearFakeRecipes.unlocalizedName);
+ // Bronze Blast Furnace
+ API.removeRecipeCatalyst(
+ GT_ModHandler.getModItem("gregtech", "gt.blockmachines", 1, 108),
+ RecipeMaps.primitiveBlastRecipes.unlocalizedName);
+ }
- API.addOption(new MetaTileEntityDumper());
- API.addOption(new MaterialDumper());
- API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_01.INSTANCE, "metaitem01"));
- API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_02.INSTANCE, "metaitem02"));
- API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_03.INSTANCE, "metaitem03"));
- API.addOption(new VoidProtectionSupportDumper());
- API.addOption(new InputSeparationSupportDumper());
- API.addOption(new BatchModeSupportDumper());
- API.addOption(new RecipeLockingSupportDumper());
+ private void registerItemEntries() {
+ API.addItemListEntry(ItemList.VOLUMETRIC_FLASK.get(1));
+ }
+
+ private void registerDumpers() {
+ API.addOption(new MetaTileEntityDumper());
+ API.addOption(new MaterialDumper());
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_01.INSTANCE, "metaitem01"));
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_02.INSTANCE, "metaitem02"));
+ API.addOption(new MetaItemDumper(GT_MetaGenerated_Item_03.INSTANCE, "metaitem03"));
+ API.addOption(new VoidProtectionSupportDumper());
+ API.addOption(new InputSeparationSupportDumper());
+ API.addOption(new BatchModeSupportDumper());
+ API.addOption(new RecipeLockingSupportDumper());
+ }
+
+ @SubscribeEvent
+ public void registerHandlerInfo(NEIRegisterHandlerInfosEvent event) {
+ if (RECIPE_CATALYST_INDEX == null) {
+ // This method will be called earlier than #loadConfig
+ generateRecipeCatalystIndex();
}
- sIsAdded = true;
+ RecipeCategory.ALL_RECIPE_CATEGORIES.values()
+ .forEach(recipeCategory -> {
+ HandlerInfo.Builder builder = createHandlerInfoBuilderTemplate(recipeCategory);
+ HandlerInfo handlerInfo;
+ if (recipeCategory.handlerInfoCreator != null) {
+ handlerInfo = recipeCategory.handlerInfoCreator.apply(builder)
+ .build();
+ } else {
+ // Infer icon from recipe catalysts
+ RECIPE_CATALYST_INDEX.get(recipeCategory)
+ .stream()
+ .findFirst()
+ .ifPresent(catalyst -> builder.setDisplayStack(catalyst.getStackForm(1)));
+ handlerInfo = builder.build();
+ }
+ event.registerHandlerInfo(handlerInfo);
+ });
+ }
+
+ private HandlerInfo.Builder createHandlerInfoBuilderTemplate(RecipeCategory recipeCategory) {
+ return new HandlerInfo.Builder(
+ recipeCategory.unlocalizedName,
+ recipeCategory.ownerMod.getName(),
+ recipeCategory.ownerMod.getModId()).setShiftY(6)
+ .setHeight(135)
+ .setMaxRecipesPerPage(2);
+ }
+
+ private static void generateRecipeCatalystIndex() {
+ ImmutableListMultimap.Builder<RecipeCategory, RecipeMapWorkable> builder = new ImmutableListMultimap.Builder<>();
+ builder
+ .orderValuesBy(Comparator.comparing(recipeMapWorkable -> -recipeMapWorkable.getRecipeCatalystPriority()));
+ for (int i = 1; i < GregTech_API.METATILEENTITIES.length; i++) {
+ IMetaTileEntity mte = GregTech_API.METATILEENTITIES[i];
+ if (!(mte instanceof RecipeMapWorkable recipeMapWorkable)) continue;
+ for (RecipeMap<?> recipeMap : recipeMapWorkable.getAvailableRecipeMaps()) {
+ for (RecipeCategory recipeCategory : recipeMap.getAssociatedCategories()) {
+ builder.put(recipeCategory, recipeMapWorkable);
+ }
+ }
+ }
+ RECIPE_CATALYST_INDEX = builder.build();
}
@Override
diff --git a/src/main/java/gregtech/nei/NEI_TransferRectHost.java b/src/main/java/gregtech/nei/NEI_TransferRectHost.java
deleted file mode 100644
index cdc708beb8..0000000000
--- a/src/main/java/gregtech/nei/NEI_TransferRectHost.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package gregtech.nei;
-
-import java.awt.Rectangle;
-
-public interface NEI_TransferRectHost {
-
- String getNeiTransferRectString();
-
- String getNeiTransferRectTooltip();
-
- Object[] getNeiTransferRectArgs();
-
- Rectangle getNeiTransferRect();
-}
diff --git a/src/main/java/gregtech/nei/RecipeDisplayInfo.java b/src/main/java/gregtech/nei/RecipeDisplayInfo.java
new file mode 100644
index 0000000000..f9cc1a9a8c
--- /dev/null
+++ b/src/main/java/gregtech/nei/RecipeDisplayInfo.java
@@ -0,0 +1,99 @@
+package gregtech.nei;
+
+import static gregtech.api.util.GT_Utility.isStringInvalid;
+
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.client.Minecraft;
+
+import gregtech.api.objects.overclockdescriber.OverclockDescriber;
+import gregtech.api.recipe.RecipeMap;
+import gregtech.api.util.FieldsAreNonnullByDefault;
+import gregtech.api.util.GT_OverclockCalculator;
+import gregtech.api.util.GT_Recipe;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+
+/**
+ * Holds info used for drawing descriptions on NEI.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FieldsAreNonnullByDefault
+public class RecipeDisplayInfo {
+
+ /**
+ * Recipe to show description.
+ */
+ public final GT_Recipe recipe;
+
+ /**
+ * RecipeMap the recipe belongs to.
+ */
+ public final RecipeMap<?> recipeMap;
+
+ /**
+ * When user looks up usage for machine, NEI will show all the recipes that the machine can process, taking tier of
+ * the machine into consideration. This object can be used to show info around overclocked EU/t and duration.
+ */
+ public final OverclockDescriber overclockDescriber;
+
+ /**
+ * Pre-built overclock calculator, used for drawing OC information. Do not calculate it again.
+ */
+ public final GT_OverclockCalculator calculator;
+
+ /**
+ * Current Y position for drawing description.
+ */
+ private int yPos;
+
+ private final int neiTextColorOverride;
+
+ RecipeDisplayInfo(GT_Recipe recipe, RecipeMap<?> recipeMap, OverclockDescriber overclockDescriber,
+ GT_OverclockCalculator calculator, int descriptionYOffset, int neiTextColorOverride) {
+ this.recipe = recipe;
+ this.recipeMap = recipeMap;
+ this.overclockDescriber = overclockDescriber;
+ this.calculator = calculator;
+ this.yPos = descriptionYOffset;
+ this.neiTextColorOverride = neiTextColorOverride;
+ }
+
+ /**
+ * Draws text.
+ */
+ public void drawText(@Nullable String text) {
+ drawText(text, 10);
+ }
+
+ /**
+ * Draws text.
+ *
+ * @param yShift y position to shift after this text
+ */
+ public void drawText(@Nullable String text, int yShift) {
+ drawText(text, 5, yShift);
+ }
+
+ /**
+ * Draws text.
+ *
+ * @param xStart x position to start drawing
+ * @param yShift y position to shift after this text
+ */
+ public void drawText(@Nullable String text, int xStart, int yShift) {
+ if (isStringInvalid(text)) return;
+ Minecraft.getMinecraft().fontRenderer
+ .drawString(text, xStart, yPos, neiTextColorOverride != -1 ? neiTextColorOverride : 0x000000);
+ yPos += yShift;
+ }
+
+ public void drawTextMultipleLines(List<String> texts) {
+ for (String text : texts) {
+ drawText(text, 10);
+ }
+ }
+}
diff --git a/src/main/java/gregtech/nei/RecipeMapHandler.java b/src/main/java/gregtech/nei/RecipeMapHandler.java
deleted file mode 100644
index a31bcefdff..0000000000
--- a/src/main/java/gregtech/nei/RecipeMapHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package gregtech.nei;
-
-import net.minecraft.client.Minecraft;
-
-import com.gtnewhorizons.modularui.api.ModularUITextures;
-
-import codechicken.nei.recipe.TemplateRecipeHandler;
-import gregtech.api.gui.GT_GUIColorOverride;
-import gregtech.api.util.GT_Recipe;
-
-/**
- * This abstract class represents an NEI handler that is constructed from a {@link GT_Recipe.GT_Recipe_Map}, and allows
- * us to sort NEI handlers by recipe map.
- */
-abstract class RecipeMapHandler extends TemplateRecipeHandler {
-
- protected final GT_Recipe.GT_Recipe_Map mRecipeMap;
-
- protected final GT_GUIColorOverride colorOverride;
- private int overrideTextColor = -1;
-
- RecipeMapHandler(GT_Recipe.GT_Recipe_Map mRecipeMap) {
- this.mRecipeMap = mRecipeMap;
- colorOverride = GT_GUIColorOverride.get(ModularUITextures.VANILLA_BACKGROUND.location);
- }
-
- GT_Recipe.GT_Recipe_Map getRecipeMap() {
- return mRecipeMap;
- }
-
- protected void updateOverrideTextColor() {
- overrideTextColor = colorOverride.getTextColorOrDefault("nei", -1);
- }
-
- protected void drawText(int aX, int aY, String aString, int aColor) {
- Minecraft.getMinecraft().fontRenderer
- .drawString(aString, aX, aY, overrideTextColor != -1 ? overrideTextColor : aColor);
- }
-}
diff --git a/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java
new file mode 100644
index 0000000000..1c4d486319
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/DefaultSpecialValueFormatter.java
@@ -0,0 +1,36 @@
+package gregtech.nei.formatter;
+
+import static gregtech.api.util.GT_Utility.trans;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.GT_Mod;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class DefaultSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static DefaultSpecialValueFormatter INSTANCE = new DefaultSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ int specialValue = recipeInfo.recipe.mSpecialValue;
+ if (specialValue == -100 && GT_Mod.gregtechproxy.mLowGravProcessing) {
+ return Collections.singletonList(trans("159", "Needs Low Gravity"));
+ } else if (specialValue == -200 && GT_Mod.gregtechproxy.mEnableCleanroom) {
+ return Collections.singletonList(trans("160", "Needs Cleanroom"));
+ } else if (specialValue == -201) {
+ return Collections.singletonList(trans("206", "Scan for Assembly Line"));
+ } else if (specialValue == -300 && GT_Mod.gregtechproxy.mEnableCleanroom) {
+ return Collections.singletonList(trans("160.1", "Needs Cleanroom & LowGrav"));
+ } else if (specialValue == -400) {
+ return Collections.singletonList(trans("216", "Deprecated Recipe"));
+ }
+ return Collections.emptyList();
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java
new file mode 100644
index 0000000000..dcfe2617dd
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/FuelSpecialValueFormatter.java
@@ -0,0 +1,27 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class FuelSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static FuelSpecialValueFormatter INSTANCE = new FuelSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.fuel",
+ GT_Utility.formatNumbers(recipeInfo.recipe.mSpecialValue * 1000L)));
+ }
+}
diff --git a/src/main/java/gregtech/nei/FusionSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java
index 46254a1510..77cd41b343 100644
--- a/src/main/java/gregtech/nei/FusionSpecialValueFormatter.java
+++ b/src/main/java/gregtech/nei/formatter/FusionSpecialValueFormatter.java
@@ -1,26 +1,35 @@
-package gregtech.nei;
+package gregtech.nei.formatter;
import java.util.Collections;
import java.util.List;
-import java.util.function.Function;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
import gregtech.api.enums.GT_Values;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
public class FusionSpecialValueFormatter implements INEISpecialInfoFormatter {
public static final FusionSpecialValueFormatter INSTANCE = new FusionSpecialValueFormatter();
- private static final int M = 1000000;
+ private static final long M = 1000000;
@Override
- public List<String> format(NEIRecipeInfo recipeInfo, Function<Integer, String> applyPrefixAndSuffix) {
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
int euToStart = recipeInfo.recipe.mSpecialValue;
int voltage = recipeInfo.recipe.mEUt;
int tier = getFusionTier(euToStart, voltage);
- return Collections.singletonList(applyPrefixAndSuffix.apply(euToStart) + " (MK " + tier + ")");
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted("GT5U.nei.start_eu", GT_Utility.formatNumbers(euToStart), tier));
}
- public static int getFusionTier(int startupPower, long voltage) {
+ public static int getFusionTier(long startupPower, long voltage) {
int tier;
if (startupPower <= 10 * M * 16) {
tier = 1;
@@ -28,8 +37,10 @@ public class FusionSpecialValueFormatter implements INEISpecialInfoFormatter {
tier = 2;
} else if (startupPower <= 40 * M * 16) {
tier = 3;
- } else {
+ } else if (startupPower <= 320 * M * 16) {
tier = 4;
+ } else {
+ tier = 5;
}
if (voltage <= GT_Values.V[6]) {
diff --git a/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java
new file mode 100644
index 0000000000..f5c17a1163
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/HeatingCoilSpecialValueFormatter.java
@@ -0,0 +1,30 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.enums.HeatingCoilLevel;
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class HeatingCoilSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ public static final HeatingCoilSpecialValueFormatter INSTANCE = new HeatingCoilSpecialValueFormatter();
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ int heat = recipeInfo.recipe.mSpecialValue;
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ "GT5U.nei.heat_capacity",
+ GT_Utility.formatNumbers(heat),
+ HeatingCoilLevel.getDisplayNameFromHeat(heat, false)));
+ }
+}
diff --git a/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java
new file mode 100644
index 0000000000..21228240d4
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/INEISpecialInfoFormatter.java
@@ -0,0 +1,24 @@
+package gregtech.nei.formatter;
+
+import java.util.List;
+
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Getter for description for {@link gregtech.api.util.GT_Recipe#mSpecialValue} etc. that will be drawn on NEI.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+@FunctionalInterface
+public interface INEISpecialInfoFormatter {
+
+ /**
+ * @param recipeInfo Recipe info to draw description. You can retrieve special value with
+ * {@code recipeInfo.recipe.mSpecialValue}.
+ * @return List of strings containing info for special value etc.
+ */
+ List<String> format(RecipeDisplayInfo recipeInfo);
+}
diff --git a/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java
new file mode 100644
index 0000000000..8f2098c0a9
--- /dev/null
+++ b/src/main/java/gregtech/nei/formatter/SimpleSpecialValueFormatter.java
@@ -0,0 +1,49 @@
+package gregtech.nei.formatter;
+
+import java.util.Collections;
+import java.util.List;
+
+import javax.annotation.Nullable;
+import javax.annotation.ParametersAreNonnullByDefault;
+
+import net.minecraft.util.StatCollector;
+
+import gregtech.api.util.GT_Utility;
+import gregtech.api.util.MethodsReturnNonnullByDefault;
+import gregtech.nei.RecipeDisplayInfo;
+
+/**
+ * Simple formatter for recipe's special value.
+ */
+@ParametersAreNonnullByDefault
+@MethodsReturnNonnullByDefault
+public class SimpleSpecialValueFormatter implements INEISpecialInfoFormatter {
+
+ @Nullable
+ private final String translationKey;
+ private final int multiplier;
+
+ /**
+ * @param translationKey Localization key to format
+ * @param multiplier Number to multiply to special value for display
+ */
+ public SimpleSpecialValueFormatter(@Nullable String translationKey, int multiplier) {
+ this.translationKey = translationKey;
+ this.multiplier = multiplier;
+ }
+
+ /**
+ * @param translationKey Localization key to format
+ */
+ public SimpleSpecialValueFormatter(@Nullable String translationKey) {
+ this(translationKey, 1);
+ }
+
+ @Override
+ public List<String> format(RecipeDisplayInfo recipeInfo) {
+ return Collections.singletonList(
+ StatCollector.translateToLocalFormatted(
+ translationKey,
+ GT_Utility.formatNumbers((long) recipeInfo.recipe.mSpecialValue * multiplier)));
+ }
+}