Сохранение эффектов зелий 1.15.2

Статус
Закрыто для дальнейших ответов.

Qencels

Новичок
Баллы
16
Имя в Minecraft
Qencels
Здравствуйте, форумчане.
Недавно решил написать свой первый плагин, я уже видел подобный вопрос на форуме, но ответа там не нашёл.

Суть проста: есть массив эффектов PotionEffectType с эффектами, которые можно сохранять (Например, PotionEffectType.SPEED). Эффекты на игроке есть уже заранее. Нужно отследить, какой эффект был на игроке до смерти и выдать его ему при респавне.

Мне непонятно, как и когда сохранить конкретный эффект, потому что PlayerDeathEvent не сработал. Заранее спасибо!
 
Попробуй EntityDamageEvent с приоритетом monitor. Если event.getFinalDamage() больше или равен хп игрока, то можно сохранять.
 
Попробуй EntityDamageEvent с приоритетом monitor. Если event.getFinalDamage() больше или равен хп игрока, то можно сохранять.
А как мне найти игрока? Там только Entity, у которого нельзя посмотреть активные эффекты
 
А как мне найти игрока? Там только Entity, у которого нельзя посмотреть активные эффекты
Кастовать надо.
Player player = (Player) entity;

А почему PlayerDeathEvent не сработал? Не вызывался или на игроке уже эффектов не было в этот момент?
 
Кастовать надо.
Player player = (Player) entity;

А почему PlayerDeathEvent не сработал? Не вызывался или на игроке уже эффектов не было в этот момент?

Спасибо, сейчас попробую. PlayerDeathEvent похоже что уже не было эффектов, на всякий случай оба варианта сейчас проверю ещё раз
 
Спасибо, сейчас попробую. PlayerDeathEvent похоже что уже не было эффектов, на всякий случай оба варианта сейчас проверю ещё раз
Не забудь проверить тип сущности для EDE, иначе ошибку словишь.
 
Не забудь проверить тип сущности для EDE, иначе ошибку словишь.

Появилась другая проблема.
effects = player.getActivePotionEffects();
дальше в PlayerRespawnEvent у меня стоит: player.addPotionEffects(effects);

Он не работает. Да, это выдача сразу всех эффектов, но я хотел хотя бы её сделать. Подскажите, что не так) По неопытности просто не вижу проблему.
 
Появилась другая проблема.
effects = player.getActivePotionEffects();
дальше в PlayerRespawnEvent у меня стоит: player.addPotionEffects(effects);

Он не работает. Да, это выдача сразу всех эффектов, но я хотел хотя бы её сделать. Подскажите, что не так) По неопытности просто не вижу проблему.
Попробуй выдавать на тик позже
Код:
Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> player.addPotionEffects(effects), 1L);
или на 2 тика (2L). plugin - твой JavaPlugin.
 
Попробуй выдавать на тик позже
Код:
Bukkit.getServer().getScheduler().runTaskLater(plugin, () -> player.addPotionEffects(effects), 1L);
или на 2 тика (2L). plugin - твой JavaPlugin.
Надеюсь это последний такой глупый вопрос... Я вписываю название плагина, он показывает ошибку cannot be resolved to a variable, погуглил, там у некоторых стоит .getPlugin(), тоже выдаёт ошибку
 
Надеюсь это последний такой глупый вопрос... Я вписываю название плагина, он показывает ошибку cannot be resolved to a variable, погуглил, там у некоторых стоит .getPlugin(), тоже выдаёт ошибку
А это уже проблемы с базовыми познаниями языка. Если у тебя этот код в классе JavaPlugin, то тебе достаточно заменить plugin на ключевое слово this. Если нет - воспользуйся паттерном Dependency injection. Например
PHP:
public class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        //...
        MyListener listenter = new MyListener(this);
        bukkit.getPluginManager().registerEvents(listener, this);
    }
}

public class MyListener implements Listener {
    // ...
    private final Plugin plugin;
    
    public MyListener(Plugin plugin) {
        this.plugin = plugin;
        // ...
    }
    
   // ...
}
 
А это уже проблемы с базовыми познаниями языка. Если у тебя этот код в классе JavaPlugin, то тебе достаточно заменить plugin на ключевое слово this. Если нет - воспользуйся паттерном Dependency injection. Например
PHP:
public class MyPlugin extends JavaPlugin {
    @Override
    public void onEnable() {
        //...
        MyListener listenter = new MyListener(this);
        bukkit.getPluginManager().registerEvents(listener, this);
    }
}

public class MyListener implements Listener {
    // ...
    private final Plugin plugin;
   
    public MyListener(Plugin plugin) {
        this.plugin = plugin;
        // ...
    }
   
   // ...
}
Только что увидел это на зарубежном форуме. Всё работает. Огромное спасибо!
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх