aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-03-09 21:57:33 -0500
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2024-03-09 22:00:52 -0500
commit9de7936885b3f4e1b2988149717b51e35f1efa85 (patch)
tree86c097ed4891b1d24410009f5ec7568a48de8b5d /src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
parent4a43b965bb0b105eb5c614932f965449e930f56b (diff)
downloadSkyblocker-9de7936885b3f4e1b2988149717b51e35f1efa85.tar.gz
Skyblocker-9de7936885b3f4e1b2988149717b51e35f1efa85.tar.bz2
Skyblocker-9de7936885b3f4e1b2988149717b51e35f1efa85.zip
Add Farming HUD
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java105
1 files changed, 103 insertions, 2 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
index db3bbadc..dba282c1 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/garden/FarmingHud.java
@@ -2,15 +2,116 @@ package de.hysky.skyblocker.skyblock.garden;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.skyblock.tabhud.widget.hud.HudFarmingWidget;
+import de.hysky.skyblocker.utils.ItemUtils;
import de.hysky.skyblocker.utils.Location;
import de.hysky.skyblocker.utils.Utils;
+import it.unimi.dsi.fastutil.floats.FloatLongPair;
+import it.unimi.dsi.fastutil.ints.IntLongPair;
+import it.unimi.dsi.fastutil.longs.LongArrayFIFOQueue;
+import it.unimi.dsi.fastutil.longs.LongPriorityQueue;
+import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
import net.fabricmc.fabric.api.client.rendering.v1.HudRenderCallback;
+import net.fabricmc.fabric.api.event.client.player.ClientPlayerBlockBreakEvents;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.item.ItemStack;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.text.NumberFormat;
+import java.text.ParseException;
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.Locale;
+import java.util.Queue;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
public class FarmingHud {
+ private static final Logger LOGGER = LoggerFactory.getLogger(FarmingHud.class);
+ public static final NumberFormat NUMBER_FORMAT = NumberFormat.getInstance(Locale.US);
+ private static final Pattern COUNTER = Pattern.compile("Counter: (?<count>[\\d,]+) \\w+");
+ private static final Pattern FARMING_XP = Pattern.compile("ยง3\\+(?<xp>\\d+.?\\d*) Farming \\((?<percent>\\d+.?\\d*)%\\)");
+ private static final Deque<IntLongPair> counter = new ArrayDeque<>();
+ private static final LongPriorityQueue blockBreaks = new LongArrayFIFOQueue();
+ private static final Queue<FloatLongPair> farmingXp = new ArrayDeque<>();
+ private static float farmingXpPercentProgress;
+
public static void init() {
HudRenderCallback.EVENT.register((context, tickDelta) -> {
- if (!SkyblockerConfigManager.get().locations.garden.farmingHud.enableHud || Utils.getLocation() != Location.GARDEN) return;
- HudFarmingWidget.INSTANCE.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground);
+ if (shouldRender()) {
+ if (!counter.isEmpty() && counter.peek().rightLong() + 10_000 < System.currentTimeMillis()) {
+ counter.poll();
+ }
+ if (!blockBreaks.isEmpty() && blockBreaks.firstLong() + 1000 < System.currentTimeMillis()) {
+ blockBreaks.dequeueLong();
+ }
+ if (!farmingXp.isEmpty() && farmingXp.peek().rightLong() + 1000 < System.currentTimeMillis()) {
+ farmingXp.poll();
+ }
+
+ ItemStack stack = MinecraftClient.getInstance().player.getMainHandStack();
+ Matcher matcher = ItemUtils.getNbtTooltip(stack, FarmingHud.COUNTER);
+ if (matcher != null) {
+ try {
+ int count = NUMBER_FORMAT.parse(matcher.group("count")).intValue();
+ if (counter.isEmpty() || counter.peekLast().leftInt() != count) {
+ counter.offer(IntLongPair.of(count, System.currentTimeMillis()));
+ }
+ } catch (ParseException e) {
+ LOGGER.error("[Skyblocker Farming HUD] Failed to parse counter", e);
+ }
+ }
+
+ HudFarmingWidget.INSTANCE.update();
+ HudFarmingWidget.INSTANCE.render(context, SkyblockerConfigManager.get().general.tabHud.enableHudBackground);
+ }
+ });
+ ClientPlayerBlockBreakEvents.AFTER.register((world, player, pos, state) -> {
+ if (shouldRender()) {
+ blockBreaks.enqueue(System.currentTimeMillis());
+ }
});
+ ClientReceiveMessageEvents.GAME.register((message, overlay) -> {
+ if (shouldRender() && overlay) {
+ Matcher matcher = FARMING_XP.matcher(message.getString());
+ if (matcher.matches()) {
+ try {
+ farmingXp.offer(FloatLongPair.of(NUMBER_FORMAT.parse(matcher.group("xp")).floatValue(), System.currentTimeMillis()));
+ farmingXpPercentProgress = NUMBER_FORMAT.parse(matcher.group("percent")).floatValue();
+ } catch (ParseException e) {
+ LOGGER.error("[Skyblocker Farming HUD] Failed to parse farming xp", e);
+ }
+ }
+ }
+ });
+ }
+
+ private static boolean shouldRender() {
+ return SkyblockerConfigManager.get().locations.garden.farmingHud.enableHud && Utils.getLocation() == Location.GARDEN;
+ }
+
+ public static int counter() {
+ return counter.isEmpty() ? 0 : counter.peekLast().leftInt();
+ }
+
+ public static float cropsPerMinute() {
+ if (counter.isEmpty()) {
+ return 0;
+ }
+ IntLongPair first = counter.peek();
+ IntLongPair last = counter.peekLast();
+ return (float) (last.leftInt() - first.leftInt()) / (last.rightLong() - first.rightLong()) * 60_000f;
+ }
+
+ public static int blockBreaks() {
+ return blockBreaks.size();
+ }
+
+ public static float farmingXpPercentProgress() {
+ return farmingXpPercentProgress;
+ }
+
+ public static double farmingXpPerHour() {
+ return farmingXp.stream().mapToDouble(FloatLongPair::leftFloat).sum() * 3600;
}
}