2017-02-01 1 views
2

현재 막대한 블록 설정을 포함하는 게임을 프로그래밍 중입니다. 플레이어가 움직이면 스테인드 글라스 방식으로 길을 따라 5 초 후에 지나갈 것입니다.세트 Blocks Bukkit performance friendly

이미 설정되어 있지 않은 경우에만 블록이 설정되고 플레이어가 실제로 다른 위치로 자신의 위치를 ​​변경하는 경우 해당 블록 만 확인됩니다.

나는 또한 sendBlockChange를 사용하여이 작업을 수행하려고 시도했으나 sendBlockChange가 모든 온라인 플레이어에 적용되어야하고 두 번째로 안티 치트 플러그인이 미친 듯이 나올 것이므로 처음에는 성능에 도움이되지 않습니다. 새로운 NCP를 프로그래밍 할 시간.

그래서 여기에 moveEvent 중 실제 블록 설정을 게시하고 성능을 저하시키지 않으려면 여기에 제안을 남기고 싶습니다.

현재 서버는 3-5 명이 사용할 경우 약 5GB 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 초에 한 번씩 업데이트되도록 변경하더라도 틱마다 한 번씩 업데이트하는 것보다 20 배나 향상됩니다.

+0

감사합니다. 좋은 제안입니다, 불행히도 플레이어가 걸을 것입니다. 그래서 1 초가 많이 걸리지 만 약 250 밀리 초일 때 여전히 5 배 빠릅니다 :) – Scorix