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 Цитата Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.