From 80ee2925ef652eccb05f0337dd414b19fb43bb4e Mon Sep 17 00:00:00 2001 From: joe Date: Thu, 7 Mar 2024 01:42:33 +0000 Subject: [PATCH] Rewrite /ccrackrng --- build.gradle | 2 + libs/LattiCG-1.06-rt.jar | Bin 0 -> 37226 bytes .../clientAddon/cracker/Lattice_cracker.java | 256 ------------------ .../clientAddon/cracker/SeedCrackTask.java | 24 -- .../command/CrackRNGCommand.java | 4 +- .../clientcommands/features/CCrackRng.java} | 82 +++--- .../clientcommands/features/CCrackRngGen.java | 114 ++++++++ 7 files changed, 154 insertions(+), 328 deletions(-) create mode 100644 libs/LattiCG-1.06-rt.jar delete mode 100644 src/main/java/net/cortex/clientAddon/cracker/Lattice_cracker.java delete mode 100644 src/main/java/net/cortex/clientAddon/cracker/SeedCrackTask.java rename src/main/java/net/{cortex/clientAddon/cracker/SeedCracker.java => earthcomputer/clientcommands/features/CCrackRng.java} (57%) create mode 100644 src/main/java/net/earthcomputer/clientcommands/features/CCrackRngGen.java diff --git a/build.gradle b/build.gradle index 990f9db34..51c8b2226 100644 --- a/build.gradle +++ b/build.gradle @@ -55,6 +55,8 @@ dependencies { includedLibrary "com.seedfinding:mc_core:${project.seedfinding_core_version}" includedLibrary "com.seedfinding:mc_seed:${project.seedfinding_seed_version}" + includedLibrary files('libs/LattiCG-1.06-rt.jar') + compileOnly 'com.demonwav.mcdev:annotations:2.0.0' modRuntimeOnly('me.djtheredstoner:DevAuth-fabric:1.1.0') { diff --git a/libs/LattiCG-1.06-rt.jar b/libs/LattiCG-1.06-rt.jar new file mode 100644 index 0000000000000000000000000000000000000000..a8303a0cbb668fc1c4862f651939c9c8b153d5ce GIT binary patch literal 37226 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[i]) - return false; - return true; - } - private static boolean getNextPoint(long[] components,long[] v, long[][] A,long[] mins,long[] maxs)//mutates components and v - { - long[] v_ref=v; - for(int index=0;index maxs[index]) - { - components[index] = mins[index]; - v=sub(v,multiply(A[index],maxs[index]-mins[index]+1)); - } - else - { - for(int i=0;i dumbiterate(long[] mins, long[] maxs, long[][] A/*aLLL matrix*/, long[] P/*arbitary lattice point*/, long[] LowerBounds, long[] UpperBounds) - { - long[] temp = mins.clone(); - long[] v=add(multiply(A,temp),P); - List results=new ArrayList<>(); - while(true) - { - if(isInRegion(v,LowerBounds,UpperBounds)) - { - EnchantmentCracker.LOGGER.info("Found possible seed: " + Arrays.toString(v)); - results.add(v.clone()); - } - if(!getNextPoint(temp, v, A, mins, maxs)) - return results; - } - } - - private static List findAllSeedTuplesInBB(long[] UpperBounds,long[] LowerBounds) - { - int N=UpperBounds.length; - double[] min = new double[N]; - double[] max = new double[N]; - for(int x=0;x a=findAllSeedTuplesInBB(UpperBounds,LowerBounds); - if(a.size()==0) - return 0; - return lcg(a.get(0)[bits.length-1]);//returns the seed after - } -} - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/main/java/net/cortex/clientAddon/cracker/SeedCrackTask.java b/src/main/java/net/cortex/clientAddon/cracker/SeedCrackTask.java deleted file mode 100644 index 1607d68dc..000000000 --- a/src/main/java/net/cortex/clientAddon/cracker/SeedCrackTask.java +++ /dev/null @@ -1,24 +0,0 @@ -package net.cortex.clientAddon.cracker; - -import net.earthcomputer.clientcommands.Configs; -import net.earthcomputer.clientcommands.features.PlayerRandCracker; -import net.earthcomputer.clientcommands.task.SimpleTask; - -public class SeedCrackTask extends SimpleTask { - @Override - public boolean condition() { - return Configs.playerCrackState == PlayerRandCracker.CrackState.CRACKING; - } - - @Override - protected void onTick() { - } - - @Override - public void onCompleted() { - if (condition()) { - Configs.playerCrackState = PlayerRandCracker.CrackState.UNCRACKED; - } - SeedCracker.currentTask = null; - } -} diff --git a/src/main/java/net/earthcomputer/clientcommands/command/CrackRNGCommand.java b/src/main/java/net/earthcomputer/clientcommands/command/CrackRNGCommand.java index 16e4fbcab..1cee65a9e 100644 --- a/src/main/java/net/earthcomputer/clientcommands/command/CrackRNGCommand.java +++ b/src/main/java/net/earthcomputer/clientcommands/command/CrackRNGCommand.java @@ -2,9 +2,9 @@ import com.mojang.brigadier.Command; import com.mojang.brigadier.CommandDispatcher; -import net.cortex.clientAddon.cracker.SeedCracker; import net.earthcomputer.clientcommands.Configs; import net.earthcomputer.clientcommands.ServerBrandManager; +import net.earthcomputer.clientcommands.features.CCrackRng; import net.earthcomputer.clientcommands.features.PlayerRandCracker; import net.fabricmc.fabric.api.client.command.v2.FabricClientCommandSource; import net.minecraft.network.chat.Component; @@ -20,7 +20,7 @@ public static void register(CommandDispatcher dispatc private static int crackPlayerRNG(FabricClientCommandSource source) { ServerBrandManager.rngWarning(); - SeedCracker.crack(seed -> { + CCrackRng.crack(seed -> { source.sendFeedback(Component.translatable("commands.ccrackrng.success", Long.toHexString(seed))); PlayerRandCracker.setSeed(seed); Configs.playerCrackState = PlayerRandCracker.CrackState.CRACKED; diff --git a/src/main/java/net/cortex/clientAddon/cracker/SeedCracker.java b/src/main/java/net/earthcomputer/clientcommands/features/CCrackRng.java similarity index 57% rename from src/main/java/net/cortex/clientAddon/cracker/SeedCracker.java rename to src/main/java/net/earthcomputer/clientcommands/features/CCrackRng.java index 13e858b05..d49b6e871 100644 --- a/src/main/java/net/cortex/clientAddon/cracker/SeedCracker.java +++ b/src/main/java/net/earthcomputer/clientcommands/features/CCrackRng.java @@ -1,12 +1,8 @@ -package net.cortex.clientAddon.cracker; +package net.earthcomputer.clientcommands.features; import net.earthcomputer.clientcommands.Configs; import net.earthcomputer.clientcommands.command.ClientCommandHelper; -import net.earthcomputer.clientcommands.features.EnchantmentCracker; -import net.earthcomputer.clientcommands.features.PlayerRandCracker; -import net.earthcomputer.clientcommands.mixin.LegacyRandomSourceAccessor; import net.earthcomputer.clientcommands.task.ItemThrowTask; -import net.earthcomputer.clientcommands.task.LongTask; import net.earthcomputer.clientcommands.task.TaskManager; import net.minecraft.ChatFormatting; import net.minecraft.client.Minecraft; @@ -14,29 +10,32 @@ import net.minecraft.network.chat.Component; import net.minecraft.network.protocol.game.ClientboundAddEntityPacket; import net.minecraft.network.protocol.game.ServerboundMovePlayerPacket; -import net.minecraft.util.RandomSource; -public class SeedCracker { - public interface OnCrack {void callback(long seed); } +public class CCrackRng { + private static final float MAX_ERROR = 0.00883889f; + + @FunctionalInterface + public interface OnCrack { + void callback(long seed); + } public static OnCrack callback; - public static long[] bits=new long[20]; + public static float[] nextFloats = new float[10]; public static int expectedItems=0; - public static LongTask currentTask; private static int attemptCount = 0; - private static final int MAX_ATTEMPTS = 10; + private static final int MAX_ATTEMPTS = 5; private static String currentTaskName = null; - private static String throwItems() - { + private static String throwItems() { LocalPlayer player = Minecraft.getInstance().player; + assert player != null; player.moveTo(player.getX(), player.getY(), player.getZ(), 0, 90); - Minecraft.getInstance().getConnection().send(new ServerboundMovePlayerPacket.Rot(0, 90, true)); // point to correct location - ItemThrowTask task = new ItemThrowTask(20) { + player.connection.send(new ServerboundMovePlayerPacket.Rot(0, 90, true)); // point to correct location + ItemThrowTask task = new ItemThrowTask(10) { @Override protected void onSuccess() { - SeedCracker.attemptCrack(); + CCrackRng.attemptCrack(); } @Override @@ -62,10 +61,20 @@ protected void onItemSpawn(ClientboundAddEntityPacket packet) { public static void attemptCrack() { - long seed= Lattice_cracker.crack(SeedCracker.bits); - - if(seed==0)//Basicaly if seed is zero it means it failed to try to crack again - { + long[] seeds = CCrackRngGen.getSeeds( + Math.max(0, nextFloats[0] - MAX_ERROR), Math.min(1, nextFloats[0] + MAX_ERROR), + Math.max(0, nextFloats[1] - MAX_ERROR), Math.min(1, nextFloats[1] + MAX_ERROR), + Math.max(0, nextFloats[2] - MAX_ERROR), Math.min(1, nextFloats[2] + MAX_ERROR), + Math.max(0, nextFloats[3] - MAX_ERROR), Math.min(1, nextFloats[3] + MAX_ERROR), + Math.max(0, nextFloats[4] - MAX_ERROR), Math.min(1, nextFloats[4] + MAX_ERROR), + Math.max(0, nextFloats[5] - MAX_ERROR), Math.min(1, nextFloats[5] + MAX_ERROR), + Math.max(0, nextFloats[6] - MAX_ERROR), Math.min(1, nextFloats[6] + MAX_ERROR), + Math.max(0, nextFloats[7] - MAX_ERROR), Math.min(1, nextFloats[7] + MAX_ERROR), + Math.max(0, nextFloats[8] - MAX_ERROR), Math.min(1, nextFloats[8] + MAX_ERROR), + Math.max(0, nextFloats[9] - MAX_ERROR), Math.min(1, nextFloats[9] + MAX_ERROR) + ).toArray(); + + if (seeds.length != 1) { attemptCount++; if (attemptCount > MAX_ATTEMPTS) { ClientCommandHelper.sendError(Component.translatable("commands.ccrackrng.failed")); @@ -73,30 +82,13 @@ public static void attemptCrack() Configs.playerCrackState = PlayerRandCracker.CrackState.UNCRACKED; currentTaskName = null; } else { - SeedCracker.doCrack(SeedCracker.callback); + CCrackRng.doCrack(CCrackRng.callback); } return; } - //Else, got a seed Configs.playerCrackState = PlayerRandCracker.CrackState.CRACKED; - - RandomSource rand=RandomSource.create(seed ^ 0x5deece66dL); - rand.nextFloat(); - rand.nextFloat(); - //rand.nextFloat(); - - /* - for(int i=0;i<13;i++) { - long x = (((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL; - System.out.print("Expected: "+padLeftZeros(Long.toBinaryString(x), 4)+" "); - System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" "); - System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" "); - System.out.print(padLeftZeros(Long.toBinaryString((((long) (rand.nextFloat() * ((float) (1 << 24)))) >> (24 - 4))&0xFL), 4)+" \n"); - }*/ - - currentTaskName = null; - callback.callback(((LegacyRandomSourceAccessor) rand).getSeed().get());//extract seed and call callback + callback.callback(seeds[0]); } public static void crack(OnCrack callback) { @@ -109,7 +101,7 @@ private static void doCrack(OnCrack Callback){ ClientCommandHelper.addOverlayMessage(Component.translatable("commands.ccrackrng.retries", attemptCount, MAX_ATTEMPTS), 100); currentTaskName = throwItems(); Configs.playerCrackState = PlayerRandCracker.CrackState.CRACKING; - expectedItems = 20; + expectedItems = 10; if (attemptCount == 1) { Component message = Component.translatable("commands.ccrackrng.starting") .append(" ") @@ -120,12 +112,10 @@ private static void doCrack(OnCrack Callback){ public static void onEntityCreation(ClientboundAddEntityPacket packet) { if (Configs.playerCrackState == PlayerRandCracker.CrackState.CRACKING) { - if (SeedCracker.expectedItems > 0) { - long rand_val = (long) ((Math.atan2(packet.getZa(), packet.getXa()) + Math.PI) / (Math.PI * 2) * ((float) (1 << 24))); - long top_bits = rand_val; - short value = (short) (((top_bits >> (24 - 4)) ^ 0x8L )&0xFL);//INSTEAD OF ^0x8L MAYBE DO +math.pi OR SOMETHING ELSE - SeedCracker.bits[20-SeedCracker.expectedItems]=(long)value;//could be improved - SeedCracker.expectedItems--; + if (CCrackRng.expectedItems > 0) { + float nextFloat = (float) Math.sqrt(packet.getXa() * packet.getXa() + packet.getZa() * packet.getZa()) * 50f; + CCrackRng.nextFloats[10 - CCrackRng.expectedItems] = nextFloat; + CCrackRng.expectedItems--; } } } diff --git a/src/main/java/net/earthcomputer/clientcommands/features/CCrackRngGen.java b/src/main/java/net/earthcomputer/clientcommands/features/CCrackRngGen.java new file mode 100644 index 000000000..74c8c23fd --- /dev/null +++ b/src/main/java/net/earthcomputer/clientcommands/features/CCrackRngGen.java @@ -0,0 +1,114 @@ +package net.earthcomputer.clientcommands.features; + +import com.seedfinding.latticg.math.component.BigMatrix; +import com.seedfinding.latticg.math.component.BigVector; +import com.seedfinding.latticg.math.lattice.enumerate.EnumerateRt; +import com.seedfinding.latticg.math.optimize.Optimize; +import com.seedfinding.latticg.util.DeserializeRt; +import java.util.stream.LongStream; + +// CLASS GENERATED BY LATTICG, DO NOT EDIT MANUALLY +public final class CCrackRngGen { + private CCrackRngGen() {} + private static final BigMatrix BASIS = DeserializeRt.mat( + "ਊ\ued95膕쩅˴ꋄꊝ\ue001ʁ銧릿挂\ua7ebꇽ\ue702ʬ\uf198믅씁˚辑톹鄁˝ꊘ\udae2\udf02ʝ\ue7bf\ue0b1\ue602ˬ삭겦褂ʎ뇽\udeb1윁ʭ鮊\ue8cd쨂ˍ雏ꧮᄂ膲\uf5ba霆ʇ풁菆밁ˬ꺆\uf3e6" + + "ꔁ˺횪钖܂\ue4e9\ude80\uf6afȂ\udda2飚\ue2dfȂ곶\ue5ecꌱʓ\ud999쿀稂钇잕ꄥ˴鞹킔ं肮颖鋀Ă\ue788鶆뎩Ă계\uf0b1谫˧귁臝숃ʤ뺎螴鈁ˤ\ue9de胶꼂ʕﲥꓵᴂ캸싲\ue4a4Ђ궮뢉难Ă췑뗧\uf4fc" + + "Ă臲뷒草ʺ뛪ꚪ윁ˬ뇲\uf19cꈁʺ솋飖츁ˤ\udaef\uea8d\ue001ʤ뺎螴鈁ʬ\ue994궶쐂ʮꚍ\ue683ᜂ铄鲎낺Ȃ\uf4acꆚ\uef89Ă胮잶贵ʧ횤쿔鸃ʬ\uf7d6\udab2fiʧ鯈ꮴ頂ʤ뾋쯡搂\ue4da\uefea跠Ă\ueca6" + + "톀\uf19aĂ\uf3cf藪谘˔\udeba\uda92茁ʴ鏋뺌퐂ʀ컩铚\uda01ʇ\uef9bꂸ㜂\uec94馷ﻏĂ\ufafb퇮\ue89d̂鶔薚켑ʤ뾋쯡搂겼襁鉵ˮ闵\ueb9bꨂ˭\ude98\uf2fb茁˴\ue1a4ꛝ愂肮\ue7e3鰞" + + "˧폤\ufae2똁ʬ諤쯬켂ʚ쟐雂䄂\udd9f馕ሂ鶔薚켑ʕ훔힢蔂ˎ鞡룩\uf201ʭ\uf4c8웰㸂뒘\udb83뫆Ă臲ﺈ\ue485Ђ못ᄋ\udaecȂ閨\uedf3藧Ă쟹\ued91쐜ˤ鲈\uecff갂˝龙锒ʬ\uefae뫇圂껵\ud9a8ﺹĂ\uede1" + + "\uf0e8\ue0a7Ȃ跉铫꾞Ă膒覦︕ʧ膉黖漂햂탎鲮̂Ꞇꎪv˝\uded7軟蔁ˤ鲈\uecff갂ˬ貀횘ꈁ˳郍킇툂ʭ\ua7db賧\u0602뒽ꊽ钾Ȃ胎裐ꋃȂ蝹킜탚Ă\uecfa\uf6af验Ă\ufae0\udf89衕ʝ鋠횅褂˝\uded7軟蔁˕ﶵ" + + "싳옃ʓ뮈ꚋ\uf101Ȁ"); + private static final BigMatrix ROOT_INV = DeserializeRt.mat( + "ਊ\u0380肀肀耐ހ肀肀耠ᎀ肀肀肀ċ肀肀肀䀆肀肀肀䀂肀肀肀䀏肀肀肀䀋肀肀肀老\u0b80肀肀耠\u0b80肀肀聀ڀ肀肀聀ኀ肀肀肀Ć肀肀肀老ྀ肀肀肀Ě肀肀肀老\u0e80肀肀聀\u0380肀肀耠ኀ肀肀聀 肀肀肀Ģ肀肀肀老\u0380肀肀耠᪀肀肀肀Ģ肀" + + "肀肀老ʀ肀肀聀ᎀ肀肀肀Ě肀肀肀老ᮀ肀肀聀ᾀ肀肀肀ă肀肀肀䀖肀肀肀老ʀ肀肀耠ྀ肀肀肀Ă肀肀肀ည肀肀肀 肀肀肀 肀肀肀ဟ肀肀肀老\u0e80肀肀肀ă肀肀肀ဦ肀肀肀老ʀ肀肀耐\u0b80肀肀肀ć肀肀肀老ڀ肀肀耐⊀肀肀肀ě肀肀肀老ʀ肀肀耈\u0380肀肀肀ď" + + "肀肀肀老ڀ肀肀耠\u0b80肀肀聀ހ肀肀肀ģ肀肀肀老\u0380肀肀耠ក肀肀肀Ċ肀肀肀 肀肀肀䀃肀肀肀 ț肀肀肀老➀肀肀肀Ħ肀肀肀老ʀ肀肀聀\2ʀ肀肀肀Ċ肀肀肀䀋肀肀肀䀎肀肀肀老\u0380肀肀耐\u0380肀肀聀ྀ肀肀肀ă肀肀肀ࠀȎ肀肀肀䀖肀肀肀老" + + "ڀ肀肀肀Ă肀肀肀ࠆ肀肀肀䀞肀肀肀老ڀ肀肀聀Ẁ肀肀肀Ć肀肀肀䀆肀肀肀䀆肀肀肀 肀肀肀ည肀肀肀老⾀肀肀肀ă肀肀肀老ʀ肀肀耠\2ʀ肀肀耠\u0380肀肀耠᪀肀肀肀ć肀肀肀䀟肀肀肀老ڀ肀肀聀\u0a80肀肀肀ă肀肀肀老ހ肀肀聀ހ肀肀耠"); + private static final BigVector ORIGIN = DeserializeRt.vec( + "\u0a00ʈ뒦벎츖ʐ駗질긾ʘ뾖黱덪ʠ뚊ꃪ쀆ʨ躛\ue6d4锦ʰ힒볩ﱁʸꆽ\uaaf8葉ˀﲈ쎉錏ˈ\uf8a5\uf19e똠Ȁ"); + private static final BigVector ROOT_ORIGIN = DeserializeRt.vec( + "\u0ad7醌뗤ꪜހ肀肀耠횑貵\ue4aaﰃ肀肀肀‟ࣞ뚂\uf1e0뮚Ҁ肀肀耠骤蟓ꊳ輆肀肀肀⃟뚂\uf1e0뭲肀肀肀ဦ\u089aꒇ펢뎧ڀ肀肀耠\udeb6英\ue0bb㺀肀肀耐\udfb6英\ue0bbʀ肀肀耠"); + + /** + * Finds all values of {@code seed} that could produce the given results in the following code: + *
{@code
+     *    Random rand = new Random(seed ^ 0x5DEECE66DL);
+     *    // Go backwards by 39 random calls
+     *    float nextFloat1 = rand.nextFloat();
+     *    assert nextFloat1 >= minNextFloat1 && nextFloat1 < maxNextFloat1;
+     *    // Skip 3 random calls
+     *    float nextFloat2 = rand.nextFloat();
+     *    assert nextFloat2 >= minNextFloat2 && nextFloat2 < maxNextFloat2;
+     *    // Skip 3 random calls
+     *    float nextFloat3 = rand.nextFloat();
+     *    assert nextFloat3 >= minNextFloat3 && nextFloat3 < maxNextFloat3;
+     *    // Skip 3 random calls
+     *    float nextFloat4 = rand.nextFloat();
+     *    assert nextFloat4 >= minNextFloat4 && nextFloat4 < maxNextFloat4;
+     *    // Skip 3 random calls
+     *    float nextFloat5 = rand.nextFloat();
+     *    assert nextFloat5 >= minNextFloat5 && nextFloat5 < maxNextFloat5;
+     *    // Skip 3 random calls
+     *    float nextFloat6 = rand.nextFloat();
+     *    assert nextFloat6 >= minNextFloat6 && nextFloat6 < maxNextFloat6;
+     *    // Skip 3 random calls
+     *    float nextFloat7 = rand.nextFloat();
+     *    assert nextFloat7 >= minNextFloat7 && nextFloat7 < maxNextFloat7;
+     *    // Skip 3 random calls
+     *    float nextFloat8 = rand.nextFloat();
+     *    assert nextFloat8 >= minNextFloat8 && nextFloat8 < maxNextFloat8;
+     *    // Skip 3 random calls
+     *    float nextFloat9 = rand.nextFloat();
+     *    assert nextFloat9 >= minNextFloat9 && nextFloat9 < maxNextFloat9;
+     *    // Skip 3 random calls
+     *    float nextFloat10 = rand.nextFloat();
+     *    assert nextFloat10 >= minNextFloat10 && nextFloat10 < maxNextFloat10;
+     * }
+ * + *

This code skips 0.000000% of seeds in its search. + */ + public static LongStream getSeeds(float minNextFloat1, float maxNextFloat1, float minNextFloat2, float maxNextFloat2, float minNextFloat3, float maxNextFloat3, float minNextFloat4, float maxNextFloat4, float minNextFloat5, float maxNextFloat5, float minNextFloat6, float maxNextFloat6, float minNextFloat7, float maxNextFloat7, float minNextFloat8, float maxNextFloat8, float minNextFloat9, float maxNextFloat9, float minNextFloat10, float maxNextFloat10) { + Optimize.Builder builder = Optimize.Builder.ofSize(10); + if (minNextFloat1 >= maxNextFloat1) { + return LongStream.empty(); + } + builder.withLowerBound(0, (long) (minNextFloat1 * 0x1.0p24f) << 24).withUpperBound(0, (long) (maxNextFloat1 * 0x1.0p24f) << 24); + if (minNextFloat2 >= maxNextFloat2) { + return LongStream.empty(); + } + builder.withLowerBound(1, (long) (minNextFloat2 * 0x1.0p24f) << 24).withUpperBound(1, (long) (maxNextFloat2 * 0x1.0p24f) << 24); + if (minNextFloat3 >= maxNextFloat3) { + return LongStream.empty(); + } + builder.withLowerBound(2, (long) (minNextFloat3 * 0x1.0p24f) << 24).withUpperBound(2, (long) (maxNextFloat3 * 0x1.0p24f) << 24); + if (minNextFloat4 >= maxNextFloat4) { + return LongStream.empty(); + } + builder.withLowerBound(3, (long) (minNextFloat4 * 0x1.0p24f) << 24).withUpperBound(3, (long) (maxNextFloat4 * 0x1.0p24f) << 24); + if (minNextFloat5 >= maxNextFloat5) { + return LongStream.empty(); + } + builder.withLowerBound(4, (long) (minNextFloat5 * 0x1.0p24f) << 24).withUpperBound(4, (long) (maxNextFloat5 * 0x1.0p24f) << 24); + if (minNextFloat6 >= maxNextFloat6) { + return LongStream.empty(); + } + builder.withLowerBound(5, (long) (minNextFloat6 * 0x1.0p24f) << 24).withUpperBound(5, (long) (maxNextFloat6 * 0x1.0p24f) << 24); + if (minNextFloat7 >= maxNextFloat7) { + return LongStream.empty(); + } + builder.withLowerBound(6, (long) (minNextFloat7 * 0x1.0p24f) << 24).withUpperBound(6, (long) (maxNextFloat7 * 0x1.0p24f) << 24); + if (minNextFloat8 >= maxNextFloat8) { + return LongStream.empty(); + } + builder.withLowerBound(7, (long) (minNextFloat8 * 0x1.0p24f) << 24).withUpperBound(7, (long) (maxNextFloat8 * 0x1.0p24f) << 24); + if (minNextFloat9 >= maxNextFloat9) { + return LongStream.empty(); + } + builder.withLowerBound(8, (long) (minNextFloat9 * 0x1.0p24f) << 24).withUpperBound(8, (long) (maxNextFloat9 * 0x1.0p24f) << 24); + if (minNextFloat10 >= maxNextFloat10) { + return LongStream.empty(); + } + builder.withLowerBound(9, (long) (minNextFloat10 * 0x1.0p24f) << 24).withUpperBound(9, (long) (maxNextFloat10 * 0x1.0p24f) << 24); + return EnumerateRt.enumerate(BASIS, ORIGIN, builder.build(), ROOT_INV, ROOT_ORIGIN) + .mapToLong(vec -> (vec.get(0).getNumerator().longValue() * 0x641598c21879L + 0x60dd589d4b7eL) & ((1L << 48) - 1)); + } +}