diff options
author | LifeIsAParadox <LifeIsAParadox@users.noreply.github.com> | 2021-09-19 22:51:57 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-09-19 22:51:57 +0200 |
commit | f204e0f0459ec8eb993fdc4dd419bca0504fbb8d (patch) | |
tree | 018390da69b3e2efa04d21828927ee2b65d882f7 /src/main | |
parent | 731c9430f4cf4cd5f9410cd490d724ba55fa7414 (diff) | |
parent | 8b0d4faea23ac4486795345fe0981d9cb3059059 (diff) | |
download | Skyblocker-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')
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", |