[DEV.Bukkit] InventarioGUI - #4

Discussão em 'Informática/Tecnologia' iniciado por Paluh, 15 Outubro 2015.

Status do Tópico:
Não esta aberto para novas mensagens.
  1. Paluh

    Paluh Craftlandiano
    VIP

    Afiliado:
    12 Junho 2013
    Mensagens:
    1,786
    Curtidas Recebidas:
    683
    Curtiu:
    635
    Sexo:
    Masculino
    Cubos:
    2,754.00
    Nick:
    Heguest
    [​IMG]
    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..
    [hr]
    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.
    : 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;
    }
    }​
    : 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;
    }
    }​
    : 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!

    }​
    : 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;

    }

    }

    }
    }​
    : 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);

    }​
    : 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);

    }
    }​
    : 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;

    }

    }

    }
    }​
    : Agora vejamos como ele ficou dentro do servidor:
    [​IMG]
    [hr]​
     
    C35 curtiu isso.
  2. tonilucho

    tonilucho Neutro
    VIP

    Afiliado:
    22 Setembro 2015
    Mensagens:
    460
    Curtidas Recebidas:
    24
    Curtiu:
    0
    Cubos:
    472.00
    Nick:
    tonilucho
  3. RubyKingFE

    VIP

    Afiliado:
    1 Outubro 2015
    Mensagens:
    3,202
    Curtidas Recebidas:
    196
    Curtiu:
    0
    Sexo:
    Masculino
    Localização:
    Minas Gerais
    Cubos:
    12.06
    Nick:
    Lacoste
    Clan:
    ◆EcT◆
    Boa mano ae sim em

    Enviado de meu LG-E615f usando Tapatalk
     
  4. Mr Lucas

    Mr Lucas Hardcore
    VIP

    Afiliado:
    17 Julho 2012
    Mensagens:
    6,072
    Curtidas Recebidas:
    2,031
    Curtiu:
    4,943
    Sexo:
    Masculino
    Ocupação:
    Membro sem...
    Localização:
    Santa Catarina
    Cubos:
    1,722.00
    Nick:
    SrFormal
    Clan:
    TRP
    Parabéns pela iniciativa. É macro, ou java?
     
  5. jefinhosl

    jefinhosl Razoavel

    Afiliado:
    21 Maio 2013
    Mensagens:
    493
    Curtidas Recebidas:
    61
    Curtiu:
    0
    Sexo:
    Masculino
    Cubos:
    211.00
    Nick:
    jefinhosl
    Tbm to com essa duvida... mas pelo arroba deve ser macro

    Enviado de meu ASUS_T00J usando Tapatalk
     
  6. C35

    C35 Bom
    VIP

    Afiliado:
    25 Novembro 2014
    Mensagens:
    1,355
    Curtidas Recebidas:
    121
    Curtiu:
    92
    Sexo:
    Masculino
    Localização:
    MG,Belo...
    Cubos:
    1,484.00
    Nick:
    Downatelo
    Boa,vai ajudar muitas pessoas q queren ter servidores like

    Enviado de meu GT-S7390L usando Tapatalk
     
  7. Paluh

    Paluh Craftlandiano
    VIP

    Afiliado:
    12 Junho 2013
    Mensagens:
    1,786
    Curtidas Recebidas:
    683
    Curtiu:
    635
    Sexo:
    Masculino
    Cubos:
    2,754.00
    Nick:
    Heguest
    Não é JAVA e muito menos Macro
    É BukkitAPI ao certo, mas pode entrar um pouco de JAVA também...
     
  8. KanekiLL

    KanekiLL Neutro
    Banido

    Afiliado:
    12 Outubro 2015
    Mensagens:
    127
    Curtidas Recebidas:
    4
    Curtiu:
    0
    Sexo:
    Masculino
    Cubos:
    131.00
    Nick:
    KanekiLL
    Bom tutorial.
     
  9. EmersonRox

    EmersonRox Craftlandiano
    VIP

    Afiliado:
    24 Agosto 2013
    Mensagens:
    10,083
    Curtidas Recebidas:
    1,728
    Curtiu:
    2,544
    Sexo:
    Masculino
    Cubos:
    2,115.14
    Nick:
    EmersonRox
    Bom tutorial.
     
  10. Erasus

    Erasus Excelente
    VIP

    Afiliado:
    6 Outubro 2015
    Mensagens:
    3,730
    Curtidas Recebidas:
    349
    Curtiu:
    0
    Sexo:
    Masculino
    Cubos:
    718.00
    Nick:
    Erasus
    Parabéns ótimo tutorial


    Enviado do meu iPhone usando Tapatalk
     
  11. Pedroivo00

    Pedroivo00 Craftlandiano
    VIP

    Afiliado:
    16 Setembro 2012
    Mensagens:
    3,073
    Curtidas Recebidas:
    1,748
    Curtiu:
    437
    Sexo:
    Masculino
    Localização:
    Rio de Janeiro
    Cubos:
    483.00
    Nick:
    Pedroivo00
    Clan:
    EcT
    Skype:
    NTEINTERESSA
    Boa lek ae sim em

    Enviado de meu LG-E615f usando Tapatalk
     
  12. adaonegru

    adaonegru Razoavel

    Afiliado:
    1 Outubro 2015
    Mensagens:
    572
    Curtidas Recebidas:
    66
    Curtiu:
    0
    Sexo:
    Masculino
    Cubos:
    644.00
    Nick:
    Soavidade
    Facebook:
    Caio Soave
    Skype:
    caiosoave1
    Twitter:
    Nem tenho :3
    Daora, bom tutorial!
     
Status do Tópico:
Não esta aberto para novas mensagens.