diff options
author | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-01-26 13:37:37 -0500 |
---|---|---|
committer | Aaron <51387595+AzureAaron@users.noreply.github.com> | 2024-01-26 13:37:37 -0500 |
commit | 1ea5f54ab6d7edf7a7c5971db05e22667d3a9c93 (patch) | |
tree | 285127b11b36969e94420de601b60e04fc3baeff /src/main | |
parent | 4cf5ff1a436b1b5ce30990bb67b816a241aae603 (diff) | |
download | Skyblocker-1ea5f54ab6d7edf7a7c5971db05e22667d3a9c93.tar.gz Skyblocker-1ea5f54ab6d7edf7a7c5971db05e22667d3a9c93.tar.bz2 Skyblocker-1ea5f54ab6d7edf7a7c5971db05e22667d3a9c93.zip |
Arrow Poison Warnings
Diffstat (limited to 'src/main')
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", |