Skip to content

Commit 7b26e87

Browse files
authored
use HudElementRegistry instead of mixins (#1954)
1 parent 84fcf83 commit 7b26e87

File tree

4 files changed

+74
-65
lines changed

4 files changed

+74
-65
lines changed

src/main/java/de/hysky/skyblocker/mixins/GuiMixin.java

Lines changed: 0 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,23 @@
11
package de.hysky.skyblocker.mixins;
22

33
import com.llamalad7.mixinextras.injector.ModifyExpressionValue;
4-
import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
54
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
65
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
76
import com.llamalad7.mixinextras.sugar.Local;
87
import de.hysky.skyblocker.config.SkyblockerConfigManager;
9-
import de.hysky.skyblocker.skyblock.fancybars.FancyStatusBars;
108
import de.hysky.skyblocker.skyblock.item.HotbarSlotLock;
119
import de.hysky.skyblocker.skyblock.item.ItemCooldowns;
1210
import de.hysky.skyblocker.skyblock.item.ItemProtection;
1311
import de.hysky.skyblocker.skyblock.item.background.ItemBackgroundManager;
14-
import de.hysky.skyblocker.skyblock.tabhud.TabHud;
15-
import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen;
1612
import de.hysky.skyblocker.utils.Formatters;
1713
import de.hysky.skyblocker.utils.ItemUtils;
1814
import de.hysky.skyblocker.utils.Utils;
1915
import net.fabricmc.api.EnvType;
2016
import net.fabricmc.api.Environment;
21-
import net.minecraft.client.DeltaTracker;
2217
import net.minecraft.client.Minecraft;
2318
import net.minecraft.client.gui.Font;
2419
import net.minecraft.client.gui.Gui;
2520
import net.minecraft.client.gui.GuiGraphics;
26-
import net.minecraft.client.gui.components.PlayerTabOverlay;
27-
import net.minecraft.client.gui.contextualbar.ContextualBarRenderer;
2821
import net.minecraft.client.renderer.RenderPipelines;
2922
import net.minecraft.core.component.DataComponents;
3023
import net.minecraft.nbt.CompoundTag;
@@ -34,8 +27,6 @@
3427
import net.minecraft.world.entity.player.Player;
3528
import net.minecraft.world.item.ItemStack;
3629
import net.minecraft.world.item.component.CustomData;
37-
import net.minecraft.world.scores.Objective;
38-
import net.minecraft.world.scores.Scoreboard;
3930
import org.spongepowered.asm.mixin.Final;
4031
import org.spongepowered.asm.mixin.Mixin;
4132
import org.spongepowered.asm.mixin.Shadow;
@@ -128,56 +119,6 @@ private static boolean isQuiverItem(ItemStack stack) {
128119
}
129120
}
130121

131-
@WrapWithCondition(method = "renderHotbarAndDecorations", at = {
132-
@At(value = "INVOKE", target = "Lnet/minecraft/client/gui/contextualbar/ContextualBarRenderer;renderBackground(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/DeltaTracker;)V"),
133-
@At(value = "INVOKE", target = "Lnet/minecraft/client/gui/contextualbar/ContextualBarRenderer;render(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/DeltaTracker;)V")
134-
}, require = 2)
135-
private boolean skyblocker$renderExperienceBar(ContextualBarRenderer bar, GuiGraphics context, DeltaTracker tickCounter) {
136-
return shouldShowExperienceBar();
137-
}
138-
139-
@WrapWithCondition(method = "renderHotbarAndDecorations", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/contextualbar/ContextualBarRenderer;renderExperienceLevel(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/client/gui/Font;I)V"))
140-
private boolean skyblocker$renderExperienceLevel(GuiGraphics context, Font textRenderer, int level) {
141-
return shouldShowExperienceBar();
142-
}
143-
144-
@Unique
145-
private static boolean shouldShowExperienceBar() {
146-
return !(Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && FancyStatusBars.isExperienceFancyBarEnabled());
147-
}
148-
149-
@Inject(method = "renderPlayerHealth", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/Gui;renderHearts(Lnet/minecraft/client/gui/GuiGraphics;Lnet/minecraft/world/entity/player/Player;IIIIFIIIZ)V", shift = At.Shift.AFTER), cancellable = true)
150-
private void skyblocker$renderStatusBars(GuiGraphics context, CallbackInfo ci) {
151-
if (Utils.isOnSkyblock() && FancyStatusBars.render(context, minecraft)) ci.cancel();
152-
}
153-
154-
@Inject(method = "renderHearts", at = @At(value = "HEAD"), cancellable = true)
155-
private void skyblocker$renderHealthBar(GuiGraphics context, Player player, int x, int y, int lines, int regeneratingHeartIndex, float maxHealth, int lastHealth, int health, int absorption, boolean blinking, CallbackInfo ci) {
156-
if (!Utils.isOnSkyblock()) return;
157-
if (FancyStatusBars.isEnabled() && FancyStatusBars.isHealthFancyBarEnabled()) ci.cancel();
158-
}
159-
160-
@ModifyExpressionValue(method = "renderPlayerHealth", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/GuiGraphics;guiHeight()I"))
161-
private int skyblocker$moveHealthDown(int original) {
162-
return Utils.isOnSkyblock() && FancyStatusBars.isEnabled() && !FancyStatusBars.isHealthFancyBarEnabled() && FancyStatusBars.isExperienceFancyBarEnabled() ? original + 6 : original;
163-
}
164-
165-
@Inject(method = "renderArmor", at = @At("HEAD"), cancellable = true)
166-
private static void skyblocker$renderStatusBars(GuiGraphics context, Player player, int i, int j, int k, int x, CallbackInfo ci) {
167-
if (Utils.isOnSkyblock() && FancyStatusBars.isEnabled()) ci.cancel();
168-
}
169-
170-
@Inject(method = "renderVehicleHealth", at = @At("HEAD"), cancellable = true)
171-
private void skyblocker$renderMountHealth(CallbackInfo ci) {
172-
if (Utils.isOnSkyblock() && FancyStatusBars.isEnabled())
173-
ci.cancel();
174-
}
175-
176-
@Inject(method = "renderEffects", at = @At("HEAD"), cancellable = true)
177-
private void skyblocker$dontRenderStatusEffects(CallbackInfo ci) {
178-
if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.hideStatusEffectOverlay) ci.cancel();
179-
}
180-
181122
@ModifyExpressionValue(method = "renderCrosshair", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/player/LocalPlayer;getAttackStrengthScale(F)F"))
182123
private float skyblocker$modifyAttackIndicatorCooldown(float cooldownProgress) {
183124
if (Utils.isOnSkyblock() && minecraft.player != null) {
@@ -196,9 +137,4 @@ private static boolean shouldShowExperienceBar() {
196137
ci.cancel();
197138
}
198139
}
199-
200-
@WrapWithCondition(method = "renderTabList", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/components/PlayerTabOverlay;render(Lnet/minecraft/client/gui/GuiGraphics;ILnet/minecraft/world/scores/Scoreboard;Lnet/minecraft/world/scores/Objective;)V"))
201-
private boolean skyblocker$shouldRenderHud(PlayerTabOverlay playerListHud, GuiGraphics context, int scaledWindowWidth, Scoreboard scoreboard, Objective objective) {
202-
return !Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.shouldRenderVanilla() || Minecraft.getInstance().screen instanceof WidgetsConfigurationScreen;
203-
}
204140
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package de.hysky.skyblocker.skyblock;
2+
3+
import de.hysky.skyblocker.annotations.Init;
4+
import de.hysky.skyblocker.config.SkyblockerConfigManager;
5+
import de.hysky.skyblocker.utils.Utils;
6+
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry;
7+
import net.fabricmc.fabric.api.client.rendering.v1.hud.VanillaHudElements;
8+
9+
public final class HideStatusEffectOverlay {
10+
@Init
11+
public static void init() {
12+
HudElementRegistry.replaceElement(VanillaHudElements.STATUS_EFFECTS, hudElement -> {
13+
if (Utils.isOnSkyblock() && SkyblockerConfigManager.get().uiAndVisuals.hideStatusEffectOverlay) return (context, tickCounter) -> {};
14+
return hudElement;
15+
});
16+
}
17+
}

src/main/java/de/hysky/skyblocker/skyblock/fancybars/FancyStatusBars.java

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,18 @@
1212
import net.fabricmc.fabric.api.client.command.v2.ClientCommandManager;
1313
import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback;
1414
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
15+
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElement;
16+
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry;
17+
import net.fabricmc.fabric.api.client.rendering.v1.hud.VanillaHudElements;
1518
import net.minecraft.client.Minecraft;
1619
import net.minecraft.client.gui.GuiGraphics;
1720
import net.minecraft.client.gui.navigation.ScreenPosition;
1821
import net.minecraft.client.player.LocalPlayer;
22+
import net.minecraft.resources.Identifier;
1923
import net.minecraft.util.Mth;
2024
import org.jetbrains.annotations.VisibleForTesting;
25+
import org.joml.Matrix3x2fStack;
26+
import org.jspecify.annotations.Nullable;
2127
import org.lwjgl.glfw.GLFW;
2228
import org.slf4j.Logger;
2329
import org.slf4j.LoggerFactory;
@@ -35,8 +41,10 @@
3541
import java.util.List;
3642
import java.util.Map;
3743
import java.util.concurrent.CompletableFuture;
44+
import java.util.function.Function;
3845

3946
public class FancyStatusBars {
47+
private static final Identifier HUD_LAYER = SkyblockerMod.id("fancy_status_bars");
4048
private static final Path FILE = SkyblockerMod.CONFIG_DIR.resolve("status_bars.json");
4149
private static final Logger LOGGER = LoggerFactory.getLogger(FancyStatusBars.class);
4250

@@ -59,6 +67,44 @@ public static boolean isBarEnabled(StatusBarType type) {
5967
@SuppressWarnings("deprecation")
6068
@Init
6169
public static void init() {
70+
Function<HudElement, HudElement> hideIfFancyStatusBarsEnabled = hudElement -> {
71+
if (Utils.isOnSkyblock() && isEnabled())
72+
return (context, tickCounter) -> {};
73+
return hudElement;
74+
};
75+
76+
HudElementRegistry.replaceElement(VanillaHudElements.HEALTH_BAR, hudElement -> {
77+
if (!Utils.isOnSkyblock() || !isEnabled()) return hudElement;
78+
if (isHealthFancyBarEnabled()) {
79+
return (context, tickCounter) -> {};
80+
} else if (isExperienceFancyBarEnabled()) {
81+
return (context, tickCounter) -> {
82+
Matrix3x2fStack pose = context.pose();
83+
pose.pushMatrix();
84+
pose.translate(0, 6);
85+
hudElement.render(context, tickCounter);
86+
pose.popMatrix();
87+
};
88+
}
89+
return hudElement;
90+
});
91+
HudElementRegistry.replaceElement(VanillaHudElements.EXPERIENCE_LEVEL, hudElement -> {
92+
if (!Utils.isOnSkyblock() || !isEnabled() || !isExperienceFancyBarEnabled()) return hudElement;
93+
return (context, tickCounter) -> {};
94+
});
95+
HudElementRegistry.replaceElement(VanillaHudElements.INFO_BAR, hudElement -> {
96+
if (!Utils.isOnSkyblock() || !isEnabled() || !isExperienceFancyBarEnabled()) return hudElement;
97+
return (context, tickCounter) -> {};
98+
});
99+
HudElementRegistry.replaceElement(VanillaHudElements.ARMOR_BAR, hideIfFancyStatusBarsEnabled);
100+
HudElementRegistry.replaceElement(VanillaHudElements.MOUNT_HEALTH, hideIfFancyStatusBarsEnabled);
101+
HudElementRegistry.replaceElement(VanillaHudElements.FOOD_BAR, hideIfFancyStatusBarsEnabled);
102+
HudElementRegistry.replaceElement(VanillaHudElements.AIR_BAR, hideIfFancyStatusBarsEnabled);
103+
104+
HudElementRegistry.attachElementAfter(VanillaHudElements.HOTBAR, HUD_LAYER, (context, tickCounter) -> {
105+
if (Utils.isOnSkyblock()) render(context, Minecraft.getInstance());
106+
});
107+
62108
statusBars.put(StatusBarType.HEALTH, StatusBarType.HEALTH.newStatusBar());
63109
statusBars.put(StatusBarType.INTELLIGENCE, StatusBarType.INTELLIGENCE.newStatusBar());
64110
statusBars.put(StatusBarType.DEFENSE, StatusBarType.DEFENSE.newStatusBar());
@@ -158,7 +204,7 @@ public static void placeBarsInPositioner() {
158204
}
159205
}
160206

161-
public static JsonObject loadBarConfig() {
207+
public static @Nullable JsonObject loadBarConfig() {
162208
try (BufferedReader reader = Files.newBufferedReader(FILE)) {
163209
return SkyblockerMod.GSON.fromJson(reader, JsonObject.class);
164210
} catch (NoSuchFileException e) {

src/main/java/de/hysky/skyblocker/skyblock/tabhud/TabHud.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,13 @@
44
import de.hysky.skyblocker.SkyblockerMod;
55
import de.hysky.skyblocker.annotations.Init;
66
import de.hysky.skyblocker.config.SkyblockerConfigManager;
7+
import de.hysky.skyblocker.skyblock.tabhud.config.WidgetsConfigurationScreen;
8+
import de.hysky.skyblocker.utils.Utils;
79
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper;
10+
import net.fabricmc.fabric.api.client.rendering.v1.hud.HudElementRegistry;
11+
import net.fabricmc.fabric.api.client.rendering.v1.hud.VanillaHudElements;
812
import net.minecraft.client.KeyMapping;
13+
import net.minecraft.client.Minecraft;
914
import org.lwjgl.glfw.GLFW;
1015

1116
public class TabHud {
@@ -24,6 +29,11 @@ public static void init() {
2429
InputConstants.Type.KEYSYM,
2530
GLFW.GLFW_KEY_M,
2631
SkyblockerMod.KEYBINDING_CATEGORY));
32+
33+
HudElementRegistry.replaceElement(VanillaHudElements.PLAYER_LIST, hudElement -> {
34+
if (!Utils.isOnSkyblock() || !SkyblockerConfigManager.get().uiAndVisuals.tabHud.tabHudEnabled || TabHud.shouldRenderVanilla() || Minecraft.getInstance().screen instanceof WidgetsConfigurationScreen) return hudElement;
35+
return (context, tickCounter) -> {};
36+
});
2737
}
2838

2939
public static boolean shouldRenderVanilla() {

0 commit comments

Comments
 (0)