Ошибка работы Gospel


  • Helpers Team

    Имя вашего персонажа: Lazybloke
    Дата и время обнаружения ошибки: 12.11.2014

    Описание ошибки.
    Эффект двойного SP/HP от Gospel не перемножается с HP/SP-потами (Large), а должен.

    Примеры ошибки.

    1. Вы съедаете HP/SP-пот (Large), затем встаёте в госпел.
      Получаете двойное HP или SP.
      Готово. Госпел переналожил на вас свой статус двойного HP/SP, отменив эффект HP/SP-потов.

    2. Вы съедаете HP/SP-пот (Large), они начинают работать в течение 8 минут.
      Затем вы встаёте в госпел и получаете двойное HP или SP. Госпел перенакладывает на вас точно такой же статус, но уже на 60 секунд.
      Таким образом, когда эффект госпела кончается, то вы можете обнаружить, что эффект HP/SP-потов пропал.
      То есть госпел фактически диспелит действие HP/SP-потов, перенакладывая на них свой статус, длительностью всего на 60 секунд.

    3. Если вы находитесь под статусом двойного HP/SP от госпела, то вы не можете съесть HP/SP-пот пока не упадет эффект госпела.
      Если говорить точнее, то пот расходуется впустую, так как госпел имеет приоритет над HP/SP-потами.

    Как должно работать.
    Статус двойного HP/SP от госпела и статус от HP/SP-потов - это должны быть совершенно разные и независимые друг от друга статусы. Более того, они должны перемножаться друг с другом, давая персонажу ещё больше HP/SP.

    Причины ошибки.
    Немного проанализировав код эмулятора, можно обнаружить, что статусы госпела и статусы от HP/SP-потов, накладывают на персонажа одни и те же статусы, а конкретно SC_INCMHPRATE и SC_INCMSPRATE. А это должны быть разные статусы.

    Как исправить.
    Для исправления нам нужно сделать госпелу свои собственные отдельные статусы, для эффекта двойного HP/SP от госпела.
    Допустим назовем их SC_INCMHPRATE2 и SC_INCMSPRATE2.

    Почему работать должно именно так, как написано выше.
    Проверил лично на iRO. На 17.11.2014 оно там работает именно так, как я написал выше. Статусы независимые друг от друга и перемножаются друг с другом.

    Готовое исправление.
    Чтобы эта тема не зря была мною оформлена и не погрязла в пучине ошибок, которые не исправляют годами, я не поленился и сам сделал для вас патч с исправлением ошибки.

    ! >!
    ! [code:1re1wsr7]--- C:/status.c Mon Nov 17 00:10:45 2014
    ! +++ C:/status.c Mon Nov 17 00:25:17 2014
    ! @@ -569,6 +569,8 @@
    ! StatusChangeInfoTable[SC_INCFLEERATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! StatusChangeInfoTable[SC_INCMHPRATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! StatusChangeInfoTable[SC_INCMSPRATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! + StatusChangeInfoTable[SC_INCMHPRATE2] = SCI_RESET_DEAD; //Lazybloke
    ! + StatusChangeInfoTable[SC_INCMSPRATE2] = SCI_RESET_DEAD; //Lazybloke
    ! StatusChangeInfoTable[SC_INCATKRATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! StatusChangeInfoTable[SC_INCMATKRATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! StatusChangeInfoTable[SC_INCDEFRATE] = SCI_SAVE|SCI_IGNORE_PRETENDDEAD;
    ! @@ -1240,6 +1242,8 @@
    ! StatusIconChangeTable[SC_EXTRACT_SALAMINE_JUICE] = SI_EXTRACT_SALAMINE_JUICE;
    ! StatusIconChangeTable[SC_INCMHPRATE] = SI_MAXHPPERCENT;
    ! StatusIconChangeTable[SC_INCMSPRATE] = SI_MAXSPPERCENT;
    ! + StatusIconChangeTable[SC_INCMHPRATE2] = SI_MAXHPPERCENT2; //Lazybloke
    ! + StatusIconChangeTable[SC_INCMSPRATE2] = SI_MAXSPPERCENT2; //Lazybloke
    ! StatusIconChangeTable[SC_PUSH_CART] = SI_ON_PUSH_CART;
    !
    !
    ! @@ -1298,6 +1302,8 @@
    ! StatusChangeFlagTable[SC_INCFLEE2] |= SCB_FLEE2;
    ! StatusChangeFlagTable[SC_INCMHPRATE] |= SCB_MAXHP;
    ! StatusChangeFlagTable[SC_INCMSPRATE] |= SCB_MAXSP;
    ! + StatusChangeFlagTable[SC_INCMHPRATE2] |= SCB_MAXHP; //Lazybloke
    ! + StatusChangeFlagTable[SC_INCMSPRATE2] |= SCB_MAXSP; //Lazybloke
    ! StatusChangeFlagTable[SC_INCATKRATE] |= SCB_BATK|SCB_WATK;
    ! StatusChangeFlagTable[SC_INCMATKRATE] |= SCB_MATK;
    ! StatusChangeFlagTable[SC_INCDEFRATE] |= SCB_DEF;
    ! @@ -6194,6 +6200,8 @@
    ! maxhp += maxhp * 5 * sc->data[SC_ANGRIFFS_MODUS]->val1 / 100;
    ! if(sc->data[SC_INCMHPRATE])
    ! maxhp += maxhp * sc->data[SC_INCMHPRATE]->val1/100; //Regular Usage
    ! + if(sc->data[SC_INCMHPRATE2]) //Lazybloke
    ! + maxhp += maxhp * sc->data[SC_INCMHPRATE2]->val1/100;
    !
    ! return cap_value(maxhp,1,UINT_MAX);
    ! }
    ! @@ -6205,6 +6213,8 @@
    !
    ! if(sc->data[SC_INCMSPRATE])
    ! maxsp += maxsp * sc->data[SC_INCMSPRATE]->val1/100;
    ! + if(sc->data[SC_INCMSPRATE2]) //Lazybloke
    ! + maxsp += maxsp * sc->data[SC_INCMSPRATE2]->val1/100;
    ! if(sc->data[SC_VITATA_500])
    ! maxsp += maxsp * sc->data[SC_VITATA_500]->val1/100;
    ! if(sc->data[SC_SERVICE4U])[/code:1re1wsr7]
    ! >!
    ! [code:1re1wsr7]--- C:/status.h Mon Nov 17 00:10:45 2014
    ! +++ C:/status.h Mon Nov 17 00:25:17 2014
    ! @@ -609,20 +609,23 @@
    ! SC_KYOUGAKU,
    ! SC_KYOMU,
    ! SC_KAGEHUMI,
    ! SC_ZANGETSU,
    ! SC_AKAITSUKI,
    ! SC_OBOROGENSOU,
    ! + SC_INCMHPRATE2, //Lazybloke
    ! + SC_INCMSPRATE2, //Lazybloke
    ! +
    ! SC_MAX, //Automatically updated max, used in for's to check we are within bounds.
    ! } sc_type;
    !
    ! @@ -1328,14 +1331,17 @@
    ! SI_REUSE_LIMIT_RECALL = 0x2c4,
    ! SI_SAVEPOSITION = 0x2c5,
    ! + SI_MAXHPPERCENT2 = 715, //Lazybloke
    ! + SI_MAXSPPERCENT2 = 716, //Lazybloke
    !
    ! };
    !
    ! enum sc_info {
    ! SCI_EA_DEFAULT = 0x000,
    ! SCI_RESET_DEAD = 0x001,
    ! SCI_RESET_DISPEL = 0x002,[/code:1re1wsr7]
    ! >!
    ! [code:1re1wsr7]--- C:/skill.c Mon Nov 17 00:10:45 2014
    ! +++ C:/skill.c Mon Nov 17 00:25:17 2014
    ! @@ -13848,11 +13848,11 @@
    ! if (tsd) clif_gospel_info(tsd, 0x16);
    ! break;
    ! case 3: // MaxHP +100%
    ! - sc_start(bl,SC_INCMHPRATE,100,100,time);
    ! + sc_start(bl,SC_INCMHPRATE2,100,100,time); //Lazybloke
    ! if (tsd) clif_gospel_info(tsd, 0x17);
    ! break;
    ! case 4: // MaxSP +100%
    ! - sc_start(bl,SC_INCMSPRATE,100,100,time);
    ! + sc_start(bl,SC_INCMSPRATE2,100,100,time); //Lazybloke
    ! if (tsd) clif_gospel_info(tsd, 0x18);
    ! break;
    ! case 5: // All stats +20[/code:1re1wsr7]
    ! >!
    ! [code:1re1wsr7]--- C:/const.txt Mon Nov 17 00:10:45 2014
    ! +++ C:/const.txt Mon Nov 17 00:25:17 2014
    ! @@ -1225,19 +1225,17 @@
    ! SC_MELON_BOMB 545
    ! SC_BANANA_BOMB 546
    ! SC_BANANA_BOMB_SITDOWN 547
    ! SC_STOMACHACHE 548
    ! SC_MYSTERIOUS_POWDER 549
    ! SC_ALL_RIDING 550
    ! SC_EL_COST 555
    ! +SC_INCMHPRATE2 607
    ! +SC_INCMSPRATE2 608
    ! +
    !
    ! e_gasp 0
    ! e_what 1
    ! e_ho 2
    ! e_lv 3
    ! e_swt 4
    ! e_ic 5[/code:1re1wsr7]
    !
    ! Скачать диффы отдельным архивом (для удобства Galtero/o1): <!-- m --><a class="postlink" href="https://yadi.sk/d/K0rHN1-SckUC9">https://yadi.sk/d/K0rHN1-SckUC9</a><!-- m -->
    P.S. Пожалуйста. И заодно учитесь создавать темы в ошибках. 🙂
    Уже исправленную работу госпела вы знаете где можете потестировать.



  • <!-- l --><a class="postlink-local" href="http://forum.motr-online.com/viewtopic.php?f=26&t=169334">viewtopic.php?f=26&t=169334</a><!-- l -->
    вроде бы было исправлено тут.