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

[УТИЛИТА] Необычные партиклы

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

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

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

    Баллы:
    153
    Skype:
    FayStaff
    Я знаю, что это все давно уже есть в паблике, да и вытащить это просто, но я собрал некоторый код из разных уголков баккита, и сделал утилиту для партиклов, и Вы можете ей удобно пользоваться в своем плагине, плюс, понять, как это все работает. Все очень просто и понятно (Надеюсь)

    Для использования утилиты требуется этот класс - https://bukkit.org/threads/1-8-particleeffect-v1-7.154406/

    Утилита:
    Код:
    public class ShapedParticles {
    
        public enum ShapeType {
            HEAD_HEARTS("Необычные Сердца"),
            HEAD_MAGIC("Темная Магия"),
            HEAD_NOTE("Громкие Ноты"),
            SNAKE("Водная Змея"),
            RAIN("Облачный Дождь");
    
            private String name;
    
            ShapeType(String name) {
                this.name = name;
            }
    
            public String getName() { return name; }
        }
    
        public static void runEffect(Player p, ShapeType type, int minutes) {
            switch(type) {
                case HEAD_HEARTS:
                    runHeart(p, minutes * 20 * 60);
                    break;
                case HEAD_MAGIC:
                    runMagic(p, minutes * 20 * 60);
                    break;
                case HEAD_NOTE:
                    runNote(p, minutes * 20 * 60);
                    break;
                case SNAKE:
                    runSnake(p, minutes * 20 * 60);
                    break;
                case RAIN:
                    runRain(p, minutes * 20 * 60);
                    break;
            }
    
            p.sendMessage("§7Для вас включен эффект §c" + type.getName() + "§7!");
            p.sendMessage("§7Время действия эффекта - §c" + minutes + " " + getMinutes(minutes) + "§7!");
        }
    
        public static String getMinutes(int minutes) {
            if(minutes >= 11 && minutes <= 19) return "минут";
    
            String last = String.valueOf(minutes);
    
            int lastNumber = Integer.parseInt(last.substring(last.length() - 1, last.length()));
    
            if(lastNumber == 1) return "минута";
    
            if(lastNumber >= 2 && lastNumber <= 4) return "минуты";
    
            return "минут";
        }
    
        private static void runHeart(final Player p, final int ticks)
        {
            final double radialsPerStep = Math.PI / 4;
    
            new BukkitRunnable() {
    
                float step = 0;
                int count = 0;
    
                @Override
                public void run() {
    
                    if(p == null || !p.isOnline()) {
                        this.cancel();
                        return;
                    }
    
                    if(count >= ticks) {
                        p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_HEARTS.getName() + " §7закончено!");
                        this.cancel();
                        return;
                    }
    
                    Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
    
                    ParticleEffect.HEART.display(newLoc, 0, 0, 0, 0, 1);
    
                    step++;
                    count++;
                }
    
            }.runTaskTimer(Core.getPlugin(), 0, 2);
        }
    
        private static void runMagic(final Player p, final int ticks)
        {
            final double radialsPerStep = Math.PI / 4;
    
            new BukkitRunnable() {
    
                float step = 0;
                int count = 0;
    
                @Override
                public void run() {
    
                    if(p == null || !p.isOnline()) {
                        this.cancel();
                        return;
                    }
    
                    if(count >= ticks) {
                        p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_MAGIC.getName() + " §7закончено!");
                        this.cancel();
                        return;
                    }
    
                    Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
    
                    ParticleEffect.WITCH_MAGIC.display(newLoc, 0, 0, 0, 0, 10);
    
                    step++;
                    count+=2;
                }
    
            }.runTaskTimer(Core.getPlugin(), 0, 2);
        }
    
        private static void runNote(final Player p, final int ticks)
        {
            final double radialsPerStep = Math.PI / 4;
    
            new BukkitRunnable() {
    
                float step = 0;
                int count = 0;
    
                @Override
                public void run() {
    
                    if(p == null || !p.isOnline()) {
                        this.cancel();
                        return;
                    }
    
                    if(count >= ticks) {
                        p.sendMessage("§7Время действия эффекта §c" + ShapeType.HEAD_NOTE.getName() + " §7закончено!");
                        this.cancel();
                        return;
                    }
    
                    Location newLoc = p.getLocation().add(0, 2, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
    
                    ParticleEffect.NOTE.display(newLoc, 0, 0, 0, 10, 1);
    
                    step++;
                    count+=2;
                }
    
            }.runTaskTimer(Core.getPlugin(), 0, 2);
        }
    
        private static void runSnake(final Player p, final int ticks) {
            new BukkitRunnable() {
    
                float step = 0;
                int count = 0;
    
                @Override
                public void run() {
    
                    if(p == null || !p.isOnline()) {
                        this.cancel();
                        return;
                    }
    
                    if(count >= ticks) {
                        p.sendMessage("§7Время действия эффекта §c" + ShapeType.SNAKE.getName() + " §7закончено!");
                        this.cancel();
                        return;
                    }
    
                    Vector vector = new Vector();
                    Location location = p.getLocation();
    
                    for (int i = 0; i < 10; i++) {
    
                        step++;
    
                        float t = (float) Math.PI / 150 * step;
                        float r = (float) Math.sin(t) * 1.0F;
                        float s = (float) (Math.PI * 2) * t;
    
                        vector.setX(1.0F * r * Math.cos(s) + 0.0F);
                        vector.setZ(1.0F * r * Math.sin(s) + 0.0F);
                        vector.setY(2.0F * 1.0F * Math.cos(t) + 0.8F + 1);
    
                        if(i <= 1) {
                            ParticleEffect.SMOKE.display(location.add(vector), 5, 0.0F, 0.0F, 0.0F, 0.0F, 1);
                        } else {
                            ParticleEffect.MAGIC_CRIT.display(location.add(vector), 5, 0.0F, 0.0F, 0.0F, 0.0F, 1);
                        }
    
                        location.subtract(vector);
                    }
    
                    count++;
                }
    
            }.runTaskTimer(Core.getPlugin(), 0, 1);
        }
    
        private static void runRain(final Player p, final int ticks)
        {
            final double radialsPerStep = Math.PI / 4;
    
            new BukkitRunnable() {
    
                float step = 0;
                int count = 0;
    
                @Override
                public void run() {
    
                    if(p == null || !p.isOnline()) {
                        this.cancel();
                        return;
                    }
    
                    if(count >= ticks) {
                        p.sendMessage("§7Время действия эффекта §c"  + ShapeType.RAIN.getName() + " §7закончено!");
                        this.cancel();
                        return;
                    }
    
                    Location newLoc = p.getLocation().add(0, 3, 0).add(Math.cos(radialsPerStep * this.step) * 0.4, 0.0D, Math.sin(radialsPerStep * this.step) * 0.4);
    
                    for(int i = 0; i < 10; i++) {
                        ParticleEffect.EXPLODE.display(newLoc, 0, 0, 0, 0, 1);
                    }
    
                    ParticleEffect.DRIP_WATER.display(newLoc, 0, 0, 0, 0, 1);
    
                    step++;
                    count+=2;
                }
    
            }.runTaskTimer(Core.getPlugin(), 0, 2);
        }
    
    }
    
    Пример использования:

    Код:
    Player player = ...;
    
    ShapedParticles.runEffect(player, ShapeType.HEAD_HEARTS, 2); // Аргумент 1 - Какому игроку воспроизвести эффект, Аргумент 2 - Тип партиклов, Аргумент 3 - Время в минутах
    Скриншоты (Эффекты по порядку):
    [​IMG] [​IMG] [​IMG] [​IMG] [​IMG]

    Надеюсь, это оказалось для кого-то полезным!

    Спасибо за прочтение :)
     
    Последнее редактирование: 18 июл 2015
  2. Хостинг MineCraft
    <
  3. Plasticable

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

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Больше партиклов можно добавить
     
  4. Автор темы
    BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Это да, но класс создан для того, чтобы научить пользоваться ими красиво c:
     
  5. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Эм... Скрины?
    Или это обычный партикл либ?
     
  6. Автор темы
    BeLkA

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

    Баллы:
    153
    Skype:
    FayStaff
    Не обычный)
    Секунду, скрины сейчас будут.
     
  7. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Хм... Один час на планете Миллер равен 7 годам на земле.
    То есть время там идет в 61320 медленнее..
    То есть одна секунда это примерно 61320 / 60 / 60 ~ 17 часов.
    Если мои догадки верны - скрины будут примерно сегодня в 5 вечера по МСК.
     
  8. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Это сообщение оттуда наверное тоже не сразу пришло
     
  9. ql_Nik_lp

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

    Баллы:
    173
    Skype:
    q-nik-p
    Имя в Minecraft:
    ql_Nik_lp
    Пинг от Гаргантюа?
     

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