Letstat Опубликовано 1 ноября, 2011 Поделиться Опубликовано 1 ноября, 2011 (изменено) Ревизия 24768 Локация Sel Mahum Training Grounds. Имена мобов Sell Mahum Drill Sergeant, Sell Mahum Recruit, Sell Mahum Soldier, Sell Mahum Training Officer. Собственно скрины мобов: http://clip2net.com/s/1hRCA http://clip2net.com/s/1hRDN http://clip2net.com/s/1hREm http://clip2net.com/s/1hREK Проблема в том, что при агре единичного моба из кучки, остальные остаются абсолютно спокойны, хотя должны быть социальны друг к другу, поэтому приходится агрить каждого моба в отдельности АОЕ скилами. Хотелось бы чтобы эту проблему решили. Если что то нужно добавить, пожалуйста отпишите. Спасибо. Показать контент Мобы которые стоят перед своими командирами, то есть кучками, не социальны, хотя в описании локации говорится что если потревожить хотя бы одного моба, сагрится кучка. http://forums.goha.ru/showthread.php?t=381567 Прошу отписать особенность ли это нашего сервера, либо недоработка? Спасибо. Изменено 5 ноября, 2011 пользователем Xandir 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Xandir Опубликовано 5 ноября, 2011 Поделиться Опубликовано 5 ноября, 2011 Перемещено. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Steelgar Опубликовано 7 ноября, 2011 Поделиться Опубликовано 7 ноября, 2011 (изменено) Радиус равен 1000, хотя прописано в статах мобов clan_help_range=300 Дело в том, что в ai мобов прописан такой механизм: 1. При атаке моба вызывается событие: myself->BroadcastScriptEvent(( 10016 + trainer_id ),gg->GetIndexFromCreature(attacker),trainning_range); В параметрах задается радиус его trainning_range, он задан вверху класса ai_xel_trainer_wiz и равен 1000. Тоже самое по ai_xel_trainer_war, ai_xel_trainer_sniper. 2. При получении такого события другими мобами, выполняется ряд действий: 2.1. С вероятностью 10% моб может сказать - либо "Who is mucking with my recruits!?!" либо "You are entering a world of hurt!" 2.2. Если этот моб не атакованный никем, тогда он бежит на того, кто вызвал это событие. Вот исходники: Показать контент /*************************************************************************** * Change Log * ------------------ * 07.11.2011 * Script Decompiled by SauDecompiler build 102306.2 * ***************************************************************************/ class ai_xel_trainer_wiz : warrior_basic { parameter: int trainer_id = 0; int trainning_range = 1000; int direction = 0; handler: EventHandler CREATED() { myself->AddTimerEx(2219001,1000); } EventHandler NO_DESIRE(i0) { myself.i_ai0 = 0; if( myself.i_ai5 == 1 ) { return; } if( gg->FloatToInt(myself.sm.x) == myself.start_x && myself.start_y == gg->FloatToInt(myself.sm.y) ) { myself->ChangeDir(myself.sm,0,direction); } else { myself->InstantTeleport(myself.sm,myself.start_x,myself.start_y,myself.start_z); } } EventHandler ATTACKED(attacker) { if( myself.i_ai0 == 0 ) { myself.c_ai0 = attacker; myself->BroadcastScriptEvent(( 10016 + trainer_id ),gg->GetIndexFromCreature(attacker),trainning_range); if( myself->IsNullCreature(myself.top_desire_target) == 0 ) { myself.i_ai0 = 1; myself.i_ai1 = 1; myself->AddTimerEx(2219002,( 60 * 1000 )); } } super; } EventHandler TIMER_FIRED_EX(timer_id) { if( timer_id == 2219002 ) { myself.i_ai1 = 0; } } EventHandler MY_DYING(last_attacker) { if( myself.i_ai1 == 1 ) { if( myself->IsNullCreature(myself.c_ai0) == 0 ) { myself->BroadcastScriptEvent(( 2219023 + trainer_id ),gg->GetIndexFromCreature(myself.c_ai0),trainning_range); } } myself.i_ai5 = 1; super; } EventHandler SCRIPT_EVENT(script_event_arg1,script_event_arg2,c0) { if( script_event_arg1 == ( 10016 + trainer_id ) ) { c0 = gg->GetCreatureFromIndex(script_event_arg2); if( myself->IsNullCreature(c0) == 0 ) { if( gg->Rand(10) < 1 ) { if( gg->Rand(2) < 1 ) { myself->Say(gg->MakeFString(1801112,"","","","","")); } else { myself->Say(gg->MakeFString(1801113,"","","","","")); } } if( myself.i_ai0 == 0 ) { myself->AddAttackDesire(c0,1,5000); } } } } } При чем, когда умирает лидер кучки, у всех мобов кучки начинается паника и все они начинают бежать к убийце их главаря. Это событие (2219023) описывается так: 1. При смерти лидера убираются все желания мобов атаковать 2. Добавляется огромное желание бежать на убийцу, при этом с вероятностью 25% моб кричит "They done killed da Sarge... Run!!" или "Don't Panic... Okay, Panic!" Вот исходник поведения простых мобов из кучки: Показать контент /*************************************************************************** *xel_recruit_warrior *xel_recruit_high_warrior *ai_xel_recruit_mage-xel_recruit_mage, xel_recruit_high_mage *ai_xel_recruit_sniper-xel_recruit_sniper,xel_recruit_high_sniper * Change Log * ------------------ * 07.11.2011 * Script Decompiled by SauDecompiler build 102306.2 * ***************************************************************************/ class ai_xel_recruit_warrior : ai_xel_recruit_war { parameter: int Skill01_Probablity = 100; int Skill02_Probablity = 100; handler: EventHandler CREATED() { if( gg->Rand(18) < 1 ) { myself.i_ai0 = 1; myself.i_quest0 = 1; myself->AddTimerEx(2019999,1000); } } EventHandler SCRIPT_EVENT(script_event_arg1,script_event_arg2,c0,i0,attacker) { if( script_event_arg1 == ( 10016 + trainer_id ) ) { c0 = gg->GetCreatureFromIndex(script_event_arg2); if( myself->IsNullCreature(c0) == 0 ) { if( myself.sm.alive == 0 ) { return; } myself->RemoveAllAttackDesire(); if( c0.is_pc != 0 || myself->IsInCategory(12,c0.npc_class_id) ) { myself->AddAttackDesire(c0,1,( 1 * 100 )); } myself->AddAttackDesire(c0,1,5000); } } if( script_event_arg1 == ( 2219023 + trainer_id ) ) { c0 = gg->GetCreatureFromIndex(script_event_arg2); if( myself->IsNullCreature(c0) == 0 ) { myself.i_ai6 = 1; myself->RemoveAllDesire(); myself->AddFleeDesire(c0,50000000); if( gg->Rand(4) < 1 ) { if( gg->Rand(2) < 1 ) { myself->Say(gg->MakeFString(1801114,"","","","","")); } else { myself->Say(gg->MakeFString(1801115,"","","","","")); } } myself.c_ai1 = c0; myself->AddTimerEx(2019777,10); myself->AddTimerEx(2019888,( 5 * 1000 )); } } if( script_event_arg2 == trainer_id && myself.i_ai6 == 0 ) { select(script_event_arg1) { case 2219011: if( myself.i_ai0 == 1 ) { } else { myself.i_ai2 = 70; myself.i_ai3 = 4; myself.i_ai4 = 2; myself->AddTimerEx(22201,100); } select(2219012) { case 2219012: if( myself.i_ai0 == 1 ) { } else { myself.i_ai2 = 130; myself.i_ai3 = 1; myself.i_ai4 = 2; myself->AddTimerEx(22201,100); } select(2219013) { case 2219013: if( myself.i_ai0 != 1 ) { myself.i_ai2 = 30; myself.i_ai3 = 5; myself.i_ai4 = 4; myself->AddTimerEx(22201,100); } else { myself.i_ai2 = 30; myself.i_ai3 = 6; myself.i_ai4 = 4; myself->AddTimerEx(22201,100); } break; case 2219014: if( myself.i_ai0 == 1 ) { } else { myself.i_ai2 = 30; myself.i_ai3 = 7; myself.i_ai4 = 2; myself->AddTimerEx(22201,100); } } } } EventHandler TIMER_FIRED_EX(timer_id) { if( timer_id == 2019999 ) { myself->AddTimerEx(2019999,5000); } if( timer_id == 2019888 ) { myself.i_ai6 = 0; } if( timer_id == 2019777 ) { myself->AddFleeDesire(myself.c_ai1,50000000); if( myself.i_ai6 == 1 ) { myself->AddTimerEx(2019777,1000); } } if( timer_id == 22201 ) { myself->AddEffectActionDesire(myself.sm,myself.i_ai3,( ( myself.i_ai2 * 1000 ) / 30 ),500); if( myself.i_ai4 != 0 ) { myself.i_ai4 = ( myself.i_ai4 - 1 ); myself->AddTimerEx(22201,( ( myself.i_ai2 * 1000 ) / 30 )); } } } } Вот еще часть ai от простых мобов, где видно что также вызывается событие 10016 при простой атаке (агр на членов группы): Показать контент /*************************************************************************** *ai_xel_trainer_war->ai_xel_trainer_warrior->xel_trainer_warrior *ai_xel_trainer_mage->xel_trainer_mage *ai_xel_trainer_sniper->xel_trainer_sniper * Change Log * ------------------ * 07.11.2011 * Script Decompiled by SauDecompiler build 102306.2 * ***************************************************************************/ class ai_xel_recruit_war : warrior_basic { parameter: int trainer_id = 0; int direction = 0; handler: EventHandler NO_DESIRE(i0) { if( myself.i_ai5 == 1 ) { return; } if( gg->FloatToInt(myself.sm.x) == myself.start_x && myself.start_y == gg->FloatToInt(myself.sm.y) ) { myself->ChangeDir(myself.sm,0,direction); } else if( myself.i_ai6 == 0 ) { myself->InstantTeleport(myself.sm,myself.start_x,myself.start_y,myself.start_z); } } EventHandler ATTACKED(attacker) { if( myself.i_ai6 == 1 ) { return; } myself->BroadcastScriptEvent(( 10016 + trainer_id ),gg->GetIndexFromCreature(attacker),1000); super; } EventHandler CLAN_ATTACKED(attacker) { if( myself.i_ai6 == 1 ) { return; } super; } EventHandler MY_DYING(last_attacker) { myself.i_ai5 = 1; super; } } Изменено 7 ноября, 2011 пользователем Steelgar 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Sys Опубликовано 28 ноября, 2011 Поделиться Опубликовано 28 ноября, 2011 Сделал мобов, стоящих строем социальными в r24875. По остальным элементам АИ позже. 0 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.