Баффер через Ai.obj
Привет всем!
Ситуация следующая:
Хочу сделать себе баффера. Поковырялся в АИ.ОБЖ и нарвался на идентификатор скилла в странном виде для меня:
myself->AddUseSkillDesire(talker,1106433,1,0,1000000);
Я конечно понимаю, что это нормальный номер скилла для аи......но где я могу узнать какой это скилл?
То есть, как можно преобразовать это число, чтоб получить нормальный ID или вообще нужно ли это, или где можно посмотреть, какой скилл соответствует хотябы данному номеру...
Заранее спасибо.
я так понел тебе нужен ID скила ?
вот что я нашол
[s_wind_walk_for_newbie] = 1106433 я точно незнаю это или нет
MYSOR007: я так понел тебе нужен ID скила ?
вот что я нашол
[s_wind_walk_for_newbie] = 1106433 я точно незнаю это или нет
Спасибо....понял...посмотреть можно в файле skill_pch.txt.
Тему можно закрыть.
MYSOR007: у меня пов и вика бафаются нормально а вот дансы и сонги 3 проф не бафает а если себе прописать то всё норм
а в AI я незнаю как закодировать обратно (
Завтра добавлю сонги и дансы 3 проф в аи и попробую. Как сделаю сразу отпишу в этой теме.
Закодировать аи мона этой прогой....
Скачать
Тоже не кидает ни дансы ни сонги.....Проблема я так понимаю скрыта в файле skilldata.txt:
skill_begin skill_name=[s_dance_of_warrior] /* [댄스 오브 워리어] */ skill_id=271 level=1 operate_type=A2 magic_level=55 effect={{p_physical_attack;{all};12;per}} operate_cond={{equip_weapon;{dual}}} is_magic=0 mp_consume2=60 cast_range=-1 effective_range=-1 skill_hit_time=2.5 skill_cool_time=0 skill_hit_cancel_time=0.5 reuse_delay=10 activate_rate=-1 lv_bonus_rate=0 basic_property=none abnormal_time=120 abnormal_lv=1 abnormal_type=dance_of_warrior attribute=attr_none effect_point=523 target_type=self affect_scope=party affect_range=1000 affect_object=friend affect_limit={0;0} next_action=none debuff=0 ride_state={@ride_none} skill_end
И в файле npcdata.txt:
npc_begin citizen 31756 [test_server_helper] level=70 acquire_exp_rate=0 acquire_sp=0 unsowing=1 clan={} ignore_clan_list={} clan_help_range=300 slot_chest=[] slot_rhand=[] slot_lhand=[] shield_defense_rate=0 shield_defense=0 skill_list={@s_race_animals;@s_full_magic_defence} npc_ai={[test_server_helper];{[fnHi]=[test_server_helper001.htm]};{[fnSell]=[tes
t_server_helper002.htm]};{[fnBuy]=[test_server_helper003.htm]};{[fnUnableItemSel
l
]=[test_server_helper005.htm]};{[MoveAroundSocial]=0};{[MoveAroundSocial1]=0};{[
M
oveAroundSocial2]=0};{[type]=0}} category={} race=animal sex=male undying=1 can_be_attacked=0 corpse_time=7 no_sleep_mode=0 agro_range=0 ground_high={118.8;0;0} ground_low={79.2;0;0} exp=429634528 org_hp=2444 org_hp_regen=11.85 org_mp=1493 org_mp_regen=2.78 collision_radius={9;9} collision_height={16;16} str=40 int=21 dex=30 wit=40 con=43 men=10 base_attack_type=first base_attack_range=40 base_damage_range={0;0;80;120} base_rand_dam=7 base_physical_attack=683.28 base_critical=8 physical_hit_modify=0 base_attack_speed=247.42 base_reuse_delay=0 base_magic_attack=468 base_defend=296.1 base_magic_defend=206.28 physical_avoid_modify=0 soulshot_count=0 spiritshot_count=0 hit_time_factor=0.61 item_make_list={} corpse_make_list={} additional_make_list={} additional_make_multi_list={} hp_increase=0 mp_increase=0 safe_height=100 npc_end
Но это только предположение, времени проверить небыло...
Для начало нужно переделать скиллы дэнс\сонг.
По дефолту они кастуются "на себя " и только "в пати".
Пример скилла который кастуется на окружающих:
На этом примере нужно сделать все нужные денс\сонг скиллы, добавить их в skill_pch и зарядить в АИ
По идее, если кусок АИ правильный, всё получиться.
— 127.0.0.1 hacker!!1
marsh12: Для начало нужно переделать скиллы дэнс\сонг.
По дефолту они кастуются "на себя " и только "в пати".
Пример скилла который кастуется на окружающих:Кодskill_begin skill_name = [s_dance_of_warrior2] /* [m1nd] */ skill_id = 271 level = 2 operate_type = A2 magic_level = 40 effect = {{p_physical_attack;{all};12;per}} is_magic = 1 mp_consume1 = 7 mp_consume2 = 28 cast_range = 400 effective_range = 900 skill_hit_time = 1 skill_cool_time = 0 skill_hit_cancel_time = 0.5 reuse_delay = 0 activate_rate = -1 lv_bonus_rate = 0 basic_property = none abnormal_time = 3600 abnormal_lv = 1 abnormal_type = dance_of_warrior attribute = attr_none effect_point = 379 target_type = target affect_scope = single affect_limit = {0;0} next_action = none debuff = 0 ride_state = {@ride_none;@ride_wind;@ride_star;@ride_twilight} skill_end
На этом примере нужно сделать все нужные денс\сонг скиллы, добавить их в skill_pch и зарядить в АИ
По идее, если кусок АИ правильный, всё получиться.
а вот такой вопрос как зарядить в АI ? можеш дать пример ?
MYSOR007: а вот такой вопрос как зарядить в АI ? можеш дать пример ?
Дэкомпиль newbie_guide и тащи пример аи.
— 127.0.0.1 hacker!!1
marsh12: Дэкомпиль newbie_guide и тащи пример аи.
вот млин еслибы я знал что такое newbie_guide ((((
народ а ктонить может выложить готовый ? AI бафеоа ?
Класс newbie_guide - та часть кода файла Ai.obj, которая отвечает за все действия, выполняемые НПСом Newbie Guide, в игре.
Вот декомпелированный класс newbie_guide:
{
parameter:
string fnHi = "";
string fnHighLevel = "";
string fnRaceMisMatch = "";
string fnGuideF05 = "";
string fnGuideF10 = "";
string fnGuideF15 = "";
string fnGuideF20 = "";
string fnGuideM07 = "";
string fnGuideM14 = "";
string fnGuideM20 = "";
string ShopName = "";
property:
TelPosList NewbieTokenTeleports = {{"Dark Elf Village"; 9716; 15502; -4500; 0; 0 };{"Dwarven Village"; 115120; -178112; -916; 0; 0 };{"Talking Island Village"; -84141; 244623; -3729; 0; 0 };{"Elven Village";46890; 51531; -2976; 0; 0 };{"Orc Village - Newbie Travel Token"; -45186; -112459; -236; 0; 0 }};
handler:
EventHandler //(talker)
{
if( talker.level > 20 )
{
myself->ShowPage(talker,fnHighLevel);
return;
}
myself->Teleport(talker,NewbieTokenTeleports,ShopName, "", "", "",8542, "Newbie Travel Token");
}
EventHandler TALKED(talker)
{
myself->DeleteRadar(talker,-71073,258711,-3099,2);
myself->DeleteRadar(talker,-84081,243277,-3723,2);
myself->DeleteRadar(talker,45492,48359,-3060,2);
myself->DeleteRadar(talker,12111,16686,-4582,2);
myself->DeleteRadar(talker,-45042,-113598,-192,2);
myself->DeleteRadar(talker,115632,-177996,-905,2);
myself->ShowPage(talker,fnHi);
}
EventHandler MENU_SELECTED(talker,ask,reply)
{
if( ask == -7 && reply == 1 )
{
if( talker.race != myself.sm.race )
{
myself->ShowPage(talker,fnRaceMisMatch);
}
else if( talker.level > 20 || myself->IsInCategory(5,talker.occupation) == 0 )
{
myself->ShowPage(talker,fnHighLevel);
}
else if( myself->IsInCategory(0,talker.occupation) )
{
if( talker.level <= 5 )
{
myself->ShowPage(talker,fnGuideF05);
}
else if( talker.level <= 10 )
{
myself->ShowPage(talker,fnGuideF10);
}
else if( talker.level <= 15 )
{
myself->ShowPage(talker,fnGuideF15);
}
else
{
myself->ShowPage(talker,fnGuideF20);
}
}
else if( talker.level <= 7 )
{
myself->ShowPage(talker,fnGuideM07);
}
else if( talker.level <= 14 )
{
myself->ShowPage(talker,fnGuideM14);
}
else
{
myself->ShowPage(talker,fnGuideM20);
}
}
if( ask == -7 && reply == 2 )
{
if( myself->IsNewbie(talker) && myself->IsInCategory(7,talker.occupation) == 0 )
{
if( talker.level < 8 )
{
myself->ShowPage(talker,"guide_for_newbie002.htm");
}
else if( myself->IsInCategory(0,talker.occupation) )
{
if( talker.level >= 8 && talker.level <= 24 )
{
myself->AddUseSkillDesire(talker,1106433,1,0,1000000);
}
if( talker.level >= 11 && talker.level <= 23 )
{
myself->AddUseSkillDesire(talker,1106689,1,0,1000000);
}
if( talker.level >= 12 && talker.level <= 22 )
{
myself->AddUseSkillDesire(talker,1106945,1,0,1000000);
}
if( talker.level >= 13 && talker.level <= 21 )
{
myself->AddUseSkillDesire(talker,1107201,1,0,1000000);
}
if( talker.level >= 14 && talker.level <= 20 )
{
myself->AddUseSkillDesire(talker,1107457,1,0,1000000);
}
if( talker.level >= 15 && talker.level <= 19 )
{
myself->AddUseSkillDesire(talker,1107713,1,0,1000000);
}
if( talker.level >= 16 && talker.level <= 19 )
{
myself->AddUseSkillDesire(talker,1110529,1,0,1000000);
}
}
else if( talker.level >= 8 && talker.level <= 24 )
{
myself->AddUseSkillDesire(talker,1106433,1,0,1000000);
}
if( talker.level >= 11 && talker.level <= 23 )
{
myself->AddUseSkillDesire(talker,1106689,1,0,1000000);
}
if( talker.level >= 12 && talker.level <= 22 )
{
myself->AddUseSkillDesire(talker,1107969,1,0,1000000);
}
if( talker.level >= 13 && talker.level <= 21 )
{
myself->AddUseSkillDesire(talker,1108225,1,0,1000000);
}
if( talker.level >= 14 && talker.level <= 20 )
{
myself->AddUseSkillDesire(talker,1108481,1,0,1000000);
}
if( talker.level >= 15 && talker.level <= 19 )
{
myself->AddUseSkillDesire(talker,1108737,1,0,1000000);
}
if( talker.level >= 16 && talker.level <= 19 )
{
myself->AddUseSkillDesire(talker,1110529,1,0,1000000);
}
}
else
{
myself->ShowPage(talker,"guide_for_newbie003.htm");
}
}
if( ask == -7 && reply == 3 )
{
if( myself->IsNewbie(talker) && talker.level < 40 )
{
myself->AddUseSkillDesire(talker,1326593,1,0,1000000);
}
else
{
myself->ShowPage(talker,fnHighLevel);
}
}
}
}
Если имееш хоть малейшее понимание программирования.......думаю разберешся.
Ребята, вы смешные)
Всё до жути просто реализуется...а вы делаете хз что.
Шаг 1
Skilldata.txt
1)Не ленимся и делаем клоны всех бафов которые вы будите засовывать.(на новые ID)
2)Не забываем в клонах наших скилов убирать условия - типо требование спирит оре,дуалов для дансов итд
(т.е. наши скилы кастить можно без всего с любых пух)
3)Меняем настройки скила на следующие: target_type=target affect_scope=single affect_limit={0;0} - наш скил будет каститься как любой обычный баф ПП - пати требоваться не будет, на пати чела баф не распостраниться.
Шаг 2
Skillpch.txt
Генерируем прогой, запоминаем номера
Шаг 3
Html
В нашей Html-ке вывов бафа будет выглядеть так:
<a action="bypass -h menu_select?ask=-201&reply=12888834">Wind Walk</a>
Главное не ошибитесь в числе после reply - это должен быть номер вашего бафа в Pch , "Wind Walk" это надпись на которую игрок будет тыкать
AI.obj
Тут вместо того чтобы ломать голову пишем простейший хендлер
{
parameter:
string fnHi = "buff.htm";
string fnNotEnoughAdena = "nobuff.htm";
int ItemBuff = 57;
int Amount = 0;
EventHandler MENU_SELECTED(talker,ask,reply)
{
if( ask == -201 && myself->OwnItemCount(talker,ItemBuff) >= Amount )
{
myself->DeleteItem1(talker,ItemBuff,Amount);
myself->AddUseSkillDesire(talker,reply,1,0,1000000);
myself->ShowPage(talker,fnHi);
}
else
{
myself->ShowPage(talker,fnNotEnoughAdena);
}
}
По данному AI бафер будет бафать ВСЕ бафы линейки, если конечно они были написаны по правилам указанным в шаге 1.
Кстати в данном варианте все бафы бесплатны, если хотите можите указать -
int ItemBuff = ID вещи за которую баф
int Amount = кол-во этих вещей.
P.s. можно в мануалы перенести....минут за 10 сможите написать бафера хоть с 3ий хоть с 33ей профой....кубики, бафы самонов...ему пофигу что бафать)
В общем разобрался почему криво кидал мой бафер этот "новый данс"....
Он кидал его правельно, просто клиент не мог понять, что от него требуется отобразить в списке баффов....Вот и парился...
Решил проблему следующим способом:
Добавил в файл skillgrp.dat строку с "новым дансом", то есть, скопировал строчку основного данса и подставил значения нового ((ID скила остается тот же!) Изменил Лвл с 1 на 2, изменил каст_рейнж с -1 на 400 и т.д.).....
Затем добавил в файл skillname-e.dat строчку, аналогичную строке основного Данса....изменив лиш ЛВЛ, который будет отображаться, и описание (В описании написал GM Dance of Warrior)....
После этих изменений...клиент стал корректно отображать и анимацию скила....и значок и описание....
Ребят....
Кто может дать описание или ссылку на описание функций, использующихся при написании Аи, если есть возможность дайте пожалуйсто...
Или если кто знает, за что отвечают, выделенные красным, значения и какими они могут быть в этой функции:
AddUseSkillDesire(talker,reply,1,0,1000000)
talker - это, я так понимаю, тот, кто разговаривает с НПСом.... Какие еще могут быть значения?
reply - это наверно номер скила из файла skill_pch.txt...... Тут понятно..
1 - за что отвечает это значение и каким может быть?
0 - за что это и каким тоже может быть?
1000000 - и это тоже, за что отвечает и каким может быть?
Если кто знает, расскажите пожалуйста.
С меня спасибка, думаю не только с меня будет....полезная инфа, очень даже...
talker - то над кем выполняется действие
reply - это то что отправляется при нажатии на бафф в диалоговом окне чара с бафером (html), тоибиш сам линк с параметром -h menu_select?ask=reply= собсно ask и reply значени переменных передаваемых от игрока к АИ, тоесть выполнить menu_select с такимто ask= и такимто reply= где reply= и есть ИД вашего баффа, теоретически это способ передачи информации на выполнение скрипту GET методом
1 - первое не помню
0 - второе это докастовывать ли на чара бафы если он после отправки запроса изменил какието свои пармаметры, в том числе и убежал за радиус бафа, собсно это так сказать фикс бегающего бафера за игроками выложенного в разделе "Для новичков", ставим 1 и бафер стоит на месте
1000000 - это какойто делей чтоли, точно не уверен
talker
зарезервированная переменная, которая принимает значения того кто вызвал хендлер talked/menu_selected (т.е. любой ник)
при желании можно дальше перевести её в индекс и запомнить игрока. скажем запомнить этому игроку набор бафов и потом ребафать по просьбе их.
правда это конечно посложнее чем стандартненький баффер.
1000000
3е число это не делей а приоритет это действия.
если скажем моб добавляет 1000 к приоретету пинать чела Noob оттого что Noob его пнул,
и 2000 к приоретету пинать чела Papko за то что Papko пнул его 2 раза то пинать он будет Papko)
так как у нас единственное действие (баф) ,единственный способ вызвать его (menu_selected) , и все игроки "равноправны" то значение может быть любым от 1 (ибо на 0 нпс плевать) до 2.1ккк.

