diff options
Diffstat (limited to 'src')
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", |