From bc565c0e0bfbc5e87af8191519980a440da5bfa4 Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sat, 18 Sep 2021 19:58:41 +0200 Subject: Created an interface for listening to chat messages --- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 23 ++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') 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..5c431678 --- /dev/null +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -0,0 +1,23 @@ +package me.xmrvizzy.skyblocker.chat; + +import java.util.regex.Matcher; + +public class ChatParser { + private final ChatListener[] listeners = new ChatListener[] { + }; + + 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 -- cgit From 7e1c129bb48d8e54bc6dd695d2408641caf86a27 Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sat, 18 Sep 2021 21:45:16 +0200 Subject: Rewrote Fetchur solver to use the new interface --- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 3 + .../skyblocker/skyblock/dwarven/Fetchur.java | 68 ++++++++++++---------- 2 files changed, 40 insertions(+), 31 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java index 5c431678..17a5c4e5 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -1,9 +1,12 @@ package me.xmrvizzy.skyblocker.chat; +import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; + import java.util.regex.Matcher; public class ChatParser { private final ChatListener[] listeners = new ChatListener[] { + new Fetchur(), }; public boolean shouldFilter(String message) { 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 answers; - public static Map> getAnswers() { - Map> 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 -- cgit From af186a88972a6070efbdefa7aac557316b5012aa Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sat, 18 Sep 2021 22:34:35 +0200 Subject: Rewrote Puzzler solver to use the new chat interface --- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 8 ++- .../skyblocker/skyblock/dwarven/Puzzler.java | 72 ++++++++++++++-------- 2 files changed, 52 insertions(+), 28 deletions(-) (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java index 17a5c4e5..f1a84fd1 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -1,17 +1,19 @@ package me.xmrvizzy.skyblocker.chat; 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 Fetchur(), + private final ChatListener[] listeners = new ChatListener[]{ + new Fetchur(), + new Puzzler(), }; public boolean shouldFilter(String message) { for (ChatListener listener : listeners) { - if(listener.isEnabled()) { + if (listener.isEnabled()) { Matcher m = listener.getPattern().matcher(message); if (m.matches()) { String[] groups = new String[m.groupCount() + 1]; 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 -- cgit From 2321e34939368981c24dce4f8ac751a7ac16b4d9 Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sun, 19 Sep 2021 14:39:51 +0200 Subject: Rewrote chat filters to use the new chat interface --- .../me/xmrvizzy/skyblocker/chat/ChatListener.java | 7 ++- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 7 +++ .../skyblocker/chat/filters/AbilityFilter.java | 15 ++++++ .../xmrvizzy/skyblocker/chat/filters/AdFilter.java | 43 ++++++++++++++++++ .../skyblocker/chat/filters/AoteFilter.java | 15 ++++++ .../skyblocker/chat/filters/HealFilter.java | 15 ++++++ .../skyblocker/chat/filters/ImplosionFilter.java | 15 ++++++ .../skyblocker/chat/filters/MoltenWaveFilter.java | 15 ++++++ .../xmrvizzy/skyblocker/skyblock/ChatFilter.java | 53 ---------------------- 9 files changed, 130 insertions(+), 55 deletions(-) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AbilityFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AdFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/AoteFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/HealFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/ImplosionFilter.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/chat/filters/MoltenWaveFilter.java delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/ChatFilter.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java index 349229d9..e89d06c2 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatListener.java @@ -3,7 +3,8 @@ package me.xmrvizzy.skyblocker.chat; import java.util.regex.Pattern; public abstract class ChatListener { - Pattern pattern; + 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); } @@ -13,5 +14,7 @@ public abstract class ChatListener { public abstract boolean isEnabled(); //Returns whether message should get filtered - public abstract boolean onMessage(String[] groups); + 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 index f1a84fd1..38d291a0 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -1,5 +1,6 @@ package me.xmrvizzy.skyblocker.chat; +import me.xmrvizzy.skyblocker.chat.filters.*; import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; @@ -7,6 +8,12 @@ import java.util.regex.Matcher; public class ChatParser { private final ChatListener[] listeners = new ChatListener[]{ + new AoteFilter(), + new ImplosionFilter(), + new MoltenWaveFilter(), + new HealFilter(), + new AbilityFilter(), + new AdFilter(), new Fetchur(), new Puzzler(), }; 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/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,})"); - } -} -- cgit From 83747a8bb2553aef5acc5988727de752bac55ffc Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sun, 19 Sep 2021 17:21:53 +0200 Subject: Rewrote Three Weirdos solver to use the new interface --- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 2 ++ .../skyblocker/skyblock/dungeon/ThreeWeirdos.java | 40 ++++++++++++++++++++++ 2 files changed, 42 insertions(+) create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/ThreeWeirdos.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java index 38d291a0..a74138ce 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -1,6 +1,7 @@ package me.xmrvizzy.skyblocker.chat; import me.xmrvizzy.skyblocker.chat.filters.*; +import me.xmrvizzy.skyblocker.skyblock.dungeon.ThreeWeirdos; import me.xmrvizzy.skyblocker.skyblock.dwarven.Fetchur; import me.xmrvizzy.skyblocker.skyblock.dwarven.Puzzler; @@ -8,6 +9,7 @@ import java.util.regex.Matcher; public class ChatParser { private final ChatListener[] listeners = new ChatListener[]{ + new ThreeWeirdos(), new AoteFilter(), new ImplosionFilter(), new MoltenWaveFilter(), 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; + } +} -- cgit From a0feb55973fc3eb4be4ae0ae2c76c88c9cd9f200 Mon Sep 17 00:00:00 2001 From: ExternalTime <84183548+ExternalTime@users.noreply.github.com> Date: Sun, 19 Sep 2021 18:10:00 +0200 Subject: Rewrote Trivia solver to use the new interface --- .../me/xmrvizzy/skyblocker/chat/ChatParser.java | 2 + .../skyblocker/config/SkyblockerConfig.java | 1 + .../skyblock/dungeon/DungeonPuzzles.java | 118 --------------------- .../skyblocker/skyblock/dungeon/Trivia.java | 89 ++++++++++++++++ .../resources/assets/skyblocker/lang/en_us.json | 1 + 5 files changed, 93 insertions(+), 118 deletions(-) delete mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonPuzzles.java create mode 100644 src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/Trivia.java (limited to 'src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java') diff --git a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java index a74138ce..9965c7c7 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java +++ b/src/main/java/me/xmrvizzy/skyblocker/chat/ChatParser.java @@ -2,6 +2,7 @@ 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; @@ -18,6 +19,7 @@ public class ChatParser { new AdFilter(), new Fetchur(), new Puzzler(), + new Trivia(), }; public boolean shouldFilter(String message) { 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/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 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/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 answers; + private List 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/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", -- cgit