2017-11-15 9 views
2

私は、Bungee - > Bungeeからのプラグインメッセージを送信して、その情報を要求することによって、プレーヤーに関するデータ(特に、それらが入っているチャットチャネル)を受信するためにBungeeCord/Bukkitプラグインメッセージングチャネルを使用しようとしています。 ここに私の問題があります。 (プラグインメッセージの形式で)BungeeCordサーバーからの応答のためにを待ってから、それを受信したら使用する必要があります。Bukkit Plugin Messaging

私はチュートリアルhereを使用しますが、プラグインのメッセージがバンジーサーバから受け取っているときonPluginMessageReceivedが発生しませんので、notifyAllは発生しませんので、サーバーだけでクラッシュします。ここで

は、情報を要求するためのコードです:

public synchronized Object get(Player p, String... data) { 
     sendToBungeeCord(p,"get",data); 

     try { 
      this.wait(); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 

     return obj.get(p); 
    } 

そしてここでは、受け取っれているプラ​​グインのメッセージのためのコードです:

@Override 
    public synchronized void onPluginMessageReceived(String channel, Player player, byte[] message) { 
     player.sendMessage("return"); 
     if (channel.equals("BungeeCord")) { 
      ByteArrayDataInput in = ByteStreams.newDataInput(message); 
      String action = in.readUTF(); 
      if (action.equals("get")) { 
       String dataType = in.readUTF(); 
       String id = in.readUTF(); 
       if (dataType.equals("channel")) { 
        obj.put(player,id); 
        this.notifyAll(); 
       } 
      } else if (action.equals("test")) { 
       player.sendMessage(in.readUTF()); 
      } 
     } 
    } 

残りをINGのwaitせずにこれを行う方法がある場合(プラグインの残りの部分は、応答を待っている間に実行できます)私はそれについてどうやって行くのか理解してください。

答えて

0

メインサーバーのスレッドをブロックするのではなく、BungeeCordの応答を待っている間に他の処理を続けるようにしてください。

この通信チャネルを扱うときインローAPIのみ、メインサーバースレッドにを動作するように設計されているのでまたは非同期のものを使用しないでください。それを他のスレッドから使​​用しようとすると、バグや副作用が多数発生してサーバー上に表示され、特定の状況でプレーヤーのデータが失われたり、サーバーがクラッシュすることさえあります。

だからあなたの問題を解決するには、次のようになります。あなたはときにそれを持っていないとき

  1. あなたがBungeeCordsを待っている間に、サーバーをブロックしないでくださいは
  2. プロセスに答えた結果を答えますあなたがリクエストしました