2017-02-01 1 views
2

私は現在大規模なブロック設定を含むゲームをプログラミングしています。 プレイヤーが動くと、ステンドグラスの道が進み、5秒後に途中で通ります。setブロックBukkitのパフォーマンスに優しい

既に設定されていない場合はブロックのみが設定されていることを確認しました。プレイヤーが実際に自分の位置を別のブロックに変更している場合のみチェックされます。

私もsendBlockChangeでそれをやろうとしましたが、最初は、sendBlockChangeがすべてのオンラインプレーヤーに適用されなければならないため、これはパフォーマンスに役立ちません。そして、2番目に、anti-cheat-Pluginsは狂ってしまいます。新しいNCPをプログラムする時間。

ここで、moveEventの実行中の実際のブロック設定をここに投稿し、パフォーマンスを低下させないようにするためのここでの提案が大好きです。

現在のところ、サーバーには3-5人のプレーヤーで約5 GBのRAMが必要です。

おかげでみんな

public class MoveListener implements Listener { 


    @EventHandler 
    public void onMove(PlayerMoveEvent e) { 


      Location l = e.getTo(); 
      if(Nyanfighters.getInstance().getSpawnpointsConfi().isSet("SpielSpawn.pos1.X")) 
      { 
       if(e.getFrom().getBlockY()<254&& YmlMethods.isInArea(e.getPlayer(),e.getPlayer().getLocation()) && !(e.getFrom().getBlockX() == e.getTo().getBlockX() && e.getFrom().getBlockY() == e.getTo().getBlockY() && e.getFrom().getBlockZ() == e.getTo().getBlockZ())){ 
        if ((l.getYaw() <= -45 && l.getYaw() > -135.0) || (l.getYaw() <= 305 && l.getYaw() > 215)) {   
         setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking()); 
        } else if ((l.getYaw() <= -305 || (l.getYaw() > -45 && l.getYaw() <= 0)) || ((l.getYaw() <= 45 && l.getYaw() >= 0) || l.getYaw() > 305)) { 
         setArea(1, 1, l, e.getPlayer(), e.getPlayer().isSneaking()); 
        } else if ((l.getYaw() <= -215 && l.getYaw() > -305) || (l.getYaw() <= 135 && l.getYaw() > 45)) { 
         setArea2(-1, 1, l, e.getPlayer(), e.getPlayer().isSneaking()); 
        } else { 
         setArea(-1, -1, l, e.getPlayer(), e.getPlayer().isSneaking()); 
        } 
       } 
      } 




    } 

    private void setArea(int x, int z, Location start, Player p, boolean sneak) {              
     if (p.getLocation().getPitch()>75) {          
      setAir("start", 0, 0, start, 4);                   
      setAir("left", x, 0, start, 14); 
      //setAir("lefttwice", x * 2, 0, start, 14); 
      setAir("right", -x, 0, start, 9); 
      //setAir("righttwice", (-x) * 2, 0, start, 9); 
      setAir("front", 0, z, start, 4); 
      setAir("back", 0, -z, start, 4); 
      setAir("leftfront", x, z, start, 14); 
      //setAir("lefttwicefront", x * 2, z, start, 14); 
      setAir("rightfront", -x, z, start, 9); 
      //setAir("righttwicefront", (-x) * 2, z, start, 9); 
      setAir("leftback", x, -z, start, 14); 
      //setAir("lefttwiceback", x * 2, -z, start, 14); 
      setAir("rightback", -x, -z, start, 9); 
      //setAir("righttwiceback", (-x) * 2, -z, start, 9); 
     } else {                 
      setBlocks("start", 0, 0, start, 4); 
      setBlocks("left", x, 0, start, 14); 
      //setBlocks("lefttwice", x * 2, 0, start, 14); 
      setBlocks("right", -x, 0, start, 9); 
      //setBlocks("righttwice", (-x) * 2, 0, start, 9); 
      setBlocks("front", 0, z, start, 4); 
      setBlocks("back", 0, -z, start, 4); 
      setBlocks("leftfront", x, z, start, 14); 
      //setBlocks("lefttwicefront", x * 2, z, start, 14); 
      setBlocks("rightfront", -x, z, start, 9); 
      //setBlocks("righttwicefront", (-x) * 2, z, start, 9); 
      setBlocks("leftback", x, -z, start, 14); 
      //setBlocks("lefttwiceback", x * 2, -z, start, 14); 
      setBlocks("rightback", -x, -z, start, 9); 
      //setBlocks("righttwiceback", (-x) * 2, -z, start, 9); 
     } 
    } 

    private void setArea2(int x, int z, Location start, Player p, boolean sneak) {              
     if (p.getLocation().getPitch()>75) {                  
      setAir("start", 0, 0, start, 4);                  
      setAir("left", 0, x, start, 14); 
      //setAir("lefttwice", 0, x * 2, start, 14); 
      setAir("right", 0, -x, start, 9); 
      //setAir("righttwice", 0, (-x) * 2, start, 9); 
      setAir("front", z, 0, start, 4); 
      setAir("back", -z, 0, start, 4); 
      setAir("leftfront", z, x, start, 14); 
      //setAir("lefttwicefront", z, x * 2, start, 14); 
      setAir("rightfront", z, -x, start, 9); 
      //setAir("righttwicefront", z, (-x) * 2, start, 9); 
      setAir("leftback", -z, x, start, 14); 
      //setAir("lefttwiceback", -z, x * 2, start, 14); 
      setAir("rightback", -z, -x, start, 9); 
      //setAir("righttwiceback", -z, (-x) * 2, start, 9); 
     } else { 
      setBlocks("start", 0, 0, start, 4); 
      setBlocks("left", 0, x, start, 14); 
      //setBlocks("lefttwice", 0, x * 2, start, 14); 
      setBlocks("right", 0, -x, start, 9); 
      //setBlocks("righttwice", 0, (-x) * 2, start, 9); 
      setBlocks("front", z, 0, start, 4); 
      setBlocks("back", -z, 0, start, 4); 
      setBlocks("leftfront", z, x, start, 14); 
      //setBlocks("lefttwicefront", z, x * 2, start, 14); 
      setBlocks("rightfront", z, -x, start, 9); 
      //setBlocks("righttwicefront", z, (-x) * 2, start, 9); 
      setBlocks("leftback", -z, x, start, 14); 
      //setBlocks("lefttwiceback", -z, x * 2, start, 14); 
      setBlocks("rightback", -z, -x, start, 9); 
      //setBlocks("righttwiceback", -z, (-x) * 2, start, 9); 
     } 
    } 

    private void setBlocks(String s, int x, int z, Location start, int data) {            
     Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z); 
     //Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z); 
     /*if (leftair.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair, Material.AIR, (byte) id); 
     } 
     Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z); 
     if (leftair2.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair2, Material.AIR, (byte) id); 
     } 

     Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ()); 
     if (leftair3.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair3, Material.AIR, (byte) id); 
     }*/ 
     Material block = left.getBlock().getType(); 
     if (block == Material.AIR) { 
      left.getBlock().setType(Material.STAINED_GLASS); 
      BlockState bs= left.getBlock().getState(); 
      bs.setRawData((byte)data); 
      bs.update(); 
      removeBlock(left); 
     } 
    } 

    private void setAir(String s, int x, int z, Location start, int data) {            

     Location left = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 1, start.getBlockZ() + z); 
     if (left.getBlock().getType() == Material.STAINED_GLASS) 
      left.getBlock().setType(Material.AIR); 
     /*Location leftair = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY(), start.getBlockZ() + z); 
     if (leftair.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair, Material.AIR, (byte) id); 
     } 
     Location leftair2 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 1, start.getBlockZ() + z); 
     if (leftair2.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair2, Material.AIR, (byte) id); 
     } 
     Location leftair3 = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() + 2, start.getBlockZ()); 
     if (leftair3.getBlock().getType() == Material.AIR) { 
      for (Player p : Bukkit.getOnlinePlayers()) 
       p.sendBlockChange(leftair3, Material.AIR, (byte) id); 
     }*/ 
     Location right = new Location(start.getWorld(), start.getBlockX() + x, start.getBlockY() - 3, start.getBlockZ() + z); 
     Material block = right.getBlock().getType(); 
     if (block == Material.AIR) { 
      right.getBlock().setType(Material.STAINED_GLASS); 
      BlockState bs= right.getBlock().getState(); 
      bs.setRawData((byte)data); 
      bs.update(); 
      removeBlock(right); 
     } 
    } 

    private void removeBlock(Location remove) {   
     Bukkit.getScheduler().scheduleSyncDelayedTask(Nyanfighters.getInstance(),() -> remove.getBlock().setType(Material.AIR), 20 * 5); 
    } 

} 

お知らせ:マークコメントとしていくつかのコードのブラケットがあります。これらはすべてターゲットであるがパフォーマンスを低下させるためには使用されていない拡張機能です。

+0

私はこのためにYMLを使用すべきではないと信じています。ファイルを何度も開いたり閉じたりするのが非常に遅いです。 – Kerooker

+0

ありがとうございます。ymlを使用しますが、必要なすべてのデータを保存します。すべての動きではありません。ありがとう、それは間違いなく助けてくれるでしょう – Scorix

+0

正確に何を達成しようとしているのか詳しく教えてもらえますか?これは少し不明です:「プレイヤーが動くと、ステンドグラスの道が進み、5秒後に通過します」。そして、あなたがしたいことがあれば、無関係なコードがたくさんあるようです。 – kmecpp

答えて

1

ブロックを更新する間に小さな待機期間を実装してください。たとえば、最初にプレイヤーがブロック更新をトリガーしたときに、UUIDと現在の時刻の値をキーとしてエントリをマップに格納します。次に、イベントがアクティブになったときに、現在の時刻と最後にイベントがアクティブになった時刻の間に一定の時間が経過したことを確認します。指定した時間が経過していない場合は、何もしないでください。 1秒に1回更新するように変更しても、1回の更新で20倍の改善が得られます。

+0

ありがとう、良い提案、残念ながら、プレイヤーはそれらを歩くので、1秒は多くですが、約250ミリ秒でそれはまだ5倍高速です:) – Scorix

関連する問題