Для экономии места задам нубский вопрос здесь.
Как получить блок слева и справа перед игроком. Все на уровне глаз.
поясню "о" - блок. "O" -блок который нужно получить Й - игрок.
00000000000000000000000000
00000000ОоОоооооооооооооооо
ооооооооооЙооооооооооооооооо
Сначала берем
eye = player.getEyeLocation() - это позиция глаз игрока.
Теперь dir = eye.getDirection() - это направление, куда смотрит игрок.
targetBlock = eye.add(dir).getBlock() - мы получили блок на расстоянии 1 от глаз.
Вариант 1: если нужно ориентироваться по сторонам света
По значению dir.getYaw() узнаем, в какую из четырех сторон смотрит игрок. Точнее, нужно проработать всего 2 варианта. (север-юг) и (запад-восток)
Пример есть тут:
http://forums.bukkit.org/threads/direction-the-playser-faces-north-south.20773/
Дальше - в зависимоси от направления:
block1 = targetBlock.getRelative(
NORTH); block2 = targetBlock.getRelative(
SOUTH)
или
block1 = targetBlock.getRelative(
EAST); block2 = targetBlock.getRelative(
WEST)
Вариант 2: если нужно учитывать все направления.
Делайте вращение вектора на угол 90 , затем берите следующий блок от targetBlock на расстоянии 1 (векторы можно нормализовывать методом normalize ), затем разворот вектора (можно уможить на -1), и снова берем следующий блок от targetBlock. Тогда Блоки будут браться даже по диагонали, причем с учетом высоты взгляда. ниже - пример.
.X... X - блок-цель
..A.. A - блок, на который смотрит игрок
.P.X. P - позиция игрока
Как делать вращение вектора - смотрите
в учебнике по линейной алгебре. У Bukkit API нет своих методов для вращения. Подозреваю, что здесь требуется векторное произведение вектора на какую-то константу. А это - есть.
Пардон, придумал способ проще.
Сейчас распишу.
UPD: код на груви, возвращает массив из двух блоков. me - это игрок.
Перепишите на java (это вроде не сложно)
Код:
import static org.bukkit.block.BlockFace.*
def eye = me.eyeLocation
def myFace = getFace(eye.yaw)
blocks = []
for (def face: getTargetFaces(myFace)) {
blocks.add(eye.block.getRelative(face))
}
return blocks
def getFace (yaw) {
if (315<yaw || yaw<45) SOUTH
else if (yaw<135) WEST
else if (yaw<225) NORTH;
else EAST;
}
def getTargetFaces (face) {
switch (face) {
case NORTH: return [NORTH_WEST,NORTH_EAST]
case EAST: return [NORTH_EAST,SOUTH_EAST]
case WEST: return [NORTH_WEST,SOUTH_WEST]
case SOUTH: return [SOUTH_EAST,SOUTH_WEST]
}
}