From 1dc395f16481a148daa0ccc33593ede09a04a32e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E7=96=AF?= <2240031003@qq.com> Date: Sat, 17 Sep 2022 00:49:27 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=BD=E7=AB=A0=E9=95=B6?= =?UTF-8?q?=E5=B5=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/controller.cpp | 8 +++--- src/dispatch.cpp | 59 +++++++++++++++++++++++++------------------- src/sdk/Inventory.h | 10 ++++++-- src/sdk/Item.h | 14 +++++------ src/sdk/SystemTime.h | 2 +- src/sdk/base.h | 9 +++++++ src/sdk/sdk_class.h | 35 +++++++++++++++++++++++--- 7 files changed, 95 insertions(+), 42 deletions(-) diff --git a/src/controller.cpp b/src/controller.cpp index 3a8f628..bc4ffdc 100644 --- a/src/controller.cpp +++ b/src/controller.cpp @@ -104,6 +104,8 @@ void Controller::init() HOOK_SETUP(Inter_LoadEtc_dispatch_sig); + HOOK_SETUP(DisPatcher_ReturnToSelectCharacter_dispatch_sig); + LOG("Controller::init()"); } @@ -226,9 +228,9 @@ int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* us int Controller::hook_DisPatcher_MoveMap_dispatch_sig(void* a1, CUser* pUser, PacketBuf* pBuf) { - ENUM_PACK_RET_TYPE ret = CDispatch::Get()->MoveMap_dispatch_sig(a1, pUser, pBuf); - int result = (ret == PAK_ERROR) ? 1 : 0; - return result; + //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); } int Controller::hook_Inter_LoadEtc_dispatch_sig(void* a1, CUser* pUser, char* a3) diff --git a/src/dispatch.cpp b/src/dispatch.cpp index 9a0b9f9..5c89d36 100644 --- a/src/dispatch.cpp +++ b/src/dispatch.cpp @@ -267,10 +267,10 @@ ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_Mod CEquipItem* equipment_item = (CEquipItem*)CDataManager::G_CDataManager()->find_item(equipment_id); LOG("(*(int(**)(CItem*))(*(_DWORD*)equipment_item + 12)) :%p %p" - + , (*(int(**)(CItem*))(*(_DWORD*)equipment_item + 12)) , ((int(**)(CItem*))(*(_DWORD*)equipment_item + 12)) - + ); if (!equipment_item) @@ -377,36 +377,38 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, } //获取时装道具 - CInventory* inven = user->getCurCharacInvenW(); - if (!inven) + CInventory* CurCharacInvenW = user->getCurCharacInvenW(); + if (!CurCharacInvenW) { LOG("pUser->getCurCharacInvenW : error \n"); return PAK_IGNORE; } - Inven_Item* avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot); - if (!avartar) + Inven_Item* avartar_inven_item = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot); + if (!avartar_inven_item) { LOG("inven->GetInvenRef : error \n"); return PAK_IGNORE; } //校验时装 数据是否合法 - if (avartar->isEmpty() || (avartar->getKey() != avartar_item_id) || user->CheckItemLock(2, avartar_inven_slot)) + if (avartar_inven_item->isEmpty() || (avartar_inven_item->getKey() != avartar_item_id) || user->CheckItemLock(2, avartar_inven_slot)) { LOG("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n"); return PAK_IGNORE; } //获取时装插槽数据 - WongWork::CAvatarItemMgr* avartar_add_info = (WongWork::CAvatarItemMgr*)avartar->get_add_info(); - WongWork::CAvatarItemMgr* inven_avartar_mgr = inven->GetAvatarItemMgrR(); - int jewel_socket_data = inven_avartar_mgr->getJewelSocketData(avartar_add_info); - if (!jewel_socket_data) + auto avartar_add_info = avartar_inven_item->get_add_info(); + auto inven_avartar_mgr = (WongWork::CAvatarItemMgr*)CurCharacInvenW->GetAvatarItemMgrW(); + + stAvatarEmblemInfo_t* JewelSocketData = (stAvatarEmblemInfo_t*)inven_avartar_mgr->getJewelSocketData(avartar_add_info); + + if (!JewelSocketData) { LOG("jewel_socket_data : error \n"); return PAK_IGNORE; } - LOG("jewel_socket_data :%s \n", Utils::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str()); + LOG("jewel_socket_data 1:%s \n", Utils::ToHexString((const unsigned char*)JewelSocketData, 30).c_str()); if (emblem_cnt <= 3) { std::map> emblems; @@ -422,8 +424,10 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, char avartar_socket_slot = 0; pBuf->get_byte(&avartar_socket_slot); + LOG("emblem_inven_slot :%d emblem_item_id :%d avartar_socket_slot :%d", emblem_inven_slot, emblem_item_id, avartar_socket_slot); + //获取徽章道具 - Inven_Item* emblem = inven->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, emblem_inven_slot); + Inven_Item* emblem = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, emblem_inven_slot); //校验徽章及插槽数据是否合法 if (emblem->isEmpty() || (emblem->getKey() != emblem_item_id) || (avartar_socket_slot >= 3)) { @@ -461,8 +465,15 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, //获取徽章支持的插槽 int emblem_socket_type = citem->getJewelTargetSocket(); + //01 00 C4 25 26 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 //获取要镶嵌的时装插槽类型 - int avartar_socket_type = *(short*)(jewel_socket_data + avartar_socket_slot * 6); + + 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); if (!(emblem_socket_type & avartar_socket_type)) { //插槽类型不匹配 @@ -472,21 +483,19 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, } LOG("avartar_socket_slot:%d emblem_inven_slot:%d emblem_item_id:%d\n", avartar_socket_slot, emblem_inven_slot, emblem_item_id); emblems[avartar_socket_slot] = std::make_pair(emblem_inven_slot, emblem_item_id); + + if (CurCharacInvenW->delete_item(CInventory::INVENTORY_TYPE_ITEM, emblem_inven_slot, 1, 8, 1)) + { + JewelSocketData->EmblemSocketData[avartar_socket_slot].slot_item_id = emblem_item_id; + } } - for (auto& avartar_socket_slot : emblems) - { - //删除徽章 - int emblem_inven_slot = avartar_socket_slot.second.first; - inven->delete_item(CInventory::INVENTORY_TYPE_ITEM, emblem_inven_slot, 1, 8, 1); - //设置时装插槽数据 - int emblem_item_id = avartar_socket_slot.second.second; - *(int*)(jewel_socket_data + avartar_socket_slot.first * 6 + 2) = emblem_item_id; - } + LOG("jewel_socket_data 2:%s \n", Utils::ToHexString((const unsigned char*)JewelSocketData, 30).c_str()); + inven_avartar_mgr->setEmblemSocketData(avartar_add_info, JewelSocketData); //时装插槽数据存档 - DB_UpdateAvatarJewelSlot::makeRequest(user->getCurCharacNo(), avartar->get_ui_id(), (void*)jewel_socket_data); + DB_UpdateAvatarJewelSlot::makeRequest(user->getCurCharacNo(), (unsigned int)avartar_add_info, (void*)JewelSocketData); //通知客户端时装数据已更新 user->SendUpdateItemList(1, 1, avartar_inven_slot); @@ -498,7 +507,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, packet_guard->finalize(1); user->Send((PacketGuard*)packet_guard); PacketGuard::DelPacketGuard((PacketGuard*)packet_guard); - SendNoti(user, u8"已完成徽章镶嵌"); + SendNoti(user, "已完成徽章镶嵌"); return PAK_OK; } return PAK_IGNORE; diff --git a/src/sdk/Inventory.h b/src/sdk/Inventory.h index 1a4a896..7a68190 100644 --- a/src/sdk/Inventory.h +++ b/src/sdk/Inventory.h @@ -17,12 +17,18 @@ public: public: //获取时装管理器 - WongWork::CAvatarItemMgr* GetAvatarItemMgrR() + int GetAvatarItemMgrR() { - typedef WongWork::CAvatarItemMgr* (*__func)(void* a1); + typedef int (*__func)(void* a1); return ((__func)base::CInventory::GetAvatarItemMgrR)(this); } + int GetAvatarItemMgrW() + { + return CallT(base::CInventory::GetAvatarItemMgrW, this); + } + + int delete_item(INVEN_TYPE a2, int pos, int num, int a5, int a6 = 1) { typedef int (*__func)(CInventory* a1, INVEN_TYPE a2, int a3, int a4, int a5, int a6); diff --git a/src/sdk/Item.h b/src/sdk/Item.h index a366cee..61bc434 100644 --- a/src/sdk/Item.h +++ b/src/sdk/Item.h @@ -231,6 +231,12 @@ public: return CallT(base::CEquipItem::GetItemType, this); } + int getAvatarSocket(int a2, stAvatarEmblemInfo_t* a3) + { + return CallT(base::CEquipItem::getAvatarSocket, this, a2, a3); + } + + }; class Inven_Item @@ -267,11 +273,6 @@ public: return ((__func)base::Inven_Item::isEquipableItemType)(this); } - int get_ui_id() - { - return *(int*)(this + 0x7); - } - bool IsTradeLimitAttachTypeItem() { return CallT(base::Inven_Item::IsTradeLimitAttachTypeItem, this); @@ -300,8 +301,7 @@ class DB_UpdateAvatarJewelSlot public: static int makeRequest(int a1, unsigned int a2, void* src) { - typedef int (*__func)(int a1, unsigned int a2, void* src); - return ((__func)base::DB_UpdateAvatarJewelSlot::makeRequest)(a1, a2, src); + return CallT(base::DB_UpdateAvatarJewelSlot::makeRequest, a1, a2, src); } }; diff --git a/src/sdk/SystemTime.h b/src/sdk/SystemTime.h index 4bc3592..79d32ae 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::GlobalData::s_systemTime_; + return (CSystemTime*)base::GlobalData::s_systemTime_; } CSystemTime() diff --git a/src/sdk/base.h b/src/sdk/base.h index 45d165d..0a84b38 100644 --- a/src/sdk/base.h +++ b/src/sdk/base.h @@ -195,6 +195,12 @@ namespace base namespace CEquipItem { const int GetItemType = 0x08514D26; + const int getAvatarSocket = 0x08150F36; + } + + namespace stAvatarEmblemInfo_t + { + const int init = 0x081506E8; } namespace Inven_Item @@ -219,6 +225,8 @@ namespace base namespace CInventory { const int GetAvatarItemMgrR = 0x80DD576; + const int GetAvatarItemMgrW = 0x08110C6C; + const int delete_item = 0x850400C; const int use_money = 0x84FF54C; const int gain_money = 0x84FF29C; @@ -360,6 +368,7 @@ namespace base namespace CAvatarItemMgr { const int getJewelSocketData = 0x82F98F8; + const int setEmblemSocketData = 0x082F91CE; } } diff --git a/src/sdk/sdk_class.h b/src/sdk/sdk_class.h index b02303d..a1caae3 100644 --- a/src/sdk/sdk_class.h +++ b/src/sdk/sdk_class.h @@ -37,7 +37,7 @@ class PacketBuf; class PacketGuard; class InterfacePacketBuf; class Dispatcher_ModItemAttr; - +class stAvatarEmblemInfo_t; @@ -95,11 +95,17 @@ namespace WongWork { public: //鑾峰彇鏃惰鎻掓Ы鏁版嵁 - int getJewelSocketData(WongWork::CAvatarItemMgr* a2) + int getJewelSocketData(int a2) { - typedef int (*__func)(WongWork::CAvatarItemMgr* a1, void* a2); - return ((__func)base::WongWork::CAvatarItemMgr::getJewelSocketData)(this, a2); + return CallT(base::WongWork::CAvatarItemMgr::getJewelSocketData, this, a2); } + + int setEmblemSocketData(int a2, stAvatarEmblemInfo_t * a3) + { + return CallT(base::WongWork::CAvatarItemMgr::setEmblemSocketData, this, a2, a3); + } + + }; class CHackAnalyzer @@ -131,6 +137,27 @@ public: }; + +struct EmblemInfo +{ + unsigned short slot_type; + unsigned int slot_item_id; +}; + +struct stAvatarEmblemInfo_t +{ +public: + EmblemInfo EmblemSocketData[0x05]; + +public: + int init() + { + return CallT(base::stAvatarEmblemInfo_t::init, this); + } + + +}; + class cUserHistoryLog { public: