systemspirit Опубликовано 30 сентября, 2015 Жалоба Поделиться Опубликовано 30 сентября, 2015 Добрый день. Прошу помочь или направить на решение.Использую версию 15269, исходники брал отсюдаhttps://eathena-project.googlecode.com/svn/trunk/В качестве клиента пользую exe с 9 packetversion.Появилась необходимость модифицировать скилл аколита Warp Portal:- Поднять его до 10 уровня.- Увеличить количество memo поинтов до 9 (+1 сейв)Что сделал:db/skill_db.txt27,9,6,2,0,0x1,0,10,1,yes,0,0,3,magic,0, AL_WARP,Warp Portalsrc/map/skill.c - эту часть заговнокодил тк ничего не получалось, позже приведу в порядокcase AL_WARP:if(sd){short wp0=0;if(sd->status.memo_point[0].map){wp0=sd->status.memo_point[0].map;}short wp1=0;if(sd->status.memo_point[1].map){wp1=sd->status.memo_point[1].map;}short wp2=0;if(sd->status.memo_point[2].map){wp2=sd->status.memo_point[2].map;}short wp3=0;if(sd->status.memo_point[3].map){wp3=sd->status.memo_point[3].map;}short wp4=0;if(sd->status.memo_point[4].map){wp4=sd->status.memo_point[4].map;}short wp5=0;if(sd->status.memo_point[5].map){wp5=sd->status.memo_point[5].map;}short wp6=0;if(sd->status.memo_point[6].map){wp6=sd->status.memo_point[6].map;}short wp7=0;if(sd->status.memo_point[7].map){wp7=sd->status.memo_point[7].map;}short wp8=0;if(sd->status.memo_point[8].map){wp8=sd->status.memo_point[8].map;}short wp9=0;if(sd->status.memo_point[9].map){wp9=sd->status.memo_point[9].map;}clif_skill_warppoint(sd, skillid, skilllv, wp0, wp1, wp2, wp3, wp4, wp5, wp6, wp7, wp8, wp9);}src/map/clif.hvoid clif_skill_warppoint(struct map_session_data* sd, short skill_num, short skill_lv, unsigned short map1, unsigned short map2, unsigned short map3, unsigned short map4, unsigned short map5, unsigned short map6, unsigned short map7, unsigned short map8, unsigned short map9, unsigned short map10);src/common/mmo.h#define MAX_MEMOPOINTS 9src/map/clif.c - и вот тут никак не могу разобраться, WFIFOP расставил все по длине в 16, а все равно когда используешь скилл, выходит окно только с 4 точками memo и никак более, в чем может быть проблема?в базе благополучно находятся все 9 memopoint, и такое ощущение что до клиента доходят только 4 первые строкиvoid clif_skill_warppoint(struct map_session_data* sd, short skill_num, short skill_lv, unsigned short map1, unsigned short map2, unsigned short map3, unsigned short map4, unsigned short map5, unsigned short map6, unsigned short map7, unsigned short map8, unsigned short map9, unsigned short map10){int fd;nullpo_retv(sd);fd = sd->fd;//0x11cWFIFOHEAD(fd,packet_len(0x11c));WFIFOW(fd,0) = 0x11c;WFIFOW(fd,2) = skill_num;memset(WFIFOP(fd,4), 0x00, 4*MAP_NAME_LENGTH_EXT);if (map1 == (unsigned short)-1) strcpy((char*)WFIFOP(fd,4), "Random");else // normal map nameif (map1 > 0) mapindex_getmapname_ext(mapindex_id2name(map1), (char*)WFIFOP(fd,4));if (map2 > 0) mapindex_getmapname_ext(mapindex_id2name(map2), (char*)WFIFOP(fd,20));if (map3 > 0) mapindex_getmapname_ext(mapindex_id2name(map3), (char*)WFIFOP(fd,36));if (map4 > 0) mapindex_getmapname_ext(mapindex_id2name(map4), (char*)WFIFOP(fd,52));if (map5 > 0) mapindex_getmapname_ext(mapindex_id2name(map5), (char*)WFIFOP(fd,68));if (map6 > 0) mapindex_getmapname_ext(mapindex_id2name(map6), (char*)WFIFOP(fd,84));if (map7 > 0) mapindex_getmapname_ext(mapindex_id2name(map7), (char*)WFIFOP(fd,100));if (map8 > 0) mapindex_getmapname_ext(mapindex_id2name(map8), (char*)WFIFOP(fd,116));if (map9 > 0) mapindex_getmapname_ext(mapindex_id2name(map9), (char*)WFIFOP(fd,132));if (map10 > 0) mapindex_getmapname_ext(mapindex_id2name(map10), (char*)WFIFOP(fd,148));WFIFOSET(fd,packet_len(0x11c));sd->menuskill_id = skill_num;if (skill_num == AL_WARP)sd->menuskill_val = (sd->ud.skillx<<16)|sd->ud.skilly; //Store warp position here.elsesd->menuskill_val = skill_lv;} Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 30 сентября, 2015 Жалоба Поделиться Опубликовано 30 сентября, 2015 EXE читает с пакета 0x11C только 4 мапы. Увеличить возможно с помощью хекса.Выкладывайте EXE. Будет свободное время, гляну. 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
systemspirit Опубликовано 30 сентября, 2015 Автор Жалоба Поделиться Опубликовано 30 сентября, 2015 (изменено) http://tempfile.ru/file/3165913http://khiel.ru/download/felexe.exe Изменено 30 сентября, 2015 пользователем systemspirit Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 30 сентября, 2015 Жалоба Поделиться Опубликовано 30 сентября, 2015 Попробуйте.https://mega.nz/#!UI..._sy2nvFB_08JxFcvoid clif_skill_warppoint(struct map_session_data* sd, short skill_num, short skill_lv, unsigned short map1, unsigned short map2, unsigned short map3, unsigned short map4, unsigned short map5, unsigned short map6, unsigned short map7, unsigned short map8, unsigned short map9, unsigned short map10){ int fd; nullpo_retv(sd); fd = sd->fd; WFIFOHEAD(fd, 0xA4); WFIFOW(fd,0) = 0x11c; WFIFOW(fd,2) = skill_num; memset(WFIFOP(fd,4), 0x00, 10 * MAP_NAME_LENGTH_EXT); if (map1 == (unsigned short)-1) strcpy((char*)WFIFOP(fd,4), "Random"); else // normal map name if (map1 > 0) mapindex_getmapname_ext(mapindex_id2name(map1), (char*)WFIFOP(fd,4)); if (map2 > 0) mapindex_getmapname_ext(mapindex_id2name(map2), (char*)WFIFOP(fd,20)); if (map3 > 0) mapindex_getmapname_ext(mapindex_id2name(map3), (char*)WFIFOP(fd,36)); if (map4 > 0) mapindex_getmapname_ext(mapindex_id2name(map4), (char*)WFIFOP(fd,52)); if (map5 > 0) mapindex_getmapname_ext(mapindex_id2name(map5), (char*)WFIFOP(fd,68)); if (map6 > 0) mapindex_getmapname_ext(mapindex_id2name(map6), (char*)WFIFOP(fd,84)); if (map7 > 0) mapindex_getmapname_ext(mapindex_id2name(map7), (char*)WFIFOP(fd,100)); if (map8 > 0) mapindex_getmapname_ext(mapindex_id2name(map8), (char*)WFIFOP(fd,116)); if (map9 > 0) mapindex_getmapname_ext(mapindex_id2name(map9), (char*)WFIFOP(fd,132)); if (map10 > 0) mapindex_getmapname_ext(mapindex_id2name(map10), (char*)WFIFOP(fd,148)); WFIFOSET(fd, 0xA4); sd->menuskill_id = skill_num; if (skill_num == AL_WARP) sd->menuskill_val = (sd->ud.skillx<<16)|sd->ud.skilly; //Store warp position here. else sd->menuskill_val = skill_lv;} 1 Ссылка на комментарий Поделиться на другие сайты Поделиться
systemspirit Опубликовано 30 сентября, 2015 Автор Жалоба Поделиться Опубликовано 30 сентября, 2015 (изменено) спасибо большое, всё отлично работает.1. есть возможность описать ваши действия? каким софтом пользовались, что именно искали, ибо никогда не пользовался хексом в ситуациях подобной этой.2. почему именно 0xA4 а не скажем 0xb4? Изменено 30 сентября, 2015 пользователем systemspirit Ссылка на комментарий Поделиться на другие сайты Поделиться
Functor Опубликовано 30 сентября, 2015 Жалоба Поделиться Опубликовано 30 сентября, 2015 (изменено) 1. есть возможность описать ваши действия? каким софтом пользовались, что именно искали, ибо никогда не пользовался хексом в ситуациях подобной этой. Использовал отладчик OllyDbg. Нашел место где устанавливается длина пакета 0x11C и поменял с 68(0x44) на 164(0xA4). Нашел место обработки пакета 0x11C и поменял количество считываемых мап. 2. почему именно 0xA4 а не скажем 0xb4? WFIFOHEAD(fd, 0xA4); Вторым параметром мы передаем размер буфера, который будем использовать для отправки данных. 0xA4 это 164 в шестнадцатеричной системе счисления. До редактирования функции clif_skill_warppoint эта строка выглядела так: WFIFOHEAD(fd,packet_len(0x11c)); Функция packet_len возвращала размер пакета 0x11C. А именно 68 == 0x44 (2 + 2 + 16 * 4) Но теперь EXE ожидает больше данных. А именно 164 == 0xA4 (2 + 2 + 16 * 10) Изменено 30 сентября, 2015 пользователем Functor ;-) 2 Ссылка на комментарий Поделиться на другие сайты Поделиться
systemspirit Опубликовано 1 октября, 2015 Автор Жалоба Поделиться Опубликовано 1 октября, 2015 спасибо большое Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения