GameDB daemon - один из демонов pw, его задача предоставлять внутриигровые данные (не относится к sql-данным аккаунта).
GDB основан на встраиваемой базе данных Berkeley DB [
Протокол
Общение с игровой базой осуществляется по строго определенному RPC-протоколу [
Чтобы осуществить какую-либо операцию с игровой базой нужно знать опкод-пакета [
Код:CUInt opcode;//opcode-процедуры (CUInt см. ниже) CUInt length;//количество байт, используемые для аргументов ...//аргументы Пример: Получить информацию о персонаже, зная его id (GetRoleData). Мы знаем что opcode этой операции = 8003, функция на входе получает sid и rid:
Код:CUInt opcode = 8003; CUInt length = 8; Int32 sid = 1; Int32 rid = 1024; Зная опкоды и аргументы функций можно манипулировать данными игровой базы: от просмотра информации о персонаже/карты сражений, до внесения изменений в инвентарь и изменения списка друзей. Список разобранных протоколов участниками иследовательской ветви можно найти
Список опкодов v1.2.6
Код:115 GetTaskDataRpc 135 PutTaskDataRpc 200 PutFriendList 201 GetFriendList 215 PutMessage 216 GetMessage 413 DBStockBalance 414 DBStockTransaction 415 DBStockLoad 416 DBStockCommission 417 DBStockCancel 514 GetAddCashSN 611 DBSellPoint 612 DBSyncSellInfo 613 DBSellTimeout 614 DBSellCancel 615 DBBuyPoint 618 DBTransPointDeal 810 DBAuctionOpen 811 DBAuctionBid 812 DBAuctionList 813 DBAuctionGet 814 DBAuctionTimeout 815 DBAuctionClose 863 DBBattleLoad 864 DBBattleSet 865 DBBattleChallenge 868 DBBattleEnd 871 DBBattleMail 872 DBBattleBonus 3001 PutUser 3002 GetUser 3003 DelUser 3005 GetRole 3006 DelRole 3007 DBCreateRole 3008 DBDeleteRole 3009 DBUndoDeleteRole 3012 PutRoleBase 3013 GetRoleBase 3014 PutRoleStatus 3015 GetRoleStatus 3016 PutRoleEquipment 3017 GetRoleEquipment 3018 PutRoleTask 3019 GetRoleTask 3020 TradeInventory 3021 TradeSave 3022 GetMoneyInventory 3023 PutMoneyInventory 3024 PutRole 3025 GetRoleBaseStatus 3026 PutRoleStorehouse 3027 GetRoleStorehouse 3030 PutRoleForbid 3031 GetRoleForbid 3032 GetUserRoles 3033 GetRoleId 3034 TransactionAcquire 3035 TransactionAbort 3036 TransactionCommit 3043 ClearStorehousePasswd 3044 RenameRole 3047 CanChangeRolename 3049 GetRoleInfo 3050 PutRolePocket 3051 GetRolePocket 3100 DBSetCashPassword 4047 PutSpouse 4251 DBGetMailList 4252 DBGetMail 4253 DBGetMailAttach 4254 DBSetMailAttr 4255 DBSendMail 4256 DBDeleteMail 4600 AddFaction 4601 DelFaction 4602 AddMember 4603 DelMember 4604 UpdateUserFaction 4605 UpdateFaction 4606 GetFactionInfo 4607 GetUserFaction 4608 GetFactionDetail 4609 DBVerifyMaster 4610 DBFactionUpgrade 4611 DBFactionPromote
Типы данных используемых игровой базой:
CUInt (Compact UInt) - особый китайский целочисленный без знаковый тип данных , не фиксированной длины, часто встречается в pw, чаще всего выступает размером чего-либо.
Byte, Int16, Int32, UInt16, UInt32 - при общении с базой для целочисленных переменных она использует little-endian порядок байт [
Октеты - октеты (массив байт [
Код:CUInt length; //в начале октета идет размер массива байт byte[length] data;//последовательность байт, в том количестве, что указанно в lengthВектор - одномерный массив, индексация которого строго начинается с нуля [
Код:CUint32 length;//Размер вектора T[length] data;//Массив этих типов DateTime - время и дата хранятся в виде UNIX-timestamp (количество секунд прошедших с полуночи 1 января 1970 года [
TimeSpan - интервал времени, так же хранит количество секунд в UInt32 (прим. GRoleStatus->multi_exp_ctrl->enhance_time)
Строки - строки в gdb сериализованны в виде октетов. Строки хранятся в Unicode'e
©
GDB основан на встраиваемой базе данных Berkeley DB [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
], что позволяет демону достаточно быстро оперировать данными.Протокол
Общение с игровой базой осуществляется по строго определенному RPC-протоколу [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
].Чтобы осуществить какую-либо операцию с игровой базой нужно знать опкод-пакета [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
] и типы принимаемых аргументов, вызываемой функции. Тело RPC в pw выглядит следующим образом:Код:CUInt opcode;//opcode-процедуры (CUInt см. ниже) CUInt length;//количество байт, используемые для аргументов ...//аргументы Пример: Получить информацию о персонаже, зная его id (GetRoleData). Мы знаем что opcode этой операции = 8003, функция на входе получает sid и rid:
Код:CUInt opcode = 8003; CUInt length = 8; Int32 sid = 1; Int32 rid = 1024; Зная опкоды и аргументы функций можно манипулировать данными игровой базы: от просмотра информации о персонаже/карты сражений, до внесения изменений в инвентарь и изменения списка друзей. Список разобранных протоколов участниками иследовательской ветви можно найти
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
Список опкодов v1.2.6
Код:115 GetTaskDataRpc 135 PutTaskDataRpc 200 PutFriendList 201 GetFriendList 215 PutMessage 216 GetMessage 413 DBStockBalance 414 DBStockTransaction 415 DBStockLoad 416 DBStockCommission 417 DBStockCancel 514 GetAddCashSN 611 DBSellPoint 612 DBSyncSellInfo 613 DBSellTimeout 614 DBSellCancel 615 DBBuyPoint 618 DBTransPointDeal 810 DBAuctionOpen 811 DBAuctionBid 812 DBAuctionList 813 DBAuctionGet 814 DBAuctionTimeout 815 DBAuctionClose 863 DBBattleLoad 864 DBBattleSet 865 DBBattleChallenge 868 DBBattleEnd 871 DBBattleMail 872 DBBattleBonus 3001 PutUser 3002 GetUser 3003 DelUser 3005 GetRole 3006 DelRole 3007 DBCreateRole 3008 DBDeleteRole 3009 DBUndoDeleteRole 3012 PutRoleBase 3013 GetRoleBase 3014 PutRoleStatus 3015 GetRoleStatus 3016 PutRoleEquipment 3017 GetRoleEquipment 3018 PutRoleTask 3019 GetRoleTask 3020 TradeInventory 3021 TradeSave 3022 GetMoneyInventory 3023 PutMoneyInventory 3024 PutRole 3025 GetRoleBaseStatus 3026 PutRoleStorehouse 3027 GetRoleStorehouse 3030 PutRoleForbid 3031 GetRoleForbid 3032 GetUserRoles 3033 GetRoleId 3034 TransactionAcquire 3035 TransactionAbort 3036 TransactionCommit 3043 ClearStorehousePasswd 3044 RenameRole 3047 CanChangeRolename 3049 GetRoleInfo 3050 PutRolePocket 3051 GetRolePocket 3100 DBSetCashPassword 4047 PutSpouse 4251 DBGetMailList 4252 DBGetMail 4253 DBGetMailAttach 4254 DBSetMailAttr 4255 DBSendMail 4256 DBDeleteMail 4600 AddFaction 4601 DelFaction 4602 AddMember 4603 DelMember 4604 UpdateUserFaction 4605 UpdateFaction 4606 GetFactionInfo 4607 GetUserFaction 4608 GetFactionDetail 4609 DBVerifyMaster 4610 DBFactionUpgrade 4611 DBFactionPromote
Типы данных используемых игровой базой:
CUInt (Compact UInt) - особый китайский целочисленный без знаковый тип данных , не фиксированной длины, часто встречается в pw, чаще всего выступает размером чего-либо.
Byte, Int16, Int32, UInt16, UInt32 - при общении с базой для целочисленных переменных она использует little-endian порядок байт [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
]. Если же переменная является частью октета - то здесь напротив прямой порядок байт.Октеты - октеты (массив байт [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
]) в gdb используются для хранения сериализованных другими демонами данными (напр. в GRoleStatus поле multi_exp_ctrl хранится в октетах, т.к. это тип сериализирован gs'ом, игровая база не знает о структуре этого типа). Тело октета выглядит так:Код:CUInt length; //в начале октета идет размер массива байт byte[length] data;//последовательность байт, в том количестве, что указанно в lengthВектор - одномерный массив, индексация которого строго начинается с нуля [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
]. В игровой базе ни раз встречается этот тип данных (прим. GRoleBase->Forbid). Здесь он выполняет роль массива для некоторых типов. Тело вектора:Код:CUint32 length;//Размер вектора T[length] data;//Массив этих типов DateTime - время и дата хранятся в виде UNIX-timestamp (количество секунд прошедших с полуночи 1 января 1970 года [
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация
]). Хранится время в UInt32 (прим. GRoleBase->create_time)TimeSpan - интервал времени, так же хранит количество секунд в UInt32 (прим. GRoleStatus->multi_exp_ctrl->enhance_time)
Строки - строки в gdb сериализованны в виде октетов. Строки хранятся в Unicode'e
©
Вы не можете просматривать ссылку пожалуйста воспользуйтесь следующими ссылками
Вход или Регистрация