1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

1.5.1 (101) поиск персонажа по имени

Тема в разделе 'PW Вопросник', создана пользователем alexp, 22 янв 2015.

Статус темы:
Закрыта.
  1. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    Необходимо зная только имя перса вычислить его ID и ID акка. Если ли у кого такое чудо на пхп?
  2. Deron Old school Пользователи

    Сообщения:
    1.123
    Лайки:
    533
    Пол:
    Мужской
    Репутация:
    4
  3. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    :) спасибо, я уже сам почти сделал. Ну как сделал... интерфейс шаровский, а модули сам вставляю. Вот столкнулся с необходимостью такой ф-и.
  4. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    ну не перебирать же все акки и персов :(
    в айвебе вызывается как gs.GetRoleIDbyName();
    но т.к. я не дружу с java то мне надо в php. Неужто не знает никто? Хоть намекните в сторону какого опкода копать...
  5. Stranger B L A C K    L I S T Пользователи

    Сообщения:
    71
    Лайки:
    66
    Репутация:
    0
    Код:
    RPC_QUERYUSERID = 0x1F41;
    struct QueryUseridArg
    {
      Octets rolename;
    };
    struct QueryUseridRes
    {
      int result;
      int userid;
      int roleid;
      int level;
    };
    alexp, Merfy и Joslian нравится это.
  6. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    тэк-с... функция настолько гадкая, что вешает весь лк намертво. Подскажите нерадивому, что не так впаял:
    PHP:
    socket_set_block($sock);
    $data cuint(8001).PackString('rolename');
    $sbytes socket_send($sock$data81920);
    $rbytes socket_recv($sock$buf81920);

    $result unpack"N"substr$buf1) );
    $userid unpack"N"substr$buf5) );
    $roleid unpack"N"substr$buf9) );
    $level unpack"N"substr$buf13) );

    socket_set_nonblock($sock);
    socket_close($sock);
  7. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Это не функция гадкая, а вы не правильно сформировали пакет:
    PHP:
    $data cuint(8001).PackString('rolename');
    Заменить на:
    PHP:
    $data pack('N', -1).PackString('rolename');
    $data cuint(8001).cuint(strlen($data)).$data;
    И ответ не верно читается.
    Последнее редактирование: 26 янв 2015
  8. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    а для чего нужен -1 ? По ходу читал мануал, то там содержание пакета имеет вид:
    CUInt opcode;//opcode-процедуры
    CUInt length;//количество байт, используемые для аргументов
    ...//аргументы
    ф-я PackString возвращает длина текста + текст
  9. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Все дело в том, что это rpc пакет. И я ошибся, не заметил, что у вас нет длины пакета:
    PHP:
    $data pack('N', -1).PackString('rolename');
    $data cuint(8001).cuint(strlen($data)).$data;
    alexp нравится это.
  10. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    т.е. в моем случае будет так ?:
    PHP:
    function PackString($data)
    {
        
    $data iconv("UTF-8""UTF-16LE"$data);
        
    $datalen = (strlen($data) <= 128) ? pack("C*",strlen($data)) : pack("n*"strlen($data)+32768);
        return 
    $datalen.$data;
    }

    $data pack('N', -1)."rolename";
    $data cuint(8001).PackString($data);
  11. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Нет, я же написал как будет:
    PHP:
    $data pack('N', -1).PackString('rolename');
    $data cuint(8001).cuint(strlen($data)).$data;
  12. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    т.е. 2 раза длину аргументов передавать?
  13. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Длина аргументов передается 1 раз. cuint(strlen($data)) - это длина аргументов, а PackString возвращает длину строки и саму строку.
  14. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    PHP:
    function PackString($data)
    {
        
    $data iconv("UTF-8""UTF-16LE"$data);
        
    $datalen = (strlen($data) <= 128) ? pack("C*",strlen($data)) : pack("n*"strlen($data)+32768);
        return 
    $datalen.$data;
    }
    return $datalen.$data;
    $datelen как бы содержит длину $data
  15. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
  16. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    Бррр... как все запущено :) попробую так...
    --- добавлено: 26 янв 2015 в 16:57 ---
    пакет уходит и что-то приходит назад. Размер 23 байта. Но данные да - не читаются :) Результат аки Array :(
    Последнее редактирование модератором: 3 фев 2015
  17. vieraw Пользователи

    Сообщения:
    54
    Лайки:
    27
    Репутация:
    0
    Вы php знаете?
    И да я писал, что:
    Последнее редактирование модератором: 3 фев 2015
  18. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    только начал. Похож на С, потому более менее понятно, но тонкостей всех не знаю :)
    ф-ю unpack почитал и логично предположить, что "
    Nбеззнаковый long (всегда 32 бит, порядок big endian)
    "
    По строке отследил... ID начинается с 3го бита. Осталось только правильно распаковать :)
  19. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    Всё получилось :) Как обычно всё гениальное просто :( Спасибо всем великим просветителям!!!
  20. TopicStarter Overlay

    alexp Программист Пользователи

    Сообщения:
    122
    Лайки:
    12
    Пол:
    Мужской
    Репутация:
    0
    Страна:
    Belarus Belarus
    А есть ли возможность узнать онлайн ли данный перс? Порыл (3015), но не нашел. Еще интересует инфа по гильдиям. Предполагаю, что рыть надо в направлении 4606, 4607 и 4608, но может подкинете структуру для параметров?
Черновик сохранён Черновик удалён
Similar Threads
  1. Fituchini
    Ответов:
    11
    Просмотров:
    4.026
  2. New-X
    Ответов:
    16
    Просмотров:
    2.010
  3. HolaRiva
    Ответов:
    36
    Просмотров:
    6.178
  4. Anasteisha
    Ответов:
    12
    Просмотров:
    2.560
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей