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

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

BeLkA

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

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

Утилита:
Java:
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);
    }

}

Пример использования:

Java:
Player player = ...;

ShapedParticles.runEffect(player, ShapeType.HEAD_HEARTS, 2); // Аргумент 1 - Какому игроку воспроизвести эффект, Аргумент 2 - Тип партиклов, Аргумент 3 - Время в минутах

Скриншоты (Эффекты по порядку):
ZD9BG4O.png
2cLVlWK.png
jxO3Fw3.png
L73Vjxl.png
R8UcJgf.png

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

Спасибо за прочтение :)
 
Последнее редактирование:
Эм... Скрины?
Или это обычный партикл либ?
 
Не обычный)
Секунду, скрины сейчас будут.
Хм... Один час на планете Миллер равен 7 годам на земле.
То есть время там идет в 61320 медленнее..
То есть одна секунда это примерно 61320 / 60 / 60 ~ 17 часов.
Если мои догадки верны - скрины будут примерно сегодня в 5 вечера по МСК.
 
Хм... Один час на планете Миллер равен 7 годам на земле.
То есть время там идет в 61320 медленнее..
То есть одна секунда это примерно 61320 / 60 / 60 ~ 17 часов.
Если мои догадки верны - скрины будут примерно сегодня в 5 вечера по МСК.
Это сообщение оттуда наверное тоже не сразу пришло
 

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

Назад
Верх