1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите визуальные эффекты

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

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

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

    Баллы:
    78
    Skype:
    vlad_street
    Всем привет, можно ли к мечу(без доп модов) приделать какой нибудь эффект?

    Если нет, то подскажите как можно к игроку добавить эффект дыма, огня и т.д?
     
  2. _EnderWorld_

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

    Баллы:
    78
    EffectLib поищи в ютубе
     
  3. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    только он?

    как я понял через пакеты такое делается, да?
     
  4. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Через пакеты делается. В 1.8 по идее должны в NMS быть более-менее нормальные методы для вывода эффектов, но я ещё не искал.
    Я делал в PlayEffect при помощи рефлексий, но суть - отправка пакета "PacketPlayOutWorldParticles" с определенными параметрами.
     
  5. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    а где можно узнать?
    пример увидеть.
    Спасибо
     
  6. _EnderWorld_

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

    Баллы:
    78
    Лично я тренировался с пакетами партиклов у этого чувака, он правда не русский, посмотри его ролики и поймешь почему он именно.
    Ссылка - Жмяк
     
  7. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    он использует плагин который ты выше написал?
     
  8. _EnderWorld_

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

    Баллы:
    78
    Ну можно набрать и в ютубе просто слова: EffectLib Minecraft bukkit coding , и тебе найдется куча вариантов, я честно смотрел первые 5 видео.
     
  9. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    я именно сам хочу отправить пакет, разобраться с этим.
     
  10. Alex2772

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

    Баллы:
    76
    Skype:
    alex277270
    Имя в Minecraft:
    Alex2772
    Всё просто. Сливаю методы создания эффектов из своего плагина:
    Код:
    /**
         * Создаёт частицы.
         * @param type Тип
         * @param x Координата x
         * @param y Координата y
         * @param z Координата z
         * @param randSeed Погрешность
         * @param data Разброс
         * @param amount Количество
         * @param player Игрок, к которому нужно применить эффект
         * <p>
         * Список типов частиц:
         * <i>
         * <ul>
         * <li>hugeexplosion</li>
         * <li>largeexplode</li>
         * <li>fireworksSpark</li>
         * <li>bubble</li>
         * <li>suspended</li>
         * <li>depthsuspend</li>
         * <li>townaura</li>
         * <li>crit</li>
         * <li>magicCrit</li>
         * <li>smoke</li>
         * <li>mobSpell</li>
         * <li>mobSpellAmbient</li>
         * <li>spell</li>
         * <li>instantSpell</li>
         * <li>witchMagic</li>
         * <li>note</li>
         * <li>portal</li>
         * <li>enchantmenttable</li>
         * <li>explode</li>
         * <li>flame</li>
         * <li>lava</li>
         * <li>footstep</li>
         * <li>splash</li>
         * <li>largesmoke</li>
         * <li>cloud</li>
         * <li>reddust</li>
         * <li>snowballpoof</li>
         * <li>dripWater</li>
         * <li>dripLava</li>
         * <li>snowshovel</li>
         * <li>slime</li>
         * <li>heart</li>
         * <li>angryVillager</li>
         * <li>happyVillager</li>
         * <li>iconcrack_*</li>
         * <li>blockcrack_*_*</li>
         * <li>blockdust_*_*</li>
         * </ul>
         * </i>
         * </p>
         */
        public static void particle(String type, float x, float y, float z, float randSeed, float data, int amount, Player player) {
            PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(type, x, y, z, randSeed, randSeed, randSeed, data, amount);
            ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet);
        }
        /**
         * Создаёт частицы. Эффект увидят все игроки в массиве.
         * @param type Тип
         * @param x Координата x
         * @param y Координата y
         * @param z Координата z
         * @param randSeed Погрешность
         * @param data Разброс
         * @param amount Количество
         * @param player Игрок, к которому нужно применить эффект
         * <p>
         * Список типов частиц:
         * <i>
         * <ul>
         * <li>hugeexplosion</li>
         * <li>largeexplode</li>
         * <li>fireworksSpark</li>
         * <li>bubble</li>
         * <li>suspended</li>
         * <li>depthsuspend</li>
         * <li>townaura</li>
         * <li>crit</li>
         * <li>magicCrit</li>
         * <li>smoke</li>
         * <li>mobSpell</li>
         * <li>mobSpellAmbient</li>
         * <li>spell</li>
         * <li>instantSpell</li>
         * <li>witchMagic</li>
         * <li>note</li>
         * <li>portal</li>
         * <li>enchantmenttable</li>
         * <li>explode</li>
         * <li>flame</li>
         * <li>lava</li>
         * <li>footstep</li>
         * <li>splash</li>
         * <li>largesmoke</li>
         * <li>cloud</li>
         * <li>reddust</li>
         * <li>snowballpoof</li>
         * <li>dripWater</li>
         * <li>dripLava</li>
         * <li>snowshovel</li>
         * <li>slime</li>
         * <li>heart</li>
         * <li>angryVillager</li>
         * <li>happyVillager</li>
         * <li>iconcrack_*</li>
         * <li>blockcrack_*_*</li>
         * <li>blockdust_*_*</li>
         * </ul>
         * </i>
         * </p>
         */
        public static void particle(String type, float x, float y, float z, float randSeed, float data, int amount, Collection<? extends Player> players) {
            PacketPlayOutWorldParticles packet = new PacketPlayOutWorldParticles(type, x, y, z, randSeed, randSeed, randSeed, data, amount);
            for (Player player : players)
            ((CraftPlayer)player).getHandle().playerConnection.sendPacket(packet);
        }
    Если ты хочешь можешь выцепить оттуда код создания и отправки пакета. Примеры:
    Код:
    particle("blockcrack_159_14", Float.valueOf((float) df_loc.getX()), Float.valueOf((float) df_loc.getY())+1.25F, Float.valueOf((float) df_loc.getZ()), 0.3F, 1.2F, 30, getServer().getOnlinePlayers());
    - Создаёт эффект крови путем ломания блока красной глины на координатах df_loc.
    Код:
    particle("smoke", Float.valueOf((float) firstPoint.getX())+0.5F, Float.valueOf(y), Float.valueOf((float) firstPoint.getZ())+0.5F, 0.01F, 0F, 15, player);
    - Создание эффекта дыма на координатах firstPoint.
     
  11. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    о,спасибо огромное)
    [​IMG]
    что делать?
     
  12. _EnderWorld_

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

    Баллы:
    78
    у меня так же(
     
  13. Tiberiumk

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

    Баллы:
    76
    в качестве аналога можно использовать API плагина PlayEffect от @fromgate
     
  14. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Разбираться с версиями. Под какую делаете?

    1.8, к примеру, эффект идентифицируется не строкой (соответственно, упомянутое, blockcrack_159_14 работать не будет), а через ENUM.
    В PlayEffect, к примеру это сделано так: https://github.com/fromgate/PlayEff...effect/customeffects/PacketNMS.java#L198-L233
    Правда там через рефлексии, разбираться не удобно.
     
  15. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    1.8 версия. Так же делать как в плей эффект?
    хочу сделать все сам и в 1 плагине
     
  16. Tiberiumk

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

    Баллы:
    76
    Мда.. Зачем делать ещё раз, если уже сделано много раз?
     
  17. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    практика, опыт
     
  18. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    Ну можно также как и в плейффект. Но там через рефлексии, это для понимания процесса не очень удобно.

    Принцип же остается тот же - отправка пакета. Поэтому посмотрите конструктор пакета PacketPlayOutWorldParticles в 1.8, создавайте такой пакет и отправляйте его.

    Вообще, если собираетесь рисовать очень много эффектов, учитывайте то, что они создают нагрузку на:
    1. Клиента. Вообще сейчас клиент перестает отрисовывать частицы если превышено какое-то пороговое количество. Но не удивлюсь, если в какой-то момент времени это не сработает и можно будет подвесить его. По крайней мере фейерверками клиент подвесить очень легко.
    2. Канал сервера. Проигрывая эффект игрокам - вы отправляете каждому из них пакет. Соответственно, если вы проигрываете эффект 20 игрокам 50 эффектов, то вы отправляете 1000 пакетов. При этом сервер должен ещё передавать информацию о перемещениях мобов, отправлять даные с чанками и т.п.

    Ну а если Вы проигрываете просто несколько эффектов - то не парьтесь и просто отправляйте пакет.
     
  19. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    спасибо за информацию, почти всему серверу надо будет добавить свой эффект. При онлайне 30+ сервер наверно ляжет просто.
     
  20. fromgate

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

    Баллы:
    173
    Имя в Minecraft:
    fromgate
    @energy455
    Не всё так страшно. Пусть у Вас будет 30 человек. Допустим, один раз в тик (хотя это слишком часто, по факту надо будет реже) вы будете на каждом отображать один эффект. Если отправлять информацию всем игрокам это будет 30х30=900 эффектов. Но если Вы просчитаете, сколько игроков должно видеть эти эффекты.
    Допустим, измерите расстояние от игрока А до игрока Б и увидите, что игрок Б - вообще находится в другом мире или за сотню блоков и ему отсылать пакет с эффектом от игрока А не нужно. Проверите всех игроков и увидите, что количество пакетов значительно сократится.
    Кстати, могу ошибаться, но по моему в NMS даже метод был отправки пакетов игрокам в определенном радиусе. Поищите, методы связанные с пакетами - но если Вы вручную будете определять кому слать пакеты, то это будет замечательно работать.
     

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