aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authordaroche <94007359+GatienDoesStuff@users.noreply.github.com>2025-07-26 21:22:52 +0200
committerGitHub <noreply@github.com>2025-07-26 15:22:52 -0400
commit2c308770da40fdd8ac54e83a38036bba743a42ee (patch)
tree103ed9f9a32df58543d574f64d49b275e7afd453 /src/main/java
parent308ca74fb4480d75146ede4bfb355e856084bf11 (diff)
downloadSkyblocker-2c308770da40fdd8ac54e83a38036bba743a42ee.tar.gz
Skyblocker-2c308770da40fdd8ac54e83a38036bba743a42ee.tar.bz2
Skyblocker-2c308770da40fdd8ac54e83a38036bba743a42ee.zip
Improve secrets detection (#1483)
* Prevent misdetections for bats/item secrets * Avoid secrets getting wrongfully marked as found Now disables secret rendering as long as chat reports all secrets found. If it changes (meaning the current room is not cleared), it will re-enable rendering. * Use ALLOW_GAME to handle messages * prevent wrongful 'found' tag on bats --------- Co-authored-by: daroche <94007359+daroche@users.noreply.github.com>
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java4
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/DungeonManager.java58
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/Room.java8
-rw-r--r--src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java2
4 files changed, 42 insertions, 30 deletions
diff --git a/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
index 7ee59be1..5f69bada 100644
--- a/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
+++ b/src/main/java/de/hysky/skyblocker/mixins/BatEntityMixin.java
@@ -16,6 +16,8 @@ public abstract class BatEntityMixin extends AmbientEntity {
@Override
public void onRemoved() {
super.onRemoved();
- DungeonManager.onBatRemoved(this);
+ if (this.getHealth() <= 0) {
+ DungeonManager.onBatRemoved(this);
+ }
}
}
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 6cafb5ca..1931c7a6 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
@@ -1,5 +1,36 @@
package de.hysky.skyblocker.skyblock.dungeon.secrets;
+import static de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonMapUtils.getColor;
+import static de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonMapUtils.getMapPosForNWMostRoom;
+import static de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonMapUtils.getPhysicalPosFromMap;
+import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
+import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+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;
+
+import org.jetbrains.annotations.Contract;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import org.joml.Vector2i;
+import org.joml.Vector2ic;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.Table;
import com.google.gson.JsonArray;
@@ -12,6 +43,7 @@ import com.mojang.brigadier.builder.LiteralArgumentBuilder;
import com.mojang.brigadier.builder.RequiredArgumentBuilder;
import com.mojang.brigadier.context.CommandContext;
import com.mojang.serialization.JsonOps;
+
import de.hysky.skyblocker.SkyblockerMod;
import de.hysky.skyblocker.annotations.Init;
import de.hysky.skyblocker.config.SkyblockerConfigManager;
@@ -38,7 +70,6 @@ import net.fabricmc.fabric.api.client.networking.v1.ClientPlayConnectionEvents;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderContext;
import net.fabricmc.fabric.api.client.rendering.v1.WorldRenderEvents;
import net.fabricmc.fabric.api.event.player.UseBlockCallback;
-import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.block.Blocks;
import net.minecraft.client.MinecraftClient;
import net.minecraft.command.CommandRegistryAccess;
@@ -47,6 +78,7 @@ import net.minecraft.command.argument.TextArgumentType;
import net.minecraft.component.DataComponentTypes;
import net.minecraft.entity.ItemEntity;
import net.minecraft.entity.LivingEntity;
+import net.minecraft.entity.decoration.ArmorStandEntity;
import net.minecraft.entity.mob.AmbientEntity;
import net.minecraft.entity.passive.BatEntity;
import net.minecraft.entity.player.PlayerEntity;
@@ -66,30 +98,6 @@ import net.minecraft.util.math.Box;
import net.minecraft.util.math.Vec3d;
import net.minecraft.util.math.Vec3i;
import net.minecraft.world.World;
-import org.jetbrains.annotations.Contract;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import org.joml.Vector2i;
-import org.joml.Vector2ic;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.nio.file.Files;
-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;
-
-import static de.hysky.skyblocker.skyblock.dungeon.secrets.DungeonMapUtils.*;
-import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.argument;
-import static net.fabricmc.fabric.api.client.command.v2.ClientCommandManager.literal;
public class DungeonManager {
protected static final Logger LOGGER = LoggerFactory.getLogger(DungeonManager.class);
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 0dbb1f5f..0260a977 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
@@ -57,6 +57,7 @@ public class Room implements Tickable, Renderable {
private final Type type;
@NotNull
final Set<Vector2ic> segments;
+ private boolean isCleared = false;
/**
* The shape of the room. See {@link #getShape(IntSortedSet, IntSortedSet)}.
@@ -520,7 +521,7 @@ public class Room implements Tickable, Renderable {
}
synchronized (this) {
- if (SkyblockerConfigManager.get().dungeons.secretWaypoints.enableSecretWaypoints && isMatched()) {
+ if (SkyblockerConfigManager.get().dungeons.secretWaypoints.enableSecretWaypoints && isMatched() && !isCleared) {
for (SecretWaypoint secretWaypoint : secretWaypoints.values()) {
if (secretWaypoint.shouldRender()) {
secretWaypoint.render(context);
@@ -535,8 +536,9 @@ public class Room implements Tickable, Renderable {
*/
protected void onChatMessage(String message) {
if (isAllSecretsFound(message)) {
- markAllSecrets(true);
+ isCleared = true;
} else if (LOCKED_CHEST.equals(message) && lastChestSecretTime + 1000 > System.currentTimeMillis() && lastChestSecret != null) {
+ isCleared = false;
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));
}
@@ -599,7 +601,7 @@ public class Room implements Tickable, Renderable {
* @see #markSecretsFoundAndLogInfo(SecretWaypoint, String, Object...)
*/
protected void onBatRemoved(AmbientEntity bat) {
- secretWaypoints.values().stream().filter(SecretWaypoint::isBat).min(Comparator.comparingDouble(SecretWaypoint.getSquaredDistanceToFunction(bat)))
+ secretWaypoints.values().stream().filter(SecretWaypoint::isBat).min(Comparator.comparingDouble(SecretWaypoint.getSquaredDistanceToFunction(bat))).filter(SecretWaypoint.getRangePredicate(bat))
.ifPresent(secretWaypoint -> markSecretsFoundAndLogInfo(secretWaypoint, "[Skyblocker Dungeon Secrets] Detected {} killed for a {} secret, setting secret #{} as found", bat.getName().getString(), secretWaypoint.category, secretWaypoint.secretIndex));
}
diff --git a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
index 771f647d..50a37803 100644
--- a/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
+++ b/src/main/java/de/hysky/skyblocker/skyblock/dungeon/secrets/SecretWaypoint.java
@@ -60,7 +60,7 @@ public class SecretWaypoint extends DistancedNamedWaypoint {
}
static Predicate<SecretWaypoint> getRangePredicate(Entity entity) {
- return secretWaypoint -> entity.getPos().isInRange(secretWaypoint.centerPos, 36);
+ return secretWaypoint -> entity.getPos().isInRange(secretWaypoint.centerPos, 6);
}
@Override