diff --git a/src/GameDataManager.h b/src/GameDataManager.h index 3a10a40..08548c6 100644 --- a/src/GameDataManager.h +++ b/src/GameDataManager.h @@ -47,13 +47,47 @@ public: return &cera_award_item; } + + + void set_cera_award_package_begin_id(int id) + { + cera_award_package_begin_id = id; + } + void set_cera_award_package_end_id(int id) + { + cera_award_package_end_id = id; + } + int get_cera_award_package_begin_id() + { + return cera_award_package_begin_id; + } + int get_cera_award_package_end_id() + { + return cera_award_package_end_id; + } + + bool add_cera_award_package_item(int count_, int item_id, int item_num) + { + cera_award_package_item.Push(count_, { item_id ,item_num }); + } + + Utils::TMap* get_cera_award_package_item_map() + { + return &cera_award_package_item; + } + + protected: private: - int cera_award_begin_id; //商城奖励开始id - int cera_award_end_id; //商城奖励结束id + int cera_award_begin_id; //商城奖励开始id + int cera_award_end_id; //商城奖励结束id + int cera_award_package_begin_id; //商城礼包奖励开始id + int cera_award_package_end_id; //商城礼包奖励结束id + Utils::TMap cera_award_item; // 次数 + 数据 + Utils::TMap cera_award_package_item; // 次数 + 数据 }; diff --git a/src/controller.cpp b/src/controller.cpp index ced11c0..3a8f628 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -245,7 +245,6 @@ int Controller::hook_DisPatcher_ReturnToSelectCharacter_dispatch_sig(void* a1, C void Controller::hook_importCashShopItemList(const std::string* str) { - LOG("hook_importCashShopItemList :%s", str->c_str()); if (str == NULL) return; if (*str == "[start end id]") { @@ -254,23 +253,37 @@ void Controller::hook_importCashShopItemList(const std::string* str) CGameDataManager::Get()->set_cera_award_begin_id(item_id_begin_); CGameDataManager::Get()->set_cera_award_end_id(item_id_end_); - LOG("hook_importCashShopItemList item_id_begin_ :%d item_id_end_ :%d", item_id_begin_, item_id_end_); } else if (*str == "[reward item]") { int _total = ScanInt(); - LOG("hook_importCashShopItemList _total :%d", _total); for (int i = 0; i < _total; i++) { int count_ = ScanInt(); int item_id = ScanInt(); int item_num = ScanInt(); CGameDataManager::Get()->add_cera_awarw_item(count_, item_id, item_num); - LOG("hook_importCashShopItemList count_ :%d item_id :%d item_num :%d", count_, item_id, item_num); } } + else if (*str == "[start end package]") + { + int item_id_begin_ = ScanInt(); + int item_id_end_ = ScanInt(); - + CGameDataManager::Get()->set_cera_award_package_begin_id(item_id_begin_); + CGameDataManager::Get()->set_cera_award_package_end_id(item_id_end_); + } + else if (*str == "[package item]") + { + int _total = ScanInt(); + for (int i = 0; i < _total; i++) + { + int count_ = ScanInt(); + int item_id = ScanInt(); + int item_num = ScanInt(); + CGameDataManager::Get()->add_cera_award_package_item(count_, item_id, item_num); + } + } } @@ -334,6 +347,68 @@ void Controller::hook_ProcessIPG_ResultOutput(CUser* user, int Goods_No, int ite pbuf->put_int(BonusItem.item_id); pbuf->put_int(BonusItem.item_num); + std::vector code; + for (int i = 0; i < 0x30; i++) + { + code.push_back(0x90); + } + //0817964F 0817967F + CMem::WriteBytes((void*)0x0817964F, code.data(), code.size()); + return; + } + } + else if (Goods_No >= CGameDataManager::Get()->get_cera_award_package_begin_id() && Goods_No <= CGameDataManager::Get()->get_cera_award_package_end_id()) + { + int cur_purchase_count = 1; + AWARD_ITEM BonusItem; + LOG("Size:%d", CGameDataManager::Get()->get_cera_award_package_item_map()->Size()); + if (CGameDataManager::Get()->get_cera_award_package_item_map()->Find(cur_purchase_count, &BonusItem)) + { + if (user->getCurCharacR()) + { + if (BonusItem.item_id == 1) + { + WongWork::CCeraShop::G_CCeraShop()->_processCoin(user, BonusItem.item_num, 0); + } + else + { + auto item = CDataManager::G_CDataManager()->find_item(BonusItem.item_id); + if (item) + { + //if (item->is_stackable() + // && ((*(int(**)(CItem*))(*(_DWORD*)item + 12))(item) == 16 // GetItemType + // || (*(int(**)(CItem*))(*(_DWORD*)item + 12))(item) == 34)) // GetItemType + { + int inserted = -1; + Inven_Item v60 = {}; + *(_DWORD*)((char*)&v60 + 2) = BonusItem.item_id; + *(_DWORD*)((char*)&v60 + 7) = BonusItem.item_num; + + (*(void(**)(CItem*, Inven_Item*))(*(_DWORD*)item + 8))(item, &v60); + + auto CurCharacInvenW = user->getCurCharacInvenW(); + + inserted = CurCharacInvenW->insertItemIntoInventory(v60, 15, 1, 0); + if (inserted == -1) + { + auto CurCharacNo = user->getCurCharacNo(); + + ((WongWork::CMailBoxHelper*)(user))->ReqDBSendNewMailCashShop(&v60, 0, CurCharacNo, 1, 0, 0); + + } + else + { + user->SendUpdateItemList(1, 0, inserted); + } + } + + } + } + } + + pbuf->put_int(BonusItem.item_id); + pbuf->put_int(BonusItem.item_num); + std::vector code; for (int i = 0; i < 0x30; i++) { diff --git a/src/sdk/DBMgr.h b/src/sdk/DBMgr.h new file mode 100644 index 0000000..aac359e --- /dev/null +++ b/src/sdk/DBMgr.h @@ -0,0 +1,99 @@ +#pragma once +#ifndef __DBMGR_H__ +#define __DBMGR_H__ + + +class DBMgr +{ +public: + unsigned char UnknownData_NULL[0x38]; + +public: + + static DBMgr* G_CDBMgr() + { + return *(DBMgr**)base::GlobalData::s_db_mgr; + } + + int setUserIdx(int a2) + { + return CallT(base::DBMgr::setUserIdx, this, a2); + } + + int activateGlobalDB() + { + return CallT(base::DBMgr::activateGlobalDB, this); + } + + DBMgr() + { + CallT(base::DBMgr::DBMgr_make, this); + } + + ~DBMgr() + { + CallT(base::DBMgr::DBMgr_destroy, this); + } + + int Open(int a2, char* a3, char* a4, char* a5, char* a6, int a7) + { + return CallT(base::DBMgr::Open, this, a2, a3, a4, a5, a6, a7); + } + + int Open_2(int a2, char* a3, uint a4, char* a5, char* a6, char* a7, int a8) + { + return CallT(base::DBMgr::Open_2, this, a2, a3, a4, a5, a6, a7, a8); + } + + int Close() + { + return CallT(base::DBMgr::Close, this); + } + + int Close_2(int a2) + { + return CallT(base::DBMgr::Close_2, this, a2); + } + + int GetServerType(int a2) + { + return CallT(base::DBMgr::GetServerType, this, a2); + } + + int addUserDBInfo(int a2, int* a3) + { + return CallT(base::DBMgr::addUserDBInfo, this, a2, a3); + } + + int removeUserDBInfo(int a2) + { + return CallT(base::DBMgr::removeUserDBInfo, this, a2); + } + + int GetDBHandleServerGroup(int a2, int a3) + { + return CallT(base::DBMgr::GetDBHandleServerGroup, this, a2, a3); + } + + int SetQueryCounterPointer(int* a2) //CQueryCounter* + { + return CallT(base::DBMgr::SetQueryCounterPointer, this, a2); + } + + int GetDBHandle(int a2, int a3) + { + return CallT(base::DBMgr::GetDBHandle, this, a2, a3); + } + + int isActiveGlobalDB() + { + return CallT(base::DBMgr::isActiveGlobalDB, this); + } + + + +}; + + +#endif // __DBMGR_H__ + diff --git a/src/sdk/MySQL.h b/src/sdk/MySQL.h new file mode 100644 index 0000000..158924a --- /dev/null +++ b/src/sdk/MySQL.h @@ -0,0 +1,17 @@ +#pragma once +#include "stdarg.h" +#ifndef __MYSQL_H__ +#define __MYSQL_H__ + + +class MySQL +{ +public: + + + +}; + + +#endif // __MYSQL_H__ + diff --git a/src/sdk/ShutdowManager.h b/src/sdk/ShutdowManager.h new file mode 100644 index 0000000..c8f7d78 --- /dev/null +++ b/src/sdk/ShutdowManager.h @@ -0,0 +1,71 @@ +#pragma once +#ifndef __SHUTDOWMANAGER_H__ +#define __SHUTDOWMANAGER_H__ + + +class CShutdowManager +{ +public: + + static CShutdowManager* G_CShutdowManager() + { + return CallT(base::CShutdowManager::GetInstanceShutdowManager); + } + + CShutdowManager() + { + CallT(base::CShutdowManager::CShutdowManager_make, this); + } + + int EnableShutdown(bool a2) + { + return CallT(base::CShutdowManager::EnableShutdown, this, a2); + } + + int GetLastMsgCount() + { + return CallT(base::CShutdowManager::GetLastMsgCount, this); + } + + int GetLastMsgResponseCount() + { + return CallT(base::CShutdowManager::GetLastMsgResponseCount, this); + } + + int IncrementLastMsgResponseCount() + { + return CallT(base::CShutdowManager::IncrementLastMsgResponseCount, this); + } + + int OnAllUserLogout() + { + return CallT(base::CShutdowManager::OnAllUserLogout, this); + } + + int Reset() + { + return CallT(base::CShutdowManager::Reset, this); + } + + int SendLastMsgDBQueue(CUser* a2) + { + return CallT(base::CShutdowManager::SendLastMsgDBQueue, this, a2); + } + + int SendShutdownSignal() + { + return CallT(base::CShutdowManager::SendShutdownSignal, this); + } + + int WaitUntilExitThread() + { + return CallT(base::CShutdowManager::WaitUntilExitThread, this); + } + + + +}; + + +#endif // __SHUTDOWMANAGER_H__ + diff --git a/src/sdk/SystemTime.h b/src/sdk/SystemTime.h index 7e7ad53..4bc3592 100644 --- a/src/sdk/SystemTime.h +++ b/src/sdk/SystemTime.h @@ -9,7 +9,7 @@ class CSystemTime public: static CSystemTime* G_CSystemTime(void) { - return *(CSystemTime**)base::CSystemTime::s_systemTime_; + return *(CSystemTime**)base::GlobalData::s_systemTime_; } CSystemTime() diff --git a/src/sdk/base.h b/src/sdk/base.h index ecb61d4..45d165d 100644 --- a/src/sdk/base.h +++ b/src/sdk/base.h @@ -32,7 +32,6 @@ namespace base namespace CSystemTime { - const int s_systemTime_ = 0x0941F714; const int getCurSec = 0x080CBC9E; const int getCurTickCount = 0x081458AC; const int getCurDate = 0x0823445E; @@ -77,9 +76,27 @@ namespace base //base - const int s_pSecuProtectionField = 0x0941F7CC; - const int s_pItemVendingMachine = 0x0941F760; + const int s_pSecuProtectionField = 0x0941F7CC; //0x18 + const int s_pItemVendingMachine = 0x0941F760; //0x20 + const int s_db_mgr = 0x0940BDAC; //0x38 + const int s_pCeraShop = 0x0941F744; //0x8 + const int s_pLogGameChannel = 0x0941F740; //0x10 + const int s_systemTime_ = 0x0941F714; + } + namespace CShutdowManager + { + const int CShutdowManager_make = 0x082A6FA8; + const int EnableShutdown = 0x082A6F70; + const int GetLastMsgCount = 0x084ED1FE; + const int GetLastMsgResponseCount = 0x084ED20A; + const int IncrementLastMsgResponseCount = 0x084ED1EA; + const int OnAllUserLogout = 0x082A36BC; + const int Reset = 0x082A6F88; + const int SendLastMsgDBQueue = 0x082A37C8; + const int SendShutdownSignal = 0x082A35A6; + const int WaitUntilExitThread = 0x082A396E; + const int GetInstanceShutdowManager = 0x082A6FBB; } namespace CParty @@ -346,6 +363,33 @@ namespace base } } + namespace DBMgr + { + const int setUserIdx = 0x0818FB1A; + const int activateGlobalDB = 0x082A420C; + const int DBMgr_make = 0x083F48DE; + const int DBMgr_destroy = 0x083F4A1C; + const int Open = 0x083F4BC4; + const int Open_2 = 0x083F4D2E; + const int Close = 0x083F4EA6; + const int Close_2 = 0x083F4EE0; + const int GetServerType = 0x083F4F10; + const int addUserDBInfo = 0x083F4F9E; + const int removeUserDBInfo = 0x083F5038; + const int GetDBHandleServerGroup = 0x083F506C; + const int SetQueryCounterPointer = 0x083F5150; + const int GetDBHandle = 0x083F523E; + const int isActiveGlobalDB = 0x083F533C; + + } + + namespace MySQL + { + + + } + + namespace CGM_Manager { const int isGM = 0x0829948C; diff --git a/src/sdk/sdk_class.h b/src/sdk/sdk_class.h index 91a38a3..b02303d 100644 --- a/src/sdk/sdk_class.h +++ b/src/sdk/sdk_class.h @@ -5,6 +5,7 @@ #include "ida_sdk.h" #include + template R CallT(A call_addr, const ARG ... arguments) { if (!call_addr) @@ -161,6 +162,9 @@ public: #include "Inventory.h" #include "PacketBuf.h" #include "SystemTime.h" +#include "DBMgr.h" +#include "MySQL.h" +#include "ShutdowManager.h" inline int ScanInt(bool* a2 = NULL) {