示例#1
0
 @Override
 public void setBlock(String playerName, Block block, Location loc1, Location loc2) {
   Area area = new Area(loc1, loc2);
   List<Block> blocks = new LinkedList<Block>();
   int chX1 = area.getX1() >> 4;
   int chZ1 = area.getZ1() >> 4;
   int chX2 = area.getX2() >> 4;
   int chZ2 = area.getZ2() >> 4;
   Clipboard undo = Clipboard.createUndoClipBoard(playerName);
   for (int chX = chX1; chX <= chX2; chX++)
     for (int chZ = chZ1; chZ <= chZ2; chZ++) {
       for (int x = 0; x < 16; x++)
         for (int z = 0; z < 16; z++) {
           int blockX = x + (chX << 4);
           int blockZ = z + (chZ << 4);
           if (blockX < area.getX1() || blockX > area.getX2()) continue;
           if (blockZ < area.getZ1() || blockZ > area.getZ2()) continue;
           for (int y = area.getY1(); y <= area.getY2(); y++) {
             Position position = new Position(blockX, y, blockZ, area.getLevel());
             if (undo != null) undo.add(position.getLevel().getBlock(position));
             blocks.add(Block.get(block.getId(), block.getDamage(), position));
           }
         }
     }
   if (undo != null) getUndoManager().add(undo);
   Message.debugMessage(
       "setBlock:", "blocks:", blocks.size(), "undo:", undo == null ? "null" : undo.getVolume());
   setBlock(playerName, blocks);
 }
示例#2
0
 @Override
 public void replaceBlock(
     String playerName, Block b1, Block b2, boolean compareData, Location loc1, Location loc2) {
   Area area = new Area(loc1, loc2);
   List<Block> blocks = new LinkedList<Block>();
   ChunkCoord ch1 = new ChunkCoord(area.getLoc1());
   ChunkCoord ch2 = new ChunkCoord(area.getLoc1());
   int chX1 = area.getX1() >> 4;
   int chZ1 = area.getZ1() >> 4;
   int chX2 = area.getX2() >> 4;
   int chZ2 = area.getZ2() >> 4;
   Clipboard undo = Clipboard.createUndoClipBoard(playerName);
   for (int chX = chX1; chX <= chX2; chX++)
     for (int chZ = chZ1; chZ <= chZ2; chZ++)
       for (int x = 0; x < 16; x++)
         for (int z = 0; z < 16; z++) {
           int blockX = x + (chX << 4);
           int blockZ = z + (chZ << 4);
           if (blockX < area.getX1() || blockX > area.getX2()) continue;
           if (blockZ < area.getZ1() || blockZ > area.getZ2()) continue;
           for (int y = area.getY1(); y <= area.getY2(); y++) {
             Position position = new Position(blockX, y, blockZ, area.getLevel());
             Block block = position.getLevel().getBlock(position);
             if (b1 == null)
               if (block.getId() != 0) continue;
               else {
                 if (block.getId() != b1.getId()) continue;
                 if (compareData && block.getDamage() != b1.getDamage()) continue;
               }
             if (undo != null) undo.add(position.getLevel().getBlock(position));
             setBlock(playerName, Block.get(b2.getId(), b2.getDamage(), position));
           }
         }
   if (undo != null) getUndoManager().add(undo);
 }
示例#3
0
 @Override
 public void setBlock(String playerName, Collection<Block> blocks, boolean useUndo) {
   boolean direct = blocks.size() < 100;
   Message.debugMessage("Set Blocks:", blocks.size(), "direct:", direct);
   Clipboard undo = useUndo ? Clipboard.createUndoClipBoard(playerName) : null;
   blocks.forEach(
       block -> {
         if (undo != null) undo.add(block.getLevelBlock());
         setBlock(playerName, block, direct);
       });
   if (undo != null) getUndoManager().add(undo);
 }
示例#4
0
 @Override
 public void setBlockBox(String playerName, Block block, Location l1, Location l2) {
   Area area = new Area(l1, l2);
   List<Block> blocks = new LinkedList<Block>();
   Clipboard undo = Clipboard.createUndoClipBoard(playerName);
   for (int x = area.getX1(); x <= area.getX2(); x++)
     for (int z = area.getZ1(); z <= area.getZ2(); z++)
       for (int y = area.getY1(); y <= area.getY2(); y++) {
         if (x != l1.getFloorX()
             && x != l2.getFloorX()
             && z != l1.getFloorZ()
             && z != l2.getFloorZ()
             && y != l1.getFloorY()
             && y != l2.getFloorY()) continue;
         Position position = new Position(x, y, z, area.getLevel());
         if (undo != null) undo.add(position.getLevel().getBlock(position));
         setBlock(playerName, Block.get(block.getId(), block.getDamage(), position));
       }
   if (undo != null) Regions.getUndoManager().add(undo);
 }
示例#5
0
 @Override
 public void setBlockWall(String playerName, Block block, Location l1, Location l2) {
   Area area = new Area(l1, l2);
   Clipboard undo = Clipboard.createUndoClipBoard(playerName);
   for (int y = area.getY1(); y <= area.getY2(); y++) {
     for (int x = area.getX1(); x <= area.getX2(); x++) {
       Position p1 = new Position(x, y, area.getZ1(), area.getLevel());
       Position p2 = new Position(x, y, area.getZ1(), area.getLevel());
       if (undo != null) undo.add(p1.getLevel().getBlock(p1), p1.getLevel().getBlock(p2));
       setBlock(playerName, Block.get(block.getId(), block.getDamage(), p1));
       setBlock(playerName, Block.get(block.getId(), block.getDamage(), p2));
     }
     for (int z = area.getZ1(); z <= area.getZ2(); z++) {
       Position p1 = new Position(area.getX1(), area.getY1(), z, area.getLevel());
       Position p2 = new Position(area.getX2(), area.getY2(), z, area.getLevel());
       if (undo != null) undo.add(p1.getLevel().getBlock(p1), p1.getLevel().getBlock(p2));
       setBlock(playerName, Block.get(block.getId(), block.getDamage(), p1));
       setBlock(playerName, Block.get(block.getId(), block.getDamage(), p2));
     }
   }
   if (undo != null) Regions.getUndoManager().add(undo);
 }