1. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Как настроить время действия частиц

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

Статус темы:
Закрыта.
  1. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Мне нужно спавнить частицы на блоке чтобы они оставались на нём на некоторое время (секунд 60). Например координаты блока - p.getLocation(). Получилось спавнить частицы на этом блоке, но они пропадают через пару секунд.
    public class Particles extends JavaPlugin {
    public void onEnable() {
    BukkitScheduler scheduler = getServer().getScheduler();
    scheduler.scheduleSyncRepeatingTask(this, new Runnable() {
    @Override
    public void run() {
    for (Player p : Bukkit.getOnlinePlayers()) {
    p.spawnParticle(Particle.PORTAL, p.getLocation(), 400); //здесь пробовал указывать второй
    //аргумент - тогда частицы вообще не спавняться
    }
    }
    }, 0L, 450L);
    }
    }

    Да, я ходил в гугл, но там в основном предлагают использовать сторонние библиотеки и при этом пишут, что можно и с помощью BukkitAPI. Как сделать с помощью Bukkit нашёл, то что выше
    Как это сделать до конца?

    UPD:
    Сделал цикл для спавна частиц (это не помогло, ну логично - просто облако частиц) , понизил им скорость - тоже не помогло - они всё равно падают под блоки. Как сдлеать чтобы частицы оставались на блоке 60 секунд?
     
    Последнее редактирование: 4 июн 2020
  2. alexandrage

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

    Баллы:
    173
  3. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Sheluder я видел. Только не совсем понимаю как его использовать в данном случае. Единственная мысль - в отдельном потоке сделать задержку и вызывать частицы, чтобы выглядело как будто они там постоянно. Но мне нужно сделать если игрок перемещается на другой блок - частицы создаются и на нём, ждут 60 сек. и пропадают. Но тогда для каждого блока нужно создавать отдельный поток с отсчётом времени. Мне кажется это плохо или нет?
     
  4. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Ты не сможешь породить частицы через бакит апи в отдельном потоке, но ты можешь сделать шедулер который будет работать в основном потоке и порождать частицы сколько тебе нужно. Если ты хочешь прицепить это к PlayerMoveEvent, то это очень плохая идея
     
  5. BestKVanT

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

    Баллы:
    76
    так частицы за игроком лететь должны, все равно без плеермува не обойдешься.
     
  6. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Если бы они должны были летать за игроком, то плеермув был бы самым тупым решением. Чел хочет чтобы они спавнились над блоком.
    Код:
        public void ParticleSpawner(Location loc) {
            Location l = loc.clone();
            l.add(0.5, 1, 0.5);
            
            new BukkitRunnable() {
                int i = 60;
                @Override
                public void run() {
                    i--;
                    if (i == 0)this.cancel();
                    l.getWorld().spigot().playEffect(l, Effect.CLOUD, 0, 0, 0.0f, 0.0f, 0.0f, 0.0f, 5, 15);
                }
            }.runTaskTimer(plugin, 0, 20);
        }
     
  7. alexandrage

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

    Баллы:
    173
    Одного хватит, просто веди запись времени.
     
  8. Sigvegutt

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

    Баллы:
    96
    Совет, сделай так: [spоiler][cоde]Текст[/code][/spoiler]
    Код:
    Hello world
     
  9. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Скорее всего да, но я прицепил их к PlayerMove. Только сделал что бы они спавнились не при каждом срабатывании ивента, а только если игрок прошёл целый блок. Можно так или всё равно очень плохо?

    Код:
    package particles.main;
    
    import org.bukkit.Location;
    import org.bukkit.Particle;
    import org.bukkit.World;
    import org.bukkit.entity.Player;
    import org.bukkit.event.EventHandler;
    import org.bukkit.event.Listener;
    import org.bukkit.event.player.PlayerMoveEvent;
    import org.bukkit.plugin.java.JavaPlugin;
    import org.bukkit.scheduler.BukkitRunnable;
    public final class Particles extends JavaPlugin {
        @Override
        public void onEnable() {
            new ExampleListener(this);
        }
    }
    class ExampleListener implements Listener {
        private final Particles plugin;
        public ExampleListener(Particles plugin) {
            this.plugin = plugin;
            this.plugin.getServer().getPluginManager().registerEvents(this, plugin);
        }
       
        
        private int  x = 0, y = 0, z = 0;
        @EventHandler   
        public void move(PlayerMoveEvent e) {
            Player p = e.getPlayer();
            Location loc = p.getLocation();
            if ((int) loc.getX() != x || (int) loc.getY() != y || (int) loc.getZ() != z) {
                set(p);
                SpawnParticles(loc);
            }
        }
       
        private void SpawnParticles (Location loc) {
            Location l = loc.clone();
            World w = l.getWorld();
            l.add(0.5, 1, 0.5);
            new BukkitRunnable() {
                int i = 60;
                @Override
                public void run() {
                    i--;
                    if (i == 0)this.cancel();               
                    w.spawnParticle(Particle.VILLAGER_HAPPY, loc, 30, 0.2, 0.2, 0.2, 1);                               
                }
            }.runTaskTimer(plugin, 0, 20);
        }   
       
       
        private void set(Player p) {
            Location loc = p.getLocation();
            x = (int) loc.getX();
            y = (int) loc.getY();
            z = (int) loc.getZ();       
        }   
    }
    
    Теперь игрок оставляет за собой след из частиц, пропадающих через минуту. Так как и нужно было.

    спасибо, сделал
     
    Последнее редактирование: 5 июн 2020
  10. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    можно поподробнее?) Или не получится так как в предыдущем сообщении?
     
  11. alexandrage

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

    Баллы:
    173
    Не получится что? Просто отнимаешь каждый тик время и потом удаляешь из листа. Ну можно еще чекать на количества, чтоб хвост партиклов не был излишни длинным.
     
  12. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    я в девятом сообщении прикрепил код, который делает то, что мне нужно.
    удалить что? Координаты где надо спавнить партиклы?
     
  13. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Теперь игрок оставляет за собой след из частиц, пропадающих через минуту. Так как и нужно было. Но всё же это плохо работает. Подскажите как сделать правильно
     
  14. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    В каком смысле плохо работает, что именно нужно исправить?
     
  15. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Когда я запускаю этот код - он создаёт след за игроком, пропадающий через минуту. Это правильно. Вы говорили:
    я сделал плеермув (не бейте), но также сделал, что частицы спавнятся только когда игрок проходит целый блок, а не при каждом срабатывании ивента.
    Ну и сама проблема: я запускаю это на сервер - особой нагрузки ни на него, ни на клиент я не замечаю. Я спокойно бегаю и за мной ведётся след. Но когда на сервер заходит кто-то другой, он в начале тоже может бегать и взаимодействовать с миром, но когда его след становится довольно длинным - сервер перестаёт обрабатывать его действия, хотя я могу свободно делать что-то сколько захочу. Как мне сделать так, чтобы след всё же оставался, но и сервер при этом нормально работал?
     
  16. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    до сих пор не понял, какой итог тебе нужен?
    Если челик прошел расстояние в 1 блок, то на этом месте спавнить партиклы 1 минуту?
    Или чтобы за челом шел след партиклов?
     
  17. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    Да, мне нужно чтобы за игроком шел след из партиклов. Допустим он заходит, плагин запускается и когда игрок перемещается на 1 блок на этом блоке появляются частицы, висят там минуту и пропадают. Также в это время игрок может двигаться, тогда эти действия повторяются. Получается, за ним остается след, который постепенно пропадает с конца. Код, который это делает, но вызывает проблемы я оставил в сообщении 9 выше. Если все равно не понятно - запустите мой код на сервере и немножко побегайте.
    Вот что примерно должно получиться (картинка с интернета, вид от лица второго игрока):
     

    Вложения:

    Последнее редактирование: 6 июн 2020
  18. NoooobKa

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

    Баллы:
    76
    Имя в Minecraft:
    NoooobKa
    Я думаю, чтобы более менее стабилизировать ситуацию, нужно при заходе чела на серв запускать шедулер, который будет выполнятся каждую секунду(20тиков), и запускать другой шедулер (SpawnParticles).

    В итоге каждую секунду ОДИН раз будет создаваться новый шедулер SpawnParticles, вместо ХЗ сколько там вызывается ПлеерМувЕвент в секунду
    Если тебе очень важно спавнить партиклы по центру блока на котором стоит игрок, просто получай локу игрока, блок, корды блока и от них пляши
     
  19. alexandrage

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

    Баллы:
    173
    Не смотрел, ибо реализация ужасная. Да и не будет работать на несколько игроков.
     
  20. Автор темы
    Stas021

    Stas021 Новичок Пользователь

    Баллы:
    16
    А как сделать не ужасную?
    Вы говорили:
    Удалять из листа что? Координаты для спавна партиклов, время, которое они ещё доджны висеть...
     
Статус темы:
Закрыта.

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