package codechicken.nei.recipe; import codechicken.core.TaskProfiler; import codechicken.core.TaskProfiler.ProfilerResult; import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import codechicken.nei.PositionedStack; import codechicken.nei.api.IOverlayHandler; import codechicken.nei.api.IRecipeOverlayRenderer; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.Container; import net.minecraft.item.ItemStack; import java.text.DecimalFormat; import java.util.*; import static codechicken.lib.gui.GuiDraw.drawString; import static codechicken.lib.gui.GuiDraw.getStringWidth; public class ProfilerRecipeHandler implements ICraftingHandler, IUsageHandler { private static TaskProfiler profiler = new TaskProfiler(); public static TaskProfiler getProfiler() { profiler.clear(); return profiler; } private boolean crafting; public ProfilerRecipeHandler(boolean crafting) { this.crafting = crafting; } @Override public String getRecipeName() { return NEIClientUtils.translate("recipe.profiler." + (crafting ? "crafting" : "usage")); } @Override public int numRecipes() { if (!NEIClientConfig.getBooleanSetting("inventory.profileRecipes")) { return 0; } return (int) Math.ceil(((crafting ? GuiCraftingRecipe.craftinghandlers.size() : GuiUsageRecipe.usagehandlers.size()) - 1) / 6D); } @Override public void drawBackground(int recipe) { } @Override public void drawForeground(int recipe) { List<ProfilerResult> results = profiler.getResults(); for (Iterator<ProfilerResult> it = results.iterator(); it.hasNext(); ) { if (it.next().name.equals(getRecipeName())) { it.remove(); } } Collections.sort(results, new Comparator<ProfilerResult>() { @Override public int compare(ProfilerResult o1, ProfilerResult o2) { return o1.time < o2.time ? 1 : -1; } }); for (int i = recipe * 6; i < results.size() && i < (recipe + 1) * 6; i++) { ProfilerResult r = results.get(i); int y = (i % 6) * 20 + 6; drawString(r.name, 8, y, 0xFF808080, false); DecimalFormat format = new DecimalFormat("0.00"); String s = format.format(r.fraction * 100) + "%"; if (r.time < 1000000L) { s += " (" + (r.time / 1000) + "us)"; } else { s += " (" + (r.time / 1000000) + "ms)"; } drawString(s, 156 - getStringWidth(s), y + 10, 0xFF404040, false); } } @Override public ArrayList<PositionedStack> getIngredientStacks(int recipe) { return new ArrayList<PositionedStack>(); } @Override public ArrayList<PositionedStack> getOtherStacks(int recipetype) { return new ArrayList<PositionedStack>(); } @Override public PositionedStack getResultStack(int recipe) { return null; } @Override public void onUpdate() { } @Override public boolean hasOverlay(GuiContainer gui, Container container, int recipe) { return false; } @Override public IRecipeOverlayRenderer getOverlayRenderer(GuiContainer gui, int recipe) { return null; } @Override public IOverlayHandler getOverlayHandler(GuiContainer gui, int recipe) { return null; } @Override public int recipiesPerPage() { return 1; } @Override public List<String> handleTooltip(GuiRecipe gui, List<String> currenttip, int recipe) { return currenttip; } @Override public List<String> handleItemTooltip(GuiRecipe gui, ItemStack stack, List<String> currenttip, int recipe) { return currenttip; } @Override public boolean keyTyped(GuiRecipe gui, char keyChar, int keyCode, int recipe) { return false; } @Override public boolean mouseClicked(GuiRecipe gui, int button, int recipe) { return false; } @Override public IUsageHandler getUsageHandler(String inputId, Object... ingredients) { return this; } @Override public ICraftingHandler getRecipeHandler(String outputId, Object... results) { return this; } }