aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
diff options
context:
space:
mode:
authorWalker Selby <git@walkerselby.com>2022-03-27 12:13:08 -0500
committerGitHub <noreply@github.com>2022-03-27 13:13:08 -0400
commit5e7a8a02fe836c1e635faf067fbe8913549bc0e0 (patch)
treedc99a2544bd81af6d70c7bd07ba53142ff38d057 /src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
parent47efdd4f84cc9a29738fe16d631eb33ee716db61 (diff)
downloadnotenoughupdates-5e7a8a02fe836c1e635faf067fbe8913549bc0e0.tar.gz
notenoughupdates-5e7a8a02fe836c1e635faf067fbe8913549bc0e0.tar.bz2
notenoughupdates-5e7a8a02fe836c1e635faf067fbe8913549bc0e0.zip
Add NBT Data to Profile Viewer Tabs and XP Bars (#94)
* Fixed what hypxiel broke in dungeons * Added Longswords to Tools Tab (Itemlist) * Set max cata level to 70 * ups * why is it now E * YEP the cap is 99 not 70 * long cata xp BatChest + remove crash check because hypixel profile is null and i havent fixed that yet * Added checks for chat messages for dungeon win overlay - i think ive got them all but 4Shrug * Added an option to alert you if you put something for too much onto ah (default 50%) + Lowest bin alert triggers if lowest bin isnt found * IMPORTANT * fix dungeon page in /pv * show minions from coop in /pv * (BREAKING CHANGE) remove whitespace in changelog * fix crash with minion check * initial draft * tooltip * important changes * progress related things progress bar for community goals total collected points and personal goals display * only show bingo tab on Bingo profiles * make goals display gold when completed * Added MM7 button to dungeon preset * wart go not stonks * fix percents and added stack size * use code nopo in fortnite shop — Today at 17:29 The capitalisation * config option for always showing bingo page * 🙂 * movble pv tabs * 2.1.md 🙂 * oops * der Kabel * import * Added powder amount to level up perk * Made it only show if the perk isnt maxed / level 0 * fix /pv crash when pet is not in repo * 2.1.md 🙂 * web editor my beloved * Add NBT Data to Profile Viewer Tabs and XP Bars Add NBT Data Support for Resources in Tabs Add NBT Data Support for Resources in XP Bars Optimize renderTabs function Optimize mouseClicked Function Optimize ProfileViewerPage Enum * Update Style Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> * Update GuiProfileViewer Rebased on pvbingo Updated formatting with IntelliJ reformatting tool (hopefully that matches now, let me know if you want me to try again but I think I did it right) * dungeons and pv bingo tab (#93) * add custom skull loading back (#96) * Refactor Hollows solvers, add tests, add Vec3Comparable, fix bugs (#95) * Rebase on master * Fix conflicts and rebase on master Add changes to change log * Oops Co-authored-by: nopo <noahogno@gmail.com> Co-authored-by: jani270 <jani270@gmx.de> Co-authored-by: Lulonaut <lulonaut@tutanota.de> Co-authored-by: NopoTheGamer <40329022+NopoTheGamer@users.noreply.github.com> Co-authored-by: Lulonaut <67191924+Lulonaut@users.noreply.github.com> Co-authored-by: CraftyOldMiner <85420839+CraftyOldMiner@users.noreply.github.com>
Diffstat (limited to 'src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java')
-rw-r--r--src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java450
1 files changed, 176 insertions, 274 deletions
diff --git a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
index f43ebda2..27c334ad 100644
--- a/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
+++ b/src/main/java/io/github/moulberry/notenoughupdates/miscfeatures/CrystalMetalDetectorSolver.java
@@ -1,7 +1,6 @@
package io.github.moulberry.notenoughupdates.miscfeatures;
import io.github.moulberry.notenoughupdates.NotEnoughUpdates;
-import io.github.moulberry.notenoughupdates.core.util.Vec3Comparable;
import io.github.moulberry.notenoughupdates.core.util.render.RenderUtils;
import io.github.moulberry.notenoughupdates.options.customtypes.NEUDebugFlag;
import io.github.moulberry.notenoughupdates.util.NEUDebugLogger;
@@ -12,6 +11,7 @@ import net.minecraft.util.BlockPos;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.EnumChatFormatting;
import net.minecraft.util.IChatComponent;
+import net.minecraft.util.Vec3;
import net.minecraft.util.Vec3i;
import java.util.Arrays;
@@ -22,35 +22,25 @@ import java.util.List;
import java.util.stream.Collectors;
public class CrystalMetalDetectorSolver {
- enum SolutionState {
- NOT_STARTED,
- MULTIPLE,
- MULTIPLE_KNOWN,
- FOUND,
- FOUND_KNOWN,
- FAILED,
- INVALID,
- }
-
private static final Minecraft mc = Minecraft.getMinecraft();
- private static Vec3Comparable prevPlayerPos;
- private static double prevDistToTreasure;
+ private static BlockPos prevPlayerPos;
+ private static double prevDistToTreasure = 0;
private static HashSet<BlockPos> possibleBlocks = new HashSet<>();
- private static final HashMap<Vec3Comparable, Double> evaluatedPlayerPositions = new HashMap<>();
- private static boolean chestRecentlyFound;
- private static long chestLastFoundMillis;
+ private static final HashMap<BlockPos, Double> evaluatedPlayerPositions = new HashMap<>();
+ private static BlockPos blockPosIfLastSolutionInvalid;
+ private static Boolean chestRecentlyFound = false;
+ private static long chestLastFoundMillis = 0;
private static final HashSet<BlockPos> openedChestPositions = new HashSet<>();
// Keeper and Mines of Divan center location info
private static Vec3i minesCenter;
- private static boolean debugDoNotUseCenter = false;
- private static boolean visitKeeperMessagePrinted;
- private static final String KEEPER_OF_STRING = "Keeper of ";
- private static final String DIAMOND_STRING = "diamond";
- private static final String LAPIS_STRING = "lapis";
- private static final String EMERALD_STRING = "emerald";
- private static final String GOLD_STRING = "gold";
+ private static boolean visitKeeperMessagePrinted = false;
+ private static String KEEPER_OF_STRING = "Keeper of ";
+ private static String DIAMOND_STRING = "diamond";
+ private static String LAPIS_STRING = "lapis";
+ private static String EMERALD_STRING = "emerald";
+ private static String GOLD_STRING = "gold";
private static final HashMap<String, Vec3i> keeperOffsets = new HashMap<String, Vec3i>() {{
put(DIAMOND_STRING, new Vec3i(33,0,3));
put(LAPIS_STRING, new Vec3i(-33,0,-3));
@@ -104,14 +94,6 @@ public class CrystalMetalDetectorSolver {
-9896946827286L // x=-37, y=-21, z=-22
));
- static Predicate<BlockPos> treasureAllowedPredicate = CrystalMetalDetectorSolver::treasureAllowed;
- static SolutionState currentState = SolutionState.NOT_STARTED;
- static SolutionState previousState = SolutionState.NOT_STARTED;
-
- public interface Predicate<BlockPos> {
- boolean check(BlockPos blockPos);
- }
-
public static void process(IChatComponent message) {
if (SBInfo.getInstance().getLocation() == null ||
!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled ||
@@ -120,7 +102,7 @@ public class CrystalMetalDetectorSolver {
return;
}
- boolean centerNewlyDiscovered = locateMinesCenterIfNeeded();
+ locateMinesCenterIfNeeded();
double distToTreasure = Double.parseDouble(message
.getUnformattedText()
@@ -140,64 +122,20 @@ public class CrystalMetalDetectorSolver {
chestRecentlyFound = false;
}
- SolutionState originalState = currentState;
- int originalCount = possibleBlocks.size();
- Vec3Comparable adjustedPlayerPos = getPlayerPosAdjustedForEyeHeight();
- findPossibleSolutions(distToTreasure, adjustedPlayerPos, centerNewlyDiscovered);
- if (currentState != originalState || originalCount != possibleBlocks.size()) {
- switch (currentState) {
- case FOUND_KNOWN:
- NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified.");
- // falls through
- case FOUND:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution."));
- if (NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL) &&
- (previousState == SolutionState.INVALID || previousState == SolutionState.FAILED)) {
- NEUDebugLogger.log(NEUDebugFlag.METAL,
- EnumChatFormatting.AQUA + "Solution coordinates: " +
- EnumChatFormatting.WHITE + possibleBlocks.iterator().next().toString());
- }
- break;
- case INVALID:
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] Previous solution is invalid."));
- logDiagnosticData(false);
- resetSolution(false);
- break;
- case FAILED:
- mc.thePlayer.addChatMessage(new ChatComponentText(
- EnumChatFormatting.RED + "[NEU] Failed to find a solution."));
- logDiagnosticData(false);
- resetSolution(false);
- break;
- case MULTIPLE_KNOWN:
- NEUDebugLogger.log(NEUDebugFlag.METAL, "Multiple known locations identified:");
- // falls through
- case MULTIPLE:
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
- "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size()));
- break;
- default:
- throw new IllegalStateException("Metal detector is in invalid state");
- }
- }
- }
-
- static void findPossibleSolutions(double distToTreasure, Vec3Comparable playerPos, boolean centerNewlyDiscovered) {
- if (prevDistToTreasure == distToTreasure && prevPlayerPos.equals(playerPos) &&
- !evaluatedPlayerPositions.containsKey(playerPos)) {
- evaluatedPlayerPositions.put(playerPos, distToTreasure);
+ if (prevDistToTreasure == distToTreasure &&
+ prevPlayerPos.equals(mc.thePlayer.getPosition()) &&
+ !evaluatedPlayerPositions.keySet().contains(mc.thePlayer.getPosition())) {
if (possibleBlocks.size() == 0) {
+ evaluatedPlayerPositions.put(mc.thePlayer.getPosition(), distToTreasure);
for (int zOffset = (int) Math.floor(-distToTreasure); zOffset <= Math.ceil(distToTreasure); zOffset++) {
for (int y = 65; y <= 75; y++) {
double calculatedDist = 0;
int xOffset = 0;
while (calculatedDist < distToTreasure) {
- BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) + xOffset,
- y, Math.floor(playerPos.zCoord) + zOffset
- );
- calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D));
- if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) {
+ BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) + xOffset,
+ y, Math.floor(mc.thePlayer.posZ) + zOffset);
+ calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D));
+ if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) {
possibleBlocks.add(pos);
}
xOffset++;
@@ -205,11 +143,10 @@ public class CrystalMetalDetectorSolver {
xOffset = 0;
calculatedDist = 0;
while (calculatedDist < distToTreasure) {
- BlockPos pos = new BlockPos(Math.floor(playerPos.xCoord) - xOffset,
- y, Math.floor(playerPos.zCoord) + zOffset
- );
- calculatedDist = playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D));
- if (round(calculatedDist, 1) == distToTreasure && treasureAllowedPredicate.check(pos)) {
+ BlockPos pos = new BlockPos(Math.floor(mc.thePlayer.posX) - xOffset,
+ y, Math.floor(mc.thePlayer.posZ) + zOffset);
+ calculatedDist = getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D));
+ if (round(calculatedDist, 1) == distToTreasure && treasureAllowed(pos)) {
possibleBlocks.add(pos);
}
xOffset++;
@@ -217,33 +154,48 @@ public class CrystalMetalDetectorSolver {
}
}
- updateSolutionState();
+ checkAndDisplaySolutionState();
} else if (possibleBlocks.size() != 1) {
+ evaluatedPlayerPositions.put(mc.thePlayer.getPosition().getImmutable(), distToTreasure);
HashSet<BlockPos> temp = new HashSet<>();
for (BlockPos pos : possibleBlocks) {
- if (round(playerPos.distanceTo(new Vec3Comparable(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) {
+ if (round(getPlayerPos().distanceTo(new Vec3(pos).addVector(0D, 1D, 0D)), 1) == distToTreasure) {
temp.add(pos);
}
}
possibleBlocks = temp;
- updateSolutionState();
+ checkAndDisplaySolutionState();
} else {
BlockPos pos = possibleBlocks.iterator().next();
- if (Math.abs(distToTreasure - (playerPos.distanceTo(new Vec3Comparable(pos)))) > 5) {
- currentState = SolutionState.INVALID;
+ if (Math.abs(distToTreasure - (getPlayerPos().distanceTo(new Vec3(pos)))) > 5) {
+ mc.thePlayer.addChatMessage(new ChatComponentText(
+ EnumChatFormatting.RED + "[NEU] Previous solution is invalid."));
+ blockPosIfLastSolutionInvalid = pos.getImmutable();
+ logDiagnosticData(false);
+ resetSolution(false);
}
}
- } else if (centerNewlyDiscovered && possibleBlocks.size() > 1) {
- updateSolutionState();
}
- prevPlayerPos = playerPos;
+ prevPlayerPos = mc.thePlayer.getPosition().getImmutable();
prevDistToTreasure = distToTreasure;
}
- public static void setDebugDoNotUseCenter(boolean val) {
- debugDoNotUseCenter = val;
+ private static void checkForSingleKnownLocationMatch() {
+ if (minesCenter == BlockPos.NULL_VECTOR || possibleBlocks.size() < 2) {
+ return;
+ }
+
+ HashSet<BlockPos> temp = possibleBlocks.stream()
+ .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong()))
+ .collect(Collectors.toCollection(HashSet::new));
+ if (temp.size() == 1) {
+ possibleBlocks = temp;
+ NEUDebugLogger.log(NEUDebugFlag.METAL, "Known location identified.");
+ } else if (temp.size() > 1) {
+ NEUDebugLogger.log(NEUDebugFlag.METAL, temp.size() + " known locations identified:");
+ }
}
private static String getFriendlyBlockPositions(Collection<BlockPos> positions) {
@@ -254,13 +206,10 @@ public class CrystalMetalDetectorSolver {
StringBuilder sb = new StringBuilder();
sb.append("\n");
for (BlockPos blockPos : positions) {
- sb.append("Absolute: ");
- sb.append(blockPos.toString());
+ sb.append("Absolute: " + blockPos.toString());
if (minesCenter != Vec3i.NULL_VECTOR) {
BlockPos relativeOffset = blockPos.subtract(minesCenter);
- sb.append(", Relative: ");
- sb.append(relativeOffset.toString() );
- sb.append(" (" + relativeOffset.toLong() + ")");
+ sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")");
}
sb.append("\n");
}
@@ -268,23 +217,22 @@ public class CrystalMetalDetectorSolver {
return sb.toString();
}
- private static String getFriendlyEvaluatedPositions() {
- if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || evaluatedPlayerPositions.size() == 0) {
+ private static String getFriendlyEvaluatedPositions(HashMap<BlockPos, Double> positions) {
+ if (!NEUDebugLogger.isFlagEnabled(NEUDebugFlag.METAL) || positions.size() == 0) {
return "";
}
StringBuilder sb = new StringBuilder();
sb.append("\n");
- for (Vec3Comparable vec : evaluatedPlayerPositions.keySet()) {
- sb.append("Absolute: " + vec.toString());
+ for (BlockPos blockPos : positions.keySet()) {
+ sb.append("Absolute: " + blockPos.toString());
if (minesCenter != Vec3i.NULL_VECTOR) {
- BlockPos positionBlockPos = new BlockPos(vec);
- BlockPos relativeOffset = positionBlockPos.subtract(minesCenter);
+ BlockPos relativeOffset = blockPos.subtract(minesCenter);
sb.append(", Relative: " + relativeOffset.toString() + " (" + relativeOffset.toLong() + ")");
}
sb.append(" Distance: ");
- sb.append(evaluatedPlayerPositions.get(vec));
+ sb.append(positions.get(blockPos));
sb.append("\n");
}
@@ -292,8 +240,101 @@ public class CrystalMetalDetectorSolver {
return sb.toString();
}
+ public static void logDiagnosticData(boolean outputAlways) {
+ if (SBInfo.getInstance().getLocation() == null) {
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
+ "[NEU] This command is not available outside SkyBlock"));
+ return;
+ }
+
+ if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled)
+ {
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
+ "[NEU] Metal Detector Solver is not enabled."));
+ return;
+ }
+
+ if (!outputAlways && !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL)) {
+ return;
+ }
+
+ boolean originalDebugFlag = !NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.add(NEUDebugFlag.METAL);
+
+ StringBuilder diagsMessage = new StringBuilder();
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Mines Center: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append((minesCenter == Vec3i.NULL_VECTOR) ? "<NOT DISCOVERED>" : minesCenter.toString());
+ diagsMessage.append("\n");
+
+ diagsMessage.append("\n");
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Previous Player Position: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append((prevPlayerPos == null) ? "<NONE>" : prevPlayerPos.toString());
+ diagsMessage.append("\n");
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Previous Distance To Treasure: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append((prevDistToTreasure == 0) ? "<NONE>" : prevDistToTreasure);
+ diagsMessage.append("\n");
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Last Solution Invalid Position: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append((blockPosIfLastSolutionInvalid == null) ? "<NONE>" : blockPosIfLastSolutionInvalid.toString());
+ diagsMessage.append("\n");
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Current Possible Blocks: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append(possibleBlocks.size());
+ diagsMessage.append(getFriendlyBlockPositions(possibleBlocks));
+ diagsMessage.append("\n");
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Evaluated player positions: ");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ diagsMessage.append(evaluatedPlayerPositions.size());
+ diagsMessage.append(getFriendlyEvaluatedPositions(evaluatedPlayerPositions));
+ diagsMessage.append("\n");
+
+ diagsMessage.append(EnumChatFormatting.AQUA);
+ diagsMessage.append("Chest locations not on known list:\n");
+ diagsMessage.append(EnumChatFormatting.WHITE);
+ if (minesCenter != Vec3i.NULL_VECTOR) {
+ HashSet<BlockPos> locationsNotOnKnownList = openedChestPositions
+ .stream()
+ .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong()))
+ .map(block -> block.subtract(minesCenter))
+ .collect(Collectors.toCollection(HashSet::new));
+ if (locationsNotOnKnownList.size() > 0) {
+ for (BlockPos blockPos : locationsNotOnKnownList) {
+ diagsMessage.append(String.format(
+ "%dL,\t\t// x=%d, y=%d, z=%d",
+ blockPos.toLong(),
+ blockPos.getX(),
+ blockPos.getY(),
+ blockPos.getZ()
+ ));
+ }
+ }
+ } else {
+ diagsMessage.append("<REQUIRES MINES CENTER>");
+ }
+
+ NEUDebugLogger.log(NEUDebugFlag.METAL, diagsMessage.toString());
+
+ if (!originalDebugFlag) {
+ NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.remove(NEUDebugFlag.METAL);
+ }
+ }
+
public static void resetSolution(Boolean chestFound) {
if (chestFound) {
+ blockPosIfLastSolutionInvalid = null;
prevPlayerPos = null;
prevDistToTreasure = 0;
if (possibleBlocks.size() == 1) {
@@ -304,18 +345,15 @@ public class CrystalMetalDetectorSolver {
chestRecentlyFound = chestFound;
possibleBlocks.clear();
evaluatedPlayerPositions.clear();
- previousState = currentState;
- currentState = SolutionState.NOT_STARTED;
}
public static void initWorld() {
minesCenter = Vec3i.NULL_VECTOR;
visitKeeperMessagePrinted = false;
+ blockPosIfLastSolutionInvalid = null;
openedChestPositions.clear();
- chestLastFoundMillis = 0;
prevDistToTreasure = 0;
prevPlayerPos = null;
- currentState = SolutionState.NOT_STARTED;
resetSolution(false);
}
@@ -339,14 +377,15 @@ public class CrystalMetalDetectorSolver {
}
}
- private static boolean locateMinesCenterIfNeeded() {
+ private static void locateMinesCenterIfNeeded() {
if (minesCenter != Vec3i.NULL_VECTOR) {
- return false;
+ return;
}
List<EntityArmorStand> keeperEntities = mc.theWorld.getEntities(EntityArmorStand.class, (entity) -> {
if (!entity.hasCustomName()) return false;
- return entity.getCustomNameTag().contains(KEEPER_OF_STRING);
+ if (entity.getCustomNameTag().contains(KEEPER_OF_STRING)) return true;
+ return false;
});
if (keeperEntities.size() == 0) {
@@ -355,7 +394,7 @@ public class CrystalMetalDetectorSolver {
"[NEU] Approach a Keeper while holding the metal detector to enable faster treasure hunting."));
visitKeeperMessagePrinted = true;
}
- return false;
+ return;
}
EntityArmorStand keeperEntity = keeperEntities.get(0);
@@ -368,11 +407,6 @@ public class CrystalMetalDetectorSolver {
EnumChatFormatting.WHITE + minesCenter.toString());
mc.thePlayer.addChatMessage(new ChatComponentText(
EnumChatFormatting.YELLOW + "[NEU] Faster treasure hunting is now enabled based on Keeper location."));
- return true;
- }
-
- public static void setMinesCenter(BlockPos center) {
- minesCenter = center;
}
private static double round(double value, int precision) {
@@ -380,174 +414,42 @@ public class CrystalMetalDetectorSolver {
return (double) Math.round(value * scale) / scale;
}
- private static void updateSolutionState() {
- previousState = currentState;
-
+ private static void checkAndDisplaySolutionState() {
if (possibleBlocks.size() == 0) {
- currentState = SolutionState.FAILED;
- return;
- }
-
- if (possibleBlocks.size() == 1) {
- currentState = SolutionState.FOUND;
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED + "[NEU] Failed to find a solution."));
+ logDiagnosticData(false);
+ resetSolution(false);
return;
}
- // Narrow solutions using known locations if the mines center is known
- if (minesCenter.equals(BlockPos.NULL_VECTOR) || debugDoNotUseCenter) {
- currentState = SolutionState.MULTIPLE;
- return;
- }
-
- HashSet<BlockPos> temp =
- possibleBlocks.stream()
- .filter(block -> knownChestOffsets.contains(block.subtract(minesCenter).toLong()))
- .collect(Collectors.toCollection(HashSet::new));
- if (temp.size() == 0) {
- currentState = SolutionState.MULTIPLE;
- return;
- }
-
- if (temp.size() == 1) {
- possibleBlocks = temp;
- currentState = SolutionState.FOUND_KNOWN;
- return;
-
- }
-
- currentState = SolutionState.MULTIPLE_KNOWN;
- }
-
- public static BlockPos getSolution() {
- if (CrystalMetalDetectorSolver.possibleBlocks.size() != 1) {
- return BlockPos.ORIGIN;
+ checkForSingleKnownLocationMatch();
+ if (possibleBlocks.size() > 1) {
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW +
+ "[NEU] Need another position to find solution. Possible blocks: " + possibleBlocks.size()));
+ } else {
+ mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.YELLOW + "[NEU] Found solution."));
}
-
- return CrystalMetalDetectorSolver.possibleBlocks.stream().iterator().next();
}
- private static Vec3Comparable getPlayerPosAdjustedForEyeHeight() {
- return new Vec3Comparable(
+ private static Vec3 getPlayerPos() {
+ return new Vec3(
mc.thePlayer.posX,
mc.thePlayer.posY + (mc.thePlayer.getEyeHeight() - mc.thePlayer.getDefaultEyeHeight()),
mc.thePlayer.posZ
);
}
- static boolean isKnownOffset(BlockPos pos) {
- return knownChestOffsets.contains(pos.subtract(minesCenter).toLong());
- }
-
- static boolean isAllowedBlockType(BlockPos pos) {
- return mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") ||
+ private static boolean treasureAllowed(BlockPos pos) {
+ boolean airAbove = mc.theWorld.
+ getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air");
+ boolean allowedBlockType = mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:gold_block") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:prismarine") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:chest") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_glass_pane") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:wool") ||
mc.theWorld.getBlockState(pos).getBlock().getRegistryName().equals("minecraft:stained_hardened_clay");
- }
-
- static boolean isAirAbove(BlockPos pos) {
- return mc.theWorld.
- getBlockState(pos.add(0, 1, 0)).getBlock().getRegistryName().equals("minecraft:air");
- }
-
- private static boolean treasureAllowed(BlockPos pos) {
- boolean airAbove = isAirAbove(pos);
- boolean allowedBlockType = isAllowedBlockType(pos);
- return isKnownOffset(pos) || (airAbove && allowedBlockType);
- }
-
- static private String getDiagnosticMessage() {
- StringBuilder diagsMessage = new StringBuilder();
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Mines Center: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append((minesCenter.equals(Vec3i.NULL_VECTOR)) ? "<NOT DISCOVERED>" : minesCenter.toString());
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Current Solution State: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append(currentState.name());
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Previous Solution State: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append(previousState.name());
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Previous Player Position: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append((prevPlayerPos == null) ? "<NONE>" : prevPlayerPos.toString());
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Previous Distance To Treasure: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append((prevDistToTreasure == 0) ? "<NONE>" : prevDistToTreasure);
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Current Possible Blocks: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append(possibleBlocks.size());
- diagsMessage.append(getFriendlyBlockPositions(possibleBlocks));
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Evaluated player positions: ");
- diagsMessage.append(EnumChatFormatting.WHITE);
- diagsMessage.append(evaluatedPlayerPositions.size());
- diagsMessage.append(getFriendlyEvaluatedPositions());
- diagsMessage.append("\n");
-
- diagsMessage.append(EnumChatFormatting.AQUA);
- diagsMessage.append("Chest locations not on known list:\n");
- diagsMessage.append(EnumChatFormatting.WHITE);
- if (minesCenter != Vec3i.NULL_VECTOR) {
- HashSet<BlockPos> locationsNotOnKnownList = openedChestPositions
- .stream()
- .filter(block -> !knownChestOffsets.contains(block.subtract(minesCenter).toLong()))
- .map(block -> block.subtract(minesCenter))
- .collect(Collectors.toCollection(HashSet::new));
- if (locationsNotOnKnownList.size() > 0) {
- for (BlockPos blockPos : locationsNotOnKnownList) {
- diagsMessage.append(String.format(
- "%dL,\t\t// x=%d, y=%d, z=%d",
- blockPos.toLong(),
- blockPos.getX(),
- blockPos.getY(),
- blockPos.getZ()
- ));
- }
- }
- } else {
- diagsMessage.append("<REQUIRES MINES CENTER>");
- }
-
- return diagsMessage.toString();
- }
-
- public static void logDiagnosticData(boolean outputAlways) {
- if (!SBInfo.getInstance().checkForSkyblockLocation()) {
- return;
- }
-
- if (!NotEnoughUpdates.INSTANCE.config.mining.metalDetectorEnabled)
- {
- mc.thePlayer.addChatMessage(new ChatComponentText(EnumChatFormatting.RED +
- "[NEU] Metal Detector Solver is not enabled."));
- return;
- }
-
- boolean metalDebugFlagSet = NotEnoughUpdates.INSTANCE.config.hidden.debugFlags.contains(NEUDebugFlag.METAL);
- if (outputAlways || metalDebugFlagSet) {
- NEUDebugLogger.logAlways(getDiagnosticMessage());
- }
+ boolean knownOffset = knownChestOffsets.contains(pos.subtract(minesCenter).toLong());
+ return airAbove & (knownOffset | allowedBlockType);
}
}