2016-07-07 4 views
0

壁を作成し、パラメータLocation lを使用する方法があります。これは、スノーボールがブロックまたは人に当たって、XまたはZ軸に沿って壁を作成するときにトリガーされます。私の問題は、Location lを使用した場合、Player pを使用して、プレーヤーが向いている方向を取得し、XZ軸に沿って壁をそれに応じて回転させることができないということです。 Player pを使用した場合、私は雪だるまに当たったブロックのLocationを見つけることができません。だから私のジレンマを解決するために、私はLocation lを使いました。そして、Player pが必要なときには、私はすべてのオンラインプレーヤーの位置をループし、Location lにいたプレーヤーを見つけてPlayer pにキャストしました。OnlinePlayerロケーションループ

マイコード:

public static void wall(Location l){ 
     Player p = null; 
     for(Player players: Bukkit.getOnlinePlayers()){ 
      if (players.getLocation().equals(l)){ 
       p = players; 
      } 
      else{ 
       return; 
      } 
     } 

私の質問:

が、これは問題に対する有効なソリューションですか?それは有効でしたが、間違っていましたか?問題を解決する良い方法はありますか?

ありがとうございます!

答えて

0

1つの解決策は、その場所にいるプレーヤーを追跡するために場所を拡張することができます。

public static void wall(Location l) { 
    List<Player> pList = l.getPlayers(); 
    for(Player p : pList) { 
     //do Something 
    } 
} 

プレイヤーに既に場所を保存しているので、プレイヤーが新しい場所に移動するたびに値を更新できます。

別の解決策は、解決策が最善のが本当になどの要因にまで来ているかを決定する場所と選手

Map <Location, Set<Player>> locationPlayerMap //or 
Map <Player, Location> playerLocationMap 

の地図維持するために、次のようになります。 「サーバー上であることを行っているどのように多くの選手」を、など、「単一の場所で可複数のプレーヤーである」、「どのように多くの場所がある」...

EDIT: あなたはまた、次のようにあなたの方法を構築することができます

public static void wall(Object o) { 
    if(o instanceof Player) { 
     //Snowball hit a player, use the direction they are facing and location 
    } else if(o instanceof Location) { 
     //Showball hit a Location, use some other factor. 
    } 
} 
+0

私はちょうどプレイヤーを取得するために場所を使用しようとしている、私は本当にみんなの場所を必要としていない – J22929

+0

私はリストにリストを格納し、1つの場所にあるプレーヤーまたはプレーヤーを表す。プレーヤーが新しい場所に移動するたびに、oldLocation.removePlayer(player)newLocation.addPlayer(player)のような処理を行う必要があります。その後、Location.getPlayers()を使用して、スノーボールが当たる場所のPlayerのリストを返すことができます。 – Steve

+0

私は彼らが移動するときは関係ありません、私はちょうど彼らが雪だるまに当たったときに場所lにいることを確認する必要があります – J22929