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

Billing

Путник
Пользователь
Сообщения
19
Розыгрыши
0
Репутация
0
Реакции
3
Баллы
14
Всем доброго времени суток! Столкнулся с проблемой, что НПЦ при выходе из своей зоны теряют агрессивность к персонажам спустя ровно 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;
 
вот этот таймер пробовали менять?

territory_tp_timer
 
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.
 
Назад
Сверху Снизу