Skocz do zawartości

Kanały bungeecord - Teleportacja między serwerami


Rekomendowane odpowiedzi

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 :D

Edytowane przez patryk96
Zły link
Odnośnik do komentarza
https://skript.pl/temat/40130-kana%C5%82y-bungeecord-teleportacja-mi%C4%99dzy-serwerami/
Udostępnij na innych stronach

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 przez kerpson
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

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 :)

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

  • patryk96 zmienił(a) tytuł na Kanały bungeecord - Teleportacja między serwerami

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ą.

Nieaktywny
Dodaj odpowiedź do tematu...

×   Wklejono zawartość z formatowaniem.   Usuń formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Odnośnik został automatycznie osadzony.   Przywróć wyświetlanie jako odnośnik

×   Przywrócono poprzednią zawartość.   Wyczyść edytor

×   Nie możesz bezpośrednio wkleić grafiki. Dodaj lub załącz grafiki z adresu URL.

  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...