aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com/thatgravyboat/skyblockhud/playerstats/ActionBarParsing.java
blob: 4e895f9c776d033fc098d464264e6c0c0e7670f8 (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
package com.thatgravyboat.skyblockhud.playerstats;

import com.thatgravyboat.skyblockhud.SkyblockHud;
import com.thatgravyboat.skyblockhud.Utils;
import com.thatgravyboat.skyblockhud.overlay.RPGHud;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IChatComponent;
import net.minecraftforge.client.event.ClientChatReceivedEvent;
import net.minecraftforge.fml.common.eventhandler.EventPriority;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import net.minecraftforge.fml.common.gameevent.TickEvent;

public class ActionBarParsing {

    private static String lastActionBar = "";
    private static String lastLowActionBar = "";
    private static IChatComponent lastLowEditedActionBar = null;

    private static final Pattern HealthRegex = Pattern.compile("([0-9]+)/([0-9]+)\u2764");
    private static final Pattern HealingRegex = Pattern.compile("\\+([0-9]+)[\u2586\u2585\u2584\u2583\u2582\u2581]");
    private static final Pattern DefenseRegex = Pattern.compile("([0-9]+)\u2748 Defense");
    private static final Pattern ManaRegex = Pattern.compile("([0-9]+)/([0-9]+)\u270E Mana");
    private static final Pattern ManaOverflowRegex = Pattern.compile("([0-9]+)/([0-9]+)\u270E ([0-9]+)\u02AC");
    private static final Pattern ManaDecreaseRegex = Pattern.compile("-([0-9]+) Mana \\(");
    private static final Pattern XpGainRegex = Pattern.compile("\\+(\\d*\\.?\\d*) (Farming|Mining|Combat|Foraging|Fishing|Enchanting|Alchemy|Carpentry|Runecrafting) \\((\\d*\\.?\\d*)%\\)");

    private static final Pattern HealthReplaceRegex = Pattern.compile("\u00A7c([0-9]+)/([0-9]+)\u2764");
    private static final Pattern HealingReplaceRegex = Pattern.compile("\\+\u00A7c([0-9]+)[\u2586\u2585\u2584\u2583\u2582\u2581]");
    private static final Pattern HealthAbsorptionReplaceRegex = Pattern.compile("\u00A76([0-9]+)/([0-9]+)\u2764");
    private static final Pattern DefenseReplaceRegex = Pattern.compile("\u00A7a([0-9]+)\u00A7a\u2748 Defense");
    private static final Pattern ManaReplaceRegex = Pattern.compile("\u00A7b([0-9]+)/([0-9]+)\u270E Mana");
    private static final Pattern ManaOverflowReplaceRegex = Pattern.compile("\u00A7b([0-9]+)/([0-9]+)\u270E \u00A73([0-9]+)\u02AC");

    private static int ticksSinceLastPrediction = 0;
    private static boolean predict = false;

    @SubscribeEvent
    public void tick(TickEvent.ClientTickEvent event) {
        if (predict) {
            ticksSinceLastPrediction++;
            if (ticksSinceLastPrediction == 20 && SkyblockHud.config.rpg.showRpgHud) {
                ticksSinceLastPrediction = 0;
                RPGHud.manaPredictionUpdate(true, 0);
            }
        }
    }

    @SubscribeEvent(priority = EventPriority.HIGHEST)
    public void onStatusBarHigh(ClientChatReceivedEvent event) {
        if (event.type == 2 && SkyblockHud.hasSkyblockScoreboard() && SkyblockHud.config.rpg.showRpgHud) {
            parseActionBar(event.message.getUnformattedText());
        }
    }

    @SubscribeEvent(priority = EventPriority.LOW)
    public void onStatusBarLow(ClientChatReceivedEvent event) {
        if (event.type == 2 && SkyblockHud.hasSkyblockScoreboard() && SkyblockHud.config.rpg.showRpgHud) {
            String message = event.message.getUnformattedText();
            if (lastLowEditedActionBar == null || !lastLowActionBar.equals(message)) {
                lastLowActionBar = message;
                message = HealthReplaceRegex.matcher(message).replaceAll("");
                message = HealthAbsorptionReplaceRegex.matcher(message).replaceAll("");
                message = DefenseReplaceRegex.matcher(message).replaceAll("");
                message = ManaReplaceRegex.matcher(message).replaceAll("");
                message = ManaOverflowReplaceRegex.matcher(message).replaceAll("");

                lastLowEditedActionBar = new ChatComponentText(message.trim());
            }
            event.message = lastLowEditedActionBar;
        }
    }

    public static void parseActionBar(String input) {
        if (!lastActionBar.equals(input)) {
            lastActionBar = input;
            String bar = Utils.removeColor(input);

            Matcher HealthMatcher = HealthRegex.matcher(bar);
            Matcher DefenseMatcher = DefenseRegex.matcher(bar);
            Matcher ManaMatcher = ManaRegex.matcher(bar);
            Matcher ManaUseMatcher = ManaDecreaseRegex.matcher(bar);
            Matcher ManaOverflowMatcher = ManaOverflowRegex.matcher(bar);
            Matcher XpGainMatcher = XpGainRegex.matcher(bar);

            boolean healthFound = HealthMatcher.find();
            boolean defenseFound = DefenseMatcher.find();
            boolean manaFound = ManaMatcher.find();
            boolean manaUseFound = ManaUseMatcher.find();
            boolean manaOverflowFound = ManaOverflowMatcher.find();
            boolean xpFound = XpGainMatcher.find();

            if (healthFound) {
                try {
                    RPGHud.updateHealth(Integer.parseInt(HealthMatcher.group(1)), Integer.parseInt(HealthMatcher.group(2)));
                } catch (Exception ignored) {}
            }
            if (defenseFound) {
                try {
                    RPGHud.updateDefense(Integer.parseInt(DefenseMatcher.group(1)));
                } catch (Exception ignored) {}
            } else if (!xpFound && !manaUseFound) {
                RPGHud.updateDefense(0);
            }
            if (manaFound) {
                try {
                    RPGHud.updateMana(Integer.parseInt(ManaMatcher.group(1)), Integer.parseInt(ManaMatcher.group(2)));
                } catch (Exception ignored) {}
            }
            if (!manaFound && manaOverflowFound) {
                try {
                    RPGHud.updateMana(Integer.parseInt(ManaOverflowMatcher.group(1)), Integer.parseInt(ManaOverflowMatcher.group(2)));
                    RPGHud.updateOverflow(Integer.parseInt(ManaOverflowMatcher.group(3)));
                } catch (Exception ignored) {}
            }
            if (!manaFound) {
                if (manaUseFound) {
                    try {
                        RPGHud.manaPredictionUpdate(false, Integer.parseInt(ManaUseMatcher.group(1)));
                    } catch (Exception ignored) {}
                }
                RPGHud.manaPredictionUpdate(true, 0);
            }
            predict = !manaFound;
        }
    }
}