Skocz do zawartości

patryk96

Użytkownik
  • Ilość zawartości

    17
  • Rejestracja

  • Ostatnia wizyta

  • Wygrane w rankingu

    2

Ostatnia wygrana patryk96 w dniu 7 lipca 2020

Użytkownicy przyznają patryk96 punkty reputacji!

Ostatnie wizyty

5208 wyświetleń profilu

Osiągnięcia patryk96

Początkujący I

Początkujący I (2/13)

14

Reputacja

  1. Witam wszystkich. W tym poradniku dowiesz się jak stworzyć minigrę typu SquidGame z etapmi gry. Nie będe tego ukrywał że cały pomysł wpadł mi do głowy oglądając ten serial. Chciałem napisać ten poradnik już dużo wcześniej ale jakoś mnie odrzucało od bukkita Poradnik jest samym szkieletem, jak zacząć tworzyć pluginy tego typu, brakuje tam dużo elementów np takich jak opuszczenie areny itd. Cały kod daję tutaj http://hostuje.net/file.php?id=163efc882f7b058689b96ee24e12b5fa a niżej postaram się wyjaśnić co robić i czego nie robić. Plik nie zawiera żadnych wirusów daje go na hostuje ponieważ mój github jest bardziej prywatny. Skan: https://www.virustotal.com/gui/file/991c0bd292fc3ce9ce5d832be605da139bc869c425550f07bcd90b39835b613f?nocache=1 Gra będzie polegała na dwóch etapach gry, w pierwszym musimy scraftować 5 przedmiotów. W drugim etapie musimy zabić pozostałych graczy. Gracze którzy wytrwają do końca wygrywają. Przyznam że kod nie jest najlepszy, ale w razie czego służę pomocą! Krok 1. - najpierw wypadałoby stworzyć klasę główną z jej statyczną instancją. public class ArenaPlugin extends JavaPlugin { @Getter private static ArenaPlugin arenaPlugin; @Override public void onEnable() { arenaPlugin = this; } @Override public void onDisable() { super.onDisable(); } } Krok 1.5. - utile nie ma co się rozwodzić nad ich tematem. public final class Utils { private Utils(){ } public static String color(String text){ return ChatColor.translateAlternateColorCodes('&', text); } public static boolean sendMessage(Player player, String text){ player.sendMessage(color(text)); return true; } } Krok 2. - obiekt areny w której będziemy przetrzymywać dane dotyczące areny. id - id areny. name - nazwa areny. time - czas który będzie aktywował poszczególne etapy areny. maxPlayers - maxymalna liczba graczy która może dołączyć do jednej areny. playersToStart - wymagana liczba graczy do rozpoczęcia areny. status - aktualny etap areny, Etapy gry utworzymy w kroku 3. locations - lokacje dla wybranych etapów gry. players - gracze uczestniczący w arenie. points - punkty, beda potrzebne w jednej z etapow gry. Dodatkowo funkcja getPs() która pobiera graczy uczestniczących w arenie, chyba nie muszę mówić że przechowywanie obiektu Player w obiekcie jest niebezpieczne. Oraz funkcja sendMessage() która będzie wysyłała wiadomość do graczy z areny. @Data public class Arena { private String id; private String name; private int time; private int maxPlayers; private int playersToStart; private Status status; private Map<Status, Location> locations; private List<UUID> players; private ConcurrentHashMap<UUID, Integer> points; public Arena(){ this.time = 10; this.status = Status.WAIT; this.locations = new HashMap<>(); this.players = new ArrayList<>(); this.points = new ConcurrentHashMap<>(); } public Arena(String id, String name, int maxPlayers, int playersToStart){ this.id = id; this.name = name; this.time = 10; this.maxPlayers = maxPlayers; this.playersToStart = playersToStart; this.status = Status.WAIT; this.locations = new HashMap<>(); this.players = new ArrayList<>(); this.points = new ConcurrentHashMap<>(); } public List<Player> getPs(){ List<Player> ps = new ArrayList<>(); for(UUID uuid : getPlayers()){ Player player = Bukkit.getPlayer(uuid); if(player == null) continue; ps.add(player); } return ps; } public void sendMessage(String msg){ for(Player player : getPs()){ Utils.sendMessage(player, msg); } } public Player getPlayer(UUID uuid){ return Bukkit.getPlayer(uuid); } } Krok 3. - etapy areny public enum Status { WAIT, COUNT, PRE_GAME1, GAME1, END_GAME1, PRE_GAME2, GAME2, END_GAME2, END; } Krok 4. - ArenaStorage - inaczej manager, będziemy tam przechowywać wszystkie areny. - zmienna ARENAS przechowuje arene w mapie. - funkcja load() tworzy arene - ja stworzyłem tylko jedną, tutaj uzupełniasz dane obiektu Arena - dodatkowo funkcja arenaFromPlayer() która pobiera arene na której jest gracz. - oraz funkcja arenaFromId() która pobiera arena z id, przyda się to później przy komendzie /arenajoin - dodaj ArenaStorage.load(); w onEnable. public class ArenaStorage { @Getter private static Map<String, Arena> ARENAS = new HashMap<>(); public static void load(){ Arena arena = new Arena(); arena.setId("1"); arena.setName("&6Arena 1"); arena.setMaxPlayers(10); arena.setPlayersToStart(2); Location l1 = new Location(Bukkit.getWorld("world"), 0, 5, 0); Location l2 = new Location(Bukkit.getWorld("world"), 50, 5, 0); Location l3 = new Location(Bukkit.getWorld("world"), 50, 5, 50); arena.getLocations().put(Status.WAIT, l1); arena.getLocations().put(Status.COUNT, l1); arena.getLocations().put(Status.PRE_GAME1, l2); arena.getLocations().put(Status.PRE_GAME2, l3); arena.getLocations().put(Status.END, Bukkit.getWorld("world").getSpawnLocation()); getARENAS().put(arena.getId(), arena); } public static Arena arenaFromPlayer(Player player){ for(Arena arena : getARENAS().values()){ if(arena.getPlayers().contains(player.getUniqueId())){ return arena; } } return null; } public static Arena arenaFromId(String id){ if(getARENAS().containsKey(id)){ return getARENAS().get(id); } return null; } } Krok 5. - stwórz interfejs ArenaWork public interface ArenaWork { void arena(Arena arena); } - stwórz klasę ArenaWorkManager w której będziemy przechowywać klasy wykonujące kod do danego etapu gry. - dodaj ArenaWorkManager.load(); w onEnable. @Getter private static Map<Status, ArenaWork> WORKS = new HashMap<>(); public static void load(){ //register(status, klasa()); } private static void register(Status status, ArenaWork arenaWork){ getWORKS().put(status, arenaWork); } Krok 6. - stworzenie taska który będzie wykonywał kod poszczególnych workerów w zależności od statusu areny. jak widać task sprawdza czy ArenaWork istnieje dla areny, jeśli istnieje wykonuje metode .arena(arena) z naszego workera. public class ArenaTask extends BukkitRunnable { @Override public void run() { for(Arena arena : ArenaStorage.getARENAS().values()){ Status status = arena.getStatus(); ArenaWork work = ArenaWorkManager.getWORKS().get(status); if(work == null) continue; work.arena(arena); } } } Krok 7. - tutaj dam tylko kilka workerów, reszte znajdziecie na hostuje. - pierwszy worker który będzie sprawdzał czy na arenie jest wymagana liczba graczy do startu, jesli tak to zmieni status areny na COUNT - odliczanie do startu. public class ArenaWaitWork implements ArenaWork { @Override public void arena(Arena arena) { if(arena.getPs().size() >= arena.getPlayersToStart()){ arena.setStatus(Status.COUNT); arena.setTime(10); arena.sendMessage("&6Arena wystartuje za: &6"+arena.getTime()+" sekund"); return; } } } - następnym workerem będzie odliczanie do startu. public class ArenaCountWork implements ArenaWork { @Override public void arena(Arena arena) { if(arena.getPs().size() < arena.getPlayersToStart()){ arena.sendMessage("&cOdliczanie do startu zostaje zatrzymane (Zbyt mała liczba graczy)!"); arena.setStatus(Status.WAIT); return; } arena.setTime(arena.getTime() - 1); if(arena.getTime() == 0){ arena.sendMessage("&aArena wystartowała!"); arena.setStatus(Status.PRE_GAME1); arena.setTime(10); for(Player player : arena.getPs()){ player.teleport(arena.getLocations().get(Status.PRE_GAME1)); } return; } int time = arena.getTime(); if(time == 10 || time <=3){ arena.sendMessage("&cArena wystartuje za: &6" + time + "sekund"); } } } - ostatni worker będzie resetował arene. public class ArenaEndWork implements ArenaWork { @Override public void arena(Arena arena) { if(arena.getTime() == 5){ arena.getPlayers().clear(); arena.getPoints().clear(); } arena.setTime(arena.getTime() - 1); if(arena.getTime() == 0){ arena.setStatus(Status.WAIT); arena.setTime(10); } } } Krok 8. - rejestracja workerów w ArenaWorkManager, tutaj przygotowałem już metode register() która zarejestruje nam te workery. public static void load(){ register(Status.WAIT, new ArenaWaitWork()); register(Status.COUNT, new ArenaCountWork()); register(Status.END, new ArenaEndWork()); register(Status.PRE_GAME1, new ArenaPreGameFirstWork()); register(Status.GAME1, new ArenaGameFirstWork()); register(Status.END_GAME1, new ArenaEndGameFirstWork()); register(Status.PRE_GAME2, new ArenaPreGameSecondWork()); register(Status.GAME2, new ArenaGameSecondWork()); register(Status.END_GAME2, new ArenaEndGameSecondWork()); } Krok 9. - listenery. - do pierwszego etapu gry: public class PlayerCraftListener implements Listener { @EventHandler public void onCraft(CraftItemEvent event){ Player player = (Player) event.getWhoClicked(); Arena arena = ArenaStorage.arenaFromPlayer(player); if(arena == null){ event.setCancelled(true); return; } if(arena.getStatus() != Status.GAME1){ event.setCancelled(true); return; } if(arena.getPoints().get(player.getUniqueId()) >= 5){ event.setCancelled(true); return; } if(event.getRecipe().getResult() != null) { arena.getPoints().put(player.getUniqueId(), (arena.getPoints().get(player.getUniqueId()) + 1)); Utils.sendMessage(player, "&cCraftowanie: &7"+arena.getPoints().get(player.getUniqueId())+"/5"); if(arena.getPoints().get(player.getUniqueId()) >= 5){ Utils.sendMessage(player, "&cZadanie ukonczone!"); return; } } } } - do drugiego etapu gry: public class PlayerDeathListener implements Listener { @EventHandler public void onDeath(EntityDamageByEntityEvent event){ if(event.getEntity() instanceof Player && event.getDamager() instanceof Player){ Player damager = (Player) event.getDamager(); Arena arena = ArenaStorage.arenaFromPlayer(damager); if(arena == null){ event.setCancelled(true); return; } if(arena.getStatus() != Status.GAME2){ event.setCancelled(true); return; } Player entity = (Player) event.getEntity(); double finalDamage = event.getFinalDamage(); if(finalDamage >= entity.getHealth()){ entity.getInventory().clear(); entity.getInventory().setArmorContents(null); event.setCancelled(true); entity.setHealth(20); Utils.sendMessage(entity, "&6Zostales wyeliminowany!"); arena.getPlayers().remove(entity.getUniqueId()); arena.sendMessage("&6Gracz: &7"+entity.getName()+" &6został wyeliminowany!"); entity.teleport(Bukkit.getWorld("world").getSpawnLocation()); } } } } Krok 10. - komenda którą bedziemy dołączać do areny. public class ArenaJoinCmd implements CommandExecutor { @Override public boolean onCommand(CommandSender sender, Command command, String s, String[] args) { Player player = (Player) sender; if(args.length == 0){ return Utils.sendMessage(player, "&cPodaj id areny!"); } if(ArenaStorage.arenaFromPlayer(player) != null){ return Utils.sendMessage(player, "&cJestes juz czlonkiem areny!"); } Arena arena = ArenaStorage.arenaFromId(args[0]); if(arena == null){ return Utils.sendMessage(player, "&cNie ma areny o takim id!"); } if(arena.getStatus() == Status.WAIT){ arena.getPlayers().add(player.getUniqueId()); player.teleport(arena.getLocations().get(arena.getStatus())); return false; } if(arena.getStatus() == Status.COUNT && arena.getPs().size() < arena.getMaxPlayers()){ arena.getPlayers().add(player.getUniqueId()); player.teleport(arena.getLocations().get(arena.getStatus())); return false; } return Utils.sendMessage(player, "&cArena juz wystartowala!"); } }
  2. Witam, tak jak w tytule. Oferuję: Rejestracja / Logowanie po stronie Klienta - wysyłanie danych do serwera i odsyłanie odpowiedzi do clienta. Weryfikacja konta e-mail (Kod wysyłany na maila w celu weryfikacji konta). Integracja z różnymi socialmediami. Sklep w twojej aplikacji. Ogólnie wszystko czego sobie zapragniesz Uprzedzam że nie tworzę gier. Front-End pozostaje dla Ciebie lecz mogę powiedzieć co gdzie i jak W celu kontaktu zapraszam na discorda: patryk96#9232 Pozdrawiam.
  3. Zapraszam na discorda, pierwszy plugin w fazie beta już na spigocie
  4. Dodaliśmy weryfikacje użytkownika / Akceptacje regulaminu
  5. Witam. Wraz z specem postanowiliśmy tworzyć pluginy do minecraft na spigotmc. Bedziemy tworzyć wtyczki premium jak i te no-premium. Serwer dopiero co powstał, dzisiaj planujemy jeszcze postawić naszego bota do zarządzania serwerem. Będziemy potrzebować osób do supportu władających językiem polskim oraz angielskim na poziomie średnio-zaawansowanym. Również potrzebujemy beta-testerów którzy będą testować nasze pliki. Tym rangom oferujemy darmowe pluginy czy inne wynagrodzenie. Na razie nie chcemy obiecywać pieniędzy ponieważ nie wiadomo jak to wyjdzie a wyjść na minus nie chcemy. Chcesz dołączyć do teamu i tworzyć pliki z nami? Wymagamy: Znajomość javy, bukkita jak i bungeecorda, chyba że ktoś chcesz robić coś innego grafike czy inne duperele, dla takich osób też znajdzie się miejsce. Zapraszam wszystkich chętnych na discorda: https://discord.gg/znJUpZH Oferujemy: - Brak spamu - Żadnych oznaczeń - Brak wyzwisk Pozdrawiam.
  6. @kerpson Widziałem już jak ludzie robią pluginy którę wysyłają/odbierają dane do serwerów przez mysql, większość z nich laguje serwer bo otwierają/zamykają połączenie co chwila. Lepszą opcją tak jak napisałeś będą kanały, wysyłamy treść a ona natychmiastowo jest odbierana następnie ją cachujemy. Już tłumaczę jak to dokładnie zrobić. Plugin bungee: 1. Rejestrujesz kanał np.: "namespace:getinfo" 2. Tworzysz event (PluginMessageEvent) a w nim - Sprawdzasz czy event.geTag to twój kanał. - Następnie pobierasz akcje i wiadomości, możesz to zrobić w ten sposób: String action = null; ArrayList<String> received = new ArrayList<>(); DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(event.getData())); try { action = dataInputStream.readUTF(); while (dataInputStream.available() > 0){ received.add(dataInputStream.readUTF()); } }catch (Exception exeption){ exeption.printStackTrace(); } - Sprawdzasz czy akcja to getRank z received[0] pobierasz nazwe serwera z received[1] pobierasz nick gracza Następnie wysyłasz wiadomość do serwera bukkit ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); try { dataOutputStream.writeUTF("get"); dataOutputStream.writeUTF(received.get(1)); //Tutaj już mysle ze wiadomo o co chodzi pobierasz usera z nicku a nastepnie pobierasz jego range dataOutputStream.writeUTF(UserManager(received.get(1)).getRank()); //Tutaj wyslyasz wiadomosc od serwera z received[0] getProxy().getServerInfo(received.get(0)).sendData("namespace:getinfo", byteArrayOutputStream.toByteArray()); } catch (IOException e) { e.printStackTrace(); } 3. Rejestrujesz listenery Bukkit 1. Rejestrujesz kanały. getServer().getMessenger().registerOutgoingPluginChannel( this, "namespace:getinfo"); getServer().getMessenger().registerIncomingPluginChannel( this, "namespace:getinfo", this); 2. Tworzysz mape w której bedziesz przechowywał 2 ciągi: Nick oraz range gracza 3. Implementujesz klase do PluginMessageListener. 4. Następnie uzupełniasz onPluginMessageReceived @Override public void onPluginMessageReceived(String s, Player player, byte[] bytes) { if(s.equalsIgnoreCase("namespace:getinfo")){ String action = null; ArrayList<String> received = new ArrayList<>(); DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); try { action = dataInputStream.readUTF(); while (dataInputStream.available() > 0){ received.add(dataInputStream.readUTF()); } }catch (Exception exeption){ exeption.printStackTrace(); } if(action.equalsIgnoreCase("get")){ String playername = received.get(0); String rank = received.get(1); map.put(playername, rank); } } } Następnie możesz zrobić taska który aktualzuję mape: ByteArrayDataOutput out = ByteStreams.newDataOutput(); out.writeUTF("getRank"); out.writeUTF("main"); //TUTAJ DAJESZ NAZWE SWOJEGO SERWERA out.writeUTF(player.getName()); player.sendPluginMessage(this, "namespace:getinfo", out.toByteArray()); Jest to chyba najlepsza i najbardziej optymalna opcja!
  7. patryk96

    ColorHexAPI 1.16

    Witam, wszystkich w 1.16 został dodany nowy system kolorowanie(hex). Postanowiłem napisać proste api dzięki któremu kody hexowe zamienimy na proste znaki typu $b, $c etc. Jak to działa? Dodajesz api do swojego projektu lub wklejasz klase. Natępnie pobierasz klasę ColorAPI i używasz: colour(message). Wszystkie kolorki możesz dodać do configu: colors: orange_gray: replace: "$og" to: "#ffd700" blue_light: replace: "$bl" to: "#0ba0e3" pink_light: replace: "$pl" to: "#ff9bdc" green_light: replace: "$gl" to: "#81f67d" brown: replace: "$b" to: "#c1442e" cyan: replace: "$c" to: "#3d515c" Source code/Skan: http://hostuje.net/file.php?id=dff03657748ba9d0fde843eeb5f0189a Jar/Skan: http://hostuje.net/file.php?id=196d4284902d12b5aa75c5305e700579
  8. Niestety nic nigdy nie udostępniałem, na githubie nie mam nic. Pierwszy plugin dla @LeKuLa wykonany.
  9. A może nawet go sprzedać prezydentowi. Prawa autorskie od projektu trafiają do klienta tak samo jak kod źródłowy, ale to chyba oczywiste.
  10. Witam. Napiszę pluginy na zlecenie. O mnie: Nazywam się Patryk mam 24 lat. Do kodowania w bukkicie wróciłem po długiej przerwie. Ostatnio przez pewien okres czasu poznawałem nowe techniki, systemy nowych wersji bukkita. Dawniej moją główną inspiracją w projektach były pluginy XieRipa, którego serdecznie pozdrawiam, trzymaj się stary. Stały gracz TopHarda, Ender-chesta <3. Teraz zamierzam trochę popracować, aby mój nick, moje nazwisko było bardziej rozpoznawalne. Oferuję: Napisanie jakiegokolwiek pluginu pod Bukkit/Bungeecord. Napisanie aplikacji JavaFX. Integracja z socialmediami w twoim projekcie: Youtube, Facebook, Twich, Discord, TeamSpeak i wiele innych każde, które ma przyzwoite api pod jave. Edycja twoich plików. Optymalizacja twojego pluginu. Usunięcie tzw. Backdoorów. Szybką realizację zlecenia. Przejrzysty kod. Konfiguracja VPS/dedyka. Bardzo niska cena (grosze), aby zachęcić potencjalnych klientów do siebie :). Oczekuję: Stałego Kontaktu. Dojrzałości (przynajmniej w zachowaniu) Co do bazy danych preferuję MongoDB/Redis, lecz klasyka SQL też damy radę ogarnąć bez żadnego problemu. To już zależy od Ciebie, jedynie mogę Ciebie namówić że bazy SQl to przeszłość. Po zakupie projektu, otrzymujesz do niego pełne prawa, możesz robić z nim co chcesz. Kontakt: Discord: patryk96#9232 Zapraszam do dyskusjI!
  11. Jesteś pewny że ten adres a raczej port jest taki sam jak na serwerze lobby w pliku server.properties?
  12. Spróbuj jeszcze raz ten sam kod bo dodawałem poprawkę po chwili jeśli nadal bedzię wywalało wyślij błąd.
  13. Po pierwsze musisz postawić dwie skrzynki: Block b1 = loc.getBlock(); Block b2 = loc.clone().add(0,0,-1).getBlock(); b1.setType(Material.CHEST); b2.setType(Material.CHEST); Następnie musisz pobrać BlockDate tych bloków ustawić aby patrzyły się w jedno miejsce i ustawić typ skrzynki: BlockData data1 = b1.getBlockData(); ((Directional) data1).setFacing(BlockFace.EAST); b1.setBlockData(data1); org.bukkit.block.data.type.Chest chestData1 = (org.bukkit.block.data.type.Chest) data1; chestData1.setType(org.bukkit.block.data.type.Chest.Type.RIGHT); b1.setBlockData(chestData1); BlockData data2 = b2.getBlockData(); ((Directional) data2).setFacing(BlockFace.EAST); b2.setBlockData(data2); org.bukkit.block.data.type.Chest chestData2 = (org.bukkit.block.data.type.Chest) data2; chestData2.setType(org.bukkit.block.data.type.Chest.Type.LEFT); b2.setBlockData(chestData2); I teraz pobierasz chest i dodajesz tam itemki: Chest chest = (Chest) b1.getState(); chest.getInventory().setContents(items); Pisane na szybko gdyby był jakiś błąd daj znać
  14. Tak jak @Peridot napisał musisz castować do Chest. Przedmioty dodajesz do Chest nie do DoubleChest
  15. Witam, wszystkich w tym poradniku dowiesz się jak stworzyć plugin, który będzie wyświetlał ilość graczy z naszego serwera na kanale Discord. Zaczynajmy! Krok 1. Stworzenie serwera discord. Klikamy plusik na pasku serwerów po lewej stronie naszego discorda następnie klikamy "Stwórz serwer" wpisujemy nazwe serwer i klikamy przycisk Stwórz. Krok 2. Stworzenie kanału głosowego. Kanał głosowy tworzymy dlatego, iż w kanałach tekstowych nie możemy używać spacji, a wygląd kanału "online-0" jest niezbyt profesjonalny. Kanał możemy już nazwać nazwą "Online: 0". Krok 3. Stworzenie aplikacji Discord oraz bota. Przejdź na stronę https://discord.com/developers/applications zaloguj się następnie przejdź do zakładki Applications i w prawym górnym rogu kliknij przycisk New Application wpisz nazwę aplikacji np.: minecraft i klikamy przycisk Create. Teraz przejdź do zakładki Bot i klikamy przycisk Add bot po prawo. Bot został stworzony. Krok 4. Zaproszenie bota na nasz serwer discord. Przechodzimy do zakładki OAuth2 w SCOPES zaznaczamy bot, w BOT_PERMISSIONS Admininistrator kopiujemy link i wklejamy go w nową kartę w przeglądarce wybieramy serwer i dołączamy do niego. Szczegółowo jest to opisane tutaj: https://discordpy.readthedocs.io/en/latest/discord.html#inviting-your-bot. Bot jest już na naszym serwerze teraz przejdźmy do pisania wtyczki pod serwer. Do stworzenia wtyczki będziemy potrzebowali api discorda my użyjemy JDA (Java Discord API). Aktualizować nazwę kanału możemy 2 razy na 10 minut, więc aktualizowanie nazwy kanału zrobimy w tasku co 6 minut. Repozytoria maven: Spigot: https://www.spigotmc.org/wiki/spigot-maven/. JDA (Java Discord API) https://github.com/DV8FromTheWorld/JDA. Teraz zaczniemy tworzyć wtyczkę. 1. Stwórz klasę główną z jej statyczną instancją. import org.bukkit.plugin.java.JavaPlugin; public class DiscordPlugin extends JavaPlugin { private static DiscordPlugin discordPlugin; @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); } public static DiscordPlugin getDiscordPlugin() { return discordPlugin; } } 2. Stwórz klasę Bot w której uruchomimy bota. import net.dv8tion.jda.api.JDA; import net.dv8tion.jda.api.JDABuilder; import javax.security.auth.login.LoginException; public class Bot { private JDA jda; //Tworzymy voida z zmienną String która będzie przechowywała token. public Bot(String token){ try { jda = new JDABuilder(token).build(); } catch (LoginException e) { e.printStackTrace(); } } public JDA getJda() { return jda; } } 3. Tworzymy zmienną long o nazwie channelOnlineID, do której przypisujemy ID kanału, w którym chcemy zmienić nazwę. Aby otrzymać ID kanału kliknij PPM na kanał i z samego dołu wybierz: Kopiuj ID. import org.bukkit.plugin.java.JavaPlugin; public class DiscordPlugin extends JavaPlugin { private static DiscordPlugin discordPlugin; private long channelOnlineID; private Bot bot; @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); //Token który odbierasz na stronie discord developer w zakładce bot this.bot = new Bot("NzI1MDkzNDc5MjIyMzQ1ODUy.XvdcVw.3NxaTmfIKYr6fsPnxOuaW2ZwFBg"); //ID kanału na którym nazwa ma być odświeżana this.channelOnlineID = 724920522042900533l; } public static DiscordPlugin getDiscordPlugin() { return discordPlugin; } public Bot getBot() { return bot; } public long getChannelOnlineID() { return channelOnlineID; } } 4. Tworzenie taska. import org.bukkit.Bukkit; import org.bukkit.scheduler.BukkitRunnable; public class Task extends BukkitRunnable { @Override public void run() { DiscordPlugin .getDiscordPlugin() .getBot() .getJda() .getVoiceChannelById(DiscordPlugin.getDiscordPlugin().getChannelOnlineID()) .getManager() .setName("Online: "+ Bukkit.getOnlinePlayers().size()) .queue(); } } 5. Rejestracja taska. Ja taska zarejestrowałem co 6 min, bo wiadomo na styk nie wszystko jest dobre. @Override public void onEnable(){ discordPlugin = new DiscordPlugin(); this.bot = new Bot("NzI1MDkzNDc5MjIyMzQ1ODUy.XvdcVw.3NfaTmBIKYr6fsPnxOuaW2ZwFBg"); this.channelOnlineID = 724920522042900533l; //Rejestracja taska new Task().runTaskTimerAsynchronously(this, ((60*20L)*6), ((60*20L)*6)); } Stwórz plugin.yml, a następnie zbuduj plugin i wgraj go na serwer. Dziękuję za obejrzenie całego poradnika. W razie problemów proszę pisać tutaj chętnie pomogę. Czekam na jakieś propozycje do innych poradników.
×
×
  • Dodaj nową pozycję...