商城购买修正

This commit is contained in:
小疯 2022-09-21 16:28:11 +08:00
parent 34af6a1936
commit 627bf43ee3
9 changed files with 220 additions and 211 deletions

View File

@ -2,78 +2,88 @@
#ifndef __GAMEDATAMANAGER_H__
#define __GAMEDATAMANAGER_H__
struct AWARD_ITEM
struct CeraShopBonusCodeType
{
int code_min;
int code_max;
int code_count;
};
struct CeraShopBonusItemType
{
int item_id;
int item_num;
bool is_random;
};
class CGameDataManager
{
public:
SINGLETON_DEFINE_S(CGameDataManager);
CGameDataManager() :
cera_award_begin_id(0),
cera_award_end_id(0)
CGameDataManager()
{
cera_shop_bonus_code_array.clear();
cera_shop_bonus_item_map.Clear();
}
~CGameDataManager() {};
public:
void set_cera_award_begin_id(int id)
bool is_cera_shop_bonus_code(int code_id, CeraShopBonusCodeType* res = NULL)
{
cera_award_begin_id = id;
}
void set_cera_award_end_id(int id)
{
cera_award_end_id = id;
}
int get_cera_award_begin_id()
{
return cera_award_begin_id;
}
int get_cera_award_end_id()
{
return cera_award_end_id;
}
bool add_cera_awarw_item(int count_, int item_id, int item_num)
{
cera_award_item.Push(count_, { item_id ,item_num });
for (size_t i = 0; i < cera_shop_bonus_code_array.size(); i++)
{
CeraShopBonusCodeType cera_shop_bonus_code_ = cera_shop_bonus_code_array.at(i);
if (code_id >= cera_shop_bonus_code_.code_min && code_id <= cera_shop_bonus_code_.code_max)
{
if (res != NULL) *res = cera_shop_bonus_code_;
return true;
}
}
return false;
}
Utils::TMap<int, AWARD_ITEM>* get_cera_award_item_map()
bool get_rand_cera_shop_bonus_item(CeraShopBonusItemType* res = NULL)
{
return &cera_award_item;
int size = get_random_item_num();
for (int i = 0; i < size; i++)
{
int random_value = Utils::Rand(1, size - 1);
CeraShopBonusItemType cera_shop_bonusi_temt = cera_shop_bonus_item_map_rand.Map.at(random_value);
if (cera_shop_bonusi_temt.is_random == true)
{
if (res != NULL) *res = cera_shop_bonusi_temt;
return true;
}
}
return false;
}
void set_cera_award_package_begin_id(int id)
int get_random_item_num()
{
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;
return cera_shop_bonus_item_map_rand.Size();
}
bool add_cera_award_package_item(int count_, int item_id, int item_num)
bool add_cera_shop_bonus_item(int count_, int item_id, int item_num, bool is_random)
{
cera_award_package_item.Push(count_, { item_id ,item_num });
cera_shop_bonus_item_map.Push(count_, { item_id ,item_num ,is_random });
}
Utils::TMap<int, AWARD_ITEM>* get_cera_award_package_item_map()
Utils::TMap<int, CeraShopBonusItemType>* get_cera_shop_bonus_item_map()
{
return &cera_award_package_item;
return &cera_shop_bonus_item_map;
}
std::vector<CeraShopBonusCodeType>* get_cera_shop_bonus_code_array()
{
return &cera_shop_bonus_code_array;
}
Utils::TMap<int, CeraShopBonusItemType>* get_cera_shop_bonus_item_map_rand()
{
return &cera_shop_bonus_item_map_rand;
}
@ -81,13 +91,11 @@ protected:
private:
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<int, AWARD_ITEM> cera_award_item; // 次数 + 数据
Utils::TMap<int, AWARD_ITEM> cera_award_package_item; // 次数 + 数据
std::vector<CeraShopBonusCodeType> cera_shop_bonus_code_array;
Utils::TMap<int, CeraShopBonusItemType> cera_shop_bonus_item_map; // ´ÎÊý + Êý¾Ý
Utils::TMap<int, CeraShopBonusItemType> cera_shop_bonus_item_map_rand; // ´ÎÊý + Êý¾Ý
};

View File

@ -106,6 +106,8 @@ void Controller::init()
HOOK_SETUP(DisPatcher_ReturnToSelectCharacter_dispatch_sig);
HOOK_SETUP(Init);
LOG("Controller::init()");
}
@ -230,7 +232,7 @@ int Controller::hook_DisPatcher_MoveMap_dispatch_sig(void* a1, CUser* pUser, Pac
{
//ENUM_PACK_RET_TYPE ret = CDispatch::Get()->MoveMap_dispatch_sig(a1, pUser, pBuf);
//int result = (ret == PAK_ERROR) ? 1 : 0;
return Get()->old_DisPatcher_MoveMap_dispatch_sig(a1,pUser,pBuf);
return Get()->old_DisPatcher_MoveMap_dispatch_sig(a1, pUser, pBuf);
}
int Controller::hook_Inter_LoadEtc_dispatch_sig(void* a1, CUser* pUser, char* a3)
@ -247,46 +249,8 @@ int Controller::hook_DisPatcher_ReturnToSelectCharacter_dispatch_sig(void* a1, C
void Controller::hook_importCashShopItemList(const std::string* str)
{
if (str == NULL) return;
if (*str == "[start end id]")
{
int item_id_begin_ = ScanInt();
int item_id_end_ = ScanInt();
CGameDataManager::Get()->set_cera_award_begin_id(item_id_begin_);
CGameDataManager::Get()->set_cera_award_end_id(item_id_end_);
}
else if (*str == "[reward 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_awarw_item(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);
}
}
if (str != NULL)
CDispatch::Get()->importCashShopItemList(str);
}
void Controller::hook_ProcessIPG_ResultOutput(CUser* user, int Goods_No, int item_id, int Cera_Type, InterfacePacketBuf* pbuf)
@ -299,3 +263,13 @@ int Controller::hook_Dispatcher_BuyCeraShopItem_dispatch_sig(void* a1, CUser* pU
return 0;
}
bool Controller::hook_Init(int a1, char** a2)
{
auto result = Get()->old_Init(a1, a2);
if (result)
{
CDispatch::Get()->Init_done(a1, (const char**)a2);
}
return result;
}

View File

@ -69,6 +69,9 @@ private:
static void hook_ProcessIPG_ResultOutput(CUser* user, int Goods_No, int item_id, int Cera_Type, InterfacePacketBuf* pbuf);
static int hook_Dispatcher_BuyCeraShopItem_dispatch_sig(void* a1, CUser* pUser, PacketBuf* pBuf);
static bool hook_Init(int a1, char** a2);
private:
INIT_HOOK(IPacketDispatcher_ParamBase_dispatch_template, base::IPacketDispatcher::ParamBase::dispatch_template);
@ -78,6 +81,7 @@ private:
INIT_HOOK(DisPatcher_MoveMap_dispatch_sig, base::DisPatcher_MoveMap::dispatch_sig);
INIT_HOOK(Inter_LoadEtc_dispatch_sig, base::Inter_LoadEtc::dispatch_sig);
INIT_HOOK(DisPatcher_ReturnToSelectCharacter_dispatch_sig, base::DisPatcher_ReturnToSelectCharacter::dispatch_sig);
INIT_HOOK(Init, base::Init);
private:

View File

@ -470,7 +470,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
sizeof(stAvatarEmblemInfo_t);
int avartar_socket_type = JewelSocketData->EmblemSocketData[avartar_socket_slot].slot_type;
LOG("emblem_socket_type :%d avartar_socket_type :%d", emblem_socket_type, avartar_socket_type);
@ -561,133 +561,86 @@ ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser* user, int Goods_No,
if (Cera_Type == 0) //0Êǵãȯ 1ÊÇ´ú±Ò
{
if (Goods_No >= CGameDataManager::Get()->get_cera_award_begin_id() && Goods_No <= CGameDataManager::Get()->get_cera_award_end_id())
CeraShopBonusCodeType cera_shop_bonus_code_;
if (CGameDataManager::Get()->is_cera_shop_bonus_code(Goods_No, &cera_shop_bonus_code_))
{
int cur_purchase_count = 1;
AWARD_ITEM BonusItem;
LOG("Size:%d", CGameDataManager::Get()->get_cera_award_item_map()->Size());
if (CGameDataManager::Get()->get_cera_award_item_map()->Find(cur_purchase_count, &BonusItem))
CeraShopBonusItemType BonusItem;
int cur_purchase_count = cera_shop_bonus_code_.code_count;
if (cur_purchase_count > 0)
{
if (user->getCurCharacR())
if (!CGameDataManager::Get()->get_cera_shop_bonus_item_map()->Find(cur_purchase_count, &BonusItem))
{
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);
}
}
}
}
goto IPG_END;
}
pbuf->put_int(BonusItem.item_id);
pbuf->put_int(BonusItem.item_num);
std::vector <unsigned char> 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))
else
{
if (user->getCurCharacR())
if (!CGameDataManager::Get()->get_rand_cera_shop_bonus_item(&BonusItem))
{
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);
}
}
}
}
goto IPG_END;
}
pbuf->put_int(BonusItem.item_id);
pbuf->put_int(BonusItem.item_num);
std::vector <unsigned char> code;
for (int i = 0; i < 0x30; i++)
{
code.push_back(0x90);
}
//0817964F 0817967F
CMem::WriteBytes((void*)0x0817964F, code.data(), code.size());
return;
}
if (user->getCurCharacR())
{
if (BonusItem.item_num == 0)
{
goto IPG_END;
}
else 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 <unsigned char> code;
for (int i = 0; i < 0x30; i++)
{
code.push_back(0x90);
}
//0817964F 0817967F
CMem::WriteBytes((void*)0x0817964F, code.data(), code.size());
return PAK_OK;
}
}
IPG_END:
std::vector <unsigned char> code = {
0x8B, 0x85, 0x04, 0xFF, 0xFF, 0xFF, 0x89, 0x44, 0x24, 0x04, 0x8D, 0x85, 0x14, 0xFF, 0xFF, 0xFF,
0x89, 0x04, 0x24, 0xE8, 0xD5, 0x22, 0xF5, 0xFF, 0x8B, 0x85, 0x00, 0xFF, 0xFF, 0xFF, 0x89, 0x44,
@ -697,6 +650,62 @@ ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser* user, int Goods_No,
return PAK_OK;
}
ENUM_PACK_RET_TYPE CDispatch::Init_done(int argc, const char** argv)
{
return PAK_OK;
}
ENUM_PACK_RET_TYPE CDispatch::importCashShopItemList(const std::string* str)
{
/**
[cash_shop_bonus_code]
3
10000 10053 0 0
10054 10110 1 1
100178 100180 3 3
[cash_shop_bonus_item]
3
1 3037 10
2 3037 100
3 3037 1000
*/
if (*str == "[cash_shop_bonus_code]")
{
int _total = ScanInt();
for (int i = 0; i < _total; i++)
{
CeraShopBonusCodeType cera_shop_bonus_ = {};
cera_shop_bonus_.code_min = ScanInt();
cera_shop_bonus_.code_max = ScanInt();
cera_shop_bonus_.code_count = ScanInt();
CGameDataManager::Get()->get_cera_shop_bonus_code_array()->push_back(cera_shop_bonus_);
}
}
else if (*str == "[cash_shop_bonus_item]")
{
int _total = ScanInt();
for (int i = 0; i < _total; i++)
{
int index_ = ScanInt();
int item_id = ScanInt();
int item_num = ScanInt();
int is_random = ScanInt();
if (is_random == 1)
{
CGameDataManager::Get()->get_cera_shop_bonus_item_map_rand()->Push(index_, { item_id, item_num, true });
}
CGameDataManager::Get()->add_cera_shop_bonus_item(index_, item_id, item_num, is_random);
}
}
return PAK_OK;
}
void CDispatch::SendMsg(CUser* user, int pack_id, int status, const std::string& str)
{
char out_str[0xff] = {};

View File

@ -41,6 +41,10 @@ public:
ENUM_PACK_RET_TYPE ProcessIPG_ResultOutput(CUser* user, int Goods_No, int item_id, int Cera_Type, InterfacePacketBuf* pbuf);
ENUM_PACK_RET_TYPE Init_done(int argc, const char** argv);
ENUM_PACK_RET_TYPE importCashShopItemList(const std::string* str);
void SendMsg(CUser* user, int pack_id, int status, const std::string& str);
void SendNoti(CUser* user, const std::string& str, NOTI_PACKETMESSAGE_TYPE type = NOTI_SYSTEM);

View File

@ -277,7 +277,7 @@ public:
int open(char* a2, uint a3, char* a4, char* a5, char* a6)
{
return CallT<int>(base::MySQL::open, this, a2, a3, a4, a5, a6);
return CallT<int>(base::MySQL::open2, this, a2, a3, a4, a5, a6);
}
int ping()

View File

@ -52,6 +52,7 @@ public:
return CallT<int>(base::CShutdowManager::SendLastMsgDBQueue, this, a2);
}
//发送关机信号
int SendShutdownSignal()
{
return CallT<int>(base::CShutdowManager::SendShutdownSignal, this);

View File

@ -451,7 +451,7 @@ namespace base
const int is_valid_col = 0x080E22D0;
const int is_valid_data = 0x085F41B2;
const int open = 0x083F3E9E;
const int open = 0x083F4024;
const int open2 = 0x083F4024;
const int ping = 0x083F4514;
const int select = 0x083F4678;
const int select2 = 0x083F4630;

View File

@ -11,6 +11,15 @@
namespace Utils
{
static int Rand(int v_min, int v_max)
{
int rNum = 0;
srand((unsigned int)time(0));
for (int i = 0; i < 31; i++)
rNum |= (rand() & 1) << i;
return v_min + rNum % (v_max - v_min + 1);
}
static void* alloc(size_t len)
{
int fd = open("/dev/zero", O_RDONLY);