- 1,990
- 18
- 105
Отдельный поток не нужен, вызовет лишь кучу багов.
Идеи - считать пройденное расстояние игрока по осям x\z, из этого строить прямоугольник проверямых блоков.
5 блоков по y совсем не нужны, хватит 3. Ко льду можно ещё песок душ прибавить, в качестве проверяемого блока.
Можно вообще каждый пройденный блок игроком помечать в отдельном месте, занося в лист, каждый тик, потом сбрасывать список при проверке. Это гораздо эффективнее будет.
Что-то вроде:
в твоей проверке потом просто смотреть содержит ли лист нужный тебе ID, а после проверки делать list.clear();
Оптимизировать можно и дальше, но у меня сейчас голова из-за температуры не варит вообще.
А кнокбак важен. Вот убегает игрок - в него попали стрелой, он пролетел чуть больше и бац - его откатывает. Это вызовет приступ ярости у любого.
Идеи - считать пройденное расстояние игрока по осям x\z, из этого строить прямоугольник проверямых блоков.
5 блоков по y совсем не нужны, хватит 3. Ко льду можно ещё песок душ прибавить, в качестве проверяемого блока.
Можно вообще каждый пройденный блок игроком помечать в отдельном месте, занося в лист, каждый тик, потом сбрасывать список при проверке. Это гораздо эффективнее будет.
Что-то вроде:
Код:
ArrayList<Integer> ids = new ArrayList<Integer>();
public void onUpdate() {
if (posX != last.posX && posY != lastPosY && posZ != lastPosZ)
ids.add(world.getBlockId(x,y-1,z)); //проверять существуюет ли такой не стоит
//можно даже посчитать количество пройденных блоков льда\песка душ\воды\etc
}
в твоей проверке потом просто смотреть содержит ли лист нужный тебе ID, а после проверки делать list.clear();
Оптимизировать можно и дальше, но у меня сейчас голова из-за температуры не варит вообще.
А кнокбак важен. Вот убегает игрок - в него попали стрелой, он пролетел чуть больше и бац - его откатывает. Это вызовет приступ ярости у любого.