- Баллы
- 76
- Имя в Minecraft
- DragOn4ik
Вопрос в названии. Заранее спасибо)
Следуйте инструкциям в видео ниже, чтобы узнать, как установить наш сайт как веб-приложение на главный экран вашего устройства.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
На блок есть готовый метод player.getTargetBlock. Так к слову.Так вот как всякие VoxelSniper'ы вычисляют блок на который смотрит игрок...
(нет, ну реально рофлишь)
Там ограничение в 100 блоков (и то от настроек сервера зависит). В WE, например, свой метод для получения блока.На блок есть готовый метод player.getTargetBlock. Так к слову.
Запускать Projectile для пушек, гениально.На блок есть готовый метод player.getTargetBlock. Так к слову.
И потом цель не озвучена, если для пушек, мой вариант подходит.
Если нет. Предложу варик с BlockIterator+getNearbyEntities.
Ты видимо не о тех пушках подумал.Запускать Projectile для пушек, гениально.
Я подумал об огнестрельных.Ты видимо не о тех пушках подумал.
![]()
Макс.расстояние - 30 блоковТС, а на каком максимальном расстоянии должен находиться игрок? Возможно проще просто по вектору взгляда проитерировать.
Угадал)И потом цель не озвучена, если для пушек, мой вариант подходит.
Угу, и там разварочивать турель в сторона игрока.Как я понимаю, здесь надо использовать getNearbyEntities() ?
Ищешь ближайшего игрока и наводишь кодом ниже.Ну если получить игроков в радиусе то да, но там же не учтено, могут ли они быть на линии наблюдения.
public static Location setDirection(Location loc, Location lookat) {
loc = loc.clone();
double dx = lookat.getX() - loc.getX();
double dy = lookat.getY() - loc.getY();
double dz = lookat.getZ() - loc.getZ();
if (dx != 0) {
if (dx < 0) {
loc.setYaw((float) (1.5 * Math.PI));
} else {
loc.setYaw((float) (0.5 * Math.PI));
}
loc.setYaw((float) loc.getYaw() - (float) Math.atan(dz / dx));
} else if (dz < 0) {
loc.setYaw((float) Math.PI);
}
double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2));
loc.setPitch((float) -Math.atan(dy / dxz));
loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI);
loc.setPitch(loc.getPitch() * 180f / (float) Math.PI);
return loc;
}
Ору, ничего, что можно просто засетать Direction вектором?Ищешь ближайшего игрока и наводишь кодом ниже.
Поиск препятствий? Ну придется подрочить блокитератор или еще что.Код:public static Location setDirection(Location loc, Location lookat) { loc = loc.clone(); double dx = lookat.getX() - loc.getX(); double dy = lookat.getY() - loc.getY(); double dz = lookat.getZ() - loc.getZ(); if (dx != 0) { if (dx < 0) { loc.setYaw((float) (1.5 * Math.PI)); } else { loc.setYaw((float) (0.5 * Math.PI)); } loc.setYaw((float) loc.getYaw() - (float) Math.atan(dz / dx)); } else if (dz < 0) { loc.setYaw((float) Math.PI); } double dxz = Math.sqrt(Math.pow(dx, 2) + Math.pow(dz, 2)); loc.setPitch((float) -Math.atan(dy / dxz)); loc.setYaw(-loc.getYaw() * 180f / (float) Math.PI); loc.setPitch(loc.getPitch() * 180f / (float) Math.PI); return loc; }
final Location location = startLocation.clone();
location.setDirection(endLocation.toVector().substract(startLocation.toVector()));
Было бы круто, еслиб оно работало как должно. Намучился с этим в свое время.Ору, ничего, что можно просто засетать Direction вектором?
PHP:final Location location = startLocation.clone(); location.setDirection(endLocation.toVector().substract(startLocation.toVector()));
Ну во первых все нормально работает, во вторых тут и сетать direction не нужно, можно самому двигать снаряд по вектору.Было бы круто, еслиб оно работало как должно. Намучился с этим в свое время.
хз не робило у меня. Всегда как то криво было.Ну во первых все нормально работает, во вторых тут и сетать direction не нужно, можно самому двигать снаряд по вектору.
Значит что-то не так делал.хз не робило у меня. Всегда как то криво было.
public LivingEntity rayTraceEntity(final Player player, final int range) {
final BlockIterator iterator = new BlockIterator(player.getWorld(), player.getEyeLocation().toVector(), player.getEyeLocation().getDirection(), 0.0, range);
Chunk chunk = null;
Entity[] entities = null;
while (iterator.hasNext()) {
final Location l = iterator.next().getLocation();
if (chunk != l.getChunk()) {
chunk = l.getChunk();
entities = chunk.getEntities();
}
if (entities != null && entities.length > 0) {
final Entity[] arr$ = entities;
for (int len$ = entities.length, i$ = 0; i$ < len$; ++i$) {
final Entity entity = arr$[i$];
if (entity != player && entity instanceof LivingEntity && entity.getType() != EntityType.SQUID && l.getWorld() == entity.getLocation().getWorld() && l.distance(entity.getLocation()) < 1.5) {
return (LivingEntity)entity;
}
}
}
}
return null;
}
LivingEntity entityTarget = rayTraceEntity(Player, 16);
//И обязательно делать проверку на то не равен ли Entyty null
if(entityTarget == null){
//Если равен ничему, то есть его нет.
}else{
TODO
}
Говно какое-то откопал, если че в баките уже есть готовый метод getNearbyEntities, к тому же для игрока уже написан лучший способ - перебирать всех игроков и по векторам быстренько проверить.Пользуюсь одним методом (откопал где-то в глубинах гугла). Этот код ищет сущность в направлении взгляда игрока.
Юзать вот так:Код:public LivingEntity rayTraceEntity(final Player player, final int range) { final BlockIterator iterator = new BlockIterator(player.getWorld(), player.getEyeLocation().toVector(), player.getEyeLocation().getDirection(), 0.0, range); Chunk chunk = null; Entity[] entities = null; while (iterator.hasNext()) { final Location l = iterator.next().getLocation(); if (chunk != l.getChunk()) { chunk = l.getChunk(); entities = chunk.getEntities(); } if (entities != null && entities.length > 0) { final Entity[] arr$ = entities; for (int len$ = entities.length, i$ = 0; i$ < len$; ++i$) { final Entity entity = arr$[i$]; if (entity != player && entity instanceof LivingEntity && entity.getType() != EntityType.SQUID && l.getWorld() == entity.getLocation().getWorld() && l.distance(entity.getLocation()) < 1.5) { return (LivingEntity)entity; } } } } return null; }
Код:LivingEntity entityTarget = rayTraceEntity(Player, 16); //И обязательно делать проверку на то не равен ли Entyty null if(entityTarget == null){ //Если равен ничему, то есть его нет. }else{ TODO }
Почему это говно? Скорее альтернатива твоему методу так же перебирает сущности как метод getNearbyEntities.Говно какое-то откопал, если че в баките уже есть готовый метод getNearbyEntities, к тому же для игрока уже написан лучший способ - перебирать всех игроков и по векторам быстренько проверить.
Ну так, зачем этот метод, если есть getNearbyEntities, да и в любом случаи твой метод вернет только одну сущность.Скорее альтернатива твоему методу так же перебирает сущности как метод getNearbyEntities.