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

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

Метки:
Теги Теги
1.15.2 java particles spiggot
Статус
Закрыто для дальнейших ответов.

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 секунд?
 
Последнее редактирование:
Sheluder я видел. Только не совсем понимаю как его использовать в данном случае. Единственная мысль - в отдельном потоке сделать задержку и вызывать частицы, чтобы выглядело как будто они там постоянно. Но мне нужно сделать если игрок перемещается на другой блок - частицы создаются и на нём, ждут 60 сек. и пропадают. Но тогда для каждого блока нужно создавать отдельный поток с отсчётом времени. Мне кажется это плохо или нет?
 
Sheluder я видел. Только не совсем понимаю как его использовать в данном случае. Единственная мысль - в отдельном потоке сделать задержку и вызывать частицы, чтобы выглядело как будто они там постоянно. Но мне нужно сделать если игрок перемещается на другой блок - частицы создаются и на нём, ждут 60 сек. и пропадают. Но тогда для каждого блока нужно создавать отдельный поток с отсчётом времени. Мне кажется это плохо или нет?
Ты не сможешь породить частицы через бакит апи в отдельном потоке, но ты можешь сделать шедулер который будет работать в основном потоке и порождать частицы сколько тебе нужно. Если ты хочешь прицепить это к PlayerMoveEvent, то это очень плохая идея
 
Ты не сможешь породить частицы через бакит апи в отдельном потоке, но ты можешь сделать шедулер который будет работать в основном потоке и порождать частицы сколько тебе нужно. Если ты хочешь прицепить это к PlayerMoveEvent, то это очень плохая идея
так частицы за игроком лететь должны, все равно без плеермува не обойдешься.
 
так частицы за игроком лететь должны, все равно без плеермува не обойдешься.
Если бы они должны были летать за игроком, то плеермув был бы самым тупым решением. Чел хочет чтобы они спавнились над блоком.
Код:
    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);
    }
 
Sheluder я видел. Только не совсем понимаю как его использовать в данном случае. Единственная мысль - в отдельном потоке сделать задержку и вызывать частицы, чтобы выглядело как будто они там постоянно. Но мне нужно сделать если игрок перемещается на другой блок - частицы создаются и на нём, ждут 60 сек. и пропадают. Но тогда для каждого блока нужно создавать отдельный поток с отсчётом времени. Мне кажется это плохо или нет?
Одного хватит, просто веди запись времени.
 
Скорее всего да, но я прицепил их к 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);
}

//Checking move and spawn particles
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();
}
}
Совет, сделай так: [spоiler][cоde]Текст[/code][/spoiler]
Код:
Hello world
 
Если ты хочешь прицепить это к PlayerMoveEvent, то это очень плохая идея
Скорее всего да, но я прицепил их к 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();       
    }   
}
Теперь игрок оставляет за собой след из частиц, пропадающих через минуту. Так как и нужно было.

Совет, сделай так: [spоiler][cоde]Текст[/code][/spoiler]
спасибо, сделал
 
Последнее редактирование:
можно поподробнее?) Или не получится так как в предыдущем сообщении?
Не получится что? Просто отнимаешь каждый тик время и потом удаляешь из листа. Ну можно еще чекать на количества, чтоб хвост партиклов не был излишни длинным.
 
Не получится что?
я в девятом сообщении прикрепил код, который делает то, что мне нужно.
Просто отнимаешь каждый тик время и потом удаляешь из листа.
удалить что? Координаты где надо спавнить партиклы?
 
Скорее всего да, но я прицепил их к 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();     
    } 
}
Теперь игрок оставляет за собой след из частиц, пропадающих через минуту. Так как и нужно было. Но всё же это плохо работает. Подскажите как сделать правильно
 
Теперь игрок оставляет за собой след из частиц, пропадающих через минуту. Так как и нужно было. Но всё же это плохо работает. Подскажите как сделать правильно
В каком смысле плохо работает, что именно нужно исправить?
 
В каком смысле плохо работает, что именно нужно исправить?
Когда я запускаю этот код - он создаёт след за игроком, пропадающий через минуту. Это правильно. Вы говорили:
Если бы они должны были летать за игроком, то плеермув был бы самым тупым решением.
я сделал плеермув (не бейте), но также сделал, что частицы спавнятся только когда игрок проходит целый блок, а не при каждом срабатывании ивента.
Ну и сама проблема: я запускаю это на сервер - особой нагрузки ни на него, ни на клиент я не замечаю. Я спокойно бегаю и за мной ведётся след. Но когда на сервер заходит кто-то другой, он в начале тоже может бегать и взаимодействовать с миром, но когда его след становится довольно длинным - сервер перестаёт обрабатывать его действия, хотя я могу свободно делать что-то сколько захочу. Как мне сделать так, чтобы след всё же оставался, но и сервер при этом нормально работал?
 
Когда я запускаю этот код - он создаёт след за игроком, пропадающий через минуту. Это правильно. Вы говорили:
я сделал плеермув (не бейте), но также сделал, что частицы спавнятся только когда игрок проходит целый блок, а не при каждом срабатывании ивента.
Ну и сама проблема: я запускаю это на сервер - особой нагрузки ни на него, ни на клиент я не замечаю. Я спокойно бегаю и за мной ведётся след. Но когда на сервер заходит кто-то другой, он в начале тоже может бегать и взаимодействовать с миром, но когда его след становится довольно длинным - сервер перестаёт обрабатывать его действия, хотя я могу свободно делать что-то сколько захочу. Как мне сделать так, чтобы след всё же оставался, но и сервер при этом нормально работал?
до сих пор не понял, какой итог тебе нужен?
Если челик прошел расстояние в 1 блок, то на этом месте спавнить партиклы 1 минуту?
Или чтобы за челом шел след партиклов?
 
до сих пор не понял, какой итог тебе нужен?
Если челик прошел расстояние в 1 блок, то на этом месте спавнить партиклы 1 минуту?
Или чтобы за челом шел след партиклов?
Да, мне нужно чтобы за игроком шел след из партиклов. Допустим он заходит, плагин запускается и когда игрок перемещается на 1 блок на этом блоке появляются частицы, висят там минуту и пропадают. Также в это время игрок может двигаться, тогда эти действия повторяются. Получается, за ним остается след, который постепенно пропадает с конца. Код, который это делает, но вызывает проблемы я оставил в сообщении 9 выше. Если все равно не понятно - запустите мой код на сервере и немножко побегайте.
Вот что примерно должно получиться (картинка с интернета, вид от лица второго игрока):
 

Вложения:

  • Screenshot_20200606-010115_YouTube.jpg
    Screenshot_20200606-010115_YouTube.jpg
    Размер файла
    666,2 КБ
    Просмотров
    8
Последнее редактирование:
Да, мне нужно чтобы за игроком шел след из партиклов. Допустим он заходит, плагин запускается и когда игрок перемещается на 1 блок на этом блоке появляются частицы, висят там минуту и пропадают. Также в это время игрок может двигаться, тогда эти действия повторяются. Получается, за ним остается след, который постепенно пропадает с конца. Код, который это делает, но вызывает проблемы я оставил в сообщении 9 выше. Если все равно не понятно - запустите мой код на сервере и немножко побегайте.
Вот что примерно должно получиться (картинка с интернета, вид от лица второго игрока):
Я думаю, чтобы более менее стабилизировать ситуацию, нужно при заходе чела на серв запускать шедулер, который будет выполнятся каждую секунду(20тиков), и запускать другой шедулер (SpawnParticles).

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

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

Назад
Верх