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

[Inne] Java Bukkit plugin- Problemy z pisaniem pluginów? Pisz!


Rekomendowane odpowiedzi

Opublikowano

Witam, założyłem ten temat, aby pomagać nowym programistom. Zaczynasz przygodę z programowaniem w javie? Jestem w stanie pomóc. Sam wiem, że z początkami różnie bywa. Czasem jest banalny, ale nie potrafimy go rozwiązać. Napisz!

Co do nauki od zera polecam tut:


Czyli czekam na pierwsze problemy  :)

 

 

Poniżej będę zapisywał pytania na które zostały już udzielone odpowiedzi, aby nie było zbędnego spamu.
 

 

 

 

 

 

FAQ:

1. Event nie działa. Tak jakby plugin go nie widział.
     Odp.: Najczęściej jest to wina braku zaimplementowania Listenera:   

public class Main extends JavaPlugin implements Listener{

     Myślę, że już wiadomo o co chodzi, ale jest też drugi sprawca tego błędu: brak zarejestrowania eventu:

@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(this, this);
}

     Czyli w onEnable(), należy dodać coś takiego. Gdybyśmy chcieli zarejestrować event znajdujący się w innej klasie, należy zarejestrować tak:

Bukkit.getPluginManager().registerEvents(new KlasaZEventem(), this);

     Lecz należy pamiętać o zaimplementowaniu Listenera w owej klasie.

 

 

2. Jak stworzyć scoreboard (tablice wyników)?

ScoreboardManager manager = Bukkit.getScoreboardManager(); //Pobieranie managera
Scoreboard board = manager.getNewScoreboard(); //tworzenie nowej tablicy
Objective objective = board.registerNewObjective("test", "dummy"); //cel tablicy
objective.setDisplaySlot(DisplaySlot.SIDEBAR); //miejsce wyświetlania
objective.setDisplayName("mc.CraftGames.pl"); //wyswietlana nazwa
Score monety = objective.getScore(Bukkit.getOfflinePlayer("Monety:")); //fake player dla wyświetlania np.Monet
monety.setScore(1); //ustawianie monet
player.setScoreboard(board); //wyswietlanie tablicy dla gracza

 Wyjaśnione!

 

3. Jak stworzyć fake inventory? Na np.: menu.

//Tworzymy nowe inventory;
//właściciel- gdy chcemy, aby każdy mógł otwierać dajemy "null";
//sloty- ilość slotów w eq. Liczba musi być wielokrotnością liczby 9, czyli 9,18,27,36;
//nazwa- String wyświetlany jako nazwa inv. Nie można używać ChatColor;

Inventory inv = Bukkit.createInventory(właściciel, sloty, nazwa);

//Tworzymy nowy item, np.: diament;
//Material.DIAMOND- należy podać Material., nie id. Aby podać id: Material.getMaterial(id)

ItemStack diament = new ItemStack(Material.DIAMOND);
//itemem można dowolnie manipulować. 

//Dodajemy do inv nasz ItemStack
//Tu istnieją 2 funkcje:
inv.addItem(diament); //Dodaje w pierwsze możliwe miejsce, jeśli może to stackuje
inv.set(slot, diament) //Dodaje w wybrane miejsce(slot)

//Teraz wystarczy wyświetlić graczowi nasz inv
player.openInventory(inv); 
  • Odpowiedzi 52
  • Dodano
  • Ostatniej odpowiedzi
Opublikowano

Problem z menu inventory stworzyłem 2 inventory w którym np jest Teleportuj na spawn itd...

i problem jest w tym gdy już 1 stworzyłem i wszystko pięknie ładnie działa, ale chodzi mi o drugie iż nie mogę go zamknąć wyjaśnienie:

mam menu serwerowe :

druzyny obok ekipa itp itp

klikam na itemek druzyna

otwiera mi się nowe okno

i jak w tym nowym oknie wybieram to nie chce mi zamknąć... i po prostu mogę sobie brać itemy do eq.. ;(

komendy

player.closeinventory() nie działają...

fragment:

 

      if (inv2.getName().equals(this.inv2.getName())){
        String name4 = (ChatColor.GREEN + "Druzyna");
        if ((clicked.getType() == Material.DIAMOND_SWORD) && (clicked.getItemMeta().getDisplayName().equals(name4))){
            Bukkit.dispatchCommand(player, "niebieski");
            player.openInventory(this.inv3);
Opublikowano

Jak zrobić menu w który w 2 linice będą areny na które idzie wejść, a 3 ostatnie linie będą to areny na których trwa już rozgrywka. Coś ala mineplex lub craftgames

 

Opublikowano

Jak zrobić menu w który w 2 linice będą areny na które idzie wejść, a 3 ostatnie linie będą to areny na których trwa już rozgrywka. Coś ala mineplex lub craftgames

Ale przez inventory? Tworzysz inv:

Inventory inv = Bukkit.createInventory(null, 36, "Wybierz serwer");

I dodajesz do w dane miejsca przedmioty:

inv.setItem(slot, ItemStack);

I później w evencie("InventoryClickEvent") klikania sprawdzasz i wykonujesz akcje.

Opublikowano

@UP

Bo musisz anulować wydarzenie (event) InventoryClickEvent, wtedy nie będzie dało się przenosić przy użyciu myszki.

 

Przykład:

@EventHandler
public void handle(InventoryClickEvent event) {
    event.setCancelled(true);
}

Nie jesteś pewien czy to na pewno metoda setCancelled, ale chyba tak.

 

Dodatkowo dodaj player.closeInventory(), a jeśli nie działa - to dodaj dwa razy (prawdopodobnie nie zamykasz poprzedniego, a Bukkit nie nadpisuje ich)

Opublikowano

@up Nic nie działa, to tak jakby ten plugin nie widział tej metody aby kliknąć na ten miecz, wszystko działa nazwa itp... jest ale jak kliknę to nic mogę sobie ten miecz brać do eq !:

FRAGMENT:

 

        String name = (ChatColor.BLUE + "Druzyny-Serwerowe");
        if ( (clicked.getType() == Material.MONSTER_EGG) && (clicked.getItemMeta().getDisplayName().equals(name))) {
            player.openInventory(this.inv2);
            event.setCancelled(true);
        }
      }
            if (inv2.getName().equals(this.inv2.getName())){
            String name4 = (ChatColor.GREEN + "Niebiescy");
            if ((clicked.getType() == Material.DIAMOND_SWORD) && (clicked.getItemMeta().getDisplayName().equals(name4))){
            Bukkit.dispatchCommand(player, "niebieski");
            player.getOpenInventory().close();
            event.setCancelled(false);
Opublikowano

@UP

Najlepszym sposobem na sprawdzenie czy działa to poprawnie to wyświetlenie jakiejkolwiek wiadomości "po kliknięciu itemka", jeśli się nie wyświetli - to masz pewność przynajmniej że napisałeś coś źle i musisz sprawdzić kod ponownie.

 

BTW.

String name = (ChatColor.BLUE + "Druzyny-Serwerowe");

Po co te nawiasy?

Opublikowano

@up bez nawiasów nie działa :D

 

przynajmniej mi xD

no właśnie mi o to chodzi że nawet wiadomość nie chcę się wyświetlić...

sprawdzałem 100 razy ! kompilowałem po 5 i każdy inaczej i nic ;(

Opublikowano

@UP

Pokaż kod (lub wyślij mi na PW jeśli nie chcesz pokazywać publicznie), to sprawdzę czy na pewno nie ma błędów ;)

Opublikowano
 

 

@up Nic nie działa, to tak jakby ten plugin nie widział tej metody aby kliknąć na ten miecz, wszystko działa nazwa itp... jest ale jak kliknę to nic mogę sobie ten miecz brać do eq !:

 

A czy zarejestrowałeś event? 

public class Main extends JavaPlugin implements Listener{

@Override
public void onEnable(){
Bukkit.getPluginManager().registerEvents(this, this);
}

@EventHandler
public void event(JakisTamEvent ev){

}
}

Czyli musisz dać "implements Listener", oraz zarejestrować go w onEnable(). Gdy event jest w innej klasie to w onEnable() rejestrujesz tak:

Bukkit.getPluginManager().registerEvents(new KlasaZEventem(), this);
Opublikowano

Ale mi chodzi żeby się automatycznie aktualizowało to menu, tak jak na mc.craftgames.pl !

Sprawdziłem, znalazłem takie rozwiązania:

  • Przy zmianie(wejscie gracza, wyjście czy coś) wywołuje funkcje inventory;
  • Lub co 1sek wywołuje funkcję inventory; 

Obie funkcje są dobre, ale na lepsze serwery polecam tą drugą.

Opublikowano

Mógłbyś mi napisać to jak by to wyglądało. 

To przkładowy kod:

public class PlayerListener implements Listener {

    @EventHandler
    public void onPlayerJoin(PlayerJoinEvent event) {
        PlayerController.get().register(event.getPlayer());
    }

    @EventHandler
    public void onPlayerQuit(PlayerQuitEvent event) {
        Player player = event.getPlayer();
        GamePlayer gamePlayer = PlayerController.get().get(player);

        if (gamePlayer.isPlaying()) {
            gamePlayer.getGame().onPlayerLeave(gamePlayer);
        }

        gamePlayer.save();
        PlayerController.get().unregister(player);
    }

    @EventHandler
    public void onPlayerRespawn(PlayerRespawnEvent event) {
        Player player = event.getPlayer();
        final GamePlayer gamePlayer = PlayerController.get().get(player);

        if (gamePlayer.isPlaying()) {
            event.setRespawnLocation(PluginConfig.getLobbySpawn());

            if (PluginConfig.saveInventory()) {
                Bukkit.getScheduler().runTaskLater(SkyWars.get(), new Runnable() {
                    @Override
                    public void run() {
                        gamePlayer.restoreState();
                    }
                }, 1L);
            }
        }
    }

    @EventHandler
    public void onPlayerInteract(PlayerInteractEvent event) {
        Player player = event.getPlayer();
        GamePlayer gamePlayer = PlayerController.get().get(player);

        if (event.getAction() == Action.PHYSICAL && event.getClickedBlock().getTypeId() == Material.STONE_PLATE.getId()) {
            if (!gamePlayer.isPlaying() && player.getLocation().getWorld().equals(PluginConfig.getLobbySpawn().getWorld())) {
                if (SchematicController.get().size() == 0) {
                    player.sendMessage(new Messaging.MessageFormatter().format("error.no-schematics"));
                    return;
                }

                Game game = GameController.get().findEmpty();
                game.onPlayerJoin(gamePlayer);
            }

            return;
        }

        if (gamePlayer.isPlaying() && gamePlayer.getGame().getState() != GameState.PLAYING) {
            event.setCancelled(true);
        }
    }

    @EventHandler
    public void onPlayerChat(AsyncPlayerChatEvent event) {
        Player player = event.getPlayer();
        GamePlayer gamePlayer = PlayerController.get().get(player);

        if (PluginConfig.chatHandledByOtherPlugin()) {
            event.setFormat(event.getFormat().replace("[score]", String.valueOf(gamePlayer.getScore())));

            if (gamePlayer.isPlaying()) {
                for (Iterator<Player> iterator = event.getRecipients().iterator(); iterator.hasNext() {
                    GamePlayer gp = PlayerController.get().get(iterator.next());

                    if (!gp.isPlaying() || !gp.getGame().equals(gamePlayer.getGame())) {
                        iterator.remove();
                    }
                }

            } else {
                for (Iterator<Player> iterator = event.getRecipients().iterator(); iterator.hasNext() {
                    GamePlayer gp = PlayerController.get().get(iterator.next());

                    if (gp.isPlaying()) {
                        iterator.remove();
                    }
                }
            }

            return;
        }

        String message = new Messaging.MessageFormatter()
                .setVariable("score", StringUtils.formatScore(gamePlayer.getScore()))
                .setVariable("player", player.getDisplayName())
                .setVariable("message", Messaging.stripColor(event.getMessage()))
                .setVariable("prefix", SkyWars.getChat().getPlayerPrefix(player))
                .format("chat.local");

        event.setCancelled(true);

        if (gamePlayer.isPlaying()) {
            gamePlayer.getGame().sendMessage(message);

        } else {
            for (GamePlayer gp : PlayerController.get().getAll()) {
                if (!gp.isPlaying()) {
                    gp.getBukkitPlayer().sendMessage(message);
                }
            }
        }
    }

    @EventHandler
    public void onPlayerCommand(PlayerCommandPreprocessEvent event) {
        Player player = event.getPlayer();
        GamePlayer gamePlayer = PlayerController.get().get(player);

        if (gamePlayer.isPlaying()) {
            String command = event.getMessage().split(" ")[0].toLowerCase();

            if (!command.equals("/sw") && !PluginConfig.isCommandWhitelisted(command)) {
                event.setCancelled(true);
                player.sendMessage( new Messaging.MessageFormatter().withPrefix().format("error.cmd-disabled"));
            }
        }
    }
}

I przerób mi to tak jak ty to widzisz .

 

Kod z: https://github.com/Wietje/SkyWars/blob/master/src/main/java/vc/pvp/skywars/listeners/PlayerListener.java

Opublikowano

To jest temat do pomocy, a nie do robienia pracy za kogoś.

Mogę wskazać ci tylko drzwi. Sam musisz przez nie przejść.

 

Stwórz sobie funkcję do wyświetlania eq i pracuj na evencie: PlayerInteractEvent

Przy zmianie wywołuj dla gracza funkcje eq, dzięki czemu będziesz miał swoją aktualizację.

Opublikowano


ScoreboardManager manager = Bukkit.getScoreboardManager(); //Pobieranie managera

Scoreboard board = manager.getNewScoreboard(); //tworzenie nowej tablicy

Objective objective = board.registerNewObjective("test", "dummy"); //cel tablicy

objective.setDisplaySlot(DisplaySlot.SIDEBAR); //miejsce wyświetlania

objective.setDisplayName("mc.CraftGames.pl"); //wyswietlana nazwa

Score monety = objective.getScore(Bukkit.getOfflinePlayer("Monety:")); //fake player dla wyświetlania np.Monet

monety.setScore(1); //ustawianie monet

player.setScoreboard(board); //wyswietlanie tablicy dla gracza

Opublikowano
ScoreboardManager manager = Bukkit.getScoreboardManager(); //Pobieranie managera
Scoreboard board = manager.getNewScoreboard(); //tworzenie nowej tablicy
Objective objective = board.registerNewObjective("test", "dummy"); //cel tablicy
objective.setDisplaySlot(DisplaySlot.SIDEBAR); //miejsce wyświetlania
objective.setDisplayName("mc.CraftGames.pl"); //wyswietlana nazwa
Score monety = objective.getScore(Bukkit.getOfflinePlayer("Monety:")); //fake player dla wyświetlania np.Monet
monety.setScore(1); //ustawianie monet
player.setScoreboard(board); //wyswietlanie tablicy dla gracza

Robienie tego za pomocą API CB to lipny pomysł :<

Lepiej użyc packetów a najwygodniej ProtocolLib lub jakiejś innej bilbioteczki

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Opublikowano

Gdybym miał tłumaczyć, jak używać biblioteki to...
Chodzi o proste wytłumaczenie dla nauki. Myślę, że najpierw należy poznać podstawy CB, zanim zabierzemy się za zaawansowane biblioteki. 

Opublikowano

Gdybym miał tłumaczyć, jak używać biblioteki to...

Chodzi o proste wytłumaczenie dla nauki. Myślę, że najpierw należy poznać podstawy CB, zanim zabierzemy się za zaawansowane biblioteki. 

ProtocolLib jest prostą biblioteką, Tylko strasznie wygląda :>

 

Trduniej ogarnąc API skripta :D

 

@emkalion

nie wyczyszczą, to nupy są :<

To już jest koniec smerfa:


http://www.mpcforum.pl/topic/1323530-info-znikam/


GG: 48522543


PS: Na innych forach i stronach znajdziesz mnie pod nickiem: 


BukkitSmerf

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...