Redes de voos
Uma rede de voos é um conjunto de nós num mundo, unidos por ligações bidirecionais. Os nós com nome são destinos. Um jogador escolhe um destino num NPC mestre de voo ou num portal de voo, e uma montada leva-o ao longo da cadeia de ligações mais curta até lá. As redes ficam em plugins/EliteMobs/transport_networks/ e usam as mesmas montadas e as mesmas regras de viagem das rotas de transporte.
Cada voo é construído quando o jogador o pede. O EliteMobs executa uma pesquisa A* sobre as ligações, usando a distância em linha reta entre os nós, e a montada segue uma curva suave por todos os nós do resultado. Nunca precisas de escrever uma rota para cada par de destinos: um nó ou uma ligação nova é usado por todos os voos que passa a encurtar.
Como os jogadores voam
- O jogador clica com o botão direito num NPC mestre de voo ou entra num portal de voo.
- Um menu Flight paths lista todos os destinos acessíveis a partir do nó do NPC ou do portal, do mais próximo para o mais distante ao longo das ligações, até 54. Os destinos que o jogador ainda não desbloqueou aparecem como corante cinzento, com a respetiva dica de bloqueio.
- Clicar num destino inicia uma contagem decrescente, por predefinição de 60 ticks (3 segundos), no fim da qual a montada apanha o jogador no ponto de partida.
- A montada voa pelo percurso e pousa o jogador no destino, virado para o seu
arrivalYaw.
Um mestre de voo ou um portal também pode dispensar o menu e voar diretamente para um destino. Consulta os mestres de voo e os portais de voo.
O jogador tem de estar a 8 blocos ou menos do NPC ou do portal ao clicar num destino, ou o clique não faz nada. Num NPC, qualquer movimento durante a contagem decrescente cancela a partida. Num portal, a contagem só é cancelada quando o jogador sai da zona do portal, a 1.5 × sizeMultiplier + 2 blocos do seu centro.
Agachar-se não tira o passageiro da montada a meio do voo. O voo termina antecipadamente em caso de morte, teletransporte, mudança de mundo, saída da instância da masmorra ou remoção da montada. Um voo que deixe de progredir durante 5 segundos pousa o passageiro no destino. Um passageiro que se desligue a meio do voo, fora de uma instância de masmorra, é colocado no destino no próximo início de sessão, e parar ou recarregar o servidor também coloca no destino os passageiros que estão a bordo.
Criar uma rede no jogo
Os comandos do editor só podem ser usados por jogadores e exigem elitemobs.transport.admin.
- Coloca-te no mundo da rede e executa
/em transport network edit harbor_flights. Uma rede sem ficheiro começa como um rascunho vazio. - Coloca-te onde os jogadores devem embarcar e executa
/em transport node add harbor. - Voa para cima e executa
/em transport node add harbor_sky. Sem vizinhos indicados, um nó novo liga-se ao nó selecionado, e o nó novo passa a ser o selecionado, por isso uma sequência de comandosaddconstrói um percurso. - Avança para o destino seguinte e acrescenta-o da mesma forma. Usa
/em transport node link <a> <b>para unir ramos. - Dá nome a cada destino com
/em transport node destination harbor &6Harbor. - Coloca-te num destino, virado para o lado para onde os jogadores devem ficar virados ao chegar, e executa
/em transport node yaw harbor. - Verifica um percurso com
/em transport network preview harbor minee percorre-o em voo com/em transport network ride harbor mine. - Executa
/em transport network save.
Os IDs de nós e de redes têm de 1 a 64 letras minúsculas, algarismos, sublinhados ou hífenes. Um rascunho regista o teu mundo atual como o mundo da rede. Dentro de uma instância de masmorra, regista antes o mundo do blueprint da masmorra. Uma rede existente só pode ser editada a partir do seu próprio mundo.
Comandos do editor
| Comando | Ação |
|---|---|
/em transport network edit <network> | Abrir um rascunho de uma rede existente, ou iniciar uma nova |
/em transport network list | Listar as redes carregadas |
/em transport network status | Mostrar o número de nós do rascunho e o nó selecionado |
/em transport network preview [from] [to] | Mostrar o percurso entre dois nós; sem nós, limpar a pré-visualização |
/em transport network ride <from> <to> | Voar entre dois nós do rascunho sem guardar |
/em transport network generate <first> <second> | Substituir a ligação entre dois nós por nós gerados que passam por cima do terreno |
/em transport network undo | Desfazer a última edição de um nó ou de uma ligação, até 32 edições guardadas |
/em transport network save | Guardar o rascunho |
/em transport network cancel | Descartar o rascunho |
/em transport node add <id> [neighbors...] | Acrescentar um nó onde estás, ligado aos nós indicados ou, na falta deles, ao nó selecionado |
/em transport node select [node] | Selecionar um nó; sem nó, selecionar o mais próximo de ti |
/em transport node link <first> <second> | Ligar dois nós nos dois sentidos |
/em transport node unlink <first> <second> | Remover a ligação entre dois nós |
/em transport node move <node> | Mover um nó para onde estás |
/em transport node remove <node> | Remover um nó e as suas ligações |
/em transport node destination <node> [name] | Tornar o nó um destino com esse nome no menu; sem nome, voltar a torná-lo um simples ponto de passagem |
/em transport node permission <node> <permission> | Exigir uma permissão para voar a partir deste nó ou para ele; none limpa-a |
/em transport node hint <node> [text] | Definir a mensagem mostrada enquanto o nó está bloqueado; sem texto, ou com none, limpa-a |
/em transport node yaw <node> | Definir a direção de chegada para o lado para onde estás virado |
A conclusão com Tab sugere IDs de redes para edit e os IDs dos nós do rascunho para os argumentos de nós. Todos os comandos, exceto edit, list, save, cancel e status, exigem que estejas no mundo do rascunho. Só podes editar uma rede de cada vez. Um rascunho fica em memória até o guardares ou cancelares, te desligares, o seu mundo ser descarregado ou o EliteMobs ser recarregado.
/em transport network ride move-te para o primeiro nó e parte de lá, mesmo que estejas noutro sítio. Não verifica as permissões dos nós, e o destino pode ser qualquer nó, com nome ou sem ele.
/em transport reload recarrega os ficheiros das redes juntamente com os das rotas. Os voos que já estão no ar mantêm o percurso original.
Vista do editor
Só o jogador que está a editar vê o rascunho. Todos os nós a menos de 128 blocos mostram o seu ID por cima, com o nome do destino numa segunda linha. A etiqueta do nó selecionado é amarela. As ligações são desenhadas como linhas azul-claras. Depois de preview, o percurso é desenhado a verde. Caso contrário, uma curva amarela passa pelo nó selecionado até onde estás, mostrando como um voo se curvaria se acrescentasses ali um nó.
Gerar nós provisórios
Uma ligação reta entre dois nós distantes pode atravessar uma colina. /em transport network generate <first> <second> constrói antes uma cadeia sobre o terreno:
- Lê a altura do solo a cada 4 blocos ao longo da linha entre os dois nós, em três colunas de largura. Só lê chunks que já foram gerados e carrega no máximo dois por tick, por isso nunca cria terreno novo.
- Cada ponto da cadeia voa 12 blocos acima do solo mais alto a cerca de 32 blocos para cada lado e nunca abaixo da linha reta entre os dois nós. Fica pelo menos 4 blocos abaixo do limite de construção.
- Coloca um nó aproximadamente a cada 48 blocos, mais um nó mesmo por cima de cada extremidade quando a cadeia voa mais de 2 blocos acima dessa extremidade.
- Remove a ligação direta e liga os dois nós através da cadeia.
Os nós têm de estar a pelo menos 16 blocos de distância na horizontal. Os nós gerados chamam-se <first>_<second>_1, <first>_<second>_2 e assim por diante, e são guardados com placeholder: true, para os encontrares mais tarde. Um único undo remove a cadeia inteira. Percorre o resultado a voar antes de guardar: o gerador só olha para o terreno, não para edifícios nem árvores.
YAML da rede
Para harbor_flights.yml:
isEnabled: true
world: my_world
transportEntity: transport_cannon_seat.yml
speed: 24.0
acceleration: 16.0
countdownTicks: 60
nodes:
harbor:
location: 120.5,64.0,-340.5
name: '&6Harbor'
arrivalYaw: 90.0
neighbors:
- harbor_sky
harbor_sky:
location: 120.5,96.0,-340.5
neighbors:
- harbor
- ridge_pass
ridge_pass:
location: 310.0,110.0,-180.0
neighbors:
- harbor_sky
- mine_sky
- watchtower_sky
watchtower_sky:
location: 455.5,102.0,-60.5
neighbors:
- ridge_pass
- watchtower
watchtower:
location: 455.5,81.0,-60.5
name: '&6Watchtower'
arrivalYaw: -45.0
permission: elitequest.watchtower_supplies.yml
lockedHint: '&7Finish the quest "Watchtower Supplies" to unlock this flight point.'
neighbors:
- watchtower_sky
mine_sky:
location: 260.0,95.0,20.0
neighbors:
- mine
- ridge_pass
mine:
location: 262.5,70.0,24.5
name: '&6Old Mine'
arrivalYaw: 180.0
neighbors:
- mine_sky
| Chave | Predefinição | Descrição |
|---|---|---|
isEnabled | true | Carrega a rede |
world | nenhum | O mundo onde estão os nós. Obrigatório |
transportEntity | transport_cannon_seat.yml | Um ficheiro ativado em custombosses/ usado como montada. Configura aí o tipo de entidade, o modelo e os poderes |
speed | 24 | Velocidade máxima em blocos por segundo. Tem de ser positiva |
acceleration | 16 | Blocos por segundo ganhos a cada segundo até à velocidade máxima. Tem de ser positiva |
countdownTicks | 60 | Ticks entre a escolha de um destino e o embarque. Zero ou mais |
nodes | nenhum | Mapa de IDs de nós para secções de nós |
Uma rede sem world, com um transportEntity que não seja um nome de ficheiro .yml, ou com uma velocidade, uma aceleração ou uma contagem decrescente inválida, regista um aviso e não é carregada.
Chaves dos nós
| Chave | Descrição |
|---|---|
location | x,y,z no mundo da rede. Obrigatório |
name | Nome no menu. Um nó com nome é um destino; um nó sem nome é um ponto de passagem por onde os voos passam. Os códigos de cor funcionam |
arrivalYaw | Direção para a qual o jogador fica virado ao chegar a este destino. Predefinição 0 |
permission | Permissão necessária para voar a partir deste nó ou para ele |
lockedHint | Texto mostrado para este nó enquanto está bloqueado. Predefinição &7You have not unlocked this flight point. |
neighbors | IDs dos nós a que este nó se liga |
placeholder | true nos nós criados pelo gerador. Os voos tratam-nos como qualquer outro nó |
As ligações funcionam nos dois sentidos, por isso basta indicar um vizinho de um dos lados. O EliteMobs avisa e descarta uma ligação para um nó em falta ou para um nó na mesma posição, ignora um nó inválido, avisa sobre um nó sem vizinhos e, numa rede com mais de um destino, avisa sobre um destino que não consegue chegar a nenhum outro.
Guardar a partir do editor reescreve apenas a secção nodes e mantém os comentários e as chaves desconhecidas dentro dos nós que ainda existem. Um ficheiro novo recebe também as definições da rede acima, com os valores predefinidos. O editor recusa guardar por cima de um ficheiro de rede que esteja desativado ou que tenha falhado ao carregar; corrige ou remove primeiro esse ficheiro.
A montada segue a curva exatamente. Não contorna obstáculos, por isso mantém livre o espaço entre os nós, para a montada e para o passageiro. As montadas cujo tipo de entidade é uma galinha ou um papagaio largam penas e batem as asas enquanto voam. Consulta o espaço livre e as interrupções da rota para saber o que acontece quando a montada não consegue ser gerada.
Mestres de voo
Um mestre de voo é um NPC com interactionType: TRANSPORT e uma rede:
interactionType: TRANSPORT
transportNetwork: harbor_flights
transportNode: harbor
Acrescenta estes campos a uma definição de NPC que seja válida. transportNode é o nó de onde partem os voos do NPC. A montada apanha o jogador nesse nó, por isso coloca-o junto ao NPC. Acrescenta transportDestination: mine para voar diretamente para esse destino, sem menu. Quando transportNetwork está definido, o NPC ignora transportRoutes.
Portais de voo
Uma wormhole com uma secção flight abre um menu de voo em vez de teletransportar:
isEnabled: true
location1: my_world,120.5,66,-336.5,90,0
style: ICOSAHEDRON
particleColor: 0xf0c060
sizeMultiplier: 2.0
flight:
network: harbor_flights
node: harbor
flight.node é o nó de partida, e a montada apanha o jogador aí, por isso coloca esse nó no portal. flight.destination voa diretamente para esse destino, sem menu. Um portal de voo só precisa de location1; se location2 também estiver definida, as duas extremidades abrem o mesmo menu. Não cobra coinCost nem aplica blindPlayer, mas a sua permission continua a aplicar-se. Para voltar a abrir o menu, sai da zona do portal e volta a entrar, pelo menos 5 segundos depois de o menu ter sido aberto pela última vez.
As wormholes não são ativadas para um jogador que vai num voo. Um jogador pousado dentro de um portal tem de sair dele, e têm de passar 5 segundos, antes de o portal voltar a ser ativado.
Pontos de voo bloqueados
Um nó com permission está bloqueado para os jogadores que não a têm. Um voo só verifica os nós de partida e de destino, por isso um percurso pode passar por pontos de passagem bloqueados. Para desbloquear um destino com uma quest, usa como permissão do nó o marcador questLockoutPermission da quest, como elitequest.watchtower_supplies.yml. Os jogadores recebem-no ao concluir a quest.
Quando o nó de partida está bloqueado, o jogador recebe o seu lockedHint em vez de um menu. Os destinos bloqueados continuam no menu, a cinzento, e clicar num deles mostra a respetiva dica.
Os jogadores com /em quest bypass ativo ignoram as permissões de todos os nós.
Voos dentro de masmorras instanciadas
Define world como o mundo do blueprint da masmorra. Um voo iniciado dentro de uma instância de masmorra voa pela cópia do mundo desse jogador. Usa como ponto de voo uma wormhole instanciada com uma secção flight, ou um NPC instanciado. Um passageiro que se desligue a meio do voo dentro de uma instância não é colocado no destino no início de sessão seguinte; aplicam-se as regras da própria masmorra para o regresso dos jogadores.