Bom,hoje vou ensinar a vocês a como criar um plugin que pode manipular inventários,
Coisas como,
Criar e personalizar um inventario,
Mudar o nome e descrição de itens,
Usar eventos que podem saber de ações no inventário,
Colocar itens no inventário e outras coisas..
Para começarmos,primeiro crie um projeto chamado Tutorial ou como quiser,crie o pacote,e a classe que no caso farei uma chamada "Main" que será a classe principal.
1º: Base inicial do plugin:
package me.tutorial;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin{
@Override
public void onEnable() {
}
@Override
public void onDisable() {
}
// Vamos criar um comando que irá abrir o inventário!
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] args) {
/*
* O comando só funcionara para jogadores, ou seja,se você tentar usa-lo pelo console ira ocorrer um erro,e para evitar isso
* faremos com que apenas os jogadores possam usar o comando usando o "instanceof".
*/
// Vamos fazer com que somente jogadores possam usar o comando
if(sender instanceof Player){
} else {
// E se não for um jogador que executou o comando, vamos enviar a seguinte.
sender.sendMessage("Voce nao e um jogador!");
}
return false;
}
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin{
@Override
public void onEnable() {
}
@Override
public void onDisable() {
}
// Vamos criar um comando que irá abrir o inventário!
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] args) {
/*
* O comando só funcionara para jogadores, ou seja,se você tentar usa-lo pelo console ira ocorrer um erro,e para evitar isso
* faremos com que apenas os jogadores possam usar o comando usando o "instanceof".
*/
// Vamos fazer com que somente jogadores possam usar o comando
if(sender instanceof Player){
} else {
// E se não for um jogador que executou o comando, vamos enviar a seguinte.
sender.sendMessage("Voce nao e um jogador!");
}
return false;
}
}
2º: A base do plugin já esta pronta,agora vamos ir mais pra frente no comando:
if(sender instanceof Player){
if(label.equalsIgnoreCase("inv")){
Player jogador = (Player) sender;
//Vamos colocar uma permissão
if(jogador.hasPermission("p.inv")){
/*
* A linha abaixo ficará em vermelho, pois ainda não criamos o metodo "abrirInv" que fara com que abra o inventario do jogador.
* Coloque o mouse em cima do erro e clique em "Create method 'abrirInv(Player)'
*/
abrirInv(jogador);
} else {
jogador.sendMessage(ChatColor.RED + "Voce nao tem permissao para este comando!");
}
}
} else {
sender.sendMessage("Voce nao e um jogador!");
}
}
return false;
}
Player jogador = (Player) sender;
//Vamos colocar uma permissão
if(jogador.hasPermission("p.inv")){
/*
* A linha abaixo ficará em vermelho, pois ainda não criamos o metodo "abrirInv" que fara com que abra o inventario do jogador.
* Coloque o mouse em cima do erro e clique em "Create method 'abrirInv(Player)'
*/
abrirInv(jogador);
} else {
jogador.sendMessage(ChatColor.RED + "Voce nao tem permissao para este comando!");
}
}
} else {
sender.sendMessage("Voce nao e um jogador!");
}
}
return false;
}
}
3º: Feito isso vamos elaborar o metodo para abrir o inventario:
// Deixe em private mesmo, só iremos usar ele nesta classe
private void abrirInv(Player jogador) {
//Vamos chamar a interface Inventory e criar um inventario com a ajuda do Bukkit!
Inventory inv = Bukkit.createInventory(null, 9, "InventarioGUI");
/*
* o 'null' significa que não tem um proprietario o inv.
* o '9' é o numero de slots do inv. Lembrando que esse numero só pode ser multiplos de 9!
* ou seja, pode ser 9, 18, 27, 36, 45, 54, sendo o ultimo numero o limite!
* já o 'InventarioGUI' é o titulo, se você quiser, pode colorir usando o ChatColor
*/
//Vamos agora colocar itens nesse inventário
ItemStack item = new ItemStack(Material.APPLE);
// O ItemStack significa um item no inventário, e como não temos nenhum, usamos o new ItemStack(Material);
// Simplesmente por um item é muito simples, vamos modificar o nome e sua lore usando o ItemMeta
ItemMeta itemMeta = item.getItemMeta();
// ItemMeta são itens que guardam informações
// Mas precisamos pegar essa informação de algum lugar, e pegamos ela do ItemStack usando o item.getItemMeta();
// Agora sim podemos modificar o nome da maçã e suas lores.
itemMeta.setDisplayName(ChatColor.YELLOW + "Maçã do Tuto!");
// Pronto, colocamos um novo nome, vamos por uma lore agora, que é um pouco diferente!
List<String> lore = new ArrayList<String>();
// Importe tanto o list quanto o ArrayList do java.util
// A lore é em formato de lista, com isso não da para simplesmente usar o setLore("A maça é boa");
// Vamos pegar essa lore que é uma lista e adicionar uma frase nela, pois fizemos ela por meio do 'String'
lore.add(ChatColor.GOLD + "A maça é muito boa!");
// Perfeito, agora vamos pegar e adicionar a lore no itemMeta!
itemMeta.setLore(lore);
// Agora sim está completa!
// Modificamos tudo o que queriamos na Meta, mas agora precisamos devolver ela para o item.
item.setItemMeta(itemMeta);
// Agora sim a maçã esta completa!
// Porém, falta um detalhe, precisamos adicionar a maçã no inventário, mas isso é fácil!
inv.setItem(1, item);
// Usando o setItem, podemos determinar o slot que o item deve ficar!
// Vale lembrar que no java, nada começa no 1, e sim do 0.
// No seu teclado, os slots são 1, 2, 3, 4, 5, 6, 7, 8, 9
// Entretanto, caso queria por o item no slot numero 2 do seu teclado, no java esse slot é o 1
// Assim, o primeiro slot é o 0, o segundo é o 1 e assim por diante, até chegar na quantidade de slots definidos
// quando criou o inv.
// Otimo! Está quase tudo pronto! Precisamos agora abrir o inv no jogador alvo. Por isso que la no metodo, entre parenteses
// colocamos Player jogador, é para informar em quem vamos abrir o inv.
jogador.openInventory(inv);
// Agora sim está concluido! Assim que charmarmos o método, o programa irá abrir o inv no player que executou o comando!
//Vamos chamar a interface Inventory e criar um inventario com a ajuda do Bukkit!
Inventory inv = Bukkit.createInventory(null, 9, "InventarioGUI");
/*
* o 'null' significa que não tem um proprietario o inv.
* o '9' é o numero de slots do inv. Lembrando que esse numero só pode ser multiplos de 9!
* ou seja, pode ser 9, 18, 27, 36, 45, 54, sendo o ultimo numero o limite!
* já o 'InventarioGUI' é o titulo, se você quiser, pode colorir usando o ChatColor
*/
//Vamos agora colocar itens nesse inventário
ItemStack item = new ItemStack(Material.APPLE);
// O ItemStack significa um item no inventário, e como não temos nenhum, usamos o new ItemStack(Material);
// Simplesmente por um item é muito simples, vamos modificar o nome e sua lore usando o ItemMeta
ItemMeta itemMeta = item.getItemMeta();
// ItemMeta são itens que guardam informações
// Mas precisamos pegar essa informação de algum lugar, e pegamos ela do ItemStack usando o item.getItemMeta();
// Agora sim podemos modificar o nome da maçã e suas lores.
itemMeta.setDisplayName(ChatColor.YELLOW + "Maçã do Tuto!");
// Pronto, colocamos um novo nome, vamos por uma lore agora, que é um pouco diferente!
List<String> lore = new ArrayList<String>();
// Importe tanto o list quanto o ArrayList do java.util
// A lore é em formato de lista, com isso não da para simplesmente usar o setLore("A maça é boa");
// Vamos pegar essa lore que é uma lista e adicionar uma frase nela, pois fizemos ela por meio do 'String'
lore.add(ChatColor.GOLD + "A maça é muito boa!");
// Perfeito, agora vamos pegar e adicionar a lore no itemMeta!
itemMeta.setLore(lore);
// Agora sim está completa!
// Modificamos tudo o que queriamos na Meta, mas agora precisamos devolver ela para o item.
item.setItemMeta(itemMeta);
// Agora sim a maçã esta completa!
// Porém, falta um detalhe, precisamos adicionar a maçã no inventário, mas isso é fácil!
inv.setItem(1, item);
// Usando o setItem, podemos determinar o slot que o item deve ficar!
// Vale lembrar que no java, nada começa no 1, e sim do 0.
// No seu teclado, os slots são 1, 2, 3, 4, 5, 6, 7, 8, 9
// Entretanto, caso queria por o item no slot numero 2 do seu teclado, no java esse slot é o 1
// Assim, o primeiro slot é o 0, o segundo é o 1 e assim por diante, até chegar na quantidade de slots definidos
// quando criou o inv.
// Otimo! Está quase tudo pronto! Precisamos agora abrir o inv no jogador alvo. Por isso que la no metodo, entre parenteses
// colocamos Player jogador, é para informar em quem vamos abrir o inv.
jogador.openInventory(inv);
// Agora sim está concluido! Assim que charmarmos o método, o programa irá abrir o inv no player que executou o comando!
}
5º: Bom fizemos tudo certo,mas paramos por aqui, o jogador toda vez que abrir o inventário poderá pegar a maçã para ele, e não queremos isso.
Para isso vamos criar uma classe que pode "escutar" os eventos
package me.Tutorial;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class TutorialEventos implements Listener{
Main plugin;
// Vou mudar um pouco a maneira de registrar eventos.
public TutorialEventos(Main plugin){
this.plugin = plugin;
}
//Vamos pegar o Evento que lida com o inventario
@EventHandler
public void usarInv(InventoryClickEvent evento){
// Vamos determinar que o jogador é quem clicou no inv.
Player jogador = (Player) evento.getWhoClicked();
// Esse evento não pode ser aplicado em todos os inventários, pode isso vamos especificar!
Inventory inv = evento.getInventory();
// E vamos enviar uma mensagem quando o jogador clicar na maçã, mas primeiro precisamos determinar o item clicado!
ItemStack item = evento.getCurrentItem();
//Pronto, podemos começar informando o inv que ocorre as ações que queremos!
if(inv.getName().equalsIgnoreCase("InventarioGUI")){
// O inv contem mais do que o item que colocamos lá, ele tem ar e nada, e isso importa muito!
// Vamos definir que ser o item for ar, null ou não tiver uma meta, o evento retorna nada.
if(item.getType() == null || item.getType() == Material.AIR || !item.hasItemMeta())
return;
// As || significa 'ou', ou isso, ou aquilo. Procure mais no Google para entender melhor!
// ! significa 'se não', ali, se o item não tiver uma meta, o evento retorna nada.
// Agora, vamos definir os itens a serem clicados para ocorrer certas ações!
// Para isso, vamos usar uma ferramenta nova:
switch (item.getType()) {
// O switch analisa uma chave e seus casos. A chave, nesse exemplo é o material do item. O caso é que tipo de Material
case APPLE:
// case APPLE: ou seja, caso seja um Maça, realiza as ações depois dos :
jogador.sendMessage("Você clicou na maçã!");
jogador.closeInventory();
// é importante por o break, porque ele impede que o restante dos casos sejam lidos.
// Se o primeiro caso for verdadeiro, o break 'fala' para o programa que não precisa ler os outros casos.
break;
// O default é para todos os outros casos não determinados. Vamos simplesmente cancelar o evento quando não se
// encaixa em nenhum outro caso!
default:
evento.setCancelled(true);
break;
}
}
}
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class TutorialEventos implements Listener{
Main plugin;
// Vou mudar um pouco a maneira de registrar eventos.
public TutorialEventos(Main plugin){
this.plugin = plugin;
}
//Vamos pegar o Evento que lida com o inventario
@EventHandler
public void usarInv(InventoryClickEvent evento){
// Vamos determinar que o jogador é quem clicou no inv.
Player jogador = (Player) evento.getWhoClicked();
// Esse evento não pode ser aplicado em todos os inventários, pode isso vamos especificar!
Inventory inv = evento.getInventory();
// E vamos enviar uma mensagem quando o jogador clicar na maçã, mas primeiro precisamos determinar o item clicado!
ItemStack item = evento.getCurrentItem();
//Pronto, podemos começar informando o inv que ocorre as ações que queremos!
if(inv.getName().equalsIgnoreCase("InventarioGUI")){
// O inv contem mais do que o item que colocamos lá, ele tem ar e nada, e isso importa muito!
// Vamos definir que ser o item for ar, null ou não tiver uma meta, o evento retorna nada.
if(item.getType() == null || item.getType() == Material.AIR || !item.hasItemMeta())
return;
// As || significa 'ou', ou isso, ou aquilo. Procure mais no Google para entender melhor!
// ! significa 'se não', ali, se o item não tiver uma meta, o evento retorna nada.
// Agora, vamos definir os itens a serem clicados para ocorrer certas ações!
// Para isso, vamos usar uma ferramenta nova:
switch (item.getType()) {
// O switch analisa uma chave e seus casos. A chave, nesse exemplo é o material do item. O caso é que tipo de Material
case APPLE:
// case APPLE: ou seja, caso seja um Maça, realiza as ações depois dos :
jogador.sendMessage("Você clicou na maçã!");
jogador.closeInventory();
// é importante por o break, porque ele impede que o restante dos casos sejam lidos.
// Se o primeiro caso for verdadeiro, o break 'fala' para o programa que não precisa ler os outros casos.
break;
// O default é para todos os outros casos não determinados. Vamos simplesmente cancelar o evento quando não se
// encaixa em nenhum outro caso!
default:
evento.setCancelled(true);
break;
}
}
}
}
6º: O plugin já esta quase pronto,apenas iremos registrar os eventos na classe principal (Main) e criar a plugin.yml.
@Override
public void onEnable() {
PluginManager manager = this.getServer().getPluginManager();
manager.registerEvents(new TutorialEventos(this), this);
PluginManager manager = this.getServer().getPluginManager();
manager.registerEvents(new TutorialEventos(this), this);
}
7º: Veja como ficou a classe Main:
}package me.Tutorial;
import java.util.ArrayList;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin{
@Override
public void onEnable() {
PluginManager manager = this.getServer().getPluginManager();
manager.registerEvents(new TutorialEventos(this), this);
}
@Override
public void onDisable() {
}
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] args) {
if(sender instanceof Player){
if(label.equalsIgnoreCase("inv")){
Player jogador = (Player) sender;
if(jogador.hasPermission("p.inv")){
abrirInv(jogador);
} else {
jogador.sendMessage(ChatColor.RED + "Voce nao tem permissao para este comando!");
}
}
} else {
sender.sendMessage("Voce nao e um jogador!");
}
return false;
}
private void abrirInv(Player jogador) {
Inventory inv = Bukkit.createInventory(null, 9, "InventarioGUI");
ItemStack item = new ItemStack(Material.APPLE);
ItemMeta itemMeta = item.getItemMeta();
itemMeta.setDisplayName(ChatColor.YELLOW + "Maçã do Tuto!");
List<String> lore = new ArrayList<String>();
lore.add(ChatColor.GOLD + "A maça é muito boa!");
itemMeta.setLore(lore);
item.setItemMeta(itemMeta);
inv.setItem(1, item);
jogador.openInventory(inv);
}
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
public class Main extends JavaPlugin{
@Override
public void onEnable() {
PluginManager manager = this.getServer().getPluginManager();
manager.registerEvents(new TutorialEventos(this), this);
}
@Override
public void onDisable() {
}
@Override
public boolean onCommand(CommandSender sender, Command command,
String label, String[] args) {
if(sender instanceof Player){
if(label.equalsIgnoreCase("inv")){
Player jogador = (Player) sender;
if(jogador.hasPermission("p.inv")){
abrirInv(jogador);
} else {
jogador.sendMessage(ChatColor.RED + "Voce nao tem permissao para este comando!");
}
}
} else {
sender.sendMessage("Voce nao e um jogador!");
}
return false;
}
private void abrirInv(Player jogador) {
Inventory inv = Bukkit.createInventory(null, 9, "InventarioGUI");
ItemStack item = new ItemStack(Material.APPLE);
ItemMeta itemMeta = item.getItemMeta();
itemMeta.setDisplayName(ChatColor.YELLOW + "Maçã do Tuto!");
List<String> lore = new ArrayList<String>();
lore.add(ChatColor.GOLD + "A maça é muito boa!");
itemMeta.setLore(lore);
item.setItemMeta(itemMeta);
inv.setItem(1, item);
jogador.openInventory(inv);
}
}
8º: Como ficou a classe que "escuta" os eventos:
package me.Tutorial;
import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class TutorialEventos implements Listener{
Main plugin;
public TutorialEventos(Main plugin){
this.plugin = plugin;
}
@EventHandler
public void usarInv(InventoryClickEvent evento){
Player jogador = (Player) evento.getWhoClicked();
Inventory inv = evento.getInventory();
ItemStack item = evento.getCurrentItem();
if(inv.getName().equalsIgnoreCase("InventarioGUI")){
if(item.getType() == null || item.getType() == Material.AIR || !item.hasItemMeta())
return;
switch (item.getType()) {
case APPLE:
jogador.sendMessage("Você clicou na maçã!");
jogador.closeInventory();
break;
default:
evento.setCancelled(true);
break;
}
}
}
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
public class TutorialEventos implements Listener{
Main plugin;
public TutorialEventos(Main plugin){
this.plugin = plugin;
}
@EventHandler
public void usarInv(InventoryClickEvent evento){
Player jogador = (Player) evento.getWhoClicked();
Inventory inv = evento.getInventory();
ItemStack item = evento.getCurrentItem();
if(inv.getName().equalsIgnoreCase("InventarioGUI")){
if(item.getType() == null || item.getType() == Material.AIR || !item.hasItemMeta())
return;
switch (item.getType()) {
case APPLE:
jogador.sendMessage("Você clicou na maçã!");
jogador.closeInventory();
break;
default:
evento.setCancelled(true);
break;
}
}
}
}
9º: Agora vejamos como ele ficou dentro do servidor: