LoA и 3 РБ

5 штук вроде как.
 

1
 
4 штуки их, бегают по 4 разным маршрутам
Код:
class ai_guardian_manager : default_npc
{
parameter:
    int    Max_Spawn_Roaming = 3;
    int    Spawn_Interval = 1800;
    int    Course1_Check_Timer = 7734;
    int    Course2_Check_Timer = 7735;
    int    Course3_Check_Timer = 7736;
    int    Course4_Check_Timer = 7737;
    int    SuperPointMethod = 0;
    int    SuperPointDesire = 2000;
    int    SpawnPosX_1_1 = 140641;
    int    SpawnPosY_1_1 = 114525;
    int    SpawnPosZ_1_1 = -3752;
    int    SpawnPosX_2_1 = 143789;
    int    SpawnPosY_2_1 = 110205;
    int    SpawnPosZ_2_1 = -3968;
    int    SpawnPosX_3_1 = 146466;
    int    SpawnPosY_3_1 = 109789;
    int    SpawnPosZ_3_1 = -3440;
    int    SpawnPosX_4_1 = 145482;
    int    SpawnPosY_4_1 = 120250;
    int    SpawnPosZ_4_1 = -3944;

handler:
    EventHandler DEBUG_AI(creature, reply)
    {
        if( reply == 1 )
        {
            myself::Whisper(creature, "Course1 Roam Number : " + myself.i_ai0 + " ");
            if( myself.i_ai0 <= Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_1_1, SpawnPosY_1_1, SpawnPosZ_1_1, 0, 1, 0, 0);
                myself.i_ai0 = myself.i_ai0 + 1;
            }
            else
            {
                myself::Whisper(creature, "Course1 Roam Number Max");
            }
        }
        else if( reply == 2 )
        {
            myself::Whisper(creature, "Course2 Roam Number : " + myself.i_ai1 + " ");
            if( myself.i_ai1 <= Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_2_1, SpawnPosY_2_1, SpawnPosZ_2_1, 0, 2, 0, 0);
                myself.i_ai1 = myself.i_ai1 + 1;
            }
            else
            {
                myself::Whisper(creature, "Course2 Roam Number Max");
            }
        }
        else if( reply == 3 )
        {
            myself::Whisper(creature, "Course3 Roam Number : " + myself.i_ai2 + " ");
            if( myself.i_ai2 <= Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_3_1, SpawnPosY_3_1, SpawnPosZ_3_1, 0, 3, 0, 0);
                myself.i_ai2 = myself.i_ai2 + 1;
            }
            else
            {
                myself::Whisper(creature, "Course3 Roam Number Max");
            }
        }
        else if( reply == 4 )
        {
            myself::Whisper(creature, "Course4 Roam Number : " + myself.i_ai3 + " ");
            if( myself.i_ai3 <= Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_4_1, SpawnPosY_4_1, SpawnPosZ_4_1, 0, 4, 0, 0);
                myself.i_ai3 = myself.i_ai3 + 1;
            }
            else
            {
                myself::Whisper(creature, "Course4 Roam Number Max");
            }
        }
    }

    EventHandler CREATED()
    {
        myself::AddTimerEx(Course1_Check_Timer, gg::Rand(10000));
        myself::AddTimerEx(Course2_Check_Timer, gg::Rand(10000));
        myself::AddTimerEx(Course3_Check_Timer, gg::Rand(10000));
        myself::AddTimerEx(Course4_Check_Timer, gg::Rand(10000));
        myself.i_ai0 = 0;
        myself.i_ai1 = 0;
        myself.i_ai2 = 0;
        myself.i_ai3 = 0;
        myself.i_ai4 = 0;
    }

    EventHandler TIMER_FIRED_EX(timer_id)
    {
        if( timer_id == Course1_Check_Timer )
        {
            if( myself.i_ai0 < Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_1_1, SpawnPosY_1_1, SpawnPosZ_1_1, 0, 1, 0, 0);
                myself.i_ai0 = myself.i_ai0 + 1;
            }
            myself::AddTimerEx(Course1_Check_Timer, Spawn_Interval * 1000);
        }
        else if( timer_id == Course2_Check_Timer )
        {
            if( myself.i_ai1 < Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_2_1, SpawnPosY_2_1, SpawnPosZ_2_1, 0, 2, 0, 0);
                myself.i_ai1 = myself.i_ai1 + 1;
            }
            myself::AddTimerEx(Course2_Check_Timer, Spawn_Interval * 1000);
        }
        else if( timer_id == Course3_Check_Timer )
        {
            if( myself.i_ai2 < Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_3_1, SpawnPosY_3_1, SpawnPosZ_3_1, 0, 3, 0, 0);
                myself.i_ai2 = myself.i_ai2 + 1;
            }
            myself::AddTimerEx(Course3_Check_Timer, Spawn_Interval * 1000);
        }
        else if( timer_id == Course4_Check_Timer )
        {
            if( myself.i_ai3 < Max_Spawn_Roaming )
            {
                myself::CreateOnePrivateEx(1022857, "guardian_of_antaras", 0, 0, SpawnPosX_4_1, SpawnPosY_4_1, SpawnPosZ_4_1, 0, 4, 0, 0);
                myself.i_ai3 = myself.i_ai3 + 1;
            }
            myself::AddTimerEx(Course4_Check_Timer, Spawn_Interval * 1000);
        }
    }

    EventHandler SCRIPT_EVENT(script_event_arg1, script_event_arg2)
    {
        if( script_event_arg1 == 20100501 )
        {
            if( script_event_arg2 == 1 )
            {
                if( myself.i_ai0 > 0 )
                {
                    myself.i_ai0 = myself.i_ai0 - 1;
                }
            }
            else if( script_event_arg2 == 2 )
            {
                if( myself.i_ai1 > 0 )
                {
                    myself.i_ai1 = myself.i_ai1 - 1;
                }
            }
            else if( script_event_arg2 == 3 )
            {
                if( myself.i_ai2 > 0 )
                {
                    myself.i_ai2 = myself.i_ai2 - 1;
                }
            }
            else if( script_event_arg2 == 4 )
            {
                if( myself.i_ai3 > 0 )
                {
                    myself.i_ai3 = myself.i_ai3 - 1;
                }
            }
        }
        super;
    }

}
Код:
class ai_guardian_of_antaras : warrior_basic
{
parameter:
	string	SuperPointName1 = "24_21_course1";
	string	SuperPointName2 = "24_21_course2";
	string	SuperPointName3 = "24_21_course3";
	string	SuperPointName4 = "24_21_course4";
	int	SuperPointDesire = 10;
	int	SuperPointMethod1 = 0;
	int	SuperPointMethod2 = 1;
	int	SuperPointMethod3 = 2;
	int	SuperPointMethod4 = 3;
	int	ACTIVATION_TIMER = 2010;
	int	ACTIVATION_INTERVAL_1 = 60;
	int	ACTIVATION_INTERVAL_2 = 60;
	int	ACTIVATION_INTERVAL_3 = 60;
	int	ACTIVATION_INTERVAL_4 = 60;
	int	Skill01_ID = 442171393;
	int	Skill01_Target = 0;
	int	Skill01_Probablity = 333;
	int	Skill02_ID = 441974785;
	int	Skill02_Target = 0;
	int	Skill01_Probablity = 333;
	int	Skill03_ID = 458752001;
	int	SpecialSkill01_ID = 441909249;
	int	max_desire = 10000000;
	int	isChasePC = 3000;

handler:
	EventHandler CREATED(i0)
	{
		myself::SetVisible(0);
		myself::AddTimerEx(1001, 60 * 1000);
		myself.i_ai2 = 0;
		myself.i_ai1 = 0;
		myself.i_ai0 = myself.sm.param1;
		myself.i_ai4 = gg::FloatToInt(myself.sm.x);
		myself.i_ai5 = gg::FloatToInt(myself.sm.y);
		myself.i_ai6 = gg::FloatToInt(myself.sm.z);
		if( myself.i_ai0 == 1 )
		{
			if( myself::IsNullString(SuperPointName1) != 1 )
			{
				myself.i_ai3 = gg::Rand(28) + 1;
				myself::AddMoveSuperPointDesire(SuperPointName1, SuperPointMethod1, SuperPointDesire);
			}
		}
		else if( myself.i_ai0 == 2 )
		{
			if( myself::IsNullString(SuperPointName2) != 1 )
			{
				myself.i_ai3 = gg::Rand(26) + 1;
				myself::AddMoveSuperPointDesire(SuperPointName2, SuperPointMethod1, SuperPointDesire);
			}
		}
		else if( myself.i_ai0 == 3 )
		{
			if( myself::IsNullString(SuperPointName3) != 1 )
			{
				myself.i_ai3 = gg::Rand(26) + 1;
				myself::AddMoveSuperPointDesire(SuperPointName3, SuperPointMethod1, SuperPointDesire);
			}
		}
		else if( myself.i_ai0 == 4 )
		{
			if( myself::IsNullString(SuperPointName4) != 1 )
			{
				myself.i_ai3 = gg::Rand(16) + 1;
				myself::AddMoveSuperPointDesire(SuperPointName4, SuperPointMethod1, SuperPointDesire);
			}
		}
		super;
	}

	EventHandler TIMER_FIRED_EX(timer_id, c0)
	{
		if( timer_id == 1001 )
		{
			if( myself::IsNullCreature(myself.top_desire_target) == 1 && myself.i_ai1 == 1 )
			{
				if( myself.i_ai4 == gg::FloatToInt(myself.sm.x) && myself.i_ai5 == gg::FloatToInt(myself.sm.y) && myself.i_ai6 == gg::FloatToInt(myself.sm.z) )
				{
					gg::SendScriptEvent(myself.boss, 20100501, myself.i_ai0);
				}
			}
			myself::AddTimerEx(1001, 60 * 1000);
			myself.i_ai4 = gg::FloatToInt(myself.sm.x);
			myself.i_ai5 = gg::FloatToInt(myself.sm.y);
			myself.i_ai6 = gg::FloatToInt(myself.sm.z);
		}
	}

	EventHandler ABNORMAL_STATUS_CHANGED(speller, skill_id, skill_level, skill_name_id, s0, i0)
	{
		if( skill_level > 0 )
		{
			if( myself::Skill_GetAbnormalType(6029313) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(6029313)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(6029313));
			}
			else if( myself::Skill_GetAbnormalType(91357185) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(91357185)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(91357185));
			}
			else if( myself::Skill_GetAbnormalType(18284545) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(18284545)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(18284545));
			}
			else if( myself::Skill_GetAbnormalType(24051713) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(24051713)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(24051713));
			}
			else if( myself::Skill_GetAbnormalType(76611585) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(76611585)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(76611585));
			}
			else if( myself::Skill_GetAbnormalType(78708737) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(78708737)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(78708737));
			}
			else if( myself::Skill_GetAbnormalType(26411009) == myself::Skill_GetAbnormalType(skill_name_id) && gg::GetAbnormalLevel(myself.sm, myself::Skill_GetAbnormalType(26411009)) > 0 )
			{
				myself::Dispel(myself.sm, myself::Skill_GetAbnormalType(26411009));
			}
		}
	}

	EventHandler ATTACKED(attacker, party0, damage, i10, skill_name_id, i0, i1, i2, i3, i4, i5)
	{
		if( myself::DistFromMe(attacker) > 250 )
		{
			if( myself::IsInCategory(70, attacker.occupation) == 1 || myself::IsInCategory(2, attacker.occupation) == 1 )
			{
				if( gg::Rand(100) < 10 )
				{
					myself::AddUseSkillDesire(attacker, SpecialSkill01_ID, 0, 1, max_desire * max_desire);
				}
				if( gg::Rand(100) < 5 )
				{
					myself::CreateOnePrivateEx(1018967, "guardian_helper", 0, 0, gg::FloatToInt(myself.sm.x), gg::FloatToInt(myself.sm.y), gg::FloatToInt(myself.sm.z), 0, 1, 0, 0);
					myself::CreateOnePrivateEx(1018967, "guardian_helper", 0, 0, gg::FloatToInt(myself.sm.x), gg::FloatToInt(myself.sm.y), gg::FloatToInt(myself.sm.z), 0, 2, 0, 0);
				}
			}
		}
		super;
	}

	EventHandler SEE_CREATURE(creature, i0, f0, c0)
	{
		if( myself.i_ai2 == 0 )
		{
		}
		else
		{
			myself.i_ai1 = 1;
			myself::AddAttackDesire(creature, 1, 100);
		}
		super;
	}

	EventHandler NODE_ARRIVED(script_event_arg1, script_event_arg2, script_event_arg3, state, success)
	{
		if( myself.i_ai0 == 1 )
		{
			if( myself::IsNullString(SuperPointName1) != 1 )
			{
				if( script_event_arg1 == myself.i_ai3 && myself.i_ai2 < 1 )
				{
					myself::SetVisible(1);
					myself.i_ai2 = 1;
					myself::ShoutFStr(1811137, "", "", "", "", "");
				}
			}
		}
		else if( myself.i_ai0 == 2 )
		{
			if( myself::IsNullString(SuperPointName2) != 1 )
			{
				if( script_event_arg1 == myself.i_ai3 && myself.i_ai2 < 1 )
				{
					myself::SetVisible(1);
					myself.i_ai2 = 1;
					myself::ShoutFStr(1811137, "", "", "", "", "");
				}
			}
		}
		else if( myself.i_ai0 == 3 )
		{
			if( myself::IsNullString(SuperPointName3) != 1 )
			{
				if( script_event_arg1 == myself.i_ai3 && myself.i_ai2 < 1 )
				{
					myself::SetVisible(1);
					myself.i_ai2 = 1;
					myself::ShoutFStr(1811137, "", "", "", "", "");
				}
			}
		}
		else if( myself.i_ai0 == 4 )
		{
			if( myself::IsNullString(SuperPointName4) != 1 )
			{
				if( script_event_arg1 == myself.i_ai3 && myself.i_ai2 < 1 )
				{
					myself::SetVisible(1);
					myself.i_ai2 = 1;
					myself::ShoutFStr(1811137, "", "", "", "", "");
				}
			}
		}
	}

	EventHandler MY_DYING()
	{
		gg::SendScriptEvent(myself.boss, 20100501, myself.i_ai0);
		super;
	}

}
 
  • Мне нравится
Реакции: kick
У меня почему-то по 3 штуки бегает, странно...
 
хотя да вру, по 3 на маршрут - Max_Spawn_Roaming в спавнере.
спавнер спавнит кнориксов пока счетчик не достигнет Max_Spawn_Roaming
при смерти кнорикса же идет отправка эвента спавнеру, делающего этому счетчику -1 и при следующем срабатывании таймера на маршруте спавнится новый кнорикс.
 
Я кстати не стал у себя изощрятся с какими-то отдельными спавнерами и броадкастом эвентов при смерти.
У меня тупо спавнится сразу по 3 кнорикса на маршрут, а чтобы они не бегали "паравозиком" - спавнятся они не в первой точке маршрута, а в случайно выбранной - каждый кнорикс в своей.
Хотя конечно такое на птс вряд ли сделаешь, разве что есть в аи возможность выбирать рандомную точку заданного маршрута.
 
Я на руоффе кадмусе фармил их по КД весь ХФ. Они там точно по одному бегали. Интересно, с каких пор они по три начали бегать?

И вопрос о Рыцарях Смерти у трех РБ остается открытым, были ли они на ХФ или нет?
 
Инфа с корейского офа:
...Кроме них в этой локации можно встретить Knorix, Patrolmen of the Earth Dragon, которые патрулируют всю территорию локации. По сравнению с другими монстрами эти мобы имеют повышенные статы. Имеют высокий радиус агрессии и при встрече с пати игроков тут же их атакует. Игрокам рекомендуется следить за тем как они патрулируют и по возможности их не атаковать держа на себе других мобов. Иногда Knorix ходят группами по 2-3. Периодически они используют дебаффы понижающие скорость каста на 90% и скорость атаки на 30%, которые нельзя снять.


У нас работает теперь. Всего их 12, респ зависит от 3х РБ как я понял. Когда есть все РБ их 12 бегает. Видел и по двое бегают рядом на маршруте, по трое не встретил ни разу. На гохе была инфа с корейского офа ХФ, поэтому думаю этой инфы и нужно и можно придерживаться. Значит по 3 на маршрут, 4 пака, итого 12 штук.

Patrolmen of the Earth Dragon это кто такое?
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
К слову о этих гадах - npc_begin warrior 22857 [guardian_of_antaras], он же Konoriks. А точнее о его (или не его) скиле - skill id="6743" level="1"/><!-- Dark Wind\Рана Тьмы. Вот тут его вроде как бы и нет
skill_list={
@s_npc_prop_race_humanoid; skill_id = 4416 level = 6
@s_npc_prop_attribute_unholy1; skill_id = 5467 level = 1
@s_npc_prop_hp_lv_p0; skill_id = 4408 level = 1
@s_npc_prop_mp_lv_p0; skill_id = 4409 level = 1
@s_npc_prop_pa_lv_p6; skill_id = 4410 level = 17
@s_npc_prop_ma_lv_p2; skill_id = 4411 level = 13
@s_npc_prop_pd_lv_p4; skill_id = 4412 level = 15
@s_npc_prop_md_lv_n6; skill_id = 4413 level = 5
@s_npc_prop_armor_type_n; skill_id = 4414 level = 2
@s_npc_prop_weapon_type_sword; skill_id = 4415 level = 3
@s_full_magic_defence; skill_id = 4045 level = 1
@s_npc_resist_ston12} skill_id = 5598 level = 12
А если верить этим "товарищам" - l2db.info, , он как бы и есть... Кому\чему верить? Или он прописан ещё в каком файле, а не только в npcdata.txt?
 
Последнее редактирование:
К слову о этих гадах - npc_begin warrior 22857 [guardian_of_antaras], он же Konoriks. А точнее о его (или не его) скиле - skill id="6743" level="1"/><!-- Dark Wind\Рана Тьмы. Вот тут его вроде как бы и нет
skill_list={
@s_npc_prop_race_humanoid; skill_id = 4416 level = 6
@s_npc_prop_attribute_unholy1; skill_id = 5467 level = 1
@s_npc_prop_hp_lv_p0; skill_id = 4408 level = 1
@s_npc_prop_mp_lv_p0; skill_id = 4409 level = 1
@s_npc_prop_pa_lv_p6; skill_id = 4410 level = 17
@s_npc_prop_ma_lv_p2; skill_id = 4411 level = 13
@s_npc_prop_pd_lv_p4; skill_id = 4412 level = 15
@s_npc_prop_md_lv_n6; skill_id = 4413 level = 5
@s_npc_prop_armor_type_n; skill_id = 4414 level = 2
@s_npc_prop_weapon_type_sword; skill_id = 4415 level = 3
@s_full_magic_defence; skill_id = 4045 level = 1
@s_npc_resist_ston12} skill_id = 5598 level = 12
А если верить этим "товарищам" - l2db.info, , он как бы и есть... Кому\чему верить? Или он прописан ещё в каком фале, а не только в npcdata.txt?

В скриптах не смотрели...
f9ed51077acc9dd2f5c47f92fce.png

441909249 = skillId: 6743, level: 1
 
Последнее редактирование модератором:
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Да причем скрипты... Этот скилл присутствует в сборке, но должен ли? Под спойлером кусок из npcdata.txt птс скриптов (скачаных с форума)
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Поиском по файлам нарыл его в skill_pch.txt. Так же есть упоминание в skill_pch2.txt. Но где он привязан к конориксу ? )) Попробую ещё, канешн, порыть, но мб кто знает ? ))
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
А можно для тех кто в танке, т.е. мне, показать где тут - 441909249 = skillId: 6743, level: 1 указано, что этот скилл использует конорикс ). Ну или каким иным образом указано, что он использует этот скилл... )
 
А можно для тех кто в танке, т.е. мне, показать где тут - 441909249 = skillId: 6743, level: 1 указано, что этот скилл использует конорикс ). Ну или каким иным образом указано, что он использует этот скилл... )
Берем в руки ai.obj и смотрим в нем это указано, вам дали информацию и сказали смотреть в офф скриптах.
 
А можно для тех кто в танке, т.е. мне, показать где тут - 441909249 = skillId: 6743, level: 1 указано, что этот скилл использует конорикс ). Ну или каким иным образом указано, что он использует этот скилл... )
npc_ai={[guardian_of_antaras]}
guardian_of_antaras -> ai_guardian_of_antaras
kS8nIz3Ad.png

e76495d3-aac1-4beb-9050-664766ea3c1b
 
Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Назад
Сверху Снизу