我想把所有类似的木块都做成一条静脉。但我的代码似乎只在半径为5 x 5的块中获取块。
我用了一段时间的方法
public List<Block> getVein(Block b){
List<Block> blocks = similarNear(null, b);
ListIterator<Block> toCheck = blocks.listIterator();
while(toCheck.hasNext()) {
Block current = toCheck.next();
if(!blocks.contains(current))
blocks.add(current);
for(Block block : similarNear(blocks, current)) {
if(!blocks.contains(block))
toCheck.add(block);
}
}
return blocks;
}
和类似的
public List<Block> similarNear(List<Block> current, Block block){
List<Block> blocks = new ArrayList<Block>();
Material mat = block.getType();
Location loc = block.getLocation();
if(loc.clone().add(0, -1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, -1, 1).getBlock());
if(loc.clone().add(0, -1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, -1, -1).getBlock());
if(loc.clone().add(1, -1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, -1, 0).getBlock());
if(loc.clone().add(-1, -1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, -1, 0).getBlock());
if(loc.clone().add(1, -1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, -1, 1).getBlock());
if(loc.clone().add(-1, -1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, -1, -1).getBlock());
if(loc.clone().add(-1, -1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, -1, 1).getBlock());
if(loc.clone().add(1, -1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, -1, -1).getBlock());
if(loc.clone().add(0, -1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, -1, 0).getBlock());
if(loc.clone().add(0, 0, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, 0, 1).getBlock());
if(loc.clone().add(0, 0, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, 0, -1).getBlock());
if(loc.clone().add(1, 0, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 0, 0).getBlock());
if(loc.clone().add(-1, 0, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 0, 0).getBlock());
if(loc.clone().add(1, 0, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 0, 1).getBlock());
if(loc.clone().add(-1, 0, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 0, -1).getBlock());
if(loc.clone().add(-1, 0, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 0, 1).getBlock());
if(loc.clone().add(1, 0, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 0, -1).getBlock());
if(loc.clone().add(0, 1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, 1, 1).getBlock());
if(loc.clone().add(0, 1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, 1, -1).getBlock());
if(loc.clone().add(1, 1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 1, 0).getBlock());
if(loc.clone().add(-1, 1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 1, 0).getBlock());
if(loc.clone().add(1, 1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 1, 1).getBlock());
if(loc.clone().add(-1, 1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 1, -1).getBlock());
if(loc.clone().add(-1, 1, 1).getBlock().getType() == mat)
blocks.add(loc.clone().add(-1, 1, 1).getBlock());
if(loc.clone().add(1, 1, -1).getBlock().getType() == mat)
blocks.add(loc.clone().add(1, 1, -1).getBlock());
if(loc.clone().add(0, 1, 0).getBlock().getType() == mat)
blocks.add(loc.clone().add(0, 1, 0).getBlock());
// Remove duplicate blocks
List<Block> filtered = new ArrayList<>();
for(Block b : blocks) {
if(current == null) {
filtered.add(b);
continue;
}else {
if(!current.contains(b)) {
if(!filtered.contains(b))
filtered.add(b);
}
}
}
return filtered;
}
我还想添加一个cap-say示例,只允许它打破25个块,但我不知道如何在不阻止它在一个方向找到25个块的情况下进行添加,如果这有任何意义,就停止。