Тоггле скилл + бафф

Dovonext

Lineage 2
Участник
Сообщения
129
Розыгрыши
0
Решения
1
Репутация
66
Реакции
18
Баллы
183
Хроники
  1. Chaotic Throne: High Five
Исходники
Присутствуют
Сборка
l2j-dev
Такой вопрос, вот есть скилл Тоггле , как можно жделать чтобы при его активации он цеплял с собой еще скилы, баффов например. Чтобы пока он был активен, бафы висели.
 
Взять статы этих баффов и запихать в тогл? Или делать какой то аналог call_skill при использовании, но скорее всего если такого функционала нет - эффект то вызовется, но при выключении не снимется.
 
Мне кажется, путей реализации много есть, смотря что Вы имеете ввиду под "цеплял еще бафы" - те, которые изучены у персонажа, или те, которых у него даже нет? Бафы должны прямо таки бафаться и висеть ровно столько, как тогл, не имея своего времени действия? А что должно произойти при кенселе одного из них, например?
Так-то реализовать подобное не столь проблемно, по-моему, новый эффект пильнуть который в onStart() будет выдавать эффекты (вопрос о времени действии и вот это вот всё остается открытым к рассмотрению и допилу), а в onExit() снимал бы их. Но прежде чем пилить, я бы поотвечал для себя на "каверзные" вопросы с кенселами, олимпами, ивентами, петами и вот это вот всё.
 
Нужен тоггле который включаешь и бафы которые есть на пп к примеру, становятся Таргет_Пати
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Адекватно я не тестил, и явно что-то упустил, буду рад замечаниям. )
Это не под l2j-dev писалось, но под овероподобное должно подойти, я думаю.
~\gameserver\model\Skill.java

допилим getAimingTarget:
Java:
public final Creature getAimingTarget(Creature activeChar, GameObject obj)
    {
        Creature target = obj == null || !obj.isCreature() ? null : (Creature) obj;
        switch(_targetType)
        {
            ...
            case TARGET_ONE:
                // почему именно getEffectByStackType а не новый эффект/ид/что угодно еще? - банально проще добавить для ленивых. )0)
                if (_skillType == SkillType.BUFF && activeChar.getPlayer().getParty() != null && activeChar.getPlayer().getEffectList().getEffectByStackType("mass_buff") != null)
                    return activeChar;
                return target != null && target.isDead() == _isCorpse && !(target == activeChar && isOffensive()) && (!_isUndeadOnly || target.isUndead()) ? target : null;
            ...

теперь getTargets (вот тут будет больно глазам, конечно, но писать нормально недостойное викинга занятие):
Java:
    public List<Creature> getTargets(Creature activeChar, Creature aimingTarget, boolean forceUse)
    {
        List<Creature> targets;
        if(oneTarget()) {
            Player player = activeChar.getPlayer();
            //нахера тут трехэтажные проверки?
            if (_targetType ==  SkillTargetType.TARGET_ONE && player != null && _skillType == SkillType.BUFF)
            {
                //ну, так надо
                if (player.getEffectList().getEffectByStackType("mass_buff") != null && player.getParty() != null)
                {
                    //собственно, почти копи-паст с блока !oneTarget()
                    targets = new LazyArrayList<Creature>();
                    //вот тут только не скилл радиус, а каст ренж беру (может разделить вдвое? хз, сами думайте) чтобы датапак не пилить, ибо у бафов скилл радиус 40 будет. )
                    for(Player target : World.getAroundPlayers(player, _castRange, _castRange))
                    {
                        // вырезал за ненадобностью блок для isMonster() || isSiegeGuard()
                        if(!(player.getParty() == target.getParty()))
                            continue;
                        if(player.isInOlympiadMode() && target.isInOlympiadMode() && player.getOlympiadSide() != target.getOlympiadSide())
                            continue;
                        if(checkTarget(player, target, aimingTarget, forceUse, false) != null)
                            continue;
                        addTargetAndPetToList(targets, player, target);
                    }
                    addTargetAndPetToList(targets, player, player);
                    return targets;
                }
            }
            // ну и для остальных случаев оставляем как было
            targets = new LazyArrayList<Creature>(1);
            targets.add(aimingTarget);
            return targets;
        }
        ...
 
Последнее редактирование:
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Адекватно я не тестил, и явно что-то упустил, буду рад замечаниям. )
Это не под l2j-dev писалось, но под овероподобное должно подойти, я думаю.
~\gameserver\model\Skill.java

допилим getAimingTarget:
Java:
public final Creature getAimingTarget(Creature activeChar, GameObject obj)
    {
        Creature target = obj == null || !obj.isCreature() ? null : (Creature) obj;
        switch(_targetType)
        {
            ...
            case TARGET_ONE:
                // почему именно getEffectByStackType а не новый эффект/ид/что угодно еще? - банально проще добавить для ленивых. )0)
                if (_skillType == SkillType.BUFF && activeChar.getPlayer().getParty() != null && activeChar.getPlayer().getEffectList().getEffectByStackType("mass_buff") != null)
                    return activeChar;
                return target != null && target.isDead() == _isCorpse && !(target == activeChar && isOffensive()) && (!_isUndeadOnly || target.isUndead()) ? target : null;
            ...

теперь getTargets (вот тут будет больно глазам, конечно, но писать нормально недостойное викинга занятие):
Java:
    public List<Creature> getTargets(Creature activeChar, Creature aimingTarget, boolean forceUse)
    {
        List<Creature> targets;
        if(oneTarget()) {
            Player player = activeChar.getPlayer();
            //нахера тут трехэтажные проверки?
            if (_targetType ==  SkillTargetType.TARGET_ONE && player != null && _skillType == SkillType.BUFF)
            {
                //ну, так надо
                if (player.getEffectList().getEffectByStackType("mass_buff") != null && player.getParty() != null)
                {
                    //собственно, почти копи-паст с блока !oneTarget()
                    targets = new LazyArrayList<Creature>();
                    //вот тут только не скилл радиус, а каст ренж беру (может разделить вдвое? хз, сами думайте) чтобы датапак не пилить, ибо у бафов скилл радиус 40 будет. )
                    for(Player target : World.getAroundPlayers(player, _castRange, _castRange))
                    {
                        // вырезал за ненадобностью блок для isMonster() || isSiegeGuard()
                        if(!(player.getParty() == target.getParty()))
                            continue;
                        if(player.isInOlympiadMode() && target.isInOlympiadMode() && player.getOlympiadSide() != target.getOlympiadSide())
                            continue;
                        if(checkTarget(player, target, aimingTarget, forceUse, false) != null)
                            continue;
                        addTargetAndPetToList(targets, player, target);
                    }
                    addTargetAndPetToList(targets, player, player);
                    return targets;
                }
            }
            // ну и для остальных случаев оставляем как было
            targets = new LazyArrayList<Creature>(1);
            targets.add(aimingTarget);
            return targets;
        }
        ...
Если ему как на астере нужно, то можно сделать чек на тогл скил, если тогл вкл то подменять тип таргета у скилов которые имеют параметр бафф на пати к примеру
 
Это механика скиллов-аур, у нас, кстати, реализована :)
 
  • Мне нравится
Реакции: Rolo
Та ауры сложнее, там еще листнер на снятие эффекта нужно, если сопартиец отбежал фиг пойми куда. )
Ну ведь так и нужно делать, иначе можно наабузить окнами сколько угодно аур, если их сделать несколько видов
 
  • Мне нравится
Реакции: Rolo
Ну ведь так и нужно делать, иначе можно наабузить окнами сколько угодно аур, если их сделать несколько видов
Несомненно! ) Я просто говорю что у ТСа запрос более скромный, ему нужно просто по тоглу менять тип таргета активных бафов с одиночной цели, на пати (из пп сделать мод варка), а что дальше будет с бафами его не интересует и отслеживать кто куда отбежал не нужно. Упомянутая Вами механика всяко более интересная, но под другие задачи и хроники. )
 
Несомненно! ) Я просто говорю что у ТСа запрос более скромный, ему нужно просто по тоглу менять тип таргета активных бафов с одиночной цели, на пати (из пп сделать мод варка), а что дальше будет с бафами его не интересует и отслеживать кто куда отбежал не нужно. Упомянутая Вами механика всяко более интересная, но под другие задачи и хроники. )
а, да, я невнимательно прочитал дополнительный коммент от автора
 
Аура у меня реализована. ))) Вот только осталось тип таргета )
 
Назад
Сверху Снизу