diff options
Diffstat (limited to 'src/main/java/gregtech/nei')
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))); + } +} |