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

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Rion_GM, 14 мар 2023.

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

    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);
                }
            }
        }
     
    Последнее редактирование: 14 мар 2023
  2. Dymeth

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

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

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

    @
    EventHandler(ignoreCancelled truepriority 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<PotionEffectplayerEffects this.effects.remove(player.getUniqueId());
        if (
    playerEffects != null) {
            
    this.plugin.getServer().getScheduler().runTask(this.plugin, () -> {
                
    player.addPotionEffects(playerEffects);
            });
        }
    }
    Но учти, что если игрок умер до выключения сервера, а возродился после включения, то эффекты он не получит. Если нужно это исправить - сохраняй спиисок эффектов на диск или в базу
     
  3. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    либо я как то не правильно сделал либо оно не тоже не работает
     
  4. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    У меня работает. Слушатель зарегистрировал? Если да, но всё равно не работает - показывай полный код класса
     
  5. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    простите не заметил что не правильно загрузил
     
  6. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    спасибо)
     
  7. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    не подскажите что делать если я установил плагин racesofthana и из за него перестало работать сохранение эффектов?
     
  8. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Понятия не имею, что это за плагин, и почему он влияет на сохранение эффектов. Возможно он сам зачем-то удаляет эффекты при смерти игрока. В этом случае можно попробовать понизить приоритет обработчика PlayerDeathEvent с MONITOR до NORMAL или LOW
     
  9. Автор темы
    Rion_GM

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

    Баллы:
    66
    Имя в Minecraft:
    Rion_GM
    попробую спасибо
     

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