Класс визардов

Stellar.

Интересующийся
Участник
Сообщения
29
Розыгрыши
0
Репутация
0
Реакции
6
Баллы
335
Всем привет и с наступившим новым годом!
Прошу помощи. На сервере есть мобы - маги, которые нон стоп кастуют скиллы, и не бегут после каста бить с руки. Хочется все таки сделать так, чтобы после каста скилла, моб пошёл ковырять игрока с руки. Эксперименты не удались. Решил обратиться к знатокам для помощи. Прикладываю ветку классов визарда. Буду признателен любой помощи! Спасибо!

C++:
class wizard : wizard_parameter
{
parameter:
    float    Attack_DecayRatio = 6.600000;
    float    UseSkill_DecayRatio = 66000.000000;
    float    Attack_BoostValue = 300.000000;
    float    UseSkill_BoostValue = 100000.000000;

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

    EventHandler CREATED(  )
    {
        if ( ShoutMsg1 > 0 ) {
            myself.Shout( MakeFString( ShoutMsg1, _blank, _blank, _blank, _blank, _blank ) );
        }
        if ( ( ( ( MoveAroundSocial > 0 ) || ( ShoutMsg2 > 0 ) ) ) || ( ShoutMsg3 > 0 ) ) {
            myself.AddTimerEx( 1001, 10000 );
        }
        myself.AddTimerEx( 1002, 10000 );
        myself.i_ai0 = 0;
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id, h0, i0 )
    {
        if ( timer_id == 1001 ) {
            if ( ( ( ( myself.p_state == 1 ) || ( myself.p_state == 2 ) ) ) || ( myself.p_state == 9 ) ) {
                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 ) {
                    myself.Shout( MakeFString( ShoutMsg2, _blank, _blank, _blank, _blank, _blank ) );
                }
            } else {
                if ( myself.p_state == 3 ) {
                    if ( ShoutMsg3 > 0 && Rand( 100 ) < 10 ) {
                        myself.Shout( MakeFString( ShoutMsg3, _blank, _blank, _blank, _blank, _blank ) );
                    }
                }
            }
            myself.AddTimerEx( 1001, 10000 );
        } else {
            if ( timer_id == 1002 ) {
                myself.AddTimerEx( 1002, 10000 );
                myself.RemoveAllHateInfoIF( 1, 0 );
                myself.RemoveAllHateInfoIF( 3, 1000 );
            } else {
                if ( timer_id == 1003 ) {
                    if ( ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 69730305 ) ) > 0 ) || ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 87556097 ) ) > 0 ) ) {
                        myself.AddTimerEx( 1003, 10000 );
                    } else {
                        myself.RemoveAllAttackDesire( );
                        myself.i_ai0 = 0;
                        h0 = myself.GetMaxHateInfo( 0 );
                        i0 = 0;
                        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                                i0 = 1;
                            }
                        }
                        if ( i0 == 1 ) {
                            myself.MakeAttackEvent( h0.creature, 100, 0 );
                        }
                    }
                }
            }
        }
        super;
    }

    EventHandler ATTACKED( attacker, damage, skill_name_id, f0 )
    {
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.GetHateInfoCount( ) == 0 ) {
                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.AddHateInfo( attacker, FloatToInt( ( ( f0 * 100 ) + 300 ) ), 0, 1, 1 );
            } else {
                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.AddHateInfo( attacker, FloatToInt( ( f0 * 100 ) ), 0, 1, 1 );
            }
        }
        if ( ( ( ( ( skill_name_id / 65536 ) == ( 69730305 / 65536 ) ) || ( ( skill_name_id / 65536 ) == ( 81657857 / 65536 ) ) ) ) || ( ( skill_name_id / 65536 ) == ( 87556097 / 65536 ) ) ) {
            myself.i_ai0 = 1;
            myself.AddTimerEx( 1003, 10000 );
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker, damage, f0 )
    {
        if ( myself.GetLifeTime( ) > 7 ) {
            if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                if ( myself.GetHateInfoCount( ) == 0 ) {
                    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.AddHateInfo( attacker, FloatToInt( ( ( f0 * 30 ) + 300 ) ), 0, 1, 1 );
                } else {
                    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.AddHateInfo( attacker, FloatToInt( ( f0 * 30 ) ), 0, 1, 1 );
                }
            }
        }
    }

    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 == speller ) {
                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.AddHateInfo( speller, FloatToInt( ( f0 * 150 ) ), 0, 1, 1 );
            } else {
                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.AddHateInfo( speller, FloatToInt( ( f0 * 75 ) ), 0, 1, 1 );
            }
        }
    }

    EventHandler DESIRE_MANIPULATION( speller, desire )
    {
        if ( myself.IsBoss( ) == 0 ) {
            myself.AddHateInfo( speller, desire, 0, 1, 1 );
        }
        super;
    }

    EventHandler MY_DYING( target, i0, i1, last_attacker, i2, i3, i4, i9, lparty, random1_list, code_info )
    {
        if ( ShoutMsg4 > 0 && Rand( 100 ) < 30 ) {
            myself.Shout( MakeFString( ShoutMsg4, _blank, _blank, _blank, _blank, _blank ) );
        }
    }

}

class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
            }
        }
    }

}

class wizard_ddmagic2_curse : wizard_ddmagic2
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DeBuff = 264568833;

handler:
    EventHandler ATTACKED( attacker, damage, i6, h0, i0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) && myself.i_ai0 == 0 ) {
            i0 = 0;
            if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                    i0 = 1;
                }
            }
            if ( Rand( 100 ) < 33 && GetAbnormalLevel( attacker, myself.Skill_GetAbnormalType( DeBuff ) ) <= 0 && i0 == 1 ) {
                if ( myself.Skill_GetConsumeMP( DeBuff ) < myself.sm.mp && myself.Skill_GetConsumeHP( DeBuff ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( DeBuff ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6 )
    {
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( Rand( 100 ) < 33 && GetAbnormalLevel( attacker, myself.Skill_GetAbnormalType( DeBuff ) ) <= 0 ) {
                if ( myself.Skill_GetConsumeMP( DeBuff ) < myself.sm.mp && myself.Skill_GetConsumeHP( DeBuff ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( DeBuff ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

}
 

Всем привет и с наступившим новым годом!
Прошу помощи. На сервере есть мобы - маги, которые нон стоп кастуют скиллы, и не бегут после каста бить с руки. Хочется все таки сделать так, чтобы после каста скилла, моб пошёл ковырять игрока с руки. Эксперименты не удались. Решил обратиться к знатокам для помощи. Прикладываю ветку классов визарда. Буду признателен любой помощи! Спасибо!

C++:
class wizard : wizard_parameter
{
parameter:
    float    Attack_DecayRatio = 6.600000;
    float    UseSkill_DecayRatio = 66000.000000;
    float    Attack_BoostValue = 300.000000;
    float    UseSkill_BoostValue = 100000.000000;

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

    EventHandler CREATED(  )
    {
        if ( ShoutMsg1 > 0 ) {
            myself.Shout( MakeFString( ShoutMsg1, _blank, _blank, _blank, _blank, _blank ) );
        }
        if ( ( ( ( MoveAroundSocial > 0 ) || ( ShoutMsg2 > 0 ) ) ) || ( ShoutMsg3 > 0 ) ) {
            myself.AddTimerEx( 1001, 10000 );
        }
        myself.AddTimerEx( 1002, 10000 );
        myself.i_ai0 = 0;
        super;
    }

    EventHandler TIMER_FIRED_EX( timer_id, h0, i0 )
    {
        if ( timer_id == 1001 ) {
            if ( ( ( ( myself.p_state == 1 ) || ( myself.p_state == 2 ) ) ) || ( myself.p_state == 9 ) ) {
                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 ) {
                    myself.Shout( MakeFString( ShoutMsg2, _blank, _blank, _blank, _blank, _blank ) );
                }
            } else {
                if ( myself.p_state == 3 ) {
                    if ( ShoutMsg3 > 0 && Rand( 100 ) < 10 ) {
                        myself.Shout( MakeFString( ShoutMsg3, _blank, _blank, _blank, _blank, _blank ) );
                    }
                }
            }
            myself.AddTimerEx( 1001, 10000 );
        } else {
            if ( timer_id == 1002 ) {
                myself.AddTimerEx( 1002, 10000 );
                myself.RemoveAllHateInfoIF( 1, 0 );
                myself.RemoveAllHateInfoIF( 3, 1000 );
            } else {
                if ( timer_id == 1003 ) {
                    if ( ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 69730305 ) ) > 0 ) || ( GetAbnormalLevel( myself.sm, myself.Skill_GetAbnormalType( 87556097 ) ) > 0 ) ) {
                        myself.AddTimerEx( 1003, 10000 );
                    } else {
                        myself.RemoveAllAttackDesire( );
                        myself.i_ai0 = 0;
                        h0 = myself.GetMaxHateInfo( 0 );
                        i0 = 0;
                        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                                i0 = 1;
                            }
                        }
                        if ( i0 == 1 ) {
                            myself.MakeAttackEvent( h0.creature, 100, 0 );
                        }
                    }
                }
            }
        }
        super;
    }

    EventHandler ATTACKED( attacker, damage, skill_name_id, f0 )
    {
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.GetHateInfoCount( ) == 0 ) {
                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.AddHateInfo( attacker, FloatToInt( ( ( f0 * 100 ) + 300 ) ), 0, 1, 1 );
            } else {
                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.AddHateInfo( attacker, FloatToInt( ( f0 * 100 ) ), 0, 1, 1 );
            }
        }
        if ( ( ( ( ( skill_name_id / 65536 ) == ( 69730305 / 65536 ) ) || ( ( skill_name_id / 65536 ) == ( 81657857 / 65536 ) ) ) ) || ( ( skill_name_id / 65536 ) == ( 87556097 / 65536 ) ) ) {
            myself.i_ai0 = 1;
            myself.AddTimerEx( 1003, 10000 );
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker, damage, f0 )
    {
        if ( myself.GetLifeTime( ) > 7 ) {
            if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
                if ( myself.GetHateInfoCount( ) == 0 ) {
                    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.AddHateInfo( attacker, FloatToInt( ( ( f0 * 30 ) + 300 ) ), 0, 1, 1 );
                } else {
                    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.AddHateInfo( attacker, FloatToInt( ( f0 * 30 ) ), 0, 1, 1 );
                }
            }
        }
    }

    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 == speller ) {
                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.AddHateInfo( speller, FloatToInt( ( f0 * 150 ) ), 0, 1, 1 );
            } else {
                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.AddHateInfo( speller, FloatToInt( ( f0 * 75 ) ), 0, 1, 1 );
            }
        }
    }

    EventHandler DESIRE_MANIPULATION( speller, desire )
    {
        if ( myself.IsBoss( ) == 0 ) {
            myself.AddHateInfo( speller, desire, 0, 1, 1 );
        }
        super;
    }

    EventHandler MY_DYING( target, i0, i1, last_attacker, i2, i3, i4, i9, lparty, random1_list, code_info )
    {
        if ( ShoutMsg4 > 0 && Rand( 100 ) < 30 ) {
            myself.Shout( MakeFString( ShoutMsg4, _blank, _blank, _blank, _blank, _blank ) );
        }
    }

}

class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
            }
        }
    }

}

class wizard_ddmagic2_curse : wizard_ddmagic2
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DeBuff = 264568833;

handler:
    EventHandler ATTACKED( attacker, damage, i6, h0, i0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) && myself.i_ai0 == 0 ) {
            i0 = 0;
            if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                    i0 = 1;
                }
            }
            if ( Rand( 100 ) < 33 && GetAbnormalLevel( attacker, myself.Skill_GetAbnormalType( DeBuff ) ) <= 0 && i0 == 1 ) {
                if ( myself.Skill_GetConsumeMP( DeBuff ) < myself.sm.mp && myself.Skill_GetConsumeHP( DeBuff ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( DeBuff ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6 )
    {
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( Rand( 100 ) < 33 && GetAbnormalLevel( attacker, myself.Skill_GetAbnormalType( DeBuff ) ) <= 0 ) {
                if ( myself.Skill_GetConsumeMP( DeBuff ) < myself.sm.mp && myself.Skill_GetConsumeHP( DeBuff ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( DeBuff ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, DeBuff, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

}
А если сделать им столько маны что б хватало на 1 спелл?))
 
А если сделать им столько маны что б хватало на 1 спелл?))
хочу чтобы было более менее нормально, чтобы кастовал скиллы и бил рукой. чтобы можно было собирать парики с магами
 
А что сразу я то? :)
---
А по делу - переписывать выбор скиллов в ATTACKED, уменьшив вероятности выбора каста или вобще на время блокируя повторные выборы "кастовать" на время например выставлением этого переменной и пока она выставлена - делать безусловный AddAttackDesire вместо выборов. Ну и скидывать к примеру по таймеру эту переменную через некоторое время.
 
А что сразу я то? :)
---
А по делу - переписывать выбор скиллов в ATTACKED, уменьшив вероятности выбора каста или вобще на время блокируя повторные выборы "кастовать" на время например выставлением этого переменной и пока она выставлена - делать безусловный AddAttackDesire вместо выборов. Ну и скидывать к примеру по таймеру эту переменную через некоторое время.
Суть какая.
На словах и логике я понимаю что нужно делать.
Можно даже сделать основной атакой ближний скилл аура берн , а-ля «он же маг». Но, отобразить это в коде испытываю проблему.
 
Суть какая.
На словах и логике я понимаю что нужно делать.
Можно даже сделать основной атакой ближний скилл аура берн , а-ля «он же маг». Но, отобразить это в коде испытываю проблему.
GPT, Copilot, и другие - помогут разобрать, указать что и где, изменить то что хотите (только вы должны понимать хотя бы на какой то % код что там описан, что бы вам не ответили "не верно"
 
Обычно если человек не знает как это выразить в коде значит у него очень мало опыта в этом деле и нужно начинать с чего-то по проще какие-то видео уроки с примерами как правильно строить что-бы набить скилл и дальше уже будешь как на автопилоте преобразовывать мысли в код
 
Stellar., менять надо логику в USE_SKILL_FINISHED, который перезапускает атаку, создавая желание на нее или каст.

Я продемонстрирую изменения на примере:

C++:
class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;
    int    ShortRangeMeleeAttackDesireChance = 25;
    int    ShortRangeMeleeAttackDesireDistance = 200;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if (Rand(100) < ShortRangeMeleeAttackDesireChance && myself.DistFromMe( h0.creature ) < ShortRangeMeleeAttackDesireDistance ) {
                   myself.AddAttackDesire( h0.creature, 1, 1000 );
                } else {              
if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
                }
            }
        }
    }

}

Я добавил дополнительную проверку в начале. Если прошел шанс и мы не слишком далеко, то инициируют прямую атаку. Если нет, то срабатывает стандартная логика(проверяется дистанция, выбирает скилл, проверяются его условия и запускается либо каст, либо обычная атака.

Т.е, если резюмировать изменения - моб после завершения каста, с шансом 25% может побежать в атаку, вместо повторного каста. При этом, это не затронет логику его ответки на атаки, на события атаки клана и группы. Т.е просто повторный каст может не начаться.
PS: Этот метод переопределяется в wizard_ddmagic2_heal_clan
 
Последнее редактирование:
  • Мне нравится
Реакции: BladeRunner

    Stellar.

    Баллов: 5
    Спасибо за по ось
Stellar., менять надо логику в USE_SKILL_FINISHED, который перезапускает атаку, создавая желание на нее или каст.

Я продемонстрирую изменения на примере:

C++:
class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;
    int    ShortRangeMeleeAttackDesireChance = 25;
    int    ShortRangeMeleeAttackDesireDistance = 200;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if (Rand(100) < ShortRangeMeleeAttackDesireChance && myself.DistFromMe( h0.creature ) < ShortRangeMeleeAttackDesireDistance ) {
                   myself.AddAttackDesire( h0.creature, 1, 1000 );
                } else {             
if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
                }
            }
        }
    }

}

Я добавил дополнительную проверку в начале. Если прошел шанс и мы не слишком далеко, то инициируют прямую атаку. Если нет, то срабатывает стандартная логика(проверяется дистанция, выбирает скилл, проверяются его условия и запускается либо каст, либо обычная атака.

Т.е, если резюмировать изменения - моб после завершения каста, с шансом 25% может побежать в атаку, вместо повторного каста. При этом, это не затронет логику его ответки на атаки, на события атаки клана и группы. Т.е просто повторный каст может не начаться.
PS: Этот метод переопределяется в wizard_ddmagic2_heal_clan
Огромное спасибо за потраченное время на помощь.
Опробовал я класс, который вы скорректировали. Эффекта к сожалению не дало, маги на этом классе все равно имеют большое желание кастовать нон стоп дальним скиллом (магией).
 
Огромное спасибо за потраченное время на помощь.
Опробовал я класс, который вы скорректировали. Эффекта к сожалению не дало, маги на этом классе все равно имеют большое желание кастовать нон стоп дальним скиллом (магией).
А изменения точно применяются? Ну т.е я не на что не намекаю, но мб там скрипт забыли поменять?
Попробуйте добавить отладку и посмотреть, в каком месте он лезет у вас.
Добавьте вызовы Say("Try cast 1"); в ветвления основных методов. Пронумеруйте их и посмотрите, какой срабатывает. НПЦ будут писать в чат, поэтому имеет смысл заспавнить одного где-то в отдалении и тестировать его индивидуально.
Может быть там вообще из других хендлеров вызовы летят
Код:
class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;
    int    ShortRangeMeleeAttackDesireChance = 25;
    int    ShortRangeMeleeAttackDesireDistance = 200;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            myself.Say("Try Long Cast 1");
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                myself.Say("Try Long Cast 2");
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                           myself. Say("Try Short Cast 1");
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                myself.Say("Try Short Cast 2");
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    myself.Say("Try Long Cast 3");
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    myself.Say("Try Short Cast 3");
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if (Rand(100) < ShortRangeMeleeAttackDesireChance && myself.DistFromMe( h0.creature ) < ShortRangeMeleeAttackDesireDistance ) {
                   myself.AddAttackDesire( h0.creature, 1, 1000 );
                } else {            
if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        myself.Say("Try Long Cast 4");
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        myself.Say("Try Short Cast 4");
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
                }
            }
        }
    }

}

+ стоит все же наверное уточнить алгоритм тестирования. В каком случае:
маги на этом классе все равно имеют большое желание кастовать нон стоп дальним скиллом (магией).
Вы их бьете? Просто стоите на месте? Бьете кого-то другого? Вообщем больше информации нужно.
 
А изменения точно применяются? Ну т.е я не на что не намекаю, но мб там скрипт забыли поменять?
Попробуйте добавить отладку и посмотреть, в каком месте он лезет у вас.
Добавьте вызовы Say("Try cast 1"); в ветвления основных методов. Пронумеруйте их и посмотрите, какой срабатывает. НПЦ будут писать в чат, поэтому имеет смысл заспавнить одного где-то в отдалении и тестировать его индивидуально.
Может быть там вообще из других хендлеров вызовы летят
Код:
class wizard_ddmagic2 : wizard
{
parameter:
    int    W_ShortRangeDDMagic = 272629761;
    int    W_LongRangeDDMagic = 272039937;
    int    DDMagic1 = 262209537;
    int    DDMagic2 = 262209537;
    int    ShortRangeMeleeAttackDesireChance = 25;
    int    ShortRangeMeleeAttackDesireDistance = 200;

handler:
    EventHandler ATTACKED( attacker, damage, h0, i0, i1, f0 )
    {
        super;
        h0 = myself.GetMaxHateInfo( 0 );
        if ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) {
            if ( myself.i_ai0 == 0 ) {
                i0 = 0;
                if ( myself.IsNullHateInfo( h0 ) == 0 ) {
                    if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                        i0 = 1;
                    }
                }
                if ( i0 == 1 ) {
                    if ( h0.creature == attacker ) {
                        i0 = 1;
                    }
                }
                if ( myself.DistFromMe( attacker ) > 100 && Rand( 100 ) < 80 ) {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                            myself.Say("Try Long Cast 1");
                            if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                                myself.Say("Try Long Cast 2");
                                if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                } else {
                    if ( i0 == 1 ) {
                        if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                           myself. Say("Try Short Cast 1");
                            if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            } else {
                                myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                            }
                        } else {
                            myself.i_ai0 = 1;
                            myself.AddAttackDesire( attacker, 1, 1000 );
                        }
                    } else {
                        if ( Rand( 100 ) < 2 ) {
                            if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                                myself.Say("Try Short Cast 2");
                                if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                } else {
                                    myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                                }
                            } else {
                                myself.i_ai0 = 1;
                                myself.AddAttackDesire( attacker, 1, 1000 );
                            }
                        }
                    }
                }
            } else {
                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 ) );
                }
            }
        }
    }

    EventHandler CLAN_ATTACKED( attacker, damage, i6, h0 )
    {
        myself.RemoveAllHateInfoIF( 1, 0 );
        if ( ( myself.GetLifeTime( ) > 7 && ( ( attacker.is_pc != 0 ) || ( myself.IsInCategory( 12, attacker.npc_class_id ) ) ) ) && myself.GetHateInfoCount( ) == 0 ) {
            if ( myself.DistFromMe( attacker ) > 100 ) {
                if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                    myself.Say("Try Long Cast 3");
                    if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_LongRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            } else {
                if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                    myself.Say("Try Short Cast 3");
                    if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    } else {
                        myself.AddUseSkillDesire( attacker, W_ShortRangeDDMagic, 0, 1, 1000000 );
                    }
                } else {
                    myself.i_ai0 = 1;
                    myself.AddAttackDesire( attacker, 1, 1000 );
                }
            }
        }
        super;
    }

    EventHandler USE_SKILL_FINISHED( h0, i0 )
    {
        h0 = myself.GetMaxHateInfo( 0 );
        i0 = 0;
        if ( myself.IsNullHateInfo( h0 ) == 0 ) {
            if ( myself.IsNullCreature( h0.creature ) == 0 ) {
                i0 = 1;
            }
        }
        if ( i0 == 1 ) {
            if ( myself.i_ai0 != 1 ) {
                if (Rand(100) < ShortRangeMeleeAttackDesireChance && myself.DistFromMe( h0.creature ) < ShortRangeMeleeAttackDesireDistance ) {
                   myself.AddAttackDesire( h0.creature, 1, 1000 );
                } else {           
if ( myself.DistFromMe( h0.creature ) > 100 ) {
                    if ( myself.Skill_GetConsumeMP( W_LongRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_LongRangeDDMagic ) < myself.sm.hp ) {
                        myself.Say("Try Long Cast 4");
                        if ( myself.Skill_InReuseDelay( W_LongRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_LongRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                } else {
                    if ( myself.Skill_GetConsumeMP( W_ShortRangeDDMagic ) < myself.sm.mp && myself.Skill_GetConsumeHP( W_ShortRangeDDMagic ) < myself.sm.hp ) {
                        myself.Say("Try Short Cast 4");
                        if ( myself.Skill_InReuseDelay( W_ShortRangeDDMagic ) == 0 ) {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        } else {
                            myself.AddUseSkillDesire( h0.creature, W_ShortRangeDDMagic, 0, 1, 1000000 );
                        }
                    } else {
                        myself.i_ai0 = 1;
                        myself.AddAttackDesire( h0.creature, 1, 1000 );
                    }
                }
                }
            }
        }
    }

}

+ стоит все же наверное уточнить алгоритм тестирования. В каком случае:

Вы их бьете? Просто стоите на месте? Бьете кого-то другого? Вообщем больше информации нужно.
Уж класс в аи я заменить могу 😄
Спасибо за уточнение.
Пробовал тест луком. И в близь бить, и отбегать, и оттадаляться после тычки. Простестил разные варианты исхода событий.
Мобы использующие этот класс бесконечно хотят кастовать дальние скиллы.
 
Уж класс в аи я заменить могу 😄
Спасибо за уточнение.
Пробовал тест луком. И в близь бить, и отбегать, и оттадаляться после тычки. Простестил разные варианты исхода событий.
Мобы использующие этот класс бесконечно хотят кастовать дальние скиллы.
Ну как я написал выше - без более детальной информации дальше мы не продвинемся.
 
Уж класс в аи я заменить могу 😄
Спасибо за уточнение.
Пробовал тест луком. И в близь бить, и отбегать, и оттадаляться после тычки. Простестил разные варианты исхода событий.
Мобы использующие этот класс бесконечно хотят кастовать дальние скиллы.
Такое впечетление что у Вас, АИ для Ессенса/Классика/ГОД - который сейчас и должен именно так работать.
Я Вам уже ответил, попробуйте с чатом решить вопрос, на примере 1-го нпц, и дальше пойдет как нужно.
По мимо глобального АИ, так же и Уникальные смотрите, ну кастома точно нету?

Что за сборка/сурс?
П.с. а АИ точно пере собрались то верно?
 
Такое впечетление что у Вас, АИ для Ессенса/Классика/ГОД - который сейчас и должен именно так работать.
Я Вам уже ответил, попробуйте с чатом решить вопрос, на примере 1-го нпц, и дальше пойдет как нужно.
По мимо глобального АИ, так же и Уникальные смотрите, ну кастома точно нету?

Что за сборка/сурс?
П.с. а АИ точно пере собрались то верно?
Это точно не ГОД. Это ИЛ\ГФ. В ГОД структура наска чутка другая.
 
Так и я пишу про последний Патч в 2024, там же почти на всех версия - использование скилов в приоритете (потому как скилы жрут 0 мп, и в 90% не имеют КД, или у НПЦ описано минимум 2 (максимум 4 ) скила для атаки).
А в целом, мало что понятно из ситуации ТС, потому как не понятно "что руководит всем этим".
 
Так и я пишу про последний Патч в 2024, там же почти на всех версия - использование скилов в приоритете (потому как скилы жрут 0 мп, и в 90% не имеют КД, или у НПЦ описано минимум 2 (максимум 4 ) скила для атаки).
А в целом, мало что понятно из ситуации ТС, потому как не понятно "что руководит всем этим".
Вы видите, что индексы скиллов в наске в 32 битном инте(id * 65536 + level)?
[s_mega_storm_strike_magic_only1] = 272039937
В GOD все скиллы имеют 64 битный индекс. (id * 65536 + level) * 65536 + sub_level
[s_mega_storm_strike_magic_only1] = 17828409311232
 
Вы видите, что индексы скиллов в наске в 32 битном инте(id * 65536 + level)?
[s_mega_storm_strike_magic_only1] = 272039937
В GOD все скиллы имеют 64 битный индекс. (id * 65536 + level) * 65536 + sub_level
[s_mega_storm_strike_magic_only1] = 17828409311232
Я рассматриваю всегда вариант, когда взяли код - и начинают туда пихать свое (касомить) (т.е. пох какие там id).
И в ответ код - может и не работать как хотелось бы.

Дождемся ответа ТС, может больше инфы подкинет (или уже решил вопрос с Чатиком).
 
Ну как я написал выше - без более детальной информации дальше мы не продвинемся.
Извиняюсь за задержку в ответе. Был в не зоны доступа.
Тестирование проходит следующим образом, персонажем атакую мобов, и начинаю бежать условно говоря в угол, для того чтобы собрать пачку мобов, для фарма их дестром.
 
Назад
Сверху Снизу