Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите [РЕШЕНО] Проиграть плагином звук из мода

Тема в разделе "Разработка плагинов для новичков", создана пользователем LaoTheLizard, 7 дек 2015.

  1. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Единственный способ, которым я смог воспроизвести плагином звук из мода:
    Код:
    Bukkit.dispatchCommand(Bukkit.getConsoleSender(), "playsound mocreatures:appearmagic " + ((Player)e.getEntity()).getName());
    
    Звук звучит. В консоли при этом выводятся такие строки каждый раз:
    [​IMG]

    Есть ли более элегантное решение задачи? Или хотя бы способ убрать вывод в консоль этих оповещений?
     
  2. Хостинг MineCraft
    <
  3. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
  4. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Я не сказал, что не пробовал этот метод. Просто я не смог вызвать звук из мода этим методом. По крайней мере так:
    Код:
    playSound((Player)e.getEntity(), "WITHER_SHOOT");
    
    // plays sound
    public static void playSound(Player p, String sound) {
        try {
            Sound snd = Sound.valueOf(sound);
            p.getWorld().playSound(p.getLocation(), snd, 1.2f, (float) 1.0);
        } catch (IllegalArgumentException e) {
            log.info("Invalid sound!");
            e.printStackTrace();
        }
    }
    
    Если написать точно, как я показал, будет звук выстрела ифрита. Я пытался подставить вместо "WITHER_SHOOT" разные значения. И везде выдавало ошибку, вроде Wrong source file или типа того (не помню точно).

    Такие варианты пришли в голову.
    mocreatures_appearmagic
    mocreatures:appearmagic
    MOCREATURES_APPEARMAGIC
    MOCREATURES:APPEARMAGIC

    Кто-нибудь знает, как нужно написать, чтоб звук, наконец, прозвучал?
     
  5. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Ясное дело что snd у вас null. Используйте метод со строковым параметром, а не Sound
     
  6. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Ты абсолютно прав!

    Дальнейшее изучение вопроса показало, что звук можно воспроизвести только через метод игрока player.playSound(Location, String float, float); (у мира метода со строковым параметром нет). Метод этот deprecated, но это, конечно, не проблема. Действительно проблема в том, что проигрывание звука через этот метод не приведёт к тому, что стоящие рядом с игроком-целью игроки тоже услышат звук (да-да, все давно знали, а вот я только что узнал). Чтобы решить этот вопрос, я написал такой метод:

    Код:
    /**
        *Location location - место, откуда должен исходить звук, String sound - название звука,
        *float volume - громкость звука в центре, float pitch - тональность звука,
          */
        public boolean playModSound(Location location, String sound, float volume, float pitch){
            Collection <? extends Player> players = Bukkit.getServer().getOnlinePlayers();
            if(players.size() == 0){return true;} // на всякий случай
            int radius = 15;
            for(Player p:players){
                int S = Distance(location, p.getLocation()); // расстояние от источника звука до игрока, где Distance - процедура, которую я здесь не привожу
                float maxvolume = 1.2F;
                if(S > radius * volume){continue;} // здесь уже не слышно
                float v = maxvolume - ((S / radius) / volume); // ниже поговорим об этой формуле
                if(v <= 0){continue;} // на всякий случай      
                try {
                p.playSound(p.getLocation(), sound, v, pitch);
                } catch (Exception e) {return false;}
            }
            return true;
    
    Формула рассчитывает громкость звука в точке, где находится очередной игрок. Каждые 1.0F от volume добавляют к радиусу звука 15 блоков дальности. То есть, при volume = 4.0F звук будет слышен на том же расстоянии, что и взрыв ТНТ (он слышен на 60 блоков максимум, проверено).

    Собственно, хотелось бы конструктивной критики кода, так как я не уверен, что корректно решаю эту задачу.
     
  7. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Если у тебя свой расчёт громкости, то сгодится, а если тебе нужно сделать звук как это было бы на самом деле, то в первый аргумент ставь не позицию игрока, а позицию источника звука.
     
  8. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Опять я изобрел велосипед, действительно, всё было куда проще.
    Для тех, кому понадобится:
    Код:
        @SuppressWarnings("deprecation")
        public boolean playModSoundNaturally(Location location, String sound, float volume, float pitch){
            Collection <? extends Player> players = Bukkit.getServer().getOnlinePlayers();
            if(players.size() == 0){return true;}
            for(Player p:players){
                try {
                p.playSound(location, sound, volume, pitch);
                } catch (Exception e){return false;}
            }
            return true;
        }
    
    @Den_Abr , благодарю за помощь.
     
  9. MrTrojan

    MrTrojan Активный участник Пользователь

    Баллы:
    98
    Skype:
    mrtrojan.ru
    Имя в Minecraft:
    MrTrojan
    Зачем фигурные скобки? Без них можно.
    Код:
    if(players.size() == 0) return true;
     
  10. Автор темы
    LaoTheLizard

    LaoTheLizard Старожил Пользователь

    Баллы:
    103
    Skype:
    sgp_the_controller
    Я знаю. Для моего глаза так нагляднее.
     
  11. Agravaine

    Agravaine Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    Agravaine25
    Согласен. Со скобками смотрится эстетичнее.
     
  12. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Без скобок пишут только конченные.
     
  13. Agravaine

    Agravaine Активный участник Пользователь

    Баллы:
    88
    Имя в Minecraft:
    Agravaine25
    Люто плюсую :D
     
  14. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Когда одно действие - это нормально.
    А ещё isEmpty() используйте.

    Также для поиска игроков можно использовать метод getNearbyEntities()
     
  15. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Да, это валидно. Но читается весьма не удобно.
     
  16. GoodCoder

    GoodCoder Активный участник Пользователь

    Баллы:
    76
    Ну для тебя может быть и неудобно. А я люблю так сокращать, дабы не было лишних строк.
     
  17. Dereku

    Dereku Старожил

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Как будто они на что то влияют.
     

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