Nezdeshniy Опубликовано 11 сентября, 2012 Жалоба Поделиться Опубликовано 11 сентября, 2012 Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать... Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 11 сентября, 2012 Жалоба Поделиться Опубликовано 11 сентября, 2012 Добавляйте в исходниках поддержку нового event лейбла по аналогии с OnPCDieEvent, OnPCLoginEvent и т.д.Затем в функциях использования скиллов добавляйте вызов функции, которая выполнит скрипт по Вашему лейблу. Ссылка на комментарий Поделиться на другие сайты Поделиться
Incubus Опубликовано 12 сентября, 2012 Жалоба Поделиться Опубликовано 12 сентября, 2012 В моде резидет евил такой лейбл присутствует, только к нему нужно добавить определение скила. Ссылка на комментарий Поделиться на другие сайты Поделиться
botka4aet Опубликовано 12 сентября, 2012 Жалоба Поделиться Опубликовано 12 сентября, 2012 В моде резидет евил такой лейбл присутствует, только к нему нужно добавить определение скила.Пруф? Ссылка на комментарий Поделиться на другие сайты Поделиться
Incubus Опубликовано 12 сентября, 2012 Жалоба Поделиться Опубликовано 12 сентября, 2012 У кого есть этот мод, тот увидит(не полная часть этого лейбла):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)и как я уже сказал нужно добавить проверку скила.Какой пруф тебе еще нужен? Ссылка на комментарий Поделиться на другие сайты Поделиться
Лилит Опубликовано 12 сентября, 2012 Жалоба Поделиться Опубликовано 12 сентября, 2012 Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать... Можно. Вот решение для урона от навыков(только от навыков): грубо, но быстро... 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;} 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
Nezdeshniy Опубликовано 13 сентября, 2012 Автор Жалоба Поделиться Опубликовано 13 сентября, 2012 (изменено) Необходимо создать мод, правку сорцов, после которой было бы возможно дать понять скрипту срабатываемому при атаке - чем именно бьет игрок, каким именно скиллом, возможно я не заметил и такая возможность уже есть если кто знает поделитесь советом, как реализовать, какие шансы на успех и куда копать... Можно. Вот решение для урона от навыков(только от навыков): грубо, но быстро... 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 и твой, тогда будет вообще шикарно. Изменено 13 сентября, 2012 пользователем Nezdeshniy Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 13 сентября, 2012 Жалоба Поделиться Опубликовано 13 сентября, 2012 но вот мне необходимо определять именно последний атакующий скил, тоесть тот скилл после которого игрок умирает.Почему не указали это в первом посте? В таком случае новый лейбл делать не надо. Ссылка на комментарий Поделиться на другие сайты Поделиться
Nezdeshniy Опубликовано 13 сентября, 2012 Автор Жалоба Поделиться Опубликовано 13 сентября, 2012 (изменено) но вот мне необходимо определять именно последний атакующий скил, тоесть тот скилл после которого игрок умирает.Почему не указали это в первом посте? В таком случае новый лейбл делать не надо.Видимо торопился, задача именно определить скил после которого умер игрок....эм...а что тогда необходимо? Изменено 13 сентября, 2012 пользователем Nezdeshniy Ссылка на комментарий Поделиться на другие сайты Поделиться
Лилит Опубликовано 13 сентября, 2012 Жалоба Поделиться Опубликовано 13 сентября, 2012 Видимо торопился, задача именно определить скил после которого умер игрок....эм...а что тогда необходимо?Не вставлять эту строку:npc_event_doall_id("OnDamage",dst->id); 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 13 сентября, 2012 Жалоба Поделиться Опубликовано 13 сентября, 2012 (изменено) 1. Если оставить как есть, то получится ситуация: - персонажа убивают соником - скрипт определяет, что персонажа убили соником - персонажа убивают простой атакой - скрипт определяет, что персонажа убили соником Совет: Присваивать переменной при простой атаке по чару значение -1. Которое при смерти персонажа будет означать смерть не от скилла.2. Зачем использовать пользовательские переменные, которые пишутся в БД? Совет: Реализуйте переменную по такому принципу, как killerrid.3. Зачем при каждом получении урона от скилла запоминать skill_id? Совет: Перед сохранением skill_id проверяйте урон от скилла и текущий показатель жизни у персонажа. Изменено 13 сентября, 2012 пользователем Functor Ссылка на комментарий Поделиться на другие сайты Поделиться
Лилит Опубликовано 13 сентября, 2012 Жалоба Поделиться Опубликовано 13 сентября, 2012 1. Если оставить как есть, то получится ситуация:... Как уже говорилось: грубо, но быстро... Если у тебя есть время, в чем я сомневаюсь, то можешь и сам написать, но оно тебе не нужно =\ Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 13 сентября, 2012 Жалоба Поделиться Опубликовано 13 сентября, 2012 (изменено) Я очень рад за Вас, что и свои недочеты Вы тоже понимаете быстро 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. Спасибо Лилит за его примеры. Изменено 14 сентября, 2012 пользователем Functor 3 Ссылка на комментарий Поделиться на другие сайты Поделиться
Nezdeshniy Опубликовано 17 сентября, 2012 Автор Жалоба Поделиться Опубликовано 17 сентября, 2012 (изменено) Все супер спасибо за реализацию, но возникла проблема, данный скрипт я так понимаю работает только с OnPCDieEvent: ? Мне необходимо применить его при срабатывании к атакующему персонажу, с помощью чего применить бы, грубо говоря что бы при срабатывании скрипта шло действие на убитого и другое действие на убившего... у меня не было времени поиграть со скриптом и посмотреть как он реагирует на все...Или проше по шаблону сделать срабатывание на атакующего персонажа ? Изменено 17 сентября, 2012 пользователем Nezdeshniy Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 18 сентября, 2012 Жалоба Поделиться Опубликовано 18 сентября, 2012 (изменено) Качайте новый патч: 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. На будущее прошу все нюансы задачи описывать сразу. Изменено 4 августа, 2013 пользователем Functor 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
Nezdeshniy Опубликовано 18 сентября, 2012 Автор Жалоба Поделиться Опубликовано 18 сентября, 2012 Качайте новый патч: 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. На будущее прошу все нюансы задачи описывать сразу. Шикарно, где тут еще поставить второй плюс ? с меня что нибудь связанное с хостингом, если надо. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 4 августа, 2013 Жалоба Поделиться Опубликовано 4 августа, 2013 похапе https://gist.github....-anasol/6151510Чтобы сделать функцию для получения имени скилла.Строится на основе работабщих скиллов(не за комментированных) в skill_dbИ для самых маленькихленивыхРезультат работы ака готовая функцияhttps://gist.github....-anasol/6151513За работоспособность и актуальноть не отвечаю, сделал из эмулятора который был, а какой он я не знаю Ссылка на комментарий Поделиться на другие сайты Поделиться
nomn Опубликовано 5 августа, 2013 Жалоба Поделиться Опубликовано 5 августа, 2013 Результат работы ака готовая функцияhttps://gist.github....-anasol/6151513Интересно, что быстрее: массив, с индексами ввдие skillid, или case?Теоретически быстрее должен быть массив, тогда будет просто return @$my_array$[getarg(0)]; Ссылка на комментарий Поделиться на другие сайты Поделиться
nejiko Опубликовано 5 августа, 2013 Жалоба Поделиться Опубликовано 5 августа, 2013 похапе https://gist.github....-anasol/6151510Чтобы сделать функцию для получения имени скилла.Строится на основе работабщих скиллов(не за комментированных) в skill_dbИ для самых маленькихленивыхРезультат работы ака готовая функцияhttps://gist.github....-anasol/6151513За работоспособность и актуальноть не отвечаю, сделал из эмулятора который был, а какой он я не знаюА как ее использовать? Ссылка на комментарий Поделиться на другие сайты Поделиться
Sanasol Опубликовано 5 августа, 2013 Жалоба Поделиться Опубликовано 5 августа, 2013 Результат работы ака готовая функция https://gist.github....-anasol/6151513 Интересно, что быстрее: массив, с индексами ввдие skillid, или case? Теоретически быстрее должен быть массив, тогда будет просто return @$my_array$[getarg(0)]; А теперь вспоминаем что в массиве рошечки максимум 128 элементов, и юзаем кейсы Ссылка на комментарий Поделиться на другие сайты Поделиться
nejiko Опубликовано 5 августа, 2013 Жалоба Поделиться Опубликовано 5 августа, 2013 Результат работы ака готовая функция https://gist.github....-anasol/6151513 Интересно, что быстрее: массив, с индексами ввдие skillid, или case? Теоретически быстрее должен быть массив, тогда будет просто return @$my_array$[getarg(0)]; А теперь вспоминаем что в массиве рошечки максимум 128 элементов, и юзаем кейсы Подскажите как соеденить ваш скрипт, что-бы он показывал не ID, а наименование! Ссылка на комментарий Поделиться на другие сайты Поделиться
kadze Опубликовано 5 августа, 2013 Жалоба Поделиться Опубликовано 5 августа, 2013 я бы предложил сделать такpc_setglobalreg_str(sd,"skillname$",skill_get_desc(skill_id));и тд по аналогии с остальными переменными Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения