hokage 18 Report post Posted November 16, 2021 Здравствуйте. Возник вопрос как расшифровать misrecord из базы sql? Хочу понять, какие квесты прошел перс, а там лабуда из нулей, едениц и прочих чисел. Никакой связью с идами не вижу. Если кто-то имел дело с этим буду рад помощи! Quote Share this post Link to post Share on other sites
V3ct0r 2,117 Report post Posted November 20, 2021 Привет, @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". 3 Quote Some useful links / Полезные ссылки Tips for making a topic in 'Questions & Help' / Рекомендации по созданию тем в разделе "Помощь" Server Advertising Section Rules / Правила раздела "Реклама серверов" Available e-mail domains for registration / Допустимые e-mail домены для регистрации User groups / Группы пользователей User ranks / Звания пользователей "Broken" pictures on the forum / "Битые" изображения на форуме Beware of scammers! / Осторожно, мошенники! My developments / Мои разработки Mods for client and server / Моды для клиента и сервера PKOdev.NET website for Tales of Pirates Server / PKOdev.NET веб-обвязка для сервера Пиратии I do not provide any help in private messages and outside the forum. Use 'Questions & Help' section please. Thank you for understanding! Я не оказываю какую-либо помощь в личных сообщениях и вне форума. Пожалуйста, используйте раздел "Пиратия: Помощь". Благодарю за понимание! Share this post Link to post Share on other sites
Fomin 53 Report post Posted November 22, 2021 (edited) 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 November 22, 2021 by Fomin 2 1 Quote Share this post Link to post Share on other sites
hokage 18 Report post Posted November 22, 2021 @V3ct0r @Fomin Огромное спасибо за ответ, очень помогло! Quote Share this post Link to post Share on other sites
V3ct0r 2,117 Report post Posted November 22, 2021 @Fomin, выглядит круто! 1 Quote Some useful links / Полезные ссылки Tips for making a topic in 'Questions & Help' / Рекомендации по созданию тем в разделе "Помощь" Server Advertising Section Rules / Правила раздела "Реклама серверов" Available e-mail domains for registration / Допустимые e-mail домены для регистрации User groups / Группы пользователей User ranks / Звания пользователей "Broken" pictures on the forum / "Битые" изображения на форуме Beware of scammers! / Осторожно, мошенники! My developments / Мои разработки Mods for client and server / Моды для клиента и сервера PKOdev.NET website for Tales of Pirates Server / PKOdev.NET веб-обвязка для сервера Пиратии I do not provide any help in private messages and outside the forum. Use 'Questions & Help' section please. Thank you for understanding! Я не оказываю какую-либо помощь в личных сообщениях и вне форума. Пожалуйста, используйте раздел "Пиратия: Помощь". Благодарю за понимание! Share this post Link to post Share on other sites