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

AL_WARP - больше memo


systemspirit

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


Добрый день. Прошу помочь или направить на решение.

Использую версию 15269, исходники брал отсюда
https://eathena-project.googlecode.com/svn/trunk/

В качестве клиента пользую exe с 9 packetversion.

Появилась необходимость модифицировать скилл аколита Warp Portal:

- Поднять его до 10 уровня.

- Увеличить количество memo поинтов до 9 (+1 сейв)

Что сделал:

db/skill_db.txt


27,9,6,2,0,0x1,0,10,1,yes,0,0,3,magic,0, AL_WARP,Warp Portal

src/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.h

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);

src/common/mmo.h

#define MAX_MEMOPOINTS 9

src/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;
//0x11c
WFIFOHEAD(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 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,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.
else
sd->menuskill_val = skill_lv;
}

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

Попробуйте.

https://mega.nz/#!UI..._sy2nvFB_08JxFc


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;

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;
}

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

спасибо большое, всё отлично работает.

1. есть возможность описать ваши действия? каким софтом пользовались, что именно искали, ибо никогда не пользовался хексом в ситуациях подобной этой.

2. почему именно 0xA4 а не скажем 0xb4?

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

1. есть возможность описать ваши действия? каким софтом пользовались, что именно искали, ибо никогда не пользовался хексом в ситуациях подобной этой.

Использовал отладчик OllyDbg.

Нашел место где устанавливается длина пакета 0x11C и поменял с 68(0x44) на 164(0xA4).

e2sxizy03po279izg.jpg068rtsw1inz3z67zg.jpg?size_id=4

Нашел место обработки пакета 0x11C и поменял количество считываемых мап.

29i496lx9q2ipl0zg.jpg?size_id=4j37gwe6r2hbzry3zg.jpg?size_id=4

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)

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

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