Jump to content
Sign in to follow this  
hokage

расшифровка записей misrecord

Recommended Posts

Здравствуйте. 
Возник вопрос как расшифровать misrecord из базы sql? Хочу понять, какие квесты прошел перс, а там лабуда из нулей, едениц и прочих чисел. Никакой связью с идами не вижу.

Если кто-то имел дело с этим буду рад помощи!

Share this post


Link to post
Share on other sites

Привет, @hokage!

 

Написал программу на C++, которая позволяет проверить, прошел ли персонаж квест с определенным ID или нет:

#include <iostream>
#include <sstream>
#include <vector>

// Поле misrecord из таблицы character определенного персонажа
const std::string misrecord("3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,");

// ID квеста, прохождение которого необходимо проверить
const unsigned int quest_id = 703;

// Точка входа
int main(int argc, char* argv[])
{
    // Для вывода русского языка в консоли
    setlocale(LC_ALL, "Russian");

    // Загружаем поле в поток stringstream
    std::stringstream ss(misrecord);

    // Счетчик подстрок
    unsigned int n = 0;

    // Временная строка для хранения текущего значения
    std::string tmp("");

    // Массив со значениями
    std::vector<unsigned int> arr;

    // Разбиваем поле misrecord на значения с помощью символа ','
    while (std::getline(ss, tmp, ','))
    {
        // Пропускаем первую подстроку
        if (n++ == 0) { continue; }

        // Кладем текущее значение в массив
        arr.push_back( std::stoul(tmp) );
    }

    // Проверяем, что персонаж прошел квест
    bool completed =  arr[ (quest_id >> 3) ] & ( 1 << (quest_id % 8) ) ;

    // Выводим результат
    std::cout << "Квест (ID: " << quest_id << ")" << ((completed == true) ? " пройден" : " не пройден") << std::endl;
}

 

На вход надо подать интересующее значение поля misrecord из базы данных и ID квеста, который необходимо проверить. ID квеста можно взять из файлов "MissionScriptXX.lua". Например, для квеста "Physician's Greetings" ID будет равняться 703:

DefineMission( 706, "Physician's Greetings", 703 )

Если под рукой нет С++ компилятора, то можно воспользоваться онлайн компиляторами, например C++ Shell. Просто вставь туда код, приведенный выше, и нажми кнопку "Run". Результат будет выведен внизу страницы во вкладке "Execution".

 

На форуме выложены исходные коды GameServer.exe. Поле misrecord расшифровывается в методе "BOOL CCharMission::MisInitRecord( char* pszBuf )" из файла "Mission.cpp". Как работать с расшифрованными данными можно посмотреть в методах  "BOOL IsSet( WORD wFlag )" и "BOOL SetFlag( WORD wFlag, BOOL bValid )" из файла "RoleData.h".

  • Like 3

Share this post


Link to post
Share on other sites

PHP версия:

$querst_id = '1715';
$misrecord = '3,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-32,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,';

$arr 		= explode(',', $misrecord);
$arr		= array_slice($arr, 1);
$completed	= (($arr[($quest_id >> 3)] & (1 << ($quest_id % 8))) > 0) ? 1 : 0;

echo $completed;

 

Можно декодировать missioninfo.lua из игрового клиента, преобразовать в массив регуляркой при помощи notepad++ и выводить пройденные задания на сайте. 

 

Регулярочка для notepad++: 

.*\((\d*),(\s*)"(.*)".*
'$1' => '$3',

Пример нашей реализации: Блог разработчиков | GIS Games.

 

@V3ct0r отдельное спасибо за наводку по расшифрове misrecord.

Edited by Fomin
  • Like 2
  • Thanks 1

Share this post


Link to post
Share on other sites

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

×
×
  • Create New...