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

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

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

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

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

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

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

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

    Баллы:
    78
    Имя в Minecraft:
    Steve
    EffectLib поищи в ютубе
     
  4. Автор темы
    energy455

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

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

    как я понял через пакеты такое делается, да?
     
  5. Автор темы
    energy455

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

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

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

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

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

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

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

    Баллы:
    78
    Имя в Minecraft:
    Steve
    Ну можно набрать и в ютубе просто слова: 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
    о,спасибо огромное)[DOUBLEPOST=1439277128,1439210256][/DOUBLEPOST]
    [​IMG]
    что делать?
     
  12. _EnderWorld_

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

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

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

    Баллы:
    76
    Skype:
    tiberium_11111
    Имя в Minecraft:
    Tiberium
    в качестве аналога можно использовать API плагина PlayEffect от @fromgate
     
  14. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    1.8 версия. Так же делать как в плей эффект?[DOUBLEPOST=1439285118,1439282341][/DOUBLEPOST]
    хочу сделать все сам и в 1 плагине
     
  15. Tiberiumk

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

    Баллы:
    76
    Skype:
    tiberium_11111
    Имя в Minecraft:
    Tiberium
    Мда.. Зачем делать ещё раз, если уже сделано много раз?
     
  16. Автор темы
    energy455

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

    Баллы:
    78
    Skype:
    vlad_street
    практика, опыт
     
  17. Автор темы
    energy455

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

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

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

    Баллы:
    78
    Skype:
    vlad_street
    спасибо)
     
  19. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Вызываю процедуру sendToLocation() из следующего класса:
    Код:
    import java.lang.reflect.Method;
    import org.bukkit.Bukkit;
    import org.bukkit.Location;
    import org.bukkit.entity.Entity;
    import org.bukkit.entity.Player;
    
    public enum particleeffects {
    
        HUGE_EXPLODE("hugeexplosion", 0), LARGE_EXPLODE("largeexplode", 1), FIREWORK_SPARK("fireworksSpark", 2), AIR_BUBBLE(
                "bubble", 3), SUSPEND("suspend", 4), DEPTH_SUSPEND("depthSuspend", 5), TOWN_AURA("townaura", 6), CRITICAL_HIT(
                "crit", 7), MAGIC_CRITICAL_HIT("magicCrit", 8), MOB_SPELL("mobSpell", 9), MOB_SPELL_AMBIENT(
                "mobSpellAmbient", 10), SPELL("spell", 11), INSTANT_SPELL("instantSpell", 12), BLUE_SPARKLE("witchMagic",
                13), NOTE_BLOCK("note", 14), ENDER("portal", 15), ENCHANTMENT_TABLE("enchantmenttable", 16), EXPLODE(
                "explode", 17), FIRE("flame", 18), LAVA_SPARK("lava", 19), FOOTSTEP("footstep", 20), SPLASH("splash", 21), LARGE_SMOKE(
                "largesmoke", 22), CLOUD("cloud", 23), REDSTONE_DUST("reddust", 24), SNOWBALL_HIT("snowballpoof", 25), DRIP_WATER(
                "dripWater", 26), DRIP_LAVA("dripLava", 27), SNOW_DIG("snowshovel", 28), SLIME("slime", 29), HEART("heart",
                30), ANGRY_VILLAGER("angryVillager", 31), GREEN_SPARKLE("happyVillager", 32), ICONCRACK("iconcrack", 33), TILECRACK(
                "tilecrack", 34);
    
        private String name;
        private int id;
    
        particleeffects(String name, int id) {
            this.name = name;
            this.id = id;
        }
    
        String getName() {
            return name;
        }
    
        int getId() {
            return id;
        }
    
        public static void sendToPlayer(particleeffects effect, Player player, Location location, float offsetX, float offsetY,
                float offsetZ, float speed, int count) {
            try {
                Object packet = createPacket(effect, location, offsetX, offsetY, offsetZ, speed, count);
                sendPacket(player, packet);
            } catch (Exception e) {
                e.printStackTrace();
            }
    
        }
    
        public static void sendToLocation(particleeffects effect, Location location, float offsetX, float offsetY, float offsetZ, float speed, int count) {
            try {
                Object packet = createPacket(effect, location, offsetX, offsetY, offsetZ, speed, count);
                for (Player player : Bukkit.getOnlinePlayers()) {
                    if(S(location, player.getLocation()) < 30){sendPacket(player, packet);}
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        private static Object createPacket(particleeffects effect, Location location, float offsetX, float offsetY,
                float offsetZ, float speed, int count) throws Exception {
            if (count <= 0) {count = 1;}
            Object packet = net.minecraft.server.v1_7_R4.PacketPlayOutWorldParticles.class.getConstructor(String.class, float.class, float.class,
                    float.class, float.class, float.class, float.class, float.class, int.class).newInstance(effect.name, (float) location.getX(),
                            (float) location.getY(), (float) location.getZ(), offsetX, offsetY, offsetZ, speed, count);
            return packet;
        }
    
        private static void sendPacket(Player p, Object packet) throws Exception {
            Object eplayer = getHandle(p);
            java.lang.reflect.Field playerConnectionField = eplayer.getClass().getField("playerConnection");
            Object playerConnection = playerConnectionField.get(eplayer);
            for (Method m : playerConnection.getClass().getMethods()) {
                if (m.getName().equalsIgnoreCase("sendPacket")) {
                    m.invoke(playerConnection, packet);
                    return;
                }
            }
        }
    
        private static Object getHandle(Entity entity) {
            try {
                Method entity_getHandle = entity.getClass().getMethod("getHandle");
                Object nms_entity = entity_getHandle.invoke(entity);
                return nms_entity;
            } catch (Exception ex) {
                ex.printStackTrace();
                return null;
            }
        }
       
        public static Integer S(Location loc, Location target){
            double x1 = loc.getX(), y1 = loc.getY(), z1 = loc.getZ(), x2 = target.getX(), y2 = target.getY(), z2 = target.getZ();
            int S = (int)Math.sqrt( Math.pow ((x1 - x2), 2) + Math.pow ((y1 - y2), 2) + Math.pow ((z1 - z2), 2));
            return S;
        }
    
    }
    
    получаю в ответ это:
    [​IMG]

    Почему так? И как исправить?
     
  20. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    1 вопрос. Если юзаешь NMS, то зачем тогда подмешивать рефлексии?
     
  21. LaoTheLizard

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

    Баллы:
    103
    Skype:
    sgp_the_controller
    Проблема в том, что мне нужно было в плагин свой добавить партиклы, я поискал в интернете и нашел этот API. Он мне понравился тем, что он маленький. Часть строк я вообще не понимаю, как работает, так как с пакетами никогда не работал. Но там, где я взял этот код, вроде автору "спасибо" говорили, из чего я решил, что он рабочий. Впрочем, там вроде говорилось об 1.7.2, а у меня Cauldron 1.7.10.
     

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