Перейти к содержанию

Определение скила атаки скриптом.


Nezdeshniy

Рекомендуемые сообщения

Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать...

Ссылка на комментарий
Поделиться на другие сайты

Добавляйте в исходниках поддержку нового event лейбла по аналогии с OnPCDieEvent, OnPCLoginEvent и т.д.

Затем в функциях использования скиллов добавляйте вызов функции, которая выполнит скрипт по Вашему лейблу.

Ссылка на комментарий
Поделиться на другие сайты

У кого есть этот мод, тот увидит(не полная часть этого лейбла):

if(map[sd->bl.m].flag.resident && sd->state.resident == 1)
{
npc_script_event(sd,NPCE_DAMAGE);
pc_stop_attack((TBL_PC*)src);
}

в функции

void pc_damage(struct map_session_data *sd,struct block_list *src,unsigned int hp, unsigned int sp)

и как я уже сказал нужно добавить проверку скила.

Какой пруф тебе еще нужен?

Ссылка на комментарий
Поделиться на другие сайты

Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать...

Можно.

Вот решение для урона от навыков(только от навыков): грубо, но быстро...

clif.c -> ищи функцию

int clif_skill_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type)

в ней перед

#if PACKETVER < 3

вставь это

	if(dst->type == BL_PC)
{
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE",damage,3);
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE_SKILL_ID",skill_id,3);
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE_SKILL_LVL",skill_lv,3);
npc_event_doall_id("OnDamage",dst->id);
}

Ну, переменные говорят сами за себя :)

Для тестов:


- script DAMAGE -1,{
OnDamage:
mes "Урон: "+LAST_DAMAGE;
mes "ID навыка: "+LAST_DAMAGE_SKILL_ID;
mes "Ур. навыка: "+LAST_DAMAGE_SKILL_LVL;
close;
}

  • Upvote 3
Ссылка на комментарий
Поделиться на другие сайты

Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать...

Можно.

Вот решение для урона от навыков(только от навыков): грубо, но быстро...

clif.c -> ищи функцию

int clif_skill_damage(struct block_list *src,struct block_list *dst,unsigned int tick,int sdelay,int ddelay,int damage,int div,int skill_id,int skill_lv,int type)

в ней перед

#if PACKETVER < 3

вставь это

	if(dst->type == BL_PC)
{
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE",damage,3);
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE_SKILL_ID",skill_id,3);
pc_setregistry(((TBL_PC*)dst),"LAST_DAMAGE_SKILL_LVL",skill_lv,3);
npc_event_doall_id("OnDamage",dst->id);
}

Ну, переменные говорят сами за себя :)

Для тестов:


- script DAMAGE -1,{
OnDamage:
mes "Урон: "+LAST_DAMAGE;
mes "ID навыка: "+LAST_DAMAGE_SKILL_ID;
mes "Ур. навыка: "+LAST_DAMAGE_SKILL_LVL;
close;
}

Чет я приболел, если будут силы сегодня попробую тестить...

Насколько я понимаю твой код данный лейбл будет срабатывать после каждого применения скилла, это хорошо, но вот мне необходимо определять именно последний атакующий скил, тоесть тот скилл после которого игрок умирает.

В принципе думаю есть возможность связать лейблы onpcdieivent и твой, тогда будет вообще шикарно.

Изменено пользователем Nezdeshniy
Ссылка на комментарий
Поделиться на другие сайты

но вот мне необходимо определять именно последний атакующий скил, тоесть тот скилл после которого игрок умирает.

Почему не указали это в первом посте? В таком случае новый лейбл делать не надо.

Ссылка на комментарий
Поделиться на другие сайты

но вот мне необходимо определять именно последний атакующий скил, тоесть тот скилл после которого игрок умирает.

Почему не указали это в первом посте? В таком случае новый лейбл делать не надо.

Видимо торопился, задача именно определить скил после которого умер игрок....эм...а что тогда необходимо?

Изменено пользователем Nezdeshniy
Ссылка на комментарий
Поделиться на другие сайты

Видимо торопился, задача именно определить скил после которого умер игрок....эм...а что тогда необходимо?

Не вставлять эту строку:

npc_event_doall_id("OnDamage",dst->id);

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

1. Если оставить как есть, то получится ситуация:

- персонажа убивают соником

- скрипт определяет, что персонажа убили соником

- персонажа убивают простой атакой

- скрипт определяет, что персонажа убили соником

Совет: Присваивать переменной при простой атаке по чару значение -1. Которое при смерти персонажа будет означать смерть не от скилла.

2. Зачем использовать пользовательские переменные, которые пишутся в БД?

Совет: Реализуйте переменную по такому принципу, как killerrid.

3. Зачем при каждом получении урона от скилла запоминать skill_id?

Совет: Перед сохранением skill_id проверяйте урон от скилла и текущий показатель жизни у персонажа.

Изменено пользователем Functor
Ссылка на комментарий
Поделиться на другие сайты

1. Если оставить как есть, то получится ситуация:...

Как уже говорилось:

грубо, но быстро...
smile.gif

Если у тебя есть время, в чем я сомневаюсь, то можешь и сам написать, но оно тебе не нужно =\

Ссылка на комментарий
Поделиться на другие сайты

Я очень рад за Вас, что и свои недочеты Вы тоже понимаете быстро :)

Diff с eAthena r15186 http://rghost.ru/40350492

Пример использования:


- script Die_event -1,{

OnPCDieEvent:
if(skill_killer != -1)
{
dispbottom "Вас добили скиллом c id: "+skill_killer;
}
else
{
dispbottom "Вас добили простой атакой.";
}
}

P.S. Спасибо Лилит за его примеры. ;)

Изменено пользователем Functor
  • Upvote 3
Ссылка на комментарий
Поделиться на другие сайты

Все супер спасибо за реализацию, но возникла проблема, данный скрипт я так понимаю работает только с OnPCDieEvent: ? Мне необходимо применить его при срабатывании к атакующему персонажу, с помощью чего применить бы, грубо говоря что бы при срабатывании скрипта шло действие на убитого и другое действие на убившего... у меня не было времени поиграть со скриптом и посмотреть как он реагирует на все...

Или проше по шаблону сделать срабатывание на атакующего персонажа ?

Изменено пользователем Nezdeshniy
Ссылка на комментарий
Поделиться на другие сайты

Качайте новый патч: http://www.mediafire.com/download/q1p8o27646cdxst/skill_killer_r.1.1_by_Functor.patch

Пофиксил определение текущего HP и адаптировал под использование в OnPCKillEvent.

Теперь номер скилла запоминается "на убийце". Это сделано для того, что бы сразу получать skill_id, а не после аттача жертвы.

Пример:


- script Useskills -1,{

OnPCKillEvent:

if (skill_killer != -1)
{
// В данный момент приаттачен убийца

if (getcharid(3) == killedrid)
{
dispbottom "Вы добили себя скиллом c id: " + skill_killer;
end;
}

set .@skillid, skill_killer;
dispbottom "Вы добили врага скиллом c id: " + skill_killer;
// Аттачим жертву
attachrid(killedrid);
// В данный момент приаттачена жертва
dispbottom "Вас добили скиллом c id: " + .@skillid;
}
else
{
// В данный момент приаттачен убийца
dispbottom "Вы добили врага простой атакой.";
// Аттачим жертву
attachrid(killedrid);
// В данный момент приаттачена жертва
dispbottom "Вас добили простой атакой.";
}
}

P.S. На будущее прошу все нюансы задачи описывать сразу.

Изменено пользователем Functor
  • Upvote 2
Ссылка на комментарий
Поделиться на другие сайты

Качайте новый патч: http://rghost.ru/40430069

Пофиксил определение текущего HP и адаптировал под использование в OnPCKillEvent.

Теперь номер скилла запоминается "на убийце". Это сделано для того, что бы сразу получать skill_id, а не после аттача жертвы.

Пример:


- script Useskills -1,{

OnPCKillEvent:

if (skill_killer != -1)
{
// В данный момент приаттачен убийца

if (getcharid(3) == killedrid)
{
dispbottom "Вы добили себя скиллом c id: " + skill_killer;
end;
}

set .@skillid, skill_killer;
dispbottom "Вы добили врага скиллом c id: " + skill_killer;
// Аттачим жертву
attachrid(killedrid);
// В данный момент приаттачена жертва
dispbottom "Вас добили скиллом c id: " + .@skillid;
}
else
{
// В данный момент приаттачен убийца
dispbottom "Вы добили врага простой атакой.";
// Аттачим жертву
attachrid(killedrid);
// В данный момент приаттачена жертва
dispbottom "Вас добили простой атакой.";
}
}

P.S. На будущее прошу все нюансы задачи описывать сразу.

Шикарно, где тут еще поставить второй плюс ? ;) с меня что нибудь связанное с хостингом, если надо.

  • Upvote 1
Ссылка на комментарий
Поделиться на другие сайты

  • 10 месяцев спустя...

похапе https://gist.github....-anasol/6151510

Чтобы сделать функцию для получения имени скилла.

Строится на основе работабщих скиллов(не за комментированных) в skill_db

И для самых маленькихленивых

Результат работы ака готовая функция

https://gist.github....-anasol/6151513

За работоспособность и актуальноть не отвечаю, сделал из эмулятора который был, а какой он я не знаю

Ссылка на комментарий
Поделиться на другие сайты

Результат работы ака готовая функция

https://gist.github....-anasol/6151513

Интересно, что быстрее: массив, с индексами ввдие skillid, или case?

Теоретически быстрее должен быть массив, тогда будет просто

return @$my_array$[getarg(0)];

Ссылка на комментарий
Поделиться на другие сайты

похапе https://gist.github....-anasol/6151510

Чтобы сделать функцию для получения имени скилла.

Строится на основе работабщих скиллов(не за комментированных) в skill_db

И для самых маленькихленивых

Результат работы ака готовая функция

https://gist.github....-anasol/6151513

За работоспособность и актуальноть не отвечаю, сделал из эмулятора который был, а какой он я не знаю

А как ее использовать?

Ссылка на комментарий
Поделиться на другие сайты

Результат работы ака готовая функция

https://gist.github....-anasol/6151513

Интересно, что быстрее: массив, с индексами ввдие skillid, или case?

Теоретически быстрее должен быть массив, тогда будет просто

return @$my_array$[getarg(0)];

А теперь вспоминаем что в массиве рошечки максимум 128 элементов, и юзаем кейсы :)

Ссылка на комментарий
Поделиться на другие сайты

Результат работы ака готовая функция

https://gist.github....-anasol/6151513

Интересно, что быстрее: массив, с индексами ввдие skillid, или case?

Теоретически быстрее должен быть массив, тогда будет просто

return @$my_array$[getarg(0)];

А теперь вспоминаем что в массиве рошечки максимум 128 элементов, и юзаем кейсы :)

Подскажите как соеденить ваш скрипт, что-бы он показывал не ID, а наименование!

Ссылка на комментарий
Поделиться на другие сайты

×
×
  • Создать...
Яндекс.Метрика