Compare commits

..
7 changed files with 155 additions and 6 deletions

No files matched your search

+2 -2
View File
@@ -3,9 +3,9 @@ name: Build and test
on:
pull_request:
branches: [ master, main, release/** ]
branches: [ master, main ]
push:
branches: [ master, main, release/** ]
branches: [ master, main ]
jobs:
build-and-test:
@@ -16,6 +16,7 @@ import mcp.mobius.waila.handlers.HUDHandlerBlocks;
import mcp.mobius.waila.handlers.HUDHandlerEntities;
import mcp.mobius.waila.handlers.VanillaTooltipHandler;
import mcp.mobius.waila.handlers.nei.NEIHandler;
import mcp.mobius.waila.overlay.BreakProgressRenderer;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderAspectString;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderBar;
import mcp.mobius.waila.overlay.tooltiprenderers.TTRenderFluidBar;
@@ -53,6 +54,8 @@ public class ProxyClient extends ProxyServer {
ModuleRegistrar.instance().addConfig("General", "general.showents");
ModuleRegistrar.instance().addConfig("General", "general.showhp");
ModuleRegistrar.instance().addConfig("General", "general.showcrop");
ModuleRegistrar.instance().addConfig("General", BreakProgressRenderer.CFG_ENABLED, true);
ModuleRegistrar.instance().addConfig("General", BreakProgressRenderer.CFG_TOP, false);
ModuleRegistrar.instance().registerTooltipRenderer("waila.health", new TTRenderHealth());
ModuleRegistrar.instance().registerTooltipRenderer("waila.stack", new TTRenderStack());
@@ -0,0 +1,131 @@
package mcp.mobius.waila.overlay;
import java.lang.reflect.Field;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.PlayerControllerMP;
import net.minecraft.util.MathHelper;
import net.minecraft.util.MovingObjectPosition;
import net.minecraft.world.World;
import net.minecraftforge.common.ForgeHooks;
import cpw.mods.fml.relauncher.ReflectionHelper;
import mcp.mobius.waila.Waila;
import mcp.mobius.waila.api.impl.ConfigHandler;
import mcp.mobius.waila.utils.ColorUtils;
/**
* Draws the block break progress as a thin line on the edge of the tooltip box (Jade style). Based on the break
* progress of WDMla (https://github.com/GTNewHorizons/WDMla).
*/
public final class BreakProgressRenderer {
public static final String CFG_ENABLED = "general.breakprogress";
public static final String CFG_TOP = "general.breakprogresstop";
/** Alpha change per game tick */
private static final float FADE_PER_TICK = 0.1f;
/** Alpha while mining. The line is fully opaque only in the last tick before the block breaks. */
private static final float MAX_ALPHA = 0.6f;
private static float progress;
private static float alpha;
private static boolean canHarvest = true;
private static long lastFrame;
private static World lastWorld;
private static int lastX, lastY, lastW, lastH;
private static Field curBlockDamageField;
private static boolean fieldFailed;
private BreakProgressRenderer() {}
private static boolean isEnabled() {
return ConfigHandler.instance().getConfig(CFG_ENABLED, true);
}
/**
* Updates the progress state. Call this one time per frame before you draw.
*/
public static void update(float partialTicks) {
final Minecraft mc = Minecraft.getMinecraft();
long now = Minecraft.getSystemTime();
// A paused or lagging client must not fade out in one step
float deltaTicks = Math.min((now - lastFrame) / 50f, 1f);
lastFrame = now;
if (mc.theWorld != lastWorld) {
lastWorld = mc.theWorld;
progress = alpha = 0;
}
if (!isEnabled() || mc.playerController == null || mc.theWorld == null || mc.thePlayer == null) {
progress = alpha = 0;
return;
}
float damage = getBlockDamage(mc.playerController);
MovingObjectPosition target = RayTracing.instance().getTarget();
if (damage <= 0 || target == null || target.typeOfHit != MovingObjectPosition.MovingObjectType.BLOCK) {
// Not mining (anymore), fade out the last progress
alpha = Math.max(alpha - deltaTicks * FADE_PER_TICK, 0f);
return;
}
int x = target.blockX, y = target.blockY, z = target.blockZ;
Block block = mc.theWorld.getBlock(x, y, z);
canHarvest = ForgeHooks.canHarvestBlock(block, mc.thePlayer, mc.theWorld.getBlockMetadata(x, y, z));
alpha = Math.min(alpha + deltaTicks * FADE_PER_TICK, MAX_ALPHA);
float perTick = block.getPlayerRelativeBlockHardness(mc.thePlayer, mc.theWorld, x, y, z);
if (damage + perTick >= 1f) {
// The block breaks in the next tick
alpha = progress = 1f;
} else {
progress = MathHelper.clamp_float(damage + partialTicks * perTick, 0f, 1f);
}
}
private static float getBlockDamage(PlayerControllerMP controller) {
if (fieldFailed) return 0f;
try {
if (curBlockDamageField == null) {
curBlockDamageField = ReflectionHelper
.findField(PlayerControllerMP.class, "curBlockDamageMP", "field_78770_f");
}
return curBlockDamageField.getFloat(controller);
} catch (Exception e) {
fieldFailed = true;
Waila.log.error("Cannot read the block damage, break progress is disabled", e);
return 0f;
}
}
/**
* Draws the line on the outer row of the tooltip box. The arguments are the box geometry from {@link Tooltip}.
*/
public static void draw(int x, int y, int w, int h) {
lastX = x;
lastY = y;
lastW = w;
lastH = h;
if (!isEnabled() || alpha <= 0) return;
int width = (int) ((w - 1) * progress);
if (width <= 0) return;
// Transparent as the box background
float boxAlpha = (OverlayConfig.alpha >>> 24) / 255f;
int base = canHarvest ? ColorUtils.breakProgress.getColor() : ColorUtils.breakProgressFailure.getColor();
int color = ((int) (((base >>> 24) & 0xFF) * alpha * boxAlpha) << 24) | (base & 0xFFFFFF);
boolean top = ConfigHandler.instance().getConfig(CFG_TOP, false);
DisplayUtil.drawGradientRect(x + 1, top ? y : y + h, width, 1, color, color);
}
/**
* Draws only the fading line, for when the tooltip itself is already gone.
*/
public static void drawLast() {
draw(lastX, lastY, lastW, lastH);
}
}
@@ -23,8 +23,17 @@ public class OverlayRenderer {
&& ConfigHandler.instance().showTooltip());
}
public static void renderOverlay(Tooltip tooltip) {
if (!isOverlayVisible() || RayTracing.instance().getTarget() == null) return;
public static void renderOverlay(Tooltip tooltip, float partialTicks) {
if (!isOverlayVisible()) return;
BreakProgressRenderer.update(partialTicks);
if (RayTracing.instance().getTarget() == null
|| RayTracing.instance().getTarget().typeOfHit == MovingObjectPosition.MovingObjectType.MISS) {
// Keep drawing the progress bar while it fades out after the block was broken
BreakProgressRenderer.drawLast();
return;
}
if (RayTracing.instance().getTarget().typeOfHit == MovingObjectPosition.MovingObjectType.BLOCK
&& RayTracing.instance().getTargetStack() != null) {
@@ -58,6 +67,8 @@ public class OverlayRenderer {
OverlayConfig.gradient1,
OverlayConfig.gradient2);
BreakProgressRenderer.draw(tooltip.x, tooltip.y, tooltip.w, tooltip.h);
GL11.glEnable(GL11.GL_BLEND);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
tooltip.draw();
@@ -29,7 +29,7 @@ public class WailaTickHandler {
@SubscribeEvent
public void tickRender(TickEvent.RenderTickEvent event) {
if (event.phase == TickEvent.Phase.END) {
OverlayRenderer.renderOverlay(tooltip);
OverlayRenderer.renderOverlay(tooltip, event.renderTickTime);
}
}
@@ -11,7 +11,9 @@ public class ColorUtils {
fuelFurnaceBarTop = color.argb("fuelFurnaceBarTop", "0xFFFF8800"),
fuelFurnaceBarBottom = color.argb("fuelFurnaceBarBottom", "0xFFFFCC00"),
progressBarTop = color.argb("progressBarTop", "0xFFFF0000"),
progressBarBottom = color.argb("progressBarBottom", "0xFF8B0000");
progressBarBottom = color.argb("progressBarBottom", "0xFF8B0000"),
breakProgress = color.argb("breakProgress", "0xFFFFFFFF"),
breakProgressFailure = color.argb("breakProgressFailure", "0xFFAA0000");
// spotless:on
}
@@ -153,6 +153,8 @@ option.stevescarts.shifttoggle=Shift toggle
option.general.showents=Show entities
option.general.showhp=Show entities health
option.general.showcrop=Show crop growth
option.general.breakprogress=Show break progress
option.general.breakprogresstop=Break progress on top
option.thaumcraft.aspects=Show aspects
nei.options.keys.showenchant=Show enchanting values