From 9d7ddbc326d43be59a2b6d747fa56fd23ad62960 Mon Sep 17 00:00:00 2001 From: simibubi <31564874+simibubi@users.noreply.github.com> Date: Sun, 24 Jan 2021 14:30:05 +0100 Subject: [PATCH] Entry point --- .../simibubi/create/events/ClientEvents.java | 18 ++- .../foundation/metadoc/MetaDocHandler.java | 114 ++++++++++++++++++ .../foundation/metadoc/MetaDocScreen.java | 56 +++++++++ 3 files changed, 184 insertions(+), 4 deletions(-) create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java create mode 100644 src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java diff --git a/src/main/java/com/simibubi/create/events/ClientEvents.java b/src/main/java/com/simibubi/create/events/ClientEvents.java index e3399d191..08d9264de 100644 --- a/src/main/java/com/simibubi/create/events/ClientEvents.java +++ b/src/main/java/com/simibubi/create/events/ClientEvents.java @@ -1,5 +1,8 @@ package com.simibubi.create.events; +import java.util.ArrayList; +import java.util.List; + import com.mojang.blaze3d.matrix.MatrixStack; import com.simibubi.create.AllFluids; import com.simibubi.create.Create; @@ -22,6 +25,7 @@ import com.simibubi.create.content.logistics.block.mechanicalArm.ArmInteractionP import com.simibubi.create.foundation.config.AllConfigs; import com.simibubi.create.foundation.gui.ScreenOpener; import com.simibubi.create.foundation.item.TooltipHelper; +import com.simibubi.create.foundation.metadoc.MetaDocHandler; import com.simibubi.create.foundation.networking.AllPackets; import com.simibubi.create.foundation.networking.LeftClickPacket; import com.simibubi.create.foundation.renderState.SuperRenderTypeBuffer; @@ -32,6 +36,7 @@ import com.simibubi.create.foundation.tileEntity.behaviour.scrollvalue.ScrollVal import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.ServerSpeedProvider; import com.simibubi.create.foundation.utility.placement.PlacementHelpers; + import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.ActiveRenderInfo; import net.minecraft.client.renderer.IRenderTypeBuffer; @@ -46,6 +51,7 @@ import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.event.EntityViewRenderEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent; import net.minecraftforge.client.event.RenderGameOverlayEvent.ElementType; +import net.minecraftforge.client.event.RenderTooltipEvent; import net.minecraftforge.client.event.RenderWorldLastEvent; import net.minecraftforge.event.TickEvent.ClientTickEvent; import net.minecraftforge.event.TickEvent.Phase; @@ -56,9 +62,6 @@ import net.minecraftforge.event.world.WorldEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.common.Mod.EventBusSubscriber; -import java.util.ArrayList; -import java.util.List; - @EventBusSubscriber(value = Dist.CLIENT) public class ClientEvents { @@ -84,6 +87,7 @@ public class ClientEvents { CapabilityMinecartController.tick(world); CouplingPhysics.tick(world); + MetaDocHandler.tick(); ScreenOpener.tick(); ServerSpeedProvider.clientTick(); BeltConnectorHandler.tick(); @@ -142,6 +146,11 @@ public class ClientEvents { CreateClient.schematicHandler.renderOverlay(ms, buffer, light, overlay); } + @SubscribeEvent + public static void getItemTooltipColor(RenderTooltipEvent.Color event) { + MetaDocHandler.handleTooltipColor(event); + } + @SubscribeEvent public static void addToItemTooltip(ItemTooltipEvent event) { if (!AllConfigs.CLIENT.tooltips.get()) @@ -163,7 +172,8 @@ public class ClientEvents { .addInformation(toolTip); itemTooltip.addAll(0, toolTip); } - + + MetaDocHandler.addToTooltip(event.getToolTip(), stack); } @SubscribeEvent diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java new file mode 100644 index 000000000..e5e33b156 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocHandler.java @@ -0,0 +1,114 @@ +package com.simibubi.create.foundation.metadoc; + +import java.util.List; + +import com.google.common.base.Strings; +import com.simibubi.create.foundation.gui.ScreenOpener; +import com.simibubi.create.foundation.utility.ColorHelper; +import com.simibubi.create.foundation.utility.LerpedFloat; + +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.screen.inventory.ContainerScreen; +import net.minecraft.client.util.InputMappings; +import net.minecraft.inventory.container.Slot; +import net.minecraft.item.ItemStack; +import net.minecraft.util.text.ITextComponent; +import net.minecraft.util.text.StringTextComponent; +import net.minecraft.util.text.TextFormatting; +import net.minecraftforge.client.event.RenderTooltipEvent; + +public class MetaDocHandler { + + static LerpedFloat holdWProgress = LerpedFloat.linear() + .startWithValue(0); + static ItemStack lastHoveredStack = null; + + public static void tick() { + Minecraft instance = Minecraft.getInstance(); + Screen currentScreen = instance.currentScreen; + if (!(currentScreen instanceof ContainerScreen)) + return; + ContainerScreen cs = (ContainerScreen) currentScreen; + + ItemStack prevStack = lastHoveredStack; + lastHoveredStack = null; + Slot slotUnderMouse = cs.getSlotUnderMouse(); + if (slotUnderMouse == null || !slotUnderMouse.getHasStack()) + return; + + ItemStack stack = slotUnderMouse.getStack(); + if (prevStack != stack) + holdWProgress.startWithValue(0); + + float value = holdWProgress.getValue(); + if (InputMappings.isKeyDown(instance.getWindow() + .getHandle(), + instance.gameSettings.keyBindForward.getKey() + .getKeyCode())) { +// if (AllKeys.altDown()) { + if (value >= 1) + ScreenOpener.open(new MetaDocScreen()); + holdWProgress.setValue(Math.min(1, value + Math.max(.25f, value) * .25f)); + } else { + holdWProgress.setValue(Math.max(0, value - .05f)); + } + + lastHoveredStack = stack; + } + + public static void addToTooltip(List toolTip, ItemStack stack) { + if (lastHoveredStack != stack) + return; + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); + toolTip.add(makeProgressBar(Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f))); + } + + public static void handleTooltipColor(RenderTooltipEvent.Color event) { + if (lastHoveredStack != event.getStack()) + return; + if (holdWProgress.getValue() == 0) + return; + float renderPartialTicks = Minecraft.getInstance() + .getRenderPartialTicks(); + int start = event.getOriginalBorderStart(); + int end = event.getOriginalBorderEnd(); + float progress = Math.min(1, holdWProgress.getValue(renderPartialTicks) * 8 / 7f); + + start = getSmoothColorForProgress(progress); + end = getSmoothColorForProgress((progress)); + + event.setBorderStart(start | 0xa0000000); + event.setBorderEnd(end | 0xa0000000); + } + + private static int getSmoothColorForProgress(float progress) { + if (progress < .5f) + return ColorHelper.mixColors(0x5000FF, 5592575, progress * 2); +// if (progress < .75f) +// return ColorHelper.mixColors(16733695, 5636095, (progress - .5f) * 4); + return ColorHelper.mixColors(5592575, 5636095, (progress - .5f) * 2); + } + + private static ITextComponent makeProgressBar(float progress) { + String bar = ""; + int filledLength = (int) (12 * progress); + bar += Strings.repeat("\u2588", filledLength); + if (progress < 1) + bar += Strings.repeat("\u2592", 12 - filledLength); + + TextFormatting color = TextFormatting.GRAY; + if (progress > 0) + color = TextFormatting.BLUE; + if (progress == 1f) + color = TextFormatting.AQUA; + + ITextComponent leftBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); + ITextComponent rightBr = new StringTextComponent("").applyTextStyle(TextFormatting.WHITE); + ITextComponent barComponent = new StringTextComponent(bar).applyTextStyle(color); + return leftBr.appendSibling(barComponent) + .appendSibling(rightBr); + } + +} diff --git a/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java new file mode 100644 index 000000000..45553b045 --- /dev/null +++ b/src/main/java/com/simibubi/create/foundation/metadoc/MetaDocScreen.java @@ -0,0 +1,56 @@ +package com.simibubi.create.foundation.metadoc; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.simibubi.create.foundation.gui.AbstractSimiScreen; +import com.simibubi.create.foundation.gui.GuiGameElement; +import com.simibubi.create.foundation.utility.AnimationTickHolder; + +import net.minecraft.block.Blocks; +import net.minecraftforge.fml.client.gui.GuiUtils; + +public class MetaDocScreen extends AbstractSimiScreen { + + @Override + protected void renderWindow(int mouseX, int mouseY, float partialTicks) { + + int tooltipX = 50; + int tooltipY = 50; + int tooltipTextWidth = width - 100; + int backgroundColor = GuiUtils.DEFAULT_BACKGROUND_COLOR; + int borderColorStart = GuiUtils.DEFAULT_BORDER_COLOR_START; + int borderColorEnd = GuiUtils.DEFAULT_BORDER_COLOR_END; + int zLevel = 100; + int tooltipHeight = height - 100; + + drawString(font, "MetaDoc Experimental 0", tooltipX, tooltipY - 16, 0xffffff); + + 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); + 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); + + RenderSystem.pushMatrix(); + RenderSystem.translated(width/2, height/2, 200); + GuiGameElement.of(Blocks.DIAMOND_BLOCK.getDefaultState()) + .rotate(22.5, AnimationTickHolder.getRenderTick() % 360f, 0) + .scale(50) + .render(); + RenderSystem.popMatrix(); + + } + +}