2017-12-21 4 views
0

私は、CloudSystemをコーディネートし、すべてのデータをクラウドに保存しています。私の問題:プレイヤーが参加し、イベントAsyncPlayerPreLoginが起動し、クラウドにパケットを送信します。 playerdataが必要です。データが到着するまで、イベントスレッドをスリープ状態にするにはどうしたらいいですか?データは別のクラスに到着するので、私はpostData(PlayerData)のようなメソッドを呼び出すことができる必要があります。私はその私の希望Javaスレッドを待機させる

public class SpigotHandler extends SimpleChannelInboundHandler<Object> { 
@Override 
protected void channelRead0(final ChannelHandlerContext channelHandlerContext, final Object o) throws Exception { 
    final PacketHolder initPacket = (PacketHolder) o; 
    if (initPacket.getType().equals(PacketType.PLAYER_MESSAGE)) { 
     final PlayerSendMessagePacket packet = (PlayerSendMessagePacket) initPacket.getValue(); 
     Bukkit.getPlayer(packet.getTarget()).sendRawMessage(packet.getMessage()); 
    } else if (initPacket.getType().equals(PacketType.PLAYER_INVENTORY)) { 
     final PlayerOpenInventoryPacket packet2 = (PlayerOpenInventoryPacket) initPacket.getValue(); 
     final Inventory inventory = Bukkit.createInventory((InventoryHolder) null, packet2.getInventorySize(), 
       packet2.getTitle()); 
     for (final int slot : packet2.getItems().keySet()) { 
      final CloudInventoryBuildItemEvent event = new CloudInventoryBuildItemEvent(inventory, 
        packet2.getItems().get(slot)); 
      Bukkit.getPluginManager().callEvent((Event) event); 
      if (event.getResult() != null) { 
       inventory.setItem(slot, event.getResult()); 
      } 
     } 
     Bukkit.getPlayer(packet2.getTarget()).openInventory(inventory); 
    } else if (initPacket.getType().equals(PacketType.STOP_SERVER)) { 
     Bukkit.shutdown(); 
    } else if (initPacket.getType().equals(PacketType.PLUGIN_PAYLOAD)) { 
     final PluginPacket packet = (PluginPacket) initPacket.getValue(); 
     SpigotConnector.getInstance().getPluginPacketManager().callrecivers(packet.getChannel(), 
       channelHandlerContext, packet); 
    } else if (initPacket.getType().equals(PacketType.PLAYER_LOGIN_RESPONSE)) { 

    } 
} 
} 

public class PlayerPreLoginListener implements Listener{ 

@EventHandler 
public void onPreLogin(AsyncPlayerPreLoginEvent e) { 

} 
} 

Packethandler(PlayerDataが到着する):イベントはこれが呼ばれるまで待ってから、 は、他のハンドラに

のEventListenerをdispachting継続することがあります問題は理解できます。

+0

イベントはNettyのものではありません。bukkit https://github.com/Bukkit/Bukkitのイベントですので、スケジュールはできません。私はこのイベントをスケジュールしています。 – Starmixcraft

答えて

0

私は完全なコードと機能についてはわかりませんが、あなたができることはjavaの将来の機能を利用することです。

SpigotHandlerにRunnableインターフェイスを実装させてください。

例:代わりSpigotHandlerオブジェクト上channelRead0メソッドを呼び出すの

public class SpigotHandler extends .. implements Runnable{ 
    SpigotHandler(...) 
    { 
    //Intialize the required variable for channelRead0 method 
    } 
    @Override 
    public void run(){ 
    channelRead0(..) 
    } 
    } 

次にログイン前に()メソッド。 Runnableオブジェクトを作成し、スレッドとして実行します。

例:

Runnable spigotRunnable=new SpigotHandler(<parameters>); 
Thread spigotThread = new Thread(spigotRunnable); 
spigotThread.start(); 

while(spigotThread.isAlive()) 
{} 

//Then continue your main thread functionality.. 

はそれがお役に立てば幸いです。

関連する問題