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

Functor

Core Developers
  • Постов

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

  • Посещение

  • Победитель дней

    147

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

  1. Суть странности, когда подключаются с любого IP, login server тут же выдаёт:

    [Info]: Closed connection from '127.0.0.1'.

    Вот так это выглядит конкретнее:

    [Status]: Request for connection of Bibik (ip: 127.0.0.1) version=46
    [Notice]: Authentication accepted (account: Bibik, id: 2000001, ip: 127.0.0.1)
    [Status]: Connection of the account 'Bibik' accepted.
    [Info]: Closed connection from '127.0.0.1'.
    [Status]: set users DragonsRO : 1
    [Status]: Request for connection of Kreol89 (ip: 192.168.1.37) version=46
    [Notice]: Authentication accepted (account: Kreol89, id: 2000000, ip: 192.168.1.37)
    [Status]: Connection of the account 'Kreol89' accepted.
    [Info]: Closed connection from '192.168.1.37'.

    Не знаю, на сколько это критично, но всё же напрягает.

    И может именно с этим связано, что не удаляются персы с сервера.

    Это нормально.

    - клиент подключается, передает логин и пароль login серверу

    - login сервер проверяет данные и передает клиенту данные для подключения к char серверу

    - клиент получает данные и завершает соединение с login сервером

    - login сервер понимает, что клиент отключился и выводит соответствующее сообщение:

    [info]: Closed connection from '127.0.0.1'.

    Дальше клиент подключается к char серверу.

  2. Ну вставил и всё вот так)

    :D

    Открываем ../src/map/status.h и после:


    MD_NOCAST_SKILL = 0x800000,

    добавляем:


    MD_NODEMONIC = 0x40000000, // NeoTemple Extra Demonic Mob

    Это особый режим монстра, который можно прописывать в db/re/mob_db.txt указывая в поле Mode, к примеру, вот так выглядит запись Poring'а:


    1002,PORING,Poring,Poring,1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x83,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1

    Если указать этот режим, то моб никогда не будет Демоническим. Пример Poring'а после модификации:


    1002,PORING,Poring,Poring,1,60,1,27,20,1,8,9,2,5,6,1,1,0,6,5,10,12,1,3,21,0x40008083,400,1872,672,480,0,0,0,0,0,0,0,909,7000,1202,100,938,400,512,1000,713,1500,512,150,619,20,0,0,0,0,4001,1

    • Upvote 2
  3. Вы 100% используете тот EXE, который я модифицировал?

    Если проблема на стороне EXE, то при попытке использовать скилл или произвести удар Вы увидите такие сообщения:

    Unable to attack while riding.

    Unable to cast the skill while riding.

    Если этих сообщений нету, то проблема, скорее всего, на стороне сервера.

  4. Спасибо вам большое как всегда Выручили))) Теперь ещё одна моя идея выполнима))))

    Чёрт зашёл в игру взял хв Прописал @mount2 Сел на лису а бить немогу ((((

    А если быть точнее Навыки вообще использовать невозможно

    if( &sd->sc && sd->sc.data[sC_ALL_RIDING] )

    return true; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)

    после запрета тут так получилось )

    Так работает или нет ?

    Вы произвели замену кода в двух местах на сервере ?

    • Upvote 2
  5. ну вот я вбил поиск)

    3F4F5C

    показало эту строку)0A 00 85 C0 75 2A 6A 00 6A 00

    и что в ней менять я так и не понял))) нету нечего из того что вы показали выше))))

    Причины может быть три:

    1. Вы не туда смотрите

    2. У Вас не 2013-08-07aRagexe

    3. Патчер сдвинул секции в файле

    Лучше выложите Ваш EXE. Я сам все поправлю.

    ---------------------

    Все-таки первая причина. Вы не туда смотрите.

    Вот нужный байт: 0A 00 85 C0 75 2A 6A 00 6A 00

    • Upvote 2
  6. Это не строки. Это смещения относительно начала файла.

    1. Открываем файл в HEX редакторе

    2. Нажимаем Ctrl + G

    3. Вводим смещение

    4. Нажимаем OK и редактор укажет место где необходимо произвести замену

    5. Производим редактирование значений

    6. Сохраняем изменения

    Пункты 2-5 необходимо выполнить для всех оффсетов (3F4F5C, 3F4BA2, 3F62B2, 3F48EA).

    • Upvote 3
  7. Для 2013-08-07aRagexe :

    оффсет 3F4F5C меняем 75 на EB

    оффсет 3F4BA2 меняем 75 на EB

    оффсет 3F62B2 меняем 74 04 85 C0 75 на 90 90 90 90 EB

    оффсет 3F48EA меняем 0F 84 6E 06 00 00 на 90 90 90 90 90 90

    Открываем ../src/map/skill.c и в функции skill_isNotOk меняем:


    if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
    return true; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)

    на:


    // if( &sd->sc && sd->sc.data[SC_ALL_RIDING] )
    // return true; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)

    Открываем ../src/map/pc.c и в функции pc_can_attack меняем:

     sd->sc.data[SC_ALL_RIDING] || // The client doesn't let you, this is to make cheat-safe

    на:

     //sd->sc.data[SC_ALL_RIDING] || // The client doesn't let you, this is to make cheat-safe

    Открываем ../src/map/status.c и в функции status_check_skilluse меняем:


    if (sc->data[SC_ALL_RIDING])
    return false; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)

    на:


    // if (sc->data[SC_ALL_RIDING])
    // return false; //You can't use skills while in the new mounts (The client doesn't let you, this is to make cheat-safe)

    • Upvote 2

  8. tcpdump -i eth1 -ln port 6900
    tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
    listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
    12:55:46.562001 IP 5.153.135.50.5220 > 192.168.0.100.6900: Flags [S], seq 600832856, win 65535, options [mss 1272,nop,nop,sackOK], length 0
    12:55:46.562085 IP 192.168.0.100.6900 > 5.153.135.50.5220: Flags [S.], seq 1322001937, ack 600832857, win 29200, options [mss 1460,nop,nop,sackOK], length 0
    12:55:46.584670 IP 5.153.135.50.5220 > 192.168.0.100.6900: Flags [.], ack 1, win 65535, length 0
    12:55:46.587835 IP 5.153.135.50.5220 > 192.168.0.100.6900: Flags [P.], seq 1:56, ack 1, win 65535, length 55
    12:55:46.587888 IP 192.168.0.100.6900 > 5.153.135.50.5220: Flags [.], ack 56, win 29200, length 0
    12:55:46.591484 IP 192.168.0.100.6900 > 5.153.135.50.5220: Flags [P.], seq 1:80, ack 56, win 29200, length 79
    12:55:46.614758 IP 5.153.135.50.5220 > 192.168.0.100.6900: Flags [F.], seq 56, ack 80, win 65456, length 0
    12:55:46.614924 IP 192.168.0.100.6900 > 5.153.135.50.5220: Flags [F.], seq 80, ack 57, win 29200, length 0
    12:55:46.637321 IP 5.153.135.50.5220 > 192.168.0.100.6900: Flags [.], ack 81, win 65456, length 0

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

    Попытайтесь ответить на все вопросы из моего предыдущего поста и, возможно, Вам станет все понятно.

    Как Вы думаете, что делает код, который я привел в пример?

    Зачем он передает клиенту IP и порты char серверов?

  9. Ну да, конечно

    http://prntscr.com/7xwm3j

    100%

    И что я тут должен был увидеть? Где дамп сетевых пакетов?

    Как Вы думаете, что делает код, который я привел в пример?

    Зачем он передает клиенту IP и порты char серверов?

    e1dtpcui6ohi6o9zg.jpg

  10. с какой стати если перед ним роутер выполняет prerouting+postrouting+MASQUERADE

    я бы не был так уверен в высказываниях если б у меня сервер уже 5 с половиной лет не работал за натом. Да там управляемая циска натит, но смысл абсолютно тот же.

    Вы заблуждаетесь. Я говорю про передачу IP серверов не в служебных полях пакета, а в качестве данных.

    А в разделе данных никакой роутер не имеет права ничего корректировать.


    WFIFOHEAD(fd,47+32*server_num);
    WFIFOW(fd,0) = 0x69;
    WFIFOW(fd,2) = 47+32*server_num;
    WFIFOL(fd,4) = sd->login_id1;
    WFIFOL(fd,8) = sd->account_id;
    WFIFOL(fd,12) = sd->login_id2;
    WFIFOL(fd,16) = 0; // in old version, that was for ip (not more used)
    //memcpy(WFIFOP(fd,20), sd->lastlogin, 24); // in old version, that was for name (not more used)
    memset(WFIFOP(fd,20), 0, 24);
    WFIFOW(fd,44) = 0; // unknown
    WFIFOB(fd,46) = sex_str2num(sd->sex);
    for( i = 0, n = 0; i < ARRAYLENGTH(server); ++i )
    {
    if( !session_isValid(server[i].fd) )
    continue;
    subnet_char_ip = lan_subnetcheck(ip); // Advanced subnet check [LuzZza]
    WFIFOL(fd,47+n*32) = htonl((subnet_char_ip) ? subnet_char_ip : server[i].ip);
    WFIFOW(fd,47+n*32+4) = ntows(htons(server[i].port)); // [!] LE byte order here [!]
    memcpy(WFIFOP(fd,47+n*32+6), server[i].name, 20);
    WFIFOW(fd,47+n*32+26) = server[i].users;
    WFIFOW(fd,47+n*32+28) = server[i].type;
    WFIFOW(fd,47+n*32+30) = server[i].new_;
    n++;
    }
    WFIFOSET(fd,47+32*server_num);

  11. Вы копаете не туда. Зачем вообще трогать subnet если все три сервера (чар мап логин) находятся на одной машине и взаимодействуют через loopback интерфейс. Во всех конфигах должно быть указано 127.0.0.1 кроме login_athena.conf где в директиве bind_ip: указывается ип интерфейса через который он смотрит в мир.

    Правильно копаем.

    login сервер после подключения игрока, посылает пакет(0x69) с IP адресами char серверов.

    По которых и производиться подключение клиентом после выбора сервера.

    Если не настроить subnet_athena.conf, то в пакетах окажется 192.168.1.100 или 127.0.0.1

    И при попытке игрока подключиться по этим IP ничего хорошего не получится.

    ;)

    • Upvote 1
  12. Скорее всего, необходимо настроить ../conf/subnet_athena.conf

    Более подробно смогу сказать только после предоставления инфы.

    Сервер запущен дома ? Какой внешний IP ?

    P.S. Сколько еще раз необходимо Вас предупредить, чтобы Вы не создавали несколько постов подряд ?

  13. В файле ../src/map/clif.c меняем код функции clif_cashshop_ack на:


    void clif_cashshop_ack(struct map_session_data* sd, int error)
    {
    int fd = sd->fd;
    WFIFOHEAD(fd, packet_len(0x289));
    WFIFOW(fd,0) = 0x289;
    WFIFOL(fd,2) = sd->cashPoints;
    #if PACKETVER < 20070711
    WFIFOW(fd,6) = TOW(error);
    #else
    WFIFOL(fd,6) = sd->kafraPoints;
    WFIFOW(fd,10) = TOW(error);
    #endif
    WFIFOSET(fd, packet_len(0x289));
    }

    В файле ../src/map/clif.c меняем код функции clif_parse_cashshop_buy на:


    void clif_parse_cashshop_buy(int fd, struct map_session_data *sd) {
    struct s_packet_db* info;
    int cmd = RFIFOW(fd,0);

    nullpo_retv(sd);

    info = &packet_db[sd->packet_ver][cmd];

    if( sd->state.trading || !sd->npc_shopid ) {
    clif_cashshop_ack(sd,1);
    return;
    } else if( sd->state.secure_items ) {
    clif_displaymessage(sd->fd, "You can't shop. Blocked with @security");
    clif_cashshop_ack(sd,1);
    return;
    } else {
    #if PACKETVER < 20101116
    unsigned short nameid = RFIFOW(fd,info->pos[0]);
    short amount = RFIFOW(fd,info->pos[1]);
    int points = RFIFOL(fd,info->pos[2]);

    clif_cashshop_ack(sd,npc_cashshop_buy(sd, nameid, amount, points));
    #else
    int s_itl = (cmd==0x848)?10:4; //item _list size (depend on cmd even for 2013+)
    int len = RFIFOW(fd,info->pos[0]);
    int points = RFIFOL(fd,info->pos[1]);
    int count = RFIFOW(fd,info->pos[2]);
    unsigned short* item_list = (unsigned short*)RFIFOP(fd,info->pos[3]);

    if( len < 10 || len != 10 + count * s_itl) {
    ShowWarning("Player %u sent incorrect cash shop buy packet (len %u:%u)!\n", sd->status.char_id, len, 10 + count * s_itl);
    return;
    }

    if(cmd == 0x848) {
    if (cashshop_buylist( sd, points, count, item_list))
    clif_cashshop_ack(sd,0);
    return;
    } else {
    clif_cashshop_ack(sd,npc_cashshop_buylist(sd,points,count,item_list));
    return;
    }
    #endif
    }
    }

    • Upvote 2
  14. А теперь перечитываем что я написал и увидим, что было написано про ДВЕ СТРОЧКИ, а не две переменные. Считать переменную = 1 строка, изменить её значение = вторая строка, и не важно, как много их, это не будет сложно сделать, кек.

    Я правильно прочитал и понял Ваш пост.

    Количество переменных указал, чтобы показать объем модификации, а не указать на то, что Вы ошиблись c количеством переменных.

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

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

    Да и вообще я не понимаю к чему Вы завели разговор о сложности реализации.

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

    • Upvote 1
  15. Переменных там очень много. Сбор статистики производится в разных участках исходного кода сервера.

    Это большая модификация :)

    struct s_killrank {

    unsigned short

    kill_count,

    death_count;

    int score;

    };

    struct s_battleground_stats {

    unsigned int

    top_damage,

    damage_done,

    damage_received,

    boss_damage;

    unsigned short

    // Triple Inferno

    skulls,

    ti_wins, ti_lost, ti_tie,

    // Tierra EoS

    eos_flags,

    eos_bases,

    eos_wins, eos_lost, eos_tie,

    // Tierra Bossnia

    boss_killed,

    boss_flags,

    boss_wins, boss_lost, boss_tie,

    // Tierra Domination

    dom_bases,

    dom_off_kills,

    dom_def_kills,

    dom_wins, dom_lost, dom_tie,

    // Flavius TD

    td_kills,

    td_deaths,

    td_wins, td_lost, td_tie,

    // Flavius SC

    sc_stole,

    sc_captured,

    sc_droped,

    sc_wins, sc_lost, sc_tie,

    // Flavius CTF

    ctf_taken,

    ctf_captured,

    ctf_droped,

    ctf_wins, ctf_lost, ctf_tie,

    // Conquest

    emperium_kill,

    barricade_kill,

    gstone_kill,

    cq_wins, cq_lost,

    // Rush

    ru_captures,

    ru_wins, ru_lost;

    unsigned int // Ammo

    sp_heal_potions,

    hp_heal_potions,

    yellow_gemstones,

    red_gemstones,

    blue_gemstones,

    poison_bottles,

    acid_demostration,

    acid_demostration_fail,

    support_skills_used,

    healing_done,

    wrong_support_skills_used,

    wrong_healing_done,

    sp_used,

    zeny_used,

    spiritb_used,

    ammo_used;

    unsigned short

    kill_count,

    death_count,

    win, lost, tie,

    leader_win, leader_lost, leader_tie,

    deserter, rank_games;

    int score, points, rank_points;

    };

    struct s_woestats {

    int score;

    unsigned short

    kill_count,

    death_count;

    unsigned int

    top_damage,

    damage_done,

    damage_received;

    unsigned int

    emperium_damage,

    guardian_damage,

    barricade_damage,

    gstone_damage;

    unsigned short

    emperium_kill,

    guardian_kill,

    barricade_kill,

    gstone_kill;

    unsigned int // Ammo

    sp_heal_potions,

    hp_heal_potions,

    yellow_gemstones,

    red_gemstones,

    blue_gemstones,

    poison_bottles,

    acid_demostration,

    acid_demostration_fail,

    support_skills_used,

    healing_done,

    wrong_support_skills_used,

    wrong_healing_done,

    sp_used,

    zeny_used,

    spiritb_used,

    ammo_used;

    };

    struct s_skillcount {

    unsigned short id,count;

    };

    Да и дело тут не в сложности реализации. А в том, что нету паблик аналога. ;)

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