package de.hysky.skyblocker.events; import net.fabricmc.fabric.api.event.Event; import net.fabricmc.fabric.api.event.EventFactory; import net.minecraft.client.gui.DrawContext; import net.minecraft.client.render.RenderTickCounter; /** * HUD render events that allow for proper layering between different HUD elements. * This should always be preferred over Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback}. * * Perhaps in the future this system could be PR'd to Fabric. */ public class HudRenderEvents { /** * Called after the hotbar, status bars, and experience bar have been rendered. */ public static final Event AFTER_MAIN_HUD = createEventForStage(); /** * Called before the {@link net.minecraft.client.gui.hud.ChatHud} is rendered. */ public static final Event BEFORE_CHAT = createEventForStage(); /** * Called after the entire HUD is rendered. */ public static final Event LAST = createEventForStage(); private static Event createEventForStage() { return EventFactory.createArrayBacked(HudRenderStage.class, listeners -> (context, tickDelta) -> { for (HudRenderStage listener : listeners) { listener.onRender(context, tickDelta); } }); } /** * @implNote Similar to Fabric's {@link net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback} */ @FunctionalInterface public interface HudRenderStage { /** * Called sometime during a specific HUD render stage. * * @param drawContext The {@link DrawContext} instance * @param tickCounter The {@link RenderTickCounter} instance */ void onRender(DrawContext context, RenderTickCounter tickCounter); } }