Methoden Aus einem Event, wo ich weiß, dass es ausgeführt werden wird, eine Get-Methode basteln

GamintenSit

Mitglied
Hallo,
Ich bin momentan dabei für mein Bungeecord Plugin (ein Proxy für Minecraft Server (ich denke, da ich hier nicht direkt eine Frage zu einer API des Servers habe bin ich hier mit meiner Frage besser aufgehoben), über den ich auf andere Server connecte), ein Spigot (der Server auf den ich über den Bungeecord Connecte) API Plugin zu Programmieren. Das Spigot Plugin soll mit dem Bungeecord Plugin kommunizieren. Ich kann eine Nachricht an den Bungeecord senden und eine Nachricht vom Bungeecord empfangen. Bei meinem Plugin ist es so, wenn ich eine bestimmte an Anfrage den Bungeecord sende, bekomme ich eine Antwort, über ein Event. Nun möchte ich mir daraus eine Get-Methode basteln, die der Nutzer meines Plugins aufruft, wo drauf hin die Get-Methode eine Nachricht an den Bungeecord sendet, wie z.B. (im Pseudocode) Wie viele Spieler sind Online, wo drauf der Server z.B. 10 antwortet. Und diesen Wert (also in diesem Fall 10) möchte ich returnen.
Mit freundlichen Grüßen Simon Brungs
 
Naja zb einen Weg wie ich in der get Methode ein event Einbaue und das ganze dann so lange wartet bis eine Antwort bekommt oder null returned wenn es nach einer Sekunde oder so keine Antwort erhalten hat.
 
Du kannst hier nicht erwarten, dass jemand ein komplettes Beispiel hier postet. Erstmal zeig hier mal deine Versuche und was da nicht funktioniert. Zeig die Kommunikation mit dem Server und sogar, wo du was erwartest. Ich weiß zum Beispiel nicht was du meinst mit eine get-Methode in ein Event einbauen.
 
Naja das Problem ist ja ich weiß ja nicht wie es geht. Hier meine erste Überlegung wie es funktionieren könnte (auf dem Spigot server, also der die erste Anfrage an den Bungeecord schieckt und dann vom Bungeecord eine Antwort erhält):
Java:
public static String getSpielerOnlineAufBungeeCord(Player pSpielerUeberDieDieNachrichtGesendetWird){
sendeNachrichtAnBungeeCord(pSpielerUeberDieDieNachrichtGesendetWird, "GebeSpielerOnlineAus");
String antwort=warteAufAntwortUeberSpielerImParameterUndGebeAntwortAus(pSpielerUeberDieDieNachrichtGesendetWird);
// Diese Methode würde dann darauf warten, dass der Bungeecord eine Antwort schieckt, die von einem Event          // empfangen wird und diese dann irgendwie (ich weiß nicht wie) an die Methode //warteAufAntwortUeberSpielerImParameterUndGebeAntwortAus übergibt oder die Methode //warteAufAntwortUeberSpielerImParameterUndGebeAntwortAus gibt nach einer Sekunde null zurück, wenn sie nichts //übergeben bekommt.
return antwort;
}

Meine zweite Idee war diese hier:
Java:
public static String getSpielerOnlineAufBungeeCord(Player pSpielerUeberDieDieNachrichtGesendetWird){
sendeNachrichtAnBungeeCord(pSpielerUeberDieDieNachrichtGesendetWird, "GebeSpielerOnlineAus");
getServer().getMessenger().registerIncomingPluginChannel(hauptklasse, "MeinChannel", this); 
// regestriere mein Event
// hier muss ich irgendwie mein event in die Methode einbinden
@Override
   public void onPluginMessageReceived(String channel, Player player, byte[] bytes) {
     if (channel.equals("MeinChannel")) {
if(player==pSpielerUeberDieDieNachrichtGesendetWird){
     ByteArrayInputStream stream = new ByteArrayInputStream(bytes);
     DataInputStream in = new DataInputStream(stream);
     try {
      return in.readUTF());
     } catch (IOException e) {
       e.printStackTrace();
return null;
     }}
}
return getSpielerOnlineAufBungeeCord(Player pSpielerUeberDieDieNachrichtGesendetWird); // wird ausgeführt, wenn // aus irgendeinem Grund Fehl schlug das ganze Fehl schlug und versucht es nochmal.
}

Ich habe keine Ahnung ob einer dieser überlegungen funktionieren würde und wenn ja wie genau.
 
Idee 1 klingt von der Theorie her eh nicht schlecht. Wo liegt dabei das Problem? Es sollte da wirklich reichen eine Methode "warteAufAntwortUeberSpielerImParameterUndGebeAntwortAus" zu schreiben, welche den Channel für die Antwort abhört, aber spätestens nach 1 Sekunde etwas zurückgibt.
 
Ich habe keine Ahnung wie die Methode "warteAufAntwortUeberSpielerImParameterUndGebeAntwortAus" aussehen sollte. Ich weiß nur wie ich das Event onPluginMessageReceived nutzen kann, jedoch nicht wie ich einen Channel abhöre für eine bestimmte Zeit.
 
Ohne jetzt die API zu kennen:

Code:
int getPlayerCount() {
   sendToServer(REQUEST_PLAYER_COUNT);

   final String answer = readFromServer();
   final int playerCount = Integer.parseInt(answer);

   return playerCount;
}
In der Regel blockieren "read"-Methoden den Thread.
 
Ich denke ich frage nochmal in einem Bungeecord Forum. Den soweit ich weiß gibt es in der API keine read Methode und wenn dann kenne ich sie nicht. Trotzdem danke.
 

Zurück
Oben