diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java index e7ff41b2b..bd9f03703 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/autocrafting/task/ICraftingTask.java @@ -89,6 +89,11 @@ public interface ICraftingTask { */ boolean isValid(); + /** + * @return the time in ms when this task has started + */ + long getExecutionStarted(); + /** * @return the missing items */ diff --git a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridTab.java b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridTab.java index fb80c9d0c..0bf52c373 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridTab.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/api/network/grid/IGridTab.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.api.network.grid; import com.raoulvdberge.refinedstorage.api.util.IFilter; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; import java.util.List; @@ -18,9 +19,15 @@ public interface IGridTab { List getFilters(); /** - * @return the name + * Draws the tooltip of this tab at the given position. + * + * @param x the x position + * @param y the y position + * @param screenWidth the screen width + * @param screenHeight the screen height + * @param fontRenderer the font renderer */ - String getName(); + void drawTooltip(int x, int y, int screenWidth, int screenHeight, FontRenderer fontRenderer); /** * @return the icon diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java index cb4331981..206c09519 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/autocrafting/task/CraftingTask.java @@ -49,6 +49,7 @@ public class CraftingTask implements ICraftingTask { private static final String NBT_TICKS = "Ticks"; private static final String NBT_ID = "Id"; private static final String NBT_MISSING = "Missing"; + private static final String NBT_EXECUTION_STARTED = "ExecutionStarted"; private INetwork network; private ItemStack requested; @@ -59,6 +60,7 @@ public class CraftingTask implements ICraftingTask { private Set patternsUsed = new HashSet<>(); private int ticks = 0; private long calculationStarted; + private long executionStarted = -1; private UUID id = UUID.randomUUID(); private IStackList toTake = API.instance().createItemStackList(); @@ -104,6 +106,10 @@ public class CraftingTask implements ICraftingTask { this.missing.add(missingItem); } + + if (tag.hasKey(NBT_EXECUTION_STARTED)) { + this.executionStarted = tag.getLong(NBT_EXECUTION_STARTED); + } } @Override @@ -297,6 +303,10 @@ public class CraftingTask implements ICraftingTask { @Override public boolean update() { + if (executionStarted == -1) { + executionStarted = System.currentTimeMillis(); + } + boolean allCompleted = true; if (ticks % getTickInterval(pattern.getContainer().getSpeedUpgradeCount()) == 0) { @@ -513,6 +523,11 @@ public class CraftingTask implements ICraftingTask { return true; } + @Override + public long getExecutionStarted() { + return executionStarted; + } + @Override public IStackList getMissing() { return missing; @@ -531,6 +546,7 @@ public class CraftingTask implements ICraftingTask { tag.setTag(NBT_INSERTER, inserter.writeToNbt()); tag.setInteger(NBT_TICKS, ticks); tag.setUniqueId(NBT_ID, id); + tag.setLong(NBT_EXECUTION_STARTED, executionStarted); NBTTagList steps = new NBTTagList(); for (CraftingStep step : this.steps) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java index 6e7816d69..f6495ee59 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/apiimpl/network/grid/GridTab.java @@ -2,8 +2,11 @@ package com.raoulvdberge.refinedstorage.apiimpl.network.grid; import com.raoulvdberge.refinedstorage.api.network.grid.IGridTab; import com.raoulvdberge.refinedstorage.api.util.IFilter; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.item.ItemStack; +import net.minecraftforge.fml.client.config.GuiUtils; +import java.util.Collections; import java.util.List; public class GridTab implements IGridTab { @@ -23,8 +26,10 @@ public class GridTab implements IGridTab { } @Override - public String getName() { - return name; + public void drawTooltip(int x, int y, int screenWidth, int screenHeight, FontRenderer fontRenderer) { + if (!name.trim().equals("")) { + GuiUtils.drawHoveringText(Collections.singletonList(name), x, y, screenWidth, screenHeight, -1, fontRenderer); + } } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java index 970fb3727..af18c55fb 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiBase.java @@ -92,6 +92,14 @@ public abstract class GuiBase extends GuiContainer { } } + public int getScreenWidth() { + return screenWidth; + } + + public int getScreenHeight() { + return screenHeight; + } + public Scrollbar getScrollbar() { return scrollbar; } @@ -374,7 +382,7 @@ public abstract class GuiBase extends GuiContainer { public void drawTooltip(@Nonnull ItemStack stack, int x, int y, List lines) { GlStateManager.disableLighting(); - GuiUtils.drawHoveringText(stack, lines, x, y, width - guiLeft, height, -1, fontRenderer); + GuiUtils.drawHoveringText(stack, lines, x, y, screenWidth, screenHeight, -1, fontRenderer); GlStateManager.enableLighting(); } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java index 9f70af2e3..b5f3405f6 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/GuiCraftingMonitor.java @@ -1,6 +1,7 @@ package com.raoulvdberge.refinedstorage.gui; import com.google.common.base.Optional; +import com.google.common.collect.Lists; import com.raoulvdberge.refinedstorage.RS; import com.raoulvdberge.refinedstorage.api.autocrafting.craftingmonitor.ICraftingMonitorElement; import com.raoulvdberge.refinedstorage.api.network.grid.IGrid; @@ -15,6 +16,8 @@ import com.raoulvdberge.refinedstorage.gui.control.SideButtonRedstoneMode; import com.raoulvdberge.refinedstorage.gui.control.TabList; import com.raoulvdberge.refinedstorage.network.MessageCraftingMonitorCancel; import com.raoulvdberge.refinedstorage.tile.craftingmonitor.ICraftingMonitor; +import com.raoulvdberge.refinedstorage.util.RenderUtils; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; @@ -45,12 +48,14 @@ public class GuiCraftingMonitor extends GuiBase implements IResizableDisplay { private UUID id; private ItemStack requested; private int qty; + private long executionStarted; private List elements; - public CraftingMonitorTask(UUID id, ItemStack requested, int qty, List elements) { + public CraftingMonitorTask(UUID id, ItemStack requested, int qty, long executionStarted, List elements) { this.id = id; this.requested = requested; this.qty = qty; + this.executionStarted = executionStarted; this.elements = elements; } @@ -60,8 +65,18 @@ public class GuiCraftingMonitor extends GuiBase implements IResizableDisplay { } @Override - public String getName() { - return qty + "x " + requested.getDisplayName(); + public void drawTooltip(int x, int y, int screenWidth, int screenHeight, FontRenderer fontRenderer) { + List textLines = Lists.newArrayList(requested.getDisplayName()); + List smallTextLines = Lists.newArrayList(); + + int totalSecs = (int) (System.currentTimeMillis() - executionStarted) / 1000; + int minutes = (totalSecs % 3600) / 60; + int seconds = totalSecs % 60; + + smallTextLines.add(I18n.format("gui.refinedstorage:crafting_monitor.tooltip.requested", qty)); + smallTextLines.add(String.format("%02d:%02d", minutes, seconds)); + + RenderUtils.drawTooltipWithSmallText(textLines, smallTextLines, true, ItemStack.EMPTY, x, y, screenWidth, screenHeight, fontRenderer); } @Override @@ -89,6 +104,7 @@ public class GuiCraftingMonitor extends GuiBase implements IResizableDisplay { super(container, 176, 230); this.craftingMonitor = craftingMonitor; + this.tabs = new TabList(this, () -> tasks, () -> (int) Math.floor((float) Math.max(0, tasks.size() - 1) / (float) ICraftingMonitor.TABS_PER_PAGE), craftingMonitor::getTabPage, () -> { IGridTab tab = getCurrentTab(); @@ -98,6 +114,7 @@ public class GuiCraftingMonitor extends GuiBase implements IResizableDisplay { return tasks.indexOf(tab); }, ICraftingMonitor.TABS_PER_PAGE); + this.tabs.addListener(new TabList.ITabListListener() { @Override public void onSelectionChanged(int tab) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/control/TabList.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/control/TabList.java index 9be55eae0..08fa6884a 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/control/TabList.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/control/TabList.java @@ -144,8 +144,8 @@ public class TabList { } public void drawTooltip(FontRenderer fontRenderer, int mouseX, int mouseY) { - if (tabHovering >= 0 && tabHovering < tabs.get().size() && !tabs.get().get(tabHovering).getName().equalsIgnoreCase("")) { - gui.drawTooltip(mouseX, mouseY, tabs.get().get(tabHovering).getName()); + if (tabHovering >= 0 && tabHovering < tabs.get().size()) { + tabs.get().get(tabHovering).drawTooltip(mouseX, mouseY, gui.getScreenWidth(), gui.getScreenHeight(), fontRenderer); } if (pages.get() > 0) { diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java index e625df130..f6d7b46ab 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/GuiGrid.java @@ -25,7 +25,6 @@ import com.raoulvdberge.refinedstorage.tile.grid.portable.TilePortableGrid; import com.raoulvdberge.refinedstorage.util.RenderUtils; import com.raoulvdberge.refinedstorage.util.TimeUtils; import net.minecraft.client.audio.PositionedSoundRecord; -import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; @@ -34,11 +33,7 @@ import net.minecraft.client.resources.I18n; import net.minecraft.init.SoundEvents; import net.minecraft.item.ItemStack; import net.minecraft.util.math.BlockPos; -import net.minecraft.util.text.TextFormatting; -import net.minecraftforge.client.event.RenderTooltipEvent; -import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.fml.client.config.GuiCheckBox; -import net.minecraftforge.fml.client.config.GuiUtils; import net.minecraftforge.fml.common.FMLCommonHandler; import java.io.IOException; @@ -377,154 +372,21 @@ public class GuiGrid extends GuiBase implements IResizableDisplay { tabs.drawTooltip(fontRenderer, mouseX, mouseY); } - // Copied with some tweaks from GuiUtils#drawHoveringText(@Nonnull final ItemStack stack, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, FontRenderer font) - public void drawGridTooltip(IGridStack gridStack, int mouseX, int mouseY) { - // RS BEGIN + private void drawGridTooltip(IGridStack gridStack, int mouseX, int mouseY) { List textLines = Lists.newArrayList(gridStack.getTooltip().split("\n")); + List smallTextLines = Lists.newArrayList(); - if (RS.INSTANCE.config.detailedTooltip) { - if (!(gridStack instanceof GridStackItem) || !((GridStackItem) gridStack).doesDisplayCraftText()) { - textLines.add(""); - } + if (!(gridStack instanceof GridStackItem) || !((GridStackItem) gridStack).doesDisplayCraftText()) { + smallTextLines.add(I18n.format("misc.refinedstorage:total", gridStack.getFormattedFullQuantity())); + } - if (gridStack.getTrackerEntry() != null) { - textLines.add(""); - } + if (gridStack.getTrackerEntry() != null) { + smallTextLines.add(TimeUtils.getAgo(gridStack.getTrackerEntry().getTime(), gridStack.getTrackerEntry().getName())); } ItemStack stack = gridStack instanceof GridStackItem ? ((GridStackItem) gridStack).getStack() : ItemStack.EMPTY; - // RS END - if (!textLines.isEmpty()) { - RenderTooltipEvent.Pre event = new RenderTooltipEvent.Pre(stack, textLines, mouseX, mouseY, screenWidth, screenHeight, -1, fontRenderer); - if (MinecraftForge.EVENT_BUS.post(event)) { - return; - } - mouseX = event.getX(); - mouseY = event.getY(); - screenWidth = event.getScreenWidth(); - screenHeight = event.getScreenHeight(); - FontRenderer font = event.getFontRenderer(); - - // RS BEGIN - float textScale = font.getUnicodeFlag() ? 1F : 0.7F; - // RS END - - GlStateManager.disableRescaleNormal(); - RenderHelper.disableStandardItemLighting(); - GlStateManager.disableLighting(); - GlStateManager.disableDepth(); - int tooltipTextWidth = 0; - - for (String textLine : textLines) { - int textLineWidth = font.getStringWidth(textLine); - - if (textLineWidth > tooltipTextWidth) { - tooltipTextWidth = textLineWidth; - } - } - - // RS BEGIN - if (RS.INSTANCE.config.detailedTooltip) { - int size; - - if (!(gridStack instanceof GridStackItem) || !((GridStackItem) gridStack).doesDisplayCraftText()) { - size = (int) (font.getStringWidth(I18n.format("misc.refinedstorage:total", gridStack.getFormattedFullQuantity())) * textScale); - - if (size > tooltipTextWidth) { - tooltipTextWidth = size; - } - } - - if (gridStack.getTrackerEntry() != null) { - size = (int) (font.getStringWidth(TimeUtils.getAgo(gridStack.getTrackerEntry().getTime(), gridStack.getTrackerEntry().getName())) * textScale); - - if (size > tooltipTextWidth) { - tooltipTextWidth = size; - } - } - } - // RS END - - int titleLinesCount = 1; - int tooltipX = mouseX + 12; - - int tooltipY = mouseY - 12; - int tooltipHeight = 8; - - if (textLines.size() > 1) { - tooltipHeight += (textLines.size() - 1) * 10; - if (textLines.size() > titleLinesCount) { - tooltipHeight += 2; - } - } - - if (tooltipY + tooltipHeight + 6 > screenHeight) { - tooltipY = screenHeight - tooltipHeight - 6; - } - - final int zLevel = 300; - final int backgroundColor = 0xF0100010; - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); - final int borderColorStart = 0x505000FF; - final int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, borderColorStart, borderColorStart); - GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); - - MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostBackground(stack, textLines, tooltipX, tooltipY, font, tooltipTextWidth, tooltipHeight)); - int tooltipTop = tooltipY; - - for (int lineNumber = 0; lineNumber < textLines.size(); ++lineNumber) { - String line = textLines.get(lineNumber); - font.drawStringWithShadow(line, (float) tooltipX, (float) tooltipY, -1); - - if (lineNumber + 1 == titleLinesCount) { - tooltipY += 2; - } - - tooltipY += 10; - } - - MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostText(stack, textLines, tooltipX, tooltipTop, font, tooltipTextWidth, tooltipHeight)); - - // RS BEGIN - if (RS.INSTANCE.config.detailedTooltip) { - GlStateManager.pushMatrix(); - GlStateManager.scale(textScale, textScale, 1); - - if (!(gridStack instanceof GridStackItem) || !((GridStackItem) gridStack).doesDisplayCraftText()) { - font.drawStringWithShadow( - TextFormatting.GRAY + I18n.format("misc.refinedstorage:total", gridStack.getFormattedFullQuantity()), - RenderUtils.getOffsetOnScale(tooltipX, textScale), - RenderUtils.getOffsetOnScale(tooltipTop + tooltipHeight - (gridStack.getTrackerEntry() != null ? 15 : 6) - (font.getUnicodeFlag() ? 2 : 0), textScale), - -1 - ); - } - - if (gridStack.getTrackerEntry() != null) { - font.drawStringWithShadow( - TextFormatting.GRAY + TimeUtils.getAgo(gridStack.getTrackerEntry().getTime(), gridStack.getTrackerEntry().getName()), - RenderUtils.getOffsetOnScale(tooltipX, textScale), - RenderUtils.getOffsetOnScale(tooltipTop + tooltipHeight - 6 - (font.getUnicodeFlag() ? 2 : 0), textScale), - -1 - ); - } - - GlStateManager.popMatrix(); - } - // RS END - - GlStateManager.enableLighting(); - GlStateManager.enableDepth(); - RenderHelper.enableStandardItemLighting(); - GlStateManager.enableRescaleNormal(); - } + RenderUtils.drawTooltipWithSmallText(textLines, smallTextLines, RS.INSTANCE.config.detailedTooltip, stack, mouseX, mouseY, screenWidth, screenHeight, fontRenderer); } @Override diff --git a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java index 1e9978897..1e0740de3 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/gui/grid/stack/GridStackItem.java @@ -6,16 +6,12 @@ import com.raoulvdberge.refinedstorage.apiimpl.storage.StorageTrackerEntry; import com.raoulvdberge.refinedstorage.gui.GuiBase; import com.raoulvdberge.refinedstorage.util.StackUtils; import io.netty.buffer.ByteBuf; -import net.minecraft.client.Minecraft; import net.minecraft.client.resources.I18n; -import net.minecraft.client.util.ITooltipFlag; import net.minecraft.item.ItemStack; -import net.minecraft.util.text.TextFormatting; import net.minecraftforge.oredict.OreDictionary; import javax.annotation.Nullable; import java.util.Arrays; -import java.util.List; import java.util.stream.Collectors; public class GridStackItem implements IGridStack { @@ -103,18 +99,7 @@ public class GridStackItem implements IGridStack { @Override public String getTooltip() { try { - List lines = stack.getTooltip(Minecraft.getMinecraft().player, Minecraft.getMinecraft().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL); - - // From GuiScreen#renderToolTip - for (int i = 0; i < lines.size(); ++i) { - if (i == 0) { - lines.set(i, stack.getRarity().rarityColor + lines.get(i)); - } else { - lines.set(i, TextFormatting.GRAY + lines.get(i)); - } - } - - return lines.stream().collect(Collectors.joining("\n")); + return StackUtils.getItemTooltip(stack).stream().collect(Collectors.joining("\n")); } catch (Throwable t) { return ""; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java index d34501872..041207040 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/item/ItemFilter.java @@ -55,7 +55,7 @@ public class ItemFilter extends ItemBase { public String getItemStackDisplayName(ItemStack stack) { String name = getName(stack); - if (!name.equalsIgnoreCase("")) { + if (!name.trim().equals("")) { return name; } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java index b6ecb7df0..2f527a49e 100755 --- a/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/network/MessageCraftingMonitorElements.java @@ -39,6 +39,8 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler UUID id = UUID.fromString(ByteBufUtils.readUTF8String(buf)); ItemStack requested = ByteBufUtils.readItemStack(buf); int qty = buf.readInt(); + long executionStarted = buf.readLong(); + List elements = new ArrayList<>(); int elementCount = buf.readInt(); @@ -51,7 +53,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler } } - tasks.add(new GuiCraftingMonitor.CraftingMonitorTask(id, requested, qty, elements)); + tasks.add(new GuiCraftingMonitor.CraftingMonitorTask(id, requested, qty, executionStarted, elements)); } } @@ -63,6 +65,7 @@ public class MessageCraftingMonitorElements implements IMessage, IMessageHandler ByteBufUtils.writeUTF8String(buf, task.getId().toString()); ByteBufUtils.writeItemStack(buf, task.getRequested()); buf.writeInt(task.getQuantity()); + buf.writeLong(task.getExecutionStarted()); List elements = task.getCraftingMonitorElements(); diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java index a1d7d8e85..01263fafc 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/RenderUtils.java @@ -3,8 +3,10 @@ package com.raoulvdberge.refinedstorage.util; import com.google.common.collect.ImmutableMap; import com.raoulvdberge.refinedstorage.apiimpl.API; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.FontRenderer; import net.minecraft.client.renderer.BufferBuilder; import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.RenderHelper; import net.minecraft.client.renderer.Tessellator; import net.minecraft.client.renderer.block.model.ItemCameraTransforms; import net.minecraft.client.renderer.texture.TextureAtlasSprite; @@ -18,10 +20,15 @@ import net.minecraft.util.math.AxisAlignedBB; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.RayTraceResult; import net.minecraft.util.math.Vec3d; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.event.RenderTooltipEvent; +import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.common.model.TRSRTransformation; import net.minecraftforge.fluids.Fluid; import net.minecraftforge.fluids.FluidStack; +import net.minecraftforge.fml.client.config.GuiUtils; +import javax.annotation.Nonnull; import javax.vecmath.Matrix4f; import javax.vecmath.Vector3f; import java.util.Collection; @@ -325,4 +332,136 @@ public final class RenderUtils { } } } + + // Copied with some tweaks from GuiUtils#drawHoveringText(@Nonnull final ItemStack stack, List textLines, int mouseX, int mouseY, int screenWidth, int screenHeight, int maxTextWidth, FontRenderer font) + public static void drawTooltipWithSmallText(List textLines, List smallTextLines, boolean showSmallText, @Nonnull ItemStack stack, int mouseX, int mouseY, int screenWidth, int screenHeight, FontRenderer fontRenderer) { + // RS BEGIN + if (showSmallText) { + for (int i = 0; i < smallTextLines.size(); ++i) { + textLines.add(""); + } + } + // RS END + + if (!textLines.isEmpty()) { + RenderTooltipEvent.Pre event = new RenderTooltipEvent.Pre(stack, textLines, mouseX, mouseY, screenWidth, screenHeight, -1, fontRenderer); + if (MinecraftForge.EVENT_BUS.post(event)) { + return; + } + + mouseX = event.getX(); + mouseY = event.getY(); + + screenWidth = event.getScreenWidth(); + screenHeight = event.getScreenHeight(); + + FontRenderer font = event.getFontRenderer(); + + // RS BEGIN + float textScale = font.getUnicodeFlag() ? 1F : 0.7F; + // RS END + + GlStateManager.disableRescaleNormal(); + RenderHelper.disableStandardItemLighting(); + GlStateManager.disableLighting(); + GlStateManager.disableDepth(); + int tooltipTextWidth = 0; + + for (String textLine : textLines) { + int textLineWidth = font.getStringWidth(textLine); + + if (textLineWidth > tooltipTextWidth) { + tooltipTextWidth = textLineWidth; + } + } + + // RS BEGIN + if (showSmallText) { + int size; + + for (String smallText : smallTextLines) { + size = (int) (font.getStringWidth(smallText) * textScale); + + if (size > tooltipTextWidth) { + tooltipTextWidth = size; + } + } + } + // RS END + + int titleLinesCount = 1; + int tooltipX = mouseX + 12; + + int tooltipY = mouseY - 12; + int tooltipHeight = 8; + + if (textLines.size() > 1) { + tooltipHeight += (textLines.size() - 1) * 10; + if (textLines.size() > titleLinesCount) { + tooltipHeight += 2; + } + } + + if (tooltipY + tooltipHeight + 6 > screenHeight) { + tooltipY = screenHeight - tooltipHeight - 6; + } + + final int zLevel = 300; + final int backgroundColor = 0xF0100010; + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 4, tooltipX + tooltipTextWidth + 3, tooltipY - 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 4, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX - 4, tooltipY - 3, tooltipX - 3, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 3, tooltipY - 3, tooltipX + tooltipTextWidth + 4, tooltipY + tooltipHeight + 3, backgroundColor, backgroundColor); + final int borderColorStart = 0x505000FF; + final int borderColorEnd = (borderColorStart & 0xFEFEFE) >> 1 | borderColorStart & 0xFF000000; + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3 + 1, tooltipX - 3 + 1, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX + tooltipTextWidth + 2, tooltipY - 3 + 1, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3 - 1, borderColorStart, borderColorEnd); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY - 3, tooltipX + tooltipTextWidth + 3, tooltipY - 3 + 1, borderColorStart, borderColorStart); + GuiUtils.drawGradientRect(zLevel, tooltipX - 3, tooltipY + tooltipHeight + 2, tooltipX + tooltipTextWidth + 3, tooltipY + tooltipHeight + 3, borderColorEnd, borderColorEnd); + + MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostBackground(stack, textLines, tooltipX, tooltipY, font, tooltipTextWidth, tooltipHeight)); + int tooltipTop = tooltipY; + + for (int lineNumber = 0; lineNumber < textLines.size(); ++lineNumber) { + String line = textLines.get(lineNumber); + font.drawStringWithShadow(line, (float) tooltipX, (float) tooltipY, -1); + + if (lineNumber + 1 == titleLinesCount) { + tooltipY += 2; + } + + tooltipY += 10; + } + + MinecraftForge.EVENT_BUS.post(new RenderTooltipEvent.PostText(stack, textLines, tooltipX, tooltipTop, font, tooltipTextWidth, tooltipHeight)); + + // RS BEGIN + if (showSmallText) { + GlStateManager.pushMatrix(); + GlStateManager.scale(textScale, textScale, 1); + + int y = tooltipTop + tooltipHeight - 6; + + for (int i = smallTextLines.size() - 1; i >= 0; --i) { + font.drawStringWithShadow( + TextFormatting.GRAY + smallTextLines.get(i), + RenderUtils.getOffsetOnScale(tooltipX, textScale), + RenderUtils.getOffsetOnScale(y - (font.getUnicodeFlag() ? 2 : 0), textScale), + -1 + ); + + y -= 9; + } + + GlStateManager.popMatrix(); + } + // RS END + + GlStateManager.enableLighting(); + GlStateManager.enableDepth(); + RenderHelper.enableStandardItemLighting(); + GlStateManager.enableRescaleNormal(); + } + } } diff --git a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java index fe5fed4cc..9c93579b1 100644 --- a/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java +++ b/src/main/java/com/raoulvdberge/refinedstorage/util/StackUtils.java @@ -6,6 +6,8 @@ import com.raoulvdberge.refinedstorage.api.storage.disk.IStorageDiskProvider; import com.raoulvdberge.refinedstorage.api.util.IStackList; import com.raoulvdberge.refinedstorage.apiimpl.API; import io.netty.buffer.ByteBuf; +import net.minecraft.client.Minecraft; +import net.minecraft.client.util.ITooltipFlag; import net.minecraft.creativetab.CreativeTabs; import net.minecraft.init.Items; import net.minecraft.inventory.IInventory; @@ -14,6 +16,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.util.NonNullList; +import net.minecraft.util.text.TextFormatting; import net.minecraft.world.World; import net.minecraftforge.common.util.Constants; import net.minecraftforge.fluids.Fluid; @@ -31,6 +34,7 @@ import org.apache.commons.lang3.tuple.Pair; import javax.annotation.Nonnull; import javax.annotation.Nullable; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.function.Function; @@ -292,4 +296,19 @@ public final class StackUtils { return Pair.of(null, null); } + + public static List getItemTooltip(ItemStack stack) { + List lines = stack.getTooltip(Minecraft.getMinecraft().player, Minecraft.getMinecraft().gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL); + + // From GuiScreen#getItemToolTip + for (int i = 0; i < lines.size(); ++i) { + if (i == 0) { + lines.set(i, stack.getRarity().rarityColor + lines.get(i)); + } else { + lines.set(i, TextFormatting.GRAY + lines.get(i)); + } + } + + return lines; + } } diff --git a/src/main/resources/assets/refinedstorage/lang/en_us.lang b/src/main/resources/assets/refinedstorage/lang/en_us.lang index 8bc2a9db0..c4eb25d17 100644 --- a/src/main/resources/assets/refinedstorage/lang/en_us.lang +++ b/src/main/resources/assets/refinedstorage/lang/en_us.lang @@ -24,6 +24,7 @@ gui.refinedstorage:interface.import=Interface Import gui.refinedstorage:interface.export=Interface Export gui.refinedstorage:crafting_monitor=Crafting Monitor gui.refinedstorage:wireless_crafting_monitor=Wireless Crafting Monitor +gui.refinedstorage:crafting_monitor.tooltip.requested=%d requested gui.refinedstorage:crafting_monitor.fluids_taking=Fluids taking gui.refinedstorage:crafting_monitor.items_crafting=Items crafting gui.refinedstorage:crafting_monitor.items_processing=Items processing