Сб крадет сначала селф баф

VladaSs013

Путник
Участник
Сообщения
43
Розыгрыши
0
Репутация
0
Реакции
6
Баллы
95
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
l2-scripts, open-team
Java:
public void useSkill(Creature activeChar, List<Creature> targets)
    {
        for(Creature target : targets)
            if(target != null)
            {
                //if(calcStealChance(target, activeChar))
                //{
                int stealCount = Rnd.get(1, _stealCount); // ToCheck
                if(!target.isPlayer())
                    continue;
                List<Effect> effectsList = target.getEffectList().getAllEffects();
                Collections.sort(effectsList, EffectsComparator.getInstance()); // ToFix: Comparator to HF
                Collections.reverse(effectsList);

                // Крутой изжоп для корявой системы эффектов, которую давно отправить в топку.
                IntObjectMap<List<Effect>> effectSkills = new TreeIntObjectMap<List<Effect>>();
                for(Effect e : effectsList)
                {
                    List<Effect> effects = effectSkills.get(e.getDisplayId());
                    if(effects == null)
                    {
                        effects = new ArrayList<Effect>();
                        effectSkills.put(e.getDisplayId(), effects);
                    }
                    effects.add(e);
                }

                int counter = 0;
                loop: for(List<Effect> effects : effectSkills.values())
                {
                    if(counter >= stealCount)
                        break;

                    if(effects.isEmpty())
                        continue;

                    for(Effect e : effects)
                    {
                        if(!canSteal(e))
                            continue loop;
                    }

                    for(Effect e : effects)
                    {
                        Effect stolenEffect = cloneEffect(activeChar, e);
                        if(stolenEffect != null)
                            activeChar.getEffectList().addEffect(stolenEffect);
                        e.exit();
                    }
                    counter++;
                }
       
                //}
                //else
                //{
                //    activeChar.sendPacket(new SystemMessage(SystemMessage.C1_HAS_RESISTED_YOUR_S2).addString(target.getName()).addSkillName(getId(), getLevel()));
                    //continue;
                //}
                useInstantEffects(activeChar, target, false);
                getEffects(activeChar, target, getActivateRate() > 0, false);
            }

        if(isSSPossible())
            activeChar.unChargeShots(isMagic());
    }

Это л2 скрипт, как сделать чтоб начинало с денс, сонг?


Java:
public void useSkill(L2Character activeChar, GArray<L2Character> targets)
    {
        for(L2Character target : targets)
            if(target != null)
            {
                if(!target.isPlayer())
                    continue;

                if(target.checkReflectSkill(activeChar, this))
                    target = activeChar;

                ConcurrentLinkedQueue<L2Skill> eff = target.getEffectList().getAllSkills(true);
                if(eff.size() == 0)
                    continue;

                boolean update = false;
                int counter = 0;

                double cancel_res_multiplier = target.calcStat(Stats.CANCEL_RECEPTIVE, 0, null, null); // constant resistance is applied for whole cycle of cancellation
                L2Skill[] a = eff.toArray(new L2Skill[eff.size()]);
                // Сначало крадем песни/танцы
                for(int i = 0; counter < _stealCount && i < a.length; i++)
                {
                    L2Skill e = a[a.length - i - 1];

                    if(e != null && e.isMusic() && e.isCancelable() && !e.isOffensive())
                    {
                        if(calcStealChance(target, activeChar, e, cancel_res_multiplier))
                        {
                            if(cloneEffect(activeChar, target, e))
                            {
                                update = true;
                                target.getEffectList().stopEffect(e.getId());
                            }
                        }
                        counter++;
                    }
                }
                // Потом остальное
                for(int i = 0; counter < _stealCount && i < a.length; i++)
                {
                    L2Skill e = a[a.length - i - 1];
                    if(e != null && !e.isMusic() && e.isCancelable() && !e.isToggle() && !e.isPassive() && (!e.isOffensive() || e.getId() == 368) && e.getAbnormalType() != SkillAbnormalType.vp_up && e.getId() != 1540)
                    {
                        if(calcStealChance(target, activeChar, e, cancel_res_multiplier))
                        {
                            if(cloneEffect(activeChar, target, e))
                            {
                                update = true;
                                target.getEffectList().stopEffect(e.getId());
                            }
                        }
                        counter++;
                    }
                }
                target.updateEffectIcons();
                if(update)
                {
                    activeChar.sendChanges();
                    activeChar.updateEffectIcons();
                }
            }

        if(isSSPossible())
            activeChar.unChargeShots(isMagic());
    }

Вот пример с л2 опен, тут сразу сонг денс, как адаптировать?
 
Последнее редактирование модератором:
Не надо ничего адаптировать под скрипты. По скриптам ctrl+shift+del.
 
Ткну пальцем в небо. Попробуй закомментить строчку с:

Collections.sort(effectsList, EffectsComparator.getInstance()); // ToFix: Comparator to HF

Если я правильно читаю, то тогда будет канселить последние наложенные бафы.

Перед циклом
for(List<Effect> effects : effectSkills.values())
Создай два списка(с эффектами), один для кенсела первых N висящих баффов.
Второй список для денсов сонгов. Список с обычными бафами заполняй пока не будет == steal count игнорируя дс. Второй по максимуму до steal count. Если второй равен steal count. то прерывай for в котором заполняется и вне его вызывай кенсел и применение на себя.
По следующей логике. Пока count не будет steal_count сначала все из второго списка с ДС, потом из первого списка
 
Последнее редактирование:
И тогда он скорее всего будет снимать онли денсы/сонги?)
 
И тогда он скорее всего будет снимать онли денсы/сонги?)

Почему? Не знаю в каком порядке лежит список эффектов в таргете, но наверное отсортирован по времени наложения. Будет забирать на снятие последние бафы.
Так как нужно снимать первым дс, то описал логику с одним проходом, чтобы снять сначала ds, потом последние наложенные бафы
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Что за ревизия? И второе зачем? Что бы апнуть пернатых?
 
А как вообще кенсел должен работать по pts?
Звучит как крутой нерф, отсортировать бафы по полезности и откусывать начиная с самых бесполезных
 
Не работает, хоть сначала селф баф хоть потом бафаешь все равно снимет первым сел баф...
 
Вроде воровало рандом два бафа, если память не изменяет.
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
С одной стороны что помню на шлако серверах откусывало на оли банки рыбалки потом всё остальное. То еще нужно понять что где считается селбафом
С другой стороны нифига себе нерф если сначала откусывать ехо емпавер у сх или какого то кролика. Жиренький такой ап

А по моему там рандом вообще должен быть.
 
Вроде воровало рандом два бафа, если память не изменяет.
до 4х баф ворует, по офу мб и рандом, но тут селф какими не ставь по счету все равно их ворует, если сделать по порядку с конца будет идеально, нужно очень срочно
 

Посмотри каким образом сортируются эффекты внутри этой строки.
Код:
Collections.sort(effectsList, EffectsComparator.getInstance()); // ToFix: Comparator to HF
Правильная сортировка(свой компаратор) быстро решит твою проблему. Я не особо в джаву, не возьмусь править

Если селфы по какой-то причине всегда первыми отлетают, значит они в списке первыми и попадаются. Попробуй убрать реверсирование списка, например. Если будут от этого изменения, значит самым простым все еще является правильная сортировка
Код:
Collections.reverse(effectsList);
 
А че ты как основу опенов не возьмешь? Там хоть по адекватнее код, а скрипты явно под солями это все писали)
 
Кажется по офу это прям воровать последние бафы (как они визуально отображаются). Я точно помню, что брали талики за территориальные войны и воровали, например, гатс у дестра
 
Открытие на носу)



Код:
Collections.reverse(effectsList);
это отключить?

Не сработало, взять тира с него сразу берется тотем огра, даже если второй селф баф накинул, его не тронуло, то есть взяло тотем и 2 сонга
 
Вроде воровало рандом два бафа, если память не изменяет.
Начинает с конца списка наложенных баффов и на каждый, который разрешено снимать канселом, применяет по формуле, в основе которой заданный в канселе шанс, попытку снятия и если прокатило то снимает, иначе переходит к следующему. И так до тех пор пока не снимет заданное в канселе количество баффов или пока не доберется до начала списка баффов - что уж первым наступит.
Кстати как раз из-за этого всякие резисты к канселу по моему имеют достаточно сомнительную пользу, т.к. уменьшая шанс срабатывания шанса снятия в канселе они позволяют ему дальше по списку баффов забираться.
 
Вот так у меня эффект кражи баффов работает, но я не гарантирую что тот же расчет шанса у меня прям по оффу.
Тем более что на моем сервере эффект этот вобще не актуален - у меня крусейд, а на 85+ уровнях у игроков нет скиллов тырящих баффы.
 
по птс баффы берутся с конца и идет расчет шанса забора каждого бафа отдельно, если шанс не прошел идет расчет шансла следующего бафа с конца и так пока лимит не будет превышен. От этого и рандом стила к примеру он должен воровать 7 бафов но шансы прошли ток на часть.
А так выше топик правильно расписывает механику
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Ну зачем код? В скриптах много калоплюшек есть это поинтересней будет всякого кода
 

Похожие темы