Помогите Уменьшение эффекта

pro100koder

Активный участник
Пользователь
Баллы
76
В общем, я не могу получить то, сколько именно секунд эффекта было выдано каждому игроку отдельно при PotionSplashEvent. Нужно, чтобы если у игрока на голове был шлем, то эффект отравления давался на меньший срок. Вот то, на чём я остановился сейчас.
Код:
@EventHandler
    public void splash(PotionSplashEvent e){
        Player p = (Player) e.getPotion().getShooter();
        usepotion(p, e.getPotion());
        for(LivingEntity en:e.getAffectedEntities()){
            if(!(en instanceof Player))return;
            Player pl = (Player) en;
            for(PotionEffect pef:e.getPotion().getEffects()){
                PotionEffectType type = pef.getType();
                if(type.equals(PotionEffectType.POISON)){
                    int time = pef.getDuration();
                    double coef = 1;
                    if(pl.getEquipment().getArmorContents()[3]!=null&&pl.getEquipment().getArmorContents()[3].getType()!=null)
                    if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.LEATHER_HELMET))coef=1.1;
                    else if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.GOLD_HELMET))coef=1.3;
                    else if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.DIAMOND_HELMET))coef=1.5;
                    time/=coef;
                    e.setCancelled(true);
                    p.sendMessage("real="+pef.getDuration()+";set="+time);
                    pl.addPotionEffect(new PotionEffect(pef.getType(), time, pef.getAmplifier(), true, true));
                }
            }
        }
    }
Тут эффект берётся конкретно из летящего зелья, а не от того, сколько секунд было выдано игроку. А как сделать второе - кроме костылей кривых в голову ничего не лезет (шедулить на тик позже), т. к. на момент срабатывания ивента у игрока никаких эффектов нет.
 
PotionSplashEvent#getIntensity(LivingEntity entity)
Полагаю, просто умножив время зелья на интенсивность ты получишь итоговое время зелья для сущности. Стоит потестить.

Как-то так мб

PHP:
@EventHandler
public void onSplash(PotionSplashEvent e){
    Player shooter = (Player) e.getPotion().getShooter();
    usePotion(shooter, e.getPotion());
    for(PotionEffect pef:e.getPotion().getEffects()){
        if(pef.getType()!=PotionEffectType.POISON) continue;
        e.setCancelled(true);
        int duration=pef.getDuration();
        for(LivingEntity entity:e.getAffectedEntities()){
            if(!(entity instanceof Player)) continue;
            Player pl = (Player) entity;
            int time=(int)(duration*e.getIntensity(entity));
            if(pl.getEquipment().getArmorContents()!=null&&pl.getEquipment().getArmorContents()[3]!=null){
                Material helmet=pl.getEquipment().getArmorContents()[3].getType();
                double coef = 1;
                if(helmet==Material.LEATHER_HELMET) coef=1.1;
                else if(helmet==Material.GOLD_HELMET) coef=1.3;
                else if(helmet==Material.DIAMOND_HELMET) coef=1.5;
                time=(int)(time/coef);
            }
            shooter.sendMessage("real="+duration+";set="+time);
            pl.addPotionEffect(new PotionEffect(PotionEffectType.POISON, time, pef.getAmplifier(), true, true));
        }
    }
}
 
Последнее редактирование:
Так обновись. Ивент как раз то что тебе нужно.
Не могу... С 1.13 версии лаги становятся уж очень сильными, и игроки многие тупо откажутся от серва. На счёт viaversion+backwards - мои строители жить не могут без магмы и пурпура... (viabackwards их блочить будет, и работать будут ток блоки из 1.9).
 
Не могу... С 1.13 версии лаги становятся уж очень сильными, и игроки многие тупо откажутся от серва. На счёт viaversion+backwards - мои строители жить не могут без магмы и пурпура... (viabackwards их блочить будет, и работать будут ток блоки из 1.9).
Как хочешь. Тогда смирись. Спигот уже стал стабильным с выходом 1.13.2.
 
В общем, я не могу получить то, сколько именно секунд эффекта было выдано каждому игроку отдельно при PotionSplashEvent. Нужно, чтобы если у игрока на голове был шлем, то эффект отравления давался на меньший срок. Вот то, на чём я остановился сейчас.
Код:
@EventHandler
    public void splash(PotionSplashEvent e){
        Player p = (Player) e.getPotion().getShooter();
        usepotion(p, e.getPotion());
        for(LivingEntity en:e.getAffectedEntities()){
            if(!(en instanceof Player))return;
            Player pl = (Player) en;
            for(PotionEffect pef:e.getPotion().getEffects()){
                PotionEffectType type = pef.getType();
                if(type.equals(PotionEffectType.POISON)){
                    int time = pef.getDuration();
                    double coef = 1;
                    if(pl.getEquipment().getArmorContents()[3]!=null&&pl.getEquipment().getArmorContents()[3].getType()!=null)
                    if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.LEATHER_HELMET))coef=1.1;
                    else if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.GOLD_HELMET))coef=1.3;
                    else if(pl.getEquipment().getArmorContents()[3].getType().equals(Material.DIAMOND_HELMET))coef=1.5;
                    time/=coef;
                    e.setCancelled(true);
                    p.sendMessage("real="+pef.getDuration()+";set="+time);
                    pl.addPotionEffect(new PotionEffect(pef.getType(), time, pef.getAmplifier(), true, true));
                }
            }
        }
    }
Тут эффект берётся конкретно из летящего зелья, а не от того, сколько секунд было выдано игроку. А как сделать второе - кроме костылей кривых в голову ничего не лезет (шедулить на тик позже), т. к. на момент срабатывания ивента у игрока никаких эффектов нет.

Очищай e.getAffectedEntities() когда отменяешь. Но не в форе. Событие как бы отменяется, но эффект наложится, и наложится после твоих. Отсюда впечатление, что ничего не работает.

Остальное:
- Почитай Java Code Conventions (в особенности отступы между операторами и ключевыми словами), форматирование более менее, но рябит в глазах.
- Enum'ы сравнивай через ==
- if else в проверке типа шлема можно заменить на switch
- getEquipment().getArmorContents() вызываешь слишком много раз, а можешь достать один раз предмет и сохранить в ItemStack локальный
 
Назад
Верх