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

systemspirit

Очередь
  • Постов

    6
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные systemspirit

  1. Дальше находим:

     if(md->db->option)
    // Added for carts, falcons and pecos for cloned monsters. [Valaris]
    md->sc.option = md->db->option;

    не подскажете как обозначить условие на id моба дабы не зависеть от уровня моба?

    ревизия eathena 15269

    к примеру диапазон id особых монстров 6000-10000

    if(/*id моба*/ > 5999 & /*id моба*/ < 10001)

    много копался в mob_data, но так и не понял как вытащить id или name в функции mob_spawn

    один кусок привлек внимание, но как им пользоваться не получается понять

    struct mob_db *db; //For quick data access (saves doing mob_db(md->class_) all the time) [Skotlex]

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

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

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


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

    Использую версию 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;
    }

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