Resolvido Como impedir o player de colocar coisas dentro de uma GUI?

Discussão em 'Resolvidos' iniciado por WizardlyBump17, 18 Julho 2018.

  1. WizardlyBump17
    Offline

    WizardlyBump17 Membro Ativo

    Afiliado:
    11 Março 2018
    Mensagens:
    758
    Sexo:
    Masculino
    Avaliações:
    +224 / -2
    Apelido no Minecraft:
    WizardlyBump17
    Bom, em um dos meus tópicos, eu pergunto lá como cancela um evento e tals, mas ae depois de resolvido eu meio que "criei um tópico dentro de outro". Então esse daqui é só para ficar mais organizado.
    Título: como impedir o player de colocar coisas dentro de uma GUI?
    Quero o código se possível pls. Já tentaram me explicar mas vou entender com o código na minha frente. valeu Flw
     
  2. Industrial_GamerOficial
    Offline

    Industrial_GamerOficial Veterano Veterano VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    30 Outubro 2015
    Mensagens:
    290
    Sexo:
    Masculino
    Avaliações:
    +67 / -3
    Apelido no Minecraft:
    industrialgmr
    É só cancelar o evento Inventory Click. Você ainda poderá adicionar funções aos objetos da GUI, mas o player não vai conseguir pegar nada nem colocar nada. Caso não saiba:

    Código (Forge Crash):


    @EventHandler
    void onInventoryClick (InventoryClickEvent event) {

    event.setCancelled(true);

    }

     
    Por ser um evento, este código deverá estar em um Listener devidamente registrado no onEnable
    --- Post duplo mesclado, 18 Julho 2018 ---
    Ainda dá pra ser mais específico, e fazer um IF para ver em qual GUI o player está pra ver se cancela o evento ou não.
     
  3. WizardlyBump17
    Offline

    WizardlyBump17 Membro Ativo

    Afiliado:
    11 Março 2018
    Mensagens:
    758
    Sexo:
    Masculino
    Avaliações:
    +224 / -2
    Apelido no Minecraft:
    WizardlyBump17
    Ainda consegue colocar
     
  4. Duyzee
    Offline

    Duyzee Membro Conhecido VIP Sabotador.com VIP Sabotador.com

    Afiliado:
    28 Fevereiro 2017
    Mensagens:
    714
    Sexo:
    Feminino
    Avaliações:
    +492 / -1
    Apelido no Minecraft:
    Duyzee
    Ele quer saber como impedir de COLOCAR itens no inventário, não de ao clicar em algo no inventário :v
     
    • Amigável Amigável x 1
  5. joserobjr
    Offline

    joserobjr Administrador Equipe GameMods Administrador Programador YouTuber Veterano

    Afiliado:
    29 Junho 2009
    Mensagens:
    6,744
    Sexo:
    Masculino
    Avaliações:
    +4,835 / -0
    Apelido no Minecraft:
    joserobjr

    Título do tópico

    Oi WizardlyBump17, por favor, ao criar tópicos coloque um título mais descritivo que dê uma sugestão do que tem no post. O título "[help]" ficou muito vago, seria melhor se você tivesse colocado o título que você colocou na descrição.

    Editei o título do tópico para você neste tópico.


    --- Post duplo mesclado, 18 Julho 2018, Data da postagem original 18 Julho 2018 ---
    Para impedir isto você precisa monitorar o InventoryClickEvent e InventoryDragEvent.

    Não cancele todos os eventos, veja no getAction() qual ação está sendo feita e cancele o evento.

    Bloquear isso com eficiência é realmente um pouco complicado, vou fazer um exemplo de plugin que impede que coloque coisas em baús daqui a pouco.
    --- Post duplo mesclado, 18 Julho 2018 ---
    Eu não tenho como testar o código, mas segue um exemplo em Kotlin de um plugin que não deixa jogadores alterarem baús.

    Veja abaixo ou no github.
    Código (Kotlin):
    package exemplo

    import org.bukkit.event.EventHandler
    import org.bukkit.event.Listener
    import org.bukkit.event.inventory.InventoryAction
    import org.bukkit.event.inventory.InventoryAction.*
    import org.bukkit.event.inventory.InventoryClickEvent
    import org.bukkit.event.inventory.InventoryDragEvent
    import org.bukkit.event.inventory.InventoryType
    import org.bukkit.plugin.java.JavaPlugin

    class NoChestForYouPlugin: JavaPlugin(), Listener {
        override fun onEnable() {
            server.pluginManager.registerEvents(this, this)
        }

        /**
         * Impede que o jogador altere baús clicando ou trocando com atalhos de teclado.
         */

        @EventHandler(ignoreCancelled = true)
        fun onInventoryClick(event: InventoryClickEvent) {
            if (event.view.topInventory.type != InventoryType.CHEST) {
                return
            }

            // Forma completa e mais segura em atualizações. Se uma action nova for adicionada ela é recusada.
            event.isCancelled = when (checkNotNull(event.action)) {
                // Nada foi alterado, clicou no vazio com nada no ponteiro.
                NOTHING -> false

                // Moveu de um inventário para outro, cancelar.
                MOVE_TO_OTHER_INVENTORY, HOTBAR_SWAP -> true

                // Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
                // Isso não altera o inventário de cima (baú no caso)
                CLONE_STACK, COLLECT_TO_CURSOR -> false

                // Indefinido, melhor rejeitar
                UNKNOWN -> true

                // Todos esses aqui são alterações com clique, verificar se o slot clicado faz parte do inventário de cima
                // Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
                PICKUP_ALL, PICKUP_SOME, PICKUP_HALF, PICKUP_ONE,
                PLACE_ALL, PLACE_SOME, PLACE_ONE,
                SWAP_WITH_CURSOR,
                DROP_ALL_CURSOR, DROP_ONE_CURSOR,
                DROP_ALL_SLOT, DROP_ONE_SLOT,
                HOTBAR_MOVE_AND_READD -> event.clickedInventory == event.view.topInventory

                // Em caso de
                else -> true
            }

            // Forma resumida mas precisa ser revisada em novas versões Bukkit caso [InventoryAction] seja alterado.
            /*event.isCancelled = when(checkNotNull(event.action)) {
                // Moveu de um inventário para outro, cancelar.
                MOVE_TO_OTHER_INVENTORY, HOTBAR_SWAP -> true

                // Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
                // Isso não altera o inventário de cima (baú no caso)
                CLONE_STACK, COLLECT_TO_CURSOR, NOTHING -> false

                // Indefinido, melhor rejeitar
                UNKNOWN -> true

                // Só sobrou as alterações com clique. Verificar se o slot clicado faz parte do inventário de cima
                // Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
                else -> event.clickedInventory == event.view.topInventory
            }*/

        }

        /**
         * Impede que jogadores alterem baús arrastando o item na mão em no inventário.
         */

        @EventHandler(ignoreCancelled = true)
        fun onInventoryDrag(event: InventoryDragEvent) {
            // O número do primeiro slot (raw) do inventário de baixo é sempre o tamanho do inventário de cima.
            val primeiroSlotInventorioDeBaixo = event.view.topInventory.size

            // Cancelar se alterar algum slot do inventário de cima.
            event.isCancelled = event.rawSlots.any { slot-> slot >= primeiroSlotInventorioDeBaixo }
        }
    }
    --- Post duplo mesclado, 18 Julho 2018 ---
    E uma conversão para java:
    Código (Java):
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.inventory.InventoryClickEvent;
    import org.bukkit.event.inventory.InventoryDragEvent;
    import org.bukkit.event.inventory.InventoryType;
    import org.bukkit.plugin.java.JavaPlugin;

    public class NoChestForYouJavaPlugin extends JavaPlugin implements Listener {
        @Override
        public void onEnable() {
            getServer().getPluginManager().registerEvents(this, this);
        }
       
        /**
         * Impede que o jogador altere baús clicando ou trocando com atalhos de teclado.
         */

        @EventHandler(ignoreCancelled = true)
        public void onInventoryClick(InventoryClickEvent event) {
            if (event.getView().getTopInventory().getType() != InventoryType.CHEST) {
                return;
            }
           
            // Forma completa e mais segura em atualizações. Se uma action nova for adicionada ela é recusada.
            switch (event.getAction()) {
                // Nada foi alterado, clicou no vazio com nada no ponteiro.
                case NOTHING:
                    break;
               
                // Moveu de um inventário para outro, cancelar.
                case MOVE_TO_OTHER_INVENTORY:
                case HOTBAR_SWAP:
                    event.setCancelled(true);
                    break;
                   
                // Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
                // Isso não altera o inventário de cima (baú no caso)
                case CLONE_STACK:
                case COLLECT_TO_CURSOR:
                    event.setCancelled(false);
                    break;
               
                // Indefinido, melhor rejeitar
                case UNKNOWN:
                    event.setCancelled(true);
                    break;
               
                // Todos esses aqui são alterações com clique, verificar se o slot clicado faz parte do inventário de cima
                // Se for o inventário de baixo então o jogador está mexendo no próprio inventário e não no baú
                case PICKUP_ALL:
                case PICKUP_SOME:
                case PICKUP_HALF:
                case PICKUP_ONE:
                case PLACE_ALL:
                case PLACE_SOME:
                case PLACE_ONE:
                case SWAP_WITH_CURSOR:
                case DROP_ALL_CURSOR:
                case DROP_ONE_CURSOR:
                case DROP_ALL_SLOT:
                case DROP_ONE_SLOT:
                case HOTBAR_MOVE_AND_READD:
                    event.setCancelled(event.getClickedInventory().equals(event.getView().getTopInventory()));
                    break;
                   
                default:
                    event.setCancelled(true);
                    break;
            }
           
            // Forma resumida mas precisa ser revisada em novas versões Bukkit caso [InventoryAction] seja alterado.
            /*switch (event.getAction()) {
                // Moveu de um inventário para outro, cancelar.
                case MOVE_TO_OTHER_INVENTORY:
                case HOTBAR_SWAP:
                    event.setCancelled(true);
                    break;
               
                // Copiou no modo criativo ou selecionou com o botão do meio no modo sobrevivencia
                // Isso não altera o inventário de cima (baú no caso)
                case CLONE_STACK:
                case COLLECT_TO_CURSOR:
                case NOTHING:
                    event.setCancelled(false);
                    break;
               
                // Indefinido, melhor rejeitar
                case UNKNOWN:
                    event.setCancelled(true);
                    break;
                   
                default:
                    event.setCancelled(event.getClickedInventory().equals(event.getView().getTopInventory()));
                    break;
            }*/

        }
       
        /**
         * Impede que jogadores alterem baús arrastando o item na mão em no inventário.
         */

        @EventHandler(ignoreCancelled = true)
        public void onInventoryDrag(InventoryDragEvent event) {
            // O número do primeiro slot (raw) do inventário de baixo é sempre o tamanho do inventário de cima.
            int primeiroSlotInventorioDeBaixo = event.getView().getTopInventory().getSize();
           
            // Cancelar se alterar algum slot do inventário de cima.
            event.setCancelled(event.getRawSlots().stream().anyMatch(slot-> slot >= primeiroSlotInventorioDeBaixo));
        }
    }
     
    • Concordo Concordo x 1
    • Vencedor Vencedor x 1
    • Útil Útil x 1

Compartilhe esta Página