- 1,921
- 107
- 378
На днях написал алгоритм поиска соседа и соседа соседа блока. Для наглядности это будет блок обсидиан. Этот метод я реализовал в ивенте клика по блоку. Наверное кому-нибудь пригодится.
Алгоритм способен проверить блоки в кол-ве 2600 штук(Не в update) без серьёзных провисаний.
Наверное, дополнив этот код, можно сделать систему передачи энергии.
Java:
if (block == Blocks.OBSIDIAN) { // Если наш блок изначально обсидиан
HashSet<BlockPos> poss = new HashSet(); // Множество кол-ва наших блоков
HashSet<BlockPos> unposs = new HashSet(); // Множество кол-ва непроверенных блоков
poss.add(pos); // Добавляем наш блок в это множество
for (int a = 0; a < 6; a++) // В этом цикле происходи подбор соседей изначального блока
unposs.add(pos.add(EnumFacing.VALUES[a].getDirectionVec()));
while (unposs.size() > 0) { // В этом цикле происходит проверка и создание новых непроверенных блоков
HashSet<BlockPos> newSet = new HashSet(); // Создание нового множества, на замену unposs
for (BlockPos upp : unposs) {
if (event.getWorld().getBlockState(upp).getBlock() == Blocks.OBSIDIAN) {
poss.add(upp);
for (int a = 0; a < 6; a++) {
BlockPos pp = upp.add(EnumFacing.VALUES[a].getDirectionVec()); // Позиция соседа
if (!poss.contains(pp)) // Проверка, что сосед не обсидиан, который мы уже добавляли
newSet.add(pp); // Добавление нового соседа на проверку
}
}
newSet.remove(upp); // Проверили - удалили
}
unposs = newSet; // Замена множества с "правками"
}
player.sendMessage(new TextComponentString(poss.size().toString()));
}
Наверное, дополнив этот код, можно сделать систему передачи энергии.
Последнее редактирование модератором:


