Ir para conteúdo

[NMS] Introdução - Packets


Out of Orbit

Posts Recomendados

1LDIudb.png

 

 

NMS é a abreviação do pacote net.minecraft.server. Neste pacote estão

as classes responsáveis pelo servidor e pela conexão entre o jogador e o servidor.

 

É possível fazer várias coisas utilizando NMS, como enviar packets para jogadores,

criar entidades customizadas, otimização no código, etc.

 

 

24yRsfS.png

 

 

Os packets são classes que contêm dados sobre o que está acontencendo

no servidor. É a partir dessas classes que o servidor sabe quando um jogador mata um porco.

 

Mas como você pode mandar seus próprios packets para um jogador?

Acessando este link você verá todos os packets disponíveis atualmente.

 

Irei dar um exemplo com o packet PacketPlayOutTitle,

que é usado para enviar títulos e subtítulos.

// A leitura pode ficar ficar um pouco comprometida com as barras invertidas:
// {"text": "Tutorial NMS"}
IChatBaseComponent titleText = ChatSerializer.a("{\"text\": \"Tutorial NMS\"}");

// Aqui estamos criando um novo packet, nota-se que esta classe tem vários construtores
// Parâmetros:
// EnumTitleAction - Tipo de título que será enviado (TITLE, SUBTITLE, etc)
// titleText - 
// 20 - Tempo que o título levará para aparecer (em ticks)
// 15 - Tempo que o título ficará na tela (em ticks)
// 10 - Tempo que o título levará para sumir completamente (em ticks)
PacketPlayOutTitle packet = new PacketPlayOutTitle(EnumTitleAction.TITLE, titleText, 20, 15, 10);

Packet criado, mas como enviar ele para o jogador?

Nós iremos utilizar o método CraftPlayer#getHandle();

 

CraftPlayer, é uma classe que implementa Player.

Esta classe funciona como um intermediador entre o Bukkit e o EntityPlayer(do NMS).

Então o que o método getHandle faz é retornar a classe EntityPlayer, desta maneira podemos

acessar diretamente o PlayerConnection(conexão do jogador com o servidor) e enviar o packet:

// Transformamos a classe player em EntityPlayer atráves
// do método getHandle()
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();

// Depois basta acessar o playerConnection e enviar o packet
entityPlayer.playerConnection.sendPacket(packet);

rhZD4ri.png

 

 

Apesar do NMS aparentar ser extremamente útil, existe um pequeno

problema que o torna um pouco inviável. A compatibilidade. O que isso quer dizer?

A cada versão do minecraft, o pacote do NMS é alterado:

net.minecraft.server.v1_8_R3 [1.8.8]

net.minecraft.server.v1_9_R2 [1.9.4]

 

Existe algumas maneiras de burlar esse problema de incompatibildade,

como utilizando reflection ou abstração. Mas eu não irei focar nisso por enquanto,

pois não é o objetivo desse tópico em questão.
 

 

wSELoRv.png

 

 

Este tutorial foi apenas para introduzir o NMS para aqueles que não conheciam.
Mais para frente eu irei fazer tutoriais mais avançados.

 

Vale lembrar que se você utiliza maven, para ter acesso às classes do NMS e do CraftBukkit

você terá que utilizar o BuildTools para trabalhar com as classes em seu repositório local.

Editado por Out of Orbit
Link para o comentário
Compartilhar em outros sites

 

1LDIudb.png

 

 

NMS é a abreviação do pacote net.minecraft.server. Neste pacote estão

as classes responsáveis pelo servidor e pela conexão entre o jogador e o servidor.

 

É possível fazer várias coisas utilizando NMS, como enviar packets para jogadores,

criar entidades customizadas, otimização no código, etc.

 

 

24yRsfS.png

 

 

Os packets são classes que contêm dados sobre o que está acontencendo

no servidor. É a partir dessas classes que o servidor sabe quando um jogador mata um porco.

 

Mas como você pode mandar seus próprios packets para um jogador?

Acessando este link você verá todos os packets disponíveis atualmente.

 

Irei dar um exemplo com o packet PacketPlayOutTitle,

que é usado para enviar títulos e subtítulos.

// A leitura pode ficar ficar um pouco comprometida com as barras invertidas:
// {"text": "Tutorial NMS"}
IChatBaseComponent titleText = ChatSerializer.a("{\"text\": \"Tutorial NMS\"}");

// Aqui estamos criando um novo packet, nota-se que esta classe tem vários construtores
// Parâmetros:
// EnumTitleAction - Tipo de título que será enviado (TITLE, SUBTITLE, etc)
// titleText - 
// 20 - Tempo que o título levará para aparecer (em ticks)
// 15 - Tempo que o título ficará na tela (em ticks)
// 10 - Tempo que o título levará para sumir completamente (em ticks)
PacketPlayOutTitle packet = new PacketPlayOutTitle(EnumTitleAction.TITLE, titleText, 20, 15, 10);

Packet criado, mas como enviar ele para o jogador?

Nós iremos utilizar o método CraftPlayer#getHandle();

 

CraftPlayer, é uma classe que implementa Player.

Esta classe funciona como um intermediador entre o Bukkit e o EntityPlayer(do NMS).

Então o que o método getHandle faz é retornar a classe EntityPlayer, desta maneira podemos

acessar diretamente o PlayerConnection(conexão do jogador com o servidor) e enviar o packet:

// Transformamos a classe player em EntityPlayer atráves
// do método getHandle()
EntityPlayer entityPlayer = ((CraftPlayer) player).getHandle();

// Depois basta acessar o playerConnection e enviar o packet
entityPlayer.playerConnection.sendPacket(packet);

rhZD4ri.png

 

 

Apesar do NMS aparentar ser extremamente útil, existe um pequeno

problema que o torna um pouco inviável. A compatibilidade. O que isso quer dizer?

A cada versão do minecraft, o pacote do NMS é alterado:

 

net.minecraft.server.v1_8_R3 [1.8.8]

net.minecraft.server.v1_9_R2 [1.9.4]

 

Existe algumas maneiras de burlar esse problema de incompatibildade,

como utilizando reflection ou abstração. Mas eu não irei focar nisso por enquanto,

pois não é o objetivo desse tópico em questão.

 

 

wSELoRv.png

 

 

Este tutorial foi apenas para introduzir o NMS para aqueles que não conheciam.

Mais para frente eu irei fazer tutoriais mais avançados.

 

Vale lembrar que se você utiliza maven, para ter acesso às classes do NMS e do CraftBukkit

você terá que utilizar o BuildTools para trabalhar com as classes em seu repositório local.

 

Realmente, belo tutorial.

Nunca gostei de mexer com Packets/Reflection... talvez por que nunca tenha entendido de forma correta, espero ansiosamente por mais tutoriais e que venham abranger Reflection e essa abstração, que eu não conhecia.

Link para o comentário
Compartilhar em outros sites

Realmente, belo tutorial.

Nunca gostei de mexer com Packets/Reflection... talvez por que nunca tenha entendido de forma correta, espero ansiosamente por mais tutoriais e que venham abranger Reflection e essa abstração, que eu não conhecia.

Obrigado, acho que o próximo tutorial será sobre reflections, mas não focando em NMS. Será um tutorial a parte, mas que é necessário para seguir o resto do tutorial, já que muitas vezes é preciso acessar atributos privados, etc

Link para o comentário
Compartilhar em outros sites

Obrigado, acho que o próximo tutorial será sobre reflections, mas não focando em NMS. Será um tutorial a parte, mas que é necessário para seguir o resto do tutorial, já que muitas vezes é preciso acessar atributos privados, etc

Tem alguma ideia de quando deve sair?

Link para o comentário
Compartilhar em outros sites

Eu acho que se aprofundar tanto assim em Java ou em uma API não vale muito apena (posso estar errado)... É claro se você for fazer plugins isso sera maravilhoso mas para a careira profissional não sei se vale a pena se aprofundar tanto assim no Bukkit API... eu admiro muito essas pessoas que manjam de Reflection e NMS pois isso não é algo tão facil assim quando comparado com a BukkitAPI...

 

Parabéns pelo tópico gostei muito, se eu não estivesse fazendo faculdade eu acho que focaria em aprender NMS e Reflection de cabo a rabo pra fazer varias coisas que não se pode fazer com o BukkitAPI, mas em fim...

 

Continue ajudando a comunidade e boa sorte!

Link para o comentário
Compartilhar em outros sites

Eu acho que se aprofundar tanto assim em Java ou em uma API não vale muito apena (posso estar errado)... É claro se você for fazer plugins isso sera maravilhoso mas para a careira profissional não sei se vale a pena se aprofundar tanto assim no Bukkit API... eu admiro muito essas pessoas que manjam de Reflection e NMS pois isso não é algo tão facil assim quando comparado com a BukkitAPI...

 

Parabéns pelo tópico gostei muito, se eu não estivesse fazendo faculdade eu acho que focaria em aprender NMS e Reflection de cabo a rabo pra fazer varias coisas que não se pode fazer com o BukkitAPI, mas em fim...

 

Continue ajudando a comunidade e boa sorte!

Sim, de fato não é muito vantajoso se apronfudar na API do Bukkit visando a carreira profissional.

 

Mas eu não pretendo seguir uma carregueira em ciência da programação, eu programo mais por diversão mesmo. Obrigado.

Link para o comentário
Compartilhar em outros sites

Sim, de fato não é muito vantajoso se apronfudar na API do Bukkit visando a carreira profissional.

 

Mas eu não pretendo seguir uma carregueira em ciência da programação, eu programo mais por diversão mesmo. Obrigado.

Pretende seguir em qual carreira?

Link para o comentário
Compartilhar em outros sites

Participe da Conversa

Você pode postar agora e se cadastrar mais tarde. Se você tiver uma conta, a class='ipsType_brandedLink' href='https://gamersboard.com.br/login/' data-ipsDialog data-ipsDialog-size='medium' data-ipsDialog-title='Sign In Now'>acesse agora para postar com sua conta.
Observação: sua postagem exigirá aprovação do moderador antes de ficar visível.

Visitante
Responder

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.

Processando...
×
×
  • Criar Novo...