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.
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:
- 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.
- 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.
- 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ón | El cielo |
|---|---|
| Primavera | 20% de lluvia, si no despejado |
| Verano | Despejado, todos los días |
| Otoño | 25% de tormenta eléctrica, si no 60% de lluvia; 40% de niebla encima de cualquier cosa; el último día siempre nieva |
| Invierno | 60% 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
- Cinco errores de complementos de Bedrock que fallan sin dar error Un caballo invisible, patas corriendo cuatro veces más rápido, una criatura que olvidó cómo saltar y un pack de magia que se rompió sin que nadie lo tocara. Cinco errores de complementos de Minecraft Bedrock con los que me topé haciendo LLS Equestrian y el Magic Pack, y cómo atraparlos.
- Cómo hacer que un portón gire en Minecraft Bedrock, cuando los bloques no se pueden animar Los bloques de Bedrock no se pueden mover, y la colisión de un bloque personalizado tiene que caber dentro de un bloque. Cómo los portones dobles de LLS Missing Blocks fingen las dos cosas, y los trucos de colisión que mantienen adentro a una vaca y dejan pasar a un caballo.
- Patas que se quedan en el suelo: IK de dos huesos en Molang para el Doggoyle Cómo el Doggoyle del LLS Magic Pack mantiene las patas en el suelo al paso, al trote y al galope: un reloj de zancada a partir de la velocidad en el suelo, pisadas planeadas sobre el piso, y cinemática inversa resuelta en cada cuadro en el Molang de Bedrock.