From 2c308770da40fdd8ac54e83a38036bba743a42ee Mon Sep 17 00:00:00 2001 From: daroche <94007359+GatienDoesStuff@users.noreply.github.com> Date: Sat, 26 Jul 2025 21:22:52 +0200 Subject: 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> --- .../de/hysky/skyblocker/mixins/BatEntityMixin.java | 4 +- .../skyblock/dungeon/secrets/DungeonManager.java | 58 ++++++++++++---------- .../skyblocker/skyblock/dungeon/secrets/Room.java | 8 +-- .../skyblock/dungeon/secrets/SecretWaypoint.java | 2 +- 4 files changed, 42 insertions(+), 30 deletions(-) (limited to 'src/main/java') 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 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 getRangePredicate(Entity entity) { - return secretWaypoint -> entity.getPos().isInRange(secretWaypoint.centerPos, 36); + return secretWaypoint -> entity.getPos().isInRange(secretWaypoint.centerPos, 6); } @Override -- cgit