aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/events/HudRenderEvents.java
blob: 13e70498dc8380e351ca1d4ac74245aaaaa0406f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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;

/**
 * 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<HudRenderStage> AFTER_MAIN_HUD = createEventForStage();

	/**
	 * Called before the {@link net.minecraft.client.gui.hud.ChatHud} is rendered.
	 */
	public static final Event<HudRenderStage> BEFORE_CHAT = createEventForStage();

	/**
	 * Called after the entire HUD is rendered.
	 */
	public static final Event<HudRenderStage> LAST = createEventForStage();

	private static Event<HudRenderStage> 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 tickDelta Progress for linearly interpolating between the previous and current game state
		 */
		void onRender(DrawContext context, float tickDelta);
	}
}