Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Własny plugin na GUI


krzychupl01

Rekomendowane odpowiedzi

Opublikowano

Witam mam problem z tym że po wpisaniu komendy /pomoc i przejściu w zakładkę VIP można wyciągać przedmioty z GUI "VIP" ale gdy wpisze /vip nie wchodząc tam poprzez "podmenu" to wszystko działa jak należy.

Jak naprawić to aby po wpisaniu "/pomoc" a następnie wejście w slot odpowiedzialny za range np. VIP nie dało się wyciągać przedmiotów, a nawet dało się wyjść z GUI.

Oto mój cały plugin: (wiem ze nie dopracowany ale zaczynam dopiero przygodę z Plugniami i zatrzymałem się w trakcie tego błędu)

https://pastebin.pl/view/5f8ca6e0

Opublikowano

Nie wiem gdzie się uczyłeś pisać w javie ale jak robisz komendę to zrób jej osoby plik aby było łatwiej się rozeznać we wszystkim.

Może lepiej najpierw naucz się javy a później pisz pluginy , co do gui to napisz sobie api bo to nie jest wyjście wpisują każdy item po kolei.

Zamiast używać else if jak masz więcej niż 2 wartości do sprawdzenia używaj switch jest szybszy i łatwiej ogarniać kod.

Osobiście nie podoba mi się w jaki sposób otwierasz inventory są pod to inne eventy ale tak niby też można.

chyba brakuje @EventHandler przed voidami

przeczytaj sobie wszystkie eventy tu w JAVADOCS. Jeżeli chcesz aby nie można było zabierać itemów z gui to w InventoryClickEvent dodaj e.setCanceled(true); po tym kto kliknął 

totalnie źle:

 public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(cmd.getName().equalsIgnoreCase("pomoc")) {
            if(sender instanceof Player) {
                Player p = (Player) sender;
                openGUI(p);
            }else {
                sender.sendMessage("Consola nie moze tego uzyc");
            }
        }
        if(cmd.getName().equalsIgnoreCase("vip")) {
            if(sender instanceof Player) {
                Player p = (Player) sender;
                openGUIVIP(p);
            }else {
                sender.sendMessage("Consola nie moze tego uzyc");
            }
        }
        return true;
    }

łatwiej jest zrobić tak:

            if(!(sender instanceof Player)) {
                System.out.println("Consola nie może tego użyć");
                // nie powinno się używać System.out.printl - ale to jest tylko przykład
            }
            switch (args[0]) {//arg0 odwołuje się do pierwszej wartości wpisaniej po /
                case "vip":
                    break;
                case "pomoc":
                    break;
                default:
                    break;
            }
        return true;
    }

 

 

 

 

Opublikowano
1 godzinę temu, RomoDycha napisał:

 

chyba brakuje @EventHandler przed voidami

Jeżeli chcesz aby nie można było zabierać itemów z gui to w InventoryClickEvent dodaj e.setCanceled(true); po tym kto kliknął 

 

Jeśli chodzi o to dalej jest ten sam błąd co wcześniej nawet po dodaniu @EventHander przed każdym z voidow, e.setCanceled(true) wiem ze chodzi o nie wyciąganie lecz w trakcie testu lepiej widać jak gui się zamyka. Wracając dalej to samo ze przy wywołaniu przez gracza komendy VIP działa bez zarzutów lecz gry plugin otwiera graczowi GUIVIP poprzez nad menu pomoc, to dalej wyciąga przedmioty a gui się nie zamyka

1 godzinę temu, RomoDycha napisał:

Nie wiem gdzie się uczyłeś pisać w javie ale jak robisz komendę to zrób jej osoby plik aby było łatwiej się rozeznać we wszystkim.

Może lepiej najpierw naucz się javy a później pisz pluginy , co do gui to napisz sobie api bo to nie jest wyjście wpisują każdy item po kolei.

Zamiast używać else if jak masz więcej niż 2 wartości do sprawdzenia używaj switch jest szybszy i łatwiej ogarniać kod.

Osobiście nie podoba mi się w jaki sposób otwierasz inventory są pod to inne eventy ale tak niby też można.


 public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) {
        if(cmd.getName().equalsIgnoreCase("pomoc")) {
            if(sender instanceof Player) {
                Player p = (Player) sender;
                openGUI(p);
            }else {
                sender.sendMessage("Consola nie moze tego uzyc");
            }
        }
        if(cmd.getName().equalsIgnoreCase("vip")) {
            if(sender instanceof Player) {
                Player p = (Player) sender;
                openGUIVIP(p);
            }else {
                sender.sendMessage("Consola nie moze tego uzyc");
            }
        }
        return true;
    }

łatwiej jest zrobić tak:


            if(!(sender instanceof Player)) {
                System.out.println("Consola nie może tego użyć");
                // nie powinno się używać System.out.printl - ale to jest tylko przykład
            }
            switch (args[0]) {//arg0 odwołuje się do pierwszej wartości wpisaniej po /
                case "vip":
                    break;
                case "pomoc":
                    break;
                default:
                    break;
            }
        return true;
    }

 

 

 

 

A co do tej części to dzięki za pomoc w optymalizacji kodu, jak już mówiłem uczę się dopiero pisać, można powiedzieć ze dopiero raczkuje 

Opublikowano
@EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (event.getRawSlot() == event.getSlot() && event.getView().getTitle().equals(ChatColor.DARK_GREEN +"Skrzynia")) {

            switch (event.getSlot()) {

                case 11:
                    event.getWhoClicked().sendMessage("Rozpoczęto");
                    Inventory inv2 = Bukkit.createInventory(null, 27, ChatColor.DARK_GREEN + "Losowanie");
                    inv2.setItem(11, new ItemStackUtil(Material.HOPPER).setName("Losuj").buildItem());
                    inv2.setItem(15, new ItemStackUtil(Material.RED_WOOL).setName("Wyjście").buildItem());
                    event.getWhoClicked().openInventory(inv2);
                    break;
                case 15:
                    event.getWhoClicked().closeInventory();
                    event.getWhoClicked().sendMessage("Anulowano");
                    break;
            }
            event.setCancelled(true);
            }
        else if (event.getRawSlot() == event.getSlot() && event.getView().getTitle().equals(ChatColor.DARK_GREEN + "Losowanie"))
        {
            switch (event.getSlot())
            {
                case 11:
                    event.getWhoClicked().sendMessage("Rozpoczęto losowanie");
                    break;
                case 15:
                    event.getWhoClicked().sendMessage("Przerwano losowanie");
                    event.getWhoClicked().closeInventory();
                    break;
            }
            event.setCancelled(true);
        }
    }

może tak zadziała to akurat moje próby robienia skrzynek do losowania itemów 

tylko musisz użyć innej formy dodania itemów bo ja wykorzystuje API

i główne gui jest w osobnym pliku co daje mi możliwość zastosowania:

Objects.requireNonNull(getCommand("gui")).setExecutor(new ShowGui());

w public void onEnable (odwołanie się komendy do pliku )

musisz pokombinować z tym i na pewno za działa 

a i właśnie jak masz dużo itemów w gui których nie mam sensu pisać ręcznie możesz użyć pętle for tylko po pętli musisz dodać miejsca bloków których chcesz mieć :

for(int x = 0; x <= 26; x++)
   {
         gui.setItem(x, whiteGlass);              
   }
         //np 
      gui.setItem(20, Vip);
      gui.setItem(21, Svip);
      gui.setItem(22, Sponsor);

i co do bloków to w zależności na jakiej wersji to robisz bo po 1.13 o ile się nie mylę można używać 

RED_STAINED_GLASS_PANE w samym gui.setItem

zamiast

ItemStack redGlass = new ItemStack(Material.STAINED_GLASS_PANE , 1, (byte) 14);

Opublikowano
22 godziny temu, RomoDycha napisał:

@EventHandler
    public void onInventoryClick(InventoryClickEvent event) {
        if (event.getRawSlot() == event.getSlot() && event.getView().getTitle().equals(ChatColor.DARK_GREEN +"Skrzynia")) {

            switch (event.getSlot()) {

                case 11:
                    event.getWhoClicked().sendMessage("Rozpoczęto");
                    Inventory inv2 = Bukkit.createInventory(null, 27, ChatColor.DARK_GREEN + "Losowanie");
                    inv2.setItem(11, new ItemStackUtil(Material.HOPPER).setName("Losuj").buildItem());
                    inv2.setItem(15, new ItemStackUtil(Material.RED_WOOL).setName("Wyjście").buildItem());
                    event.getWhoClicked().openInventory(inv2);
                    break;
                case 15:
                    event.getWhoClicked().closeInventory();
                    event.getWhoClicked().sendMessage("Anulowano");
                    break;
            }
            event.setCancelled(true);
            }
        else if (event.getRawSlot() == event.getSlot() && event.getView().getTitle().equals(ChatColor.DARK_GREEN + "Losowanie"))
        {
            switch (event.getSlot())
            {
                case 11:
                    event.getWhoClicked().sendMessage("Rozpoczęto losowanie");
                    break;
                case 15:
                    event.getWhoClicked().sendMessage("Przerwano losowanie");
                    event.getWhoClicked().closeInventory();
                    break;
            }
            event.setCancelled(true);
        }
    }

może tak zadziała to akurat moje próby robienia skrzynek do losowania itemów 

tylko musisz użyć innej formy dodania itemów bo ja wykorzystuje API

i główne gui jest w osobnym pliku co daje mi możliwość zastosowania:

Objects.requireNonNull(getCommand("gui")).setExecutor(new ShowGui());

w public void onEnable (odwołanie się komendy do pliku )

musisz pokombinować z tym i na pewno za działa 

a i właśnie jak masz dużo itemów w gui których nie mam sensu pisać ręcznie możesz użyć pętle for tylko po pętli musisz dodać miejsca bloków których chcesz mieć :


for(int x = 0; x <= 26; x++)
   {
         gui.setItem(x, whiteGlass);              
   }
         //np 
      gui.setItem(20, Vip);
      gui.setItem(21, Svip);
      gui.setItem(22, Sponsor);

i co do bloków to w zależności na jakiej wersji to robisz bo po 1.13 o ile się nie mylę można używać 

RED_STAINED_GLASS_PANE w samym gui.setItem

zamiast

ItemStack redGlass = new ItemStack(Material.STAINED_GLASS_PANE , 1, (byte) 14);

Próbowałem pozmieniac zgodnie z twoimi instrukcjami lecz dalej kicha wszysko dziala jak sie wpisuje komendy recznie a nie przez GUI

 

Chyba po prostu sie nie da

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...