diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-05-14 17:12:37 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-14 17:12:37 -0400 |
commit | df8cd71d04ae9d64240472912ff929724047302f (patch) | |
tree | 8340683e6db8a033b6c54a9202e7764c2eaac551 /src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java | |
parent | 1960a21da6bf472c774c51c99b3ed8ca30912758 (diff) | |
parent | 3d1215ebe767d54f47b29d24ff18437fd1243f67 (diff) | |
download | Skyblocker-df8cd71d04ae9d64240472912ff929724047302f.tar.gz Skyblocker-df8cd71d04ae9d64240472912ff929724047302f.tar.bz2 Skyblocker-df8cd71d04ae9d64240472912ff929724047302f.zip |
Merge pull request #696 from Emirlol/compact-damage
Add compact damage
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java')
-rw-r--r-- | src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java b/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java new file mode 100644 index 00000000..cff4997b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/CompactDamage.java @@ -0,0 +1,86 @@ +package de.hysky.skyblocker.skyblock; + +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.skyblock.item.CustomArmorAnimatedDyes; +import net.minecraft.entity.decoration.ArmorStandEntity; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.text.TextColor; +import net.minecraft.util.Formatting; +import org.apache.commons.lang3.math.NumberUtils; + +import java.util.List; +import java.util.regex.Pattern; + + +public class CompactDamage { + private static final Pattern DAMAGE_PATTERN = Pattern.compile("(?:✧|✯)?[\\d,]+(?:✧|✯?)❤?"); + private CompactDamage() { + } + + public static void compactDamage(ArmorStandEntity entity) { + if (!entity.isInvisible() || !entity.hasCustomName() || !entity.isCustomNameVisible()) return; + Text customName = entity.getCustomName(); + String customNameStringified = customName.getString(); + if (!DAMAGE_PATTERN.matcher(customNameStringified).matches()) return; + List<Text> siblings = customName.getSiblings(); + if (siblings.isEmpty()) return; + + MutableText prettierCustomName; + if (siblings.size() == 1) { //Non-crit damage + Text text = siblings.getFirst(); + String dmg = text.getString().replace(",", ""); + if (!NumberUtils.isParsable(dmg)) return; //Sanity check + String prettifiedDmg = prettifyDamageNumber(Long.parseLong(dmg)); + int color; + if (text.getStyle().getColor() != null) { + if (text.getStyle().getColor() == TextColor.fromFormatting(Formatting.GRAY)) { + color = SkyblockerConfigManager.get().uiAndVisuals.compactDamage.normalDamageColor.getRGB() & 0x00FFFFFF; + } else color = text.getStyle().getColor().getRgb(); + } else color = SkyblockerConfigManager.get().uiAndVisuals.compactDamage.normalDamageColor.getRGB() & 0x00FFFFFF; + prettierCustomName = Text.literal("").append(Text.literal(prettifiedDmg).setStyle(customName.getStyle()).withColor(color)); + } else { //Crit damage + boolean wasDoubled = customNameStringified.contains("❤"); //Ring of love ability adds a heart to the end of the damage string + int entriesToRemove = wasDoubled ? 2 : 1; + + String dmg = siblings.subList(1, siblings.size() - entriesToRemove) //First and last sibling are the crit symbols and maybe heart + .stream() + .map(Text::getString) + .reduce("", String::concat) //Concatenate all the siblings to get the dmg number + .replace(",", ""); + + if (!NumberUtils.isParsable(dmg)) return; //Sanity check + String dmgSymbol = customNameStringified.charAt(0) != '✯' ? "✧" : "✯"; //Mega Crit ability from the Overload enchantment + String prettifiedDmg = dmgSymbol + prettifyDamageNumber(Long.parseLong(dmg)) + dmgSymbol; + prettierCustomName = Text.literal(""); + int length = prettifiedDmg.length(); + for (int i = 0; i < length; i++) { + prettierCustomName.append(Text.literal(prettifiedDmg.substring(i, i + 1)).withColor( + CustomArmorAnimatedDyes.interpolate( + SkyblockerConfigManager.get().uiAndVisuals.compactDamage.critDamageGradientStart.getRGB() & 0x00FFFFFF, + SkyblockerConfigManager.get().uiAndVisuals.compactDamage.critDamageGradientEnd.getRGB() & 0x00FFFFFF, + i / (length - 1.0) + ) + )); + } + + if (wasDoubled) prettierCustomName.append(Text.literal("❤").formatted(Formatting.LIGHT_PURPLE)); + + prettierCustomName.setStyle(customName.getStyle()); + } + + entity.setCustomName(prettierCustomName); + } + + private static String prettifyDamageNumber(long damage) { + if (damage < 1_000) return String.valueOf(damage); + if (damage < 1_000_000) return format(damage / 1_000.0) + "k"; + if (damage < 1_000_000_000) return format(damage / 1_000_000.0) + "M"; + if (damage < 1_000_000_000_000L) return format(damage / 1_000_000_000.0) + "B"; + return format(damage / 1_000_000_000_000.0) + "T"; //This will probably never be reached + } + + private static String format(double number) { + return ("%." + SkyblockerConfigManager.get().uiAndVisuals.compactDamage.precision + "f").formatted(number); + } +} |