Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Стрелы падают с небес (spawnArrow, launchProjectile)

StrayDog31

Новичок
Пользователь
Баллы
6
Приветствую! Хочу сделать предмет, который по нажатию ПКМ будет стрелять стрелами (или чем либо еще) с неба. Есть примерные наброски кода:
PHP:
@EventHandler

public void use10(PlayerInteractEvent e) {
   
    Player player = e.getPlayer();
    World world = player.getWorld();
    Arrow arrow = player.launchProjectile(Arrow.class);
    ItemStack SkullBook = e.getPlayer().getInventory().getItemInMainHand();
    ItemStack HoneyArmorC = e.getPlayer().getInventory().getChestplate();
    if(e.getPlayer().getInventory().getItemInMainHand().getType() != Material.BOOK) return;
    if(e.getAction() != Action.RIGHT_CLICK_AIR && e.getAction() != Action.RIGHT_CLICK_BLOCK) return;
    if(!SkullBook.getItemMeta().hasDisplayName()) return;
    if(!SkullBook.getItemMeta().getDisplayName().equals(ChatColor.GOLD + "Огненный дождь")) return;
    if(e.getPlayer().getExp() == 0) return;

     
    player.playSound(player.getLocation(), Sound.ENTITY_LIGHTNING_BOLT_THUNDER, 8, 1);
    player.spawnParticle(Particle.CLOUD, player.getLocation().add(0.5D, 0.5D, 0.5D), 25 , 1.2F, 1.2F, 1.2F);
    world.spawnArrow(player.getTargetBlock(null, 10).getLocation(), null, 0, 0);
    arrow.teleport(player.getTargetBlock(null, 10).getLocation());
    arrow.setVelocity(direction.multiply(4));
    if(e.getPlayer().getInventory().getChestplate().getType() == Material.GOLDEN_CHESTPLATE && HoneyArmorC.getItemMeta().hasDisplayName() && HoneyArmorC.getItemMeta().getDisplayName().equals(ChatColor.YELLOW + "Пчелиный нагрудник")) player.giveExp(+1);
   
    }
По сути, план состоит в том, чтобы создать стрелы на сколько-то блоков по У выше TargetBlock и задать им направление "вниз" (В коде есть два варианта). Но, во-первых, не понимаю, как задать это самое направление, а, во-вторых, хотелось бы узнать, есть ли способ создать стрелы в определенном радиусе, чтобы увеличить площадь поражения (Не знаю, как лучше объяснить, надеюсь, понятно, о чем я). Знающие люди, подскажите, пожалуйста, что делать!
 
нашёл на англоязычном баките, переделаешь под себя:
for(int i = 0 ; i < 3 ; i++) {

int spread = 0;

if(i == 0) spread = -45;
else if (i == 2) spread = 45;

double pitch = ((player_location.getPitch() + 90) * Math.PI) / 180;
double yaw = ((player_location.getYaw() + 90 + spread) * Math.PI) / 180;

double z_axis = Math.sin(pitch);

x = z_axis * Math.cos(yaw);
y = z_axis * Math.sin(yaw);
z = Math.cos(pitch);

Vector vector = new Vector(x, z, y);

player.shootArrow().setVelocity(vector.multiply(2));
}
 
нашёл на англоязычном баките, переделаешь под себя:
for(int i = 0 ; i < 3 ; i++) {

int spread = 0;

if(i == 0) spread = -45;
else if (i == 2) spread = 45;

double pitch = ((player_location.getPitch() + 90) * Math.PI) / 180;
double yaw = ((player_location.getYaw() + 90 + spread) * Math.PI) / 180;

double z_axis = Math.sin(pitch);

x = z_axis * Math.cos(yaw);
y = z_axis * Math.sin(yaw);
z = Math.cos(pitch);

Vector vector = new Vector(x, z, y);

player.shootArrow().setVelocity(vector.multiply(2));
}
Благодарю. Но не могли бы вы объяснить, что за переменная i и для чего она нужна?
 
Количество стрел
Спасибо. Но, почему-то все равно ни в какую не работает (скорее всего, у меня руки просто кривые). Я попробовал сделать проще, но все равно есть какие-то проблемы. Возможно ли это реализовать как-то так?
PHP:
 Vector vector = new Vector(0, -1, 0);
        //world.spawnArrow(player.getLocation(), vector.multiply(2), 1, 1);
        Entity arrow = player.launchProjectile(Snowball.class);
        arrow.setVelocity(vector.multiply(1f));
 

Поделиться этой страницей

Назад
Верх