From 219648e46b1b1e46ae27bcf8ba80e0b5536c6dab Mon Sep 17 00:00:00 2001 From: Aaron <51387595+AzureAaron@users.noreply.github.com> Date: Sun, 22 Oct 2023 20:21:19 -0400 Subject: Enigma Soul Waypoints --- .../hysky/skyblocker/config/SkyblockerConfig.java | 6 + .../config/categories/LocationsCategory.java | 15 + .../skyblocker/skyblock/rift/EnigmaSouls.java | 184 ++++ .../skyblock/rift/MirrorverseWaypoints.java | 2 +- .../de/hysky/skyblocker/skyblock/rift/TheRift.java | 8 + .../resources/assets/skyblocker/lang/en_us.json | 5 + .../assets/skyblocker/mirrorverse_waypoints.json | 1019 -------------------- .../skyblocker/rift/enigma_soul_waypoints.json | 215 +++++ .../skyblocker/rift/mirrorverse_waypoints.json | 1019 ++++++++++++++++++++ 9 files changed, 1453 insertions(+), 1020 deletions(-) create mode 100644 src/main/java/de/hysky/skyblocker/skyblock/rift/EnigmaSouls.java delete mode 100644 src/main/resources/assets/skyblocker/mirrorverse_waypoints.json create mode 100644 src/main/resources/assets/skyblocker/rift/enigma_soul_waypoints.json create mode 100644 src/main/resources/assets/skyblocker/rift/mirrorverse_waypoints.json (limited to 'src/main') diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java index d7279bc8..57d12c76 100644 --- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java +++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java @@ -730,6 +730,12 @@ public class SkyblockerConfig { public static class Rift { @SerialEntry public boolean mirrorverseWaypoints = true; + + @SerialEntry + public boolean enigmaSoulWaypoints = false; + + @SerialEntry + public boolean highlightFoundEnigmaSouls = true; @SerialEntry public int mcGrubberStacks = 0; diff --git a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java index 399bb9f6..5e662fcc 100644 --- a/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java +++ b/src/main/java/de/hysky/skyblocker/config/categories/LocationsCategory.java @@ -46,6 +46,21 @@ public class LocationsCategory { newValue -> config.locations.rift.mirrorverseWaypoints = newValue) .controller(ConfigUtils::createBooleanController) .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.enigmaSoulWaypoints")) + .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.enigmaSoulWaypoints.@Tooltip"))) + .binding(defaults.locations.rift.enigmaSoulWaypoints, + () -> config.locations.rift.enigmaSoulWaypoints, + newValue -> config.locations.rift.enigmaSoulWaypoints = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) + .option(Option.createBuilder() + .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.highlightFoundEnigmaSouls")) + .binding(defaults.locations.rift.highlightFoundEnigmaSouls, + () -> config.locations.rift.highlightFoundEnigmaSouls, + newValue -> config.locations.rift.highlightFoundEnigmaSouls = newValue) + .controller(ConfigUtils::createBooleanController) + .build()) .option(Option.createBuilder() .name(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks")) .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks.@Tooltip"))) diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/EnigmaSouls.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/EnigmaSouls.java new file mode 100644 index 00000000..3a0651ef --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/EnigmaSouls.java @@ -0,0 +1,184 @@ +package de.hysky.skyblocker.skyblock.rift; + +import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.NoSuchFileException; +import java.nio.file.Path; +import java.util.Arrays; +import java.util.Comparator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.mojang.brigadier.Command; +import com.mojang.brigadier.CommandDispatcher; + +import de.hysky.skyblocker.SkyblockerMod; +import de.hysky.skyblocker.config.SkyblockerConfig; +import de.hysky.skyblocker.config.SkyblockerConfigManager; +import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.PosUtils; +import de.hysky.skyblocker.utils.Utils; +import de.hysky.skyblocker.utils.render.RenderHelper; +import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; +import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet; +import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.command.CommandRegistryAccess; +import net.minecraft.text.Text; +import net.minecraft.util.DyeColor; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import net.minecraft.util.math.BlockPos; + +public class EnigmaSouls { + private static final Logger LOGGER = LoggerFactory.getLogger(EnigmaSouls.class); + private static final Identifier WAYPOINTS_JSON = new Identifier(SkyblockerMod.NAMESPACE, "rift/enigma_soul_waypoints.json"); + private static final BlockPos[] SOUL_WAYPOINTS = new BlockPos[42]; + private static final Path FOUND_SOULS_FILE = SkyblockerMod.CONFIG_DIR.resolve("found_enigma_souls.json"); + private static final Object2ObjectOpenHashMap> FOUND_SOULS = new Object2ObjectOpenHashMap<>(); + private static final float[] GREEN = DyeColor.GREEN.getColorComponents(); + private static final float[] RED = DyeColor.RED.getColorComponents(); + + private static CompletableFuture soulsLoaded; + + static void load(MinecraftClient client) { + //Load waypoints + soulsLoaded = CompletableFuture.runAsync(() -> { + try (BufferedReader reader = client.getResourceManager().openAsReader(WAYPOINTS_JSON)) { + JsonObject file = JsonParser.parseReader(reader).getAsJsonObject(); + JsonArray waypoints = file.get("waypoints").getAsJsonArray(); + + for (int i = 0; i < waypoints.size(); i++) { + JsonObject waypoint = waypoints.get(i).getAsJsonObject(); + SOUL_WAYPOINTS[i] = new BlockPos(waypoint.get("x").getAsInt(), waypoint.get("y").getAsInt(), waypoint.get("z").getAsInt()); + } + + } catch (IOException e) { + LOGGER.error("[Skyblocker] There was an error while loading enigma soul waypoints! Exception: {}", e); + } + + //Load found souls + try (BufferedReader reader = Files.newBufferedReader(FOUND_SOULS_FILE)) { + for (Map.Entry profile : JsonParser.parseReader(reader).getAsJsonObject().asMap().entrySet()) { + ObjectOpenHashSet foundSoulsOnProfile = new ObjectOpenHashSet<>(); + + for (JsonElement foundSoul : profile.getValue().getAsJsonArray().asList()) { + foundSoulsOnProfile.add(PosUtils.parsePosString(foundSoul.getAsString())); + } + + FOUND_SOULS.put(profile.getKey(), foundSoulsOnProfile); + } + } catch (NoSuchFileException ignored) { + } catch (IOException e) { + LOGGER.error("[Skyblocker] There was an error while loading found enigma souls! Exception: {}", e); + } + }); + } + + static void save(MinecraftClient client) { + JsonObject json = new JsonObject(); + + for (Map.Entry> foundSoulsForProfile : FOUND_SOULS.entrySet()) { + JsonArray foundSoulsJson = new JsonArray(); + + for (BlockPos foundSoul : foundSoulsForProfile.getValue()) { + foundSoulsJson.add(PosUtils.getPosString(foundSoul)); + } + + json.add(foundSoulsForProfile.getKey(), foundSoulsJson); + } + + try (BufferedWriter writer = Files.newBufferedWriter(FOUND_SOULS_FILE)) { + SkyblockerMod.GSON.toJson(json, writer); + } catch (IOException e) { + LOGGER.error("[Skyblocker] There was an error while saving found enigma souls! Exception: {}", e); + } + } + + static void render(WorldRenderContext wrc) { + SkyblockerConfig.Rift config = SkyblockerConfigManager.get().locations.rift; + + if (Utils.isInTheRift() && config.enigmaSoulWaypoints && soulsLoaded.isDone()) { + for (BlockPos pos : SOUL_WAYPOINTS) { + if (isSoulMissing(pos)) { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(wrc, pos, GREEN, 0.5f); + } else if (config.highlightFoundEnigmaSouls) { + RenderHelper.renderFilledThroughWallsWithBeaconBeam(wrc, pos, RED, 0.5f); + } + } + } + } + + static void onMessage(Text text, boolean overlay) { + if (Utils.isInTheRift() && !overlay) { + String message = text.getString(); + + if (message.equals("You have already found that Enigma Soul!") || Formatting.strip(message).equals("SOUL! You unlocked an Enigma Soul!")) markClosestSoulAsFound(); + } + } + + static void registerCommands(CommandDispatcher dispatcher, CommandRegistryAccess registryAccess) { + dispatcher.register(literal(SkyblockerMod.NAMESPACE) + .then(literal("rift") + .then(literal("enigmaSouls") + .then(literal("markAllFound").executes(context -> { + markAllFound(); + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.rift.enigmaSouls.markAllFound"))); + + return Command.SINGLE_SUCCESS; + })) + .then(literal("markAllMissing").executes(context -> { + markAllMissing(); + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.rift.enigmaSouls.markAllMissing"))); + + return Command.SINGLE_SUCCESS; + }))))); + } + + @SuppressWarnings("resource") + private static void markClosestSoulAsFound() { + if (!soulsLoaded.isDone()) return; + + ClientPlayerEntity player = MinecraftClient.getInstance().player; + + Arrays.stream(SOUL_WAYPOINTS) + .filter(EnigmaSouls::isSoulMissing) + .min(Comparator.comparingDouble(soulPos -> soulPos.getSquaredDistance(player.getPos()))) + .filter(soulPos -> soulPos.getSquaredDistance(player.getPos()) <= 16) + .ifPresent(soulPos -> { + FOUND_SOULS.computeIfAbsent(Utils.getProfile(), profile -> new ObjectOpenHashSet<>()); + FOUND_SOULS.get(Utils.getProfile()).add(soulPos); + }); + } + + private static boolean isSoulMissing(BlockPos soulPos) { + ObjectOpenHashSet foundSoulsOnProfile = FOUND_SOULS.get(Utils.getProfile()); + + return foundSoulsOnProfile == null || !foundSoulsOnProfile.contains(soulPos); + } + + private static void markAllFound() { + FOUND_SOULS.computeIfAbsent(Utils.getProfile(), profile -> new ObjectOpenHashSet<>()); + FOUND_SOULS.get(Utils.getProfile()).addAll(List.of(SOUL_WAYPOINTS)); + } + + private static void markAllMissing() { + ObjectOpenHashSet foundSoulsOnProfile = FOUND_SOULS.get(Utils.getProfile()); + + if (foundSoulsOnProfile != null) foundSoulsOnProfile.clear(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java index 06181349..d6e3f427 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/MirrorverseWaypoints.java @@ -21,7 +21,7 @@ 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 Identifier WAYPOINTS_JSON = new Identifier(SkyblockerMod.NAMESPACE, "rift/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]; diff --git a/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java index b39151d3..95a2ecf4 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/rift/TheRift.java @@ -2,6 +2,9 @@ package de.hysky.skyblocker.skyblock.rift; import de.hysky.skyblocker.config.SkyblockerConfigManager; import de.hysky.skyblocker.utils.scheduler.Scheduler; +import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; +import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents; public class TheRift { @@ -13,6 +16,11 @@ public class TheRift { public static void init() { WorldRenderEvents.AFTER_TRANSLUCENT.register(MirrorverseWaypoints::render); WorldRenderEvents.AFTER_TRANSLUCENT.register(EffigyWaypoints::render); + WorldRenderEvents.AFTER_TRANSLUCENT.register(EnigmaSouls::render); + ClientLifecycleEvents.CLIENT_STARTED.register(EnigmaSouls::load); + ClientLifecycleEvents.CLIENT_STOPPING.register(EnigmaSouls::save); + ClientReceiveMessageEvents.GAME.register(EnigmaSouls::onMessage); + ClientCommandRegistrationCallback.EVENT.register(EnigmaSouls::registerCommands); 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); diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index f02eb319..ea6931e0 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -215,6 +215,9 @@ "text.autoconfig.skyblocker.option.locations.rift": "The Rift", "text.autoconfig.skyblocker.option.locations.rift.mirrorverseWaypoints": "Enable Mirrorverse Waypoints", + "text.autoconfig.skyblocker.option.locations.rift.enigmaSoulWaypoints": "Enable Enigma Soul Waypoints", + "text.autoconfig.skyblocker.option.locations.rift.enigmaSoulWaypoints.@Tooltip": "Note: Many enigma souls have a small task you must complete in order to get it, so its recommended to also watch a YouTube video when finding them.", + "text.autoconfig.skyblocker.option.locations.rift.highlightFoundEnigmaSouls": "Highlight Found Enigma Souls", "text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks": "McGrubber Stacks", "text.autoconfig.skyblocker.option.locations.rift.mcGrubberStacks.@Tooltip": "Used for calculating Motes sell prices.", @@ -270,6 +273,8 @@ "skyblocker.rift.iceNow": "Ice now!", "skyblocker.rift.mania": "Mania!", "skyblocker.rift.stakeNow": "Stake now!", + "skyblocker.rift.enigmaSouls.markAllFound": "§rMarked all enigma souls as found!", + "skyblocker.rift.enigmaSouls.markAllMissing": "§rMarked all enigma souls as missing!", "skyblocker.fairySouls.markAllFound": "§rMarked all fairy souls in the current island as found", "skyblocker.fairySouls.markAllMissing": "§rMarked all fairy souls in the current island as missing", "skyblocker.relics.markAllFound": "§rMarked all relics as found", diff --git a/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json b/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json deleted file mode 100644 index 2bc0296e..00000000 --- a/src/main/resources/assets/skyblocker/mirrorverse_waypoints.json +++ /dev/null @@ -1,1019 +0,0 @@ -{ - "sections": [ - { - "name": "Lava Path", - "waypoints": [ - { - "x": -101, - "y": 52, - "z": -116 - }, - { - "x": -99, - "y": 52, - "z": -110 - }, - { - "x": -95, - "y": 52, - "z": -108 - }, - { - "x": -88, - "y": 52, - "z": -107 - }, - { - "x": -95, - "y": 52, - "z": -114 - }, - { - "x": -95, - "y": 52, - "z": -109 - }, - { - "x": -84, - "y": 52, - "z": -112 - }, - { - "x": -91, - "y": 52, - "z": -108 - }, - { - "x": -94, - "y": 52, - "z": -116 - }, - { - "x": -88, - "y": 52, - "z": -112 - }, - { - "x": -101, - "y": 52, - "z": -108 - }, - { - "x": -94, - "y": 52, - "z": -114 - }, - { - "x": -85, - "y": 52, - "z": -112 - }, - { - "x": -88, - "y": 52, - "z": -114 - }, - { - "x": -90, - "y": 52, - "z": -110 - }, - { - "x": -84, - "y": 52, - "z": -113 - }, - { - "x": -90, - "y": 52, - "z": -116 - }, - { - "x": -105, - "y": 52, - "z": -113 - }, - { - "x": -82, - "y": 52, - "z": -112 - }, - { - "x": -90, - "y": 52, - "z": -112 - }, - { - "x": -88, - "y": 52, - "z": -111 - }, - { - "x": -82, - "y": 52, - "z": -111 - }, - { - "x": -104, - "y": 52, - "z": -112 - }, - { - "x": -87, - "y": 52, - "z": -107 - }, - { - "x": -100, - "y": 52, - "z": -108 - }, - { - "x": -86, - "y": 52, - "z": -109 - }, - { - "x": -91, - "y": 52, - "z": -110 - }, - { - "x": -96, - "y": 52, - "z": -108 - }, - { - "x": -102, - "y": 52, - "z": -111 - }, - { - "x": -96, - "y": 52, - "z": -115 - }, - { - "x": -97, - "y": 52, - "z": -116 - }, - { - "x": -83, - "y": 52, - "z": -111 - }, - { - "x": -84, - "y": 52, - "z": -107 - }, - { - "x": -90, - "y": 52, - "z": -115 - }, - { - "x": -86, - "y": 52, - "z": -107 - }, - { - "x": -97, - "y": 52, - "z": -112 - }, - { - "x": -86, - "y": 52, - "z": -113 - }, - { - "x": -92, - "y": 52, - "z": -110 - }, - { - "x": -95, - "y": 52, - "z": -111 - }, - { - "x": -90, - "y": 52, - "z": -114 - }, - { - "x": -93, - "y": 52, - "z": -108 - }, - { - "x": -98, - "y": 52, - "z": -116 - }, - { - "x": -98, - "y": 52, - "z": -115 - }, - { - "x": -90, - "y": 52, - "z": -107 - }, - { - "x": -98, - "y": 52, - "z": -112 - }, - { - "x": -98, - "y": 52, - "z": -109 - }, - { - "x": -98, - "y": 52, - "z": -113 - }, - { - "x": -100, - "y": 52, - "z": -116 - }, - { - "x": -96, - "y": 52, - "z": -114 - }, - { - "x": -86, - "y": 52, - "z": -110 - }, - { - "x": -93, - "y": 52, - "z": -109 - }, - { - "x": -88, - "y": 52, - "z": -110 - }, - { - "x": -94, - "y": 52, - "z": -115 - }, - { - "x": -84, - "y": 52, - "z": -111 - }, - { - "x": -84, - "y": 52, - "z": -108 - }, - { - "x": -86, - "y": 52, - "z": -115 - }, - { - "x": -98, - "y": 52, - "z": -110 - }, - { - "x": -102, - "y": 52, - "z": -108 - }, - { - "x": -92, - "y": 52, - "z": -114 - }, - { - "x": -102, - "y": 52, - "z": -114 - }, - { - "x": -85, - "y": 52, - "z": -109 - }, - { - "x": -86, - "y": 52, - "z": -112 - }, - { - "x": -104, - "y": 52, - "z": -113 - }, - { - "x": -105, - "y": 52, - "z": -112 - }, - { - "x": -91, - "y": 52, - "z": -114 - }, - { - "x": -100, - "y": 52, - "z": -112 - }, - { - "x": -93, - "y": 52, - "z": -110 - }, - { - "x": -91, - "y": 52, - "z": -112 - }, - { - "x": -101, - "y": 52, - "z": -112 - }, - { - "x": -92, - "y": 52, - "z": -108 - }, - { - "x": -82, - "y": 52, - "z": -113 - }, - { - "x": -87, - "y": 52, - "z": -115 - }, - { - "x": -84, - "y": 52, - "z": -109 - }, - { - "x": -88, - "y": 52, - "z": -113 - }, - { - "x": -92, - "y": 52, - "z": -116 - }, - { - "x": -96, - "y": 52, - "z": -111 - }, - { - "x": -96, - "y": 52, - "z": -116 - }, - { - "x": -98, - "y": 52, - "z": -108 - }, - { - "x": -98, - "y": 52, - "z": -114 - }, - { - "x": -96, - "y": 52, - "z": -112 - }, - { - "x": -85, - "y": 52, - "z": -107 - }, - { - "x": -102, - "y": 52, - "z": -115 - }, - { - "x": -87, - "y": 52, - "z": -110 - }, - { - "x": -100, - "y": 52, - "z": -113 - }, - { - "x": -103, - "y": 52, - "z": -114 - }, - { - "x": -102, - "y": 52, - "z": -116 - }, - { - "x": -95, - "y": 52, - "z": -110 - }, - { - "x": -89, - "y": 52, - "z": -107 - }, - { - "x": -92, - "y": 52, - "z": -113 - }, - { - "x": -100, - "y": 52, - "z": -110 - }, - { - "x": -100, - "y": 52, - "z": -115 - }, - { - "x": -86, - "y": 52, - "z": -114 - }, - { - "x": -88, - "y": 52, - "z": -115 - }, - { - "x": -92, - "y": 52, - "z": -112 - }, - { - "x": -100, - "y": 52, - "z": -114 - }, - { - "x": -91, - "y": 52, - "z": -116 - }, - { - "x": -102, - "y": 52, - "z": -110 - }, - { - "x": -102, - "y": 52, - "z": -112 - }, - { - "x": -93, - "y": 52, - "z": -116 - }, - { - "x": -90, - "y": 52, - "z": -111 - }, - { - "x": -104, - "y": 52, - "z": -114 - }, - { - "x": -83, - "y": 52, - "z": -112 - }, - { - "x": -83, - "y": 52, - "z": -113 - }, - { - "x": -100, - "y": 52, - "z": -109 - }, - { - "x": -102, - "y": 52, - "z": -109 - }, - { - "x": -90, - "y": 52, - "z": -108 - }, - { - "x": -97, - "y": 52, - "z": -108 - } - ] - }, - { - "name": "Upside Down Parkour", - "waypoints": [ - { - "x": -137, - "y": 39, - "z": -104 - }, - { - "x": -169, - "y": 42, - "z": -116 - }, - { - "x": -173, - "y": 43, - "z": -112 - }, - { - "x": -197, - "y": 39, - "z": -92 - }, - { - "x": -161, - "y": 39, - "z": -92 - }, - { - "x": -137, - "y": 40, - "z": -116 - }, - { - "x": -213, - "y": 41, - "z": -116 - }, - { - "x": -173, - "y": 41, - "z": -96 - }, - { - "x": -205, - "y": 41, - "z": -100 - }, - { - "x": -205, - "y": 43, - "z": -108 - }, - { - "x": -137, - "y": 41, - "z": -96 - }, - { - "x": -145, - "y": 40, - "z": -104 - }, - { - "x": -149, - "y": 43, - "z": -112 - }, - { - "x": -189, - "y": 42, - "z": -120 - }, - { - "x": -157, - "y": 41, - "z": -104 - }, - { - "x": -189, - "y": 43, - "z": -116 - }, - { - "x": -193, - "y": 42, - "z": -104 - }, - { - "x": -161, - "y": 40, - "z": -120 - }, - { - "x": -221, - "y": 43, - "z": -104 - }, - { - "x": -185, - "y": 41, - "z": -108 - }, - { - "x": -141, - "y": 41, - "z": -120 - }, - { - "x": -157, - "y": 39, - "z": -116 - }, - { - "x": -153, - "y": 40, - "z": -100 - }, - { - "x": -209, - "y": 43, - "z": -120 - }, - { - "x": -129, - "y": 39, - "z": -108 - }, - { - "x": -189, - "y": 43, - "z": -100 - }, - { - "x": -141, - "y": 42, - "z": -100 - }, - { - "x": -133, - "y": 40, - "z": -108 - }, - { - "x": -209, - "y": 42, - "z": -104 - }, - { - "x": -173, - "y": 41, - "z": -100 - }, - { - "x": -189, - "y": 43, - "z": -112 - }, - { - "x": -145, - "y": 40, - "z": -108 - }, - { - "x": -217, - "y": 42, - "z": -108 - }, - { - "x": -169, - "y": 41, - "z": -120 - }, - { - "x": -165, - "y": 43, - "z": -109 - }, - { - "x": -145, - "y": 42, - "z": -116 - }, - { - "x": -165, - "y": 42, - "z": -104 - }, - { - "x": -181, - "y": 40, - "z": -112 - }, - { - "x": -193, - "y": 41, - "z": -108 - }, - { - "x": -201, - "y": 40, - "z": -96 - }, - { - "x": -137, - "y": 41, - "z": -124 - }, - { - "x": -173, - "y": 43, - "z": -108 - }, - { - "x": -133, - "y": 40, - "z": -100 - }, - { - "x": -201, - "y": 40, - "z": -116 - }, - { - "x": -185, - "y": 41, - "z": -108 - }, - { - "x": -125, - "y": 39, - "z": -108 - }, - { - "x": -161, - "y": 42, - "z": -112 - }, - { - "x": -165, - "y": 40, - "z": -96 - }, - { - "x": -141, - "y": 39, - "z": -112 - }, - { - "x": -177, - "y": 39, - "z": -92 - }, - { - "x": -213, - "y": 41, - "z": -112 - }, - { - "x": -153, - "y": 42, - "z": -108 - }, - { - "x": -205, - "y": 42, - "z": -120 - }, - { - "x": -197, - "y": 43, - "z": -112 - }, - { - "x": -181, - "y": 42, - "z": -104 - }, - { - "x": -165, - "y": 41, - "z": -100 - }, - { - "x": -193, - "y": 42, - "z": -96 - }, - { - "x": -133, - "y": 40, - "z": -120 - }, - { - "x": -185, - "y": 41, - "z": -100 - }, - { - "x": -165, - "y": 41, - "z": -124 - }, - { - "x": -177, - "y": 40, - "z": -104 - }, - { - "x": -157, - "y": 40, - "z": -96 - }, - { - "x": -205, - "y": 41, - "z": -116 - }, - { - "x": -181, - "y": 40, - "z": -96 - }, - { - "x": -201, - "y": 43, - "z": -108 - }, - { - "x": -185, - "y": 41, - "z": -116 - } - ] - }, - { - "name": "Turbulator Parkour", - "waypoints": [ - { - "x": -302, - "y": 34, - "z": -107 - }, - { - "x": -304, - "y": 52, - "z": -109 - }, - { - "x": -306, - "y": 16, - "z": -107 - }, - { - "x": -304, - "y": 12, - "z": -107 - }, - { - "x": -308, - "y": 6, - "z": -105 - }, - { - "x": -302, - "y": 44, - "z": -107 - }, - { - "x": -306, - "y": 24, - "z": -109 - }, - { - "x": -302, - "y": 18, - "z": -111 - }, - { - "x": -300, - "y": 36, - "z": -109 - }, - { - "x": -304, - "y": 30, - "z": -103 - }, - { - "x": -302, - "y": 26, - "z": -111 - }, - { - "x": -308, - "y": 14, - "z": -103 - }, - { - "x": -300, - "y": 46, - "z": -103 - }, - { - "x": -300, - "y": 10, - "z": -111 - }, - { - "x": -300, - "y": 20, - "z": -107 - }, - { - "x": -306, - "y": 54, - "z": -111 - }, - { - "x": -306, - "y": 4, - "z": -103 - }, - { - "x": -300, - "y": 28, - "z": -107 - }, - { - "x": -306, - "y": 42, - "z": -111 - }, - { - "x": -308, - "y": 50, - "z": -105 - }, - { - "x": -304, - "y": 48, - "z": -107 - }, - { - "x": -302, - "y": 38, - "z": -105 - }, - { - "x": -304, - "y": 22, - "z": -111 - }, - { - "x": -304, - "y": 2, - "z": -107 - }, - { - "x": -304, - "y": 40, - "z": -107 - }, - { - "x": -306, - "y": 32, - "z": -105 - }, - { - "x": -304, - "y": 8, - "z": -109 - } - ] - } - ] -} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/rift/enigma_soul_waypoints.json b/src/main/resources/assets/skyblocker/rift/enigma_soul_waypoints.json new file mode 100644 index 00000000..5c428fed --- /dev/null +++ b/src/main/resources/assets/skyblocker/rift/enigma_soul_waypoints.json @@ -0,0 +1,215 @@ +{ + "credit": "Official Hypixel Wiki - https://wiki.hypixel.net", + "waypoints": [ + { + "x": -15, + "y": 91, + "z": 94 + }, + { + "x": -27, + "y": 71, + "z": 90 + }, + { + "x": -6, + "y": 60, + "z": 226 + }, + { + "x": -142, + "y": 68, + "z": 174 + }, + { + "x": -137, + "y": 51, + "z": 120 + }, + { + "x": -129, + "y": 72, + "z": 77 + }, + { + "x": -27, + "y": 89, + "z": 136 + }, + { + "x": -137, + "y": 133, + "z": 156 + }, + { + "x": -108, + "y": 117, + "z": 123 + }, + { + "x": -115, + "y": 69, + "z": 61 + }, + { + "x": 43, + "y": 91, + "z": 56 + }, + { + "x": -168, + "y": 81, + "z": 12 + }, + { + "x": -204, + "y": 75, + "z": 49 + }, + { + "x": -93, + "y": 73, + "z": 36 + }, + { + "x": -102, + "y": 72, + "z": -103 + }, + { + "x": -34, + "y": 71, + "z": -88 + }, + { + "x": -106, + "y": 78, + "z": -101 + }, + { + "x": -95, + "y": 76, + "z": -82 + }, + { + "x": -94, + "y": 70, + "z": -84 + }, + { + "x": -38, + "y": 44, + "z": 130 + }, + { + "x": -88, + "y": 79, + "z": -102 + }, + { + "x": -76, + "y": 90, + "z": -149 + }, + { + "x": -106, + "y": 249, + "z": -149 + }, + { + "x": -74, + "y": 65, + "z": -119 + }, + { + "x": -77, + "y": 72, + "z": -176 + }, + { + "x": -21, + "y": 72, + "z": -18 + }, + { + "x": -88, + "y": 20, + "z": 0 + }, + { + "x": 27, + "y": 71, + "z": -77 + }, + { + "x": 42, + "y": 88, + "z": -91 + }, + { + "x": 47, + "y": 68, + "z": -59 + }, + { + "x": -34, + "y": 66, + "z": -25 + }, + { + "x": -23, + "y": 84, + "z": -92 + }, + { + "x": 40, + "y": 70, + "z": 27 + }, + { + "x": 38, + "y": 63, + "z": -198 + }, + { + "x": 3, + "y": 68, + "z": -204 + }, + { + "x": -161, + "y": 98, + "z": -72 + }, + { + "x": 255, + "y": 74, + "z": 160 + }, + { + "x": 262, + "y": 118, + "z": 94 + }, + { + "x": 182, + "y": 92, + "z": 124 + }, + { + "x": 266, + "y": 60, + "z": 145 + }, + { + "x": 232, + "y": 94, + "z": 168 + }, + { + "x": 256, + "y": 130, + "z": 75 + } + ] +} \ No newline at end of file diff --git a/src/main/resources/assets/skyblocker/rift/mirrorverse_waypoints.json b/src/main/resources/assets/skyblocker/rift/mirrorverse_waypoints.json new file mode 100644 index 00000000..2bc0296e --- /dev/null +++ b/src/main/resources/assets/skyblocker/rift/mirrorverse_waypoints.json @@ -0,0 +1,1019 @@ +{ + "sections": [ + { + "name": "Lava Path", + "waypoints": [ + { + "x": -101, + "y": 52, + "z": -116 + }, + { + "x": -99, + "y": 52, + "z": -110 + }, + { + "x": -95, + "y": 52, + "z": -108 + }, + { + "x": -88, + "y": 52, + "z": -107 + }, + { + "x": -95, + "y": 52, + "z": -114 + }, + { + "x": -95, + "y": 52, + "z": -109 + }, + { + "x": -84, + "y": 52, + "z": -112 + }, + { + "x": -91, + "y": 52, + "z": -108 + }, + { + "x": -94, + "y": 52, + "z": -116 + }, + { + "x": -88, + "y": 52, + "z": -112 + }, + { + "x": -101, + "y": 52, + "z": -108 + }, + { + "x": -94, + "y": 52, + "z": -114 + }, + { + "x": -85, + "y": 52, + "z": -112 + }, + { + "x": -88, + "y": 52, + "z": -114 + }, + { + "x": -90, + "y": 52, + "z": -110 + }, + { + "x": -84, + "y": 52, + "z": -113 + }, + { + "x": -90, + "y": 52, + "z": -116 + }, + { + "x": -105, + "y": 52, + "z": -113 + }, + { + "x": -82, + "y": 52, + "z": -112 + }, + { + "x": -90, + "y": 52, + "z": -112 + }, + { + "x": -88, + "y": 52, + "z": -111 + }, + { + "x": -82, + "y": 52, + "z": -111 + }, + { + "x": -104, + "y": 52, + "z": -112 + }, + { + "x": -87, + "y": 52, + "z": -107 + }, + { + "x": -100, + "y": 52, + "z": -108 + }, + { + "x": -86, + "y": 52, + "z": -109 + }, + { + "x": -91, + "y": 52, + "z": -110 + }, + { + "x": -96, + "y": 52, + "z": -108 + }, + { + "x": -102, + "y": 52, + "z": -111 + }, + { + "x": -96, + "y": 52, + "z": -115 + }, + { + "x": -97, + "y": 52, + "z": -116 + }, + { + "x": -83, + "y": 52, + "z": -111 + }, + { + "x": -84, + "y": 52, + "z": -107 + }, + { + "x": -90, + "y": 52, + "z": -115 + }, + { + "x": -86, + "y": 52, + "z": -107 + }, + { + "x": -97, + "y": 52, + "z": -112 + }, + { + "x": -86, + "y": 52, + "z": -113 + }, + { + "x": -92, + "y": 52, + "z": -110 + }, + { + "x": -95, + "y": 52, + "z": -111 + }, + { + "x": -90, + "y": 52, + "z": -114 + }, + { + "x": -93, + "y": 52, + "z": -108 + }, + { + "x": -98, + "y": 52, + "z": -116 + }, + { + "x": -98, + "y": 52, + "z": -115 + }, + { + "x": -90, + "y": 52, + "z": -107 + }, + { + "x": -98, + "y": 52, + "z": -112 + }, + { + "x": -98, + "y": 52, + "z": -109 + }, + { + "x": -98, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -116 + }, + { + "x": -96, + "y": 52, + "z": -114 + }, + { + "x": -86, + "y": 52, + "z": -110 + }, + { + "x": -93, + "y": 52, + "z": -109 + }, + { + "x": -88, + "y": 52, + "z": -110 + }, + { + "x": -94, + "y": 52, + "z": -115 + }, + { + "x": -84, + "y": 52, + "z": -111 + }, + { + "x": -84, + "y": 52, + "z": -108 + }, + { + "x": -86, + "y": 52, + "z": -115 + }, + { + "x": -98, + "y": 52, + "z": -110 + }, + { + "x": -102, + "y": 52, + "z": -108 + }, + { + "x": -92, + "y": 52, + "z": -114 + }, + { + "x": -102, + "y": 52, + "z": -114 + }, + { + "x": -85, + "y": 52, + "z": -109 + }, + { + "x": -86, + "y": 52, + "z": -112 + }, + { + "x": -104, + "y": 52, + "z": -113 + }, + { + "x": -105, + "y": 52, + "z": -112 + }, + { + "x": -91, + "y": 52, + "z": -114 + }, + { + "x": -100, + "y": 52, + "z": -112 + }, + { + "x": -93, + "y": 52, + "z": -110 + }, + { + "x": -91, + "y": 52, + "z": -112 + }, + { + "x": -101, + "y": 52, + "z": -112 + }, + { + "x": -92, + "y": 52, + "z": -108 + }, + { + "x": -82, + "y": 52, + "z": -113 + }, + { + "x": -87, + "y": 52, + "z": -115 + }, + { + "x": -84, + "y": 52, + "z": -109 + }, + { + "x": -88, + "y": 52, + "z": -113 + }, + { + "x": -92, + "y": 52, + "z": -116 + }, + { + "x": -96, + "y": 52, + "z": -111 + }, + { + "x": -96, + "y": 52, + "z": -116 + }, + { + "x": -98, + "y": 52, + "z": -108 + }, + { + "x": -98, + "y": 52, + "z": -114 + }, + { + "x": -96, + "y": 52, + "z": -112 + }, + { + "x": -85, + "y": 52, + "z": -107 + }, + { + "x": -102, + "y": 52, + "z": -115 + }, + { + "x": -87, + "y": 52, + "z": -110 + }, + { + "x": -100, + "y": 52, + "z": -113 + }, + { + "x": -103, + "y": 52, + "z": -114 + }, + { + "x": -102, + "y": 52, + "z": -116 + }, + { + "x": -95, + "y": 52, + "z": -110 + }, + { + "x": -89, + "y": 52, + "z": -107 + }, + { + "x": -92, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -110 + }, + { + "x": -100, + "y": 52, + "z": -115 + }, + { + "x": -86, + "y": 52, + "z": -114 + }, + { + "x": -88, + "y": 52, + "z": -115 + }, + { + "x": -92, + "y": 52, + "z": -112 + }, + { + "x": -100, + "y": 52, + "z": -114 + }, + { + "x": -91, + "y": 52, + "z": -116 + }, + { + "x": -102, + "y": 52, + "z": -110 + }, + { + "x": -102, + "y": 52, + "z": -112 + }, + { + "x": -93, + "y": 52, + "z": -116 + }, + { + "x": -90, + "y": 52, + "z": -111 + }, + { + "x": -104, + "y": 52, + "z": -114 + }, + { + "x": -83, + "y": 52, + "z": -112 + }, + { + "x": -83, + "y": 52, + "z": -113 + }, + { + "x": -100, + "y": 52, + "z": -109 + }, + { + "x": -102, + "y": 52, + "z": -109 + }, + { + "x": -90, + "y": 52, + "z": -108 + }, + { + "x": -97, + "y": 52, + "z": -108 + } + ] + }, + { + "name": "Upside Down Parkour", + "waypoints": [ + { + "x": -137, + "y": 39, + "z": -104 + }, + { + "x": -169, + "y": 42, + "z": -116 + }, + { + "x": -173, + "y": 43, + "z": -112 + }, + { + "x": -197, + "y": 39, + "z": -92 + }, + { + "x": -161, + "y": 39, + "z": -92 + }, + { + "x": -137, + "y": 40, + "z": -116 + }, + { + "x": -213, + "y": 41, + "z": -116 + }, + { + "x": -173, + "y": 41, + "z": -96 + }, + { + "x": -205, + "y": 41, + "z": -100 + }, + { + "x": -205, + "y": 43, + "z": -108 + }, + { + "x": -137, + "y": 41, + "z": -96 + }, + { + "x": -145, + "y": 40, + "z": -104 + }, + { + "x": -149, + "y": 43, + "z": -112 + }, + { + "x": -189, + "y": 42, + "z": -120 + }, + { + "x": -157, + "y": 41, + "z": -104 + }, + { + "x": -189, + "y": 43, + "z": -116 + }, + { + "x": -193, + "y": 42, + "z": -104 + }, + { + "x": -161, + "y": 40, + "z": -120 + }, + { + "x": -221, + "y": 43, + "z": -104 + }, + { + "x": -185, + "y": 41, + "z": -108 + }, + { + "x": -141, + "y": 41, + "z": -120 + }, + { + "x": -157, + "y": 39, + "z": -116 + }, + { + "x": -153, + "y": 40, + "z": -100 + }, + { + "x": -209, + "y": 43, + "z": -120 + }, + { + "x": -129, + "y": 39, + "z": -108 + }, + { + "x": -189, + "y": 43, + "z": -100 + }, + { + "x": -141, + "y": 42, + "z": -100 + }, + { + "x": -133, + "y": 40, + "z": -108 + }, + { + "x": -209, + "y": 42, + "z": -104 + }, + { + "x": -173, + "y": 41, + "z": -100 + }, + { + "x": -189, + "y": 43, + "z": -112 + }, + { + "x": -145, + "y": 40, + "z": -108 + }, + { + "x": -217, + "y": 42, + "z": -108 + }, + { + "x": -169, + "y": 41, + "z": -120 + }, + { + "x": -165, + "y": 43, + "z": -109 + }, + { + "x": -145, + "y": 42, + "z": -116 + }, + { + "x": -165, + "y": 42, + "z": -104 + }, + { + "x": -181, + "y": 40, + "z": -112 + }, + { + "x": -193, + "y": 41, + "z": -108 + }, + { + "x": -201, + "y": 40, + "z": -96 + }, + { + "x": -137, + "y": 41, + "z": -124 + }, + { + "x": -173, + "y": 43, + "z": -108 + }, + { + "x": -133, + "y": 40, + "z": -100 + }, + { + "x": -201, + "y": 40, + "z": -116 + }, + { + "x": -185, + "y": 41, + "z": -108 + }, + { + "x": -125, + "y": 39, + "z": -108 + }, + { + "x": -161, + "y": 42, + "z": -112 + }, + { + "x": -165, + "y": 40, + "z": -96 + }, + { + "x": -141, + "y": 39, + "z": -112 + }, + { + "x": -177, + "y": 39, + "z": -92 + }, + { + "x": -213, + "y": 41, + "z": -112 + }, + { + "x": -153, + "y": 42, + "z": -108 + }, + { + "x": -205, + "y": 42, + "z": -120 + }, + { + "x": -197, + "y": 43, + "z": -112 + }, + { + "x": -181, + "y": 42, + "z": -104 + }, + { + "x": -165, + "y": 41, + "z": -100 + }, + { + "x": -193, + "y": 42, + "z": -96 + }, + { + "x": -133, + "y": 40, + "z": -120 + }, + { + "x": -185, + "y": 41, + "z": -100 + }, + { + "x": -165, + "y": 41, + "z": -124 + }, + { + "x": -177, + "y": 40, + "z": -104 + }, + { + "x": -157, + "y": 40, + "z": -96 + }, + { + "x": -205, + "y": 41, + "z": -116 + }, + { + "x": -181, + "y": 40, + "z": -96 + }, + { + "x": -201, + "y": 43, + "z": -108 + }, + { + "x": -185, + "y": 41, + "z": -116 + } + ] + }, + { + "name": "Turbulator Parkour", + "waypoints": [ + { + "x": -302, + "y": 34, + "z": -107 + }, + { + "x": -304, + "y": 52, + "z": -109 + }, + { + "x": -306, + "y": 16, + "z": -107 + }, + { + "x": -304, + "y": 12, + "z": -107 + }, + { + "x": -308, + "y": 6, + "z": -105 + }, + { + "x": -302, + "y": 44, + "z": -107 + }, + { + "x": -306, + "y": 24, + "z": -109 + }, + { + "x": -302, + "y": 18, + "z": -111 + }, + { + "x": -300, + "y": 36, + "z": -109 + }, + { + "x": -304, + "y": 30, + "z": -103 + }, + { + "x": -302, + "y": 26, + "z": -111 + }, + { + "x": -308, + "y": 14, + "z": -103 + }, + { + "x": -300, + "y": 46, + "z": -103 + }, + { + "x": -300, + "y": 10, + "z": -111 + }, + { + "x": -300, + "y": 20, + "z": -107 + }, + { + "x": -306, + "y": 54, + "z": -111 + }, + { + "x": -306, + "y": 4, + "z": -103 + }, + { + "x": -300, + "y": 28, + "z": -107 + }, + { + "x": -306, + "y": 42, + "z": -111 + }, + { + "x": -308, + "y": 50, + "z": -105 + }, + { + "x": -304, + "y": 48, + "z": -107 + }, + { + "x": -302, + "y": 38, + "z": -105 + }, + { + "x": -304, + "y": 22, + "z": -111 + }, + { + "x": -304, + "y": 2, + "z": -107 + }, + { + "x": -304, + "y": 40, + "z": -107 + }, + { + "x": -306, + "y": 32, + "z": -105 + }, + { + "x": -304, + "y": 8, + "z": -109 + } + ] + } + ] +} \ No newline at end of file -- cgit