Update to 1.21.4
This commit is contained in:
parent
4796b2b78f
commit
d0465eeed6
@ -1,5 +1,5 @@
|
|||||||
plugins {
|
plugins {
|
||||||
id 'fabric-loom' version '1.7-SNAPSHOT'
|
id 'fabric-loom' version '1.8-SNAPSHOT'
|
||||||
id 'maven-publish'
|
id 'maven-publish'
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -88,3 +88,7 @@ publishing {
|
|||||||
// retrieving dependencies.
|
// retrieving dependencies.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loom {
|
||||||
|
accessWidenerPath = file("src/main/resources/hudbars.accesswidener")
|
||||||
|
}
|
||||||
|
@ -2,13 +2,13 @@
|
|||||||
org.gradle.jvmargs=-Xmx1G
|
org.gradle.jvmargs=-Xmx1G
|
||||||
# Fabric Properties
|
# Fabric Properties
|
||||||
# check these on https://modmuss50.me/fabric.html
|
# check these on https://modmuss50.me/fabric.html
|
||||||
minecraft_version=1.21.1
|
minecraft_version=1.21.4
|
||||||
yarn_mappings=1.21.1+build.3
|
yarn_mappings=1.21.4+build.1
|
||||||
loader_version=0.16.2
|
loader_version=0.16.9
|
||||||
# Mod Properties
|
# Mod Properties
|
||||||
mod_version=1.0
|
mod_version=1.1.3
|
||||||
maven_group=systems.brn
|
maven_group=systems.brn
|
||||||
archives_base_name=hudbars
|
archives_base_name=hudbars
|
||||||
# Dependencies
|
# Dependencies
|
||||||
# check this on https://modmuss50.me/fabric.html
|
# check this on https://modmuss50.me/fabric.html
|
||||||
fabric_version=0.102.1+1.21.1
|
fabric_version=0.110.5+1.21.4
|
||||||
|
2
gradle/wrapper/gradle-wrapper.properties
vendored
2
gradle/wrapper/gradle-wrapper.properties
vendored
@ -1,6 +1,6 @@
|
|||||||
distributionBase=GRADLE_USER_HOME
|
distributionBase=GRADLE_USER_HOME
|
||||||
distributionPath=wrapper/dists
|
distributionPath=wrapper/dists
|
||||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.8-bin.zip
|
distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
|
||||||
networkTimeout=10000
|
networkTimeout=10000
|
||||||
validateDistributionUrl=true
|
validateDistributionUrl=true
|
||||||
zipStoreBase=GRADLE_USER_HOME
|
zipStoreBase=GRADLE_USER_HOME
|
||||||
|
@ -6,12 +6,16 @@ import net.minecraft.client.font.TextRenderer;
|
|||||||
import net.minecraft.client.gui.DrawContext;
|
import net.minecraft.client.gui.DrawContext;
|
||||||
import net.minecraft.client.gui.hud.InGameHud;
|
import net.minecraft.client.gui.hud.InGameHud;
|
||||||
import net.minecraft.client.render.RenderTickCounter;
|
import net.minecraft.client.render.RenderTickCounter;
|
||||||
|
import net.minecraft.entity.JumpingMount;
|
||||||
import net.minecraft.entity.LivingEntity;
|
import net.minecraft.entity.LivingEntity;
|
||||||
import net.minecraft.entity.attribute.EntityAttributes;
|
import net.minecraft.entity.attribute.EntityAttributes;
|
||||||
import net.minecraft.entity.effect.StatusEffects;
|
import net.minecraft.entity.effect.StatusEffects;
|
||||||
import net.minecraft.entity.player.HungerManager;
|
import net.minecraft.entity.player.HungerManager;
|
||||||
import net.minecraft.entity.player.PlayerEntity;
|
import net.minecraft.entity.player.PlayerEntity;
|
||||||
|
import net.minecraft.registry.tag.FluidTags;
|
||||||
|
import net.minecraft.util.Util;
|
||||||
import net.minecraft.util.math.MathHelper;
|
import net.minecraft.util.math.MathHelper;
|
||||||
|
import net.minecraft.world.GameMode;
|
||||||
import org.spongepowered.asm.mixin.Mixin;
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
import org.spongepowered.asm.mixin.Unique;
|
import org.spongepowered.asm.mixin.Unique;
|
||||||
import org.spongepowered.asm.mixin.injection.At;
|
import org.spongepowered.asm.mixin.injection.At;
|
||||||
@ -23,13 +27,111 @@ import static net.minecraft.entity.effect.StatusEffects.WITHER;
|
|||||||
|
|
||||||
@Mixin(InGameHud.class)
|
@Mixin(InGameHud.class)
|
||||||
public class InGameHudMixin {
|
public class InGameHudMixin {
|
||||||
@Inject(method = "renderHealthBar", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void renderHealthBar(DrawContext context, PlayerEntity player, int x, int y, int lines, int regeneratingHeartIndex, float maxHealthFloat, int lastHealth, int health, int absorption, boolean blinking, CallbackInfo ci) {
|
@Inject(method = "render", at = @At("HEAD"), cancellable = true)
|
||||||
|
private void renderMainHud(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) {
|
||||||
|
InGameHud hud = (InGameHud) (Object) this;
|
||||||
|
MinecraftClient client = hud.client;
|
||||||
|
PlayerEntity player = client.player;
|
||||||
|
|
||||||
|
if (client.interactionManager.getCurrentGameMode() == GameMode.SPECTATOR) {
|
||||||
|
hud.getSpectatorHud().renderSpectatorMenu(context);
|
||||||
|
} else {
|
||||||
|
hud.renderHotbar(context, tickCounter);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
// Calculate HUD bar positions
|
||||||
|
int centerX = context.getScaledWindowWidth() / 2 - 91;
|
||||||
|
|
||||||
|
// Render Jump Bar for Mount
|
||||||
|
JumpingMount jumpingMount = client.player.getJumpingMount();
|
||||||
|
if (jumpingMount != null) {
|
||||||
|
renderMountJumpBar(jumpingMount, context, centerX);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Render Status Bars (Health, Armor, Food, Air)
|
||||||
|
renderStatusBars(context);
|
||||||
|
|
||||||
|
// Render Mount Health (if applicable)
|
||||||
|
renderMountHealth(context);
|
||||||
|
|
||||||
|
// Render Experience Bar
|
||||||
|
renderExperienceBar(context, centerX);
|
||||||
|
|
||||||
|
// Render Held Item Tooltip
|
||||||
|
if (client.interactionManager.getCurrentGameMode() != GameMode.SPECTATOR) {
|
||||||
|
hud.renderHeldItemTooltip(context);
|
||||||
|
} else if (player.isSpectator()) {
|
||||||
|
hud.getSpectatorHud().render(context);
|
||||||
|
}
|
||||||
|
hud.renderCrosshair(context, tickCounter);
|
||||||
|
ci.cancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderStatusBars(DrawContext context) {
|
||||||
|
InGameHud hud = (InGameHud) (Object) this;
|
||||||
|
MinecraftClient client = hud.client;
|
||||||
|
PlayerEntity player = hud.getCameraPlayer();
|
||||||
|
if (player != null) {
|
||||||
|
int lastHealth = MathHelper.ceil(player.getHealth());
|
||||||
|
boolean bl = hud.heartJumpEndTick > (long) hud.getTicks() && (hud.heartJumpEndTick - (long) hud.getTicks()) / 3L % 2L == 1L;
|
||||||
|
int screenWidth = context.getScaledWindowWidth();
|
||||||
|
int screenHeight = context.getScaledWindowHeight();
|
||||||
|
int baseY = screenHeight - 39;
|
||||||
|
long l = Util.getMeasuringTimeMs();
|
||||||
|
if (lastHealth < hud.lastHealthValue && player.timeUntilRegen > 0) {
|
||||||
|
hud.lastHealthCheckTime = l;
|
||||||
|
hud.heartJumpEndTick = (long) (hud.getTicks() + 20);
|
||||||
|
} else if (lastHealth > hud.lastHealthValue && player.timeUntilRegen > 0) {
|
||||||
|
hud.lastHealthCheckTime = l;
|
||||||
|
hud.heartJumpEndTick = (long) (hud.getTicks() + 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (l - hud.lastHealthCheckTime > 1000L) {
|
||||||
|
hud.lastHealthValue = lastHealth;
|
||||||
|
hud.renderHealthValue = lastHealth;
|
||||||
|
hud.lastHealthCheckTime = l;
|
||||||
|
}
|
||||||
|
|
||||||
|
hud.lastHealthValue = lastHealth;
|
||||||
|
int health = hud.renderHealthValue;
|
||||||
|
int x = context.getScaledWindowWidth() / 2 - 91;
|
||||||
|
int m = context.getScaledWindowWidth() / 2 + 91;
|
||||||
|
int y = context.getScaledWindowHeight() - 39;
|
||||||
|
float maxHealthFloat = Math.max((float) player.getAttributeValue(EntityAttributes.MAX_HEALTH), (float) Math.max(health, lastHealth));
|
||||||
|
int absorption = MathHelper.ceil(player.getAbsorptionAmount());
|
||||||
|
int p = MathHelper.ceil((maxHealthFloat + (float) absorption) / 2.0F / 10.0F);
|
||||||
|
int q = Math.max(10 - (p - 2), 3);
|
||||||
|
|
||||||
|
renderArmor(context, player, y, p, q, x);
|
||||||
|
renderHealthBar(context, player, x, y, maxHealthFloat, lastHealth, health, absorption, bl);
|
||||||
|
renderFood(context, player, y, m);
|
||||||
|
renderAir(context, player, baseY, screenWidth / 2 + 91);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderMountHealth(DrawContext context) {
|
||||||
|
InGameHud hud = (InGameHud) (Object) this;
|
||||||
|
LivingEntity mount = hud.getRiddenEntity();
|
||||||
|
if (mount != null) {
|
||||||
|
int health = (int) Math.ceil(mount.getHealth());
|
||||||
|
int screenHeight = context.getScaledWindowHeight();
|
||||||
|
int screenWidth = context.getScaledWindowWidth();
|
||||||
|
int baseX = screenWidth / 2 + 12;
|
||||||
|
int baseY = screenHeight - 52;
|
||||||
|
renderHealthBar(context, mount, baseX, baseY, mount.getMaxHealth(), health, health, 0, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderHealthBar(DrawContext context, LivingEntity player, int x, int y, float maxHealthFloat, int lastHealth, int health, int absorption, boolean blinking) {
|
||||||
int barWidth = 80;
|
int barWidth = 80;
|
||||||
int barHeight = 10;
|
int barHeight = 10;
|
||||||
int maxHealth = (int) maxHealthFloat;
|
int maxHealth = (int) maxHealthFloat;
|
||||||
|
|
||||||
y -= 12;
|
y -= 8;
|
||||||
|
|
||||||
int color;
|
int color;
|
||||||
int borderColor;
|
int borderColor;
|
||||||
@ -60,35 +162,116 @@ public class InGameHudMixin {
|
|||||||
String healthText = "%d/%d".formatted(lastHealth + absorption, maxHealth);
|
String healthText = "%d/%d".formatted(lastHealth + absorption, maxHealth);
|
||||||
|
|
||||||
drawBar(context, x, y, barWidth, barHeight, healthPercentage, color, borderColor, healthText, 0, 0);
|
drawBar(context, x, y, barWidth, barHeight, healthPercentage, color, borderColor, healthText, 0, 0);
|
||||||
|
|
||||||
ci.cancel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Unique
|
@Unique
|
||||||
private static int generateSubBarColor(int color) {
|
private static int getArmorToughness(LivingEntity livingEntity) {
|
||||||
// Mask the alpha channel (first byte)
|
return MathHelper.floor(livingEntity.getAttributeValue(EntityAttributes.ARMOR_TOUGHNESS));
|
||||||
int alpha = color & 0xFF000000;
|
}
|
||||||
|
|
||||||
// Extract RGB channels
|
@Unique
|
||||||
int red = (color & 0x00FF0000) >> 16;
|
private static int computeArmorColor(float armorPercentage) {
|
||||||
int green = (color & 0x0000FF00) >> 8;
|
// Gradually interpolate between grey (low armor) and green (high armor)
|
||||||
int blue = color & 0x000000FF;
|
int red = (int) (0xAA * (1.0f - armorPercentage)); // Red decreases as armor increases
|
||||||
|
int green = (int) (0xFF * armorPercentage); // Green increases as armor increases
|
||||||
|
int blue = (int) (0x55 + (0xAA * armorPercentage)); // Blue shifts from grey to green
|
||||||
|
|
||||||
// Halve each RGB channel
|
// Combine the RGB values into a single color integer
|
||||||
red = Math.max(red / 2, 0);
|
return (0xFF << 24) | (red << 16) | (green << 8) | blue;
|
||||||
green = Math.max(green / 2, 0);
|
|
||||||
blue = Math.max(blue / 2, 0);
|
|
||||||
|
|
||||||
// Combine the halved RGB channels back into the color
|
|
||||||
int RGB = (red << 16) | (green << 8) | blue;
|
|
||||||
|
|
||||||
// Combine the alpha channel with the modified RGB channels
|
|
||||||
return alpha | RGB;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@Inject(method = "renderFood", at = @At("HEAD"), cancellable = true)
|
@Unique
|
||||||
private void renderFood(DrawContext context, PlayerEntity player, int top, int right, CallbackInfo ci) {
|
private static void renderArmor(DrawContext context, PlayerEntity player, int i, int j, int k, int x) {
|
||||||
|
int armorLevel = player.getArmor();
|
||||||
|
int armorToughness = getArmorToughness(player);
|
||||||
|
|
||||||
|
// Skip rendering if armor level is 0
|
||||||
|
if (armorLevel > 0) {
|
||||||
|
|
||||||
|
int barWidth = 80;
|
||||||
|
int barHeight = 10;
|
||||||
|
int posY = i - (j - 1) * k - 21;
|
||||||
|
|
||||||
|
// Compute the color based on the armor level percentage
|
||||||
|
float armorPercentage = (float) armorLevel / 20.0f;
|
||||||
|
float toughnessPercentage = (float) armorToughness / 20.0f;
|
||||||
|
|
||||||
|
int color = computeArmorColor(armorPercentage);
|
||||||
|
|
||||||
|
// Armor text to display
|
||||||
|
String armorText = "%d/%d".formatted(armorLevel, 20);
|
||||||
|
|
||||||
|
// Use the drawBar method to render the armor bar
|
||||||
|
drawBar(context, x, posY, barWidth, barHeight, armorPercentage, color, 0xFF000000, armorText, toughnessPercentage, generateSubBarColor(color));
|
||||||
|
|
||||||
|
RenderSystem.disableBlend();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private void renderMountJumpBar(JumpingMount mount, DrawContext context, int x) {
|
||||||
|
InGameHud hud = (InGameHud) (Object) this;
|
||||||
|
MinecraftClient client = hud.client;
|
||||||
|
|
||||||
|
int screenHeight = context.getScaledWindowHeight();
|
||||||
|
int y = screenHeight - 68;
|
||||||
|
float jumpStrength = client.player.getMountJumpStrength();
|
||||||
|
|
||||||
|
// Background color for the bar
|
||||||
|
int backgroundColor = 0xFF555555; // Grey background
|
||||||
|
|
||||||
|
// Main bar color
|
||||||
|
int barColor = 0xFF00FF00; // Green color for the jump bar (can be adjusted)
|
||||||
|
|
||||||
|
// Border color
|
||||||
|
int borderColor = 0xFFFFFFFF; // White border
|
||||||
|
|
||||||
|
// Text to display
|
||||||
|
String text = ""; // Assuming no text to be displayed on the jump bar
|
||||||
|
|
||||||
|
// Inner bar color, if applicable
|
||||||
|
int innerBarColor = 0xFFFF0000; // Red color for the inner bar (can be adjusted)
|
||||||
|
|
||||||
|
// Calculate fill percentage based on jump strength
|
||||||
|
float fillPercentage = jumpStrength;
|
||||||
|
|
||||||
|
// Check for cooldown
|
||||||
|
float innerPercentage = (mount.getJumpCooldown() > 0) ? 1.0f : 0.0f;
|
||||||
|
|
||||||
|
// Draw the bar using the drawBar function
|
||||||
|
drawBar(context, x, y, 182, 5, fillPercentage, barColor, borderColor, text, innerPercentage, innerBarColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderExperienceBar(DrawContext context, int x) {
|
||||||
|
InGameHud hud = (InGameHud) (Object) this;
|
||||||
|
MinecraftClient client = hud.client;
|
||||||
|
PlayerEntity player = client.player;
|
||||||
|
|
||||||
|
if (player == null) return;
|
||||||
|
|
||||||
|
int screenHeight = context.getScaledWindowHeight();
|
||||||
|
int experienceNeededForNextLevel = player.getNextLevelExperience();
|
||||||
|
if (experienceNeededForNextLevel > 0) {
|
||||||
|
int experienceGotForThisLevel = (int) (player.experienceProgress * experienceNeededForNextLevel);
|
||||||
|
int experienceLevel = player.experienceLevel;
|
||||||
|
int barWidth = 183;
|
||||||
|
int barHeight = 10;
|
||||||
|
int filledWidth = (int) (player.experienceProgress * barWidth);
|
||||||
|
int y = screenHeight - 34;
|
||||||
|
|
||||||
|
RenderSystem.enableBlend();
|
||||||
|
|
||||||
|
// Display experienceGotForThisLevel/experienceNeededForNextLevel
|
||||||
|
String experienceText = "%d/%d (%d)".formatted(experienceGotForThisLevel, experienceNeededForNextLevel, experienceLevel);
|
||||||
|
|
||||||
|
drawBar(context, x, y, barWidth, barHeight, (float) filledWidth / barWidth, 0xFFAAAA00, 0xFF000000, experienceText, 0, 0);
|
||||||
|
|
||||||
|
RenderSystem.disableBlend();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void renderFood(DrawContext context, PlayerEntity player, int top, int right) {
|
||||||
HungerManager hungerManager = player.getHungerManager();
|
HungerManager hungerManager = player.getHungerManager();
|
||||||
int foodLevel = hungerManager.getFoodLevel();
|
int foodLevel = hungerManager.getFoodLevel();
|
||||||
float saturationLevel = hungerManager.getSaturationLevel();
|
float saturationLevel = hungerManager.getSaturationLevel();
|
||||||
@ -97,7 +280,7 @@ public class InGameHudMixin {
|
|||||||
int barHeight = 10;
|
int barHeight = 10;
|
||||||
|
|
||||||
int x = right - barWidth + 1;
|
int x = right - barWidth + 1;
|
||||||
int y = top - 12;
|
int y = top - 8;
|
||||||
|
|
||||||
int color;
|
int color;
|
||||||
|
|
||||||
@ -121,99 +304,30 @@ public class InGameHudMixin {
|
|||||||
String foodText = "%d(%d)/%d".formatted(foodLevel, (int) saturationLevel, 20);
|
String foodText = "%d(%d)/%d".formatted(foodLevel, (int) saturationLevel, 20);
|
||||||
|
|
||||||
// Calculate the saturation percentage relative to the current food level
|
// Calculate the saturation percentage relative to the current food level
|
||||||
float saturationPercentage = saturationLevel > 0 ? (saturationLevel / (float) foodLevel) : 0;
|
float saturationPercentage = saturationLevel / 20.0f;
|
||||||
|
|
||||||
// Use the drawBar method with the innerPercentage and innerColor for saturation
|
// Use the drawBar method with the innerPercentage and innerColor for saturation
|
||||||
drawBar(context, x, y, barWidth, barHeight, foodPercentage, color, 0xFF000000, foodText, saturationPercentage, generateSubBarColor(color));
|
drawBar(context, x, y, barWidth, barHeight, foodPercentage, color, 0xFF000000, foodText, saturationPercentage, generateSubBarColor(color));
|
||||||
|
|
||||||
ci.cancel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Unique
|
private void renderAir(DrawContext context, PlayerEntity player, int top, int right) {
|
||||||
private static int getArmorToughness(LivingEntity livingEntity) {
|
int air = player.getAir();
|
||||||
return MathHelper.floor(livingEntity.getAttributeValue(EntityAttributes.GENERIC_ARMOR_TOUGHNESS));
|
int maxAir = player.getMaxAir();
|
||||||
}
|
int barWidth = 80;
|
||||||
|
int barHeight = 10;
|
||||||
|
int x = right - barWidth + 1;
|
||||||
|
int y = top - 22;
|
||||||
|
|
||||||
@Unique
|
if (air < maxAir || player.isSubmergedIn(FluidTags.WATER)) {
|
||||||
private static int computeArmorColor(float armorPercentage) {
|
float airPercentage = (float) air / (float) maxAir;
|
||||||
// Gradually interpolate between grey (low armor) and green (high armor)
|
if (airPercentage < 0) {
|
||||||
int red = (int) (0xAA * (1.0f - armorPercentage)); // Red decreases as armor increases
|
airPercentage = 0;
|
||||||
int green = (int) (0xFF * armorPercentage); // Green increases as armor increases
|
}
|
||||||
int blue = (int) (0x55 + (0xAA * armorPercentage)); // Blue shifts from grey to green
|
String airText = "%d/%d".formatted(air, maxAir);
|
||||||
|
drawBar(context, x, y, barWidth, barHeight, airPercentage, 0xFF00FFFF, 0xFF000000, airText, 0, 0);
|
||||||
// Combine the RGB values into a single color integer
|
|
||||||
return (0xFF << 24) | (red << 16) | (green << 8) | blue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "renderArmor", at = @At("HEAD"), cancellable = true)
|
|
||||||
private static void renderArmor(DrawContext context, PlayerEntity player, int i, int j, int k, int x, CallbackInfo ci) {
|
|
||||||
int armorLevel = player.getArmor();
|
|
||||||
int armorToughness = getArmorToughness(player);
|
|
||||||
|
|
||||||
// Skip rendering if armor level is 0
|
|
||||||
if (armorLevel > 0) {
|
|
||||||
|
|
||||||
int barWidth = 80;
|
|
||||||
int barHeight = 10;
|
|
||||||
int posY = i - (j - 1) * k - 26;
|
|
||||||
|
|
||||||
// Compute the color based on the armor level percentage
|
|
||||||
float armorPercentage = (float) armorLevel / 20.0f;
|
|
||||||
float toughnessPercentage = (float) armorToughness / 20.0f;
|
|
||||||
|
|
||||||
int color = computeArmorColor(armorPercentage);
|
|
||||||
|
|
||||||
// Armor text to display
|
|
||||||
String armorText = "%d/%d".formatted(armorLevel, 20);
|
|
||||||
|
|
||||||
// Use the drawBar method to render the armor bar
|
|
||||||
drawBar(context, x, posY, barWidth, barHeight, armorPercentage, color, 0xFF000000, armorText, toughnessPercentage, generateSubBarColor(color));
|
|
||||||
|
|
||||||
RenderSystem.disableBlend();
|
|
||||||
}
|
}
|
||||||
ci.cancel();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Inject(method = "renderExperienceBar", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void renderExperienceBar(DrawContext context, int x, CallbackInfo ci) {
|
|
||||||
MinecraftClient client = MinecraftClient.getInstance();
|
|
||||||
PlayerEntity player = client.player;
|
|
||||||
if (player == null) {
|
|
||||||
ci.cancel();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
client.getProfiler().push("expBar");
|
|
||||||
|
|
||||||
int experienceNeededForNextLevel = player.getNextLevelExperience();
|
|
||||||
if (experienceNeededForNextLevel > 0) {
|
|
||||||
int experienceGotForThisLevel = (int) (player.experienceProgress * experienceNeededForNextLevel);
|
|
||||||
int experienceLevel = player.experienceLevel;
|
|
||||||
int barWidth = 183;
|
|
||||||
int barHeight = 10;
|
|
||||||
int filledWidth = (int) (player.experienceProgress * barWidth);
|
|
||||||
int y = context.getScaledWindowHeight() - 36;
|
|
||||||
|
|
||||||
RenderSystem.enableBlend();
|
|
||||||
|
|
||||||
// Display experienceGotForThisLevel/experienceNeededForNextLevel
|
|
||||||
String experienceText = "%d/%d (%d)".formatted(experienceGotForThisLevel, experienceNeededForNextLevel, experienceLevel);
|
|
||||||
|
|
||||||
drawBar(context, x, y, barWidth, barHeight, (float) filledWidth / barWidth, 0xFFAAAA00, 0xFF000000, experienceText, 0, 0);
|
|
||||||
|
|
||||||
RenderSystem.disableBlend();
|
|
||||||
}
|
|
||||||
|
|
||||||
client.getProfiler().pop();
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Inject(method = "renderExperienceLevel", at = @At("HEAD"), cancellable = true)
|
|
||||||
private void renderExperienceLevel(DrawContext context, RenderTickCounter tickCounter, CallbackInfo ci) {
|
|
||||||
ci.cancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Common helper method for rendering bars
|
|
||||||
@Unique
|
@Unique
|
||||||
private static void drawBar(DrawContext context, int x, int y, int barWidth, int barHeight, float percentage, int color, int borderColor, String text, float innerPercentage, int innerColor) {
|
private static void drawBar(DrawContext context, int x, int y, int barWidth, int barHeight, float percentage, int color, int borderColor, String text, float innerPercentage, int innerColor) {
|
||||||
|
|
||||||
@ -239,4 +353,26 @@ public class InGameHudMixin {
|
|||||||
TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
|
TextRenderer textRenderer = MinecraftClient.getInstance().textRenderer;
|
||||||
context.drawText(textRenderer, text, x + 2, y + 1, 0xFFFFFFFF, false);
|
context.drawText(textRenderer, text, x + 2, y + 1, 0xFFFFFFFF, false);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
@Unique
|
||||||
|
private static int generateSubBarColor(int color) {
|
||||||
|
// Mask the alpha channel (first byte)
|
||||||
|
int alpha = color & 0xFF000000;
|
||||||
|
|
||||||
|
// Extract RGB channels
|
||||||
|
int red = (color & 0x00FF0000) >> 16;
|
||||||
|
int green = (color & 0x0000FF00) >> 8;
|
||||||
|
int blue = color & 0x000000FF;
|
||||||
|
|
||||||
|
// Halve each RGB channel
|
||||||
|
red = Math.max(red / 2, 0);
|
||||||
|
green = Math.max(green / 2, 0);
|
||||||
|
blue = Math.max(blue / 2, 0);
|
||||||
|
|
||||||
|
// Combine the halved RGB channels back into the color
|
||||||
|
int RGB = (red << 16) | (green << 8) | blue;
|
||||||
|
|
||||||
|
// Combine the alpha channel with the modified RGB channels
|
||||||
|
return alpha | RGB;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
13
src/main/resources/hudbars.accesswidener
Normal file
13
src/main/resources/hudbars.accesswidener
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
accessWidener v2 named
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud getCameraPlayer ()Lnet/minecraft/entity/player/PlayerEntity;
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud client Lnet/minecraft/client/MinecraftClient;
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud heartJumpEndTick J
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud lastHealthValue I
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud lastHealthCheckTime J
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud renderHealthValue I
|
||||||
|
accessible field net/minecraft/client/gui/hud/InGameHud random Lnet/minecraft/util/math/random/Random;
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud renderHotbar (Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud renderHeldItemTooltip (Lnet/minecraft/client/gui/DrawContext;)V
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud getRiddenEntity ()Lnet/minecraft/entity/LivingEntity;
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud getHeartCount (Lnet/minecraft/entity/LivingEntity;)I
|
||||||
|
accessible method net/minecraft/client/gui/hud/InGameHud renderCrosshair (Lnet/minecraft/client/gui/DrawContext;Lnet/minecraft/client/render/RenderTickCounter;)V
|
Loading…
Reference in New Issue
Block a user