aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/de/hysky
diff options
context:
space:
mode:
authorKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-12-19 15:27:23 +0800
committerKevinthegreat <92656833+kevinthegreat1@users.noreply.github.com>2023-12-19 15:28:56 +0800
commita7932307432867082db98956e23535d38fae6084 (patch)
tree46868914107418b10aae981f37cb5d5528b69c85 /src/main/java/de/hysky
parentf50e9a7fa0cb333f126c8d3faab61838fc111327 (diff)
downloadSkyblocker-a7932307432867082db98956e23535d38fae6084.tar.gz
Skyblocker-a7932307432867082db98956e23535d38fae6084.tar.bz2
Skyblocker-a7932307432867082db98956e23535d38fae6084.zip
Add support for puzzle detection through room matching
Diffstat (limited to 'src/main/java/de/hysky')
-rw-r--r--src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java18
-rw-r--r--src/main/java/de/hysky/skyblocker/events/DungeonEvents.java30
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java11
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java10
5 files changed, 51 insertions, 22 deletions
diff --git a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
index 8604913c..25d0c0bc 100644
--- a/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/de/hysky/skyblocker/config/SkyblockerConfig.java
@@ -644,10 +644,10 @@ public class SkyblockerConfig {
public static class SecretWaypoints {
@SerialEntry
- public boolean enableSecretWaypoints = true;
+ public boolean enableRoomMatching = true;
@SerialEntry
- public boolean noInitSecretWaypoints = false;
+ public boolean enableSecretWaypoints = true;
@SerialEntry
public Waypoint.Type waypointType = Waypoint.Type.WAYPOINT;
diff --git a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
index 3d304487..79e0b00c 100644
--- a/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/de/hysky/skyblocker/config/categories/DungeonsCategory.java
@@ -28,21 +28,21 @@ public class DungeonsCategory {
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints"))
.collapsed(true)
.option(Option.<Boolean>createBuilder()
+ .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableRoomMatching"))
+ .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableRoomMatching.@Tooltip")))
+ .binding(defaults.locations.dungeons.secretWaypoints.enableRoomMatching,
+ () -> config.locations.dungeons.secretWaypoints.enableRoomMatching,
+ newValue -> config.locations.dungeons.secretWaypoints.enableRoomMatching = newValue)
+ .controller(ConfigUtils::createBooleanController)
+ .flag(OptionFlag.GAME_RESTART)
+ .build())
+ .option(Option.<Boolean>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.enableSecretWaypoints"))
.binding(defaults.locations.dungeons.secretWaypoints.enableSecretWaypoints,
() -> config.locations.dungeons.secretWaypoints.enableSecretWaypoints,
newValue -> config.locations.dungeons.secretWaypoints.enableSecretWaypoints = newValue)
.controller(ConfigUtils::createBooleanController)
.build())
- .option(Option.<Boolean>createBuilder()
- .name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.noInitSecretWaypoints"))
- .description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.secretWaypoints.noInitSecretWaypoints.@Tooltip")))
- .binding(defaults.locations.dungeons.secretWaypoints.noInitSecretWaypoints,
- () -> config.locations.dungeons.secretWaypoints.noInitSecretWaypoints,
- newValue -> config.locations.dungeons.secretWaypoints.noInitSecretWaypoints = newValue)
- .controller(ConfigUtils::createBooleanController)
- .flag(OptionFlag.GAME_RESTART)
- .build())
.option(Option.<Type>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.general.waypoints.waypointType"))
.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.general.waypoints.waypointType.@Tooltip")))
diff --git a/src/main/java/de/hysky/skyblocker/events/DungeonEvents.java b/src/main/java/de/hysky/skyblocker/events/DungeonEvents.java
new file mode 100644
index 00000000..9efa3607
--- /dev/null
+++ b/src/main/java/de/hysky/skyblocker/events/DungeonEvents.java
@@ -0,0 +1,30 @@
+package de.hysky.skyblocker.events;
+
+import de.hysky.skyblocker.skyblock.dungeon.secrets.Room;
+import net.fabricmc.api.EnvType;
+import net.fabricmc.api.Environment;
+import net.fabricmc.fabric.api.event.Event;
+import net.fabricmc.fabric.api.event.EventFactory;
+
+public class DungeonEvents {
+ public static final Event<RoomMatched> PUZZLE_MATCHED = EventFactory.createArrayBacked(RoomMatched.class, callbacks -> room -> {
+ for (RoomMatched callback : callbacks) {
+ callback.onRoomMatched(room);
+ }
+ });
+
+ public static final Event<RoomMatched> ROOM_MATCHED = EventFactory.createArrayBacked(RoomMatched.class, callbacks -> room -> {
+ for (RoomMatched callback : callbacks) {
+ callback.onRoomMatched(room);
+ }
+ if (room.getType() == Room.Type.PUZZLE) {
+ PUZZLE_MATCHED.invoker().onRoomMatched(room);
+ }
+ });
+
+ @Environment(EnvType.CLIENT)
+ @FunctionalInterface
+ public interface RoomMatched {
+ void onRoomMatched(Room room);
+ }
+}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
index 7f401fdb..b9e149c6 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonSecrets.java
@@ -195,7 +195,7 @@ public class DungeonSecrets {
* Use {@link #isRoomsLoaded()} to check for completion of loading.
*/
public static void init() {
- if (SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.noInitSecretWaypoints) {
+ if (!SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableRoomMatching) {
return;
}
// Execute with MinecraftClient as executor since we need to wait for MinecraftClient#resourceManager to be set
@@ -426,9 +426,6 @@ public class DungeonSecrets {
*/
@SuppressWarnings("JavadocReference")
private static void update() {
- if (!SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableSecretWaypoints) {
- return;
- }
if (!Utils.isInDungeons()) {
if (mapEntrancePos != null) {
reset();
@@ -663,12 +660,12 @@ public class DungeonSecrets {
}
/**
- * Checks if the player is in a dungeon and {@link de.hysky.skyblocker.config.SkyblockerConfig.Dungeons#secretWaypoints Secret Waypoints} is enabled.
+ * Checks if {@link de.hysky.skyblocker.config.SkyblockerConfig.SecretWaypoints#enableRoomMatching room matching} is enabled and the player is in a dungeon.
*
- * @return whether dungeon secrets should be processed
+ * @return whether room matching and dungeon secrets should be processed
*/
private static boolean shouldProcess() {
- return SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableSecretWaypoints && Utils.isInDungeons();
+ return SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableRoomMatching && Utils.isInDungeons();
}
/**
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 7d717e08..0d3c6a87 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
@@ -7,6 +7,7 @@ import com.google.gson.JsonObject;
import com.mojang.brigadier.arguments.IntegerArgumentType;
import com.mojang.brigadier.context.CommandContext;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
+import de.hysky.skyblocker.events.DungeonEvents;
import de.hysky.skyblocker.utils.Constants;
import de.hysky.skyblocker.utils.render.RenderHelper;
import de.hysky.skyblocker.utils.scheduler.Scheduler;
@@ -381,6 +382,7 @@ public class Room {
int matchingRoomsSize = possibleRooms.stream().map(Triple::getRight).mapToInt(Collection::size).sum();
if (matchingRoomsSize == 0) {
// If no rooms match, reset the fields and scan again after 50 ticks.
+ matchState = MatchState.FAILED;
DungeonSecrets.LOGGER.warn("[Skyblocker Dungeon Secrets] No dungeon room matched after checking {} block(s) including double checking {} block(s)", checkedBlocks.size(), doubleCheckBlocks);
Scheduler.INSTANCE.schedule(() -> matchState = MatchState.MATCHING, 50);
reset();
@@ -397,7 +399,9 @@ public class Room {
return false;
} else if (matchState == MatchState.DOUBLE_CHECKING && ++doubleCheckBlocks >= 10) {
// If double-checked, set state to matched and discard the no longer needed fields.
- DungeonSecrets.LOGGER.info("[Skyblocker Dungeon Secrets] Room {} matched after checking {} block(s) including double checking {} block(s)", name, checkedBlocks.size(), doubleCheckBlocks);
+ matchState = MatchState.MATCHED;
+ DungeonEvents.ROOM_MATCHED.invoker().onRoomMatched(this);
+ DungeonSecrets.LOGGER.info("[Skyblocker Dungeon Secrets] Room {} confirmed after checking {} block(s) including double checking {} block(s)", name, checkedBlocks.size(), doubleCheckBlocks);
discard();
return true;
}
@@ -444,7 +448,6 @@ public class Room {
* Resets fields for another round of matching after room matching fails.
*/
private void reset() {
- matchState = MatchState.FAILED;
IntSortedSet segmentsX = IntSortedSets.unmodifiable(new IntRBTreeSet(segments.stream().mapToInt(Vector2ic::x).toArray()));
IntSortedSet segmentsY = IntSortedSets.unmodifiable(new IntRBTreeSet(segments.stream().mapToInt(Vector2ic::y).toArray()));
possibleRooms = getPossibleRooms(segmentsX, segmentsY);
@@ -461,7 +464,6 @@ public class Room {
* These fields are no longer needed and are discarded to save memory.
*/
private void discard() {
- matchState = MatchState.MATCHED;
roomsData = null;
possibleRooms = null;
checkedBlocks = null;
@@ -486,7 +488,7 @@ public class Room {
* Calls {@link SecretWaypoint#render(WorldRenderContext)} on {@link #secretWaypoints all secret waypoints} and renders a highlight around the wither or blood door, if it exists.
*/
protected void render(WorldRenderContext context) {
- if (isMatched()) {
+ if (SkyblockerConfigManager.get().locations.dungeons.secretWaypoints.enableSecretWaypoints && isMatched()) {
for (SecretWaypoint secretWaypoint : secretWaypoints.values()) {
if (secretWaypoint.shouldRender()) {
secretWaypoint.render(context);