Всем доброго времени суток! Столкнулся с проблемой, что НПЦ при выходе из своей зоны теряют агрессивность к персонажам спустя ровно 55 секунд. Были проведены тесты на другой сборке и скиптпаке, в нем мобы отвязываются спустя 90 - 100 секунд. Пробовал искать в АИ, но никак не могу найти логику, отвечающую за это. Пробовал давать аишку warrior, но проблема точно так же сохранилась.
Сборка AdvExt GFIL. Приложил декомпилы классов, с которыми наблюдается проблема. Буду рад помощи, если кто-то уже сталкивался с подобным поведением.
Это точно не настройка chose_pc, у нас она не стоит, и так же, меняли логику поведения chose_pc на сборке PTS_MY_HF, это не привело к изменениям данной логики.
Сборка 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 );
}
}
}
}
}
}
}
}