diff options
author | Kevin <92656833+kevinthegreat1@users.noreply.github.com> | 2024-05-20 16:46:42 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-05-20 16:46:42 -0400 |
commit | ddaf2825c2dc5fee3bdc247b8f9f42090ca98e8d (patch) | |
tree | e2c410ac74864c90dd0f977efbf6701185313b51 /src | |
parent | d543192a1fdf35165f9f10f1903b1427b67df51b (diff) | |
download | Skyblocker-ddaf2825c2dc5fee3bdc247b8f9f42090ca98e8d.tar.gz Skyblocker-ddaf2825c2dc5fee3bdc247b8f9f42090ca98e8d.tar.bz2 Skyblocker-ddaf2825c2dc5fee3bdc247b8f9f42090ca98e8d.zip |
Migrate ThreeWeirdos to DungeonPuzzle and highlight chest (#705)
Diffstat (limited to 'src')
7 files changed, 97 insertions, 35 deletions
diff --git a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java index 0dc1b409..e6b2d25a 100644 --- a/src/main/java/de/hysky/skyblocker/SkyblockerMod.java +++ b/src/main/java/de/hysky/skyblocker/SkyblockerMod.java @@ -167,6 +167,7 @@ public class SkyblockerMod implements ClientModInitializer { ItemProtection.init(); CreeperBeams.init(); Boulder.init(); + ThreeWeirdos.init(); VisitorHelper.init(); ItemRarityBackgrounds.init(); MuseumItemCache.init(); diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonPuzzle.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonPuzzle.java index f5e0461d..42034d9f 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonPuzzle.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/DungeonPuzzle.java @@ -6,6 +6,7 @@ import de.hysky.skyblocker.events.DungeonEvents; import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; import de.hysky.skyblocker.skyblock.dungeon.secrets.Room; import de.hysky.skyblocker.utils.Constants; +import de.hysky.skyblocker.utils.Resettable; import de.hysky.skyblocker.utils.Tickable; import de.hysky.skyblocker.utils.render.Renderable; import net.fabricmc.fabric.api.client.command.v2.ClientCommandRegistrationCallback; @@ -16,7 +17,7 @@ import java.util.Set; import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal; -public abstract class DungeonPuzzle implements Tickable, Renderable { +public abstract class DungeonPuzzle implements Tickable, Renderable, Resettable { protected final String puzzleName; @NotNull private final Set<String> roomNames; @@ -46,13 +47,14 @@ public abstract class DungeonPuzzle implements Tickable, Renderable { } return Command.SINGLE_SUCCESS; }))))))); - ClientPlayConnectionEvents.JOIN.register((handler, sender, client) -> reset()); + ClientPlayConnectionEvents.JOIN.register(this); } public boolean shouldSolve() { return shouldSolve; } + @Override public void reset() { shouldSolve = false; } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java index 30119204..98d32c68 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdos.java @@ -1,39 +1,85 @@ package de.hysky.skyblocker.skyblock.dungeon.puzzle; import de.hysky.skyblocker.config.SkyblockerConfigManager; -import de.hysky.skyblocker.utils.chat.ChatFilterResult; -import de.hysky.skyblocker.utils.chat.ChatPatternListener; +import de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonManager; +import de.hysky.skyblocker.skyblock.dungeon.secrets.Room; +import de.hysky.skyblocker.utils.render.RenderHelper; +import net.fabricmc.fabric.api.client.message.v1.ClientReceiveMessageEvents; +import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext; +import net.fabricmc.fabric.api.event.player.UseBlockCallback; import net.minecraft.client.MinecraftClient; import net.minecraft.entity.decoration.ArmorStandEntity; import net.minecraft.text.Text; +import net.minecraft.util.ActionResult; import net.minecraft.util.Formatting; +import net.minecraft.util.hit.HitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.minecraft.world.World; +import java.util.List; import java.util.regex.Matcher; +import java.util.regex.Pattern; -public class ThreeWeirdos extends ChatPatternListener { - public ThreeWeirdos() { - super("^\\[NPC] ([A-Z][a-z]+): (?: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 [A-Z][a-z]+'s chest\\!|Both of them are telling the truth\\. Also, [A-Z][a-z]+ has the reward in their chest\\!)$"); +public class ThreeWeirdos extends DungeonPuzzle { + protected static final Pattern PATTERN = Pattern.compile("^\\[NPC] ([A-Z][a-z]+): (?: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 [A-Z][a-z]+'s chest!|Both of them are telling the truth\\. Also, [A-Z][a-z]+ has the reward in their chest!)$"); + private static final float[] GREEN_COLOR_COMPONENTS = new float[]{0, 1, 0}; + private static BlockPos pos; + + private ThreeWeirdos() { + super("three-weirdos", "three-chests"); + ClientReceiveMessageEvents.GAME.register((message, overlay) -> { + World world = MinecraftClient.getInstance().world; + if (overlay || !shouldSolve() || !SkyblockerConfigManager.get().dungeons.puzzleSolvers.solveThreeWeirdos || world == null || !DungeonManager.isCurrentRoomMatched()) return; + + @SuppressWarnings("DataFlowIssue") + Matcher matcher = PATTERN.matcher(Formatting.strip(message.getString())); + if (!matcher.matches()) return; + String name = matcher.group(1); + Room room = DungeonManager.getCurrentRoom(); + + checkForNPC(world, room, new BlockPos(13, 69, 24), name); + checkForNPC(world, room, new BlockPos(15, 69, 25), name); + checkForNPC(world, room, new BlockPos(17, 69, 24), name); + }); + UseBlockCallback.EVENT.register((player, world, hand, blockHitResult) -> { + if (blockHitResult.getType() == HitResult.Type.BLOCK && blockHitResult.getBlockPos().equals(pos)) { + pos = null; + } + return ActionResult.PASS; + }); } - @Override - public ChatFilterResult state() { - return SkyblockerConfigManager.get().dungeons.puzzleSolvers.solveThreeWeirdos ? null : ChatFilterResult.PASS; + public static void init() { + new ThreeWeirdos(); } - @Override - public boolean onMatch(Text message, Matcher matcher) { - MinecraftClient client = MinecraftClient.getInstance(); - if (client.player == null || client.world == null) return false; - client.world.getEntitiesByClass( + private void checkForNPC(World world, Room room, BlockPos relative, String name) { + BlockPos npcPos = room.relativeToActual(relative); + List<ArmorStandEntity> npcs = world.getEntitiesByClass( ArmorStandEntity.class, - client.player.getBoundingBox().expand(3), - entity -> { - Text customName = entity.getCustomName(); - return customName != null && customName.getString().equals(matcher.group(1)); - } - ).forEach( - entity -> entity.setCustomName(Text.of(Formatting.GREEN + matcher.group(1))) + Box.enclosing(npcPos, npcPos), + entity -> entity.getName().getString().equals(name) ); - return false; + if (!npcs.isEmpty()) { + pos = room.relativeToActual(relative.add(1, 0, 0)); + npcs.forEach(entity -> entity.setCustomName(Text.literal(name).formatted(Formatting.GREEN))); + } + } + + @Override + public void tick(MinecraftClient client) {} + + @Override + public void render(WorldRenderContext context) { + if (shouldSolve() && pos != null) { + RenderHelper.renderFilled(context, pos, GREEN_COLOR_COMPONENTS, 0.5f, true); + } + } + + @Override + public void reset() { + super.reset(); + pos = null; } } diff --git a/src/main/java/de/hysky/skyblocker/utils/Resettable.java b/src/main/java/de/hysky/skyblocker/utils/Resettable.java new file mode 100644 index 00000000..d16a316b --- /dev/null +++ b/src/main/java/de/hysky/skyblocker/utils/Resettable.java @@ -0,0 +1,15 @@ +package de.hysky.skyblocker.utils; + +import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents; +import net.fabricmc.fabric.api.networking.v1.PacketSender; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.network.ClientPlayNetworkHandler; + +public interface Resettable extends ClientPlayConnectionEvents.Join { + void reset(); + + @Override + default void onPlayReady(ClientPlayNetworkHandler handler, PacketSender sender, MinecraftClient client) { + reset(); + } +} diff --git a/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java b/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java index 1f0caff5..f6195171 100644 --- a/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java +++ b/src/main/java/de/hysky/skyblocker/utils/chat/ChatMessageListener.java @@ -3,7 +3,6 @@ package de.hysky.skyblocker.utils.chat; import de.hysky.skyblocker.skyblock.barn.HungryHiker; import de.hysky.skyblocker.skyblock.barn.TreasureHunter; import de.hysky.skyblocker.skyblock.dungeon.Reparty; -import de.hysky.skyblocker.skyblock.dungeon.puzzle.ThreeWeirdos; import de.hysky.skyblocker.skyblock.dungeon.puzzle.Trivia; import de.hysky.skyblocker.skyblock.dwarven.Fetchur; import de.hysky.skyblocker.skyblock.dwarven.Puzzler; @@ -40,7 +39,6 @@ public interface ChatMessageListener { new Fetchur(), new Puzzler(), new Reparty(), - new ThreeWeirdos(), new Trivia(), new TreasureHunter(), new HungryHiker(), diff --git a/src/test/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdosTest.java b/src/test/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdosTest.java index 38e795c3..5d1b2e66 100644 --- a/src/test/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdosTest.java +++ b/src/test/java/de/hysky/skyblocker/skyblock/dungeon/puzzle/ThreeWeirdosTest.java @@ -3,17 +3,14 @@ package de.hysky.skyblocker.skyblock.dungeon.puzzle; import de.hysky.skyblocker.utils.chat.ChatPatternListenerTest; import org.junit.jupiter.api.Test; -class ThreeWeirdosTest extends ChatPatternListenerTest<ThreeWeirdos> { - public ThreeWeirdosTest() { - super(new ThreeWeirdos()); - } - +class ThreeWeirdosTest { @Test - void test1() { - assertGroup("[NPC] Baxter: My chest doesn't have the reward. We are all telling the truth.", 1, "Baxter"); + void testBaxter() { + ChatPatternListenerTest.assertGroup(ThreeWeirdos.PATTERN.matcher("[NPC] Baxter: My chest doesn't have the reward. We are all telling the truth."), 1, "Baxter"); } + @Test - void test2() { - assertGroup("[NPC] Hope: The reward isn't in any of our chests.", 1, "Hope"); + void testHope() { + ChatPatternListenerTest.assertGroup(ThreeWeirdos.PATTERN.matcher("[NPC] Hope: The reward isn't in any of our chests."), 1, "Hope"); } }
\ No newline at end of file diff --git a/src/test/java/de/hysky/skyblocker/utils/chat/ChatPatternListenerTest.java b/src/test/java/de/hysky/skyblocker/utils/chat/ChatPatternListenerTest.java index 8b670cbb..1caff40c 100644 --- a/src/test/java/de/hysky/skyblocker/utils/chat/ChatPatternListenerTest.java +++ b/src/test/java/de/hysky/skyblocker/utils/chat/ChatPatternListenerTest.java @@ -21,7 +21,10 @@ public abstract class ChatPatternListenerTest<T extends ChatPatternListener> { } protected void assertGroup(String message, int group, String expect) { - Matcher matcher = matcher(message); + assertGroup(matcher(message), group, expect); + } + + public static void assertGroup(Matcher matcher, int group, String expect) { assertTrue(matcher.matches()); assertEquals(expect, matcher.group(group)); } |