Помогите Прочесать блоки в радиусе от игрока и не залагать

NoooobKa

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
NoooobKa
Нужно найти определенные блоки вокруг игрока и манипулировать ими.
Попытка номер 1 - в асинхроне получить материал блока = смерть.
Попытка номер 2 - получить блочные энтити из чанка, и в асинхроне проверять нужный ли это блок, потом выполнять что нужно в синхроне. Со второй попытки получилось без ошибок, но погуглив увидел что это может быть не потокобезопасно бла-бла-бла, на сколько эта инфа актуальна?
Есть ли способы получше? (радиус примерно 30 блоков)
 
Это всегда не потокобезопасно. Инфа может стать не актуальной.
 
В таком случае чешите синхронно, через очередь, ребята:good:
 
Нужно найти определенные блоки вокруг игрока и манипулировать ими.
Попытка номер 1 - в асинхроне получить материал блока = смерть.
Попытка номер 2 - получить блочные энтити из чанка, и в асинхроне проверять нужный ли это блок, потом выполнять что нужно в синхроне. Со второй попытки получилось без ошибок, но погуглив увидел что это может быть не потокобезопасно бла-бла-бла, на сколько эта инфа актуальна?
Есть ли способы получше? (радиус примерно 30 блоков)
А попробуй получать исключительно Material через for, выводить в список, и после всех циклов снизу работать с этим списком Material
 
А попробуй получать исключительно Material через for, выводить в список, и после всех циклов снизу работать с этим списком Material
Если я тебя правильно понял и ты про первый способ, то мне кажется это будет также затратно.

На сколько я понял, проверка instanceof потокобезопасна в этом случае, потому что не ссылается на кэш другого потока, и ее можно спокойно в асинке юзать
 
А попробуй получать исключительно Material через for, выводить в список, и после всех циклов снизу работать с этим списком Material
А какая разница то? Блок может сменится во время итерации, ибо второй трейд не будет ждать.
 
А какая разница то? Блок может сменится во время итерации, ибо второй трейд не будет ждать.
Но если получить final клон массива в синхроне, а в асинке итерировать , то по идее ничего не сможет изменится
Код:
final BlockState[] bs = p.getWorld().getChunkAt(i, j).getTileEntities().clone();

Но на выходе нужно проверять является ли этот блок тем на что была проверка в асинке
 
Пока ты свой клон итерируешь в чанке уже может что то изменится да. Если там появился нужный блок во время итерации, ты о нем не узнаешь.
 
Пока ты свой клон итерируешь в чанке уже может что то изменится да.
Ну этот способ мне подходит, после подтверждения случая , дополнительно в синхроне проверяю, является ли блок тем, что мне надо, и выполняю
Код:
if (p.getWorld().getBlockAt(b.getLocation()).getState() instanceof Chest) {}
 
Ну этот способ мне подходит, после подтверждения случая , дополнительно в синхроне проверяю, является ли блок тем, что мне надо, и выполняю
И пропустишь блок поставленный в середине цыкла да.
 
Назад
Верх