Todos los posts

Lo que ya sé de la seed de la panorámica de la 26.4

10 min de lectura

Todo lo que he descartado para sacar la seed de la cueva de hielo de la snapshot 7. Creo que es de 64 bits.

Pilares de hielo azul y un océano helado al amanecer, de la panorámica de la 26.4-snapshot-7
En este post
  1. Las panorámicas anteriores
  2. Las 6 caras
  3. La cámara
  4. Los 3 filtros
  5. Comprobaciones
  6. Las búsquedas
  7. Otras cosas que probé
  8. Lo que creo
  9. Actualización
  10. Herramientas y fuentes

Este post no es la versión final. Lo voy actualizando con más información según avanza todo.

Estas últimas semanas estuve sacando las seeds de los vídeos de ElRichMC de las snapshots de la 26.4, así que ya tenía filtros y buscadores preparados para esta versión. El martes salió la 26.4-snapshot-7 con panorámica nueva, una cueva de hielo al lado de un océano helado. La de ElRich (vídeo) la saqué en menos de un minuto, pero eso ya es para otro post. Luego fui a por la panorámica con muchas ganas.

Llevo unos días con su seed y todavía no la tengo. Dejo aquí todo lo que he probado para que nadie tenga que repetirlo.

Las miniaturas que hice para la de ElRich
La seed del mundo de ElRich
Lo mejor de su mundo

La panorámica salió el martes 3 de noviembre. Los 2^48281.474.976.710.656 seeds los terminé el viernes 6. Desde entonces solo he estado documentando todo y preparándome para cuando salga la panorámica de la versión Bedrock, que puede dar pistas nuevas.

Resumiendo, no es una seed de 32 bits2^32 = 4.294.967.296 seeds posibles (eso incluye todas las de texto), ni uno de los cerca de 18 millones de números típicos que alguien escribiría a mano, ni una seed aleatoria de Java de 48 bits2^48 = 281.474.976.710.656 seeds posibles en ninguna snapshot con cuevas de hielo (de la snapshot 3 a la 7). Para mí es una seed de 64 bits2^64 = 18.446.744.073.709.551.616 seeds posibles o algo muy raro. Si fuera una seed aleatoria de 48 bits de la s3 a la s7 ya la tendría, así que es más grande y no se puede probar entera.

Se puede arrastrar y hacer zoom con la rueda. El botón Ver la cueva la ilumina

Las panorámicas anteriores

Ya se han sacado varias panorámicas. La original la sacó Minecraft@Home con computación distribuida. La de Pale Garden también (código). La de Wilderness Bound la sacaron Bachale (coordenadas con la rotación de la hierba) y Fragrant_Result_186 (la seed con los álamos). Era el texto “NewPanoramaUpdatedFeatures” (vídeo).

Una seed que sale de “Crear mundo” sin escribir nada viene de un generador de 48 bits. Eso se puede comprobar con la propia seed. Las últimas no salen de ahí (van de la más nueva a la más vieja):

VersiónPanorámicaSeedSeed aleatoria (48 bits)
26.3Wilderness Bound822930755 (“NewPanoramaUpdatedFeatures”)no, es un texto
26.2Chaos Cubed3520020736007334307no
26w14a (April Fools)Herdcraft Updatedesconocida?
26.1Tiny Takeover-1701815224735573849no
1.21.11Mounts of Mayhem-6464260789280200050no
1.21.9The Copper Age7904846446833094596no
1.21.6Chase the Skies8819392414030687460sí
1.21.5Spring to Life2043584565 (“Desert”)no, es un texto
1.21.4The Garden Awakens-2132177964578008911sí
1.21Tricky Trialsdesconocida?
24w14potato (April Fools)Poisonous Potato Update-4643277814275016011sí
1.20Trails & Tales8554477380691140270sí
1.19The Wild Update-1696067516 (“thewildupdate”)no, es un texto
1.18Caves & Cliffs: Part II2151901553968352745sí (con los mismos 48 bits de abajo que la original)
1.17Caves & Cliffs: Part I-5535916609452687941sí
1.16Nether Update6006096527635909600sí
1.15Buzzy Bees-4404205509303106230sí
1.14Village & Pillage2802867088795589976sí
1.13Update Aquatic1458140401 (“18w22a”)no, es un texto
Beta 1.8 a 1.12Original25357015387625 (solo los 48 bits de abajo)no se sabe

Seeds de la wiki. xpple ya hizo una tabla así en el Discord. La de Tricky Trials y la de Herdcraft Update todavía no tienen seed conocida.

Así que empecé sabiendo que lo más probable era una seed de 64 bits. Pero esta es la primera en mucho tiempo que sale antes en Java que en Bedrock. Y si era de 48 bits se podía comprobar entera, así que lo intenté.

Las 6 caras

Las 6 caras, de la 0 a la 5

La panorámica es muy oscura. Si subes la exposición se ven la piedra, las menas y el hielo.

La cara 2 tal cual, casi negraLa misma cara con la exposición subidaOriginalExposición

La cámara

La posición la sacó Laggy (i_am_sheep) con la rotación de las texturas de piedra (con su CoordsFinder). También vio que caía justo en el centro de un bloque y Bachale pasó el /tp redondeado. Yo la saqué con mi propia herramienta y da lo mismo:

/tp -175049.5 110 -269602.5 -135 0

Caras de piedra marcadas en WebCoordsFinder

fanda857 sacó parte de la Z con las nubes (con el cloudfinder de humhue).

La cuadrícula de las nubes para el cloudfinder

Después lo comprobé yo con WebCoordsFinder en la cara 2, marcando 91 caras de piedra. Ojo, que busqué solo cerca de la posición que ya sabíamos, por eso solo tarda un minuto. Sin saberla hay que buscar en una zona muchísimo más grande, como hizo Laggy. Sale un solo resultado con 0 errores, a pocos bloques de la cámara:

Un solo resultado, con 0 errores
Config para CoordsFinder (por si alguien quiere repetirlo)

También están los proyectos de WebCoordsFinder de la cara 2 y la cara 1 con las caras marcadas, para abrirlos directamente en su web.

algorithm = Vanilla-3
scanOrder = spiral
directions = [0, 90, 180, 270]

xRange = (-180000, -160000)
yRange = (100, 120)
zRange = (-270000, -260000)

errorTolerance = 0

cpuTileSize = (1024, 1024)
gpuTileSize = (8192, 8192)
verbose = false

[filter]
-13 3 -8 | 1 side
-13 3 -7 | 1 side
-14 3 -4 | 1 side
-14 3 -3 | 1 side
-15 3 -2 | 1 side
-13 4 -10 | 1 side
-13 4 -9 | 0 side
-13 4 -8 | 1 side
-13 4 -7 | 0 side
-14 4 -6 | 1 side
-14 4 -5 | 0 side
-14 4 -4 | 0 side
-14 4 -3 | 0 side
-15 4 -2 | 0 side
-10 5 -7 | 1 side
-11 5 -6 | 0 side
-10 5 -6 | 1 side
-12 5 -5 | 1 side
-13 5 -4 | 0 side
-13 5 -3 | 1 side
-14 5 -2 | 1 side
-14 5 -1 | 0 side
-9 6 -10 | 1 side
-9 6 -9 | 1 side
-10 6 -6 | 1 side
-10 6 -5 | 1 side
-11 6 -4 | 1 side
-13 6 -3 | 0 side
-13 6 -2 | 0 side
-14 6 -1 | 1 side
-14 6 0 | 1 side
-9 7 -10 | 0 side
-9 7 -9 | 0 side
-9 7 -6 | 1 side
-10 7 -5 | 0 side
-11 7 -4 | 0 side
-12 7 -3 | 0 side
-13 7 -2 | 1 side
-13 7 -1 | 0 side
-14 7 0 | 0 side
-14 7 1 | 0 side
-7 8 -11 | 0 side
-9 8 -10 | 0 side
-9 8 -9 | 0 side
-9 8 -8 | 1 side
-9 8 -7 | 0 side
-9 8 -6 | 0 side
-10 8 -5 | 1 side
-11 8 -4 | 1 side
-10 8 -4 | 1 side
-12 8 -3 | 1 side
-13 8 -2 | 0 side
-13 8 -1 | 0 side
-13 8 0 | 1 side
-14 8 1 | 0 side
-14 8 2 | 1 side
-8 9 -11 | 1 side
-9 9 -10 | 1 side
-9 9 -9 | 1 side
-9 9 -8 | 0 side
-9 9 -7 | 0 side
-9 9 -6 | 0 side
-9 9 -5 | 0 side
-13 9 -1 | 0 side
-14 9 1 | 1 side
-14 9 2 | 1 side
-8 10 -11 | 0 side
-9 10 -10 | 1 side
-9 10 -9 | 0 side
-9 10 -8 | 1 side
-9 10 -7 | 1 side
-9 10 -6 | 1 side
-9 10 -5 | 1 side
-8 11 -11 | 1 side
-9 11 -10 | 0 side
-9 11 -9 | 0 side
-9 11 -8 | 1 side
-9 11 -7 | 0 side
-9 11 -5 | 1 side
-8 12 -11 | 1 side
-9 12 -10 | 0 side
-9 12 -9 | 1 side
-9 12 -8 | 0 side
-9 12 -7 | 1 side
-9 12 -6 | 0 side
-5 13 -11 | 1 side
-6 13 -10 | 0 side
-6 13 -9 | 1 side
-6 13 -8 | 0 side
-7 13 -7 | 0 side
-7 13 -6 | 1 side

Los 3 filtros

Para descartar seeds usé tres cosas que se ven en la imagen.

Cristales de hielo

Se ven unos cuantos y son lo que más información da. Cada uno está en un sitio que depende de la seed, así que cuantos más se leen menos seeds encajan. Leí el bloque exacto de cada uno. Estos son los de la cara 1.

Los cristales de la cara 1 bloque a bloque

Andesita

Hay una mancha de andesita cerca de la cámara. Se ve gris dentro del hielo. Esta es la que usé, con sus bloques exactos.

La mancha de andesita bloque a bloque

Biomas

Los biomas se ven por la ventana de la cueva. Cueva de hielo alrededor de la cámara y océano helado con icebergs fuera. Esto solo lo miraba al final, para descartar las seeds que pasaban los otros dos filtros.

Cueva de hielo y océano helado

Comprobaciones

Me daba miedo que el modelo estuviera mal y se me pasara la seed buena. Así que antes de buscar hice esto.

  • Generé mundos con seeds conocidas en esa snapshot y los comparé con mi simulación. Acertó los 641 cristales y las 156 vetas de andesita que comprobé, mientras que con una seed cualquiera casi ninguno coincide.
  • El orden de la decoración cambia entre snapshots. Comparé los jar y busqué con las sales de cada versión, que están en la tabla de abajo.
  • Leí los cristales varias veces, a mano y con mis detectores. Corregí un par al principio. Al final hubo otra lectura independiente sin mirar las anteriores. Salieron los mismos bloques, algunos con más dudas que otros.
  • También marqué la cara 1 en WebCoordsFinder. Sale el mismo sitio. Los bloques donde están los cristales coinciden con los míos.
  • Miré si podía ser un mundo de Bedrock pasado a Java (con Chunker, por ejemplo). Chunker copia los bloques tal cual, así que los cristales y la andesita estarían donde los pone Bedrock. Lo comprobé y no cuadran, los generó Java.
  • Antes de alquilar las GPUs metí seeds de prueba plantadas, tambien con algunos cristales mal puestos a propósito. La búsqueda las sacó todas y cada GPU alquilada repetía esa prueba antes de empezar.

Estas son las sales que usé, sacadas del orden de decoración de cada jar. La sal es el índice más 10000 por el paso, como en el código de abajo.

Features3s4 y s5s6 y s7
ice_crystals700017000170001
ice_cave_ore_andesite_upper600276002860028
ore_andesite_upper600056000660006

La s4 y la s5 tienen las mismas sales que la s6 y la s7. Lo que cambia es que de la s3 a la s5 ore_andesite_upper también puede salir dentro de la cueva, así que en esas versiones la mancha podía venir de cualquiera de las dos y probé las dos.

Las búsquedas

  • Seeds de 32 bits, que incluyen todas las de texto, por biomas. Nada (M33_Galaxy llegó a lo mismo).
  • Números que alguien podría escribir a mano en el campo de la seed, como fechas, versiones o números redondos. Unos 18 millones. Esa lista la hice con ayuda de IA mientras yo programaba otras cosas. Era fácil de revisar a mano. Tampoco salió nada.
  • Todas las seeds que puede dar nextLong, para la s3 y para la s4-s7. En la 26.x una seed aleatoria sale de RandomSource.create().nextLong(), que tiene 48 bits de estado (lo miré en el código del juego). nextLong junta dos números de 32 bits sacados de ese mismo estado, así que de las 2^64 seeds posibles como mucho puede dar 2^48 distintas. Probé todos esos estados aguantando algún cristal mal leído y ninguna seed llegó al paso de los biomas.

El miércoles ya casi me había rendido con Java. En el Discord dije que estaba un 99% seguro de que era una seed de Bedrock. Las últimas panorámicas no salían de nextLong y las seeds aleatorias de Bedrock tampoco. Y según la wiki la de Wilderness Bound se hizo copiando cosas del terreno de Bedrock. Así que pensaba esperar a la de Bedrock. Había lanzado una primera búsqueda de 48 bits en mi gráfica, pero solo había recorrido un trozo pequeño sin encontrar nada, así que eso no descartaba la seed.

Al día siguiente Laggy me recordó en el Discord que esta había salido antes en Java, así que no se podía descartar una seed de 48 bits. Yo ya lo sabía, pero me hizo insistir por si me estaba equivocando. Además no había otra opción, para los 64 bits solo quedaba esperar y los 48 sí se podían probar. Fui a por ello aunque era un poco gambling.

Con los primeros filtros mi gráfica tardaría como un mes. La pobre ya estaba sufriendo y yo me estaba volviendo un poco loco. Fui metiendo filtros más rápidos y al final alquilé GPUs (4 RTX 4090). La de la s4-s7 la acabé entre mi PC y las alquiladas. Luego hice la s3 entera en las alquiladas. Me daba igual pagar un poco con tal de tenerlo ya. Así aprovechaba el tiempo para otras cosas y si me había equivocado en algo lo sabía antes. Con todo eso una pasada entera bajó a más o menos una hora. En total unos 4 dólares.

Cuando acabó con cero resultados lo primero que pensé es que había hecho algo mal, así que volví a repasar todo lo de arriba.

Código de ejemplo

Esto es lo básico. La búsqueda de verdad está hecha en GPU en mi proyecto.

Esto sirve para ver si una seed sale del generador de 48 bits. Así hice la tabla de arriba.

def nextlong(seed):
    seed &= 2**64 - 1
    hi, lo = seed >> 32, seed & 0xffffffff
    for c in (0, 1):
        s = ((hi + c) & 0xffffffff) << 16
        for k in range(65536):
            n = (s | k) * 0x5DEECE66D + 0xB & 2**48 - 1
            if n >> 16 == lo and lo >> 31 == c:
                return True
    return False

print(nextlong(2802867088795589976))
print(nextlong(7904846446833094596))

La primera es la de la 1.14 y da True. La segunda es la de The Copper Age y da False. Una seed de 64 bits al azar pasa esto por casualidad más o menos 1 de cada 65536 veces.

Así sale la seed de cada feature de decoración en un chunk. Es el código del juego, resumido. Desde la 1.18 esa seed pasa por Xoroshiro, que usa los 64 bits enteros. Por eso no vale buscar solo los 48 bits de abajo como en versiones viejas. Hay que recorrer lo que da nextLong, que ya son seeds de 64 bits.

long setDecorationSeed(long worldSeed, int chunkMinX, int chunkMinZ) {
    setSeed(worldSeed);
    long a = nextLong() | 1L;
    long b = nextLong() | 1L;
    long seed = (long) chunkMinX * a + (long) chunkMinZ * b ^ worldSeed;
    setSeed(seed);
    return seed;
}

void setFeatureSeed(long decorationSeed, int index, int step) {
    setSeed(decorationSeed + index + 10000L * step);
}

Otras cosas que probé

  • El punto rojizo del agua, que vi el primer día. Si fuera de un portal en ruinas o de unas ruinas oceánicas frías sería una estructura. Con eso se puede sacar la structure seed (los 48 bits de abajo) muy rápido, así que habría sido un filtro buenísimo. Comprobé su colocación con el juego, pero con la geometría no cuadraba. Es underwater_magma, magma del fondo del mar. Al ser un solo píxel tan lejos no sirve de filtro.
  • Las texturas del frostbite para saber la snapshot. Son iguales en la s6 y la s7. Al final busqué en todas.
  • Los carámbanos (icicle_cluster y large_icicle). Dependen del terreno, que es lento de simular. La base de los grandes se lee mal en la imagen.
  • Los icebergs del fondo. Están demasiado lejos, un par de píxeles por bloque.
  • Estructuras. No se ve ninguna, así que por ahí no se puede sacar la structure seed (los 48 bits de abajo).
  • Las seeds de las panorámicas anteriores, por si la habían reutilizado. Ninguna tiene cueva de hielo ahí.
  • Los metadatos de las imágenes del juego. Nada.
  • Los túneles de la cueva. Los carvers (los túneles y cañones de toda la vida) solo usan los 48 bits de abajo de la seed, pero esta es una cueva de ruido, así que no sirven.

Lo que creo

No es de 48 bits en la s3 a la s7. Lo único que no descarto es que la captura sea de una versión interna entre dos snapshots, con otro orden de decoración. Probar las 2^6418.446.744.073.709.551.616 seeds seeds es 65536 veces la búsqueda de 48 bits, unos 7 años con las mismas 4 GPUs, así que por fuerza bruta no.

Desde la 1.18.30 Bedrock acepta seeds de 64 bits. Además creé mundos nuevos en Bedrock sin escribir nada y ninguna seed salía de nextLong. Eso encajaría con las últimas panorámicas que no salen de nextLong.

Yo creo que la seed es de 64 bits (a lo mejor sacada de Bedrock, pero eso es una suposición) y que con esa seed se generó el mundo en Java.

Ahora toca esperar a la panorámica de Bedrock, que debería salir pronto.

Actualización

Todavía no hay seed, pero la gente de Minecraft@Home está reconstruyendo la cueva a mano en un servidor. Cuando salga la de Bedrock lo pondré. Si sale la seed lo celebraré aquí con muchos emojis.

Si tienes alguna pista, pásate por el Discord de Minecraft@Home.

Herramientas y fuentes

Las herramientas del post (leer las imágenes, simular los cristales y la andesita, las búsquedas en GPU, la comprobación con mundos reales) son de mi propio proyecto, que llevo haciendo desde 2020. También me apoyé en estas herramientas y fuentes de la comunidad para comprobar resultados y sacar ideas:

  • cubiomes, que uso para los biomas.
  • Los jar de cada snapshot, que ahora vienen sin ofuscar. Con eso se ve directamente cómo genera el juego. También los usé para generar mundos de prueba.
  • WebCoordsFinder y CoordsFinder de Laggy, con los que sacó la cámara (la comparé con la que saqué yo).
  • El cloudfinder de humhue, que usó fanda857 para las nubes.
  • La wiki de Minecraft (Panorama y Historical panoramas), para las seeds y posiciones de las panorámicas anteriores.
  • Minecraft@Home (GitHub), por cómo sacaron otras panorámicas, por ejemplo Pale Garden.
  • Chunker, el conversor de mundos entre Java y Bedrock de Hive, para probar la idea de un mundo convertido.
  • bedrock-samples, el repositorio de Mojang donde salen las panorámicas de Bedrock.
  • vast.ai, para alquilar las GPUs.
  • El Discord de Minecraft@Home, donde salieron muchas de las pistas.

Gracias a la gente de Minecraft@Home, Laggy (i_am_sheep), Bachale, fanda857, M33_Galaxy, HARYA, ui (xnuuizh), xpple, sage (.sage007), elenaran, Tom (tomlacko), Cactooz y Philipp_DE por el servidor donde están reconstruyendo la cueva a mano.

Gracias por leer :D