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