Escolar Documentos
Profissional Documentos
Cultura Documentos
com
bukkit
#bukkit
Índice
Sobre 1
Observações 2
Versões 2
Exemplos 3
Criando um plug-in 3
Pré-requisitos 3
Classe Principal 3
Criando um plugin.yml 5
BuildTools 6
O que é? 6
Pré-requisitos 6
janelas 6
git 6
Java 6
Linux 6
Mac 6
Executando BuildTools 7
Capítulo 2: Comandos 8
Sintaxe 8
Exemplos 8
Manipulando um Comando 8
Sintaxe 11
Observações 11
Exemplos 11
Plugin Config.yml 11
Capítulo 4: Entidades 13
Exemplos 13
Tipo de entidade 14
Passageiro 17
Entidades Próximas 18
Introdução 19
Exemplos 19
Evento EntityDamage 19
EntityDamageEvent 19
EntityDamageByEntityEvent 19
EntityDamageByBlockEvent 20
EntityEvent (Superclasse) 20
Introdução 22
Sintaxe 22
Observações 22
Exemplos 22
Ouvindo eventos 23
Registrando Eventos 24
Registrando Eventos 27
Prioridades do evento 27
Capítulo 7: Caindo 29
Observações 29
Exemplos 29
Cancelando Dano 29
Sintaxe 30
Observações 30
Exemplos 30
Capítulo 9: Log 32
Exemplos 32
Níveis de registro 32
Sintaxe 34
Exemplos 34
Conquistas de premiação 34
Introdução 36
Observações 36
Exemplos 36
Introdução 39
Exemplos 39
PlayerJoinEvent 39
PlayerMoveListener 39
PlayerLoginEvent 39
Introdução 42
Exemplos 42
Sintaxe 44
Observações 44
Exemplos 44
Executando um BukkitRunnable 45
Observações 47
Exemplos 47
Exemplos 48
Exemplos 49
Gerador de Vazio 49
Observações 50
Exemplos 50
Criando Explosões 50
Soltando um item 50
Regras de desova 52
Créditos 54
Sobre
Você pode compartilhar este PDF com qualquer pessoa que sinta que pode se beneficiar dele, baixando a versão mais recente
de:bukkit
É um e-book bukkit não oficial e gratuito criado para fins educacionais. Todo o conteúdo é extraído
deDocumentação de Estouro de Pilha, que é escrito por muitos indivíduos esforçados no Stack
Overflow. Não é afiliado ao Stack Overflow nem ao bukkit oficial.
O conteúdo é distribuído sob o Creative Commons BY-SA, e a lista de colaboradores para cada capítulo é fornecida na
seção de créditos no final deste livro. As imagens podem ter direitos autorais de seus respectivos proprietários, a menos
que especificado de outra forma. Todas as marcas comerciais e marcas registradas são de propriedade de seus
respectivos proprietários de empresas.
Use o conteúdo apresentado neste livro por sua conta e risco; não é garantido que esteja correto
nem preciso, envie seus comentários e correções parainfo@zzzprojects.com
https://riptutorial.com/ 1
Capítulo 1: Começando com o bukkit
Observações
Bukkit é uma API simples que permite modificar a experiência multijogador normal do Minecraft usando plug-
ins.
Bukkit foi descontinuado, e não está mais disponível para versões mais recentes do Minecraft.Spigot, uma
versão do Bukkit que melhora o desempenho do servidorestá disponível. A API do Spigot é essencialmente
a mesma do Bukkit.
Versões
1.7.8 -- 2014-04-11
https://riptutorial.com/ 2
Versão do Minecraft Link para Download do Spigot Data de lançamento
1.4.6 -- 20/12/2012
Exemplos
Criando um plug-in
Pré-requisitos
• JDK 7 ou superior (recomendado: JDK 8+)
O método mais simples para adicionar a API do Bukkit ao seu projeto é baixar o Bukkit.jar diretamente do
Repositório Spigote adicione-o ao classpath do seu projeto. As versões legadas do Bukkit podem ser
encontradas noRepositório Bukkit.
A outra é adicioná-lo como uma dependência do Maven, adicionando as seguintes linhas ao seupom.xml:
<repositórios>
<repositório>
<id>spigot-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url> </repository>
</repositórios>
<dependências>
<!--API do Bukkit-->
<dependência>
<groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId>
<version>{VERSION}</version>
<scope>fornecido</scope>
</dependência>
</dependencies>
https://riptutorial.com/ 3
Classe Principal
A classe principal do plug-in é o ponto de entrada para o Bukkit carregar e interagir com seu plug-in. É uma
classe que se estendeJavaPlugine apenas uma instância dele deve ser criada pelo seu plugin. Por convenção, é
bom dar a esta classe o mesmo nome do seu plugin.
Aqui está um exemplo de uma classe de plugin principal para o plugin "MyPlugin":
import org.bukkit.plugin.java.JavaPlugin;
@Sobrepor
public void onEnable() {
//Chamado quando o plug-in está ativado
getLogger().info("onEnable foi invocado!");
}
@Sobrepor
public void onDisable() {
//Chamado quando o plug-in está desabilitado
getLogger().info("onDisable foi invocado!");
}
Para acessar sua instância de plug-in de outra classe, você precisará armazenar a instância de sua
classe MyPlugin criada pelo Bukkit para que seja acessível de fora da classe.
instância MyPlugin estática privada; //Efetivamente variável final contendo a instância do seu plugin
public MyPlugin(){
if(MyPlugin.instance != null) { //Verificação desnecessária, mas garante que seu plug-in seja inicializado apenas
uma vez.
throw new Error("Plugin já inicializado!");
}
MyPlugin.instance = this; //O construtor de um plugin só deve ser chamado uma vez
}
Então, para acessar sua classe principal de outra classe, basta usarMeuPlugin.getInstance()
https://riptutorial.com/ 4
public class MinhaOutraClasse {
Criando um plugin.yml
O arquivo plugin.yml vai na raiz do seu arquivo jar final e fornece informações essenciais para o Bukkit
carregar seu plugin. O plugin.yml mais simples se parece com isso
nome: MyPlugin
main: com.example.myplugin.MyPlugin versão:
1.0
Para poder criar um servidor, você precisa ter o spigot ou o arquivo bukkit jar. Reefer para o tópico de
versõespara selecionar sua jarra
1. Primeiro, crie uma nova pasta. Nessa pasta, coloque o arquivo jar spigot/bukkit.
2. Clique com o botão direito do mouse na pasta e escolha Novo > Documento de texto.
3. Nomeie o novo documento como start.bat, clique com o botão direito nele e clique em Editar.
@echo desligado
Não se esqueça de alterar {YOUR_JAR.jar} para o jar que você baixou antes de iniciar estes tópicos.
5. Você pode editar-Xmspara alterar a RAM mínima permitida (Ex: -Xms1024M = 1024MB, - Xms1G =
1GB). Você também pode editar-Xmxpara alterar a RAM máxima permitida. Certifique-se de que o
máximo é maior que o mínimo.
6. Salve o arquivo, feche a janela e inicie seustart.batarquivo. Seu servidor agora deve abrir. Para
executar o servidor, você deve aceitar oEULA.
7. Se você concorda com oEULA, abrireula.txtmudareula=falsoparaeula=verdadeiroClique em "Salvar"
e agora você poderá iniciar seu servidor.
8. Para se conectar ao seu servidor, execute ostart.bat, abra o Minecraft, adicione um servidor e coloquehost local
https://riptutorial.com/ 5
como IP.
BuildTools
O que é?
BuildTools.jar é uma solução para construir Bukkit, CraftBukkit, Spigot e Spigot-API. Tudo isso é feito no
seu computador! Alguns programas de pré-requisito são necessários, mas as instruções abaixo irão
guiá-lo em tudo o que você precisa fazer.
Pré-requisitos
Existem dois aplicativos necessários para usar o BuildTools: Git e Java.
janelas
git
Para que o BuildTools seja executado no Windows, você precisará instalar o Git. Para Windows é distribuído via
git-scm, que pode ser baixadoaqui. Instale-o onde quiser, ele fornecerá git bash, que será usado para executar
o jar BuildTools. Continue pressionando próximo ao executar o instalador.
Java
Baixe o JRE 8 emaquie instale. Continue pressionando próximo ao executar o instalador.
Linux
Tanto o git quanto o Java, bem como os comandos util, podem ser instalados usando um único comando por meio do
gerenciador de pacotes.
Mac
O Git pode ser baixado em:http://sourceforge.net/projects/git-osx-installer/files/
https://riptutorial.com/ 6
O Java pode precisar ser atualizado a partir da versão distribuída da Apple e, mesmo se atualizado anteriormente, pode precisar
ser vinculado para uso do shell. Por favor, siga os passos encontrados aqui:
https://gist.github.com/johan/10590467
Executando BuildTools
1. Baixe BuildTools.jar de https://hub.spigotmc.org/jenkins/job/BuildTools/lastSuccessfulBuild/
artifact/target/BuildTools.jar
.
1. Git bash pode ser encontrado na área de trabalho ou no menu Iniciar sob o nome "git bash". Também é possível
abri-lo clicando com o botão direito do mouse em qualquer coisa, pois agora é um item em seu menu de
contexto.
3. Navegue até onde você baixou BuildTools.jar ou use a linha de comando para fazer
download do jar para seu diretório atual.
1. No Windows, você pode usar o comando cd para alterar os diretórios ou clicar com o botão
direito do mouse no espaço em branco da pasta onde BuildTools.jar está (NÃO clique em
BuildTools.jar em si) e clique em "git bash", que irá abra-o em seu diretório atual.
4. Execute BuildTools.jar a partir do terminal (não clique duas vezes em BuildTools.jar) fazendo o
seguinte:
1. No Linux, execute git config --global --unset core.autocrlf e execute java -jar BuildTools.jar no bash
ou em outro shell apropriado.
2. No Windows, execute o comando abaixo dentro da janela do git bash que se abriu: java -jar
BuildTools.jar Esteja ciente de que é necessário ter o BuildTools #35 ou posterior, versões mais
antigas não funcionarão.
3. No Mac, execute os comandos abaixo, export MAVEN_OPTS="-Xmx2G" java -Xmx2G -jar
BuildTools.jar
4. Se precisar de uma versão mais antiga, você pode especificar a versão usando o argumento --rev
para BuildTools, por exemplo para 1.8.8: java -jar BuildTools.jar --rev 1.8.8
5. Espere enquanto ele constrói seus frascos. Em alguns minutos, você deve ter jars recém-compilados!
6. Você pode encontrar CraftBukkit e Spigot no mesmo diretório em que executou o BuildTools.jar
(para minecraft versão 1.10, eles seriam craftbukkit-1.10.jar e spigot-1.10.jar). Você pode
encontrar Spigot-API em \Spigot\Spigot-API\target\ (para minecraft versão 1.10, seria
spigotapi-1.10-R0.1-SNAPSHOT.jar).
https://riptutorial.com/ 7
Capítulo 2: Comandos
Sintaxe
• @Substituir public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
Exemplos
Manipulando um Comando
Para manipular um comando, você deve ter uma classe que implemente a interface CommandExecutor.
A classe JavaPlugin (a classe principal do seu plugin) já implementa isso.
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) { //Trate seu comando
aqui
retornar verdadeiro; ///Deve retornar false se você quiser mostrar o uso
CMD é o comando que você está ouvindo, conforme declarado em plugin.yml. Não confundir com rótulo.
label é o alias usado para executar este comando, é o que o remetente digita após a barra.
e, finalmente, args são os argumentos que o remetente pode ter usado para enviar seu comando.
Tell seria seu rótulo e também pode ser definido como seu comando se você disser isso em plugin.yml;
Como retorno, você provavelmente sempre desejará retornar true quando esperava que tudo acontecesse
dessa maneira. Você deve retornar false se quiser mostrar ao remetente o uso do comando definido em seu
plugin.yml
Este exemplo mostra um exemplo muito básico de como utilizar onCommand. Não sugiro
processar seus comandos diretamente no onCommand, mas isso resolve esse caso simples.
https://riptutorial.com/ 8
A primeira coisa que precisamos fazer é garantir que o remetente não seja um ConsoleCommandSender, porque
não podemos definir o modo de jogo de um console. Isso é feito com (instância do remetente do Player).
Em seguida, queremos que o jogador digite /gm CREATIVE (ou qualquer outro modo de jogo), então temos que verificar
2 coisas:
A próxima coisa que precisamos fazer é transformar args[0] em um objeto GameMode para que possamos aplicá-lo
ao jogador. Isso pode ser feito com GameMode.valueOf(String) No entanto, de acordo com a documentação de
enumeração Java, se uma string for passada para valueOf() que não corresponder a uma enumeração, ela lançará
um IllegalArgumentException - portanto, temos que garantir pegar isso.
Assim que tivermos o modo de jogo, podemos simplesmente usar p.setGameMode(gm) e o modo de jogo
do jogador mudará. No caso de detectarmos uma exceção - simplesmente imprimimos uma instrução e
retornamos false.
@Sobrepor
public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
if (instância do remetente do Player) {
final Jogador p = (Jogador) remetente;
}
}
retorna falso;
}
Se você tiver muitos comandos, não deve colocá-los todos na classe principal.
@Sobrepor
https://riptutorial.com/ 9
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
{
getCommand("commandName").setExecutor(new CommandExecutor());
https://riptutorial.com/ 10
Capítulo 3: Arquivos de configuração
Sintaxe
• String s = config.getString("path.to.string");
• int i = config.getInt("path.to.int");
• double d = config.getDouble("path.to.double");
• List<String> sl = config.getStringList("path.to.stringlist");
• List<Double> dl = config.getDoubleList("path.to.doublelist");
• List<Integer> il = config.getIntegerList("path.to.integerlist");
Observações
Os arquivos de configuração do Bukkit são arquivos YAML (Yet Another Markup Language) diretos e são
implementados dessa forma.
Exemplos
Plugin Config.yml
Você pode ter um arquivo config.yml que carrega diretamente de seu arquivo jar. Ele deve ser adicionado à pasta
do seu projeto, da mesma forma que o arquivo plugin.yml.
Exemplo de configuração:
Para carregar o arquivo de configuração padrão para a pasta do seu plugin, o seguinte código deve ser adicionado ao
seu onEnable():
salvarDefaultConfig();
Isso fará com que o arquivo config.yml do projeto seja o arquivo de configuração do plug-in e o
adicionará à pasta do plug-in.
A partir daí, você pode acessar seu arquivo de configuração de qualquer lugar, usando sua instância de plugin:
https://riptutorial.com/ 11
A partir daí, podemos acessar qualquer coisa que foi definida no config do plugin.
Nota: O arquivo de configuração padrão pode ter seus valores alterados, caso o usuário queira editar o arquivo
config.yml gerado para a pasta.
O que pode acontecer no seu arquivo de configuração é ter um caminho para uma variável que passa por várias
seções.
Configuração de exemplo
administradores:
O nome "Kerooker" vem da seção "first-tier", que vem da seção "admins". Para acessar os caminhos internos do
nosso arquivo, usamos um simples '.' como uma forma de dizer que queremos a próxima seção. Então, para
acessarmos o "Kerooker", vamos:
config.getString("admins.first-tier");
https://riptutorial.com/ 12
Capítulo 4: Entidades
Exemplos
if(sucesso) {
//O teletransporte foi bem-
sucedido }else {
//Teleporte não foi bem sucedido }
Você também pode adicionar uma causa ao seu teletransporte, para poder personalizar como sua causa será tratada
pelo seu plugin ou por outros:
if(sucesso) {
//O teletransporte foi bem-
sucedido }else {
//Teleporte não foi bem sucedido }
if(sucesso) {
//O teletransporte foi bem-
sucedido }else {
//O teletransporte não foi bem sucedido
}
Você também pode adicionar uma causa ao seu teletransporte, para poder personalizar como sua causa será tratada
pelo seu plugin ou por outros:
https://riptutorial.com/ 13
PlayerTeleportEvent.TeleportCause causa; //A causa que você quer que seja o teletransporte
if(sucesso) {
//O teletransporte foi bem-
sucedido }else {
//O teletransporte não foi bem sucedido
}
Tipo de entidade
Valor Descrição
AREA_EFFECT_CLOUD N/D
BASTÃO N/D
CHAMA N/D
FRANGO N/D
COMPLEX_PARTE N/D
VACA N/D
RASTEJADOR N/D
ENDER_CRYSTAL N/D
ENDER_DRAGON N/D
https://riptutorial.com/ 14
Valor Descrição
ENDERMAN N/D
ENDERMITE N/D
BOLA FOGO Uma grande bola de fogo voadora, lançada por um Ghast, por exemplo.
GAST N/D
GIGANTE N/D
GUARDIÃO N/D
CAVALO N/D
RAIO Um raio.
MINECART N/D
MINECART_CHEST N/D
MINECART_COMMAND N/D
MINECART_FURNACE N/D
MINECART_HOPPER N/D
MINECART_MOB_SPAWNER N/D
https://riptutorial.com/ 15
Valor Descrição
MINECART_TNT N/D
COGUMELO_COW N/D
JAGUATIRICA N/D
PORCO N/D
PIG_ZOMBIE N/D
JOGADOR N/D
COELHO N/D
OVELHA N/D
SHULKER N/D
SILVERFISH N/D
ESQUELETO N/D
SLIME N/D
SMALL_FIREBALL Uma pequena bola de fogo voadora, como a lançada por um Blaze ou jogador.
ARANHA N/D
LULA N/D
https://riptutorial.com/ 16
Valor Descrição
aplicado em contato.
ALDEÃO N/D
CLIMA N/D
BRUXA N/D
MURCHAR N/D
LOBO N/D
ZUMBI N/D
Passageiro
As entidades podem ter passageiros. Um bom exemplo de passageiro é um jogador montado em um porco selado ou um zumbi
dentro de um carrinho de mina.
Embora existam veículos específicos, qualquer entidade pode ser veículo de qualquer outra entidade com o
método SetPassenger.
Veículo da entidade;
Passageiro da entidade;
resultado booleano = veículo.setPassageiro(passageiro); razão //False se não puder ser feito por qualquer coisa
https://riptutorial.com/ 17
boolean b = entity.eject(); ser ejetado //Ejetar todos os passageiros - retorna verdadeiro se houver um passageiro
Entidades Próximas
Para recuperar uma lista de entidades próximas de uma entidade, pode-se usar
O Bukkit irá então calcular uma caixa delimitadora centrada na entidade, tendo como parâmetros:
A lista pode estar vazia, significando que não há entidades próximas com os parâmetros.
Essa abordagem pode ser usada para detectar entidades próximas a projéteis personalizados, por exemplo, lançar um
Itemstack e detectar quando ele colide com um jogador
https://riptutorial.com/ 18
Capítulo 5: Eventos de Entidade
Introdução
Todos os eventos de entidade estendem EntityEvent, a superclasse para EntityEvents.
Todos os EntityEvents conhecidos podem ser encontrados abaixo e serão abordados nesta documentação.
Exemplos
Evento EntityDamage
EntityDamageEvent
@EventHandler
public void onEntityDamage(EntityDamageEvent e) {
CausaDanoscausa = e.getCause(); double //Pega o evento DamageCause
rawDamage = e.getDamage(); //Retorna o dano antes de qualquer cálculo
double damageModified = e.getDamage(DamageModifier.X); ser causado //Retorna o dano que causaria
com o modificador especificado
double finalDamage = e.getFinalDamage(); todos os //Recebe o dano final deste evento, com
cálculos incluídos
e.setCancelled(boolean x); //Se por algum motivo você quiser que o evento não aconteça, você
pode cancelá-lo
e.setDamage(dano duplo); //Você pode alterar o dano total que o evento causará
e.setDamage(modificador DamageModifier, dano duplo); //Altera o dano considerando
qualquer modificador possível
}
Na maioria das vezes, o EntityDamageEvent não será usado. Em vez disso, uma de suas subclasses será usada,
comoEntityDamageByEntityEventouEntityDamageByBlockEvent. Ambos podem ser vistos abaixo.
EntityDamageByEntityEvent
@EventHandler
public void onEntityDamageByEntity(EntityDamageByEntityEvent e) {
//Recuperando a Entidade que causou dano Entity
damageDealer = e.getDamager();
https://riptutorial.com/ 19
CausaDanoscausa = e.getDamageCause();
//dano é o dobro do valor do dano antes de todas as resistências e modificadores terem sido aplicados
//FinalDamage é o dobro do valor do dano após todas as resistências e modificadores terem sido aplicados
//Você também pode definir o dano bruto (antes dos modificadores) para o evento com um valor diferente
e.setDamage(20.0);
}
EntityDamageByBlockEvent
EntityEvent (Superclasse)
https://riptutorial.com/ 20
Leia os Eventos da Entidade online:https://riptutorial.com/bukkit/topic/6486/entity-events
https://riptutorial.com/ 21
Capítulo 6: Tratamento de eventos
Introdução
Quando algo acontece dentro do Bukkit, um evento é chamado para que cada plugin possa decidir o que
fazer sempre que algo acontecer.
Um evento é chamado quando um jogador tenta jogar um bloco, quando uma entidade desaparece, quando alguém faz login...
Os plug-ins podem ouvir eventos específicos e lidar com eles de várias maneiras diferentes, por exemplo, enviando uma
mensagem para um administrador quando um Player efetua login, por meio do PlayerLoginEvent.
Sintaxe
Observações
Ao registrar um evento, verifique se você não está registrando duas vezes! Ou seu plugin irá agir duas vezes
para o evento registrado.
• Eventos do Jogador
• Eventos de Entidade
Exemplos
/**
* Construtor
*/
public MyEventListener(Plugin principal){
//registra eventos desta classe
//com método: registerEvents(Listener, Plugin);
plugin.getServer().getPluginManager().registerEvents(this, plugin);
}
/**
* Um evento com ALTA prioridade
*/
https://riptutorial.com/ 22
@EventHandler(priority = EventPriority.HIGH) //Uma anotação EventHandler public void
onPlayerLogin(PlayerLoginEvent event){ //Um evento bukkit
event.getPlayer().sendMessage("Bem-vindo.");
}
/**
* Um evento com prioridade NORMAL (padrão)
*/
@EventHandler
public void onPlayerQuit(evento PlayerQuitEvent){
Bukkit.broadcastMessage(event.getPlayer().getName() + " saiu do servidor.");
}
/**
* Classe principal
*/
public class Principal estende JavaPlugin {
public void onEnable(){
// Registra eventos
novo MyEventListener(este);
}
}
@Sobrepor
public void onEnable() {
Bukkit.getPluginManager().registerEvents(este, este);
}
@EventHandler
public void yourEvent(Event e) { //...
}
}
Ouvindo eventos
O Bukkit usa um sistema baseado em eventos que permite aos desenvolvedores de plugins interagir e modificar o
servidor e ações específicas que ocorrem no mundo.
Manipuladores de eventos são métodos que são chamados quando o evento ocorre. Eles são geralmente públicos e vazios,
bem como nomeadosem{EventNameStem}por convenção. Todos os manipuladores, no entanto, devem ter o
@EventHandleranotação, bem como conter seu evento como o parâmetro ONLY. Aqui está um exemplo de um
manipulador de eventos para oPlayerJoinEvent
https://riptutorial.com/ 23
@EventHandler
public void onPlayerJoin(evento PlayerJoinEvent){
// Executa quando um jogador entra
}
Registrando Eventos
Apenas criar um manipulador de eventos não é suficiente para permitir que o Bukkit comece a enviar chamadas de eventos para
o seu método. Você também deve registrá-lo através da interface do PluginManager.
A maneira mais comum de registrar eventos é criar uma classe que implemente a interface Listener e usá-
la para agrupar seus manipuladores de eventos.
@EventHandler
public void onPlayerJoin(evento PlayerJoinEvent){
// Executa quando um jogador entra
}
Esta classe de ouvinte e todos os seus eventos podem ser registrados em sua classe de plugin principal assim:
@Sobrepor
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Registra seu ouvinte e seus manipuladores
de eventos
}
Às vezes você precisa criar seu próprio evento, um que outros plugins possam ouvir (o Vault, entre outros plugins,
faz isso) e até cancelar. A API de eventos do Bukkit permite que isso seja possível. Tudo o que você precisa fazer é
criar uma nova classe, estendê-laEvento, adicione os manipuladores e os atributos de que seu evento precisa (como
Player ou mensagem).
https://riptutorial.com/ 24
mensagem = exemplo;
}
Você está no controle de criar e chamar seus eventos, onde você os chama depende totalmente de você. Aqui
está um exemplo
Lembre-se: você está no controle de seus eventos. Se você não chamar e agir de acordo com isso, não acontecerá!
@EventHandler
public void onCustomEvent(CustomEvent event) { // Algum
código aqui
}
}
https://riptutorial.com/ 25
import org.bukkit.event.Event; import
org.bukkit.event.HandlerList; import
org.bukkit.event.Cancellable;
O Bukkit usa um sistema baseado em eventos que permite aos desenvolvedores de plugins interagir e modificar o
servidor e ações específicas que ocorrem no mundo.
Manipuladores de eventos são métodos que são chamados quando o evento ocorre. Geralmente são públicos e
https://riptutorial.com/ 26
vazio, bem como nomeadoem{EventNameStem}por convenção. Todos os manipuladores, no entanto, devem ter o
@EventHandleranotação, bem como conter seu evento como o parâmetro ONLY. Aqui está um exemplo de um
manipulador de eventos para oPlayerJoinEvent
@EventHandler
public void onPlayerJoin(evento PlayerJoinEvent){
// Executa quando um jogador entra
}
Registrando Eventos
Apenas criar um manipulador de eventos não é suficiente para permitir que o Bukkit comece a enviar chamadas de eventos para
o seu método. Você também deve registrá-lo através da interface do PluginManager.
A maneira mais comum de registrar eventos é criar uma classe que implemente a interface Listener e usá-
la para agrupar seus manipuladores de eventos.
@EventHandler
public void onPlayerJoin(evento PlayerJoinEvent){
// Executa quando um jogador entra
}
Esta classe de ouvinte e todos os seus eventos podem ser registrados em sua classe de plugin principal assim:
@Sobrepor
public void onEnable(){
Bukkit.getPluginManager().registerEvents(new EventListener(), this); //Registra seu ouvinte e seus manipuladores
de eventos
}
Prioridades do evento
Bukkit tem um sistema chamadoPrioridades do eventopara ajudar os plug-ins a lidar com eventos no formato antigo correto. As sete
prioridades são (em mais antigo do primeiro executado ao último):
• Mais baixo
• Baixo
• Normal (padrão)
• Alto
https://riptutorial.com/ 27
• Altíssima
• Monitor
Se você planeja cancelar muitos eventos (por exemplo, plug-in de proteção), seria uma boa ideia usar prioridade
mais baixa (ou mais baixa) para evitar problemas.
Mais informações:
https://riptutorial.com/ 28
Capítulo 7: Caindo
Observações
Atualmente, não há nenhuma maneira consistente de evitar que uma entidade sofra gravidade, mesmo se você cancelar
seu movimento, o lado do cliente do jogador ainda tentará cair antes que o evento seja cancelado.
Exemplos
A distância de queda da entidade é a distância que a entidade caiu sem atingir um bloco.
Pode ser usado para calcular diferentes danos de queda ou ativar um efeito após uma grande queda.
Isso pode ser usado para simular uma distância de queda diferente da real. O Bukkit calculará o dano
usando a nova distância de queda.
entidade.setFallingDistance(distância flutuante);
Cancelando Dano
@EventHandler
public void onEntityDamage(EntityDamageEvent e) { Entidade
levouDamage = e.getEntity();
CausaDanoscausa = e.getCause();
if (cause == DamageCause.FALL){
//O dano foi causado pela queda, cancele-o
e.setCancelled(true);
}
https://riptutorial.com/ 29
Capítulo 8: Escondendo Jogadores
Sintaxe
Observações
Exemplos
Player playerToHide;
Player playerToNotSee;
playerToNotSee.hide(playerToHide);
//playerToHide não será mais visto por playerToNotSee.
toSeeAgain.show(toUnhide);
//Player toSeeAgain agora verá Player toUnhide novamente.
Player playerToCheck;
Player playerSeeing;
https://riptutorial.com/ 30
As entidades não terão como alvo o jogador se você cancelar o evento:
@EventHandler
public void onEntityTarget(EntityTargetEvent e) {
Entidade alvo = e.getEntity(); if(instância
de destino do Player) {
Jogador jogadorTargetted = (Jogador) alvo; if
(shouldBeInvisible(playertargetted) {
e.setCancelado(verdadeiro); //Cancela o evento de destino
}
}
}
https://riptutorial.com/ 31
Capítulo 9: Log
Exemplos
Níveis de registro
• CONFIG
• MULTAR
• MAIS FINO
• MELHOR(menor valor)
O nível padrão éINFORMAÇÕES(mas isso depende do sistema e usou uma máquina virtual).
Observação: Existem também níveisDESLIGADO(pode ser usado para desativar o logon) eTODOS(o oposto deDESLIGADO).
https://riptutorial.com/ 32
importar java.util.logging.Logger;
Por padrão, a execução desta classe produzirá apenas mensagens com nível superior aCONFIG:
https://riptutorial.com/ 33
Capítulo 10: Manipulando Conquistas
Sintaxe
• player.awardAchievement(Achievement ach);
Exemplos
Conquistas de premiação
Jogador jogador; //O jogador com o qual você deseja premiar sua conquista
Realização de realização; //A conquista que você deseja conceder ao seu jogador
Jogador jogador;
Realização de realização;
boolean hasAchievement = jogador.hasAchievement(conquista);
https://riptutorial.com/ 34
• GHAST_RETURN (Devolver ao remetente)
• KILL_COW (Tipper de vacas)
• KILL_ENEMY (Caçador de Monstros)
• KILL_WITHER (O Começo.)
• MAKE_BREAD (assar pão)
• MINE_WOOD (obtendo madeira)
• NETHER_PORTAL (Precisamos ir mais fundo)
• ON_A_RAIL (em um trilho)
• OPEN_INVENTORY (Fazendo Inventário)
• OVERKILL (Exagero)
• OVERPOWERED (Superpotente)
• SNIPE_SKELETON (Duelo de Sniper)
• SPAWN_WITHER (O Começo?)
• THE_END (Fim.)
Referência
https://riptutorial.com/ 35
Capítulo 11: NMS
Introdução
NMS, também conhecido comoNet.M.Server é o pacote que contém o código central do servidor
Minecraft. As classes neste pacote foram feitas por Mojang (não Bukkit) e, portanto, são ofuscadas e
não devem ser usadas ou alteradas. No entanto, interagir com o código do servidor Minecraft neste
nível permite que você modifique quase todos os aspectos dele. Isso é significativo porque existem
inúmeras modificações que o Bukkit não suporta.
Observações
A API Bukkit é um wrapper ou camada de abstração para NMS que permite aos desenvolvedores de plug-in
interagir com o servidor sem se preocupar com as alterações feitas na base de código interna.
O uso do código NMS é desencorajado, pois ele quebra frequentemente entre as alterações de versão do
Minecraft e não pode ser suportado pelo Bukkit ou Spigot, pois eles não o criam, possuem ou mantêm.
Exemplos
Uma das partes mais críticas ao lidar com o código NMS é ser capaz de oferecer suporte a várias versões do
Minecraft. Existem várias maneiras de fazer isso, mas uma solução simples é usar esse código para armazenar a
versão como um campo estático público:
org.bukkit.craftbukkit.VERSION.CraftServer.class
org.bukkit.craftbukkit.VERSION
E pegando a substring do nome do pacote começando no índice 23 que sempre estará depois de
'org.bukkit.craftbukkit.' (que tem um comprimento de 23 caracteres). Resultando na string VERSION
final:
VERSÃO
Existem várias razões pelas quais é tão importante poder acessar a versão atual do Minecraft. Principalmente
porque qualquer acesso a uma classe em um servidor executando uma versão do Minecraft diferente daquela com a
qual o plug-in estava codificando gerará um erro.
https://riptutorial.com/ 36
Aqui está um exemplo que demonstra como resolver esse problema usando oNMS_VERSIONcampo para recuperar
uma instância do CraftPlayer (que é uma classe NMS) em qualquer versão do Minecraft.
/**
* Invoca o método getHandle() na instância CraftPlayer do jogador para
* recupera a representação EntityPlayer do jogador como um objeto para
* evitar problemas de alteração de versão do pacote
*
* @param jogador
* o jogador para lançar
* @return a representação NMS EnityPlayer do jogador
*/
public static Object getCraftPlayer(Player player) {
tentar {
return Class.forName("org.bukkit.craftbukkit." + NMS_VERSION + ".entity.CraftPlayer")
. getMethod("getHandle")
. invocar(jogador);
} catch (IllegalAccessException | IllegalArgumentException | InvocationTargetException | NoSuchMethodException |
SecurityException | ClassNotFoundException e) {
lançar novo Error(e);
}
}
O objeto resultante pode então ser manipulado usando reflexão para executar tarefas baseadas em NMS sem
se preocupar em tentar acessar a versão errada da classe.
No entanto, mesmo esse método não é infalível, pois os nomes de campo e método do NMS mudam facilmente, portanto, a única
coisa que você garante ao fazer isso é que seu código definitivamente não será interrompido toda vez que o Minecraft for
atualizado.
Uma coisa muito simples que você pode querer fazer com o NMS que o Bukkit não suporta é obter o ping
do player. Isso pode ser feito assim:
/**
* Obtém o ping dos jogadores usando NMS para acessar o campo 'ping' interno em
* EntityPlayer
*
* @param jogador
* o jogador cujo ping para obter
* @return o ping do jogador
*/
public static int getPing(Player player) {
EntityPlayer entityPlayer = ((CraftPlayer) jogador).getHandle(); return
entityPlayer.ping;
}
Se você estiver usando um método como getCraftPlayer(Player), que retorna uma instância da instância
CraftPlayer correspondente do Player como um Object. Você pode acessar os dados sem importar as classes
dependentes da versão usando reflexão como esta:
/**
* Obtém o ping do jogador usando reflexão para evitar quebrar em um Minecraft
https://riptutorial.com/ 37
* atualizar
*
* @param jogador
* o jogador cujo ping para obter
* @return o ping do jogador
*/
public static int getPing(Player player) {
tentar {
Objeto craftPlayer = getCraftPlayer(jogador);
return (int) craftPlayer.getClass().getField("ping").get(craftPlayer);
} catch (IllegalArgumentException | IllegalAccessException | NoSuchFieldException | SecurityException e) {
https://riptutorial.com/ 38
Capítulo 12: Eventos do jogador
Introdução
Esta é uma lista de eventos do jogador e um exemplo de como usá-los.
Exemplos
PlayerJoinEvent
PlayerMoveListener
PlayerLoginEvent
https://riptutorial.com/ 39
@EventHandler
public void onPlayerLogin(PlayerLoginEvent e) {
PlayertryToLogin = e.getPlayer();
//Obtendo o IP do jogador
String ip = e.getAddress();
PlayerLoginEvent.Result ENUM:
@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e) {
Jogador digitado = e.getPlayer();
https://riptutorial.com/ 40
Evento disparado quando o jogador sai da cama:JogadorCamaSairEvento
@EventHandler
public void onPlayerBedEnter(PlayerBedEnterEvent e) {
Jogador digitado = e.getPlayer();
https://riptutorial.com/ 41
Capítulo 13: Escala
Introdução
Como implementar plug-ins do Bukkit na linguagem de programação Scala
Exemplos
Criar um projeto em scala é muito semelhante a criar um em java. Aqui está como a classe de entrada
deve se parecer:
override def onCommand(remetente: CommandSender, cmd: Command, label: String, args: Array[String]):
Boolean = {
falso
}
Primeiro, certifique-se de ter instalado a versão mais recente do Scala localizada aqui:https://
www.scalalang.org/download/
Em seguida, você vai querer baixar o Scala Eclipse, disponível aqui:http://scala-ide.org/e extraia o download
para uma pasta de sua preferência.
Por fim, para que seu plug-in funcione - você precisa ter algum tipo de plug-in de tempo de execução para
carregar a biblioteca scala para você, eu uso este:https://dev.bukkit.org/projects/scala-loader(coloque este jar na
sua pasta de plugins como qualquer outro plugin)
https://riptutorial.com/ 42
1. PressioneAlt+Shift+N->cliqueProjeto Scala
2. Clique com o botão direito do mouse em seu projeto - cliquePropriedades
Dentro deste pacote, crie uma classe Scala e nomeie-a como quiser, normalmente:PluginName
faça a aulaestende o JavaPlugine substitua as funções fornecidas para uma configuração básica conforme mostrado
acima.
Por fim, clique com o botão direito do mouse na pasta chamada "src" e selecione Novo arquivo. Nomeie o arquivo plugin.yml
(NÃO o nome do seu plugin, mas explicitamente plugin.yml) e abra-o.
nome: PluginName
main: com.example.pluginname.PluginName versão:
0.1
Normalmente, você pode simplesmente recarregar seu servidor para ver as alterações após a exportação, no entantoalguns
plugins irão quebrar ao recarregar, então tome cuidado!aconselho semprereiniciandoo servidor, a menos que você saiba
que recarregar não irá quebrar outros plugins.
https://riptutorial.com/ 43
Capítulo 14: Programação do Agendador
Sintaxe
• Bukkit.getScheduler().scheduleSyncRepeatingTask(Plugin plugin, tarefa executável, int initialDelay, int
repeatingDelay)
• Bukkit.getScheduler().scheduleSyncDelayedTask(Plugin plugin, tarefa executável, int initialDelay)
• new BukkitRunnable() { @Override public void run() { /* CODE */ } }.runTaskTimer(Plugin plugin, long initialDelay, long
repeatingDelay);
Observações
Poucos métodos de API do Bukkit são thread-safe e podem ser chamados de forma assíncrona. Por esse motivo, os
métodos da API do Bukkit devemapenas, com algumas exceções, seja executado no thread principal.
Código executado dentro deagendaSincronizarmétodos, bem como osexecutarTaskO método será executado no thread
principal.
Código executado dentro derunTaskAsynchronouslyserá executado de forma assíncrona a partir do thread principal. Os métodos
assíncronos são muito úteis para fazer grandes operações matemáticas ou de banco de dados sem atrasar o servidor, mas
causarão um comportamento indefinido se usados para chamar os métodos da API do Bukkit. Por esse motivo, os métodos da
API do Bukkit que devem ser executados após o código assíncrono devem sempre ser colocados em umexecutarTaskmétodo.
Exemplos
O tempo para as Tarefas do Agendador é medido em Ticks. Em condições normais, há 20 tiques por
segundo.
}
}, 0L, 20L); // Atraso inicial de 0 Tick, 20 Tick (1 segundo) entre as repetições
O tempo para as Tarefas do Agendador é medido em Ticks. Em condições normais, existem 20 carrapatos
https://riptutorial.com/ 44
por segundo.
Você pode fazer o código rodar de forma assíncrona a partir do thread principal usandorunTaskAsynchronously.
Isso é útil para fazer operações matemáticas ou de banco de dados intensivas, pois evitará que o thread
principal congele (e o servidor fique lento).
Poucos métodos da API do Bukkit são thread-safe, muitos causarão um comportamento indefinido se chamados de
forma assíncrona a partir do thread principal.
Você também pode fazer o código rodar de forma síncrona com o thread principal usandoexecutarTask. Isso é útil quando
você deseja chamar os métodos da API do Bukkit após executar o código de forma assíncrona a partir do thread principal.
O código chamado dentro deste Runnable será executado no thread principal, tornando seguro chamar os métodos
da API do Bukkit.
Executando um BukkitRunnable
https://riptutorial.com/ 45
Tarefa não repetitiva:
@Sobrepor
public void run() {
//O código interno será executado em {timeInTicks} ticks.
}
}.runTaskLater(plugin, timeInTicks); // Sua instância do plugin, o tempo a ser atrasado.
Repetindo Tarefa:
@Sobrepor
public void run() {
//O código interno será executado em {timeInTicks} ticks. //Depois disso, será
reexecutado a cada {timeInTicks} ticks; //A tarefa também pode cancelar a
execução, se você quiser.
if (booleano) {
this.cancel();
}
}
}.runTaskTimer(plugin, timeInTicks, timeInTicks); //Sua instância do plug-in,
//o tempo de espera até a primeira execução, //o tempo
entre as execuções.
Às vezes, você precisará executar código síncrono de dentro de uma tarefa assíncrona. Para fazer
isso, simplesmente agende uma tarefa síncrona de dentro do bloco assíncrono.
Bukkit.getScheduler().runTaskTimerAsynchronously(VoidFlame.getPlugin(), () -> {
Bukkit.getScheduler().runTask(VoidFlame.getPlugin(), () -> {
Mundo mundo = Bukkit.getWorld("mundo");
world.spawnEntity(new Location(world, 0, 100, 0), EntityType.PRIMED_TNT);
});
}, 0L, 20L);
https://riptutorial.com/ 46
Capítulo 15: Gerar Ovos
Observações
Exemplos
Nas versões 1.9 e superiores, o Spigot não possui uma implementação para criar ovos de desova sem usar o
NMS. Para conseguir isso, você pode usar uma pequena classe/wrapper personalizado para fazer isso
acontecer:
https://riptutorial.com/ 47
Capítulo 16: Versões
Exemplos
@Sobrepor
public void onEnable() {
String versão = Bukkit.getBukkitVersion(); //A versão string deste servidor bukkit
}
// obtém os objetos Class do pacote net.mminecraft.server com o nome fornecido public Class<?>
getNmsClass(String name) throws ClassNotFoundException {
// explodir o nome do pacote da implementação da interface do servidor em seus componentes String[] packageArray =
Bukkit.getServer().getClass().getPackage().getName().split("\\.");
// construir o nome de classe qualificado a partir da versão do pacote obtida String qualName =
"net.minecraft.server." + pacoteVersão + nome;
https://riptutorial.com/ 48
Capítulo 17: Geração mundial
Exemplos
Gerador de Vazio
@SuppressWarnings("reprovação")
public byte[] generate(World w, Random rand, int x, int z) {
tentar
{
WorldCreator w = new WorldCreator(mapName);
w.generateStructures(falso); //sem árvores, etc.
w.generator(new VoidGenerator()); //use o VoidGenerator
w.ambiente(Ambiente.NORMAL); //sem nether, etc.
w.createWorld(); //cria o mundo
}
catch(Exceção ex)
{
ex.printStackTrace();
}
}
https://riptutorial.com/ 49
Capítulo 18: Manipulação do Mundo
Observações
Exemplos
Criando Explosões
Para criar uma explosão, as seguintes assinaturas de método podem ser usadas:
Simulando uma explosão de TnT que quebra blocos e incendeia em x=0, y=0 e z=0
Soltando um item
Os seguintes métodos podem ser usados para soltar um item em algum lugar do mundo:
dropItemNaturalmentesignifica soltar o item no local, mas com um deslocamento aleatório, o que significa que
não será exatamente no local, mas muito próximo. Isso é feito para simular um item sendo descartado por
uma entidade ou um bloco, como um Dispenser.
https://riptutorial.com/ 50
Os métodos a seguir podem ser usados para gerar uma árvore naturalmente (como se fosse cultivada a partir de uma muda) no
mundo.
enumeração TreeType
Tipo Descrição
BÉTULA bétula
• delegado pode ser usado se você quiser que uma classe chame para cada bloco alterado como resultado deste
método
https://riptutorial.com/ 51
Ambas as assinaturas retornarão true se a árvore foi gerada com sucesso, false caso contrário.
Regras de desova
• Desova de Animais
• Geração de Criaturas
• Quantidade acima que pode ser gerada
Desova de animais
• Animais aquáticos
• Animais terrestres
Para obter a quantidade de animais que podem ser gerados dentro do mundo em tempo de execução, você pode usar o
método
int getAnimalSpawnLimit()
int getWaterAnimalSpawnLimit();
Observação:Se definido para números abaixo de 0, o valor padrão do mundo será usado.
O Minecraft tenta gerar animais a cada 400 tiques (padrão). Isso pode ser alterado se você
desejar, usando as seguintes assinaturas:
• Um valor de 1 significa que o servidor tentará gerar animais neste mundo a cada tick.
• Um valor de 400 significa que o servidor tentará gerar animais neste mundo a cada 400 ticks.
Observação: Se definido como 0, a desova de animais será desativada para este mundo. É recomendado usar
https://riptutorial.com/ 52
setSpawnFlags(boolean, boolean) para controlar isso.
https://riptutorial.com/ 53
Créditos
S.
Capítulos Contribuintes
Não
2 Comandos anno,Kerooker,Martin W
4 Entidades Kerooker
7 Caindo Kerooker
manipulando
10 Kerooker
Conquistas
11 NMS Alw7SHxD,kmecpp
13 escala anno
Agendador
14 Ferrybig,Jojodmo,Kerooker,kmecpp,Pokéchu22
Programação
16 Versões caseif,Kerooker
https://riptutorial.com/ 54