aboutsummaryrefslogtreecommitdiff
path: root/src/main
diff options
context:
space:
mode:
authorLifeIsAParadox <LifeIsAParadox@users.noreply.github.com>2021-09-19 22:51:57 +0200
committerGitHub <noreply@github.com>2021-09-19 22:51:57 +0200
commitf204e0f0459ec8eb993fdc4dd419bca0504fbb8d (patch)
tree018390da69b3e2efa04d21828927ee2b65d882f7 /src/main
parent731c9430f4cf4cd5f9410cd490d724ba55fa7414 (diff)
parent8b0d4faea23ac4486795345fe0981d9cb3059059 (diff)
downloadSkyblocker-f204e0f0459ec8eb993fdc4dd419bca0504fbb8d.tar.gz
Skyblocker-f204e0f0459ec8eb993fdc4dd419bca0504fbb8d.tar.bz2
Skyblocker-f204e0f0459ec8eb993fdc4dd419bca0504fbb8d.zip
Merge pull request #11 from ExternalTime/chat-parsing-refactor
Chat parsing refactor
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java20
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java39
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java43
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java15
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java1
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java49
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/ChatFilter.java53
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonPuzzles.java118
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java40
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java89
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java68
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java72
-rw-r--r--src/main/resources/assets/skyblocker/lang/en_us.json1
17 files changed, 400 insertions, 268 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java
new file mode 100644
index 00000000..e89d06c2
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java
@@ -0,0 +1,20 @@
+package me.xmrvizzy.skyblocker.chat;
+
+import java.util.regex.Pattern;
+
+public abstract class ChatListener {
+ protected static final String NUMBER = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?";
+ private Pattern pattern;
+ public ChatListener(String pattern) {
+ this.pattern = Pattern.compile(pattern);
+ }
+ public Pattern getPattern() {
+ return pattern;
+ }
+
+ public abstract boolean isEnabled();
+ //Returns whether message should get filtered
+ public boolean onMessage(String[] groups) {
+ return true;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java
new file mode 100644
index 00000000..9965c7c7
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java
@@ -0,0 +1,39 @@
+package me.xmrvizzy.skyblocker.chat;
+
+import me.xmrvizzy.skyblocker.chat.filters.*;
+import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos;
+import me.xmrvizzy.skyblocker.skyblock.dungeon.Trivia;
+import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur;
+import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler;
+
+import java.util.regex.Matcher;
+
+public class ChatParser {
+ private final ChatListener[] listeners = new ChatListener[]{
+ new ThreeWeirdos(),
+ new AoteFilter(),
+ new ImplosionFilter(),
+ new MoltenWaveFilter(),
+ new HealFilter(),
+ new AbilityFilter(),
+ new AdFilter(),
+ new Fetchur(),
+ new Puzzler(),
+ new Trivia(),
+ };
+
+ public boolean shouldFilter(String message) {
+ for (ChatListener listener : listeners) {
+ if (listener.isEnabled()) {
+ Matcher m = listener.getPattern().matcher(message);
+ if (m.matches()) {
+ String[] groups = new String[m.groupCount() + 1];
+ for (int i = 0; i < groups.length; i++)
+ groups[i] = m.group(i);
+ return listener.onMessage(groups);
+ }
+ }
+ }
+ return false;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java
new file mode 100644
index 00000000..0956e0e5
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java
@@ -0,0 +1,15 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class AbilityFilter extends ChatListener {
+ public AbilityFilter() {
+ super("^(?:This ability is on cooldown for " + NUMBER + "s\\.|No more charges, next one in " + NUMBER + "s!)$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideAbility;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java
new file mode 100644
index 00000000..ca4d989a
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java
@@ -0,0 +1,43 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+import java.util.regex.Pattern;
+
+public class AdFilter extends ChatListener {
+ private static final String regex;
+
+ public AdFilter() {
+ super(regex);
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideAds;
+ }
+
+ static {
+ StringBuilder sb = new StringBuilder("^§[67ab](?:\\[(?:MVP|VIP)(?:§[0-9a-f]\\+{1,2}§[6ab])?] )?([a-zA-Z0-9_]{2,16})§[7f]: ");
+ String[] inexact = new String[] {
+ "(?:on|in|check|at) my ah",
+ "(?>(.)\\1{7,})",
+ };
+ String[] exact = new String[]{
+ "(?:i(?:m|'m| am)? |(?:is )?any(?: ?one|1) )?(?:buy|sell|lowball|trade?)(?:ing)?(?:\\W.*|).*",
+ };
+ sb.append("(?:.*(?:");
+ sb.append(inexact[0]);
+ for(int i = 1; i < inexact.length; i++) {
+ sb.append("|");
+ sb.append(inexact[i]);
+ }
+ sb.append(").*");
+ for (String s : exact) {
+ sb.append("|");
+ sb.append(s);
+ }
+ sb.append(")$");
+ regex = sb.toString();
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java
new file mode 100644
index 00000000..6fa85f14
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java
@@ -0,0 +1,15 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class AoteFilter extends ChatListener {
+ public AoteFilter() {
+ super("^There are blocks in the way!$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideAOTE;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java
new file mode 100644
index 00000000..e8421a45
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java
@@ -0,0 +1,15 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class HealFilter extends ChatListener {
+ public HealFilter() {
+ super("^(?:You healed yourself for " + NUMBER + " health!|[a-zA-Z0-9_]{2,16} healed you for " + NUMBER + " health!)$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideHeal;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java
new file mode 100644
index 00000000..5bcaba57
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java
@@ -0,0 +1,15 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class ImplosionFilter extends ChatListener {
+ public ImplosionFilter() {
+ super("^Your Implosion hit " + NUMBER + " enem(?:y|ies) for " + NUMBER + " damage\\.$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideImplosion;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java
new file mode 100644
index 00000000..daa4b601
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java
@@ -0,0 +1,15 @@
+package me.xmrvizzy.skyblocker.chat.filters;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+
+public class MoltenWaveFilter extends ChatListener {
+ public MoltenWaveFilter() {
+ super("^Your Molten Wave hit " + NUMBER + " enemy(?:y|ies) for " + NUMBER + " damage\\.$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().messages.hideMoltenWave;
+ }
+} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index fd289c5d..5a085818 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -53,6 +53,7 @@ public class SkyblockerConfig implements ConfigData {
public boolean enableMap = true;
public boolean solveThreeWeirdos = true;
public boolean blazesolver = true;
+ public boolean solveTrivia = true;
}
public static class DwarvenMines {
diff --git a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
index c22364d6..43103159 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/mixin/ChatHudListenerMixin.java
@@ -1,18 +1,15 @@
package me.xmrvizzy.skyblocker.mixin;
+import me.xmrvizzy.skyblocker.chat.ChatParser;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.skyblock.ChatFilter;
-import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonPuzzles;
-import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur;
-import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler;
import me.xmrvizzy.skyblocker.utils.Utils;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.hud.ChatHudListener;
+import net.minecraft.client.network.ClientPlayerEntity;
import net.minecraft.network.MessageType;
+import net.minecraft.text.ClickEvent;
import net.minecraft.text.Text;
-import org.spongepowered.asm.mixin.Final;
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;
@@ -23,44 +20,14 @@ import java.util.UUID;
@Mixin(ChatHudListener.class)
public class ChatHudListenerMixin {
- @Shadow @Final private MinecraftClient client;
- private final ChatFilter filter = new ChatFilter();
+ private final ChatParser parser = new ChatParser();
@Inject(method = "onChatMessage", at = @At("HEAD"), cancellable = true)
public void onMessage(MessageType messageType, Text message, UUID senderUuid, CallbackInfo ci) {
- String msg = message.getString();
-
- if (Utils.isDungeons) {
- if (SkyblockerConfig.get().locations.dungeons.solveThreeWeirdos && msg.contains("[NPC]"))
- DungeonPuzzles.threeWeirdos(msg);
-
- DungeonPuzzles.trivia(msg, ci);
- }
-
- if (Utils.isSkyblock) {
- if (msg.contains("[OPEN MENU]")) {
- List<Text> siblings = message.getSiblings();
- for (Text sibling : siblings) {
- if (sibling.getString().contains("[OPEN MENU]")) {
- this.client.player.sendChatMessage(sibling.getStyle().getClickEvent().getValue());
- }
- }
- }
-
- if (msg.contains("[NPC]")) {
- if (SkyblockerConfig.get().locations.dwarvenMines.solveFetchur &&
- msg.contains("Fetchur")) {
- Fetchur.solve(msg, ci);
- }
-
- if (SkyblockerConfig.get().locations.dwarvenMines.solvePuzzler &&
- msg.contains("Puzzler"))
- Puzzler.solve(msg);
- }
-
- if(filter.shouldFilter(msg))
- ci.cancel();
- }
+ if (!Utils.isSkyblock)
+ return;
+ if (parser.shouldFilter(message.getString()))
+ ci.cancel();
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/ChatFilter.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/ChatFilter.java
deleted file mode 100644
index 47f3716c..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/ChatFilter.java
+++ /dev/null
@@ -1,53 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock;
-
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-
-public class ChatFilter {
- private static final Pattern ability;
- private static final Pattern heal;
- private static final Pattern aote;
- private static final Pattern implosion;
- private static final Pattern moltenWave;
- private static final Pattern playerMessage;
- private static final Pattern adverts;
-
- public boolean shouldFilter(String message) {
- SkyblockerConfig.Messages settings = SkyblockerConfig.get().messages;
- if (settings.hideAbility && ability.matcher(message).matches())
- return true;
-
- if (settings.hideHeal && heal.matcher(message).matches())
- return true;
-
- if (settings.hideAOTE && aote.matcher(message).matches())
- return true;
-
- if (settings.hideImplosion && implosion.matcher(message).matches())
- return true;
-
- if (settings.hideMoltenWave && moltenWave.matcher(message).matches())
- return true;
-
- if (settings.hideAds) {
- Matcher m = playerMessage.matcher(message);
- if(m.matches() && adverts.matcher(m.group(2)).find())
- return true;
- }
- return false;
- }
-
- static {
- String number = "-?[0-9]{1,3}(?>,[0-9]{3})*(?:\\.[1-9])?";
- ability = Pattern.compile("^(?:This ability is on cooldown for " + number + "s\\.|No more charges, next one in " + number + "s!)$");
- heal = Pattern.compile("^(?:You healed yourself for " + number + " health!|[a-zA-Z0-9_]{2,16} healed you for " + number + " health!)$");
- aote = Pattern.compile("^There are blocks in the way!$");
- implosion = Pattern.compile("^Your Implosion hit " + number + " enem(?:y|ies) for " + number + " damage\\.$");
- moltenWave = Pattern.compile("^Your Molten Wave hit " + number + " enemy(?:y|ies) for " + number + " damage\\.$");
- playerMessage = Pattern.compile("^§[67ab](?:\\[(?:MVP|VIP)(?:§[0-9a-f]\\+{1,2}§[6ab])?] )?([a-zA-Z0-9_]{2,16})§[7f]: (.*)$");
- adverts = Pattern.compile("(?i:^(?:i(?:m|'m| am)? |(?:is )?any(?: ?one|1) )?(?:buy|sell|lowball|trade?)(?:ing)?\\W|(?:\\W|^)(?:on|in|check|at) my ah(?:\\W|$)|(.)\\1{7,})");
- }
-}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonPuzzles.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonPuzzles.java
deleted file mode 100644
index 49276a6e..00000000
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonPuzzles.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package me.xmrvizzy.skyblocker.skyblock.dungeon;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-
-import net.minecraft.client.MinecraftClient;
-import net.minecraft.entity.decoration.ArmorStandEntity;
-import net.minecraft.text.LiteralText;
-import net.minecraft.text.Text;
-import net.minecraft.util.Formatting;
-
-public class DungeonPuzzles {
-
- public static void threeWeirdos(String message) {
- MinecraftClient client = MinecraftClient.getInstance();
- if (client.player == null && client.world == null) return;
-
- String[] solutions = {
- "The reward is not in my chest!",
- "At least one of them is lying, and the reward is not in",
- "My chest doesn't have the reward. We are all telling the truth.",
- "My chest has the reward and I'm telling the truth!",
- "The reward isn't in any of our chests.",
- "Both of them are telling the truth. Also,"
- };
-
- for (String s : solutions) {
- if (message.contains(s)) {
- String npc = message.substring(message.indexOf("]") + 4, message.indexOf(":") - 2);
- client.world.getEntitiesByClass(ArmorStandEntity.class, client.player.getBoundingBox().expand(3), entity -> {
- if (entity.hasCustomName() && entity.getCustomName().getString().contains(npc))
- return true;
- return false;
- }).forEach(entity -> entity.setCustomName(Text.of(Formatting.GREEN + npc)));
- }
- }
- }
- public static String[] triviaAnswers = null;
- public static void trivia(String message, CallbackInfo ci){
- MinecraftClient client = MinecraftClient.getInstance();
-
-
- if (client.player == null && client.world == null) return;
- if (message.contains("What SkyBlock year is it?")) {
- double currentTime = System.currentTimeMillis() /1000L;
-
- double diff = Math.floor(currentTime - 1560276000);
-
- int year = (int) (diff / 446400 + 1);
- triviaAnswers = new String[]{"Year " + year};
- }else{
- Map<String, String[]> solutions = new HashMap<>();
- solutions.put("What is the status of The Watcher?", new String[]{"Stalker"});
- solutions.put("What is the status of Bonzo?", new String[]{"New Necromancer"});
- solutions.put("What is the status of Scarf?", new String[]{"Apprentice Necromancer"});
- solutions.put("What is the status of The Professor?", new String[]{"Professor"});
- solutions.put("What is the status of Thorn?", new String[]{"Shaman Necromancer"});
- solutions.put("What is the status of Livid?", new String[]{"Master Necromancer"});
- solutions.put("What is the status of Sadan?", new String[]{"Necromancer Lord"});
- solutions.put("What is the status of Maxor?", new String[]{"Young Wither"});
- solutions.put("What is the status of Goldor?", new String[]{"Wither Soldier"});
- solutions.put("What is the status of Storm?", new String[]{"Elementalist"});
- solutions.put("What is the status of Necron?", new String[]{"Wither Lord"});
- solutions.put("How many total Fairy Souls are there?", new String[]{"220 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Spider's Den?", new String[]{"19 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in The End?", new String[]{"12 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in The Barn?", new String[]{"7 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Mushroom Desert?", new String[]{"8 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Blazing Fortress?", new String[]{"19 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in The Park?", new String[]{"11 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Jerry's Workshop?", new String[]{"5 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Hub?", new String[]{"79 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in The Hub?", new String[]{"79 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Deep Caverns?", new String[]{"21 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Gold Mine?", new String[]{"12 Fairy Souls"});
- solutions.put("How many Fairy Souls are there in Dungeon Hub?", new String[]{"7 Fairy Souls"});
- solutions.put("Which brother is on the Spider's Den?", new String[]{"Rick"});
- solutions.put("What is the name of Rick's brother?", new String[]{"Pat"});
- solutions.put("What is the name of the Painter in the Hub?", new String[]{"Marco"});
- solutions.put("What is the name of the person that upgrades pets?", new String[]{"Kat"});
- solutions.put("What is the name of the lady of the Nether?", new String[]{"Elle"});
- solutions.put("Which villager in the Village gives you a Rogue Sword?", new String[]{"Jamie"});
- solutions.put("How many unique minions are there?", new String[]{"53 Minions"});
- solutions.put("Which of these enemies does not spawn in the Spider's Den?", new String[]{"Zombie Spider", "Cave Spider", "Wither Skeleton",
- "Dashing Spooder", "Broodfather", "Night Spider"});
- solutions.put("Which of these monsters only spawns at night?", new String[]{"Zombie Villager", "Ghast"});
- solutions.put("Which of these is not a dragon in The End?", new String[]{"Zoomer Dragon", "Weak Dragon", "Stonk Dragon", "Holy Dragon", "Boomer Dragon",
- "Booger Dragon", "Older Dragon", "Elder Dragon", "Stable Dragon", "Professor Dragon"});
-
- for (String question : solutions.keySet()) {
- if (message.contains(question)) {
- triviaAnswers = solutions.get(question);
- break;
- }
- }
- }
-
- if (triviaAnswers != null && (message.contains("ⓐ") || message.contains("ⓑ") || message.contains("ⓒ"))) {
- boolean isSolution = false;
- for (String solution : triviaAnswers) {
- if (message.contains(solution)) {
- //client.player.sendMessage(new LiteralText(solution), false);
- isSolution = true;
- break;
- }
- }
- if (!isSolution) {
- char letter = message.charAt(5);
- String option = message.substring(6);
- ci.cancel();
- client.player.sendMessage(new LiteralText(" " + Formatting.GOLD + letter + Formatting.RED + option), false);
- return;
- }
- }
- }
-} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java
new file mode 100644
index 00000000..ea63b35e
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java
@@ -0,0 +1,40 @@
+package me.xmrvizzy.skyblocker.skyblock.dungeon;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.entity.decoration.ArmorStandEntity;
+import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+
+public class ThreeWeirdos extends ChatListener {
+ public ThreeWeirdos() {
+ super("^§e\\[NPC] §c([A-Z][a-z]+)§f: (?:The reward is(?: not in my chest!|n't in any of our chests\\.)|My chest (?:doesn't have the reward\\. We are all telling the truth\\.|has the reward and I'm telling the truth!)|At least one of them is lying, and the reward is not in §c§c[A-Z][a-z]+'s §rchest\\!|Both of them are telling the truth\\. Also, §c§c[A-Z][a-z]+ §rhas the reward in their chest\\!)$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().locations.dungeons.solveThreeWeirdos;
+ }
+
+ @Override
+ public boolean onMessage(String[] groups) {
+ MinecraftClient client = MinecraftClient.getInstance();
+ assert client.world != null;
+ assert client.player != null;
+ client.world.getEntitiesByClass(
+ ArmorStandEntity.class,
+ client.player.getBoundingBox().expand(3),
+ entity -> {
+ Text customName = entity.getCustomName();
+ if (customName != null && customName.getString().equals(groups[1])) {
+ return true;
+ }
+ return false;
+ }
+ ).forEach(
+ entity -> entity.setCustomName(Text.of(Formatting.GREEN + groups[1]))
+ );
+ return false;
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java
new file mode 100644
index 00000000..3d3e5c28
--- /dev/null
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java
@@ -0,0 +1,89 @@
+package me.xmrvizzy.skyblocker.skyblock.dungeon;
+
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
+import net.minecraft.client.MinecraftClient;
+import net.minecraft.client.network.ClientPlayerEntity;
+import net.minecraft.text.LiteralText;
+import net.minecraft.util.Formatting;
+
+import java.util.*;
+
+public class Trivia extends ChatListener {
+ private static final Map<String, String[]> answers;
+ private List<String> solutions = Collections.emptyList();
+
+ public Trivia() {
+ super("^ +(?:([A-Za-z' ]*\\?)|§6 ([ⓐⓑⓒ]) §a([a-zA-Z0-9 ]+))$");
+ }
+
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().locations.dungeons.solveTrivia;
+ }
+
+ @Override
+ public boolean onMessage(String[] groups) {
+ if (groups[3] != null) {
+ if (!solutions.contains(groups[3])) {
+ ClientPlayerEntity player = MinecraftClient.getInstance().player;
+ assert player != null;
+ MinecraftClient.getInstance().player.sendMessage(new LiteralText(" " + Formatting.GOLD + groups[2] + Formatting.RED + " " + groups[3]), false);
+ return true;
+ }
+ } else
+ updateSolutions(groups[1]);
+ return false;
+ }
+
+ private void updateSolutions(String question) {
+ if (question.equals("What SkyBlock year is it?")) {
+ long currentTime = System.currentTimeMillis() / 1000L;
+ long diff = currentTime - 1560276000;
+ int year = (int) (diff / 446400 + 1);
+ solutions = Collections.singletonList("Year " + year);
+ } else {
+ solutions = Arrays.asList(answers.get(question));
+ }
+ }
+
+ static {
+ answers = new HashMap<>();
+ answers.put("What is the status of The Watcher?", new String[]{"Stalker"});
+ answers.put("What is the status of Bonzo?", new String[]{"New Necromancer"});
+ answers.put("What is the status of Scarf?", new String[]{"Apprentice Necromancer"});
+ answers.put("What is the status of The Professor?", new String[]{"Professor"});
+ answers.put("What is the status of Thorn?", new String[]{"Shaman Necromancer"});
+ answers.put("What is the status of Livid?", new String[]{"Master Necromancer"});
+ answers.put("What is the status of Sadan?", new String[]{"Necromancer Lord"});
+ answers.put("What is the status of Maxor?", new String[]{"Young Wither"});
+ answers.put("What is the status of Goldor?", new String[]{"Wither Soldier"});
+ answers.put("What is the status of Storm?", new String[]{"Elementalist"});
+ answers.put("What is the status of Necron?", new String[]{"Wither Lord"});
+ answers.put("How many total Fairy Souls are there?", new String[]{"227 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Spider's Den?", new String[]{"19 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in The End?", new String[]{"12 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in The Barn?", new String[]{"7 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Mushroom Desert?", new String[]{"13 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Blazing Fortress?", new String[]{"19 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in The Park?", new String[]{"11 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Jerry's Workshop?", new String[]{"5 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Hub?", new String[]{"79 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in The Hub?", new String[]{"79 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Deep Caverns?", new String[]{"21 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Gold Mine?", new String[]{"12 Fairy Souls"});
+ answers.put("How many Fairy Souls are there in Dungeon Hub?", new String[]{"7 Fairy Souls"});
+ answers.put("Which brother is on the Spider's Den?", new String[]{"Rick"});
+ answers.put("What is the name of Rick's brother?", new String[]{"Pat"});
+ answers.put("What is the name of the Painter in the Hub?", new String[]{"Marco"});
+ answers.put("What is the name of the person that upgrades pets?", new String[]{"Kat"});
+ answers.put("What is the name of the lady of the Nether?", new String[]{"Elle"});
+ answers.put("Which villager in the Village gives you a Rogue Sword?", new String[]{"Jamie"});
+ answers.put("How many unique minions are there?", new String[]{"53 Minions"});
+ answers.put("Which of these enemies does not spawn in the Spider's Den?", new String[]{"Zombie Spider", "Cave Spider", "Wither Skeleton",
+ "Dashing Spooder", "Broodfather", "Night Spider"});
+ answers.put("Which of these monsters only spawns at night?", new String[]{"Zombie Villager", "Ghast"});
+ answers.put("Which of these is not a dragon in The End?", new String[]{"Zoomer Dragon", "Weak Dragon", "Stonk Dragon", "Holy Dragon", "Boomer Dragon",
+ "Booger Dragon", "Older Dragon", "Elder Dragon", "Stable Dragon", "Professor Dragon"});
+ }
+}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
index 232ad99a..0051e1dd 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Fetchur.java
@@ -1,47 +1,53 @@
package me.xmrvizzy.skyblocker.skyblock.dwarven;
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
import net.minecraft.text.TranslatableText;
-import net.minecraft.util.Formatting;
-import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
-import java.util.Arrays;
import java.util.HashMap;
-import java.util.List;
import java.util.Map;
-public class Fetchur {
+public class Fetchur extends ChatListener {
+ private static Map<String, String> answers;
- public static Map<String, List<String>> getAnswers() {
- Map<String, List<String>> answers = new HashMap<>();
- answers.put("yellow, see-through", Arrays.asList(new TranslatableText("block.minecraft.yellow_stained_glass").getString()));
- answers.put("circular and sometimes moves", Arrays.asList(new TranslatableText("item.minecraft.compass").getString()));
- answers.put("circlular and sometimes moves", Arrays.asList(new TranslatableText("item.minecraft.compass").getString()));
- answers.put("expensive minerals", Arrays.asList("Mithril"));
- answers.put("useful during celebrations", Arrays.asList(new TranslatableText("item.minecraft.firework_rocket").getString()));
- answers.put("hot, gives energy", Arrays.asList("Cheap Coffee", "Decent Coffee"));
- answers.put("tall, can be opened", Arrays.asList(new TranslatableText("block.minecraft.oak_door").getString()));
- answers.put("explosive, more than usual", Arrays.asList("Superboom TNT"));
- answers.put("wearable, grows", Arrays.asList(new TranslatableText("block.minecraft.pumpkin").getString()));
- answers.put("shiny, makes sparks", Arrays.asList(new TranslatableText("item.minecraft.flint_and_steel").getString()));
- answers.put("red and white and you can mine it", Arrays.asList(new TranslatableText("block.minecraft.nether_quartz_ore").getString()));
- answers.put("round and green, or purple", Arrays.asList(new TranslatableText("item.minecraft.ender_pearl").getString()));
- answers.put("red and Soft", Arrays.asList(new TranslatableText("block.minecraft.red_wool").getString()));
- return answers;
+ public Fetchur() {
+ super("^§e\\[NPC] Fetchur§f: (?:its|theyre) ([a-zA-Z, \\-]*)$");
}
- public static void solve(String message, CallbackInfo ci) {
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().locations.dwarvenMines.solveFetchur;
+ }
+
+ @Override
+ public boolean onMessage(String[] groups) {
MinecraftClient client = MinecraftClient.getInstance();
- if (client.player == null) return;
+ assert client.player != null;
+ String answer = answers.getOrDefault(groups[1], groups[1]);
+ client.player.sendMessage(Text.of("§e[NPC] Fetchur§f: " + answer), false);
+ return true;
+ }
- for (String key : getAnswers().keySet()) {
- if (message.contains(key)) {
- Text text = Text.of(message + " " + Formatting.GREEN + getAnswers().get(key).toString());
- client.player.sendMessage(text, false);
- ci.cancel();
- break;
- }
- }
+ static {
+ //It seems that hints on wiki aren't up to date.
+ //I will assume doors weren't the only ones changed
+ //and that admins did it to make hints more consistent.
+ //Will need to verify if this true.
+ //Changed most commas into "and"s.
+ answers = new HashMap<>();
+ answers.put("yellow and see-through", new TranslatableText("block.minecraft.yellow_stained_glass").getString());
+ answers.put("circular and sometimes moves", new TranslatableText("item.minecraft.compass").getString());
+ answers.put("expensive minerals", "Mithril");
+ answers.put("useful during celebrations", new TranslatableText("item.minecraft.firework_rocket").getString());
+ answers.put("hot and gives energy", "Cheap / Decent Coffee");
+ answers.put("tall and can be opened", new TranslatableText("block.minecraft.oak_door").getString());
+ answers.put("explosive, more than usual", "Superboom TNT");
+ answers.put("wearable and grows", new TranslatableText("block.minecraft.pumpkin").getString());
+ answers.put("shiny and makes sparks", new TranslatableText("item.minecraft.flint_and_steel").getString());
+ answers.put("red and white and you can mine it", new TranslatableText("block.minecraft.nether_quartz_ore").getString());
+ answers.put("round and green, or purple", new TranslatableText("item.minecraft.ender_pearl").getString());
+ answers.put("red and Soft", new TranslatableText("block.minecraft.red_wool").getString());
}
} \ No newline at end of file
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
index 6c1def82..377ffbf4 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dwarven/Puzzler.java
@@ -1,35 +1,57 @@
package me.xmrvizzy.skyblocker.skyblock.dwarven;
-import net.minecraft.block.Blocks;
+import me.xmrvizzy.skyblocker.chat.ChatListener;
+import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
import net.minecraft.client.MinecraftClient;
-import net.minecraft.util.Formatting;
-import net.minecraft.util.math.BlockPos;
+import net.minecraft.text.Text;
-public class Puzzler {
-
- public static void solve(String message) {
- MinecraftClient client = MinecraftClient.getInstance();
- if (client.player == null && client.world == null) return;
-
- int x = 181;
- int y = 195;
- int z = 135;
+public class Puzzler extends ChatListener {
+ public Puzzler() {
+ super("^§e\\[NPC] §dPuzzler§f: ((?:§d▲|§5▶|§b◀|§a▼){10})$");
+ }
- String path = Formatting.strip(message);
- path = path.substring(path.indexOf(":") + 2);
- String check = path
- .replaceAll("▲", "").replaceAll("▶", "")
- .replaceAll("▼", "").replaceAll("◀", "");
+ @Override
+ public boolean isEnabled() {
+ return SkyblockerConfig.get().locations.dwarvenMines.solvePuzzler;
+ }
- if (check.isEmpty()) {
- for (char c : path.toCharArray()) {
- if (c == '▲') z += 1;
- if (c == '▶') x -= 1;
- if (c == '▼') z -= 1;
- if (c == '◀') x += 1;
+ @Override
+ public boolean onMessage(String[] groups) {
+ int x = 0;
+ int z = 0;
+ for (char c : groups[1].toCharArray()) {
+ switch (c) {
+ case '▲': z += 1;
+ case '▶': x -= 1;
+ case '▼': z -= 1;
+ case '◀': x += 1;
}
-
- client.world.setBlockState(new BlockPos(x, y, z), Blocks.EMERALD_BLOCK.getDefaultState());
}
+ StringBuilder message = new StringBuilder("§e[NPC] §dPuzzler§f: ");
+ if(z > 0) {
+ message.append("§d");
+ message.append(z);
+ message.append("▲");
+ }
+ else if (z < 0) {
+ message.append("§a▼");
+ message.append(-z);
+ message.append("▼");
+ }
+ if(x > 0) {
+ message.append("§b");
+ message.append(x);
+ message.append("◀");
+ }
+ else if (x < 0) {
+ message.append("§5▶");
+ message.append(-x);
+ message.append("▶");
+ }
+
+ MinecraftClient client = MinecraftClient.getInstance();
+ assert client.player != null;
+ client.player.sendMessage(Text.of(message.toString()), false);
+ return true;
}
} \ 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 b2ffaeba..65e5d5f0 100644
--- a/src/main/resources/assets/skyblocker/lang/en_us.json
+++ b/src/main/resources/assets/skyblocker/lang/en_us.json
@@ -14,6 +14,7 @@
"text.autoconfig.skyblocker.option.locations.dungeons.enableMap": "Enable Map",
"text.autoconfig.skyblocker.option.locations.dungeons.solveThreeWeirdos": "Solve Three Weirdos Puzzle",
"text.autoconfig.skyblocker.option.locations.dungeons.blazesolver": "Solve Blaze Puzzle",
+ "text.autoconfig.skyblocker.option.locations.dungeons.solveTrivia": "Solve Trivia Puzzle",
"text.autoconfig.skyblocker.option.locations.dwarvenMines": "Dwarven Mines",
"text.autoconfig.skyblocker.option.locations.dwarvenMines.enableDrillFuel": "Enable Drill Fuel",
"text.autoconfig.skyblocker.option.locations.dwarvenMines.solveFetchur": "Solve Fetchur",