Hacer que nieve en una granja de planicie: cómo fingir clima invernal en Minecraft Bedrock

Bedrock no tiene clima de nieve y decide entre lluvia o nieve según el bioma. Cómo LLS Seasons arma un día nevado con niebla, una partícula y una capa de nieve propia, y el congelamiento de verano que causó una limpieza de nieve.

· 8 min de lectura

Nieve cayendo sobre un campo despejado del LLS Farm Sim Pack en invierno

El Farm Sim Pack tiene un año de 28 días, y el calendario solo es creíble si el mundo cambia con él. El verano está despejado, el otoño tiene tormentas, y el invierno nieva, incluso en una granja de planicie. Esa última parte es donde Bedrock se resiste más.

Bedrock no puede nevar cuando se lo pides

Un script puede poner el clima en una de tres cosas: Clear, Rain o Thunder (despejado, lluvia o tormenta). No hay nieve. Que la precipitación que cae se vea como lluvia o como nieve lo decide el cliente de cada jugador según la temperatura del bioma, y ningún script lo puede cambiar.

Así que en un bioma frío, Rain muestra nieve. En todos los demás, Rain muestra lluvia. Mi primer plan era usar la lluvia normal en los días nevados, lo que funciona en una taiga y está mal en una granja de planicie: te sale lluvia cayendo y nieve en el suelo al mismo tiempo.

La respuesta fue dejar de usar el clima normal para la nieve por completo.

Un día nevado son tres efectos

En un día nevado el cielo se pone en Clear, así que el juego normal no dibuja ninguna precipitación, y tres cosas hacen las veces de nieve:

  1. Niebla de cielo nublado. La lluvia oscurece el cielo; Clear no. Una niebla gris que viene en el pack de recursos se le pone a cada jugador durante el día, así que el cielo se cierra como debe.
  2. Nieve cayendo. Un efecto de partículas deja caer copos alrededor de cada jugador que está al aire libre. A los jugadores en biomas cálidos se les salta, y esa revisión del bioma se guarda por jugador en vez de repetirse dos veces por segundo.
  3. Nieve en el suelo. Una capa de bloques de nieve se pone alrededor de los jugadores y las granjas el primer día del invierno y sube un nivel cada día nevado, hasta seis octavos de bloque. Me quedé antes de un bloque completo a propósito: la nieve casi completa hace notablemente más lento caminar, y seis ya se ve profunda.

La niebla tampoco es un tipo de clima normal, así que tiene su propio sorteo. Cada estación sortea sus probabilidades por separado cada día del calendario:

EstaciónEl cielo
Primavera20% de lluvia, si no despejado
VeranoDespejado, todos los días
Otoño25% de tormenta eléctrica, si no 60% de lluvia; 40% de niebla encima de cualquier cosa; el último día siempre nieva
Invierno60% de nieve; 20% de niebla encima

El sorteo del día se guarda, así que recargar el mundo da el mismo cielo. Si algo fuera del pack cambia el clima (el propio ciclo de clima del juego, o dormir durante una tormenta), el pack vuelve a poner el clima del día en cuanto lo nota.

La capa no dejaba de derretirse

Poner nieve es fácil. Mantenerla no. El juego normal derrite snow_layer con las actualizaciones al azar (random ticks) donde el bioma es cálido o la luz es fuerte, que es en todos lados en una granja de planicie. Una capa recién puesta quedaba picada de cuadros pelones en minutos.

El primer arreglo fue una pasada de reparación: cada tanto, buscar los hoyos y rellenarlos. Funcionaba, y se veía roto. Las actualizaciones al azar están dispersas, así que el deshielo se llevaba el campo un bloque a la vez, y cada hoyo se quedaba pelón hasta que la siguiente pasada lo volvía a poner, muchas veces justo frente al jugador. Derretir y luego repintar no se lee como clima. Se lee como un error.

Primer arreglo: apagar las actualizaciones al azar

El primer arreglo de verdad detuvo el deshielo desde el origen. Mientras el invierno tenía nieve en el suelo, el pack ponía randomtickspeed en 0, y le devolvía al mundo su propio valor en el deshielo. Es un martillazo para todo el mundo, así que se mantenía en la ventana más corta posible: el invierno, y solo mientras hubiera capa puesta.

Solo era viable porque los cultivos de Farm Sim no crecen con actualizaciones al azar; funcionan con un contador de días, una etapa a la medianoche. Pero todo lo demás que sí usa eso se pausaba durante la semana: retoños, caña de azúcar, cactus, bambú, cacao, verrugas del Inframundo, hongos, la propagación del fuego, la oxidación del cobre, la caída de las hojas. Un árbol talado en invierno conservaba sus hojas hasta la primavera. Funcionaba, y se metía en mucho más del mundo de lo que la nieve tiene derecho.

El arreglo real: nieve propia

Desde la 0.6.5, la capa ya no es nieve normal. Es llss:snow_layer, un bloque propio del pack con las mismas ocho alturas que la nieve normal y sin comportamiento de actualización al azar. Nada la derrite excepto el propio pack, así que las actualizaciones al azar siguen activadas todo el invierno y los retoños siguen creciendo.

También arregló un segundo problema. Las pasadas viejas ponían y quitaban minecraft:snow_layer, así que el deshielo de primavera también podía quitar nieve normal: la de un bioma frío, la de un gólem de nieve, o nieve que un jugador puso a propósito. Ahora cada pasada solo toca su propio bloque, y la nieve normal nunca se toca.

Los mundos que usaron la versión vieja recuperan solos su propio randomtickspeed: se restaura el valor guardado durante un invierno viejo, no el valor por defecto de Bedrock.

La pasada de reparación sigue ahí como red de seguridad para los hoyos que el juego no hizo: un pedazo que cavó un jugador, un chunk que cargó después de la pasada que puso la nieve, una capa que se llevó el agua.

Que un trabajo grande no congele el juego

Una temporada de granja cubre mucho terreno, y poner o derretir nieve en todo eso son cientos de miles de columnas de bloques. Hecho de una vez, eso traba el servidor.

Cada pasada corre como un trabajo: un generador que se le da a system.runJob, que Bedrock avanza un poco en cada tick. El problema es que un trabajo avanza un paso por cada tick que se le da, sin importar cuánto trabajo haga cada paso. Con una columna por paso, un deshielo completo se midió a un ritmo que tardaría más que un año real. Así que cada paso maneja un lote de columnas antes de ceder. El tamaño del lote es la única perilla entre “visiblemente lento” y “el servidor tartamudea”.

El pack también tiene que recordar dónde puso nieve, o nunca la va a poder derretir. Cada vez que un jugador avanza medio radio hacia terreno nuevo, el lugar nuevo se agrega como un “centro de capa”. Se guardan hasta 300 centros, lo que cubre una temporada de granja real en una lista lo bastante chica para guardarla con el mundo.

Biomas cálidos y fríos

No debería nevar en un desierto, y solo los biomas fríos deberían conservar la nieve cuando llega la primavera. La versión de la API de scripts para la que está hecho este pack no tiene una llamada getBiome(), así que el clima se lee como lo haría un bloque de comandos: execute if biome contra una lista corta de identificadores de biomas cálidos y fríos, probando hasta que uno coincide.

Eso es lento si lo haces para cada columna, así que se hace una vez por centro de capa y se guarda en él. En el peor caso, un centro justo en el borde de un bioma recibe la decisión equivocada, lo que es un problema muchísimo menor que trabar el servidor revisando cada bloque.

La primavera, y el congelamiento que causó

El deshielo corre durante los primeros días de la primavera: un par de días visibles en que la capa se va haciendo menos profunda un nivel a la vez, y luego una pasada final quita lo que quede fuera de los biomas fríos.

Después de eso, una barrera mantiene la nieve fuera de los biomas cálidos hasta que termina el otoño, por si un chunk que estaba descargado en el deshielo carga después con nieve todavía encima. La primera versión de esa barrera me costó una semana de confusión. Cada 15 segundos volvía a borrar la nieve alrededor de cada centro de capa guardado (hasta 300, de 64 bloques cada uno) y de cada jugador, todo de una vez, sin ceder nunca, y lanzaba un error en cada columna de un chunk descargado.

En el juego eso era un congelamiento de tres segundos cada dieciocho segundos todo el verano. Parecía un error de los caballos y lag de otros packs. La pista estaba en el registro de contenido: líneas repetidas de [Watchdog] Spike, con el mismo espacio entre ellas. El espacio entre picos es el periodo del temporizador más el propio trabón, porque los ticks del juego no avanzan durante un trabón. Dieciocho segundos menos un trabón de tres segundos son quince, que era justo ese temporizador.

La barrera ahora corre como su propio trabajo pequeño con un temporizador de dos segundos: solo los centros cerca de un jugador, una revisión barata de que un chunk está cargado antes de tocar sus columnas, el chunk más cercano primero, unos cientos de columnas por tick, y un centro se tacha de la lista para siempre cuando todos sus chunks ya se limpiaron. El congelamiento ya no existe desde la 0.6.5.

Algunos números de este sistema solo son correctos porque se midieron en un mundo de granja real. El alcance alrededor de cada jugador (64 bloques) está limitado por la distancia de simulación: los chunks más lejos no están cargados, así que el script no puede poner nieve en ellos, y una lectura de depuración cuenta esos fallos para que yo sepa si un radio más grande de verdad ayudaría.

Pruébalo

Las estaciones, la nieve y el calendario de cultivos están en el Farm Sim Pack. La guía del primer año es un plan estación por estación para una granja nueva. Si usas /time set y te preguntas por qué el invierno no se acaba: mueve el sol, no el calendario. Usa /scriptevent llss:setseason spring.

El mod

Más del devlog

← Todo el devlog