From c5b0b61315fe325818eb5372fbf4fa8febf12a29 Mon Sep 17 00:00:00 2001 From: Nicholas Ignoffo Date: Sun, 18 Feb 2018 15:55:40 -0800 Subject: [PATCH] Add HUD elements for tranquility (#1233) --- .../bloodmagic/client/hud/Elements.java | 101 ++++++++++++++++++ .../client/hud/HUDElementCornerTile.java | 8 +- .../bloodmagic/proxy/ClientProxy.java | 42 +------- .../bloodmagic/textures/gui/widgets.png | Bin 24967 -> 25852 bytes 4 files changed, 108 insertions(+), 43 deletions(-) create mode 100644 src/main/java/WayofTime/bloodmagic/client/hud/Elements.java diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java new file mode 100644 index 00000000..6c507d1a --- /dev/null +++ b/src/main/java/WayofTime/bloodmagic/client/hud/Elements.java @@ -0,0 +1,101 @@ +package WayofTime.bloodmagic.client.hud; + +import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.Sprite; +import WayofTime.bloodmagic.tile.TileAltar; +import WayofTime.bloodmagic.tile.TileIncenseAltar; +import WayofTime.bloodmagic.tile.TileInversionPillar; +import WayofTime.bloodmagic.util.helper.NumeralHelper; +import net.minecraft.util.ResourceLocation; +import org.apache.commons.lang3.tuple.Pair; + +import java.util.List; +import java.util.function.Function; + +public class Elements { + + public static void createHUDElements() { + new HUDElementHolding(); + new HUDElementDemonWillAura(); + // Blood Altar with Divination Sigil + new HUDElementCornerTile.DivinedView(TileAltar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current tier + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), + altar -> NumeralHelper.toRoman(altar.getTier().toInt()) + )); + // Stored/Capacity + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), + altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) + )); + } + }; + // Blood Altar with Seers Sigil + new HUDElementCornerTile.DivinedView(TileAltar.class, false) { + @Override + protected void addInformation(List>> information) { + // Current tier + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), + altar -> NumeralHelper.toRoman(altar.getTier().toInt()) + )); + // Stored/Capacity + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), + altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) + )); + // Crafting progress/Crafting requirement + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), + altar -> { + if (!altar.isActive()) + return "Inactive"; // FIXME localize + int progress = altar.getProgress(); + int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); + return String.format("%d/%d", progress, totalLiquidRequired); + } + )); + // Consumption rate + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), + altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) + )); + // Total charge + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), + altar -> String.valueOf(altar.getTotalCharge()) + )); + } + }; + // Incense Altar + new HUDElementCornerTile.DivinedView(TileIncenseAltar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current tranquility + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 80, 46, 16, 16), + incense -> String.valueOf((int) ((100D * (int) (100 * incense.tranquility)) / 100D)) + )); + // Sacrifice bonus + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 96, 46, 16, 16), + incense -> String.valueOf((int) (100 * incense.incenseAddition)) + )); + } + }; + // Inversion Pillar + new HUDElementCornerTile.DivinedView(TileInversionPillar.class, true) { + @Override + protected void addInformation(List>> information) { + // Current inversion + information.add(Pair.of( + new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 112, 46, 16, 16), + pillar -> String.valueOf(((int) (10 * pillar.getCurrentInversion())) / 10D) + )); + } + }; + } +} diff --git a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java index b84f1c5b..3ac6264c 100644 --- a/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java +++ b/src/main/java/WayofTime/bloodmagic/client/hud/HUDElementCornerTile.java @@ -47,11 +47,13 @@ public abstract class HUDElementCornerTile extends HUDElem } } - public static abstract class BloodAltar extends HUDElementCornerTile { + public static abstract class DivinedView extends HUDElementCornerTile { + private final Class tileClass; private final boolean simple; - public BloodAltar(boolean simple) { + public DivinedView(Class tileClass, boolean simple) { + this.tileClass = tileClass; this.simple = simple; } @@ -85,7 +87,7 @@ public abstract class HUDElementCornerTile extends HUDElem return false; TileEntity tile = Minecraft.getMinecraft().world.getTileEntity(Minecraft.getMinecraft().objectMouseOver.getBlockPos()); - if (!(tile instanceof TileAltar)) + if (tile == null || !tileClass.isAssignableFrom(tile.getClass())) flag = false; return flag; diff --git a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java index 4ae09cac..3aa2be30 100644 --- a/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java +++ b/src/main/java/WayofTime/bloodmagic/proxy/ClientProxy.java @@ -1,6 +1,7 @@ package WayofTime.bloodmagic.proxy; import WayofTime.bloodmagic.BloodMagic; +import WayofTime.bloodmagic.client.hud.Elements; import WayofTime.bloodmagic.util.Constants; import WayofTime.bloodmagic.soul.DemonWillHolder; import WayofTime.bloodmagic.client.IMeshProvider; @@ -121,46 +122,7 @@ public class ClientProxy extends CommonProxy { @Override public void postInit() { - new HUDElementHolding(); - new HUDElementDemonWillAura(); - new HUDElementCornerTile.BloodAltar(true) { // Divination Sigil - @Override - protected void addInformation(List>> information) { - information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), altar -> NumeralHelper.toRoman(altar.getTier().toInt()))); - information.add(Pair.of(new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()))); - } - }; - new HUDElementCornerTile.BloodAltar(false) { // Seer Sigil - @Override - protected void addInformation(List>> information) { - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 0, 46, 16, 16), - altar -> NumeralHelper.toRoman(altar.getTier().toInt()) - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 16, 46, 16, 16), - altar -> String.format("%d/%d", altar.getCurrentBlood(), altar.getCapacity()) - )); - information.add(Pair.of( // Craft Progress - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 32, 46, 16, 16), - altar -> { - if (!altar.isActive()) - return "Inactive"; // FIXME localize - int progress = altar.getProgress(); - int totalLiquidRequired = altar.getLiquidRequired() * altar.getStackInSlot(0).getCount(); - return String.format("%d/%d", progress, totalLiquidRequired); - } - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 48, 46, 16, 16), - altar -> String.valueOf((int) (altar.getConsumptionRate() * (altar.getConsumptionMultiplier() + 1))) - )); - information.add(Pair.of( - new Sprite(new ResourceLocation(BloodMagic.MODID, "textures/gui/widgets.png"), 64, 46, 16, 16), - altar -> String.valueOf(altar.getTotalCharge()) - )); - } - }; + Elements.createHUDElements(); } @Override diff --git a/src/main/resources/assets/bloodmagic/textures/gui/widgets.png b/src/main/resources/assets/bloodmagic/textures/gui/widgets.png index 6d8d9cfe1c773bcda8dbd235b756b045a7817ebf..4c80a03ca37d5c71d5b08430638dc66a59dac018 100644 GIT binary patch delta 6923 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 UQ>Fbr;O2YykDf-gnsxa907Wle3IG5A delta 6101 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