From 7994c0ad5d708917d7e38a323c86c46554f60595 Mon Sep 17 00:00:00 2001 From: VT-14 Date: Tue, 3 Oct 2023 14:18:30 -0400 Subject: [PATCH] Initial Work on a Soul Network HUD Tweaked the bars.png texture to make the red LP bar opaque. Added `NetworkHelper.canPlayerSeeSoulNetwork()`. Created ISoulNetworkViewer Interface. Made ItemSigilDivination implement it. Added ElementSoulNetwork to render the Soul Network HUD. Registered in Elements. --- .../api/compat/ISoulNetworkViewer.java | 15 +++++ .../bloodmagic/client/hud/Elements.java | 5 ++ .../hud/element/ElementSoulNetwork.java | 54 ++++++++++++++++++ .../item/sigil/ItemSigilDivination.java | 9 ++- .../bloodmagic/util/helper/NetworkHelper.java | 18 ++++++ .../assets/bloodmagic/textures/hud/bars.png | Bin 6558 -> 4188 bytes 6 files changed, 100 insertions(+), 1 deletion(-) create mode 100644 src/main/java/wayoftime/bloodmagic/api/compat/ISoulNetworkViewer.java create mode 100644 src/main/java/wayoftime/bloodmagic/client/hud/element/ElementSoulNetwork.java diff --git a/src/main/java/wayoftime/bloodmagic/api/compat/ISoulNetworkViewer.java b/src/main/java/wayoftime/bloodmagic/api/compat/ISoulNetworkViewer.java new file mode 100644 index 000000000..db345bad3 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/api/compat/ISoulNetworkViewer.java @@ -0,0 +1,15 @@ +package wayoftime.bloodmagic.api.compat; + +import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.ItemStack; +import net.minecraft.world.level.Level; + +/** + * Interface for Items that allow players to see their Soul Network HUD. + */ +public interface ISoulNetworkViewer +{ + boolean canSeeDemonSoulNetwork(Level level, ItemStack stack, Player player); + + int getSoulNetworkResolution(Level level, ItemStack stack, Player player); +} diff --git a/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java b/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java index e431be2a7..3330c80a5 100644 --- a/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java +++ b/src/main/java/wayoftime/bloodmagic/client/hud/Elements.java @@ -3,6 +3,7 @@ import java.util.function.Consumer; import java.util.function.Function; +import com.mojang.blaze3d.platform.GlStateManager; import org.apache.commons.lang3.tuple.Pair; import net.minecraft.client.resources.language.I18n; @@ -13,6 +14,7 @@ import wayoftime.bloodmagic.client.hud.element.ElementDemonAura; import wayoftime.bloodmagic.client.hud.element.ElementDivinedInformation; import wayoftime.bloodmagic.client.hud.element.ElementHolding; +import wayoftime.bloodmagic.client.hud.element.ElementSoulNetwork; import wayoftime.bloodmagic.common.tile.TileAltar; import wayoftime.bloodmagic.common.tile.TileIncenseAltar; import wayoftime.bloodmagic.util.helper.NumeralHelper; @@ -21,7 +23,10 @@ public class Elements { public static void registerElements() { + float screenHeight = (float) GlStateManager.Viewport.height(); + ElementRegistry.registerHandler(new ResourceLocation(BloodMagic.MODID, "demon_will_aura"), new ElementDemonAura(), new Vec2(0.01f, 0.01f)); + ElementRegistry.registerHandler(new ResourceLocation(BloodMagic.MODID, "soul_network"), new ElementSoulNetwork(), new Vec2(0.0f, 0.4f)); ElementRegistry.registerHandler(BloodMagic.rl("blood_altar"), new ElementDivinedInformation(2, true, TileAltar.class) { diff --git a/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementSoulNetwork.java b/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementSoulNetwork.java new file mode 100644 index 000000000..24511d422 --- /dev/null +++ b/src/main/java/wayoftime/bloodmagic/client/hud/element/ElementSoulNetwork.java @@ -0,0 +1,54 @@ +package wayoftime.bloodmagic.client.hud.element; + +import com.mojang.blaze3d.vertex.PoseStack; +import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiGraphics; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.player.Player; +import wayoftime.bloodmagic.BloodMagic; +import wayoftime.bloodmagic.core.data.SoulNetwork; +import wayoftime.bloodmagic.util.Utils; +import wayoftime.bloodmagic.util.helper.NetworkHelper; + +public class ElementSoulNetwork extends HUDElement +{ + + private static final ResourceLocation BAR_LOCATION = new ResourceLocation(BloodMagic.MODID, "textures/hud/bars.png"); + public ElementSoulNetwork() {super(36, 76);} + + @Override + public void draw(GuiGraphics guiGraphics, float partialTicks, int drawX, int drawY) + { + drawX += 4; // Offset X to account for wider HUD Box. + + Minecraft minecraft = Minecraft.getInstance(); + Player player = minecraft.player; + + guiGraphics.blit(BAR_LOCATION, drawX, drawY, 0, 78, 28, 70); + + SoulNetwork soulNetwork = NetworkHelper.getSoulNetwork(player); + int maxOrb = NetworkHelper.getCurrentMaxOrb(soulNetwork); + int level = soulNetwork.getCurrentEssence(); + int maxCapacity = NetworkHelper.getMaximumForTier(maxOrb); + int fillHeight = 61 * level / maxCapacity; // 60 would have the bar full at exactly 100%. Set to 61 so the bar + // is full slightly before the Soul Network is completely topped, so rituals don't flash the HUD. + + guiGraphics.blit(BAR_LOCATION, drawX + 8, drawY + 66 - fillHeight, 32, 86 + (58 - fillHeight), 12, fillHeight); + + if (player.isShiftKeyDown()) + { + PoseStack poseStack = guiGraphics.pose(); + poseStack.pushPose(); + poseStack.translate(drawX + 14, drawY + 70, 0); + poseStack.scale(0.5f, 0.5f, 1f); + guiGraphics.drawCenteredString(minecraft.font, String.format("%,d LP", level), 0, 2, 0xffffffff); + poseStack.popPose(); + } + } + + @Override + public boolean shouldRender(Minecraft minecraft) + { + return NetworkHelper.canPlayerSeeSoulNetwork(Minecraft.getInstance().player); + } +} diff --git a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java index 3c9fe3ce3..5b41acd6f 100644 --- a/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java +++ b/src/main/java/wayoftime/bloodmagic/common/item/sigil/ItemSigilDivination.java @@ -18,6 +18,7 @@ import net.minecraftforge.api.distmarker.OnlyIn; import wayoftime.bloodmagic.altar.IBloodAltar; import wayoftime.bloodmagic.api.compat.IAltarReader; +import wayoftime.bloodmagic.api.compat.ISoulNetworkViewer; import wayoftime.bloodmagic.client.hud.GuiEditHUD; import wayoftime.bloodmagic.common.tile.TileIncenseAltar; import wayoftime.bloodmagic.core.data.Binding; @@ -28,7 +29,7 @@ import java.util.List; -public class ItemSigilDivination extends ItemSigilBase implements IAltarReader +public class ItemSigilDivination extends ItemSigilBase implements IAltarReader, ISoulNetworkViewer { private final boolean isSimple; @@ -136,4 +137,10 @@ public void openEditHUDScreen() { Minecraft.getInstance().setScreen(new GuiEditHUD(null)); } + + @Override + public boolean canSeeDemonSoulNetwork(Level world, ItemStack stack, Player player) {return !isSimple;} + + @Override + public int getSoulNetworkResolution(Level world, ItemStack stack, Player player) {return 100;} } \ No newline at end of file diff --git a/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java b/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java index dbd1043a5..efb5bdc02 100644 --- a/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java +++ b/src/main/java/wayoftime/bloodmagic/util/helper/NetworkHelper.java @@ -5,11 +5,16 @@ import javax.annotation.Nullable; import net.minecraft.core.BlockPos; +import net.minecraft.core.NonNullList; import net.minecraft.world.entity.player.Player; +import net.minecraft.world.item.Item; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.storage.DimensionDataStorage; import net.minecraftforge.common.MinecraftForge; import net.minecraftforge.server.ServerLifecycleHooks; +import org.jetbrains.annotations.NotNull; +import wayoftime.bloodmagic.api.compat.ISoulNetworkViewer; +import wayoftime.bloodmagic.common.item.BloodMagicItems; import wayoftime.bloodmagic.common.item.BloodOrb; import wayoftime.bloodmagic.common.item.IBindable; import wayoftime.bloodmagic.common.item.IBloodOrb; @@ -252,4 +257,17 @@ public static void incrementDungeonCounter() dataHandler.setNumberOfDungeons(currentNumberOfDungeons + 1); dataHandler.setDirty(); } + + public static boolean canPlayerSeeSoulNetwork(Player player) + { + NonNullList inventory = InventoryHelper.getActiveInventories(player); + for (ItemStack stack : inventory){ + if ((stack.getItem() instanceof ISoulNetworkViewer) && ((ISoulNetworkViewer) stack.getItem()).canSeeDemonSoulNetwork(player.getCommandSenderWorld(), stack, player)) + { + return true; + } + } + + return false; + } } \ No newline at end of file diff --git a/src/main/resources/assets/bloodmagic/textures/hud/bars.png b/src/main/resources/assets/bloodmagic/textures/hud/bars.png index e4e0e7840c873f8a2b351a5e55ea258a922a9f19..b0c2a266c6c65df15bd29ebbd291037f66c50246 100644 GIT binary patch literal 4188 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 K$#U^8{{I6G>cqML