aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main/java/de/hysky/skyblocker/SkyblockerMod.java2
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java28
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java1
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java68
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoint.java15
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java141
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/PosUtils.java9
-rw-r--r--src/main/java/de/hysky/skyblocker/utils/Utils.java5
-rw-r--r--src/main/resources/assets/skyblocker/crimson/kuudra/pearl_waypoints.json96
-rw-r--r--src/main/resources/assets/skyblocker/crimson/kuudra/safe_spot_waypoints.json19
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json7
12 files changed, 406 insertions, 0 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
index 3fca09ce..e0af43e2 100644
--- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
+++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java
@@ -5,6 +5,7 @@ import com.google.gson.GsonBuilder;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
import de.hysky.skyblocker.debug.Debug;
import de.hysky.skyblocker.skyblock.*;
+import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.dungeon.*;
import de.hysky.skyblocker.skyblock.dungeon.partyfinder.PartyFinderScreen;
import de.hysky.skyblocker.skyblock.dungeon.puzzle.CreeperBeams;
@@ -133,6 +134,7 @@ public class SkyblockerMod implements ClientModInitializer {
SecretsTracker.init();
ApiUtils.init();
Debug.init();
+ Kuudra.init();
RenderHelper.init();
containerSolverManager.init();
statusBarTracker.init();
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index a7569adb..aeb2efd5 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -608,6 +608,9 @@ public class SkyblockerConfig {
public Barn barn = new Barn();
@SerialEntry
+ public CrimsonIsle crimsonIsle = new CrimsonIsle();
+
+ @SerialEntry
public Dungeons dungeons = new Dungeons();
@SerialEntry
@@ -913,6 +916,31 @@ public class SkyblockerConfig {
public boolean solveTreasureHunter = true;
}
+ public static class CrimsonIsle {
+ @SerialEntry
+ public Kuudra kuudra = new Kuudra();
+ }
+
+ public static class Kuudra {
+ @SerialEntry
+ public boolean supplyWaypoints = true;
+
+ @SerialEntry
+ public boolean supplyPileWaypoints = true;
+
+ @SerialEntry
+ public boolean fuelWaypoints = true;
+
+ @SerialEntry
+ public boolean safeSpotWaypoints = true;
+
+ @SerialEntry
+ public boolean pearlWaypoints = true;
+
+ @SerialEntry
+ public Waypoint.Type waypointType = Waypoint.Type.WAYPOINT;
+ }
+
public static class Rift {
@SerialEntry
public boolean mirrorverseWaypoints = true;
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
index 3a2601ad..70578822 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfigManager.java
@@ -73,6 +73,7 @@ public class SkyblockerConfigManager {
.category(GeneralCategory.create(defaults, config))
.category(DungeonsCategory.create(defaults, config))
.category(DwarvenMinesCategory.create(defaults, config))
+ .category(CrimsonIsleCategory.create(defaults, config))
.category(LocationsCategory.create(defaults, config))
.category(SlayersCategory.create(defaults, config))
.category(QuickNavigationCategory.create(defaults, config))
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java
new file mode 100644
index 00000000..0a49d83f
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java
@@ -0,0 +1,68 @@
+package de.hysky.skyblocker.config.categories;
+
+import de.hysky.skyblocker.config.ConfigUtils;
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.utils.waypoint.Waypoint;
+import dev.isxander.yacl3.api.ConfigCategory;
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.api.OptionDescription;
+import dev.isxander.yacl3.api.OptionGroup;
+import net.minecraft.text.Text;
+
+public class CrimsonIsleCategory {
+
+ public static ConfigCategory create(SkyblockerConfig defaults, SkyblockerConfig config) {
+ return ConfigCategory.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.category.crimsonIsle"))
+
+ //Kuudra
+ .group(OptionGroup.createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra"))
+ .collapsed(false)
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.supplyWaypoints"))
+ .binding(defaults.locations.crimsonIsle.kuudra.supplyWaypoints,
+ () -> config.locations.crimsonIsle.kuudra.supplyWaypoints,
+ newValue -> config.locations.crimsonIsle.kuudra.supplyWaypoints = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.supplyPileWaypoints"))
+ .binding(defaults.locations.crimsonIsle.kuudra.supplyPileWaypoints,
+ () -> config.locations.crimsonIsle.kuudra.supplyPileWaypoints,
+ newValue -> config.locations.crimsonIsle.kuudra.supplyPileWaypoints = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.fuelWaypoints"))
+ .binding(defaults.locations.crimsonIsle.kuudra.fuelWaypoints,
+ () -> config.locations.crimsonIsle.kuudra.fuelWaypoints,
+ newValue -> config.locations.crimsonIsle.kuudra.fuelWaypoints = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.safeSpotWaypoints"))
+ .binding(defaults.locations.crimsonIsle.kuudra.safeSpotWaypoints,
+ () -> config.locations.crimsonIsle.kuudra.safeSpotWaypoints,
+ newValue -> config.locations.crimsonIsle.kuudra.safeSpotWaypoints = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.pearlWaypoints"))
+ .binding(defaults.locations.crimsonIsle.kuudra.pearlWaypoints,
+ () -> config.locations.crimsonIsle.kuudra.pearlWaypoints,
+ newValue -> config.locations.crimsonIsle.kuudra.pearlWaypoints = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Waypoint.Type>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.general.waypoints.waypointType"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.waypoints.waypointType.@Tooltip")))
+ .binding(defaults.locations.crimsonIsle.kuudra.waypointType,
+ () -> config.locations.crimsonIsle.kuudra.waypointType,
+ newValue -> config.locations.crimsonIsle.kuudra.waypointType = newValue)
+ .controller(ConfigUtils::createEnumCyclingListController)
+ .build())
+ .build())
+ .build();
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
new file mode 100644
index 00000000..007454f4
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
@@ -0,0 +1,15 @@
+package de.hysky.skyblocker.skyblock.crimson.kuudra;
+
+import de.hysky.skyblocker.utils.scheduler.Scheduler;
+import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientLifecycleEvents;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+
+public class Kuudra {
+ public static final String LOCATION = "kuudra";
+
+ public static void init() {
+ WorldRenderEvents.AFTER_TRANSLUCENT.register(KuudraWaypoints::render);
+ ClientLifecycleEvents.CLIENT_STARTED.register(KuudraWaypoints::load);
+ Scheduler.INSTANCE.scheduleCyclic(KuudraWaypoints::tick, 20);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoint.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoint.java
new file mode 100644
index 00000000..bba2689b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoint.java
@@ -0,0 +1,15 @@
+package de.hysky.skyblocker.skyblock.crimson.kuudra;
+
+import java.util.function.Supplier;
+
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.waypoint.Waypoint;
+import net.minecraft.util.math.BlockPos;
+
+class KuudraWaypoint extends Waypoint {
+ private static final Supplier<Type> TYPE = () -> SkyblockerConfigManager.get().locations.crimsonIsle.kuudra.waypointType;
+
+ KuudraWaypoint(BlockPos pos, float[] colorComponents) {
+ super(pos, TYPE, colorComponents, false);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java
new file mode 100644
index 00000000..b1e9daa1
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/KuudraWaypoints.java
@@ -0,0 +1,141 @@
+package de.hysky.skyblocker.skyblock.crimson.kuudra;
+
+import java.io.BufferedReader;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Function;
+
+import org.slf4j.Logger;
+
+import com.google.gson.JsonElement;
+import com.google.gson.JsonParser;
+import com.mojang.logging.LogUtils;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.JsonOps;
+
+import de.hysky.skyblocker.SkyblockerMod;
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.utils.PosUtils;
+import de.hysky.skyblocker.utils.Utils;
+import it.unimi.dsi.fastutil.objects.ObjectArrayList;
+import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import net.minecraft.util.Identifier;
+
+public class KuudraWaypoints {
+ private static final Logger LOGGER = LogUtils.getLogger();
+ private static final float[] SUPPLIES_COLOR = { 255f / 255f, 0f, 0f };
+ private static final float[] FUEL_COLOR = { 250f / 255f, 217 / 255f, 2f / 255f };
+ private static final float[] PEARL_COLOR = { 57f / 255f, 117f / 255f, 125f / 255f };
+ private static final float[] SAFE_SPOT_COLOR = { 255f / 255f, 85f / 255f, 255f / 255f };
+ private static final ObjectArrayList<KuudraWaypoint> SAFE_SPOT_WAYPOINTS = new ObjectArrayList<>();
+ private static final ObjectArrayList<KuudraWaypoint> PEARL_WAYPOINTS = new ObjectArrayList<>();
+ private static final Function<float[], Codec<List<KuudraWaypoint>>> CODEC = cc -> PosUtils.ALT_BLOCK_POS_CODEC.xmap(
+ pos -> new KuudraWaypoint(pos, cc),
+ waypoint -> waypoint.pos)
+ .listOf();
+
+ //Use non final lists and swap them out to avoid ConcurrentModificationExceptions
+ private static ObjectArrayList<KuudraWaypoint> supplyWaypoints = ObjectArrayList.of();
+ private static ObjectArrayList<KuudraWaypoint> supplyPileWaypoints = ObjectArrayList.of();
+ private static ObjectArrayList<KuudraWaypoint> fuelWaypoints = ObjectArrayList.of();
+ private static boolean loaded;
+
+ static void load(MinecraftClient client) {
+ CompletableFuture<Void> safeSpots = loadWaypoints(client, new Identifier(SkyblockerMod.NAMESPACE, "crimson/kuudra/safe_spot_waypoints.json"), SAFE_SPOT_WAYPOINTS, SAFE_SPOT_COLOR);
+ CompletableFuture<Void> pearls = loadWaypoints(client, new Identifier(SkyblockerMod.NAMESPACE, "crimson/kuudra/pearl_waypoints.json"), PEARL_WAYPOINTS, PEARL_COLOR);
+
+ CompletableFuture.allOf(safeSpots, pearls).whenComplete((_result, _throwable) -> loaded = true);
+ }
+
+ private static CompletableFuture<Void> loadWaypoints(MinecraftClient client, Identifier file, ObjectArrayList<KuudraWaypoint> list, float[] colorComponents) {
+ return CompletableFuture.supplyAsync(() -> {
+ try (BufferedReader reader = client.getResourceManager().openAsReader(file)) {
+ return CODEC.apply(colorComponents).parse(JsonOps.INSTANCE, getWaypoints(reader)).result().orElseThrow();
+ } catch (Exception e) {
+ LOGGER.error("[Skyblocker Kuudra Waypoints] Failed to load kuudra waypoints from: {}", file, e);
+
+ return List.<KuudraWaypoint>of();
+ }
+ }).thenAccept(list::addAll);
+ }
+
+ private static JsonElement getWaypoints(BufferedReader reader) {
+ return JsonParser.parseReader(reader).getAsJsonObject().getAsJsonArray("waypoints");
+ }
+
+ static void tick() {
+ MinecraftClient client = MinecraftClient.getInstance();
+ SkyblockerConfig.Kuudra config = SkyblockerConfigManager.get().locations.crimsonIsle.kuudra;
+
+ if (Utils.isInKuudra() && (config.supplyWaypoints || config.fuelWaypoints || config.supplyPileWaypoints)) {
+ List<ArmorStandEntity> armorStands = client.world.getEntitiesByClass(ArmorStandEntity.class, client.player.getBoundingBox().expand(500d), ArmorStandEntity::hasCustomName);
+ ObjectArrayList<KuudraWaypoint> supplies = new ObjectArrayList<>();
+ ObjectArrayList<KuudraWaypoint> supplyPiles = new ObjectArrayList<>();
+ ObjectArrayList<KuudraWaypoint> fuelCells = new ObjectArrayList<>();
+
+ for (ArmorStandEntity armorStand : armorStands) {
+ String name = armorStand.getName().getString();
+
+ if (config.supplyWaypoints && name.contains("SUPPLIES")) {
+ supplies.add(new KuudraWaypoint(armorStand.getBlockPos(), SUPPLIES_COLOR));
+
+ continue;
+ }
+
+ if (config.supplyPileWaypoints && name.contains("SNEAK + PUNCH")) {
+ supplyPiles.add(new KuudraWaypoint(armorStand.getBlockPos(), SUPPLIES_COLOR));
+
+ continue;
+ }
+
+ if (config.fuelWaypoints && name.contains("FUEL CELL")) {
+ fuelCells.add(new KuudraWaypoint(armorStand.getBlockPos(), FUEL_COLOR));
+ }
+ }
+
+ supplyWaypoints = supplies;
+ supplyPileWaypoints = supplyPiles;
+ fuelWaypoints = fuelCells;
+ }
+ }
+
+ static void render(WorldRenderContext context) {
+ SkyblockerConfig.Kuudra config = SkyblockerConfigManager.get().locations.crimsonIsle.kuudra;
+
+ if (Utils.isInKuudra() && loaded) {
+ if (config.supplyWaypoints) {
+ for (KuudraWaypoint waypoint : supplyWaypoints) {
+ waypoint.render(context);
+ }
+ }
+
+ if (config.supplyPileWaypoints) {
+ for (KuudraWaypoint waypoint : supplyPileWaypoints) {
+ waypoint.render(context);
+ }
+ }
+
+ if (config.fuelWaypoints) {
+ for (KuudraWaypoint waypoint : fuelWaypoints) {
+ waypoint.render(context);
+ }
+ }
+
+ if (config.safeSpotWaypoints) {
+ for (KuudraWaypoint waypoint : SAFE_SPOT_WAYPOINTS) {
+ waypoint.render(context);
+ }
+ }
+
+ //TODO maybe have "dynamic" waypoints that draw a line to the actual spot
+ if (config.pearlWaypoints) {
+ for (KuudraWaypoint waypoint : PEARL_WAYPOINTS) {
+ waypoint.render(context);
+ }
+ }
+ }
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/utils/PosUtils.java b/src/main/java/de/hysky/skyblocker/utils/PosUtils.java
index 6a34b060..73ada889 100644
--- a/src/main/java/de/hysky/skyblocker/utils/PosUtils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/PosUtils.java
@@ -1,8 +1,17 @@
package de.hysky.skyblocker.utils;
+import com.mojang.serialization.Codec;
+import com.mojang.serialization.codecs.RecordCodecBuilder;
+
import net.minecraft.util.math.BlockPos;
public final class PosUtils {
+ public static final Codec<BlockPos> ALT_BLOCK_POS_CODEC = RecordCodecBuilder.create(instance -> instance.group(
+ Codec.INT.fieldOf("x").forGetter(BlockPos::getX),
+ Codec.INT.fieldOf("y").forGetter(BlockPos::getY),
+ Codec.INT.fieldOf("z").forGetter(BlockPos::getZ))
+ .apply(instance, BlockPos::new));
+
public static BlockPos parsePosString(String posData) {
String[] posArray = posData.split(",");
return new BlockPos(Integer.parseInt(posArray[0]), Integer.parseInt(posArray[1]), Integer.parseInt(posArray[2]));
diff --git a/src/main/java/de/hysky/skyblocker/utils/Utils.java b/src/main/java/de/hysky/skyblocker/utils/Utils.java
index 3f07622c..b9c50561 100644
--- a/src/main/java/de/hysky/skyblocker/utils/Utils.java
+++ b/src/main/java/de/hysky/skyblocker/utils/Utils.java
@@ -3,6 +3,7 @@ package de.hysky.skyblocker.utils;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import de.hysky.skyblocker.events.SkyblockEvents;
+import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra;
import de.hysky.skyblocker.skyblock.item.MuseumItemCache;
import de.hysky.skyblocker.skyblock.item.tooltip.ItemTooltip;
import de.hysky.skyblocker.skyblock.rift.TheRift;
@@ -98,6 +99,10 @@ public class Utils {
return getLocationRaw().equals("combat_3");
}
+ public static boolean isInKuudra() {
+ return getLocationRaw().equals(Kuudra.LOCATION);
+ }
+
public static boolean isInjected() {
return isInjected;
}
diff --git a/src/main/resources/assets/skyblocker/crimson/kuudra/pearl_waypoints.json b/src/main/resources/assets/skyblocker/crimson/kuudra/pearl_waypoints.json
new file mode 100644
index 00000000..6bba7576
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/crimson/kuudra/pearl_waypoints.json
@@ -0,0 +1,96 @@
+{
+ "waypoints": [
+ {
+ "x": -43,
+ "y": 120,
+ "z": -149
+ },
+ {
+ "x": -97,
+ "y": 157,
+ "z": -112
+ },
+ {
+ "x": -70,
+ "y": 79,
+ "z": -134
+ },
+ {
+ "x": -110,
+ "y": 155,
+ "z": -106
+ },
+ {
+ "x": -105,
+ "y": 157,
+ "z": -100
+ },
+ {
+ "x": -106,
+ "y": 165,
+ "z": -101
+ },
+ {
+ "x": -134,
+ "y": 77,
+ "z": -138
+ },
+ {
+ "x": -113,
+ "y": 77,
+ "z": -68
+ },
+ {
+ "x": -67,
+ "y": 77,
+ "z": -122
+ }
+ ,
+ {
+ "x": -85,
+ "y": 78,
+ "z": -128
+ },
+ {
+ "x": -95,
+ "y": 161,
+ "z": -105
+ }
+ ,
+ {
+ "x": -26,
+ "y": 126,
+ "z": -111
+ },
+ {
+ "x": -103,
+ "y": 160,
+ "z": -109
+ },
+ {
+ "x": -65,
+ "y": 76,
+ "z": -87
+ },
+ {
+ "x": -140,
+ "y": 78,
+ "z": -90
+ },
+ {
+ "x": -130,
+ "y": 79,
+ "z": -113
+ },
+ {
+ "x": -45,
+ "y": 135,
+ "z": -138
+ },
+ {
+ "x": -35,
+ "y": 138,
+ "z": -124
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/crimson/kuudra/safe_spot_waypoints.json b/src/main/resources/assets/skyblocker/crimson/kuudra/safe_spot_waypoints.json
new file mode 100644
index 00000000..ce693886
--- /dev/null
+++ b/src/main/resources/assets/skyblocker/crimson/kuudra/safe_spot_waypoints.json
@@ -0,0 +1,19 @@
+{
+ "waypoints": [
+ {
+ "x": -141,
+ "y": 77,
+ "z": -91
+ },
+ {
+ "x": -141,
+ "y": 76,
+ "z": -90
+ },
+ {
+ "x": -90,
+ "y": 77,
+ "z": -128
+ }
+ ]
+} \ No newline at end of file
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 527205cf..4abf5b25 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -164,6 +164,13 @@
"text.autoconfig.skyblocker.option.locations.barn": "Barn",
"text.autoconfig.skyblocker.option.locations.barn.solveHungryHiker": "Solve Hungry Hiker",
"text.autoconfig.skyblocker.option.locations.barn.solveTreasureHunter": "Solve Treasure Hunter",
+ "text.autoconfig.skyblocker.category.crimsonIsle": "Crimson Isle",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra": "Kuudra",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.supplyWaypoints": "Supply Waypoints",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.supplyPileWaypoints": "Supply Pile Waypoints",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.fuelWaypoints": "Fuel Waypoints",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.safeSpotWaypoints": "Safe Spot Waypoints",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.pearlWaypoints": "Pearl Waypoints",
"text.autoconfig.skyblocker.option.locations.spidersDen": "Spider's Den",
"text.autoconfig.skyblocker.option.locations.spidersDen.relics": "Hidden Relics Helper",
"text.autoconfig.skyblocker.option.locations.spidersDen.relics.enableRelicsHelper": "Enable Hidden Relics Helper",