From 80720c7fbf4b4345f8c8875dadf3c26c8810d84b Mon Sep 17 00:00:00 2001 From: zontreck Date: Fri, 15 Dec 2023 23:53:57 -0700 Subject: [PATCH] Get hearts working again --- .../zontreck/mcmods/gui/HeartsRenderer.java | 350 +++++++++++------- .../watchmydurability/textures/gui/absorb.png | Bin 0 -> 6946 bytes .../watchmydurability/textures/gui/hearts.png | Bin 14200 -> 5965 bytes 3 files changed, 221 insertions(+), 129 deletions(-) create mode 100644 src/main/resources/assets/watchmydurability/textures/gui/absorb.png diff --git a/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java index 8892504..2f76cae 100644 --- a/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java +++ b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java @@ -26,8 +26,6 @@ import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.ai.attributes.AttributeInstance; import net.minecraft.world.entity.ai.attributes.Attributes; import net.minecraft.world.entity.player.Player; -import net.minecraftforge.api.distmarker.Dist; -import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.client.event.RenderGuiOverlayEvent; import net.minecraftforge.client.gui.overlay.ForgeGui; import net.minecraftforge.client.gui.overlay.GuiOverlayManager; @@ -41,6 +39,8 @@ import java.util.Random; public class HeartsRenderer { private static final ResourceLocation ICON_HEARTS = new ResourceLocation(WatchMyDurability.MODID, "textures/gui/hearts.png"); + private static final ResourceLocation ICON_ABSORB = new ResourceLocation(WatchMyDurability.MODID, + "textures/gui/absorb.png"); private static final ResourceLocation ICON_VANILLA = Gui.GUI_ICONS_LOCATION; private final Minecraft mc = Minecraft.getInstance(); @@ -64,64 +64,12 @@ public class HeartsRenderer { * @param width Width to draw * @param height Height to draw */ - private void blit(GuiGraphics matrixStack, int x, int y, int textureX, int textureY, int width, int height) { - matrixStack.blit(ICON_HEARTS, x, y, textureX, textureY, width, height); + private void blit(GuiGraphics matrixStack, int x, int y, int textureX, int textureY, int width, int height, ResourceLocation resource) { + matrixStack.blit(resource, x, y, textureX, textureY, width, height); } - private void renderHearts(GuiGraphics pGuiGraphics, Player pPlayer, int pX, int pY, int pHeight, int pOffsetHeartIndex, float pMaxHealth, int pCurrentHealth, int pDisplayHealth, int pAbsorptionAmount, boolean pRenderHighlight) { - Random random = new Random(); - HeartType hearttype = HeartType.forPlayer(pPlayer); - int offsetX = 9 * (pPlayer.level().getLevelData().isHardcore() ? 5 : 0); - int maxHearts = Mth.ceil((double)pMaxHealth / 2.0); - int absorbHearts = Mth.ceil((double)pAbsorptionAmount / 2.0); - int maxHealth = maxHearts * 2; - - for(int i1 = maxHearts + absorbHearts - 1; i1 >= 0; --i1) { - int j1 = i1 / 10; - int k1 = i1 % 10; - int x = pX + k1 * 8; - int y = pY - j1; //* pHeight; - int row = y * pHeight; - - - if (pCurrentHealth + pAbsorptionAmount <= 4) { - y += random.nextInt(2); - } - - if (i1 < maxHearts && i1 == pOffsetHeartIndex) { - y -= 2; - } - - this.renderHeart(pGuiGraphics, HeartType.CONTAINER, x, y, offsetX, pRenderHighlight, false, 0); - int j2 = i1 * 2; - boolean flag = i1 >= maxHearts; - if (flag) { - int k2 = j2 - maxHealth; - if (k2 < pAbsorptionAmount) { - boolean halfHeart = k2 + 1 == pAbsorptionAmount; - this.renderHeart(pGuiGraphics, hearttype == HeartType.WITHERED ? hearttype : HeartType.ABSORBING, x, y, offsetX, false, halfHeart, row); - } - } - - boolean flag3; - if (pRenderHighlight && j2 < pDisplayHealth) { - flag3 = j2 + 1 == pDisplayHealth; - this.renderHeart(pGuiGraphics, hearttype, x, y, offsetX, true, flag3, row); - } - - if (j2 < pCurrentHealth) { - flag3 = j2 + 1 == pCurrentHealth; - this.renderHeart(pGuiGraphics, hearttype, x, y, offsetX, false, flag3, row); - } - } - - } - - - private void renderHeart(GuiGraphics pGuiGraphics, HeartType pHeartType, int pX, int pY, int pYOffset, boolean pRenderHighlight, boolean pHalfHeart, int row) { - pGuiGraphics.blit(ICON_HEARTS, pX, pY, pHeartType.getX(row, pHalfHeart, pRenderHighlight), pHeartType.getY(), 9, 9); - } /* HUD */ + /** * Event listener * @@ -152,91 +100,235 @@ public class HeartsRenderer { if (!(mc.gui instanceof ForgeGui gui) || mc.options.hideGui || !gui.shouldDrawSurvivalElements()) { return; } + Entity renderViewEnity = this.mc.getCameraEntity(); + if (!(renderViewEnity instanceof Player player)) { + return; + } + gui.setupOverlayRenderState(true, false); + + this.mc.getProfiler().push("health"); + // extra setup stuff from us - int X = this.mc.getWindow().getGuiScaledWidth() / 2 - 91; - int Y = this.mc.getWindow().getGuiScaledHeight() / 2 + 91; + int left_height = gui.leftHeight; + int width = this.mc.getWindow().getGuiScaledWidth(); + int height = this.mc.getWindow().getGuiScaledHeight(); int updateCounter = this.mc.gui.getGuiTicks(); - long healthBlinkTime = this.mc.gui.healthBlinkTime; - int height = Math.max(10 - (Y - 2), 3); - int offset = -1; - Player player = Minecraft.getInstance().player; - int lastHealth = Minecraft.getInstance().gui.lastHealth; - int displayHealth = Minecraft.getInstance().gui.displayHealth; - boolean flag = healthBlinkTime > (long)updateCounter && (healthBlinkTime - (long)updateCounter) / 3L % 2L == 1L; - float maxHealth = Math.max((float)player.getAttributeValue(Attributes.MAX_HEALTH), (float)Math.max(displayHealth, lastHealth)); - int absorb = Mth.ceil(player.getAbsorptionAmount()); + // start default forge/mc rendering + // changes are indicated by comment - if (player.hasEffect(MobEffects.REGENERATION)) { - offset = updateCounter % Mth.ceil(maxHealth + 5.0F); + int health = Mth.ceil(player.getHealth()); + boolean highlight = this.healthUpdateCounter > (long) updateCounter + && (this.healthUpdateCounter - (long) updateCounter) / 3L % 2L == 1L; + + if (health < this.playerHealth && player.invulnerableTime > 0) { + this.lastSystemTime = Util.getMillis(); + this.healthUpdateCounter = (updateCounter + 20); + } else if (health > this.playerHealth && player.invulnerableTime > 0) { + this.lastSystemTime = Util.getMillis(); + this.healthUpdateCounter = (updateCounter + 10); } - renderHearts(event.getGuiGraphics(), player, X, Y, height, offset, maxHealth, lastHealth, Minecraft.getInstance().gui.displayHealth, absorb, flag); + if (Util.getMillis() - this.lastSystemTime > 1000L) { + this.playerHealth = health; + this.lastPlayerHealth = health; + this.lastSystemTime = Util.getMillis(); + } + + this.playerHealth = health; + int healthLast = this.lastPlayerHealth; + + AttributeInstance attrMaxHealth = player.getAttribute(Attributes.MAX_HEALTH); + float healthMax = attrMaxHealth == null ? 0 : (float) attrMaxHealth.getValue(); + float absorb = Mth.ceil(player.getAbsorptionAmount()); + + // CHANGE: simulate 10 hearts max if there's more, so vanilla only renders one + // row max + healthMax = Math.min(healthMax, 20f); + health = Math.min(health, 20); + absorb = Math.min(absorb, 20); + + int healthRows = Mth.ceil((healthMax + absorb) / 2.0F / 10.0F); + int rowHeight = Math.max(10 - (healthRows - 2), 3); + + this.rand.setSeed(updateCounter * 312871L); + + int left = width / 2 - 91; + int top = height - left_height; + // change: these are unused below, unneeded? should these adjust the Forge + // variable? + // left_height += (healthRows * rowHeight); + // if (rowHeight != 10) left_height += 10 - rowHeight; + + this.regen = -1; + if (player.hasEffect(MobEffects.REGENERATION)) { + this.regen = updateCounter % 25; + } + + assert this.mc.level != null; + final int TOP = 9 * (this.mc.level.getLevelData().isHardcore() ? 5 : 0); + final int BACKGROUND = (highlight ? 25 : 16); + int MARGIN = 16; + if (player.hasEffect(MobEffects.POISON)) + MARGIN += 36; + else if (player.hasEffect(MobEffects.WITHER)) + MARGIN += 72; + float absorbRemaining = absorb; + + GuiGraphics matrixStack = event.getGuiGraphics(); + for (int i = Mth.ceil((healthMax + absorb) / 2.0F) - 1; i >= 0; --i) { + int row = Mth.ceil((float) (i + 1) / 10.0F) - 1; + int x = left + i % 10 * 8; + int y = top - row * rowHeight; + + if (health <= 4) + y += this.rand.nextInt(2); + if (i == this.regen) + y -= 2; + + this.blit(matrixStack, x, y, BACKGROUND, TOP, 9, 9, ICON_VANILLA); + + if (highlight) { + if (i * 2 + 1 < healthLast) { + this.blit(matrixStack, x, y, MARGIN + 54, TOP, 9, 9, ICON_VANILLA); // 6 + } else if (i * 2 + 1 == healthLast) { + this.blit(matrixStack, x, y, MARGIN + 63, TOP, 9, 9, ICON_VANILLA); // 7 + } + } + + if (absorbRemaining > 0.0F) { + if (absorbRemaining == absorb && absorb % 2.0F == 1.0F) { + this.blit(matrixStack, x, y, MARGIN + 153, TOP, 9, 9, ICON_VANILLA); // 17 + absorbRemaining -= 1.0F; + } else { + this.blit(matrixStack, x, y, MARGIN + 144, TOP, 9, 9, ICON_VANILLA); // 16 + absorbRemaining -= 2.0F; + } + } else { + if (i * 2 + 1 < health) { + this.blit(matrixStack, x, y, MARGIN + 36, TOP, 9, 9, ICON_VANILLA); // 4 + } else if (i * 2 + 1 == health) { + this.blit(matrixStack, x, y, MARGIN + 45, TOP, 9, 9, ICON_VANILLA); // 5 + } + } + } + + this.renderExtraHearts(matrixStack, left, top, player); + this.renderExtraAbsorption(matrixStack, left, top - rowHeight, player); + + RenderSystem.setShaderTexture(0, ICON_VANILLA); + gui.leftHeight += 10; + if (absorb > 0) { + gui.leftHeight += 10; + } + + event.setCanceled(true); + RenderSystem.disableBlend(); + this.mc.getProfiler().pop(); + MinecraftForge.EVENT_BUS + .post(new RenderGuiOverlayEvent.Post(mc.getWindow(), event.getGuiGraphics(), event.getPartialTick(), ActualOverlay)); } - @OnlyIn(Dist.CLIENT) - static enum HeartType { - CONTAINER(0, false), - NORMAL(1, true), - POISONED(2, true), - WITHERED(3, true), - ABSORBING(5, false), - FROZEN(4, false); - - private final int index; - private final boolean canBlink; - - private HeartType(int pIndex, boolean pCanBlink) { - this.index = pIndex; - this.canBlink = pCanBlink; + /** + * Gets the texture from potion effects + * + * @param player Player instance + * @return Texture offset for potion effects + */ + private int getPotionOffset(Player player) { + int potionOffset = 0; + MobEffectInstance potion = player.getEffect(MobEffects.WITHER); + if (potion != null) { + potionOffset = 18; } - - public int getX(int rowNum, boolean halfHeart, boolean renderHighlight) - { - int heart = rowNum + (halfHeart ? 1 : 0) * 9; - - return heart; + potion = player.getEffect(MobEffects.POISON); + if (potion != null) { + potionOffset = 9; } + assert this.mc.level != null; + if (this.mc.level.getLevelData().isHardcore()) { + potionOffset += 27; + } + return potionOffset; + } - public int getY() - { - switch(this) - { - case CONTAINER -> { - return 144; - } - case POISONED -> { - return 9; - } - case WITHERED -> { - return 18; - } - case FROZEN -> { - return 27; - } - case ABSORBING -> { - return 80; - } - default -> { - // Normal and other unknowns - return 0; - } + /** + * Renders the health above 10 hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param player Player instance + */ + private void renderExtraHearts(GuiGraphics matrixStack, int xBasePos, int yBasePos, Player player) { + int potionOffset = this.getPotionOffset(player); + + // Extra hearts + RenderSystem.setShaderTexture(0, ICON_HEARTS); + int hp = Mth.ceil(player.getHealth()); + this.renderCustomHearts(matrixStack, xBasePos, yBasePos, potionOffset, hp, false); + } + + /** + * Renders the absorption health above 10 hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param player Player instance + */ + private void renderExtraAbsorption(GuiGraphics matrixStack, int xBasePos, int yBasePos, Player player) { + int potionOffset = this.getPotionOffset(player); + + // Extra hearts + RenderSystem.setShaderTexture(0, ICON_ABSORB); + int absorb = Mth.ceil(player.getAbsorptionAmount()); + this.renderCustomHearts(matrixStack, xBasePos, yBasePos, potionOffset, absorb, true); + } + + /** + * Gets the texture offset from the regen effect + * + * @param i Heart index + * @param offset Current offset + */ + private int getYRegenOffset(int i, int offset) { + return i + offset == this.regen ? -2 : 0; + } + + /** + * Shared logic to render custom hearts + * + * @param matrixStack Matrix stack instance + * @param xBasePos Health bar top corner + * @param yBasePos Health bar top corner + * @param potionOffset Offset from the potion effect + * @param count Number to render + * @param absorb If true, render absorption hearts + */ + private void renderCustomHearts(GuiGraphics matrixStack, int xBasePos, int yBasePos, int potionOffset, int count, + boolean absorb) { + int regenOffset = absorb ? 10 : 0; + for (int iter = 0; iter < count / 20; iter++) { + int renderHearts = (count - 20 * (iter + 1)) / 2; + int heartIndex = iter % 11; + if (renderHearts > 10) { + renderHearts = 10; } - } - - static HeartsRenderer.HeartType forPlayer(Player pPlayer) { - HeartsRenderer.HeartType hearttype; - if (pPlayer.hasEffect(MobEffects.POISON)) { - hearttype = POISONED; - } else if (pPlayer.hasEffect(MobEffects.WITHER)) { - hearttype = WITHERED; - } else if (pPlayer.isFullyFrozen()) { - hearttype = FROZEN; - } else { - hearttype = NORMAL; + for (int i = 0; i < renderHearts; i++) { + int y = this.getYRegenOffset(i, regenOffset); + if (absorb) { + this.blit(matrixStack, xBasePos + 8 * i, yBasePos + y, 0, 54, 9, 9, ICON_ABSORB); + } + this.blit(matrixStack, xBasePos + 8 * i, yBasePos + y, 18 * heartIndex, potionOffset, 9, 9, ICON_HEARTS); + } + if (count % 2 == 1 && renderHearts < 10) { + int y = this.getYRegenOffset(renderHearts, regenOffset); + if (absorb) { + this.blit(matrixStack, xBasePos + 8 * renderHearts, yBasePos + y, 0, 54, 9, 9, ICON_ABSORB); + } + this.blit(matrixStack, xBasePos + 8 * renderHearts, yBasePos + y, 9 + 18 * heartIndex, potionOffset, 9, 9, ICON_HEARTS); } - - return hearttype; } } } diff --git a/src/main/resources/assets/watchmydurability/textures/gui/absorb.png b/src/main/resources/assets/watchmydurability/textures/gui/absorb.png new file mode 100644 index 0000000000000000000000000000000000000000..37d83b505fb64501fc6389244a9148186c9e5137 GIT binary patch literal 6946 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