aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/tabhud/widget/hud/HudPowderWidget.java
blob: a827685deb1598ac74f9d00ba1aebb5edc3f586f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
package de.hysky.skyblocker.skyblock.tabhud.widget.hud;

import de.hysky.skyblocker.skyblock.dwarven.DwarvenHud;
import de.hysky.skyblocker.skyblock.tabhud.util.Ico;
import de.hysky.skyblocker.skyblock.tabhud.widget.Widget;
import net.minecraft.text.MutableText;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;

import java.text.NumberFormat;
import java.text.ParseException;
import java.util.Locale;

// this widget shows the status of the king's commissions.
// (dwarven mines and crystal hollows)
// USE ONLY WITH THE DWARVEN HUD!

public class HudPowderWidget extends Widget {

    /**
     * American number format instance
     */
    private static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US);
    /**
     * current value of Mithril Powder
     */
    private static int mithrilPowder = 0;
    /**
     * current value of Gemstone Powder
     */
    private static int gemstonePowder = 0;
    /**
     * current value of Glacite Powder
     */
    private static int glacitePowder = 0;
    /**
     * the difference between the previous and current value of Mithril Powder
     */
    private static int mithrilPowderDiff = 0;
    /**
     * the difference between the previous and current value of Gemstone Powder
     */
    private static int gemstonePowderDiff = 0;
    /**
     * the difference between the previous and current value of Glacite Powder
     */
    private static int glacitePowderDiff = 0;
    /**
     * The initial value of the timer for the difference update delay countdown.
     */
    private static long startTime = System.currentTimeMillis();

    private static final MutableText TITLE = Text.literal("Powders").formatted(Formatting.DARK_AQUA,
            Formatting.BOLD);


    // disgusting hack to get around text renderer issues.
    // the ctor eventually tries to get the font's height, which doesn't work
    //   when called before the client window is created (roughly).
    // the rebdering god 2 from the fabricord explained that detail, thanks!
    //coppied from the HodCommsWidget to be used in the same place
    public static final HudPowderWidget INSTANCE = new HudPowderWidget();
    public static final HudPowderWidget INSTANCE_CFG = new HudPowderWidget();

    // another repulsive hack to make this widget-like hud element work with the new widget class
    // DON'T USE WITH THE WIDGET SYSTEM, ONLY USE FOR DWARVENHUD!
    public HudPowderWidget() {
        super(TITLE, Formatting.DARK_AQUA.getColorValue());
    }

    /**
     * Converts a string with a number and commas between digits to an integer value.
     *
     * @param str a string with a number and commas between digits
     * @return integer value
     */
    private static int parsePowder(String str) {
        try {
            return NUMBER_FORMAT.parse(str).intValue();
        } catch (ParseException e) {
            return 0;
        }
    }

    /**
     * Converts Powder and difference values to a string and adds commas to the digits of the numbers.
     *
     * @param powder the value of Mithril, Gemstone Powder, or Glacite Powder
     * @param diff   the difference between the previous and current value of Mithril, Gemstone, or Glacite Powder
     * @return formatted string
     */
    private static String formatPowderString(int powder, int diff) {
        if (diff == 0) return NUMBER_FORMAT.format(powder);
        return NUMBER_FORMAT.format(powder) + (diff > 0 ? " (+" : " (") + NUMBER_FORMAT.format(diff) + ")";
    }

    /**
     * Updates Powders and difference values when Powder values change or every 2 seconds.
     */
    private static void updatePowders() {
        long elapsedTime = System.currentTimeMillis() - startTime;

        int newMithrilPowder = parsePowder(DwarvenHud.mithrilPowder);
        int newGemstonePowder = parsePowder(DwarvenHud.gemStonePowder);
        int newGlacitePowder = parsePowder(DwarvenHud.glacitePowder);

        if (newMithrilPowder != mithrilPowder || newGemstonePowder != gemstonePowder || newGlacitePowder != glacitePowder || elapsedTime > 2000) {
            startTime = System.currentTimeMillis();

            mithrilPowderDiff = newMithrilPowder - mithrilPowder;
            gemstonePowderDiff = newGemstonePowder - gemstonePowder;
            glacitePowderDiff = newGlacitePowder - glacitePowder;

            mithrilPowder = newMithrilPowder;
            gemstonePowder = newGemstonePowder;
            glacitePowder = newGlacitePowder;
        }
    }

    @Override
    public void updateContent() {
        updatePowders();
        String mithrilPowderString = formatPowderString(mithrilPowder, mithrilPowderDiff);
        String gemstonePowderString = formatPowderString(gemstonePowder, gemstonePowderDiff);
        String glacitePowderString = formatPowderString(glacitePowder, glacitePowderDiff);

        this.addSimpleIcoText(Ico.MITHRIL, "Mithril: ", Formatting.DARK_GREEN, mithrilPowderString);
        this.addSimpleIcoText(Ico.AMETHYST_SHARD, "Gemstone: ", Formatting.LIGHT_PURPLE, gemstonePowderString);
        this.addSimpleIcoText(Ico.BLUE_ICE, "Glacite: ", Formatting.AQUA, glacitePowderString);
    }

}