O Bedrock não tem botão de sentar: como o banquinho do Missing Blocks senta um jogador

O Minecraft Bedrock não consegue fazer um jogador sentar, então o banquinho do LLS Missing Blocks gera um assento invisível montável. Por que a conta de altura óbvia afundava os jogadores meio bloco dentro do banquinho, e a regra de uma linha que funciona.

· 5 min de leitura

A arte principal do LLS Missing Blocks, um celeiro com portas de celeiro em três tamanhos

O Bedrock normal não tem onde sentar que não seja um barco ou um carrinho de minas. Uma cadeira numa construção é decoração: você chega perto e nada acontece. O banquinho do LLS Missing Blocks era para resolver isso, e acabou sendo uma lição sobre medir antes de calcular.

O único jeito de sentar é montar

Um jogador do Bedrock não tem um estado de sentado que um script consiga ligar. O modelo do jogador só entra em pose sentada por um motivo: ele está montado em alguma coisa. Então sentar num banquinho quer dizer:

  1. Gerar uma entidade invisível montável dentro do bloco do banquinho.
  2. Colocar o jogador no assento dela com rideable.addRider(player).
  3. Tirar a entidade de novo assim que ninguém estiver nela.

É o mesmo truque que as portas de celeiro e as porteiras do pacote usam por outro motivo: o motor não faz isso com um bloco, então uma entidade faz.

Levantar não precisa de código nenhum. Agachar é o jeito de desmontar no Bedrock, e funciona no assento igual num cavalo. Isso deixa o assento vazio, e uma varredura tira qualquer assento sem ninguém, ou cujo banquinho foi quebrado.

O clique

Clicar com o botão direito num banquinho deveria fazer você sentar. Agachar + botão direito deveria fazer o que faz em qualquer outro bloco e colocar algo encostado nele, senão você nunca conseguiria construir do lado de um banquinho. Então a regra é simples: um jogador agachado nunca senta.

Dois detalhes deixaram isso confiável:

  • O beforeEvents.playerInteractWithBlock é usado quando existe, e a interação é cancelada. Assim, clicar com o botão direito num banquinho com uma tocha na mão faz você sentar em vez de grudar uma tocha no banquinho. Se esse evento existe depende da versão da API de scripts, então o código confere em vez de supor, e se não existir usa o evento posterior.
  • Um clique pode chegar duas vezes. Às vezes o Bedrock dispara a interação mais de uma vez para um único toque. Uma marca de tick por jogador ignora uma segunda tentativa dentro de quatro ticks, então um clique nunca gera dois assentos.

O assento também é ligado ao banquinho pela posição exata do banquinho, guardada na entidade quando ela é gerada, não pelo “assento mais próximo”. Dois banquinhos lado a lado nunca dividem nem roubam um assento.

A conta de altura que estava errada

A parte difícil era um número só: a que altura colocar o assento para o traseiro do jogador ficar na superfície de cima do banquinho.

Minha primeira versão calculava a partir do modelo do jogador. O raciocínio era assim:

  • O Bedrock coloca a origem do modelo de quem monta na posição do assento.
  • A pose de montar só gira as pernas para a frente, então o que fica apoiado no assento é a parte de baixo das coxas.
  • O pivô do quadril fica a 0,703 bloco de altura no modelo, e a perna tem mais ou menos um quarto de bloco de espessura, então a parte de baixo de uma coxa na horizontal fica a uns 0,586 acima da origem.
  • Então: posição do assento = superfície do assento − 0,586.

É arrumado, usa números reais do modelo, e estava errado em 0,49 bloco. Os jogadores ficavam sentados afundados no banquinho até a cintura.

O 0,703 do quadril e as outras medidas do corpo são reais, mas são folgas: quanto espaço quem monta precisa em volta de um assento, para o teto de uma cabine não atravessar a cabeça. Elas não descrevem onde o Bedrock realmente coloca quem monta. Um jogador montado senta bem mais alto no ponto do assento do que a geometria do modelo sugere.

Melhor medir

Em vez de deduzir um chute melhor, fiz o banquinho relatar o que aconteceu. Toda vez que alguém senta, o script espera dez ticks (a montaria não vale no tick em que o addRider é chamado), e depois registra:

[llsmb:sit] block=64 surface=64.750 spot=64.650 rider=... rider-surface=...

Isso é o bloco, a superfície do assento do banquinho, onde a entidade do assento foi colocada, onde o jogador realmente foi parar, e a diferença. Com isso no registro de conteúdo, uma altura errada é uma subtração, não mais uma teoria.

A resposta que ele deu batia com uma coisa que eu já tinha lançado sem perceber. Os dois tratores do Farm Sim Pack colocam o assento do motorista 0,1 bloco abaixo do topo do assento, e os motoristas sentam certo neles. O banquinho precisava do mesmo:

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;

Posição do assento = superfície do assento − 0,10. Essa é a regra inteira, para qualquer assento em qualquer bloco. A dedução errada continua escrita no código, marcada como retirada, para ninguém calcular de novo com os mesmos números.

Mantendo o modelo e o código juntos

O modelo do banquinho vem de um script de build, e a altura do assento no código do jogo precisa bater com a superfície de cima do modelo. Duas cópias de um número cedo ou tarde se separam, então o script de build lê o SEAT_SURFACE_PX direto do script do jogo e se recusa a montar se o modelo que ele vai gerar não bater. Mude a altura do banquinho num lugar e o outro reclama até os dois baterem.

Tem também um ajuste ao vivo para testes: um scriptevent que sobe ou desce o ponto de sentar uma fração de bloco, guardado no mundo. Um ajuste só faz sentido em relação à altura padrão contra a qual foi medido, então esse valor base fica guardado ao lado dele. Quando a altura padrão muda, um ajuste antigo é jogado fora em vez de empilhar calado o erro velho em cima do número novo.

As regras pequenas

  • Sem espaço em cima, sem sentar. A cabeça de um jogador vai parar no bloco acima do banquinho, e quem monta sufoca num bloco sólido como qualquer um. Água em cima pode: sentar no raso é metade da graça de um banquinho do lado de um lago.
  • Você fica virado para onde estava olhando quando sentou. O assento não trava sua rotação, então dá para virar a cabeça e olhar em volta.
  • Suas mãos ficam livres. Quem está nesse assento é passageiro, não motorista, então lançar uma vara de pescar de um banquinho funciona igual de um barco.
  • Já está montado em alguma coisa? Você não consegue sentar, e nenhum assento perdido é gerado só para ser varrido um tick depois.

O que isso abre

A entidade do assento não liga para o que está em volta dela. Agora que a regra da altura foi medida e não chutada, um banco comprido ou uma cadeira são o mesmo código com outro SEAT_SURFACE_PX.

O banquinho está no LLS Missing Blocks e no Farm Sim Pack: três tábuas de carvalho em cima de dois gravetos. O guia do Missing Blocks tem o resto do pacote.

O mod

Mais do devlog

← Todo o devlog