diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-02-18 02:15:26 -0500 |
---|---|---|
committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-04-26 16:23:20 -0400 |
commit | 4f4d3f480d75293a2f19f799423a282a4f03b421 (patch) | |
tree | b3206e5e52dec1a3707a48a01c309a0305f51e36 /src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java | |
parent | 3c967b384500d117c23fa5d1cb23bc415a5d6324 (diff) | |
download | Skyblocker-4f4d3f480d75293a2f19f799423a282a4f03b421.tar.gz Skyblocker-4f4d3f480d75293a2f19f799423a282a4f03b421.tar.bz2 Skyblocker-4f4d3f480d75293a2f19f799423a282a4f03b421.zip |
Hud Render Events
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java index fc0d58b7..3dff4d6f 100644 --- a/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java +++ b/src/main/java/de/hysky/skyblocker/mixin/InGameHudMixin.java @@ -6,6 +6,8 @@ import com.mojang.blaze3d.systems.RenderSystem; import de.hysky.skyblocker.SkyblockerMod; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars; +import de.hysky.skyblocker.events.HudRenderEvents; +import de.hysky.skyblocker.mixin.accessor.LayeredDrawerAccessor; import de.hysky.skyblocker.skyblock.dungeon.DungeonMap; import de.hysky.skyblocker.skyblock.dungeon.DungeonScore; import de.hysky.skyblocker.skyblock.dungeon.DungeonScoreHUD; @@ -19,15 +21,18 @@ import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.LayeredDrawer; import net.minecraft.client.gui.hud.InGameHud; import net.minecraft.entity.player.PlayerEntity; import net.minecraft.item.ItemStack; import net.minecraft.text.Text; import net.minecraft.util.Identifier; +import java.util.List; import java.util.function.Supplier; import java.util.regex.Pattern; +import org.objectweb.asm.Opcodes; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -54,6 +59,10 @@ public abstract class InGameHudMixin { @Final private MinecraftClient client; + @Shadow + @Final + private LayeredDrawer layeredDrawer; + @Inject(method = "renderHotbar", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/hud/InGameHud;renderHotbarItem(Lnet/minecraft/client/gui/DrawContext;IIFLnet/minecraft/entity/player/PlayerEntity;Lnet/minecraft/item/ItemStack;I)V", ordinal = 0)) public void skyblocker$renderHotbarItemLockOrRarityBg(CallbackInfo ci, @Local(argsOnly = true) DrawContext context, @Local(ordinal = 4, name = "m") int index, @Local(ordinal = 5, name = "n") int x, @Local(ordinal = 6, name = "o") int y, @Local PlayerEntity player) { if (Utils.isOnSkyblock()) { @@ -121,4 +130,37 @@ public abstract class InGameHudMixin { ci.cancel(); } } + + /** + * Hopefully other mods don't add stages into these two drawers... + * + * @implNote Check this every update to see if the indexes of each layer have changed. + */ + @Inject(method = "<init>", at = @At(value = "FIELD", target = "Lnet/minecraft/client/gui/hud/InGameHud;layeredDrawer:Lnet/minecraft/client/gui/LayeredDrawer;", opcode = Opcodes.GETFIELD)) + private void skyblocker$beforeDrawersInitialized(CallbackInfo ci, @Local(ordinal = 0) LayeredDrawer persistentDrawer, @Local(ordinal = 1) LayeredDrawer intermittentDrawer) { + List<LayeredDrawer.Layer> persistentLayers = ((LayeredDrawerAccessor) persistentDrawer).getLayers(); + + //After Main HUD - stage index is 2 + LayeredDrawer.Layer mainHudLayer = persistentLayers.get(2); + + persistentLayers.set(2, (context, tickDelta) -> { + mainHudLayer.render(context, tickDelta); + HudRenderEvents.AFTER_MAIN_HUD.invoker().onRender(context, tickDelta); + }); + + List<LayeredDrawer.Layer> intermittentLayers = ((LayeredDrawerAccessor) intermittentDrawer).getLayers(); + + //Before Chat - stage index is 5 + LayeredDrawer.Layer chatLayer = intermittentLayers.get(5); + + intermittentLayers.set(5, (context, tickDelta) -> { + HudRenderEvents.BEFORE_CHAT.invoker().onRender(context, tickDelta); + chatLayer.render(context, tickDelta); + }); + } + + @Inject(method = "<init>", at = @At("TAIL")) + private void skyblocker$afterDrawersInitialized(CallbackInfo ci) { + this.layeredDrawer.addLayer(HudRenderEvents.LAST.invoker()::onRender); + } } |