aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky/skyblocker/skyblock/rift
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/de/hysky/skyblocker/skyblock/rift')
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/EffigyWaypoints.java71
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/HealingMelonIndicator.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/ManiaIndicator.java42
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java88
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/StakeIndicator.java27
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java22
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/rift/TwinClawsIndicator.java43
7 files changed, 320 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/EffigyWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/EffigyWaypoints.java
new file mode 100644
index 00000000..4cc20ca5
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/EffigyWaypoints.java
@@ -0,0 +1,71 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.text.Text;
+import net.minecraft.text.TextColor;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.math.BlockPos;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EffigyWaypoints {
+ private static final Logger LOGGER = LoggerFactory.getLogger(EffigyWaypoints.class);
+ private static final List<BlockPos> EFFIGIES = List.of(
+ new BlockPos(150, 79, 95), //Effigy 1
+ new BlockPos(193, 93, 119), //Effigy 2
+ new BlockPos(235, 110, 147), //Effigy 3
+ new BlockPos(293, 96, 134), //Effigy 4
+ new BlockPos(262, 99, 94), //Effigy 5
+ new BlockPos(240, 129, 118) //Effigy 6
+ );
+ private static final List<BlockPos> UNBROKEN_EFFIGIES = new ArrayList<>();
+
+ protected static void updateEffigies() {
+ if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableEffigyWaypoints || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) return;
+
+ UNBROKEN_EFFIGIES.clear();
+
+ try {
+ for (int i = 0; i < Utils.STRING_SCOREBOARD.size(); i++) {
+ String line = Utils.STRING_SCOREBOARD.get(i);
+
+ if (line.contains("Effigies")) {
+ List<Text> effigiesText = new ArrayList<>();
+ List<Text> prefixAndSuffix = Utils.TEXT_SCOREBOARD.get(i).getSiblings();
+
+ //Add contents of prefix and suffix to list
+ effigiesText.addAll(prefixAndSuffix.get(0).getSiblings());
+ effigiesText.addAll(prefixAndSuffix.get(1).getSiblings());
+
+ for (int i2 = 1; i2 < effigiesText.size(); i2++) {
+ if (effigiesText.get(i2).getStyle().getColor() == TextColor.parse("gray")) UNBROKEN_EFFIGIES.add(EFFIGIES.get(i2 - 1));
+ }
+ }
+ }
+ } catch (NullPointerException e) {
+ LOGGER.error("[Skyblocker] Error while updating effigies.", e);
+ }
+ }
+
+ protected static void render(WorldRenderContext context) {
+ if (SkyblockerConfigManager.get().slayer.vampireSlayer.enableEffigyWaypoints && Utils.getLocation().contains("Stillgore Château")) {
+ for (BlockPos effigy : UNBROKEN_EFFIGIES) {
+ float[] colorComponents = DyeColor.RED.getColorComponents();
+ if (SkyblockerConfigManager.get().slayer.vampireSlayer.compactEffigyWaypoints) {
+ RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy.down(6), colorComponents, 0.5F);
+ } else {
+ RenderHelper.renderFilledThroughWallsWithBeaconBeam(context, effigy, colorComponents, 0.5F);
+ for (int i = 1; i < 6; i++) {
+ RenderHelper.renderFilledThroughWalls(context, effigy.down(i), colorComponents, 0.5F - (0.075F * i));
+ }
+ }
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/HealingMelonIndicator.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/HealingMelonIndicator.java
new file mode 100644
index 00000000..333a4aa1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/HealingMelonIndicator.java
@@ -0,0 +1,27 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.render.title.Title;
+import de.hysky.skyblocker.utils.render.title.TitleContainer;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.util.Formatting;
+
+public class HealingMelonIndicator {
+ private static final Title title = new Title("skyblocker.rift.healNow", Formatting.DARK_RED);
+
+ public static void updateHealth() {
+ if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableHealingMelonIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château")) {
+ TitleContainer.removeTitle(title);
+ return;
+ }
+ ClientPlayerEntity player = MinecraftClient.getInstance().player;
+ if (player != null && player.getHealth() <= SkyblockerConfigManager.get().slayer.vampireSlayer.healingMelonHealthThreshold * 2F) {
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ } else {
+ TitleContainer.removeTitle(title);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/ManiaIndicator.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/ManiaIndicator.java
new file mode 100644
index 00000000..ab252ff0
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/ManiaIndicator.java
@@ -0,0 +1,42 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.SlayerUtils;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.render.title.Title;
+import de.hysky.skyblocker.utils.render.title.TitleContainer;
+import net.minecraft.block.Blocks;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.Entity;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import net.minecraft.util.math.BlockPos;
+
+public class ManiaIndicator {
+ private static final Title title = new Title("skyblocker.rift.mania", Formatting.RED);
+
+ protected static void updateMania() {
+ if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableManiaIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
+ TitleContainer.removeTitle(title);
+ return;
+ }
+
+ Entity slayerEntity = SlayerUtils.getSlayerEntity();
+ if (slayerEntity == null) return;
+
+ boolean anyMania = false;
+ for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) {
+ if (entity.getDisplayName().toString().contains("MANIA")) {
+ anyMania = true;
+ BlockPos pos = MinecraftClient.getInstance().player.getBlockPos().down();
+ boolean isGreen = MinecraftClient.getInstance().world.getBlockState(pos).getBlock() == Blocks.GREEN_TERRACOTTA;
+ title.setText(Text.translatable("skyblocker.rift.mania").formatted(isGreen ? Formatting.GREEN : Formatting.RED));
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ }
+ }
+ if (!anyMania) {
+ TitleContainer.removeTitle(title);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java
new file mode 100644
index 00000000..06181349
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java
@@ -0,0 +1,88 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.util.DyeColor;
+import net.minecraft.util.Identifier;
+import net.minecraft.util.math.BlockPos;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+
+public class MirrorverseWaypoints {
+ private static final Logger LOGGER = LoggerFactory.getLogger("skyblocker");
+ private static final MinecraftClient CLIENT = MinecraftClient.getInstance();
+ private static final Identifier WAYPOINTS_JSON = new Identifier(SkyblockerMod.NAMESPACE, "mirrorverse_waypoints.json");
+ private static final BlockPos[] LAVA_PATH_WAYPOINTS = new BlockPos[107];
+ private static final BlockPos[] UPSIDE_DOWN_WAYPOINTS = new BlockPos[66];
+ private static final BlockPos[] TURBULATOR_WAYPOINTS = new BlockPos[27];
+ private static final float[] COLOR_COMPONENTS = DyeColor.RED.getColorComponents();
+
+ static {
+ loadWaypoints();
+ }
+
+ /**
+ * Loads the waypoint locations into memory
+ */
+ private static void loadWaypoints() {
+ try (BufferedReader reader = CLIENT.getResourceManager().openAsReader(WAYPOINTS_JSON)) {
+ JsonObject file = JsonParser.parseReader(reader).getAsJsonObject();
+ JsonArray sections = file.get("sections").getAsJsonArray();
+
+ /// Lava Path
+ JsonArray lavaPathWaypoints = sections.get(0).getAsJsonObject().get("waypoints").getAsJsonArray();
+
+ for (int i = 0; i < lavaPathWaypoints.size(); i++) {
+ JsonObject point = lavaPathWaypoints.get(i).getAsJsonObject();
+ LAVA_PATH_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt());
+ }
+
+ /// Upside Down Parkour
+ JsonArray upsideDownParkourWaypoints = sections.get(1).getAsJsonObject().get("waypoints").getAsJsonArray();
+
+ for (int i = 0; i < upsideDownParkourWaypoints.size(); i++) {
+ JsonObject point = upsideDownParkourWaypoints.get(i).getAsJsonObject();
+ UPSIDE_DOWN_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt());
+ }
+
+ /// Turbulator Parkour
+ JsonArray turbulatorParkourWaypoints = sections.get(2).getAsJsonObject().get("waypoints").getAsJsonArray();
+
+ for (int i = 0; i < turbulatorParkourWaypoints.size(); i++) {
+ JsonObject point = turbulatorParkourWaypoints.get(i).getAsJsonObject();
+ TURBULATOR_WAYPOINTS[i] = new BlockPos(point.get("x").getAsInt(), point.get("y").getAsInt(), point.get("z").getAsInt());
+ }
+
+ } catch (IOException e) {
+ LOGGER.info("[Skyblocker] Mirrorverse Waypoints failed to load ;(");
+ e.printStackTrace();
+ }
+ }
+
+ protected static void render(WorldRenderContext wrc) {
+ //I would also check for the mirrorverse location but the scoreboard stuff is not performant at all...
+ if (Utils.isInTheRift() && SkyblockerConfigManager.get().locations.rift.mirrorverseWaypoints) {
+ for (BlockPos pos : LAVA_PATH_WAYPOINTS) {
+ RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f);
+ }
+
+ for (BlockPos pos : UPSIDE_DOWN_WAYPOINTS) {
+ RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f);
+ }
+
+ for (BlockPos pos : TURBULATOR_WAYPOINTS) {
+ RenderHelper.renderFilledIfVisible(wrc, pos, COLOR_COMPONENTS, 0.5f);
+ }
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/StakeIndicator.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/StakeIndicator.java
new file mode 100644
index 00000000..be502143
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/StakeIndicator.java
@@ -0,0 +1,27 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.SlayerUtils;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.render.title.Title;
+import de.hysky.skyblocker.utils.render.title.TitleContainer;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.Formatting;
+
+public class StakeIndicator {
+ private static final Title title = new Title("skyblocker.rift.stakeNow", Formatting.RED);
+
+ protected static void updateStake() {
+ if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableSteakStakeIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !Utils.getLocation().contains("Stillgore Château") || !SlayerUtils.isInSlayer()) {
+ TitleContainer.removeTitle(title);
+ return;
+ }
+ Entity slayerEntity = SlayerUtils.getSlayerEntity();
+ if (slayerEntity != null && slayerEntity.getDisplayName().toString().contains("҉")) {
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ } else {
+ TitleContainer.removeTitle(title);
+ }
+ }
+} \ No newline at end of file
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java
new file mode 100644
index 00000000..10b593bd
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java
@@ -0,0 +1,22 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+
+public class TheRift {
+ /**
+ * @see Utils#isInTheRift() Utils#isInTheRift().
+ */
+ public static final String LOCATION = "rift";
+
+ public static void init() {
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render);
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render);
+ Scheduler.INSTANCE.scheduleCyclic(EffigyWaypoints::updateEffigies, SkyblockerConfigManager.get().slayer.vampireSlayer.effigyUpdateFrequency);
+ Scheduler.INSTANCE.scheduleCyclic(TwinClawsIndicator::updateIce, SkyblockerConfigManager.get().slayer.vampireSlayer.holyIceUpdateFrequency);
+ Scheduler.INSTANCE.scheduleCyclic(ManiaIndicator::updateMania, SkyblockerConfigManager.get().slayer.vampireSlayer.maniaUpdateFrequency);
+ Scheduler.INSTANCE.scheduleCyclic(StakeIndicator::updateStake, SkyblockerConfigManager.get().slayer.vampireSlayer.steakStakeUpdateFrequency);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/TwinClawsIndicator.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/TwinClawsIndicator.java
new file mode 100644
index 00000000..1622bf4a
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/TwinClawsIndicator.java
@@ -0,0 +1,43 @@
+package de.hysky.skyblocker.skyblock.rift;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.SlayerUtils;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import de.hysky.skyblocker.utils.render.title.Title;
+import de.hysky.skyblocker.utils.render.title.TitleContainer;
+import net.minecraft.entity.Entity;
+import net.minecraft.util.Formatting;
+
+public class TwinClawsIndicator {
+ private static final Title title = new Title("skyblocker.rift.iceNow", Formatting.AQUA);
+ private static boolean scheduled = false;
+
+ protected static void updateIce() {
+ if (!SkyblockerConfigManager.get().slayer.vampireSlayer.enableHolyIceIndicator || !Utils.isOnSkyblock() || !Utils.isInTheRift() || !(Utils.getLocation().contains("Stillgore Château")) || !SlayerUtils.isInSlayer()) {
+ TitleContainer.removeTitle(title);
+ return;
+ }
+
+ Entity slayerEntity = SlayerUtils.getSlayerEntity();
+ if (slayerEntity == null) return;
+
+ boolean anyClaws = false;
+ for (Entity entity : SlayerUtils.getEntityArmorStands(slayerEntity)) {
+ if (entity.getDisplayName().toString().contains("TWINCLAWS")) {
+ anyClaws = true;
+ if (!TitleContainer.containsTitle(title) && !scheduled) {
+ scheduled = true;
+ Scheduler.INSTANCE.schedule(() -> {
+ RenderHelper.displayInTitleContainerAndPlaySound(title);
+ scheduled = false;
+ }, SkyblockerConfigManager.get().slayer.vampireSlayer.holyIceIndicatorTickDelay);
+ }
+ }
+ }
+ if (!anyClaws) {
+ TitleContainer.removeTitle(title);
+ }
+ }
+} \ No newline at end of file