Блок в радиусе игрока

31
0
Как можно реализовать проверку на блок в радиусе игрока, в определенном ивенте?
 
Да я просто с одним человеком говорил на эту тему, он предложил спросить, вдруг поинтересней будут идеи.
 
Будем считать, что тебе уже дали идею насчет AABB (чисто моё предположение).
Имея AABB вокруг блока (тайла?), делаем примерно следующее, надеюсь поймешь логику:
Код:
Entity[] entities = myAABB.getEntitiesOfClass(EntityPlayer.class);

for (Entity e : entities) {
    float x = e.getX()-myX;
    float y = e.getY()-myY;
    float z = e.getZ()-myZ;
    float length = Math.sqrt(x*x + y*y + z*z);
    float radii = 5f;
    if (length <= radii) {
        sphere.addEntity(e); //удовлетворяет условиям - сущность подходит
    }
}

Этот код пикает всех полученных игроков из бокса в радиусе сферы.
Можно сделать с окружностью, убрав ось Y.
 
Ты не понял чуток.Нужно проверить, есть ли блок в радиусе.
Код:
for(int i < -5; i < 4; i++){
    if(player.worldObj.getBlock(player.posX + i, player.posY + i, player.posZ + i) == Your_Block){
        //Если в радиусе 5 блоков от игрока есть твой блок - выполняем что-то.
    }
}
 
Окей. Я исходил из того, что вызовет наименьшую нагрузку.
Алсо, у тебя в примере просто диагональ проверяется.

Код от игрока:
Код:
int pX = player.posX;
int pY = player.posY;
int pZ = player.posZ;
int radii = 5;
for (int x = -radii; x < radii; x++)
  for (int y = -radii; y < radii; y++)
    for (int z = -radii; z < radii; z++) {
      int tx = x-pX;
      int ty = y-pY;
      int tz = z-pZ;
      double len = Math.sqrt(tx*tx + ty*ty + tz*tz);
      if (len <= radii) {
        //Если в радиусе 5 блоков от игрока есть твой блок - выполняем что-то.
      }
}

Так сойдет? Подобная проверка в любом случае лучше чем проверка на бокс. Если не вызывается каждый тик, конечно.
 
Что-то как-то у меня ругается на  player, не подскажете, что добавить?
 
Назад
Сверху