Блок в поле зрения игрока

Версия Minecraft
1.10.2
917
22
332
Всем доброго дня!
У меня есть один блок и мне нужно с шансом x заменять блоки вокруг него на другие. Но с условием что заменяемый блок не попадает в поле зрения ни одного из игроков. С первым проблем не возникло, но как сделать второе? RayTraceResult не подходит по моему. Наверно есть какой-то способ, хоть я о нём и не знаю.
Всем спасибо за участие.
 
Решение
Могу предложить только скалярное произведение взгляда игрока и вектора, направленного от блока ко взгляду. Есть, конечно, неточность, но вроде работает.
Код такой:
Код:
Vec3 visionVec = player.getLook(1.0F).normalize();
Vec3 targetVec = Vec3.createVectorHelper(blockX - player.posX,
blockY - (player.posY + (double) player.getEyeHeight()),
blockZ - player.posZ).normalize();
double dotProduct = visionVec.dotProduct(targetVec);
boolean inFOV = dotProduct > 0.1 && player.canEntityBeSeen(stalker); // Если скалярное(dot) меньше нуля, то игрок не смотрит на блок вообще.
return inFOV;
Код написал на коленке.

Варик 2:
Проверить наличие коробки во фруструме. Только на клиенте
4,045
63
645
Рискну предложить костыльный метод:
При обновлении блока проверять всех ентити в определённом радиусе, высчитывать их положение и соотносить с поворотом камеры (что-то типа cameraYaw или entityYaw, не помню)...
Скажем, если игроки повёрнуты к блоку спиной, значит заменяй.

Но тут придётся вспомнить всё, чему тебя учили в школе )))
 
1,137
5
3
Могу предложить только скалярное произведение взгляда игрока и вектора, направленного от блока ко взгляду. Есть, конечно, неточность, но вроде работает.
Код такой:
Код:
Vec3 visionVec = player.getLook(1.0F).normalize();
Vec3 targetVec = Vec3.createVectorHelper(blockX - player.posX,
blockY - (player.posY + (double) player.getEyeHeight()),
blockZ - player.posZ).normalize();
double dotProduct = visionVec.dotProduct(targetVec);
boolean inFOV = dotProduct > 0.1 && player.canEntityBeSeen(stalker); // Если скалярное(dot) меньше нуля, то игрок не смотрит на блок вообще.
return inFOV;
Код написал на коленке.

Варик 2:
Проверить наличие коробки во фруструме. Только на клиенте
 
1,137
5
3
Сам не знаю. Читал, что у векторов, обозначающих направление, скалярное больше нуля, если угол < 90. Нуль, если оба вектора перпендикулярны. И отрицательные значения, если угол между векторами > 90. Даже есть прелестная статья на любимом мне хабрахабре: https://habrahabr.ru/post/131931/
P.S. Ну угла как бы 2, но, думаю, понятно о чём я
 

CMTV

Основатель
Администратор
1,304
4
601
Можно и просто косинусом. Скалярное произведение просто в декартовых координатах очень быстро считается через простую формулу (не зависящую ни от длин векторов, ни от косинуса угла между ними): скалярное произведение = сумма произведений соответствующих координат.
 
Сверху