Перейти к содержанию
Asterios

Steelgar

Завсегдатаи
  • Постов

    949
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные Steelgar

  1. Есть косячок - поиск делаешь по слову, заходишь в любую строчку, жмешь назад - и тут вываливается весь список, вместо того что искал.

    Неплохо было бы добавить продажу упаковками, когда сет продают - в строку выводить самую тяжелую вещь из списка и кол-во предметов в скобках, было бы тоже удобно.

  2. Это касается всех мобов, где есть матки или главный их моб. Все мобы 1/2 хп, где есть матка, у нас атакует всей толпой сразу, когда матка/агр увидит кого то. Такого не должно быть, пока не тронешь/ударишь кого то из пачки мобов. Т.е. собирая все кучки мобов, тебя лупит только матка/агр, подбегаешь к месту убийства, убиваешь маток, и вот тогда все остальные подбегают и долбят уже, а так они просто бегают за маткой.

  3. 10 часов назад, Admin сказал:

    Когда темы с нытьем подтверждают, что ограничения реально работают :)

    Значит, нужно продолжать в этом же направлении. Была еще мысль сделать автоматический поиск места, и информацию о количестве мест в торговой локации, как на парковке :)

    Т.е. заранее определить все точки, куда можно садиться. И когда внутри торговой зоны игрок пытается сесть на продажу, чар сам бежит на нужное место и потом садится. А если мест нет, то об этом сообщается, и тогда можно идти в другую зону (ГХ например).

    Добавьте итем брокеру строку - "Найти место для продажи" (за адену можно), его телепортнет на случайное свободное место(чтобы не было проблем, если в 1 секунду ТП двоих на тоже самое свободное место).

  4. Ревизия: 31180М

    1. Моб: https://asterios.tm/index.php?cmd=bd#mob.skills.20943

      Почему он сразу агрится как только увидит меня матка? Он пассивный.

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

    2. Моб: https://asterios.tm/index.php?cmd=bd#mob.skills.20939
      Он должен быть агрессивным. 

     

    В итоге матки от каждой кучки бегут за собирающим парик, а отпрыски их за ними (матками) бегут/летят.

     

    Вот видео с Теона:

    https://www.youtube.com/watch?v=kSJcHglIjuI

  5. Ревизия 31155

    Пару проблем:

    1. Когда ищешь товар, не выводится цена его минимальная.
    2. Если нажимаешь назад (когда уже смотришь предложения конкретного товара), то попадаешь в общий список. Надо бы вернуться в результат поиска.

     

    image.png.23a2e463e7c4a61472a3ebd9e118d7bb.png

  6. Ревизия: 31117М

    Моб: https://asterios.tm/index.php?cmd=bd#mob.skills.22703

    Из него появляется 3 моба 22706 и 1 моб 22701 с шансом около 20% (судя по кол-ву убийств).

     

    1. Проблема в том, что у моба 22706 огромный резист(s_npc_resist_dualfist_ex4) ко всему кроме пики, настолько что +7 кастеты 300 огня наносят 60 урона, когда по его соседям 900 урон. Резист режет в 15 раз урон примерно. Почему так? Никогда на офе не испытывал там проблем, хоть кем - нож, кастеты и прочее. Да, урон ниже по резисту, но не столь катастрофично.
    2. Из этих мобов не должно вылазить 4 моба, максимум 1 моб с шансом 2%. Ниже приведу вырезку из PTS сервера (админы легко могут проверить)

     

    p.s. Не плохая соло локация, в ожидании пати, но сейчас надо пику таскать, чтобы завалить этих 3 мобов с резистами...

     

    Скрины:

    Скрытый текст

    74d2b760115454.jpg

     

    AI моба 22703:

    Скрытый текст

    Описание моба 22703:

    Скрытый текст

    npc_begin    warrior    22703    [legend_orc_1warrior]    category={}    level=81    exp=4295351949    ex_crt_effect=0    unique=0    s_npc_prop_hp_rate=4    race=humanoid    sex=male    skill_list={@s_npc_prop_race_humanoid;@s_npc_prop_attribute_earth1;@s_npc_prop_hp_lv_m4;@s_npc_prop_mp_lv_p0;@s_npc_prop_pa_lv_p4;@s_npc_prop_ma_lv_p3;@s_npc_prop_pd_lv_p0;@s_npc_prop_md_lv_p5;@s_npc_prop_armor_type_n;@s_npc_prop_weapon_type_sword;@s_npc_resist_magical_dmg9;@s_npc_resist_bow_ex4;@s_npc_weakness_melee_attack9;@s_npc_weakness_pole4}    slot_chest=[]    slot_rhand=[samurai_longsword]    slot_lhand=[]    collision_radius={14;17}    collision_height={28.8;34.9}    hit_time_factor=0.28    hit_time_factor_skill=-1    ground_high={140;0;0}    ground_low={80;0;0}    str=40    int=21    dex=30    wit=20    con=43    men=20    org_hp=3461.77253215841    org_hp_regen=8.5    org_mp=1708.8    org_mp_regen=3    base_attack_type=sword    base_attack_range=40    base_damage_range={0;0;80;120}    base_rand_dam=30    base_physical_attack=1012.32268463427    base_critical=4    physical_hit_modify=5    base_attack_speed=253    base_reuse_delay=0    base_magic_attack=691.285164307598    base_defend=345.61127    base_magic_defend=252.90333    base_attribute_attack={earth;150}    base_attribute_defend={130;130;90;150;130;130;100}    physical_avoid_modify=0    shield_defense_rate=0    shield_defense=0    safe_height=100    soulshot_count=0    spiritshot_count=0    clan={}    ignore_clan_list={}    clan_help_range=300    undying=0    can_be_attacked=1    corpse_time=7    no_sleep_mode=0    agro_range=300    passable_door=0    can_move=1    flying=0    has_summoner=0    targetable=1    show_name_tag=1    npc_ai={[legend_orc_1warrior];{[Skill01_Probablity]=1000};{[Skill01_ID]=@s_npc_aura_burn_magic_only10}}    event_flag={0}    unsowing=0    acquire_exp_rate=7.168302    acquire_sp=4946    acquire_rp=0    corpse_make_list={{[oricalcum];1;1;4.9236};{[dynasty_two_hand_sword_piece];1;1;0.5201};{[sealed_dynasty_leather_helmet_piece];1;1;3.3638}}    additional_make_list={}    additional_make_multi_list={{{{[adena];2291;4622;100}};70};{{{[dynasty_spear];1;1;0.3175};{[dynasty_spear_piece];1;1;99.6825}};0.1291};{{{[metallic_fiber];1;1;87.0764};{[mold_lubricant];1;1;6.0953};{[renad];1;1;2.3903};{[oricalcum];1;1;1.604};{[general_80_s];1;1;2.1164};{[special_80_s];1;1;0.5291};{[rare_80_s];1;1;0.0529};{[rp_comp_spiritshot_s];1;1;0.1356}};18.9009}}    ex_item_drop_list={}    npc_end
     

     

    В нем видно что ai использует класс legend_orc_1warrior, вот он:

    Скрытый текст

    class legend_orc_1warrior : ai_legend_orc_warrior
    {
    handler:
        EventHandler MY_DYING(target, i0, i9, last_attacker, lparty, random1_list, always_list, code_info)
        {
            always_list = gg::AllocCodeInfoList();
            random1_list = gg::AllocCodeInfoList();
            target = last_attacker;
            if( gg::HaveMemo(target, 645) == 1 && gg::GetMemoState(target, 645) == 1 )
            {
                random1_list::SetInfo(0, target);
            }
            if( gg::HaveMemo(target, 645) == 1 && gg::GetMemoState(target, 645) == 1 )
            {
                random1_list::SetInfo(0, target);
            }
            if( gg::IsNull(lparty) == 0 )
            {
                for(i9 = 0; i9 < lparty.member_count; i9 = i9 + 1)
                {
                    target = myself::GetMemberOfParty(lparty, i9);
                    if( gg::HaveMemo(target, 645) == 1 && gg::GetMemoState(target, 645) == 1 )
                    {
                        random1_list::SetInfo(0, target);
                    }
                }
            }
            code_info = random1_list::RandomSelectOne();
            if( gg::IsNull(code_info) == 0 )
            {
                if( code_info.code == 0 )
                {
                    myself::SetCurrentQuestID(645);
                    target = code_info::RandomSelectOne();
                    if( gg::IsNull(target) == 0 && myself::DistFromMe(target) <= 1500 )
                    {
                        i0 = gg::Rand(1000);
                        if( i0 < 516 )
                        {
                            myself::GiveItem1(target, 14861, 1);
                            myself::SoundEffect(target, "ItemSound.quest_itemget");
                        }
                    }
                }
            }
            super;
        }

    }
     

     В свою очередь он наследует класс ai_legend_orc_warrior, вот он:

    Скрытый текст

    class ai_legend_orc_warrior : warrior_basic
    {
    handler:
        EventHandler CREATED()
        {
            super;
        }

        EventHandler MY_DYING(maker0, last_attacker)
        {
            if( gg::Rand(100) < 2 )
            {
                select(gg::Rand(2))
                {
                    case 0:
                        maker0 = myself::GetMyMaker();
                        if( gg::IsNull(maker0) == 0 )
                        {
                            myself::CreateOnePrivateEx(1022707, "ai_legend_orc_ev_vice", 0, 0, gg::FloatToInt(myself.sm.x), gg::FloatToInt(myself.sm.y), gg::FloatToInt(myself.sm.z), 0, gg::GetIndexFromCreature(last_attacker), 0, 0);
                            gg::SendMakerScriptEvent(maker0, 2114001, 0, 0);
                        }
                        break;
                    case 1:
                        if( gg::Rand(2) < 1 )
                        {
                            myself::CreateOnePrivateEx(1018815, "ai_legend_orc_ev_leader", 0, 0, gg::FloatToInt(myself.sm.x), gg::FloatToInt(myself.sm.y), gg::FloatToInt(myself.sm.z), 0, gg::GetIndexFromCreature(last_attacker), 0, 0);
                        }
                        break;
                }
            }
        }

    }

     

    Как раз в этом классе и описывается появление дополнительного моба с шансом 2% (кто именно из них решается с шансом 50%):

    1. 1022707 - legend_orc_2grudge или id 22707  
    2. 1018815 - legend_orc_3grudge или id 18815

     

    Если второй моб из списка выше 18815 живет более 2 минут, тогда появится еще один моб 18816 что описано в классе ai_legend_orc_ev_leader:

    Скрытый текст

    class ai_legend_orc_ev_leader : wizard_basic
    {
    handler:
        EventHandler CREATED()
        {
            myself::Shout(gg::MakeFString(1800863, "", "", "", "", ""));
            myself::AddTimerEx(2114001, 2 * 60 * 1000);
            myself::LookNeighbor(500);
            super;
        }

        EventHandler SEE_CREATURE(creature)
        {
            myself::AddAttackDesire(creature, 0, 20000);
            myself::AddUseSkillDesire(creature, Skill01_ID, 0, 0, 5000000);
            myself.c_ai0 = creature;
            myself::AddTimerEx(2114009, 1000);
        }

        EventHandler ATTACKED(attacker)
        {
            myself::AddAttackDesire(attacker, 0, 20000);
            myself::AddUseSkillDesire(attacker, Skill01_ID, 0, 0, 5000000);
            myself.c_ai0 = attacker;
            myself::AddTimerEx(2114009, 1000);
        }

        EventHandler TIMER_FIRED_EX(timer_id)
        {
            if( timer_id == 2114001 )
            {
                myself::CreateOnePrivateEx(1018816, "ai_legend_orc_treasure", 0, 0, gg::FloatToInt(myself.sm.x), gg::FloatToInt(myself.sm.y), gg::FloatToInt(myself.sm.z), 0, 0, 0, 0);
                myself::SetVisible(0);
            }
            else if( timer_id == 2114009 )
            {
                if( myself::IsNullCreature(myself.top_desire_target) == 0 && myself::IsNullCreature(myself.c_ai0) == 0 )
                {
                    myself::AddUseSkillDesire(myself.c_ai0, Skill01_ID, 0, 0, 5000000);
                    myself::AddTimerEx(2114009, 3500);
                }
            }
        }

        EventHandler MY_DYING()
        {
            myself::Shout(gg::MakeFString(1800864, "", "", "", "", ""));
        }

    }

     

     

  7. У него есть особенность, что при появлении он телепортируется к игроку, если расстояние более 300 (событие CLAN_ATTACKED в классе saint_ninja) и он видит как атакуют его сородичей, т.е. если моб был убит 1 нюком и появился второй, он никуда не ТП.

    Этот момент запечатлен на видео выше в 2:07, когда моб ТП к игроку.

     

    "Разве он автоматом не агрит? "

    Тут можно спорить, не 100% же должен менять цель.

  8. Нашел кусок кода из PTS сервера из файла ai.obj

    Вот данные по описанию моба 21524:

    Скрытый текст

    npc_begin    warrior    21524    [brilliant_blade]    category={}    level=61    exp=146308200    ex_crt_effect=0    unique=0    s_npc_prop_hp_rate=1    race=divine    sex=male    skill_list={@s_npc_prop_race_divine;@s_npc_prop_hp_lv_p0;@s_npc_prop_mp_lv_p0;@s_npc_prop_pa_lv_p3;@s_npc_prop_ma_lv_p3;@s_npc_prop_pd_lv_n3;@s_npc_prop_md_lv_n3;@s_npc_prop_armor_type_n;@s_npc_prop_weapon_type_sword;@s_npc_critical_power;@s_npc_critical_chance}    slot_chest=[]    slot_rhand=[dagger_of_magicflame]    slot_lhand=[]    collision_radius={13;13}    collision_height={26;26}    hit_time_factor=0.52    hit_time_factor_skill=-1    ground_high={165;0;0}    ground_low={50;0;0}    str=40    int=21    dex=30    wit=20    con=43    men=20    org_hp=1985.55926    org_hp_regen=7.5    org_mp=1066.8    org_mp_regen=2.7    base_attack_type=sword    base_attack_range=40    base_damage_range={0;0;80;120}    base_rand_dam=30    base_physical_attack=501.08068    base_critical=4    physical_hit_modify=4.75    base_attack_speed=253    base_reuse_delay=0    base_magic_attack=342.17315    base_defend=252.49346    base_magic_defend=168.112997103103    base_attribute_attack={none;0}    base_attribute_defend={20;20;20;20;53;-13;0}    physical_avoid_modify=0    shield_defense_rate=0    shield_defense=0    safe_height=100    soulshot_count=0    spiritshot_count=0    clan={@saint_clan}    ignore_clan_list={}    clan_help_range=300    undying=0    can_be_attacked=1    corpse_time=7    no_sleep_mode=0    agro_range=300    passable_door=0    can_move=1    flying=0    has_summoner=0    targetable=1    show_name_tag=1    npc_ai={[brilliant_blade];{[MoveAroundSocial]=90};{[MoveAroundSocial1]=74};{[MoveAroundSocial2]=90};{[OtherSelf]=@brilliant_blade_1};{[OtherSelfAI]=[brilliant_blade_1]};{[IsMainForm]=1};{[SoulShot]=200};{[SoulShotRate]=5};{[SpiritShot]=100};{[SpiritShotRate]=10};{[LongRangeGuardRate]=10};{[PhysicalSpecial]=@s_npc_super_strike6};{[SelfBuff]=@s_npc_ultimate_evasion2};{[TeleportEffect]=@s_av_teleport}}    event_flag={0}    unsowing=0    acquire_exp_rate=33.6581388    acquire_sp=11024    acquire_rp=0    corpse_make_list={{[rp_blue_wolve's_leather_mail];1;1;2.7858};{[hose_of_shrnoen_fabric];1;1;35.2032};{[scrl_of_ench_am_b];1;1;2.4585}}    additional_make_list={}    additional_make_multi_list={{{{[adena];12990;26340;100}};100};{{{[shrnoen's_leather_shirts_low];1;1;3.6406};{[shrnoen's_leather_shirts_fabric];1;1;26.8656};{[avadon_leather_mail_low];1;1;2.2343};{[avadon_leather_mail_lining];1;1;20.6395};{[shrnoen's_leather_gaiters_low];1;1;5.8287};{[shrnoen's_leather_gaiters_texture];1;1;40.7913}};9.9134};{{{[iron_ore];1;1;18.124};{[coal];1;1;18.124};{[charcoal];1;1;18.124};{[animal_bone];1;3;8.0551};{[animal_skin];1;1;24.1653};{[rp_blue_wolve's_tunic];1;1;0.0752};{[general_61_b];1;1;0.3021};{[special_61_b];1;1;0.0755};{[rare_61_b];1;1;0.0076};{[unique_61_b];1;1;0.0015};{[silver_arrow];20;60;12.9457}};100}}    ex_item_drop_list={{{{[herb_of_hp_a];1;1;55};{[greater_herb_of_hp_a];1;1;38};{[full_herb_of_hp_a];1;1;7}};42};{{{[herb_of_mp_a];1;1;7};{[greater_herb_of_mp_a];1;1;81};{[full_herb_of_mp_a];1;1;12}};11};{{{[herb_of_pa];1;1;20};{[herb_of_pa_speed];1;1;20};{[herb_of_crt_rate];1;1;20};{[vampiric_rage_herb];1;1;20};{[death_whisper_herb];1;1;20}};25};{{{[herb_of_ma];1;1;50};{[herb_of_ma_speed];1;1;50}};10};{{{[figher_herb];1;1;33};{[magician_herb];1;1;33};{[recovery_herb];1;1;34}};1};{{{[herb_of_move_speed];1;1;94};{[big_head_herb];1;1;3};{[vitality_herb1];1;1;3}};11}}    npc_end

     

    Так вот в файле ai.obj класс  моба (brilliant_blade) наследует класс saint_ninja, в котором как раз прописан шанс 80% (выделил в коде), когда моба кто то атакует, кто именно появляется прописан в описании моба выше OtherSelf =@brilliant_anguish_1

    Админы легко могут сами проверить взяв файлы с PTS  сервера. Кстати не один такой моб 21524, а 21531 (появляется из него 21658), 21539 (появляется из него 21540)

     

    Класс brilliant_blade:

    Скрытый текст

    class brilliant_blade : saint_ninja {
    handler:
        EventHandler MY_DYING(always_list, code_info, i4, i9, last_attacker, lparty, member, random1_list, target) {
            always_list = AllocCodeInfoList();
            random1_list = AllocCodeInfoList();
            target = last_attacker;

            if (HaveMemo(target, @darkness_falls_upon_the_dusk) == 1 && GetMemoState(target, @darkness_falls_upon_the_dusk) == 1 * 10 + 1) {
                random1_list.SetInfo(0, target);
            }

            if (HaveMemo(target, @darkness_falls_upon_the_dusk) == 1 && GetMemoState(target, @darkness_falls_upon_the_dusk) == 1 * 10 + 1) {
                random1_list.SetInfo(0, target);
            }

            if (IsNull(lparty) == 0) {
                for (i9 = 0; i9 < lparty.member_count; ++i9) {
                    target = GetMemberOfParty(lparty, i9);

                    if (HaveMemo(target, @darkness_falls_upon_the_dusk) == 1 && GetMemoState(target, @darkness_falls_upon_the_dusk) == 1 * 10 + 1) {
                        random1_list.SetInfo(0, target);
                    }
                }
            }

            target = last_attacker;

            if (HaveMemo(target, @temptation_of_power) == 1 && GetMemoState(target, @temptation_of_power) == 1 * 10 + 1) {
                random1_list.SetInfo(1, target);
            }

            if (HaveMemo(target, @temptation_of_power) == 1 && GetMemoState(target, @temptation_of_power) == 1 * 10 + 1) {
                random1_list.SetInfo(1, target);
            }

            if (IsNull(lparty) == 0) {
                for (i9 = 0; i9 < lparty.member_count; ++i9) {
                    target = GetMemberOfParty(lparty, i9);

                    if (HaveMemo(target, @temptation_of_power) == 1 && GetMemoState(target, @temptation_of_power) == 1 * 10 + 1) {
                        random1_list.SetInfo(1, target);
                    }
                }
            }

            while (IsNull(code_info = always_list.Next()) == 0) {
                code_info.code;
            }

            code_info = random1_list.RandomSelectOne();

            if (IsNull(code_info) == 0) {
                select (code_info.code) {
                case 0:
                    SetCurrentQuestID(@darkness_falls_upon_the_dusk);
                    target = code_info.RandomSelectOne();

                    if (IsNull(target) == 0 && DistFromMe(target) <= 1500) {
                        i4 = Rand(1000);

                        if (i4 < 692) {
                            if (OwnItemCount(target, @q_blood_of_kel_mahum) + 1 >= 300) {
                                if (OwnItemCount(target, @q_blood_of_kel_mahum) < 300) {
                                    GiveItem1(target, @q_blood_of_kel_mahum, 300 - OwnItemCount(target, @q_blood_of_kel_mahum));
                                    SoundEffect(target, "ItemSound.quest_middle");
                                    SetFlagJournal(target, @darkness_falls_upon_the_dusk, 2);
                                    ShowQuestMark(target, @darkness_falls_upon_the_dusk);
                                    SetMemoState(target, @darkness_falls_upon_the_dusk, 1 * 10 + 2);
                                }
                            } else {
                                GiveItem1(target, @q_blood_of_kel_mahum, 1);
                                SoundEffect(target, "ItemSound.quest_itemget");
                            }
                        }
                    }

                    break;
                case 1:
                    SetCurrentQuestID(@temptation_of_power);
                    target = code_info.RandomSelectOne();

                    if (IsNull(target) == 0 && DistFromMe(target) <= 1500) {
                        i4 = Rand(1000);

                        if (i4 < 714) {
                            if (OwnItemCount(target, @q_gem_of_submission) + 1 >= 300) {
                                if (OwnItemCount(target, @q_gem_of_submission) < 300) {
                                    GiveItem1(target, @q_gem_of_submission, 300 - OwnItemCount(target, @q_gem_of_submission));
                                    SoundEffect(target, "ItemSound.quest_middle");
                                    SetFlagJournal(target, @temptation_of_power, 2);
                                    ShowQuestMark(target, @temptation_of_power);
                                    SetMemoState(target, @temptation_of_power, 1 * 10 + 2);
                                }
                            } else {
                                GiveItem1(target, @q_gem_of_submission, 1);
                                SoundEffect(target, "ItemSound.quest_itemget");
                            }
                        }
                    }

                    break;
                }
            }

            super;
        }
    }
     

     

    класс saint_ninja :

    Скрытый текст

     

    class saint_ninja : warrior_physicalspecial {
    parameter:
        int PhysicalSpecial = @s_npc_strike1;
        int SelfBuff = @s_self_might1;
        int IsMainForm = 1;
        int TeleportEffect = @s_self_might1;
        int OtherSelf = @orc;
        string OtherSelfAI = "saint_ninja";
        
    handler:
        EventHandler CREATED() {
            myself.i_ai0 = 0;

            if (Skill_GetConsumeMP(SelfBuff) < myself.sm.mp && Skill_GetConsumeHP(SelfBuff) < myself.sm.hp && Skill_InReuseDelay(SelfBuff) == 0) {
                AddUseSkillDesire(myself.sm, SelfBuff, @ST_HEAL, @AMT_MOVE_TO_TARGET, 1000000);
            }

            if (IsMainForm == 0) {
                AddTimerEx(2000, 60000 * 5);
            }

            AddTimerEx(2001, 60000);
            super;
        }

        EventHandler ATTACKED(attacker, damage) {
            if (Rand(100) < 80 && IsMainForm == 1 && myself.i_ai0 == 0) {
                CreateOnePrivateEx(OtherSelf, OtherSelfAI, 0, 0, FloatToInt(myself.sm.x) + Rand(20), FloatToInt(myself.sm.y) + Rand(20), FloatToInt(myself.sm.z), 32768, 1000, GetIndexFromCreature(attacker), 1);
                myself.i_ai0 = 1;
            }

            super;
        }

        EventHandler TIMER_FIRED_EX(timer_id) {
            if (timer_id == 2000) {
                if (myself.p_state != PSTATE_ATTACK) {
                    Despawn();
                    return;
                } else {
                    AddTimerEx(2000, 60000 * 5);
                }
            }

            if (timer_id == 2001) {
                if (myself.p_state != PSTATE_ATTACK) {
                    InstantRandomTeleportInMyTerritory();

                    if (Skill_GetConsumeMP(TeleportEffect) < myself.sm.mp && Skill_GetConsumeHP(TeleportEffect) < myself.sm.hp && Skill_InReuseDelay(TeleportEffect) == 0) {
                        AddUseSkillDesire(myself.sm, TeleportEffect, @ST_HEAL, @AMT_MOVE_TO_TARGET, 1000000);
                    }
                }

                AddTimerEx(2001, 60000 * 5);
            }

            super;
        }

        EventHandler CLAN_ATTACKED(attacker, damage, i6, h0, f0) {
            if (IsInCombatMode(myself.sm) == 0 && DistFromMe(attacker) > 300 && myself.sm.alive == 1) {
                InstantTeleport(myself.sm, FloatToInt(attacker.x), FloatToInt(attacker.y), FloatToInt(attacker.z));

                if (Skill_GetConsumeMP(TeleportEffect) < myself.sm.mp && Skill_GetConsumeHP(TeleportEffect) < myself.sm.hp && Skill_InReuseDelay(TeleportEffect) == 0) {
                    AddUseSkillDesire(myself.sm, TeleportEffect, @ST_HEAL, @AMT_MOVE_TO_TARGET, 1000000);
                }

                if (attacker.is_pc != 0 || IsInCategory(@summon_npc_group, attacker.class_id)) {
                    f0 = 0;

                    if (SetHateGroup >= 0) {
                        if (IsInCategory(SetHateGroup, attacker.occupation)) {
                            f0 = f0 + SetHateGroupRatio;
                        }
                    }

                    if (attacker.occupation == SetHateOccupation) {
                        f0 = f0 + SetHateOccupationRatio;
                    }

                    if (SetHateRace == attacker.race) {
                        f0 = f0 + SetHateRaceRatio;
                    }

                    f0 = 1.0 * damage / (myself.sm.level + 7) + f0 / 100 * 1.0 * damage / (myself.sm.level + 7);
                    AddAttackDesire(attacker, @AMT_MOVE_TO_TARGET, f0 * 30);
                }
            } else {
                super;
            }
        }
    }

     

     

×
×
  • Создать...