Skocz do zawartości
  • 0

Pobieranie danych z bungee na spigota


Pytanie

Witam może ktoś wytłumaczyć lub podesłać poradnik jak pobrać gracza range z obiektu User?

Mianowicie mam plugin na bungee, jest tam obiekt User który przechowuje String rank.

I teraz pytanie jak mogę za pomocą kanałów pobrać gracza range na serwerze spigot.

Chodzi mi o takie coś jak to:

out.writeUTF("PlayerCount");
out.writeUTF("pvp");

Tylko właśnie nie wiem jak za to się zabrać.

Z góry dziękuję daje +

Edytowane przez TakiJakTy
TakiJakTy

Poprawiam literówkę w tytule.

Notatka dodana przez TakiJakTy

Odnośnik do komentarza
https://skript.pl/temat/40537-pobieranie-danych-z-bungee-na-spigota/
Udostępnij na innych stronach

5 odpowiedzi na to pytanie

Rekomendowane odpowiedzi

  • 0

Prościej będzie pobrać przez bazę danych ale ewentualnie możesz zrobić własny channel, ale to troche trudniejsza sprawa

https://www.spigotmc.org/wiki/sending-a-custom-plugin-message-from-bungeecord/

Odnośnik do komentarza
https://skript.pl/temat/40537-pobieranie-danych-z-bungee-na-spigota/#findComment-252967
Udostępnij na innych stronach

  • 0
W dniu 16.07.2020 o 20:16, kerpson napisał:

Prościej będzie pobrać przez bazę danych ale ewentualnie możesz zrobić własny channel, ale to troche trudniejsza sprawa

https://www.spigotmc.org/wiki/sending-a-custom-plugin-message-from-bungeecord/

@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!

Odnośnik do komentarza
https://skript.pl/temat/40537-pobieranie-danych-z-bungee-na-spigota/#findComment-253064
Udostępnij na innych stronach

  • 0
31 minut temu, patryk96 napisał:

@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!

można cały czas mieć otwarte połączenie ale te channele to też dobra opcja nawet

Odnośnik do komentarza
https://skript.pl/temat/40537-pobieranie-danych-z-bungee-na-spigota/#findComment-253065
Udostępnij na innych stronach

Nieaktywny
Ten temat został zamknięty. Brak możliwości dodania odpowiedzi.
  • Ostatnio przeglądający   0 użytkowników

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