Тройной выстрел из лука, multi shot bow

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
1.12.2
Хотел сделать тройной выстрел из лука, посмотрел на форуме, пишут
Java:
 @EventHandler
    public void onProjectileLaunch(ProjectileLaunchEvent event) {
        Projectile projectile = event.getEntity();
        ProjectileSource source = projectile.getShooter();
        if (!(source instanceof Player)) {
            return;
        }
        Player player = (Player) source;
        if (!player.getItemInHand().getType().equals(Material.BOW)) {
            return;
        }
        if (!this.isMultiArrowEnabled) {
            return;
        }
        for (int i = 0; i < 5; i++) {
            player.launchProjectile(Arrow.class);
        }
    }
я попробовал чуть переделать, что то не работает, успешно выполняет все 3 сообщения
Java:
    @EventHandler
        public void Launch(ProjectileLaunchEvent event) {
        Projectile projectile = event.getEntity();
        ProjectileSource source = projectile.getShooter();
        if (!(source instanceof Player)) {
            return;
        }
        Player p = (Player) source;
        if (p.getInventory().getItemInMainHand() == null) return;
        if (!p.getInventory().getItemInMainHand().hasItemMeta()) return;
        p.sendMessage("1");
        if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA +"Multi Bow"));      
        p.sendMessage("2");
        if (!this.isMultiArrowEnabled) {
            p.sendMessage("3");
            return;
        }
        for (int i = 0; i < 5; i++) {
            p.launchProjectile(Arrow.class);
        }
    }
}
 
Последнее редактирование:

Baroness's Dev

Разработчик
Пользователь
Java:
if (source instanceof Player) {
    Player p = (Player) source;
    if (p.getInventory().getItemInMainHand() == null) return;
    if (!p.getInventory().getItemInMainHand().hasItemMeta()) return;
    if (p.getItemInHand().getType().equals(Material.BOW)) {
        if (p.getInventory().getItemInMainHand().getItemMeta().getDisplayName().equals(ChatColor.DARK_AQUA +"Multi Bow")) {
            if (!this.isMultiArrowEnabled) {
                return;
            }
            for (int i = 0; i < 3; i++) {
                player.launchProjectile(Arrow.class);
            }
        }
    }
}
Писал от руки, но, думаю, будет работать
 

q20w26a

Разработчик
Пользователь
Я советую для начала опробовать вообще этот метод, может беда с ним?
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
Black_Baroness, так это же не отличается от моей версии, ток там зач проверку на материал мб я что то не дописал или метод не робит
Авто объединение сообщений:

q20w26a, походу что так, а есть другие способы?
 

Baroness's Dev

Разработчик
Пользователь
можно добавить проверку на то, что это именно стрела:
Java:
  if (e.getEntity() instanceof Arrow){
Авто объединение сообщений:

Java:
    @EventHandler
    public void onProjectileLaunch(ProjectileLaunchEvent e) {      
        ProjectileSource source = projectile.getShooter();
        if (source instanceof Player) {
            if (e.getEntity().getType() == EntityType.ARROW) {
                Arrow arrow = (Arrow) e.getEntity();
                Player p = (Player) arrow.getShooter();
                Arrow projectile = player.launchProjectile(Arrow.class);
                for (int i = 0; i < 3; i++) p.launchProjectile(Arrow.class);
            }
        }
    }
А если сделать вот так?
 
Последнее редактирование:

q20w26a

Разработчик
Пользователь
Я имел ввиду убрать вообще все проверки, оставив только проверку на то, что это лук.
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
q20w26a, да это вообще не в проверке дело, сам метод не тот
Авто объединение сообщений:

Black_Baroness, минус сервер, он полетел
 
Последнее редактирование:

BlackBarcode13

Разработчик
Пользователь
Используй EntityShootBowEvent, кансели ивент и лаунчи стрелы от игрока.
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
mc923, пожалуйста, обьясни для рака, как это должно выглядеть
 

BlackBarcode13

Разработчик
Пользователь
Java:
    @EventHandler
    public void onBowShoot(EntityShootBowEvent e) {
        Entity entity = e.getEntity();
        if (!(entity instanceof  Player)) {
            return;
        }
        Player player = (Player) entity;
        Vector velocity = e.getProjectile().getVelocity();
        e.setCancelled(true);
        for (int i = 0; i < 3; i++) {
            player.launchProjectile(Arrow.class).setVelocity(velocity);
        }
    }
 

scrimers

ПОВЕЛИТЕЛЬ РАКОВ
Пользователь
mc923, а такой опрос, а зач канселить, можно же сделать 2 стрелы(прочт интересно)
 

BlackBarcode13

Разработчик
Пользователь
scrimers, можно и припихнуть две стрелы, на вкус и цвет товарища нет.
Но мне кажется так красивее, ибо более гибко (в плане, что можно стрельнуть не только стрелами).
 
Последнее редактирование:

BlackBarcode13

Разработчик
Пользователь
scrimers, только играть с вектором и ручками в зависимости от номера стрелы, меняя x z координаты в векторе.
 

q20w26a

Разработчик
Пользователь
Авто объединение сообщений:

Может костыльно, но можно сместить изначальный вектор немного влево, и потом уже циклом прибавлять к нему немного.
 

BlackBarcode13

Разработчик
Пользователь
q20w26a, есть же метод вращать по окружности. Берем двумерную плоскость и вращаем каждый как надо.
 

Комнаты в чате

Верх Низ