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

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

energy455

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

Если нет, то подскажите как можно к игроку добавить эффект дыма, огня и т.д?
 
Всем привет, можно ли к мечу(без доп модов) приделать какой нибудь эффект?

Если нет, то подскажите как можно к игроку добавить эффект дыма, огня и т.д?
EffectLib поищи в ютубе
 
Через пакеты делается. В 1.8 по идее должны в NMS быть более-менее нормальные методы для вывода эффектов, но я ещё не искал.
Я делал в PlayEffect при помощи рефлексий, но суть - отправка пакета "PacketPlayOutWorldParticles" с определенными параметрами.
 
а где можно узнать?
пример увидеть.
Спасибо
Лично я тренировался с пакетами партиклов у этого чувака, он правда не русский, посмотри его ролики и поймешь почему он именно.
Ссылка - Жмяк
 
Лично я тренировался с пакетами партиклов у этого чувака, он правда не русский, посмотри его ролики и поймешь почему он именно.
Ссылка - Жмяк
он использует плагин который ты выше написал?
 
он использует плагин который ты выше написал?
Ну можно набрать и в ютубе просто слова: EffectLib Minecraft bukkit coding , и тебе найдется куча вариантов, я честно смотрел первые 5 видео.
 
Ну можно набрать и в ютубе просто слова: EffectLib Minecraft bukkit coding , и тебе найдется куча вариантов, я честно смотрел первые 5 видео.
я именно сам хочу отправить пакет, разобраться с этим.
 
Всё просто. Сливаю методы создания эффектов из своего плагина:
Код:
/**
     * Создаёт частицы.
     * @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.
 
Всё просто. Сливаю методы создания эффектов из своего плагина:
Код:
/**
     * Создаёт частицы.
     * @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.
о,спасибо огромное)
Всё просто. Сливаю методы создания эффектов из своего плагина:
Код:
/**
     * Создаёт частицы.
     * @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.
jJjAlii.png

что делать?
 
о,спасибо огромное)

jJjAlii.png

что делать?

Разбираться с версиями. Под какую делаете?

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

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

хочу сделать все сам и в 1 плагине

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

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

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

Ну а если Вы проигрываете просто несколько эффектов - то не парьтесь и просто отправляйте пакет.
 
Ну можно также как и в плейффект. Но там через рефлексии, это для понимания процесса не очень удобно.

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

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

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

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

Назад
Верх