Китайцы - добрые люди. В каждом (шаровом) билде своего PW сервера оставляют кучу полезной и не совсем дебаг информации. И мы можем ее достать! Если читатель этой темы захочет написать свой собственный и инновационный редактор - будет полезно тут прочитать.
Будем мы пользоваться программой GDB (GNU Debugger). Вообще эта программа предназначена для отладки приложений, но мы будем только доставать информацию из таблицы символов исполняемых файлов.
1. Установим GDB (8-12 МБ)
Код:apt-get install gdb2. Откроем GDB
Код:gdb3. Загрузим наш файл геймсервера
Кодgdb) file /server/gamed/gsПоявится:
Кодgdb) Reading symbols from /server/gamed/gs...done.Придется подождать.
3.1 Добавим вывод в файл всего, что выведется на экран
Кодgdb) set logging file /путь к файлу (gdb) set logging on4. Дальше нам нужно найти тип "elementdataman"
Кодgdb) ptype elementdatamanПоявится очень много строк, нажимаем Enter до конца вывода.
5. Ищем наш файл из пункта 3.1. Открываем.
В этом файле представлен листинг структуры elementsdataman. Находим public часть этого файла.
В ней будут упорядочены все листы этого файла.
Пример public части elementsdataman(Версия 1.4.6 v80)
Кодublic: elementdataman(void); ~elementdataman(int); void add_structure(unsigned int, EQUIPMENT_ADDON &); void add_structure(unsigned int, WEAPON_MAJOR_TYPE &); void add_structure(unsigned int, WEAPON_SUB_TYPE &); void add_structure(unsigned int, WEAPON_ESSENCE &); void add_structure(unsigned int, ARMOR_MAJOR_TYPE &); void add_structure(unsigned int, FASHION_WEAPON_CONFIG &); void add_structure(unsigned int, PET_EVOLVE_CONFIG &); void add_structure(unsigned int, PET_EVOLVED_SKILL_CONFIG &); void add_structure(unsigned int, MONEY_CONVERTIBLE_ESSENCE &); void add_structure(unsigned int, STONE_CHANGE_RECIPE_TYPE &); unsigned int get_data_id(ID_SPACE, unsigned int, DATA_TYPE &); unsigned int get_first_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_cur_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_next_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_data_num(ID_SPACE); DATA_TYPE get_data_type(unsigned int, ID_SPACE); const void * get_data_ptr(unsigned int, ID_SPACE, DATA_TYPE &); int save_data(const char *); int load_data(const char *);6. Из этого всего нам нужно только то, что находится в функциях
Код:add_structure(int, listdef)Где listdef - структура листа. Например, listdef EQUIPMENT_ADDON (Самый первый лист доп статов).
Они находятся в правильном порядке (как ни странно).
7. Выписываем все listdef по порядку в блокнот:
Код:EQUIPMENT_ADDON WEAPON_MAJOR_TYPE ...8. Снова заходим в GDB
И для каждого listdef набираем
Кодgdb) ptype EQUIPMENT_ADDONВ выводе будет структура этого листа. Более того, если вы не закрывали GDB, она будет экспортироваться в файлик из п. 3.1.
Дальше проделываем для каждого листа
Кодgdb) ptype WEAPON_MAJOR_TYPE - экспортируется структура второго листаИ так далее для каждого листа из п.6.
9. Финишная прямая.
Теперь напоминаю, что первым восьми байтам файла соответствует структура:
Код:short version; - версия файла short hashtag; - точно не знаю. Кажется контрольная сумма. Отпишитесь, кто знает. int timestamp; вспомогательное значение для последнего изменения файла.10. На последок. Не забудьте также, что перед каждым листом в файле стоит int число с количеством итемов в листе.
Вуаля! Соединив все воедино сначала начало файла (п. 9), затем все листы из п.8 мы получим готовую структуру файла elements.data.
Гайд написан для mmorpg-devs by DEFiNE. Лицензия: Beerware.
Будем мы пользоваться программой GDB (GNU Debugger). Вообще эта программа предназначена для отладки приложений, но мы будем только доставать информацию из таблицы символов исполняемых файлов.
1. Установим GDB (8-12 МБ)
Код:apt-get install gdb2. Откроем GDB
Код:gdb3. Загрузим наш файл геймсервера
Кодgdb) file /server/gamed/gsПоявится:
Кодgdb) Reading symbols from /server/gamed/gs...done.Придется подождать.
3.1 Добавим вывод в файл всего, что выведется на экран
Кодgdb) set logging file /путь к файлу (gdb) set logging on4. Дальше нам нужно найти тип "elementdataman"
Кодgdb) ptype elementdatamanПоявится очень много строк, нажимаем Enter до конца вывода.
5. Ищем наш файл из пункта 3.1. Открываем.
В этом файле представлен листинг структуры elementsdataman. Находим public часть этого файла.
В ней будут упорядочены все листы этого файла.
Пример public части elementsdataman(Версия 1.4.6 v80)
Кодublic: elementdataman(void); ~elementdataman(int); void add_structure(unsigned int, EQUIPMENT_ADDON &); void add_structure(unsigned int, WEAPON_MAJOR_TYPE &); void add_structure(unsigned int, WEAPON_SUB_TYPE &); void add_structure(unsigned int, WEAPON_ESSENCE &); void add_structure(unsigned int, ARMOR_MAJOR_TYPE &); void add_structure(unsigned int, FASHION_WEAPON_CONFIG &); void add_structure(unsigned int, PET_EVOLVE_CONFIG &); void add_structure(unsigned int, PET_EVOLVED_SKILL_CONFIG &); void add_structure(unsigned int, MONEY_CONVERTIBLE_ESSENCE &); void add_structure(unsigned int, STONE_CHANGE_RECIPE_TYPE &); unsigned int get_data_id(ID_SPACE, unsigned int, DATA_TYPE &); unsigned int get_first_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_cur_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_next_data_id(ID_SPACE, DATA_TYPE &); unsigned int get_data_num(ID_SPACE); DATA_TYPE get_data_type(unsigned int, ID_SPACE); const void * get_data_ptr(unsigned int, ID_SPACE, DATA_TYPE &); int save_data(const char *); int load_data(const char *);6. Из этого всего нам нужно только то, что находится в функциях
Код:add_structure(int, listdef)Где listdef - структура листа. Например, listdef EQUIPMENT_ADDON (Самый первый лист доп статов).
Они находятся в правильном порядке (как ни странно).
7. Выписываем все listdef по порядку в блокнот:
Код:EQUIPMENT_ADDON WEAPON_MAJOR_TYPE ...8. Снова заходим в GDB
И для каждого listdef набираем
Кодgdb) ptype EQUIPMENT_ADDONВ выводе будет структура этого листа. Более того, если вы не закрывали GDB, она будет экспортироваться в файлик из п. 3.1.
Дальше проделываем для каждого листа
Кодgdb) ptype WEAPON_MAJOR_TYPE - экспортируется структура второго листаИ так далее для каждого листа из п.6.
9. Финишная прямая.
Теперь напоминаю, что первым восьми байтам файла соответствует структура:
Код:short version; - версия файла short hashtag; - точно не знаю. Кажется контрольная сумма. Отпишитесь, кто знает. int timestamp; вспомогательное значение для последнего изменения файла.10. На последок. Не забудьте также, что перед каждым листом в файле стоит int число с количеством итемов в листе.
Вуаля! Соединив все воедино сначала начало файла (п. 9), затем все листы из п.8 мы получим готовую структуру файла elements.data.
Гайд написан для mmorpg-devs by DEFiNE. Лицензия: Beerware.