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

Помогите Пытаюсь сделать сохранение и восстановление эффектов после смерти

Rion_GM

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Rion_GM
Хочу седлать что бы если у игрока есть какой либо эффект и он с этим эффектом умер что бы этот эффект после смерти восстановился с тем же таймером.
Вот как пытался сделать я но оно не работает:
Код:
public HashMap<String, List<PotionEffect>> Effects = new HashMap<String, List<PotionEffect>>();

    @EventHandler
    public void onJoin(PlayerJoinEvent e) {
        Player player = e.getPlayer();
        Effects.put(player.getName(), new ArrayList<PotionEffect>());
    }
    @EventHandler
    public void onDeath(PlayerDeathEvent e) {
        Player player = (Player) e.getEntity();
        for (PotionEffect effect : player.getActivePotionEffects()) {
            Effects.get(player.getName()).add(effect);
        }
    }
    @EventHandler
    public void onResp(PlayerRespawnEvent e) {
        Player player = e.getPlayer();
        if (Effects.containsKey(player.getName())) {
            for (PotionEffect effect : Effects.get(player.getName())) {
                player.addPotionEffect(effect);
            }
        }
    }
 
Последнее редактирование:
Накладывать эффекты на игрока можно только на следующий тик после отработки PlayerRespawnEvent. Таким образом, необходимо просто запустить задачу шедулера без задерки.

Примерно так получится:
PHP:
private final Map<UUID, Collection<PotionEffect>> effects = new HashMap<>();

@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
private void onPlayerDeath(PlayerDeathEvent event) {
    Player player = event.getPlayer();
    this.effects.put(player.getUniqueId(), player.getActivePotionEffects());
}

@EventHandler
private void onPlayerRespawn(PlayerRespawnEvent event) {
    Player player = event.getPlayer();
    Collection<PotionEffect> playerEffects = this.effects.remove(player.getUniqueId());
    if (playerEffects != null) {
        this.plugin.getServer().getScheduler().runTask(this.plugin, () -> {
            player.addPotionEffects(playerEffects);
        });
    }
}

Но учти, что если игрок умер до выключения сервера, а возродился после включения, то эффекты он не получит. Если нужно это исправить - сохраняй спиисок эффектов на диск или в базу
 
Накладывать эффекты на игрока можно только на следующий тик после отработки PlayerRespawnEvent. Таким образом, необходимо просто запустить задачу шедулера без задерки.

Примерно так получится:
PHP:
private final Map<UUID, Collection<PotionEffect>> effects = new HashMap<>();

@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
private void onPlayerDeath(PlayerDeathEvent event) {
    Player player = event.getPlayer();
    this.effects.put(player.getUniqueId(), player.getActivePotionEffects());
}

@EventHandler
private void onPlayerRespawn(PlayerRespawnEvent event) {
    Player player = event.getPlayer();
    Collection<PotionEffect> playerEffects = this.effects.remove(player.getUniqueId());
    if (playerEffects != null) {
        this.plugin.getServer().getScheduler().runTask(this.plugin, () -> {
            player.addPotionEffects(playerEffects);
        });
    }
}

Но учти, что если игрок умер до выключения сервера, а возродился после включения, то эффекты он не получит. Если нужно это исправить - сохраняй спиисок эффектов на диск или в базу
либо я как то не правильно сделал либо оно не тоже не работает
 
либо я как то не правильно сделал либо оно не тоже не работает
У меня работает. Слушатель зарегистрировал? Если да, но всё равно не работает - показывай полный код класса
 
Накладывать эффекты на игрока можно только на следующий тик после отработки PlayerRespawnEvent. Таким образом, необходимо просто запустить задачу шедулера без задерки.

Примерно так получится:
PHP:
private final Map<UUID, Collection<PotionEffect>> effects = new HashMap<>();

@EventHandler(ignoreCancelled = true, priority = EventPriority.MONITOR)
private void onPlayerDeath(PlayerDeathEvent event) {
    Player player = event.getPlayer();
    this.effects.put(player.getUniqueId(), player.getActivePotionEffects());
}

@EventHandler
private void onPlayerRespawn(PlayerRespawnEvent event) {
    Player player = event.getPlayer();
    Collection<PotionEffect> playerEffects = this.effects.remove(player.getUniqueId());
    if (playerEffects != null) {
        this.plugin.getServer().getScheduler().runTask(this.plugin, () -> {
            player.addPotionEffects(playerEffects);
        });
    }
}

Но учти, что если игрок умер до выключения сервера, а возродился после включения, то эффекты он не получит. Если нужно это исправить - сохраняй спиисок эффектов на диск или в базу
спасибо)
 
У меня работает. Слушатель зарегистрировал? Если да, но всё равно не работает - показывай полный код класса
не подскажите что делать если я установил плагин racesofthana и из за него перестало работать сохранение эффектов?
 
не подскажите что делать если я установил плагин racesofthana и из за него перестало работать сохранение эффектов?
Понятия не имею, что это за плагин, и почему он влияет на сохранение эффектов. Возможно он сам зачем-то удаляет эффекты при смерти игрока. В этом случае можно попробовать понизить приоритет обработчика PlayerDeathEvent с MONITOR до NORMAL или LOW
 
Понятия не имею, что это за плагин, и почему он влияет на сохранение эффектов. Возможно он сам зачем-то удаляет эффекты при смерти игрока. В этом случае можно попробовать понизить приоритет обработчика PlayerDeathEvent с MONITOR до NORMAL или LOW
попробую спасибо
 

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

Назад
Верх