Агрессивность НПЦ

  • Автор темы Автор темы Billing
  • Дата начала Дата начала

Billing

Путник
Пользователь
Сообщения
22
Розыгрыши
0
Репутация
1
Реакции
4
Баллы
30
Всем доброго времени суток! Столкнулся с проблемой, что НПЦ при выходе из своей зоны теряют агрессивность к персонажам спустя ровно 55 секунд. Были проведены тесты на другой сборке и скиптпаке, в нем мобы отвязываются спустя 90 - 100 секунд. Пробовал искать в АИ, но никак не могу найти логику, отвечающую за это. Пробовал давать аишку warrior, но проблема точно так же сохранилась.
Сборка AdvExt GFIL. Приложил декомпилы классов, с которыми наблюдается проблема. Буду рад помощи, если кто-то уже сталкивался с подобным поведением.
Это точно не настройка chose_pc, у нас она не стоит, и так же, меняли логику поведения chose_pc на сборке PTS_MY_HF, это не привело к изменениям данной логики.

C++:
class warrior : warrior_parameter
{
parameter:
    float    Attack_DecayRatio = 6.600000;
    float    UseSkill_DecayRatio = 66000.000000;
    float    Attack_BoostValue = 300.000000;
    float    UseSkill_BoostValue = 100000.000000;
    int    territory_tp_timer = 720000; //1200000
    int    territory_tp_timer_id = 9999;

handler:
    EventHandler NO_DESIRE(  )
    {
        //myself.AddMoveAroundDesire( 5, 5 );
        myself.AddMoveAroundDesire( 6, 6 );
    }

    EventHandler OUT_OF_TERRITORY(  )
    {
        myself.AddTimerEx( territory_tp_timer_id, territory_tp_timer );
        myself.Say("EventHandler OUT_OF_TERRITORY_7");
    }

    EventHandler CREATED(  )
    {
        if ( ShoutMsg1 > 0 ) {
            if ( IsSay == 0 ) {
                myself.ShoutFStr( ShoutMsg1, "", "", "", "", "" );
            } else {
                myself.SayFStr( ShoutMsg1, "", "", "", "", "" );
            }
        }
        if ( ( ( ( MoveAroundSocial > 0 ) || ( ShoutMsg2 > 0 ) ) ) || ( ShoutMsg3 > 0 ) ) {
            myself.AddTimerEx( 1001, 10000 );
        }
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id )
    {
        if ( timer_id == 1001 ) {
            if ( ( ( ( myself.p_state == 1 ) || ( myself.p_state == 2 ) ) ) || ( ( myself.p_state == 9 && myself.sm.hp > ( myself.sm.max_hp * 0.400000 ) && myself.sm.alive != 0 ) ) ) {
                if ( ( ( ( MoveAroundSocial > 0 ) || ( MoveAroundSocial1 > 0 ) ) ) || ( MoveAroundSocial2 > 0 ) ) {
                    if ( MoveAroundSocial2 > 0 && Rand( 100 ) < 20 ) {
                        myself.AddEffectActionDesire( myself.sm, 3, ( ( MoveAroundSocial2 * 1000 ) / 30 ), 50 );
                    } else {
                        if ( MoveAroundSocial1 > 0 && Rand( 100 ) < 20 ) {
                            myself.AddEffectActionDesire( myself.sm, 2, ( ( MoveAroundSocial1 * 1000 ) / 30 ), 50 );
                        } else {
                            if ( MoveAroundSocial > 0 && Rand( 100 ) < 20 ) {
                                myself.AddEffectActionDesire( myself.sm, 1, ( ( MoveAroundSocial * 1000 ) / 30 ), 50 );
                            }
                        }
                    }
                }
                if ( ShoutMsg2 > 0 && Rand( 1000 ) < 17 ) {
                    if ( IsSay == 0 ) {
                        myself.ShoutFStr( ShoutMsg2, "", "", "", "", "" );
                    } else {
                        myself.SayFStr( ShoutMsg2, "", "", "", "", "" );
                    }
                }
            } else {
                if ( myself.p_state == 3 ) {
                    if ( ShoutMsg3 > 0 && Rand( 100 ) < 10 ) {
                        if ( IsSay == 0 ) {
                            myself.ShoutFStr( ShoutMsg3, "", "", "", "", "" );
                        } else {
                            myself.SayFStr( ShoutMsg3, "", "", "", "", "" );
                        }
                    }
                }
            }
            myself.AddTimerEx( 1001, 10000 );
        }
        if ( timer_id == territory_tp_timer_id ) {
            if ( myself.InMyTerritory( myself.sm ) == 0 ) {
                myself.InstantTeleport( myself.sm, myself.start_x, myself.start_y, myself.start_z );
                myself.RemoveAllAttackDesire( );
            }
        }
        super;
    }

    EventHandler ATTACKED( attacker, damage, f0 )
    {
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            f0 = 0;
            if ( SetHateGroup >= 0 ) {
                if ( myself.IsInCategory( SetHateGroup, attacker.occupation ) ) {
                    f0 = ( f0 + SetHateGroupRatio );
                }
            }
            if ( attacker.occupation == SetHateOccupation ) {
                f0 = ( f0 + SetHateOccupationRatio );
            }
            if ( SetHateRace == attacker.race ) {
                f0 = ( f0 + SetHateRaceRatio );
            }
            f0 = ( ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) ) );
            myself.AddAttackDesire( attacker, 1, ( f0 * 100 ) );
        }
        if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
            if ( myself.GetPathfindFailCount( ) > 10 && attacker == myself.top_desire_target && FloatToInt( myself.sm.hp ) != FloatToInt( myself.sm.max_hp ) ) {
                myself.InstantTeleport( myself.sm, FloatToInt( attacker.x ), FloatToInt( attacker.y ), FloatToInt( attacker.z ) );
            }
            if ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 78708737 ) ) >= 0 && myself.DistFromMe( myself.top_desire_target ) > 40 ) {
                if ( myself.CanAttack( myself.top_desire_target ) == 1 ) {
                    if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                        f0 = 0;
                        if ( SetHateGroup >= 0 ) {
                            if ( myself.IsInCategory( SetHateGroup, attacker.occupation ) ) {
                                f0 = ( f0 + SetHateGroupRatio );
                            }
                        }
                        if ( attacker.occupation == SetHateOccupation ) {
                            f0 = ( f0 + SetHateOccupationRatio );
                        }
                        if ( SetHateRace == attacker.race ) {
                            f0 = ( f0 + SetHateRaceRatio );
                        }
                        f0 = ( ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) ) );
                        myself.AddAttackDesire( attacker, 1, ( f0 * 100 ) );
                    }
                } else {
                    myself.RemoveAttackDesire( myself.top_desire_target.id );
                    if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                        f0 = 0;
                        if ( SetHateGroup >= 0 ) {
                            if ( myself.IsInCategory( SetHateGroup, attacker.occupation ) ) {
                                f0 = ( f0 + SetHateGroupRatio );
                            }
                        }
                        if ( attacker.occupation == SetHateOccupation ) {
                            f0 = ( f0 + SetHateOccupationRatio );
                        }
                        if ( SetHateRace == attacker.race ) {
                            f0 = ( f0 + SetHateRaceRatio );
                        }
                        f0 = ( ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) ) );
                        myself.AddAttackDesire( attacker, 1, ( f0 * 100 ) );
                    }
                }
            }
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker, damage, f0 )
    {
        if ( myself.GetLifeTime( ) > 7 ) {
            if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
                if ( myself.GetPathfindFailCount( ) > 10 && attacker == myself.top_desire_target && FloatToInt( myself.sm.hp ) != FloatToInt( myself.sm.max_hp ) ) {
                    myself.InstantTeleport( myself.sm, FloatToInt( attacker.x ), FloatToInt( attacker.y ), FloatToInt( attacker.z ) );
                }
            }
            if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                f0 = 0;
                if ( SetHateGroup >= 0 ) {
                    if ( myself.IsInCategory( SetHateGroup, attacker.occupation ) ) {
                        f0 = ( f0 + SetHateGroupRatio );
                    }
                }
                if ( attacker.occupation == SetHateOccupation ) {
                    f0 = ( f0 + SetHateOccupationRatio );
                }
                if ( SetHateRace == attacker.race ) {
                    f0 = ( f0 + SetHateRaceRatio );
                }
                f0 = ( ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * damage ) / ( myself.sm.level + 7 ) ) ) );
                myself.AddAttackDesire( attacker, 1, ( f0 * 30 ) );
            }
        }
    }

    EventHandler SEE_SPELL( speller, skill_name_id, target, f0, i0 )
    {
        if ( myself.Skill_GetEffectPoint( skill_name_id ) > 0 ) {
            if ( myself.p_state == 3 && myself.top_desire_target == target ) {
                i0 = myself.Skill_GetEffectPoint( skill_name_id );
                f0 = 0;
                if ( SetHateGroup >= 0 ) {
                    if ( myself.IsInCategory( SetHateGroup, speller.occupation ) ) {
                        f0 = ( f0 + SetHateGroupRatio );
                    }
                }
                if ( speller.occupation == SetHateOccupation ) {
                    f0 = ( f0 + SetHateOccupationRatio );
                }
                if ( SetHateRace == speller.race ) {
                    f0 = ( f0 + SetHateRaceRatio );
                }
                f0 = ( ( ( 1.000000 * i0 ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * i0 ) / ( myself.sm.level + 7 ) ) ) );
                myself.AddAttackDesire( speller, 1, ( f0 * 150 ) );
            }
        }
        if ( myself.GetPathfindFailCount( ) > 10 && speller == myself.top_desire_target && FloatToInt( myself.sm.hp ) != FloatToInt( myself.sm.max_hp ) ) {
            myself.InstantTeleport( myself.sm, FloatToInt( speller.x ), FloatToInt( speller.y ), FloatToInt( speller.z ) );
        }
    }

    EventHandler DESIRE_MANIPULATION( speller, desire )
    {
        myself.MakeAttackEvent( speller, desire, 0 );
    }

    EventHandler MY_DYING(  )
    {
        if ( ShoutMsg4 > 0 && Rand( 100 ) < 30 ) {
            if ( IsSay == 0 ) {
                myself.ShoutFStr( ShoutMsg4, "", "", "", "", "" );
            } else {
                myself.SayFStr( ShoutMsg4, "", "", "", "", "" );
            }
        }
    }

}


C++:
class warrior_parameter : monster_parameter
{
handler:
    EventHandler CREATED( c0 )
    {
        if ( IsVs == 1 ) {
            myself.c_ai0 = myself.sm;
        }
        if ( myself.sm.param1 == 1000 ) {
            c0 = GetCreatureFromIndex( myself.sm.param2 );
            if ( myself.IsNullCreature( c0 ) == 0 ) {
                myself.AddUseSkillDesire( c0, 305594369, 0, 1, 10000 );
                myself.AddAttackDesire( c0, 1, 500 );
            }
        }
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id )
    {
       
        if ( timer_id == 1 ) {
            if ( AttackLowLevel == 1 ) {
                myself.LookNeighbor( 300 );
            }
        }
       
        else {
            if ( timer_id == 2 ) {
                if ( IsVs == 1 ) {
                    myself.c_ai0 = myself.sm;
                }
            }
        }
       
        super;
       
    }

    EventHandler ATTACKED( attacker, skill_id, i0, i1, i11 )
    {
       
        if ( CreviceOfDiminsion != 0 ) {
            if ( myself.InMyTerritory( attacker ) == 0 ) {
                myself.RemoveAttackDesire( attacker.id );
                return;
            }
        }
       
        if ( myself.sm.in_peacezone != 1 ) {
            if ( SSQLoserTeleport != 0 ) {
                if ( myself.IsNullCreature( attacker ) == 0 && attacker.builder_level == 0 ) {
                    if ( SSQLoserTeleport != 1 && SSQLoserTeleport != 2 ) {
                        myself.Say( "Bug: Entered wrong price in the SSQLoserTeleport. Price = " + SSQLoserTeleport );
                    } else {
                        if ( myself.GetSSQStatus( ) == 3 ) {
                            i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                            if ( attacker.is_pc == 1 ) {
                                if ( i0 == 0 && GetSSQPart( attacker ) == 0 ) {
                                    myself.RemoveAttackDesire( attacker.id );
                                    myself.InstantTeleport( attacker, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                    return;
                                } else {
                                    if ( i0 == 1 && GetSSQPart( attacker ) != 1 ) {
                                        myself.RemoveAttackDesire( attacker.id );
                                        myself.InstantTeleport( attacker, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    } else {
                                        if ( i0 == 2 && GetSSQPart( attacker ) != 2 ) {
                                            myself.RemoveAttackDesire( attacker.id );
                                            myself.InstantTeleport( attacker, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        }
                                    }
                                }
                            } else {
                                if ( myself.IsInCategory( 12, attacker.npc_class_id ) == 1 ) {
                                    if ( myself.IsNullCreature( attacker.master ) == 0 ) {
                                        if ( i0 == 0 && GetSSQPart( attacker.master ) == 0 ) {
                                            myself.RemoveAttackDesire( attacker.master.id );
                                            myself.InstantTeleport( attacker.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        } else {
                                            if ( i0 == 1 && GetSSQPart( attacker.master ) != 1 ) {
                                                myself.RemoveAttackDesire( attacker.master.id );
                                                myself.InstantTeleport( attacker.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            } else {
                                                if ( i0 == 2 && GetSSQPart( attacker.master ) != 2 ) {
                                                    myself.RemoveAttackDesire( attacker.master.id );
                                                    myself.InstantTeleport( attacker.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else {
                            if ( myself.GetSSQStatus( ) == 1 ) {
                                i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                                if ( attacker.is_pc == 1 ) {
                                    if ( GetSSQPart( attacker ) == 0 ) {
                                        myself.RemoveAttackDesire( attacker.id );
                                        myself.InstantTeleport( attacker, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    }
                                } else {
                                    if ( myself.IsInCategory( 12, attacker.npc_class_id ) == 1 ) {
                                        if ( myself.IsNullCreature( attacker.master ) == 0 ) {
                                            if ( GetSSQPart( attacker.master ) == 0 ) {
                                                myself.RemoveAttackDesire( attacker.master.id );
                                                myself.InstantTeleport( attacker.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if ( FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) <= 20 ) {
            if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
                if ( SetCurse != 0 && Rand( 100 ) < 3 && myself.top_desire_target == attacker ) {
                    myself.SayFStr( 1000452, "", "", "", "", "" );
                    if ( myself.Skill_GetConsumeMP( SetCurse ) < myself.sm.mp && myself.Skill_GetConsumeHP( SetCurse ) < myself.sm.hp && myself.Skill_InReuseDelay( SetCurse ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, SetCurse, 0, 1, 1000000 );
                    }
                }
            }
        }
        if ( SoulShot != 0 ) {
            i0 = GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 6553601 ) );
            i1 = GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 269811713 ) );
            if ( i0 <= 0 && i1 <= 0 ) {
                if ( Rand( 100 ) < SoulShotRate ) {
                    myself.UseSoulShot( SoulShot );
                }
            }
        }
        if ( SpiritShot != 0 ) {
            i0 = GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 6553601 ) );
            i1 = GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 269811713 ) );
            if ( i0 <= 0 && i1 <= 0 ) {
                if ( Rand( 100 ) < SpiritShotRate && i0 <= 0 ) {
                    myself.UseSpiritShot( SpiritShot, SpeedBonus, HealBonus );
                }
            }
        }
        if ( AttackLowLevel == 1 && myself.p_state != 3 && myself.p_state != 10 ) {
            myself.AddTimerEx( 1, 7000 );
        }
        if ( AttackLowHP == 1 && FloatToInt( ( ( attacker.hp / attacker.max_hp ) * 100 ) ) < 30 && Rand( 100 ) < 10 ) {
            if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
                if ( myself.top_desire_target != attacker ) {
                    myself.RemoveAllAttackDesire( );
                    if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                        myself.AddAttackDesire( attacker, 1, ( 1 * 100 ) );
                    }
                    select ( Rand(3) ) {
                        case 0: {
                            myself.SayFStr( 1000307, "", "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000427, "", "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000428, "", "", "", "", "" );
                            break;
                        }
                    }
                }
            }
        }
        if ( IsVs == 1 ) {
            if ( myself.IsNullCreature( myself.top_desire_target ) == 0 && myself.c_ai0 == myself.sm ) {
                if ( attacker != myself.top_desire_target && attacker.is_pc == 1 ) {
                    select ( Rand(5) ) {
                        case 0: {
                            myself.SayFStr( 1000288, attacker.name, "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000388, attacker.name, "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000389, "", "", "", "", "" );
                            break;
                        }
                        case 3: {
                            myself.SayFStr( 1000390, "", "", "", "", "" );
                            break;
                        }
                        case 4: {
                            myself.SayFStr( 1000391, "", "", "", "", "" );
                            break;
                        }
                    }
                    myself.c_ai0 = attacker;
                    myself.AddTimerEx( 2, 20000 );
                    myself.BroadcastScriptEvent( 10001, GetIndexFromCreature( attacker ), 600 );
                }
            }
        }
        if ( SpecialSkill != 0 && SpecialSkill != 458752001 ) {
            if ( FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) < 30 && Rand( 100 ) < 10 ) {
                if ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( SpecialSkill ) ) <= 0 ) {
                    select ( Rand(4) ) {
                        case 0: {
                            myself.SayFStr( 1000290, "", "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000395, "", "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000396, "", "", "", "", "" );
                            break;
                        }
                        case 3: {
                            myself.SayFStr( 1000397, "", "", "", "", "" );
                            break;
                        }
                    }
                    if ( myself.Skill_GetConsumeMP( SpecialSkill ) < myself.sm.mp && myself.Skill_GetConsumeHP( SpecialSkill ) < myself.sm.hp && myself.Skill_InReuseDelay( SpecialSkill ) == 0 ) {
                        myself.AddUseSkillDesire( myself.sm, SpecialSkill, 1, 1, 1000000 );
                    }
                }
            }
        }
        if ( HelpHeroSilhouette != 0 ) {
            if ( FloatToInt( ( ( attacker.hp / attacker.max_hp ) * 100 ) ) < 20 && Rand( 100 ) < 3 && attacker.is_pc == 1 ) {
            }
        }
        if ( DungeonType != 0 ) {
            for ( i1 = 0; i1 < DungeonType; i1 = ( i1 + 1 ) ) {
            }
            myself.Despawn( );
        }
        if ( Rand( 100 ) < 5 && myself.IsNullCreature( myself.top_desire_target ) == 0 && ShoutTarget != 0 ) {
            if ( myself.top_desire_target == attacker ) {
                myself.BroadcastScriptEvent( 10016, GetIndexFromCreature( attacker ), 300 );
            }
        }
        if ( Rand( 100 ) < 5 && SelfExplosion != 0 ) {
            i0 = FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) );
            if ( i0 < 50 ) {
                i0 = ( 10 - FloatToInt( ( i0 / 10 ) ) );
                if ( i0 > Rand( 100 ) ) {
                    if ( myself.Skill_GetConsumeMP( SelfExplosion ) < myself.sm.mp && myself.Skill_GetConsumeHP( SelfExplosion ) < myself.sm.hp && myself.Skill_InReuseDelay( SelfExplosion ) == 0 ) {
                        myself.AddUseSkillDesire( myself.sm, SelfExplosion, 0, 1, 1000000 );
                    }
                }
            }
        }
        if ( IsTransform > 0 ) {
            select ( myself.sm.param3 ) {
                case 0: {
                    if ( myself.sm.param3 < IsTransform && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) < 70 && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) > 50 && Rand( 100 ) < 30 ) {
                        myself.c_ai0 = attacker;
                        select ( Rand(3) ) {
                            case 0: {
                                myself.SayFStr( 1000406, "", "", "", "", "" );
                                break;
                            }
                            case 1: {
                                myself.SayFStr( 1000407, "", "", "", "", "" );
                                break;
                            }
                            case 2: {
                                myself.SayFStr( 1000408, "", "", "", "", "" );
                                break;
                            }
                        }
                        i0 = myself.GetDirection( myself.sm );
                        myself.CreateOnePrivateEx( step1, myself.sm.ai, 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), ( i0 * 182 ), 1000, GetIndexFromCreature( myself.c_ai0 ), 1 );
                        myself.Despawn( );
                    }
                    break;
                }
                case 1: {
                    if ( myself.sm.param3 < IsTransform && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) < 50 && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) > 30 && Rand( 100 ) < 20 ) {
                        myself.c_ai0 = attacker;
                        select ( Rand(3) ) {
                            case 0: {
                                myself.SayFStr( 1000409, "", "", "", "", "" );
                                break;
                            }
                            case 1: {
                                myself.SayFStr( 1000410, "", "", "", "", "" );
                                break;
                            }
                            case 2: {
                                myself.SayFStr( 1000411, "", "", "", "", "" );
                                break;
                            }
                        }
                        i0 = myself.GetDirection( myself.sm );
                        myself.CreateOnePrivateEx( step2, myself.sm.ai, 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), ( i0 * 182 ), 1000, GetIndexFromCreature( myself.c_ai0 ), 2 );
                        myself.Despawn( );
                    }
                    break;
                }
                case 2: {
                    if ( myself.sm.param3 < IsTransform && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) < 30 && FloatToInt( ( ( myself.sm.hp / myself.sm.max_hp ) * 100 ) ) > 5 && Rand( 100 ) < 10 ) {
                        myself.c_ai0 = attacker;
                        select ( Rand(3) ) {
                            case 0: {
                                myself.SayFStr( 1000412, "", "", "", "", "" );
                                break;
                            }
                            case 1: {
                                myself.SayFStr( 1000413, "", "", "", "", "" );
                                break;
                            }
                            case 2: {
                                myself.SayFStr( 1000414, "", "", "", "", "" );
                                break;
                            }
                        }
                        i0 = myself.GetDirection( myself.sm );
                        myself.CreateOnePrivateEx( step3, myself.sm.ai, 0, 0, FloatToInt( myself.sm.x ), FloatToInt( myself.sm.y ), FloatToInt( myself.sm.z ), ( i0 * 182 ), 1000, GetIndexFromCreature( myself.c_ai0 ), 3 );
                        myself.Despawn( );
                    }
                    break;
                }
            }
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker )
    {
        if ( AttackLowHP == 1 && FloatToInt( ( ( attacker.hp / attacker.max_hp ) * 100 ) ) < 30 && Rand( 100 ) < 3 ) {
            if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
                if ( myself.top_desire_target != attacker ) {
                    myself.RemoveAllAttackDesire( );
                    if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                        myself.AddAttackDesire( attacker, 1, ( 1 * 100 ) );
                    }
                }
            }
        }
        if ( AttackLowLevel == 1 && myself.p_state != 3 && myself.p_state != 10 ) {
            myself.AddTimerEx( 1, 7000 );
        }
    }

    EventHandler SEE_CREATURE( creature, i0 )
    {
        if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
            return;
        }
        if ( myself.sm.alive == 0 ) {
            return;
        }
        if ( myself.sm.in_peacezone != 1 ) {
            if ( SSQLoserTeleport != 0 ) {
                if ( myself.IsNullCreature( creature ) == 0 && creature.builder_level == 0 ) {
                    if ( SSQLoserTeleport != 1 && SSQLoserTeleport != 2 ) {
                        myself.Say( "Bug: Entered wrong price in the SSQLoserTeleport. Price = " + SSQLoserTeleport );
                    } else {
                        if ( myself.GetSSQStatus( ) == 3 ) {
                            i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                            if ( creature.is_pc == 1 ) {
                                if ( i0 == 0 && GetSSQPart( creature ) == 0 ) {
                                    myself.RemoveAttackDesire( creature.id );
                                    myself.InstantTeleport( creature, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                    return;
                                } else {
                                    if ( i0 == 1 && GetSSQPart( creature ) != 1 ) {
                                        myself.RemoveAttackDesire( creature.id );
                                        myself.InstantTeleport( creature, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    } else {
                                        if ( i0 == 2 && GetSSQPart( creature ) != 2 ) {
                                            myself.RemoveAttackDesire( creature.id );
                                            myself.InstantTeleport( creature, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        }
                                    }
                                }
                            } else {
                                if ( myself.IsInCategory( 12, creature.npc_class_id ) == 1 ) {
                                    if ( myself.IsNullCreature( creature.master ) == 0 ) {
                                        if ( i0 == 0 && GetSSQPart( creature.master ) == 0 ) {
                                            myself.RemoveAttackDesire( creature.master.id );
                                            myself.InstantTeleport( creature.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        } else {
                                            if ( i0 == 1 && GetSSQPart( creature.master ) != 1 ) {
                                                myself.RemoveAttackDesire( creature.master.id );
                                                myself.InstantTeleport( creature.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            } else {
                                                if ( i0 == 2 && GetSSQPart( creature.master ) != 2 ) {
                                                    myself.RemoveAttackDesire( creature.master.id );
                                                    myself.InstantTeleport( creature.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else {
                            if ( myself.GetSSQStatus( ) == 1 ) {
                                i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                                if ( creature.is_pc == 1 ) {
                                    if ( GetSSQPart( creature ) == 0 ) {
                                        myself.RemoveAttackDesire( creature.id );
                                        myself.InstantTeleport( creature, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    }
                                } else {
                                    if ( myself.IsInCategory( 12, creature.npc_class_id ) == 1 ) {
                                        if ( myself.IsNullCreature( creature.master ) == 0 ) {
                                            if ( GetSSQPart( creature.master ) == 0 ) {
                                                myself.RemoveAttackDesire( creature.master.id );
                                                myself.InstantTeleport( creature.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if ( HalfAggressive == 1 ) {
            if ( myself.GetTimeHour( ) >= 5 ) {
                if ( myself.p_state != 3 && myself.p_state != 10 ) {
                    if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
                        return;
                    }
                    if ( SeeCreatureAttackerTime == -1 ) {
                        if ( SetAggressiveTime == -1 ) {
                            if ( myself.GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && myself.InMyTerritory( myself.sm ) ) {
                                myself.AddAttackDesire( creature, 1, 200 );
                            }
                        } else {
                            if ( SetAggressiveTime == 0 ) {
                                if ( myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                }
                            } else {
                                if ( myself.GetLifeTime( ) > ( SetAggressiveTime + Rand( 4 ) ) && myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                }
                            }
                        }
                    } else {
                        if ( myself.GetLifeTime( ) > SeeCreatureAttackerTime && myself.InMyTerritory( myself.sm ) ) {
                            myself.AddAttackDesire( creature, 1, 200 );
                        }
                    }
                }
            }
            return;
        } else {
            if ( HalfAggressive == 2 ) {
                if ( myself.GetTimeHour( ) < 5 ) {
                    if ( myself.p_state != 3 && myself.p_state != 10 ) {
                        if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
                            return;
                        }
                        if ( SeeCreatureAttackerTime == -1 ) {
                            if ( SetAggressiveTime == -1 ) {
                                if ( myself.GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                }
                            } else {
                                if ( SetAggressiveTime == 0 ) {
                                    if ( myself.InMyTerritory( myself.sm ) ) {
                                        myself.AddAttackDesire( creature, 1, 200 );
                                    }
                                } else {
                                    if ( myself.GetLifeTime( ) > ( SetAggressiveTime + Rand( 4 ) ) && myself.InMyTerritory( myself.sm ) ) {
                                        myself.AddAttackDesire( creature, 1, 200 );
                                    }
                                }
                            }
                        } else {
                            if ( myself.GetLifeTime( ) > SeeCreatureAttackerTime && myself.InMyTerritory( myself.sm ) ) {
                                myself.AddAttackDesire( creature, 1, 200 );
                            }
                        }
                    }
                }
                return;
            } else {
                if ( RandomAggressive > 0 ) {
                    if ( Rand( 100 ) < RandomAggressive && creature.is_pc == 1 ) {
                        if ( myself.p_state != 3 && myself.p_state != 10 ) {
                            if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
                                return;
                            }
                            if ( SeeCreatureAttackerTime == -1 ) {
                                if ( SetAggressiveTime == -1 ) {
                                    if ( myself.GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && myself.InMyTerritory( myself.sm ) ) {
                                        myself.AddAttackDesire( creature, 1, 200 );
                                        //myself.AddAttackDesire( creature, 1, 300 );
                                    }
                                } else {
                                    if ( SetAggressiveTime == 0 ) {
                                        if ( myself.InMyTerritory( myself.sm ) ) {
                                            myself.AddAttackDesire( creature, 1, 200 );
                                            //myself.AddAttackDesire( creature, 1, 300 );
                                        }
                                    } else {
                                        if ( myself.GetLifeTime( ) > ( SetAggressiveTime + Rand( 4 ) ) && myself.InMyTerritory( myself.sm ) ) {
                                            myself.AddAttackDesire( creature, 1, 200 );
                                            //myself.AddAttackDesire( creature, 1, 300 );
                                        }
                                    }
                                }
                            } else {
                                if ( myself.GetLifeTime( ) > SeeCreatureAttackerTime && myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                    //myself.AddAttackDesire( creature, 1, 300 );
                                }
                            }
                        }
                        return;
                    } else {
                        if ( myself.p_state != 3 && myself.p_state != 10 ) {
                            myself.RemoveAllAttackDesire( );
                        }
                    }
                }
            }
        }
        if ( AttackLowLevel == 1 ) {
            if ( ( ( myself.p_state == 3 ) || ( myself.p_state == 10 ) ) && myself.DistFromMe( creature ) < 300 ) {
                if ( ( creature.level + 15 ) < myself.sm.level ) {
                    myself.RemoveAllAttackDesire( );
                    if ( ( creature.is_pc != 0 ) || ( myself.IsInCategory( 12, creature.npc_class_id ) ) ) {
                        myself.AddAttackDesire( creature, 1, ( 7 * 100 ) );
                    }
                }
                myself.AddTimerEx( 1, 7000 );
            }
        }
        if ( IsVs == 1 ) {
            if ( creature.is_pc == 1 ) {
                if ( creature.level > ( myself.sm.level - 2 ) && creature.level < ( myself.sm.level + 2 ) && myself.p_state != 3 && myself.p_state != 10 ) {
                    select ( Rand(5) ) {
                        case 0: {
                            myself.SayFStr( 1000287, creature.name, "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000384, creature.name, "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000385, creature.name, "", "", "", "" );
                            break;
                        }
                        case 3: {
                            myself.SayFStr( 1000386, creature.name, "", "", "", "" );
                            break;
                        }
                        case 4: {
                            myself.SayFStr( 1000387, creature.name, "", "", "", "" );
                            break;
                        }
                    }
                    if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
                        return;
                    }
                    if ( SeeCreatureAttackerTime == -1 ) {
                        if ( SetAggressiveTime == -1 ) {
                            if ( myself.GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && myself.InMyTerritory( myself.sm ) ) {
                                myself.AddAttackDesire( creature, 1, 200 );

                            }
                        } else {
                            if ( SetAggressiveTime == 0 ) {
                                if ( myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );

                                }
                            } else {
                                if ( myself.GetLifeTime( ) > ( SetAggressiveTime + Rand( 4 ) ) && myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );

                                }
                            }
                        }
                    } else {
                        if ( myself.GetLifeTime( ) > SeeCreatureAttackerTime && myself.InMyTerritory( myself.sm ) ) {
                            myself.AddAttackDesire( creature, 1, 200 );
                        }
                    }
                }
            }
        }
        if ( DaggerBackAttack == 1 ) {
            if ( creature.is_pc == 1 && Rand( 100 ) < 50 && myself.p_state != 3 && myself.p_state != 10 ) {
                i0 = myself.GetAngleFromTarget( creature );
                if ( myself.DistFromMe( creature ) < 100 && i0 > 36864 && i0 < 61440 ) {
                    select ( Rand(4) ) {
                        case 0: {
                            myself.SayFStr( 1000286, creature.name, "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000381, creature.name, "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000382, "", "", "", "", "" );
                            break;
                        }
                        case 3: {
                            myself.SayFStr( 1000383, "", "", "", "", "" );
                            break;
                        }
                    }
                    if ( creature.is_pc == 0 && myself.IsInCategory( 12, creature.npc_class_id ) == 0 ) {
                        return;
                    }
                    if ( SeeCreatureAttackerTime == -1 ) {
                        if ( SetAggressiveTime == -1 ) {
                            if ( myself.GetLifeTime( ) >= ( Rand( 5 ) + 3 ) && myself.InMyTerritory( myself.sm ) ) {
                                myself.AddAttackDesire( creature, 1, 200 );
                            }
                        } else {
                            if ( SetAggressiveTime == 0 ) {
                                if ( myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                }
                            } else {
                                if ( myself.GetLifeTime( ) > ( SetAggressiveTime + Rand( 4 ) ) && myself.InMyTerritory( myself.sm ) ) {
                                    myself.AddAttackDesire( creature, 1, 200 );
                                }
                            }
                        }
                    } else {
                        if ( myself.GetLifeTime( ) > SeeCreatureAttackerTime && myself.InMyTerritory( myself.sm ) ) {
                            myself.AddAttackDesire( creature, 1, 200 );
                        }
                    }
                }
            }
        }
        super;
    }

    EventHandler SEE_SPELL( speller, target, skill_name_id, x, y, z, i0, f0 )
    {
        if ( myself.sm.in_peacezone != 1 ) {
            if ( SSQLoserTeleport != 0 ) {
                if ( myself.IsNullCreature( speller ) == 0 && speller.builder_level == 0 ) {
                    if ( SSQLoserTeleport != 1 && SSQLoserTeleport != 2 ) {
                        myself.Say( "Bug: Entered wrong price in the SSQLoserTeleport. Price = " + SSQLoserTeleport );
                    } else {
                        if ( myself.GetSSQStatus( ) == 3 ) {
                            i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                            if ( speller.is_pc == 1 ) {
                                if ( i0 == 0 && GetSSQPart( speller ) == 0 ) {
                                    myself.RemoveAttackDesire( speller.id );
                                    myself.InstantTeleport( speller, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                    return;
                                } else {
                                    if ( i0 == 1 && GetSSQPart( speller ) != 1 ) {
                                        myself.RemoveAttackDesire( speller.id );
                                        myself.InstantTeleport( speller, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    } else {
                                        if ( i0 == 2 && GetSSQPart( speller ) != 2 ) {
                                            myself.RemoveAttackDesire( speller.id );
                                            myself.InstantTeleport( speller, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        }
                                    }
                                }
                            } else {
                                if ( myself.IsInCategory( 12, speller.npc_class_id ) == 1 ) {
                                    if ( myself.IsNullCreature( speller.master ) == 0 ) {
                                        if ( i0 == 0 && GetSSQPart( speller.master ) == 0 ) {
                                            myself.RemoveAttackDesire( speller.master.id );
                                            myself.InstantTeleport( speller.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                            return;
                                        } else {
                                            if ( i0 == 1 && GetSSQPart( speller.master ) != 1 ) {
                                                myself.RemoveAttackDesire( speller.master.id );
                                                myself.InstantTeleport( speller.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            } else {
                                                if ( i0 == 2 && GetSSQPart( speller.master ) != 2 ) {
                                                    myself.RemoveAttackDesire( speller.master.id );
                                                    myself.InstantTeleport( speller.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                    return;
                                                }
                                            }
                                        }
                                    }
                                }
                            }
                        } else {
                            if ( myself.GetSSQStatus( ) == 1 ) {
                                i0 = myself.GetSSQSealOwner( SSQLoserTeleport );
                                if ( speller.is_pc == 1 ) {
                                    if ( GetSSQPart( speller ) == 0 ) {
                                        myself.RemoveAttackDesire( speller.id );
                                        myself.InstantTeleport( speller, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                        return;
                                    }
                                } else {
                                    if ( myself.IsInCategory( 12, speller.npc_class_id ) == 1 ) {
                                        if ( myself.IsNullCreature( speller.master ) == 0 ) {
                                            if ( GetSSQPart( speller.master ) == 0 ) {
                                                myself.RemoveAttackDesire( speller.master.id );
                                                myself.InstantTeleport( speller.master, SSQTelPosX, SSQTelPosY, SSQTelPosZ );
                                                return;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        if ( ( speller.level + 15 ) < myself.sm.level ) {
            myself.RemoveAllAttackDesire( );
            if ( myself.Skill_GetEffectPoint( skill_name_id ) > 0 ) {
                if ( myself.p_state == 3 && myself.top_desire_target == target ) {
                    i0 = myself.Skill_GetEffectPoint( skill_name_id );
                    f0 = 0;
                    if ( SetHateGroup >= 0 ) {
                        if ( myself.IsInCategory( SetHateGroup, speller.occupation ) ) {
                            f0 = ( f0 + SetHateGroupRatio );
                        }
                    }
                    if ( speller.occupation == SetHateOccupation ) {
                        f0 = ( f0 + SetHateOccupationRatio );
                    }
                    if ( SetHateRace == speller.race ) {
                        f0 = ( f0 + SetHateRaceRatio );
                    }
                    f0 = ( ( ( 1.000000 * i0 ) / ( myself.sm.level + 7 ) ) + ( ( f0 / 100 ) * ( ( 1.000000 * i0 ) / ( myself.sm.level + 7 ) ) ) );
                    myself.AddAttackDesire( speller, 1, ( f0 * 150 ) );
                }
            }
            if ( myself.GetPathfindFailCount( ) > 10 && speller == myself.top_desire_target && FloatToInt( myself.sm.hp ) != FloatToInt( myself.sm.max_hp ) ) {
                myself.InstantTeleport( myself.sm, FloatToInt( speller.x ), FloatToInt( speller.y ), FloatToInt( speller.z ) );
            }
        }
        if ( SwapPosition != 0 ) {
            if ( myself.p_state == 3 && Rand( 100 ) < SwapPosition ) {
                if ( myself.IsNullCreature( myself.top_desire_target ) == 0 ) {
                    if ( myself.IsInCategory( 0, myself.top_desire_target.occupation ) == 1 ) {
                        if ( ( myself.IsInCategory( 0, myself.top_desire_target.occupation ) == 1 ) || ( myself.IsInCategory( 3, myself.top_desire_target.occupation ) == 1 ) ) {
                            if ( myself.DistFromMe( myself.top_desire_target ) < myself.DistFromMe( speller ) ) {
                                if ( myself.DistFromMe( speller ) < 900 ) {
                                    x = FloatToInt( speller.x );
                                    y = FloatToInt( speller.y );
                                    z = FloatToInt( speller.z );
                                    myself.InstantTeleport( speller, FloatToInt( myself.top_desire_target.x ), FloatToInt( myself.top_desire_target.y ), FloatToInt( myself.top_desire_target.z ) );
                                    myself.InstantTeleport( myself.top_desire_target, x, y, z );
                                    myself.AddAttackDesire( speller, 1, 1000 );
                                }
                            }
                        }
                    }
                }
            }
        }
        super;
    }

    EventHandler SCRIPT_EVENT( script_event_arg1, script_event_arg2, c0 )
    {
        if ( script_event_arg1 == 10001 && myself.p_state != 3 ) {
            c0 = GetCreatureFromIndex( script_event_arg2 );
            if ( myself.IsNullCreature( c0 ) == 0 ) {
                if ( myself.sm.alive == 0 ) {
                    return;
                }
                if ( myself.c_ai0 != c0 ) {
                    select ( Rand(3) ) {
                        case 0: {
                            myself.SayFStr( 1000392, "", "", "", "", "" );
                            break;
                        }
                        case 1: {
                            myself.SayFStr( 1000393, "", "", "", "", "" );
                            break;
                        }
                        case 2: {
                            myself.SayFStr( 1000394, "", "", "", "", "" );
                            break;
                        }
                    }
                    myself.AddAttackDesire( c0, 1, 1000000 );
                }
            }
        }
        if ( script_event_arg1 == 10016 && Rand( 100 ) < 50 ) {
            c0 = GetCreatureFromIndex( script_event_arg2 );
            if ( myself.IsNullCreature( c0 ) == 0 ) {
                if ( myself.sm.alive == 0 ) {
                    return;
                }
                myself.RemoveAllAttackDesire( );
                if ( ( c0.is_pc != 0 ) || ( myself.IsInCategory( 12, c0.npc_class_id ) ) ) {
                    myself.AddAttackDesire( c0, 1, ( 1 * 100 ) );
                }
            }
        }
        if ( script_event_arg1 == 10020 ) {
            c0 = GetCreatureFromIndex( script_event_arg2 );
            if ( myself.IsNullCreature( c0 ) == 0 ) {
                if ( myself.sm.alive == 0 ) {
                    return;
                }
                if ( ( c0.is_pc != 0 ) || ( myself.IsInCategory( 12, c0.npc_class_id ) ) ) {
                    myself.AddAttackDesire( c0, 1, ( 1 * 100 ) );
                }
            }
        }
    }

    EventHandler USE_SKILL_FINISHED( skill_name_id )
    {
        if ( SelfExplosion != 0 ) {
            if ( skill_name_id == SelfExplosion ) {
                myself.Suicide( );
            }
        }
    }

}
C++:
class monster_parameter : default_npc
{
parameter:
    int    AttackLowLevel = 0;
    int    RunAway = 1;
    int    SetCurse = 0;
    int    AttackLowHP = 0;
    int    HelpHeroSilhouette = 0;
    string    HelpHeroAI = "warrior_hero";
    int    SetAggressiveTime = -1;
    int    HalfAggressive = 0;
    int    RandomAggressive = 0;
    int    SetHateGroup = -1;
    int    SetHateGroupRatio = 0;
    int    SetHateOccupation = -1;
    int    SetHateOccupationRatio = 0;
    int    SetHateRace = -1;
    int    SetHateRaceRatio = 0;
    int    IsTransform = 0;
    int    step1 = 1020130;
    int    step2 = 1020006;
    int    step3 = 1020853;
    int    DaggerBackAttack = 458752001;
    int    IsVs = 0;
    int    SpecialSkill = 458752001;
    int    MoveAroundSocial = 0;
    int    MoveAroundSocial1 = 0;
    int    MoveAroundSocial2 = 0;
    int    IsSay = 0;
    int    ShoutMsg1 = 0;
    int    ShoutMsg2 = 0;
    int    ShoutMsg3 = 0;
    int    ShoutMsg4 = 0;
    int    SSQLoserTeleport = 0;
    int    SSQTelPosX = 0;
    int    SSQTelPosY = 0;
    int    SSQTelPosZ = 0;
    int    SwapPosition = 0;
    int    FriendShip = 0;
    int    DungeonType = 0;
    int    DungeonTypeAI = 0;
    string    DungeonTypePrivate = "";
    int    ShoutTarget = 0;
    int    AcceptShoutTarget = 0;
    int    SelfExplosion = 0;
    int    FriendShip1 = 0;
    int    FriendShip2 = 0;
    int    FriendShip3 = 0;
    int    FriendShip4 = 0;
    int    FriendShip5 = 0;
    int    DungeonType = 0;
    int    DungeonTypeAI = 0;
    string    DungeonTypePrivate = "";
    int    SoulShot = 0;
    int    SoulShotRate = 0;
    int    SpiritShot = 0;
    int    SpiritShotRate = 0;
    int    SpeedBonus = 0;
    int    HealBonus = 0;
    int    CreviceOfDiminsion = 0;
    int    LongRangeGuardRate = -1;
    int    SeeCreatureAttackerTime = -1;

handler:
    EventHandler ATTACK_FINISHED( target )
    {
        if ( target.alive == 0 && target.is_pc == 0 ) {
            /*
            if ( myself.IsInCategory( 12, target.npc_class_id ) != 0 && myself.IsNullCreature( target.master ) == 0 ) {
                myself.AddAttackDesire( target.master, 1, 500 );
            }
            */
            if ( myself.IsInCategory( 11, target.npc_class_id ) != 0 ) {
                myself.AddAttackDesire( target.master, 1, 500 );
            }
           
        }
    }

}


C++:
class default_npc
{
parameter:
    int    DesirePqSize = 50;
    int    FavorListSize = 30;
    float    IdleDesire_DecayRatio = 0.000000;
    float    MoveAround_DecayRatio = 0.000000;
    float    DoNothing_DecayRatio = 0.000000;
    float    Attack_DecayRatio = 0.000000;
    float    Chase_DecayRatio = 0.000000;
    float    Flee_DecayRatio = 0.000000;
    float    GetItem_DecayRatio = 0.000000;
    float    Follow_DecayRatio = 0.000000;
    float    Decaying_DecayRatio = 0.000000;
    float    MoveToWayPoint_DecayRatio = 0.000000;
    float    UseSkill_DecayRatio = 0.000000;
    float    MoveTo_DecayRatio = 0.000000;
    float    EffectAction_DecayRatio = 0.000000;
    float    MoveToTarget_DecayRatio = 0.000000;
    float    IdleDesire_BoostValue = 0.000000;
    float    MoveAround_BoostValue = 0.000000;
    float    DoNothing_BoostValue = 0.000000;
    float    Attack_BoostValue = 0.000000;
    float    Chase_BoostValue = 0.000000;
    float    Flee_BoostValue = 0.000000;
    float    GetItem_BoostValue = 0.000000;
    float    Follow_BoostValue = 0.000000;
    float    Decaying_BoostValue = 0.000000;
    float    MoveToWayPoint_BoostValue = 0.000000;
    float    UseSkill_BoostValue = 0.000000;
    float    MoveTo_BoostValue = 0.000000;
    float    EffectAction_BoostValue = 0.000000;
    float    MoveToTarget_BoostValue = 0.000000;
    int    Dispel_Debuff = 0;
    int    Dispel_Debuff_Prob = 0;
    int    QuestDropMultiplierMin = 1;
    int    QuestDropMultiplierMax = 1;
    int    treasureMaxDropChance = 10;
    int    QuestExpRate = 1;
    int    QuestSpRate = 1        ;
    int    QuestAdenaRate = 1;
    int    QuestDropChanceMultiplier = 1;
    int    treasureDropFromAIFlag = 1;
    int    QuestRate_240 = 1;
    int    QuestRate_278 = 1;
    int    QuestRate_290 = 1;
    int    QuestRate_310 = 1;
    int    QuestRate_605 = 1;
    int    QuestRate_611 = 1;
    int    QuestRate_624 = 1;
    int    QuestRate_627 = 1;
    string    _blank = "";
    int    boss_announce_spawn = 0;

handler:
    EventHandler NO_DESIRE(  )
    {
    }

    EventHandler TALK_SELECTED( talker )
    {
        myself.ShowPage( talker, "noquest.htm" );
    }

    EventHandler ABNORMAL_STATUS_CHANGED( skill_level, skill_name_id, i0, i1, i2 )
    {
        if ( ( Dispel_Debuff == 1 ) || ( Dispel_Debuff == 2 ) ) {
            if ( skill_level > 0 ) {
                i1 = myself.Skill_GetAbnormalType( skill_name_id );
                i2 = GetAbnormalLevel( myself.sm, i1 );
                if ( i2 > 0 ) {
                    i0 = 0;
                    if ( myself.Skill_GetAbnormalType( 6029313 ) == i1 ) {
                        i0 = 6029313;
                    } else {
                        if ( myself.Skill_GetAbnormalType( 91357185 ) == i1 ) {
                            i0 = 91357185;
                        } else {
                            if ( myself.Skill_GetAbnormalType( 18284545 ) == i1 ) {
                                i0 = 18284545;
                            } else {
                                if ( myself.Skill_GetAbnormalType( 24051713 ) == i1 ) {
                                    i0 = 24051713;
                                } else {
                                    if ( myself.Skill_GetAbnormalType( 76611585 ) == i1 ) {
                                        i0 = 76611585;
                                    } else {
                                        if ( myself.Skill_GetAbnormalType( 78708737 ) == i1 ) {
                                            i0 = 78708737;
                                        } else {
                                            if ( myself.Skill_GetAbnormalType( 26411009 ) == i1 ) {
                                                i0 = 26411009;
                                            }
                                        }
                                    }
                                }
                            }
                        }
                    }
                    if ( i0 > 0 ) {
                        if ( Dispel_Debuff == 1 ) {
                            myself.Dispel( myself.sm, i0 );
                        } else {
                            if ( Dispel_Debuff == 2 && Rand( 10000 ) < Dispel_Debuff_Prob ) {
                                myself.Dispel( myself.sm, i0 );
                            }
                        }
                    }
                }
            }
        }
    }
}
 

это базовые классы. в npcdata.txt нет мобов с этими аи. и естественно в этих базовых классах нет определения агрессивности, не в каком ее виде.
 
это базовые классы. в npcdata.txt нет мобов с этими аи. и естественно в этих базовых классах нет определения агрессивности, не в каком ее виде.
Речь идет не о агрессивности нпц, когда он сам агрится на игрока, а о ситуации, когда игрок ударил нпц, и вывел его за пределы его территории. В данных, базовых классах есть такая логика, но никак не могу найти логику выхода за территорию, ведь хендел, отвечающий за это, ее не имеет.
 
myself.AddAttackDesire
Больше значение дай, будет бегать хоть через всю карту.
 
myself.AddAttackDesire
Больше значение дай, будет бегать хоть через всю карту.
Забыл дополнить, что менял параметры угасания агрессивности, это ни к чему не привело, как и изменение мощности агрессивности.

C++:
    float    Attack_DecayRatio = 6.600000;
    float    UseSkill_DecayRatio = 66000.000000;
    float    Attack_BoostValue = 300.000000;
    float    UseSkill_BoostValue = 100000.000000;
 
Well, provide AI of the actual class you study and all parent classes.
 
вот этот таймер пробовали менять?

territory_tp_timer
 
Do more damage and accumulate hate, does the aggresion still go away after 55 seconds?
 
Do more damage and accumulate hate, does the aggresion still go away after 55 seconds?
If you join the battle, then the NPC fights until it dies, but if you don't deal damage, then after 55 seconds it loses its aggressiveness. I try to code this:
C++:
    EventHandler OUT_OF_TERRITORY(  )
    {
        myself.AddTimerEx( 999, 55000 );
        myself.Say("EventHandler OUT_OF_TERRITORY_5");
    }
    EventHandler TIMER_FIRED_EX( timer_id )
    {
        if (timer_id == 999){
            myself.Say("Timer 999_5");
            myself.AddAttackDesire( myself.top_desire_target, 1, 300);
        }
    }
and this works, but mobs lose their aggressiveness after 1 minute and 50 seconds, and handler timer_fired_ex doent's always work.
I try to add myself.AddAttackDesire in EventHandler OUT_OF_TERRITORY, it doesn't work.
 
If you don't hit continously, mobs will eventually lose aggressiveness (attackdesire), based on Attack_DecayRatio. If you want the mob to keep hitting you, you must hit it again. I don't have access to sources right now, but from a quick search, normal mobs don't care about territories.
 
If you don't hit continously, mobs will eventually lose aggressiveness (attackdesire), based on Attack_DecayRatio. If you want the mob to keep hitting you, you must hit it again. I don't have access to sources right now, but from a quick search, normal mobs don't care about territories.
If the NPC is not withdrawn from its territory, it will take a very long time to attack, more than 55 seconds. I tried changing the Attack_DecayRatio, it didn't lead to anything.
 
1) Are you sure you changed the value of the last inherited class?
2) anyway, you can spam//debugnpc in both scenarios and observe how decay works every tick.
 
Назад
Сверху