patryk96 14 Opublikowano 26 czerwca 2020 Udostępnij Opublikowano 26 czerwca 2020 (edytowane) Witam wszystkich bardzo serdecznie! W tym poradniku przedstawię wam jak tworzyć polecenia pod bungeecord do komunikacji między serwerem proxy a serwerami bukkit. Bungeecord oferuje wysyłanie danych między serwerami więc polecenie typu /gtp <nick> które teleportuję gracza na inny serwer w jego dokładną lokalizację jest możliwe. Wszystko działa na zasadzie kanałów tzw. "Plugin Messaging Channel" które tworzymy w wtyczce pod bungeecord oraz bukkit. A następnie wysyłamy treść do serwera bukkit. Następnie na serwerze bukkit odbieramy ową treść i wykonujemy ją. Repozytoria maven: Bungeecord: https://www.spigotmc.org/wiki/create-your-first-bungeecord-plugin-proxy-spigotmc/ Spigot: https://www.spigotmc.org/wiki/spigot-maven/ Dla przykładu nazwiemy wtyczke: BungeeTolls Najlepiej jest stworzyć 1 projekt w którym będzie wtyczka pod bungeecord jak i pod bukkita. Już tłumaczę jak to zrobić. Tworzymy dwa package np.: me.patryk.bungetolls.bungee, me.patryk.bungetolls.bukkit. Następnie tworzymy klasy głowne np.: MainBungee, MainBukkit. Pamiętaj klasę MainBungee rozszerzasz o Plugin(net.md_5.bungee.api.plugin.Plugin) natomiast klasę MainBukkit o JavaPlugin(org.bukkit.plugin.java.JavaPlugin) Bungeecord: Klasa MainBungee import net.md_5.bungee.api.plugin.Plugin; public class MainBungee extends Plugin { private static MainBungee bungeePlugin; @Override public void onEnable(){ //Tworzenie instancji klasy głównej bungeePlugin = this; } public static MainBungee bungeePlugin(){ return bungeePlugin; } } Teraz możemy się zająć tworzeniem kanału dla bungeecord stwórz nową klasę o nazwie TeleportChannel. import net.md_5.bungee.api.plugin.Plugin; public class TeleportChannel { //Nazwa kanału private String channel; public TeleportChannel(Plugin plugin){ //Ustawienie nazwy kanału channel = "namespace:tp"; //Rejestracja kanału plugin.getProxy().registerChannel(channel); } //Pobieranie nazwy kanału public String getChannel() { return channel; } } Kanał został stworzony ma on nazwę "namespace:tp" Teraz w klasie MainBungee tworzymy instancję klasy TeleportChannel. //Instancja klasy TeleportChannel private static TeleportChannel teleportChannel; @Override public void onEnable(){ bungeePlugin = this; //Instancja klasy TeleportChannel teleportChannel = new TeleportChannel(this); } //Pobieranie klasy TeleportChannel public static TeleportChannel getTeleportChannel() { return teleportChannel; } Następnie musimy stworzyć funkcje które będą wysyłały informacje do serwera bukkit. public class TeleportChannel { //Nazwa kanału private String channel; public TeleportChannel(Plugin plugin){ //Ustawienie nazwy kanału channel = "namespace:tp"; //Rejestracja kanału plugin.getProxy().registerChannel(channel); } //Przenoszenie gracza na drugi server //Pobieramy serwery obu graczy sprawdzamy czy są takie same jeśli nie wysyłamy gracza player na server2 public void sendServer(ProxiedPlayer player, ProxiedPlayer other){ ServerInfo server1 = player.getServer().getInfo(); ServerInfo server2 = other.getServer().getInfo(); if(!server1.equals(server2)){ player.connect(server2); } } //Tutaj wysyłamy wiadomość do serwera bukkit public void teleport(ProxiedPlayer player, ProxiedPlayer other){ //Przesyłanie gracza na inny serwer sendServer(player, other); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); DataOutputStream dataOutputStream = new DataOutputStream(byteArrayOutputStream); try { //Tutaj wpisujemy dane które mają zostać odebrane przez serwer bukkit //Dane wpisujemy przez writeUTF() //Pierwsze linijka jako prześlemy to akcja(nazwałem ją "teleport:to:player") //Druga linijka to nick gracza który chce się teleportować a trzecie linijka to nick gracza do którego się teleportujemy //Następnie wysyłamy treść graczowi other aby mógł ją odebrać dataOutputStream.writeUTF("teleport:to:player"); dataOutputStream.writeUTF(player.getName()); dataOutputStream.writeUTF(other.getName()); other.getServer().getInfo().sendData(channel, byteArrayOutputStream.toByteArray()); } catch (IOException e) { e.printStackTrace(); } } // //Pobieranie nazwy kanału public String getChannel() { return channel; } } Teraz możemy stworzyć komende /gtp. Polecenie tworzymy dla bungee nie dla bukkita. import net.md_5.bungee.api.CommandSender; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.plugin.Command; import org.bukkit.ChatColor; //rozszerzamy o Command //Następnie eksportuje i implementujemy metody public class TeleportCommand extends Command { public TeleportCommand() { //Tutaj w super() wpisujemy nazwę polecenia super("gtp"); } @Override public void execute(CommandSender sender, String[] args) { //Sprawdzanie czy gracz podał nick if(args.length <1){ sender.sendMessage(new TextComponent(ChatColor.RED + "Podaj nick gracza")); return; } //Pobieranie ProxiedPlayer z argumentu 0 ProxiedPlayer other = MainBungee.getBungeePlugin().getProxy().getPlayer(args[0]); //Sprawdzanie czy gracz z argumentu jest online if(other == null){ sender.sendMessage(new TextComponent(ChatColor.RED + "Podany gracz jest offline")); return; } //Pobieranie gracza który użył polecenia ProxiedPlayer player = (ProxiedPlayer) sender; //Sprawdzanie czy player to other if(player.equals(other)){ sender.sendMessage(new TextComponent(ChatColor.RED + "Nie możesz teleportować się do siebie")); return; } //Wysyłanie treści do serwera bukkit MainBungee.getTeleportChannel().teleport(player, other); //Wysyłanie wiadomości do gracza który użył polecenia sender.sendMessage(new TextComponent(ChatColor.RED + "Zostałeś przeteleportowany do gracza: " + ChatColor.GOLD + other.getName())); } } Komenda została stworzona. Teraz trzeba ją zarejestrować w funkcji onEnable() w MainBungee. getProxy().getPluginManager().registerCommand(this, new TeleportCommand()); @Override public void onEnable(){ bungeePlugin = this; teleportChannel = new TeleportChannel(this); //Komende rejestrujemy w PluginManager getProxy().getPluginManager().registerCommand(this, new TeleportCommand()); } Bukkit: Wszystko co mieliśmy zrobić na bungee zrobione. Teraz przejdźmy do klasy MainBukkit musimy zaimplementować klase do PluginMessageListener a następnie zaimplementować metody. Powinieneś uzyskać taki efekt. public class MainBukkit extends JavaPlugin implements PluginMessageListener { @Override public void onEnable(){ } @Override public void onPluginMessageReceived(String s, Player player, byte[] bytes) { } } Teraz musimy zarejestrować kanały. @Override public void onEnable(){ //Rejestracja kanłu towarzyszącego Bukkit.getMessenger().registerOutgoingPluginChannel(this, "namespace:tp"); //Rejestracja kanału przychodzącego Bukkit.getMessenger().registerIncomingPluginChannel(this, "namespace:tp", this); } Kanały zarejestrowane został nam przedostatni krok (odbieranie wiadomości z proxy) Sprawdzamy czy kanał to "namespace:tp" oraz czy akcja to "teleport:to:player" jeśli wszystko się zgadza teleportujemy admin do other. @Override public void onPluginMessageReceived(String channel, Player player, byte[] bytes) { //Sprawdzamy czy otrzymana wiadomość jest z kanału "namespace:tp" if (channel.equals("namespace:tp")) { //Tutaj tworzymy akcje String action = null; //Lista Stringów do której dodamy nick gracza oraz nick drugiego gracza List<String> received = Lists.newArrayList(); DataInputStream dataInputStream = new DataInputStream(new ByteArrayInputStream(bytes)); try { //Ustawiamy akcje action = dataInputStream.readUTF(); //Następnie dodajemy do received pozostałe wiadomości while (dataInputStream.available() > 0) { received.add(dataInputStream.readUTF()); } } catch (Exception exeption) { exeption.printStackTrace(); } //Sprawdzamy czy akcja nie jest == null, i ma nazwę "teleport:to:player" if (action != null && action.equals("teleport:to:player")) { //Z received pobiermy graczy admin - gracz teleportujący się, jest w liście na pierwszym miejscu, other - gracz do którego się teleportujemy na drugim miejscu Player admin = Bukkit.getPlayer(received.get(0)); Player other = Bukkit.getPlayer(received.get(1)); //Tworzymy taska o odstępie czasowym 1/20 sekundy aby gracz zdążył przenieść się na serwer new BukkitRunnable() { @Override public void run() { //Sprawdzamy czy admin == null, jeśli jest zatrzymujemy kod if (admin == null) { return; // Sprawdzamy czy other == null, jeśli jest wysyłamy wiadomość do admina że gracz wyszedł z gry oraz zatrzymujemy dalszy kod } else if (other == null) { admin.sendMessage(ChatColor.RED + "Player left the game!"); return; } //Teleportujemy admina do othera admin.teleport(other); } }.runTaskLater(this, 1L); } } } } Ostatecznym krokiem jest stworzenie plików plugin.yml oraz bungee.yml #bungee.yml name: BungeeTolls author: patrick version: 1.0 main: me.patryk.bungetolls.bungee.MainBungee #plugin.yml name: BungeeTolls author: patrick version: 1.0 main: me.patryk.bungetolls.bukkit.MainBukkit Następnie wgrywamy plugin na serwer bukkit oraz bungeecord. Dziękuję za obejrzenie całego poradnika Edytowane 27 czerwca 2020 przez patryk96 Zły link MocSwiatla320, kerpson i xAxee 3 Cytuj Odnośnik do komentarza https://skript.pl/temat/40130-kana%C5%82y-bungeecord-teleportacja-mi%C4%99dzy-serwerami/ Udostępnij na innych stronach Więcej opcji udostępniania...
kerpson 551 Opublikowano 27 czerwca 2020 Udostępnij Opublikowano 27 czerwca 2020 (edytowane) Spoko poradnik. Fajnie jakbyś w niektórych linijkach wyjaśniał skąd co się wzięło, bo osoba która nigdy nie miała styczności z kanałami bungeecorda to mało co ogarnie o co chodzi. Leci plus Edytowane 27 czerwca 2020 przez kerpson patryk96 1 Cytuj Odnośnik do komentarza https://skript.pl/temat/40130-kana%C5%82y-bungeecord-teleportacja-mi%C4%99dzy-serwerami/#findComment-250868 Udostępnij na innych stronach Więcej opcji udostępniania...
patryk96 14 Opublikowano 27 czerwca 2020 Autor Udostępnij Opublikowano 27 czerwca 2020 2 godziny temu, kerpson napisał: Spoko poradnik. Fajnie jakbyś w niektórych linijkach wyjaśniał skąd co się wzięło, bo osoba która nigdy nie miała styczności z kanałami bungeecorda to mało co ogarnie o co chodzi. Leci plus Komentarze dodane kerpson 1 Cytuj Odnośnik do komentarza https://skript.pl/temat/40130-kana%C5%82y-bungeecord-teleportacja-mi%C4%99dzy-serwerami/#findComment-250906 Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Dołącz do dyskusji
Możesz dodać zawartość już teraz a zarejestrować się później. Jeśli posiadasz już konto, zaloguj się aby dodać zawartość za jego pomocą.