From b2dff8d0f292b819138a2bb118f318063568e3fe Mon Sep 17 00:00:00 2001
From: olim <bobq4582@gmail.com>
Date: Tue, 30 Apr 2024 15:26:58 +0100
Subject: add masteryTest helper

create helper for the mastery challenge
---
 .../mixins/ClientPlayNetworkHandlerMixin.java      |  3 +-
 .../skyblock/crimson/dojo/DojoManager.java         | 12 ++++-
 .../skyblock/crimson/dojo/MasteryTestHelper.java   | 58 ++++++++++++++++++++++
 .../skyblock/crimson/dojo/SwiftnessTestHelper.java | 10 ++--
 4 files changed, 75 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/MasteryTestHelper.java

diff --git a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
index feb5a1cb..b7d505f3 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/ClientPlayNetworkHandlerMixin.java
@@ -5,6 +5,7 @@ import com.llamalad7.mixinextras.injector.v2.WrapWithCondition;
 import com.llamalad7.mixinextras.sugar.Local;
 import de.hysky.skyblocker.skyblock.CompactDamage;
 import de.hysky.skyblocker.skyblock.FishingHelper;
+import de.hysky.skyblocker.skyblock.crimson.dojo.DojoManager;
 import de.hysky.skyblocker.skyblock.crimson.dojo.SwiftnessTestHelper;
 import de.hysky.skyblocker.skyblock.dungeon.DungeonScore;
 import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager;
@@ -51,7 +52,7 @@ public abstract class ClientPlayNetworkHandlerMixin {
             }
         }
         if (Utils.getLocation() == Location.CRIMSON_ISLE) {
-            SwiftnessTestHelper.blockUpdate(packet);
+            DojoManager.onBlockUpdate(packet);
         }
     }
 
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
index 8e8482ea..b3796841 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/DojoManager.java
@@ -8,6 +8,7 @@ import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents;
 import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
 import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
 import net.minecraft.text.Text;
 import net.minecraft.world.updater.WorldUpdater;
 
@@ -23,6 +24,7 @@ public class DojoManager {
 
     protected enum DojoChallenges {
         NONE("none"),
+        MASTERY("Mastery"),
         DISCIPLINE("Discipline"),
         SWIFTNESS("Swiftness"),
         TENACITY("Tenacity");
@@ -55,11 +57,11 @@ public class DojoManager {
         inAreana = false;
         currentChallenge = DojoChallenges.NONE;
         SwiftnessTestHelper.reset();
+        MasteryTestHelper.reset();
     }
 
 
     private static void onMessage(Text text, Boolean overlay) {
-
         if (Utils.getLocation() != Location.CRIMSON_ISLE || overlay) {
             return;
         }
@@ -85,6 +87,13 @@ public class DojoManager {
         }
     }
 
+    public static void onBlockUpdate(BlockUpdateS2CPacket packet) {
+        switch (currentChallenge) {
+            case SWIFTNESS -> SwiftnessTestHelper.onBlockUpdate(packet);
+            case MASTERY -> MasteryTestHelper.onBlockUpdate(packet);
+        }
+    }
+
     private static void update() {
         if (Utils.getLocation() != Location.CRIMSON_ISLE || !inAreana) {
             return;
@@ -98,6 +107,7 @@ public class DojoManager {
         switch (currentChallenge) {
             case SWIFTNESS -> SwiftnessTestHelper.render(context);
             case TENACITY -> TenacityTestHelper.render(context);
+            case MASTERY -> MasteryTestHelper.render(context);
         }
     }
 
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/MasteryTestHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/MasteryTestHelper.java
new file mode 100644
index 00000000..85fd5e1c
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/MasteryTestHelper.java
@@ -0,0 +1,58 @@
+package de.hysky.skyblocker.skyblock.crimson.dojo;
+
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.block.Blocks;
+import net.minecraft.network.packet.s2c.play.BlockUpdateS2CPacket;
+import net.minecraft.text.Text;
+import net.minecraft.util.math.BlockPos;
+import net.minecraft.util.math.Vec3d;
+
+import java.text.DecimalFormat;
+import java.util.*;
+
+public class MasteryTestHelper {
+
+    private static final float[] LIGHT_GRAY = { 192 / 255f, 192 / 255f, 192 / 255f };
+    private static final DecimalFormat FORMATTER = new DecimalFormat("0.00");
+
+    private static List<BlockPos> blockOrder = new ArrayList<>();
+    private static Map<BlockPos, Long> endTimes =new HashMap<>();
+
+    protected static void reset() {
+        blockOrder = new ArrayList<>();
+        endTimes =new HashMap<>();
+    }
+
+
+    public static void onBlockUpdate(BlockUpdateS2CPacket packet) {
+        BlockPos pos = packet.getPos();
+        if (packet.getState().isOf(Blocks.LIME_WOOL)) {
+            blockOrder.add(pos);
+            endTimes.put(pos,System.currentTimeMillis()+6850);
+        }
+        if (packet.getState().isAir()) {
+            blockOrder.remove(pos);
+        }
+    }
+
+    protected static void render(WorldRenderContext context) {
+        //render connecting lines
+        if (!blockOrder.isEmpty()) {
+            RenderHelper.renderLineFromCursor(context, blockOrder.getFirst().toCenterPos(),LIGHT_GRAY,1f, 2);
+        }
+        if (blockOrder.size() >= 2) {
+            RenderHelper.renderLinesFromPoints(context, new Vec3d[]{blockOrder.get(0).toCenterPos(), blockOrder.get(1).toCenterPos()}, new float[]{0f, 1f, 0f}, 1, 2, false);
+        }
+
+        //render times
+        long currentTime = System.currentTimeMillis();
+        for (BlockPos pos : blockOrder) {
+            long blockEndTime = endTimes.get(pos);
+            float secondsTime  = Math.max((blockEndTime - currentTime) / 1000f, 0);
+            RenderHelper.renderText(context, Text.literal(FORMATTER.format(secondsTime)), pos.add(0, 1, 0).toCenterPos(), 3, true);
+
+        }
+
+    }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/SwiftnessTestHelper.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/SwiftnessTestHelper.java
index d2a9ae57..5d5f3bab 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/SwiftnessTestHelper.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/dojo/SwiftnessTestHelper.java
@@ -22,16 +22,14 @@ public class SwiftnessTestHelper {
     //-189 99 -580
     //-223 99  -614
 
-    public static void blockUpdate(BlockUpdateS2CPacket packet) {
-        if (DojoManager.currentChallenge == DojoManager.DojoChallenges.SWIFTNESS) {
-            if (packet.getState().isOf(Blocks.LIME_WOOL)) {
-                lastBlock = packet.getPos();
-            }
+    public static void onBlockUpdate(BlockUpdateS2CPacket packet) {
+        if (packet.getState().isOf(Blocks.LIME_WOOL)) {
+            lastBlock = packet.getPos();
         }
     }
 
     protected static void render(WorldRenderContext context) {
-        if (DojoManager.currentChallenge != DojoManager.DojoChallenges.SWIFTNESS || lastBlock == null) {
+        if (lastBlock == null) {
             return;
         }
         RenderHelper.renderOutline(context,new Box(lastBlock),new float[]{0f,1f,0f},3,true);
-- 
cgit