aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java6
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java17
-rw-r--r--src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java21
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/ArrowPoisonWarning.java54
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java31
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json9
-rw-r--r--src/main/resources/skyblocker.mixins.json1
7 files changed, 138 insertions, 1 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index aeb2efd5..7234664d 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -939,6 +939,12 @@ public class SkyblockerConfig {
@SerialEntry
public Waypoint.Type waypointType = Waypoint.Type.WAYPOINT;
+
+ @SerialEntry
+ public boolean noArrowPoisonWarning = true;
+
+ @SerialEntry
+ public int arrowPoisonThreshold = 16;
}
public static class Rift {
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java
index 0a49d83f..bd7d4c07 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/CrimsonIsleCategory.java
@@ -7,6 +7,7 @@ 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 dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
import net.minecraft.text.Text;
public class CrimsonIsleCategory {
@@ -62,6 +63,22 @@ public class CrimsonIsleCategory {
newValue -> config.locations.crimsonIsle.kuudra.waypointType = newValue)
.controller(ConfigUtils::createEnumCyclingListController)
.build())
+ .option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning.@Tooltip")))
+ .binding(defaults.locations.crimsonIsle.kuudra.noArrowPoisonWarning,
+ () -> config.locations.crimsonIsle.kuudra.noArrowPoisonWarning,
+ newValue -> config.locations.crimsonIsle.kuudra.noArrowPoisonWarning = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .build())
+ .option(Option.<Integer>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold.@Tooltip")))
+ .binding(defaults.locations.crimsonIsle.kuudra.arrowPoisonThreshold,
+ () -> config.locations.crimsonIsle.kuudra.arrowPoisonThreshold,
+ newValue -> config.locations.crimsonIsle.kuudra.arrowPoisonThreshold = newValue)
+ .controller(IntegerFieldControllerBuilder::create)
+ .build())
.build())
.build();
}
diff --git a/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java b/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
new file mode 100644
index 00000000..4795a28b
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/mixin/PlayerInventoryMixin.java
@@ -0,0 +1,21 @@
+package de.hysky.skyblocker.mixin;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.Shadow;
+import org.spongepowered.asm.mixin.injection.At;
+import org.spongepowered.asm.mixin.injection.Inject;
+import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
+
+import de.hysky.skyblocker.skyblock.crimson.kuudra.ArrowPoisonWarning;
+import net.minecraft.entity.player.PlayerInventory;
+
+@Mixin(PlayerInventory.class)
+public class PlayerInventoryMixin {
+ @Shadow
+ public int selectedSlot;
+
+ @Inject(method = "scrollInHotbar", at = @At("TAIL"))
+ private void skyblocker$onHotbarScroll(CallbackInfo ci) {
+ ArrowPoisonWarning.tryWarn(selectedSlot);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/ArrowPoisonWarning.java b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/ArrowPoisonWarning.java
new file mode 100644
index 00000000..7ddbeb99
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/ArrowPoisonWarning.java
@@ -0,0 +1,54 @@
+package de.hysky.skyblocker.skyblock.crimson.kuudra;
+
+import java.util.function.Supplier;
+
+import de.hysky.skyblocker.config.SkyblockerConfig;
+import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.skyblock.crimson.kuudra.Kuudra.KuudraPhase;
+import de.hysky.skyblocker.utils.ItemUtils;
+import de.hysky.skyblocker.utils.Utils;
+import de.hysky.skyblocker.utils.render.RenderHelper;
+import de.hysky.skyblocker.utils.render.title.Title;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.player.PlayerInventory;
+import net.minecraft.item.BowItem;
+import net.minecraft.item.ItemStack;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+
+public class ArrowPoisonWarning {
+ private static final Supplier<SkyblockerConfig.Kuudra> CONFIG = () -> SkyblockerConfigManager.get().locations.crimsonIsle.kuudra;
+ private static final int THREE_SECONDS = 20 * 3;
+ private static final Title NONE_TITLE = new Title(Text.translatable("skyblocker.crimson.kuudra.noArrowPoison").formatted(Formatting.GREEN));
+ private static final Title LOW_TITLE = new Title(Text.translatable("skyblocker.crimson.kuudra.lowArrowPoison").formatted(Formatting.GREEN));
+
+ public static void tryWarn(int newSlot) {
+ //Exclude skyblock menu
+ if (Utils.isInKuudra() && CONFIG.get().noArrowPoisonWarning && Kuudra.phase == KuudraPhase.DPS && newSlot != 8) {
+ MinecraftClient client = MinecraftClient.getInstance();
+ PlayerInventory inventory = client.player.getInventory();
+ ItemStack heldItem = inventory.getStack(newSlot);
+
+ if (heldItem.getItem() instanceof BowItem) {
+ boolean hasToxicArrowPoison = false;
+ int arrowPoisonAmount = 0;
+
+ for (int i = 0; i < inventory.size(); ++i) {
+ ItemStack stack = inventory.getStack(i);
+ String itemId = ItemUtils.getItemId(stack);
+
+ if (itemId.equals("TOXIC_ARROW_POISON")) {
+ hasToxicArrowPoison = true;
+ arrowPoisonAmount += stack.getCount();
+ }
+ }
+
+ if (!hasToxicArrowPoison) {
+ RenderHelper.displayInTitleContainerAndPlaySound(NONE_TITLE, THREE_SECONDS);
+ } else if (arrowPoisonAmount < CONFIG.get().arrowPoisonThreshold) {
+ RenderHelper.displayInTitleContainerAndPlaySound(LOW_TITLE, THREE_SECONDS);
+ }
+ }
+ }
+ }
+}
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
index 007454f4..48ad8d7e 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/crimson/kuudra/Kuudra.java
@@ -1,15 +1,46 @@
package de.hysky.skyblocker.skyblock.crimson.kuudra;
+import de.hysky.skyblocker.utils.Utils;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
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.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
public class Kuudra {
public static final String LOCATION = "kuudra";
+ static KuudraPhase phase = KuudraPhase.OTHER;
public static void init() {
WorldRenderEvents.AFTER_TRANSLUCENT.register(KuudraWaypoints::render);
ClientLifecycleEvents.CLIENT_STARTED.register(KuudraWaypoints::load);
+ ClientPlayConnectionEvents.JOIN.register((_handler, _sender, _client) -> reset());
+ ClientReceiveMessageEvents.GAME.register(Kuudra::onMessage);
Scheduler.INSTANCE.scheduleCyclic(KuudraWaypoints::tick, 20);
}
+
+ private static void onMessage(Text text, boolean overlay) {
+ if (Utils.isInKuudra() && !overlay) {
+ String message = Formatting.strip(text.getString());
+
+ if (message.equals("[NPC] Elle: Phew! The Ballista is finally ready! It should be strong enough to tank Kuudra's blows now!")) {
+ phase = KuudraPhase.DPS;
+ }
+
+ if (message.equals("[NPC] Elle: POW! SURELY THAT'S IT! I don't think he has any more in him!")) {
+ phase = KuudraPhase.OTHER;
+ }
+ }
+ }
+
+ private static void reset() {
+ phase = KuudraPhase.OTHER;
+ }
+
+ enum KuudraPhase {
+ OTHER,
+ DPS;
+ }
}
diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json
index 4abf5b25..7fb898b1 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -171,6 +171,10 @@
"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.crimsonIsle.kuudra.noArrowPoisonWarning": "No Arrow Poison Warning",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.noArrowPoisonWarning.@Tooltip": "Warns you when you pull out a bow and have no Toxic Arrow Poison in your inventory. Only works during the DPS phase.",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold": "Arrow Poison Warning Threshold",
+ "text.autoconfig.skyblocker.option.locations.crimsonIsle.kuudra.arrowPoisonThreshold.@Tooltip": "If the amount of Toxic Arrow Poison you have in your inventory is below the set threshold then you will receive a warning.",
"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",
@@ -256,7 +260,7 @@
"text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorText": "Enable Livid Color Text",
"text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorText.@Tooltip": "Send the livid color in the chat during the Livid boss fight.",
"text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle": "Enable Livid Color Title",
- "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle.@Tooltip": "Display the livid color in the title during the Livid boss fight.",
+ "text.autoconfig.skyblocker.option.locations.dungeons.lividColor.enableLividColorTitle.@Tooltip": "Display the livid color in the title during the Livid boss fight.",
"text.autoconfig.skyblocker.option.locations.dungeons.lividColor.lividColorText": "Livid Color Text",
"text.autoconfig.skyblocker.option.locations.dungeons.lividColor.lividColorText.@Tooltip": "Text which will be sent in the chat during the Livid boss fight. The string \"[color]\" will be replaced with the livid color.",
"text.autoconfig.skyblocker.option.locations.dungeons.terminals": "Terminal Solvers",
@@ -464,6 +468,9 @@
"skyblocker.partyFinder.yourParty": "Your party",
"skyblocker.partyFinder.deList": "Click to de-list",
"skyblocker.partyFinder.join": "Click to join",
+
+ "skyblocker.crimson.kuudra.noArrowPoison": "No Arrow Poison!",
+ "skyblocker.crimson.kuudra.lowArrowPoison": "Low on Arrow Poison!",
"emi.category.skyblocker.skyblock": "Skyblock"
}
diff --git a/src/main/resources/skyblocker.mixins.json b/src/main/resources/skyblocker.mixins.json
index 29f7fb11..fd7364ce 100644
--- a/src/main/resources/skyblocker.mixins.json
+++ b/src/main/resources/skyblocker.mixins.json
@@ -25,6 +25,7 @@
"LeverBlockMixin",
"LivingEntityRendererMixin",
"MinecraftClientMixin",
+ "PlayerInventoryMixin",
"PlayerListHudMixin",
"PlayerSkinProviderMixin",
"PlayerSkinTextureMixin",