diff --git a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java index 2a40a51e..86dc8cc4 100644 --- a/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java +++ b/Common/src/main/java/at/petrak/hexcasting/api/block/circle/BlockEntityAbstractImpetus.java @@ -43,6 +43,7 @@ import net.minecraft.world.phys.Vec3; import org.jetbrains.annotations.Contract; import org.jetbrains.annotations.Nullable; +import java.text.DecimalFormat; import java.util.*; public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implements WorldlyContainer { @@ -55,6 +56,8 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen TAG_MANA = "mana", TAG_LAST_MISHAP = "last_mishap"; + private static final DecimalFormat DUST_AMOUNT = new DecimalFormat("###,###.##"); + @Nullable private UUID activator = null; @Nullable @@ -120,9 +123,8 @@ public abstract class BlockEntityAbstractImpetus extends HexBlockEntity implemen if (beai.getMana() < 0) { lines.add(new Pair<>(new ItemStack(HexItems.AMETHYST_DUST), ItemCreativeUnlocker.infiniteMedia(world))); } else { - var dustCount = (float) beai.getMana() / (float) ManaConstants.DUST_UNIT; - var dustCmp = new TranslatableComponent("hexcasting.tooltip.lens.impetus.mana", - String.format("%.2f", dustCount)); + var dustCmp = new TranslatableComponent("hexcasting.tooltip.mana", + DUST_AMOUNT.format(beai.getMana() / (float) ManaConstants.DUST_UNIT)); lines.add(new Pair<>(new ItemStack(HexItems.AMETHYST_DUST), dustCmp)); } diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java index 088e14f4..8c088177 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemCreativeUnlocker.java @@ -219,8 +219,6 @@ public class ItemCreativeUnlocker extends Item implements ManaHolderItem { return copy; } - private static final TextColor HEX_COLOR = TextColor.fromRgb(0xb38ef3); - private static MutableComponent rainbow(MutableComponent component, int shift, Level level) { if (level == null) { return component.withStyle(ChatFormatting.WHITE); @@ -233,16 +231,14 @@ public class ItemCreativeUnlocker extends Item implements ManaHolderItem { @Override public void appendHoverText(ItemStack stack, @Nullable Level level, List tooltipComponents, TooltipFlag isAdvanced) { - String prefix = "item.hexcasting.creative_unlocker."; - Component emphasized = infiniteMedia(level); - MutableComponent modName = new TranslatableComponent(prefix + "mod_name").withStyle( - (s) -> s.withColor(HEX_COLOR)); + MutableComponent modName = new TranslatableComponent("item.hexcasting.creative_unlocker.mod_name").withStyle( + (s) -> s.withColor(ItemManaHolder.HEX_COLOR)); tooltipComponents.add( - new TranslatableComponent(prefix + "tooltip.0", emphasized).withStyle(ChatFormatting.GRAY)); - tooltipComponents.add(new TranslatableComponent(prefix + "tooltip.1", modName).withStyle(ChatFormatting.GRAY)); + new TranslatableComponent("hexcasting.spelldata.onitem", emphasized).withStyle(ChatFormatting.GRAY)); + tooltipComponents.add(new TranslatableComponent("item.hexcasting.creative_unlocker.tooltip", modName).withStyle(ChatFormatting.GRAY)); } private static void addChildren(Advancement root, List out) { diff --git a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemManaHolder.java b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemManaHolder.java index 243f8962..e9fd0987 100644 --- a/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemManaHolder.java +++ b/Common/src/main/java/at/petrak/hexcasting/common/items/magic/ItemManaHolder.java @@ -1,10 +1,12 @@ package at.petrak.hexcasting.common.items.magic; import at.petrak.hexcasting.api.item.ManaHolderItem; +import at.petrak.hexcasting.api.misc.ManaConstants; import at.petrak.hexcasting.api.utils.ManaHelper; import at.petrak.hexcasting.api.utils.NBTHelper; -import net.minecraft.ChatFormatting; import net.minecraft.network.chat.Component; +import net.minecraft.network.chat.TextColor; +import net.minecraft.network.chat.TextComponent; import net.minecraft.network.chat.TranslatableComponent; import net.minecraft.util.Mth; import net.minecraft.world.item.Item; @@ -13,12 +15,24 @@ import net.minecraft.world.item.TooltipFlag; import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; +import java.math.RoundingMode; +import java.text.DecimalFormat; import java.util.List; public abstract class ItemManaHolder extends Item implements ManaHolderItem { public static final String TAG_MANA = "hexcasting:mana"; public static final String TAG_MAX_MANA = "hexcasting:start_mana"; + public static final TextColor HEX_COLOR = TextColor.fromRgb(0xb38ef3); + + private static final DecimalFormat PERCENTAGE = new DecimalFormat("####"); + + static { + PERCENTAGE.setRoundingMode(RoundingMode.DOWN); + } + + private static final DecimalFormat DUST_AMOUNT = new DecimalFormat("###,###.##"); + public ItemManaHolder(Properties pProperties) { super(pProperties); } @@ -75,12 +89,24 @@ public abstract class ItemManaHolder extends Item implements ManaHolderItem { @Override public void appendHoverText(ItemStack pStack, @Nullable Level pLevel, List pTooltipComponents, TooltipFlag pIsAdvanced) { - if (pIsAdvanced.isAdvanced() && getMaxMana(pStack) > 0) { + var maxMana = getMaxMana(pStack); + if (maxMana > 0) { + var mana = getMana(pStack); + var fullness = getManaFullness(pStack); + + var color = TextColor.fromRgb(ManaHelper.manaBarColor(mana, maxMana)); + + var manaAmount = new TextComponent(DUST_AMOUNT.format(mana / (float) ManaConstants.DUST_UNIT)); + var percentFull = new TextComponent(PERCENTAGE.format(100f * fullness) + "%"); + var maxCapacity = new TranslatableComponent("hexcasting.tooltip.mana", DUST_AMOUNT.format(maxMana / (float) ManaConstants.DUST_UNIT)); + + manaAmount.withStyle(style -> style.withColor(HEX_COLOR)); + maxCapacity.withStyle(style -> style.withColor(HEX_COLOR)); + percentFull.withStyle(style -> style.withColor(color)); + pTooltipComponents.add( - new TranslatableComponent("item.hexcasting.manaholder.amount", - String.format("%,d", getMana(pStack)), - String.format("%,d", getMaxMana(pStack)), - 100f * getManaFullness(pStack)).withStyle(ChatFormatting.GRAY)); + new TranslatableComponent("hexcasting.tooltip.mana_amount.advanced", + manaAmount, maxCapacity, percentFull)); } super.appendHoverText(pStack, pLevel, pTooltipComponents, pIsAdvanced); diff --git a/Common/src/main/resources/assets/hexcasting/lang/en_us.json b/Common/src/main/resources/assets/hexcasting/lang/en_us.json index 71b877f2..1e6df8a4 100644 --- a/Common/src/main/resources/assets/hexcasting/lang/en_us.json +++ b/Common/src/main/resources/assets/hexcasting/lang/en_us.json @@ -16,7 +16,6 @@ "item.hexcasting.trinket": "Trinket", "item.hexcasting.artifact": "Artifact", "item.hexcasting.battery": "Phial of Media", - "item.hexcasting.manaholder.amount": "N*merical Mana: %s/%s (%.0f%%)", "item.hexcasting.amethyst_dust": "Amethyst Dust", "item.hexcasting.charged_amethyst": "Charged Amethyst", "item.hexcasting.lens": "Scrying Lens", @@ -66,9 +65,8 @@ "item.hexcasting.pride_colorizer_transgender": "Transgender Pigment", "item.hexcasting.uuid_colorizer": "Soulglimmer Pigment", "item.hexcasting.creative_unlocker": "The Media Cube", - "item.hexcasting.creative_unlocker.tooltip.0": "Contains %s.", "item.hexcasting.creative_unlocker.for_emphasis": "INFINITE MEDIA", - "item.hexcasting.creative_unlocker.tooltip.1": "Consume to unlock all %s knowledge.", + "item.hexcasting.creative_unlocker.tooltip": "Consume to unlock all %s knowledge.", "item.hexcasting.creative_unlocker.mod_name": "Hexcasting", @@ -123,7 +121,6 @@ "hexcasting.tooltip.abacus": "%d", "hexcasting.tooltip.abacus.reset": "Reset to 0", "hexcasting.tooltip.abacus.reset.nice": "nice", - "hexcasting.tooltip.lens.impetus.mana": "%s dust", "hexcasting.tooltip.lens.impetus.storedplayer": "Bound to %s", "hexcasting.tooltip.lens.impetus.storedplayer.none": "Unbound", "hexcasting.tooltip.lens.pattern.invalid": "Invalid Pattern", @@ -141,6 +138,10 @@ "hexcasting.spelldata.entity.whoknows": "An Entity (this should only show up if this was stored before the 0.5.0 update, use Scribe's Reflection, Scribe's Gambit to fix)", "hexcasting.spelldata.akashic.nopos": "The owning record does not know of any iota here (this is a bug)", + "hexcasting.tooltip.mana": "%s dust", + "hexcasting.tooltip.mana_amount": "Contains: %s (%s)", + "hexcasting.tooltip.mana_amount.advanced": "Contains: %s/%s (%s)", + "gui.hexcasting.spellcasting": "Hex Grid", "tag.hexcasting.wands": "Hex Staves", "tag.hexcasting.akashic_logs": "Edified Logs", @@ -631,7 +632,7 @@ "hexcasting.page.hexcasting.2": "To do this, I can craft one of three types of magic items: $(l:items/hexcasting)$(item)Cyphers/$, $(l:items/hexcasting)$(item)Trinkets/$, or $(l:items/hexcasting)$(item)Artifacts/$. All of them hold the patterns of a given _Hex inside, along with a small battery containing _media.$(br2)Simply holding one and pressing $(thing)$(k:use)/$ will cast the patterns inside, as if the holder had cast them out of a staff, using its internal battery.", "hexcasting.page.hexcasting.3": "Each item has its own quirks:$(br2)$(l:items/hexcasting)$(item)Cyphers/$ are fragile, destroyed after their internal _media reserves are gone, and $(italic)cannot/$ be recharged;$(br2)$(l:items/hexcasting)$(item)Trinkets/$ can be cast as much as the holder likes, as long as there's enough _media left, but become useless afterwards until recharged;", "hexcasting.page.hexcasting.4": "$(l:items/hexcasting)$(item)Artifacts/$ are the most powerful of all-- after their _media is depleted, they can use $(l:items/amethyst)$(item)Amethyst/$ from the holder's inventory to pay for the _Hex, just as I do when casting with a $(l:items/staff)$(item)Staff/$. Of course, this also means the spell might consume their mind if there's not enough $(l:items/amethyst)$(item)Amethyst/$.$(br2)Once I've made an empty magic item in a mundane crafting bench, I infuse the _Hex into it using (what else but) a spell appropriate to the item. $(l:patterns/spells/hexcasting)I've catalogued the patterns here./$", - "hexcasting.page.hexcasting.5": "Each infusion spell requires an entity and a list of patterns on the stack. The entity must be a _media-holding item entity (i.e. $(l:items/amethyst)$(item)amethyst/$ crystals, dropped on the ground); the entity is consumed and forms the battery.$(br2)Usefully, it seems that the _media in the battery is not consumed in chunks as it is when casting with a $(l:items/staff)$(item)Staff/$-- rather, the _media \"melts down\" into one continuous pool. Thus, if I store a _Hex that only costs one $(l:items/amethyst)$(item)Amethyst Dust/$'s worth of mana, a $(l:items/amethyst)$(item)Charged Crystal/$ used as the battery will allow me to cast it 10 times.", + "hexcasting.page.hexcasting.5": "Each infusion spell requires an entity and a list of patterns on the stack. The entity must be a _media-holding item entity (i.e. $(l:items/amethyst)$(item)amethyst/$ crystals, dropped on the ground); the entity is consumed and forms the battery.$(br2)Usefully, it seems that the _media in the battery is not consumed in chunks as it is when casting with a $(l:items/staff)$(item)Staff/$-- rather, the _media \"melts down\" into one continuous pool. Thus, if I store a _Hex that only costs one $(l:items/amethyst)$(item)Amethyst Dust/$'s worth of media, a $(l:items/amethyst)$(item)Charged Crystal/$ used as the battery will allow me to cast it 10 times.", "hexcasting.page.hexcasting.crafting.desc": "$(italic)We have a saying in our field: \"Magic isn't\". It doesn't \"just work,\" it doesn't respond to your thoughts, you can't throw fireballs or create a roast dinner from thin air or turn a bunch of muggers into frogs and snails./$", "hexcasting.entry.phials": "Phials of Media",