Важно Задержки. Большой обзор - для самых маленьких.

Тема в разделе "Гайды по РО", создана пользователем amega, 7 ноя 2012.

Статус темы:
Закрыта.
  1. amega Худший из людей :>

    Предисловие:
    В данном топике я постараюсь собрать воедино всю основную информацию на счет того, какие задержки имеют место в современных рагнароках и как со всем этим жить.
    Также в подвале будет минигайд для администраторов серверов (и просто любителей что-нибудь тестить) на счет того, как ввести команду @showactdelay (@sad), показывающую игрокам AfterCastDelay.

    _____________________________________________________________

    В приватном Рагнароке существует несколько различных задержек на использование навыков.
    Да, кстати, здесь речь пойдет именно о задержках на навыки, так как они наиболее интересны рядовому игроку.

    [ЗАДЕРЖКИ С СЕРВЕРНОЙ СТОРОНЫ]
    В первую очередь это наиболее очевидная задержка - AfterCastDelay.
    Её легко можно узнать разными путями. Самый простой - зайти на RMS. Однако там вполне могут быть какие-то неточности, и если вам кажется что они действительно имеют место быть - идите строго на афину.
    Структура файла на который ведет ссылка достаточно проста и при желании кто угодно может разобраться буквально за минуту.
    Но на всякий случай я приведу доступный пример, по навыку Meteor Storm:

    Код:
    //-- WZ_METEOR
    83,15000,2000:3000:3000:4000:4000:5000:5000:6000:6000:7000,0,500,5000
    Нас интересует ряд значений после второй запятой.
    Они соответствуют изначальным значениям задержки After Cast Delay. Значения для каждого уровня навыка с 1 по MAX разделены двоеточием ":".
    Таким образом МШ на первом уровне имеет задержку 2000мс, что равняется 2 секундам.
    Эта задержка режется брагой, и всякими малоюзабельными (в большинстве своем) на ГВ шмотками.
    При 150 инт браге она урезается на 100%, задержка уменьшается на 1% за каждые 5инт у бражника.
    Минимальное значение этой задержки = 100мс, но может отличаться от сервера к серверу, если администрация решила что 100мс - слишком мало.
    И именно из-за этого данный момент является одним из первых, которые стоит проверять приходя на новый для себя сервер.
    К слову, по непроверенным данным на официальных серверах минимальное значение AfterCastDelay = 333мс.

    Вроде все прозрачно? В общем-то так оно и есть. Проблема лишь в том, что существует другая основная задержка на использование навыков, и по факту она тоже является After Cast Delay.
    Для удобства будем называть её ASPD-задержкой.
    Как следует из выбранного названия, зависит данная задержка от параметра ASPD, который в свою очередь зависит от agi, dex и различных модификаторов aspd.
    Цель данного гайда не предрасполагает к объяснению того, как устроено aspd, но тем не менее уместно сказать несколько вещей на этот счет.
    Если вы открываете окошко статуса, то видите Целое значение у параметра aspd. Которое на самом деле имеет очень и очень мало общего с тем что творится на сервере при расчете реальной задержки.
    Но, черт с ней, помните одно - при рассчете итоговой ASPD-задержки учитывается каждая единица agi, каждая единица dex, каждый процент от всевозможных модификаторов aspd.
    То есть, пока у вас значение aspd в окошке статуса не равно 190 - вы не можете говорить: "о, мне от этого количества аги не прибавится 1аспд, поэтому лучше вкачаю лак".
    Более того, абсолютно неверно считать что достигнув значения 190 вы можете забыть об данном параметре. В реалиях ГВ вас всегда будут стремиться дебафать дабы понизить аспд. Резонно иметь "запас прочности" по данному параметру, если конечно вас не ограничивают другие задержки.

    Ок, вернемся к сабжу.
    Значит, ASPD-задержка зависит от аги, декс, модификаторов.
    Но как подсчитать её значение не зная сложной, да еще и совершенно неофициальной формулы?
    Самый простой способ - банально запомнить.
    При aspd = 190, aspd-задержка = 100мс.
    При aspd = 180, aspd-задержка = 200мс.
    При aspd = 170, aspd-задержка = 300мс.
    И все сразу стало гораздо проще, не так ли? :В

    Не сложно догадаться, что при использовании навыков рассчитываются обе задержки, и AfterCastDelay (режется брагой), и ASPD-задержка, а за итоговую задержку берется большее значение, из двух полученных.
    Вернемся к примеру с Meteor Storm.
    Допустим, у нас есть вакуумный виз с 190аспд и 135 инт брага.
    На 10 уровень МШ исходное значение задержки AfterCastDelay = 7000мс (то есть 7 секунд, но нам проще оперировать миллисекундами).
    135 инт брага урежет AfterCastDelay на 97%, оставив от 7000мс всего 210мс.
    Получается что aspd-задержка у нас равна 100мс, AfterCastDelay 210мс, поэтому итоговой задержкой будет 210мс.
    Подумав над этим, вы можете прийти к разным интересным (или не очень) мыслям.
    Например, вы поймете что 135 инт браги мало для максимально быстрого спама МШ при условии что у ХВ 190 аспд.
    С другой стороны, вы пойдете посмотреть сколько у вашего ХВ аспд под всеми бафами, и, скорее всего, на простых серверах с простым шмотом, увидите значение около 181. Это даст чуть меньшую aspd-задержку чем 200мс. Но да, браги все равно будет немного нехватать!
    Если у браги будет 140 инт, AfterCastDelay урежется уже до 140мс, и будет нехватать уже аспд.
    При браге 145 инт AfterCastDelay урежется до 70мс, но так как минимальное значение на серверах никогда не ставят ниже 100мс, то получается что мы упремся в самый минимум.
    Тогда зачем нужна эта "золотая 150инт брага"? Очевидно - нафиг не нужна.

    вопрос наркоманам:
    А если у нас высокое аспд, но слабая брага, не лучше ли кидать 9лвл мш, у которого изначальный AfterCastDelay меньше на ~15%? Ведь все равно все метеоры разом не упадут, а урон отдельных метеоров от 9 и 10лвл мш равнозначен. ;]


    Возможно запоздалое примечание: упомянутая выше "итоговая задержка" по факту называется именно AfterCastDelay. То есть, даже если "итоговой" (большей) стала aspd-задержка, для сервера и дальнейших рассуждений она все равно будет являться AfterCastDelay. На первый взгляд может смущать, свыкайтесь.

    Отлично, теперь у вас есть все необходимые базовые знания о стандартных серверных задержках!

    Но стоит иметь в виду, что периодически администраторы серверов решают пойти нашим путем решения проблемы лагов/ноделея, и вводят Cooldown'ы (далее - откаты) на ГВ-ориентированные навыки.
    Называть можно опять же по-разному, но в определенных версиях эмулятора eAthena данная задержка называется именно так.
    Что это?
    По сути, это индивидуальная минимальная задержка на использование навыка.
    Ключевое отличие от AfterCastDelay #1 заключается в том, что откат для определенного навыка никогда не наложит ограничение на использование других навыков.
    Отличие #2 заключается в том, что данная задержка ничем не режется, а потому в подавляющем большинстве случаев (при наличии хоть какой-то браги) сразу становится "итоговой".
    Админы могут решить что это однозначное решение вопроса ноделея. Но на самом деле это не совсем так.
    Человек с ноделеем легко может кидать подряд несколько различных навыков на которые стоят откаты.
    Например, линкер может кинуть каупе, затем сразу кайте (в итоге кинуть суммарно в полтора-два раза больше полезных навыков чем честный игрок). И только потом ждать пока пройдет какой-нибудь из двух установленных откатов.
    Это конечно относительно не существенно, но иметь в виду определенно стоит.

    Резонно ли подгонять свое aspd под откат или нет - напрямую зависит от того, есть ли у вашего класса возможность комбинировать навыки как в примере с линкером.
    То есть, если вы лп проф и откат на лп, скажем, 300мс вам вполне хватит итогового aspd = 170 (под slow grace, желательно).
    Опять же вернувшись к линкеру, предположим что задержки на каупе и кайте = 500мс, то по идее вы мало что получите увеличивая aspd выше 175.
    При 175 aspd AfterCastDelay при браге будет = 250мс, то есть вы кидаете каупе, начинается откат 500мс + AfterCast 250мс, спустя 250мс кидаете кайте, начинается откат 500мс + AfterCast 250мс. К концу второго "афтеркаста" закончится первый откат, и так далее.
    Таким образом не будет возникать ситуации когда AfterCastDelay уже закончился, но на всех навыках которые вы комбинируете продолжается откат.
    Немного запутанно? Возможно стоит чуточку притормозить и осмыслить как все это перекликается между собой.

    Стоит иметь в виду, что описание работы откатов основано на том, с чем нам уже реально довелось иметь дело. Так оно работает в реализации pRO-RO, так оно работает в базовой реализации эмулятора 3ceam.
    Однако конкретно взятый администратор сервера вполне может написать свою собственную модель откатов, которая, например, будет накладывать ограничения на все навыки и комбинировать их уже не будет возможности.

    Все что я рассмотрел к данному моменту - Задержки Серверной Стороны.
    Это означает, что независимо от того какие читы вы прикрутите, вы не сможете их обойти. Никак. Вообще.
    С ними приходится считаться всем и каждому. Их нужно понимать.

    Но все ведь слышали про ноделей, да?
    Почему он позволяет применять навыки чаще?
    Ну, в первую очередь потому что мы играем на эмуляторе (eAthena), а не официальном сервере.
    Если слухи правдивы, то на официальных серверах ASPD-задержка на навыки равняется ASPD-задержке на простые удары (MAX=5). А у нас она вдвое меньше.
    Опять же минимальное значение AfterCastDelay у нас в большинстве случаев (значение по умолчанию) = 100мс.
    То есть ноделей это чит для нашей механики в первую очередь, а не для официальной.

    Ок, я опять несколько отошел от вопроса Задержек.
    Ноделей и все подобные читы позволяют обойти задержку клиентской стороны. Знакомьтесь:

    [ЗАДЕРЖКИ С КЛИЕНТСКОЙ СТОРОНЫ]
    На самом деле, нас интересует только одна задержка - анимационная.
    Я не буду углубляться здесь в техническую часть вопроса слишком сильно, потому что это скорее всем во вред, нежели на пользу.
    В общем, грубо говоря, клиент во время вашей попытки применить какой-либо навык проверяет, проигрывается ли в данный момент анимация применения какого-либо навыка. Если анимация проигрывается, ваше действие сведется на нет.
    Ноделей, в традиционном понимании, сводит продолжительность анимации использования навыков к 1 кадру, таким образом она проигрывается очень быстро. И так как анимационной задержки не остается, количество навыков которые вы можете применить за единицу времени будет ограничиваться только задержками серверной стороны.
    Вроде предельно просто. Есть ноделей = нет анимационной задержки.

    Но это большинству достаточно хорошо известно, поэтому теперь о том, что знает уже куда меньшее количество игроков.
    Возможно это не особо полезно, но все же познавательно - анимация для разных типов навыков идет с разной скоростью.
    Чем больше ваше aspd, тем быстрее будет проигрываться анимация направленных damage-навыков.
    В тоже время скорость анимации остальных навыков всегда одинакова.
    Именно поэтому откаты на target+damage навыки как правило сильно меньше чем на навыки, применяемые на землю и направленные nodamage-навыки.
    Что это значит?
    В первую очередь: при условии что вам никто (включая вас самих) не сбивает анимацию навыков, на большинство target+nodamage и наземных навыков aspd влиять не будет. Оно урежет серверную задержку (AfterCastDelay), но анимационная будет длиться под 500мс. Однако на деле мы сталкиваемся с многими факторами, влияющими на анимацию (ну, ок, в итоге они все просто ее прерывают). Об этом позднее.
    Другой момент - есть определенный ряд навыков, для которых используется нестандартная анимация.
    На них не распространяется обычная анимационная задержка, или, если более корректно - клиент сам отменяет анимационную задержку после их использования (начиная воспроизводить "нестандартную анимацию").
    Это объясняет отсутствие задержек клиентской стороны на AD, SPP, песни, MS, многие навыки ниндзь, ... .
    Еще один момент - self-навыки применяются без учета текущей анимации. При этом среди них есть навыки, которые влияют на определенные визуальные характеристики вашего персонажа. В частности - breakfall, reflect shield, true sight, .. . После их использования прерывается любая текущая анимация, что в определенных случаях позволяет применить следующий навык раньше, чем без прерывания. Эффект от таких штук нельзя ставить в один ряд с эффектом от ноделея, потому что на любой навык у вас начнется AfterCastDelay со стороны сервера, но что-то выиграть все-таки можно.

    Любое перемещение, получение урона - прерывают текущую анимацию навыка, сводя клиентскую задержку на нет. Из-за этого часто можно видеть как бг-состав бьет кого-то из основного состава, таким образом сбивая анимации и давая "ноделей эффект".

    Также есть еще один нюанс который важно иметь в виду всем игрокам, не имеющим ноделея.
    В момент между анимацией каста и анимацией применения навыка возможно "обмануть клиент" попытавшись применить следующий навык между двумя этими анимациями. При таком раскладе запрос на использования следущего навыка будет успешно передан серверу, и если серверные задержки не скажут "нет", навык будет применен.
    Это означает что многим классам выгодней играть с 149 декс и 190аспд, нежели с 150декс и 190аспд (когда анимации каста нету, и "втиснуть" попытку применения еще одного навыка просто некуда).

    Воот, как-то так.
    Гайд не претендует на абсолютную истинность и полноту. Но в целом должен объяснить как устроены вещи.
    Если что-то забыто - дополняйте (пишите в личку - добавлю), а я пошел чинить пальцы.

    Данная команда показывает длительность AfterCastDelay после использования навыков, и тем самым помогает игрокам рассчитать свои билды под откаты.

    atcommand.c (сами найдете куда вставить по аналогии с другими командами):
    Код:
    /*===============================================
    * Show Action Delay [mao]
    * @sad
    *-----------------------------------------------*/
    int atcommand_sad(const int fd, struct map_session_data* sd, const char* command, const char* message)
    {
        if(!sd) return 0;
     
        if (sd->showactdelay){
            sd->showactdelay = 0;
            clif_displaymessage(fd, "Show Act Delay: Disabled.");
        }else{
            sd->showactdelay = 1;
            clif_displaymessage(fd, "Show Act Delay: Enabled.");
        }
     
        return 0;
    }
    
    существенно ниже в этом же файле:
    Код:
    { "showactdelay",        0,99,    0,        atcommand_sad},
    { "sad",        0,99,    0,        atcommand_sad}
    skill.c
    функция skill_castend_id
    вначале объявить
    Код:
    char temp[100];    //    [mao]
    далее после строки
    Код:
    ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv); //Tests show wings don't overwrite the delay but skill scrolls do. [Inkfish]
    вставить
    Код:
    // ShowActDelay (@sad) [mao]
            if (sd&&ud&&src)
            {
                if ( sd->showactdelay )
                {
                    snprintf(temp, sizeof (temp), "After Cast Delay: %dms", skill_delayfix(src, ud->skillid, ud->skilllv) );
                    clif_disp_onlyself(sd,temp,strlen(temp));
                }
            }
    функция skill_castend_pos
    вначале объявить
    Код:
    char temp[100];    // for ShowActDelay    [mao]
    после
    Код:
    if(battle_config.skill_log && battle_config.skill_log&src->type)
                ShowInfo("Type %d, ID %d skill castend pos [id =%d, lv=%d, (%d,%d)]\n",
                    src->type, src->id, ud->skillid, ud->skilllv, ud->skillx, ud->skilly);
     
            if (ud->walktimer != INVALID_TIMER)
                unit_stop_walking(src,1);
     
            if( !sd || sd->skillitem != ud->skillid || skill_get_delay(ud->skillid,ud->skilllv) )
                ud->canact_tick = tick + skill_delayfix(src, ud->skillid, ud->skilllv);
            if( battle_config.display_status_timers && sd )
                clif_status_change(src, SI_ACTIONDELAY, 1, skill_delayfix(src, ud->skillid, ud->skilllv));
    вставить
    Код:
    // ShowActDelay (@sad) [mao]
            if (sd&&ud&&src){
                if ( sd->showactdelay )
                {
                    snprintf(temp, sizeof (temp), "After Cast Delay: %dms", skill_delayfix(src, ud->skillid, ud->skilllv) );
                    clif_disp_onlyself(sd,temp,strlen(temp));
                }
            }
    pc.h
    в структуре map_session_data
    в конец дописать
    Код:
    bool showactdelay;
    Выдернуто из своей очень старой афины. Но должно быть ок.
    На 3ceam откаты можно просто прописать в skill_cast_db.txt.

    По проблемам в личку.
     
    • Спасибо Спасибо x 8
    • Нравится Нравится x 4
    • Согласен Согласен x 1
    • Слоупок Слоупок x 1
Статус темы:
Закрыта.