Bedrock no tiene botón para sentarse: cómo el banco de Missing Blocks sienta a un jugador
Minecraft Bedrock no puede hacer que un jugador se siente, así que el banco de LLS Missing Blocks genera un asiento invisible que se puede montar. Por qué las cuentas de altura obvias hundían a los jugadores medio bloque dentro del banco, y la regla de una línea que sí funciona.
El Bedrock normal no tiene dónde sentarse que no sea un bote o una vagoneta. Una silla en una construcción es decoración: te acercas a ella y no pasa nada. El banco de LLS Missing Blocks era para arreglar eso, y resultó ser una lección de medir antes de calcular.
La única forma de sentarse es montar
Un jugador de Bedrock no tiene un estado de sentado que un script pueda activar. El modelo del jugador solo se pone en pose sentada por una razón: está montando algo. Así que sentarse en un banco significa:
- Generar una entidad invisible que se puede montar dentro del bloque del banco.
- Poner al jugador en su asiento con
rideable.addRider(player). - Quitar la entidad otra vez en cuanto nadie esté encima.
Es el mismo truco que usan las puertas de granero y los portones del pack por otra razón: el motor no lo hace con un bloque, así que lo hace una entidad.
Levantarse no necesita nada de código. Agacharse es la forma de bajarse en Bedrock, y funciona en el asiento igual que en un caballo. Eso deja el asiento vacío, y una revisión quita cualquier asiento sin jinete, o cuyo banco se haya roto.
El clic
Hacer clic derecho en un banco debería sentarte. Agacharse + clic derecho debería hacer lo que hace en cualquier otro bloque y poner algo contra él, si no nunca podrías construir junto a un banco. Así que la regla es simple: un jugador agachado nunca se sienta.
Dos detalles lo hicieron confiable:
- Se usa
beforeEvents.playerInteractWithBlockcuando existe, y la interacción se cancela. Así, hacer clic derecho en un banco con una antorcha en la mano te sienta en vez de pegarle una antorcha al banco. Que ese evento exista depende de la versión de la API de scripts, así que el código lo revisa en vez de suponerlo, y si no, usa el evento posterior. - Un clic puede llegar dos veces. A veces Bedrock lanza la interacción más de una vez por una sola pulsación. Una marca de tick por jugador ignora un segundo intento dentro de cuatro ticks, así que un clic nunca genera dos asientos.
El asiento también se empareja con su banco por la posición exacta del banco, guardada en la entidad al generarla, no por “el asiento más cercano”. Dos bancos lado a lado nunca comparten ni se roban un asiento.
Las cuentas de altura que estaban mal
La parte difícil era un solo número: qué tan alto poner el asiento para que el trasero del jugador quede sobre la superficie de arriba del banco.
Mi primera versión lo calculaba a partir del modelo del jugador. El razonamiento era así:
- Bedrock pone el origen del modelo del jinete en la posición del asiento.
- La pose de montar solo gira las piernas hacia adelante, así que lo que descansa en el asiento es la parte de abajo de los muslos.
- El pivote de la cadera está a 0.703 bloques de altura en el modelo, y la pierna mide más o menos un cuarto de bloque de grueso, así que la parte de abajo de un muslo horizontal queda a unos 0.586 sobre el origen.
- Entonces: posición del asiento = superficie del asiento − 0.586.
Es ordenado, usa números reales del modelo, y estaba mal por 0.49 bloques. Los jugadores quedaban sentados hundidos en el banco hasta la cintura.
Los 0.703 de la cadera y las demás medidas del cuerpo son reales, pero son holguras: cuánto espacio necesita un jinete alrededor de un asiento, para que el techo de una cabina no le atraviese la cabeza. No describen dónde pone Bedrock de verdad al jinete. Un jugador montado se sienta mucho más alto sobre el punto del asiento de lo que sugiere la geometría del modelo.
Mejor medirlo
En vez de deducir una mejor suposición, hice que el banco reportara lo que pasó. Cada vez que alguien
se sienta, el script espera diez ticks (la montura no se aplica en el tick en que se llama a addRider),
y luego registra:
[llsmb:sit] block=64 surface=64.750 spot=64.650 rider=... rider-surface=...
Eso es el bloque, la superficie del asiento del banco, dónde se puso la entidad del asiento, dónde terminó de verdad el jugador, y la diferencia. Con eso en el registro de contenido, una altura mal puesta es una resta, no otra teoría.
La respuesta que dio coincidía con algo que yo ya había publicado sin darme cuenta. Los dos tractores del Farm Sim Pack ponen el asiento del conductor 0.1 bloques abajo de la parte de arriba del asiento, y los conductores se sientan bien en ellos. El banco necesitaba lo mismo:
const SEAT_SURFACE_PX = 12; // the stool's top, in pixels above the block's base
const RIDER_DROP = 0.1;
const SIT_Y = SEAT_SURFACE_PX / 16 - RIDER_DROP;
Posición del asiento = superficie del asiento − 0.10. Esa es toda la regla, para cualquier asiento en cualquier bloque. La deducción equivocada sigue escrita en el código, marcada como retractada, para que nadie la vuelva a calcular con los mismos números.
Mantener el modelo y el código a la par
El modelo del banco sale de un script de construcción, y la altura del asiento en el código del juego
tiene que coincidir con la superficie de arriba del modelo. Dos copias de un mismo número tarde o temprano
se separan, así que el script de construcción lee SEAT_SURFACE_PX directo del script del juego y se
niega a construir si el modelo que va a generar no coincide. Cambia la altura del banco en un lugar y el
otro se queja hasta que coincidan.
También hay un ajuste en vivo para pruebas: un scriptevent que sube o baja el punto donde te sientas una
fracción de bloque, guardado con el mundo. Un ajuste solo tiene sentido contra la altura integrada con la
que se midió, así que ese valor base se guarda junto a él. Cuando cambia la altura integrada, un ajuste
viejo se descarta en vez de apilar en silencio su error viejo encima del número nuevo.
Las reglas pequeñas
- Sin espacio arriba, no te sientas. La cabeza de un jugador termina en el bloque de arriba del banco, y un jinete se asfixia en un bloque sólido como cualquiera. El agua arriba sí está bien: sentarte en lo poco profundo es la mitad del chiste de un banco junto a un estanque.
- Miras hacia donde estabas viendo cuando te sentaste. El asiento no traba tu rotación, así que todavía puedes girar la cabeza y mirar alrededor.
- Tus manos quedan libres. Un jinete en este asiento es pasajero, no conductor, así que lanzar una caña de pescar desde un banco funciona igual que desde un bote.
- ¿Ya vas montado en algo? No te puedes sentar, y no se genera un asiento perdido solo para quitarlo un tick después.
Lo que abre
A la entidad del asiento no le importa dentro de qué está. Ahora que la regla de altura se midió y no se
adivinó, una banca o una silla son el mismo código con otro SEAT_SURFACE_PX.
El banco está en LLS Missing Blocks y en el Farm Sim Pack: tres tablones de roble sobre dos palos. La guía de Missing Blocks tiene el resto del pack.
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.
- 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.
- 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.