From bbf4e41abc0debc41121a3906710ac3c913a85df Mon Sep 17 00:00:00 2001 From: zontreck Date: Fri, 15 Dec 2023 19:41:18 -0700 Subject: [PATCH] Start re-adding the extra hearts function --- build.gradle | 2 +- .../zontreck/mcmods/WatchMyDurability.java | 3 +- .../mcmods/configs/WMDClientConfig.java | 4 +- .../zontreck/mcmods/gui/HeartsRenderer.java | 242 ++++++++++++++++++ .../resources/META-INF/accesstransformer.cfg | 5 + .../watchmydurability/textures/gui/absorb.png | Bin 5383 -> 0 bytes .../watchmydurability/textures/gui/hearts.png | Bin 5160 -> 14200 bytes 7 files changed, 252 insertions(+), 4 deletions(-) create mode 100644 src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java create mode 100644 src/main/resources/META-INF/accesstransformer.cfg delete mode 100644 src/main/resources/assets/watchmydurability/textures/gui/absorb.png diff --git a/build.gradle b/build.gradle index ed4b4de..c43a468 100644 --- a/build.gradle +++ b/build.gradle @@ -54,7 +54,7 @@ minecraft { // However, it must be at "META-INF/accesstransformer.cfg" in the final mod jar to be loaded by Forge. // This default location is a best practice to automatically put the file in the right place in the final jar. // See https://docs.minecraftforge.net/en/latest/advanced/accesstransformers/ for more information. - // accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') + accessTransformer = file('src/main/resources/META-INF/accesstransformer.cfg') // Default run configurations. // These can be tweaked, removed, or duplicated as needed. diff --git a/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java b/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java index 3fdfef6..8198f35 100644 --- a/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java +++ b/src/main/java/dev/zontreck/mcmods/WatchMyDurability.java @@ -5,6 +5,7 @@ import com.mojang.logging.LogUtils; import dev.zontreck.ariaslib.util.DelayedExecutorService; import dev.zontreck.libzontreck.chat.ChatColor; import dev.zontreck.mcmods.configs.WMDClientConfig; +import dev.zontreck.mcmods.gui.HeartsRenderer; import net.minecraft.client.Minecraft; import net.minecraft.client.User; import net.minecraft.sounds.SoundEvent; @@ -55,7 +56,7 @@ public class WatchMyDurability modEventBus.addListener(this::commonSetup); ModLoadingContext.get().registerConfig(Type.CLIENT, WMDClientConfig.SPEC, "watchmydurability-client.toml"); - //MinecraftForge.EVENT_BUS.register(new HeartsRenderer()); + MinecraftForge.EVENT_BUS.register(new HeartsRenderer()); // Register ourselves for server and other game events we are interested in MinecraftForge.EVENT_BUS.register(this); } diff --git a/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java b/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java index f12611a..d26912e 100644 --- a/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java +++ b/src/main/java/dev/zontreck/mcmods/configs/WMDClientConfig.java @@ -12,7 +12,7 @@ public class WMDClientConfig { public static ForgeConfigSpec.ConfigValue> alertPercents; public static ForgeConfigSpec.ConfigValue> alertMessages; public static ForgeConfigSpec.ConfigValue TimerVal; - //public static ForgeConfigSpec.ConfigValue EnableExtraHearts; + public static ForgeConfigSpec.ConfigValue EnableExtraHearts; public static ForgeConfigSpec.ConfigValue EnableHealthAlert; public static ForgeConfigSpec.ConfigValue EnableHungerAlert; @@ -34,7 +34,7 @@ public class WMDClientConfig { BUILDER.pop(); BUILDER.push("General"); - //EnableExtraHearts = BUILDER.comment("Whether to enable the extra hearts rendering").define("compress_hearts", false); + EnableExtraHearts = BUILDER.comment("Whether to enable the extra hearts rendering").define("compress_hearts", true); EnableHealthAlert = BUILDER.comment("The following was added for a friend. If you need reminders to eat in order to heal, turn the below option on").define("watchMyHealth", false); EnableHungerAlert = BUILDER.comment("This is a newer setting to watch your hunger status instead of your hunger to alert when you need to eat").define("watchMyHunger", true); diff --git a/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java new file mode 100644 index 0000000..8892504 --- /dev/null +++ b/src/main/java/dev/zontreck/mcmods/gui/HeartsRenderer.java @@ -0,0 +1,242 @@ +/* + * + * DISCLAIMER: This code was taken from Mantle, and will be modified to fit the needs of this mod, such as adding more heat options. This code is subject to Mantle's license of MIT. + * Despite this code being taken from, and modified/updated to be modern, all textures are my own creation + * This disclaimer is here to give credit where credit is due. The author(s) of mantle have done a absolutely fantastic job. And if Mantle gets updated this shall be removed along with future plans of extra hearts and color options. + * + * + */ + +package dev.zontreck.mcmods.gui; + +import com.mojang.blaze3d.systems.RenderSystem; +import com.mojang.blaze3d.vertex.PoseStack; + +import dev.zontreck.mcmods.WatchMyDurability; +import dev.zontreck.mcmods.configs.WMDClientConfig; +import net.minecraft.Util; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.Gui; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.util.Mth; +import net.minecraft.world.effect.MobEffectInstance; +import net.minecraft.world.effect.MobEffects; +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; +import net.minecraftforge.client.gui.overlay.NamedGuiOverlay; +import net.minecraftforge.common.MinecraftForge; +import net.minecraftforge.eventbus.api.EventPriority; +import net.minecraftforge.eventbus.api.SubscribeEvent; + +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_VANILLA = Gui.GUI_ICONS_LOCATION; + + private final Minecraft mc = Minecraft.getInstance(); + + private int playerHealth = 0; + private int lastPlayerHealth = 0; + private long healthUpdateCounter = 0; + private long lastSystemTime = 0; + private final Random rand = new Random(); + + private int regen; + + /** + * Draws a texture to the screen + * + * @param matrixStack Matrix stack instance + * @param x X position + * @param y Y position + * @param textureX Texture X + * @param textureY Texture Y + * @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 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 + * + * @param event Event instance + */ + @SubscribeEvent(priority = EventPriority.LOW) + public void renderHealthbar(RenderGuiOverlayEvent.Pre event) { + NamedGuiOverlay ActualOverlay = GuiOverlayManager.findOverlay(new ResourceLocation("minecraft:player_health")); + + if (ActualOverlay == null) { + if (GuiOverlayManager.getOverlays() == null) { + WatchMyDurability.LOGGER.info("Overlays non existent?!"); + } + for (NamedGuiOverlay overlay : GuiOverlayManager.getOverlays()) { + // Next print + // LibZontreck.LOGGER.info("GUI OVERLAY: "+overlay.id().getPath()); + + if (overlay.id().getPath().equals("player_health")) { + ActualOverlay = overlay; + break; + } + } + } + if (event.isCanceled() || !WMDClientConfig.EnableExtraHearts.get() || event.getOverlay() != ActualOverlay) { + return; + } + // ensure its visible + if (!(mc.gui instanceof ForgeGui gui) || mc.options.hideGui || !gui.shouldDrawSurvivalElements()) { + return; + } + // extra setup stuff from us + int X = this.mc.getWindow().getGuiScaledWidth() / 2 - 91; + int Y = this.mc.getWindow().getGuiScaledHeight() / 2 + 91; + 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()); + + if (player.hasEffect(MobEffects.REGENERATION)) { + offset = updateCounter % Mth.ceil(maxHealth + 5.0F); + } + + renderHearts(event.getGuiGraphics(), player, X, Y, height, offset, maxHealth, lastHealth, Minecraft.getInstance().gui.displayHealth, absorb, flag); + } + + @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; + } + + public int getX(int rowNum, boolean halfHeart, boolean renderHighlight) + { + int heart = rowNum + (halfHeart ? 1 : 0) * 9; + + return heart; + } + + 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; + } + } + } + + 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; + } + + return hearttype; + } + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg new file mode 100644 index 0000000..b4796c8 --- /dev/null +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -0,0 +1,5 @@ +public net.minecraft.client.gui.Gui +public net.minecraft.client.gui.Gui f_279580_ # GUI_ICONS_LOCATION +public net.minecraft.client.gui.Gui f_92974_ # displayHealth +public net.minecraft.client.gui.Gui f_92973_ # lastHealth +public net.minecraft.client.gui.Gui f_92976_ # healthBlinkTime \ No newline at end of file diff --git a/src/main/resources/assets/watchmydurability/textures/gui/absorb.png b/src/main/resources/assets/watchmydurability/textures/gui/absorb.png deleted file mode 100644 index 3e338e79e22b01a9efc25f40cfe2c1a276f7b18a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5383 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 xSGMU+&{M@f=%MnOPHq6mUO6O@ePBvC*>GLkb$ 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