diff options
| author | Anton <79146501+btwonion@users.noreply.github.com> | 2024-08-18 21:38:37 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-18 15:38:37 -0400 |
| commit | ec6a2176bf6636c3c2fe1daaa5d2d228e946cd87 (patch) | |
| tree | e88a71b54547d65fd54ccd79fb6df62c3427462e /src | |
| parent | 996ff078f92fe4c825eb53aab3ddd12601a685fa (diff) | |
| download | Skyblocker-ec6a2176bf6636c3c2fe1daaa5d2d228e946cd87.tar.gz Skyblocker-ec6a2176bf6636c3c2fe1daaa5d2d228e946cd87.tar.bz2 Skyblocker-ec6a2176bf6636c3c2fe1daaa5d2d228e946cd87.zip | |
Mark all secrets missing in subcommand (#927)
* add Room#markAllSecrets
* create subcommand "markAllAsMissing"
* use subcommand of markAsMissing
* add suggestion for markAsMissing index argument
* use IntStream instead of for
* fix range
Diffstat (limited to 'src')
3 files changed, 33 insertions, 3 deletions
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java index fbe99909..1429e2e0 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java @@ -8,6 +8,7 @@ import com.google.gson.JsonObject; import com.mojang.brigadier.Command; import com.mojang.brigadier.arguments.IntegerArgumentType; import com.mojang.brigadier.arguments.StringArgumentType; +import com.mojang.brigadier.builder.LiteralArgumentBuilder; import com.mojang.brigadier.builder.RequiredArgumentBuilder; import com.mojang.brigadier.context.CommandContext; import com.mojang.serialization.JsonOps; @@ -80,6 +81,7 @@ import java.nio.file.Path; import java.util.*; import java.util.concurrent.CompletableFuture; import java.util.regex.Pattern; +import java.util.stream.IntStream; import java.util.stream.Stream; import java.util.zip.InflaterInputStream; @@ -252,7 +254,7 @@ public class DungeonManager { UseBlockCallback.EVENT.register((player, world, hand, hitResult) -> onUseBlock(world, hitResult)); ClientCommandRegistrationCallback.EVENT.register((dispatcher, registryAccess) -> dispatcher.register(literal(SkyblockerMod.NAMESPACE).then(literal("dungeons").then(literal("secrets") .then(literal("markAsFound").then(markSecretsCommand(true))) - .then(literal("markAsMissing").then(markSecretsCommand(false))) + .then(literal("markAsMissing").then(markSecretsCommand(false)).then(markAllSecretsAsMissingCommand())) .then(literal("getRelativePos").executes(DungeonManager::getRelativePos)) .then(literal("getRelativeTargetPos").executes(DungeonManager::getRelativeTargetPos)) .then(literal("addWaypoint").then(addCustomWaypointCommand(false, registryAccess))) @@ -361,7 +363,12 @@ public class DungeonManager { } private static RequiredArgumentBuilder<FabricClientCommandSource, Integer> markSecretsCommand(boolean found) { - return argument("secretIndex", IntegerArgumentType.integer()).executes(context -> { + return argument("secretIndex", IntegerArgumentType.integer()).suggests((provider, builder) -> { + if (isCurrentRoomMatched()) { + IntStream.rangeClosed(1, currentRoom.getSecretCount()).forEach(builder::suggest); + } + return builder.buildFuture(); + }).executes(context -> { int secretIndex = IntegerArgumentType.getInteger(context, "secretIndex"); if (markSecrets(secretIndex, found)) { context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable(found ? "skyblocker.dungeons.secrets.markSecretFound" : "skyblocker.dungeons.secrets.markSecretMissing", secretIndex))); @@ -372,6 +379,19 @@ public class DungeonManager { }); } + private static LiteralArgumentBuilder<FabricClientCommandSource> markAllSecretsAsMissingCommand() { + return literal("all").executes(context -> { + if (isCurrentRoomMatched()) { + currentRoom.markAllSecrets(false); + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secrets.markSecretsMissing"))); + } else { + context.getSource().sendFeedback(Constants.PREFIX.get().append(Text.translatable("skyblocker.dungeons.secrets.markSecretsMissingUnable"))); + } + + return Command.SINGLE_SUCCESS; + }); + } + private static int getRelativePos(CommandContext<FabricClientCommandSource> context) { return getRelativePos(context.getSource(), context.getSource().getPlayer().getBlockPos()); } diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java index 1f4f9ed6..e574b136 100644 --- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java +++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java @@ -520,7 +520,7 @@ public class Room implements Tickable, Renderable { */ protected void onChatMessage(String message) { if (isAllSecretsFound(message)) { - secretWaypoints.values().forEach(SecretWaypoint::setFound); + markAllSecrets(true); } else if (LOCKED_CHEST.equals(message) && lastChestSecretTime + 1000 > System.currentTimeMillis() && lastChestSecret != null) { secretWaypoints.column(lastChestSecret).values().stream().filter(SecretWaypoint::needsInteraction).findAny() .ifPresent(secretWaypoint -> markSecretsAndLogInfo(secretWaypoint, false, "[Skyblocker Dungeon Secrets] Detected locked chest interaction, setting secret #{} as missing", secretWaypoint.secretIndex)); @@ -622,6 +622,14 @@ public class Room implements Tickable, Renderable { } } + protected void markAllSecrets(boolean found) { + secretWaypoints.values().forEach(found ? SecretWaypoint::setFound : SecretWaypoint::setMissing); + } + + protected int getSecretCount() { + return secretWaypoints.rowMap().size(); + } + public enum Type { ENTRANCE(MapColor.DARK_GREEN.getRenderColorByte(MapColor.Brightness.HIGH)), ROOM(MapColor.ORANGE.getRenderColorByte(MapColor.Brightness.LOWEST)), diff --git a/src/main/resources/assets/skyblocker/lang/en_us.json b/src/main/resources/assets/skyblocker/lang/en_us.json index cbea310d..b0537af0 100644 --- a/src/main/resources/assets/skyblocker/lang/en_us.json +++ b/src/main/resources/assets/skyblocker/lang/en_us.json @@ -839,6 +839,8 @@ "skyblocker.dungeons.secrets.markSecretMissing": "§rMarked secret #%d as missing.", "skyblocker.dungeons.secrets.markSecretFoundUnable": "§cUnable to mark secret #%d as found.", "skyblocker.dungeons.secrets.markSecretMissingUnable": "§cUnable to mark secret #%d as missing.", + "skyblocker.dungeons.secrets.markSecretsMissing": "§rMarked all secrets in this room as missing.", + "skyblocker.dungeons.secrets.markSecretsMissingUnable": "§cUnable to mark secrets in this room as missing.", "skyblocker.dungeons.secrets.posMessage": "§rRoom: %s, Direction: %s, X: %d, Y: %d, Z: %d", "skyblocker.dungeons.secrets.noTarget": "§cNo target block found! (Are you pointing at a block in range?)", "skyblocker.dungeons.secrets.notMatched": "§cThe current room is not matched! (Are you in a dungeon room?)", |
