Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

В разработке Сканировать блоки вокруг игрока

Sitmobedaf

Старожил
Пользователь
Баллы
103
Имя в Minecraft
SiT
Хочу осуществить код, который будет определять насколько в закрытом от общего мира помещении находится игрок, например в доме или пещере.
Просто сканировать блоки в несколько сторон слишком примитивно.

Также известно, что проверка блоков нагруженный процесс, но других простых способов я не знаю.

Вот мой код, в котором есть две проблемы: не завершается планировщик и высокая нагрузка на основной поток. При попытке в асинхроне выполнять происходят непредсказуемые вещи.
https://pastebin.com/raw/7g33vvJ6
 
1. Никогда не взаемодействуй с API ядра в асинхронном потоке с исключением того, что ты абсолютно уверен, что это потокобезопасно. В твоем случае как либо взамодействовать с активной картой в асинхроне нельзя. Я могу порекомендовать копировать чанки (делать снепшоты), а затем в асинхроне смотреть блоки.
Код:
ChunkSnapshot snapshot = chunk.getChunkSnapshot(false, false, false);

2. Не завершается потому что каждый цикл ты заново присваиваешь переменную:
Код:
int cycleCount = duration;
Выведи ее за цикл, и офк там будет ошибка "effectively final", самый простой способ юзать AtomicInteger или массив с 1 элементом.
3. Enum эффективнее сравнивать так, меньше инструкций:
Код:
b1.getType() == Material.AIR
 
Enum эффективнее сравнивать так, меньше инструкций:
да скорее из-за большей читабельности нужно так сравнивать, меньше инструкций в байт коде это второстепенный фактор, мы на джава пишем, а не инструкции считаем.
 
1. Никогда не взаемодействуй с API ядра в асинхронном потоке с исключением того, что ты абсолютно уверен, что это потокобезопасно. В твоем случае как либо взамодействовать с активной картой в асинхроне нельзя. Я могу порекомендовать копировать чанки (делать снепшоты), а затем в асинхроне смотреть блоки.
Код:
ChunkSnapshot snapshot = chunk.getChunkSnapshot(false, false, false);

2. Не завершается потому что каждый цикл ты заново присваиваешь переменную:
Код:
int cycleCount = duration;
Выведи ее за цикл, и офк там будет ошибка "effectively final", самый простой способ юзать AtomicInteger или массив с 1 элементом.
3. Enum эффективнее сравнивать так, меньше инструкций:
Код:
b1.getType() == Material.AIR
Спс. На счёт переменной в цикле протупил конечно.
 

Поделиться этой страницей

Назад
Верх