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

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

Discussion in 'Разработка плагинов для новичков' started by energy455, Aug 6, 2015.

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

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

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

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

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

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

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

    Trophy Points:
    78
    Skype:
    vlad_street
    только он?

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

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    76
    Skype:
    alex277270
    Имя в Minecraft:
    Alex2772
    Всё просто. Сливаю методы создания эффектов из своего плагина:
    Code:
    /**
         * Создаёт частицы.
         * @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);
        }
    Если ты хочешь можешь выцепить оттуда код создания и отправки пакета. Примеры:
    Code:
    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.
    Code:
    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 Активный участник Пользователь

    Trophy Points:
    78
    Skype:
    vlad_street
    о,спасибо огромное)[DOUBLEPOST=1439277128,1439210256][/DOUBLEPOST]
    [​IMG]
    что делать?
     
  12. _EnderWorld_

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

    Trophy Points:
    78
    Имя в Minecraft:
    Steve
    у меня так же(
     
  13. Tiberiumk

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

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

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

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

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

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

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

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

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

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

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

    Trophy Points:
    78
    Skype:
    vlad_street
    спасибо)
     
  19. LaoTheLizard

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

    Trophy Points:
    103
    Skype:
    sgp_the_controller
    Вызываю процедуру sendToLocation() из следующего класса:
    Code:
    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 Старожил Девелопер Пользователь

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

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

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

Share This Page