修复徽章镶嵌
This commit is contained in:
parent
e41b0f976d
commit
1dc395f164
|
|
@ -104,6 +104,8 @@ void Controller::init()
|
||||||
|
|
||||||
HOOK_SETUP(Inter_LoadEtc_dispatch_sig);
|
HOOK_SETUP(Inter_LoadEtc_dispatch_sig);
|
||||||
|
|
||||||
|
HOOK_SETUP(DisPatcher_ReturnToSelectCharacter_dispatch_sig);
|
||||||
|
|
||||||
LOG("Controller::init()");
|
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)
|
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);
|
//ENUM_PACK_RET_TYPE ret = CDispatch::Get()->MoveMap_dispatch_sig(a1, pUser, pBuf);
|
||||||
int result = (ret == PAK_ERROR) ? 1 : 0;
|
//int result = (ret == PAK_ERROR) ? 1 : 0;
|
||||||
return result;
|
return Get()->old_DisPatcher_MoveMap_dispatch_sig(a1,pUser,pBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int Controller::hook_Inter_LoadEtc_dispatch_sig(void* a1, CUser* pUser, char* a3)
|
int Controller::hook_Inter_LoadEtc_dispatch_sig(void* a1, CUser* pUser, char* a3)
|
||||||
|
|
|
||||||
|
|
@ -377,36 +377,38 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||||
}
|
}
|
||||||
|
|
||||||
//获取时装道具
|
//获取时装道具
|
||||||
CInventory* inven = user->getCurCharacInvenW();
|
CInventory* CurCharacInvenW = user->getCurCharacInvenW();
|
||||||
if (!inven)
|
if (!CurCharacInvenW)
|
||||||
{
|
{
|
||||||
LOG("pUser->getCurCharacInvenW : error \n");
|
LOG("pUser->getCurCharacInvenW : error \n");
|
||||||
return PAK_IGNORE;
|
return PAK_IGNORE;
|
||||||
}
|
}
|
||||||
Inven_Item* avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
|
Inven_Item* avartar_inven_item = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
|
||||||
if (!avartar)
|
if (!avartar_inven_item)
|
||||||
{
|
{
|
||||||
LOG("inven->GetInvenRef : error \n");
|
LOG("inven->GetInvenRef : error \n");
|
||||||
return PAK_IGNORE;
|
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");
|
LOG("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
|
||||||
return PAK_IGNORE;
|
return PAK_IGNORE;
|
||||||
}
|
}
|
||||||
//获取时装插槽数据
|
//获取时装插槽数据
|
||||||
WongWork::CAvatarItemMgr* avartar_add_info = (WongWork::CAvatarItemMgr*)avartar->get_add_info();
|
auto avartar_add_info = avartar_inven_item->get_add_info();
|
||||||
WongWork::CAvatarItemMgr* inven_avartar_mgr = inven->GetAvatarItemMgrR();
|
auto inven_avartar_mgr = (WongWork::CAvatarItemMgr*)CurCharacInvenW->GetAvatarItemMgrW();
|
||||||
int jewel_socket_data = inven_avartar_mgr->getJewelSocketData(avartar_add_info);
|
|
||||||
if (!jewel_socket_data)
|
stAvatarEmblemInfo_t* JewelSocketData = (stAvatarEmblemInfo_t*)inven_avartar_mgr->getJewelSocketData(avartar_add_info);
|
||||||
|
|
||||||
|
if (!JewelSocketData)
|
||||||
{
|
{
|
||||||
LOG("jewel_socket_data : error \n");
|
LOG("jewel_socket_data : error \n");
|
||||||
return PAK_IGNORE;
|
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)
|
if (emblem_cnt <= 3)
|
||||||
{
|
{
|
||||||
std::map<int, std::pair<int, int>> emblems;
|
std::map<int, std::pair<int, int>> emblems;
|
||||||
|
|
@ -422,8 +424,10 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||||
char avartar_socket_slot = 0;
|
char avartar_socket_slot = 0;
|
||||||
pBuf->get_byte(&avartar_socket_slot);
|
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))
|
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();
|
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))
|
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);
|
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);
|
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);
|
|
||||||
|
|
||||||
//设置时装插槽数据
|
LOG("jewel_socket_data 2:%s \n", Utils::ToHexString((const unsigned char*)JewelSocketData, 30).c_str());
|
||||||
int emblem_item_id = avartar_socket_slot.second.second;
|
|
||||||
*(int*)(jewel_socket_data + avartar_socket_slot.first * 6 + 2) = emblem_item_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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);
|
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);
|
packet_guard->finalize(1);
|
||||||
user->Send((PacketGuard*)packet_guard);
|
user->Send((PacketGuard*)packet_guard);
|
||||||
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
|
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
|
||||||
SendNoti(user, u8"已完成徽章镶嵌");
|
SendNoti(user, "ÒÑÍê³É»ÕÕÂÏâǶ");
|
||||||
return PAK_OK;
|
return PAK_OK;
|
||||||
}
|
}
|
||||||
return PAK_IGNORE;
|
return PAK_IGNORE;
|
||||||
|
|
|
||||||
|
|
@ -17,12 +17,18 @@ public:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
//获取时装管理器
|
//获取时装管理器
|
||||||
WongWork::CAvatarItemMgr* GetAvatarItemMgrR()
|
int GetAvatarItemMgrR()
|
||||||
{
|
{
|
||||||
typedef WongWork::CAvatarItemMgr* (*__func)(void* a1);
|
typedef int (*__func)(void* a1);
|
||||||
return ((__func)base::CInventory::GetAvatarItemMgrR)(this);
|
return ((__func)base::CInventory::GetAvatarItemMgrR)(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int GetAvatarItemMgrW()
|
||||||
|
{
|
||||||
|
return CallT<int>(base::CInventory::GetAvatarItemMgrW, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int delete_item(INVEN_TYPE a2, int pos, int num, int a5, int a6 = 1)
|
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);
|
typedef int (*__func)(CInventory* a1, INVEN_TYPE a2, int a3, int a4, int a5, int a6);
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,12 @@ public:
|
||||||
return CallT<int>(base::CEquipItem::GetItemType, this);
|
return CallT<int>(base::CEquipItem::GetItemType, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int getAvatarSocket(int a2, stAvatarEmblemInfo_t* a3)
|
||||||
|
{
|
||||||
|
return CallT<int>(base::CEquipItem::getAvatarSocket, this, a2, a3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class Inven_Item
|
class Inven_Item
|
||||||
|
|
@ -267,11 +273,6 @@ public:
|
||||||
return ((__func)base::Inven_Item::isEquipableItemType)(this);
|
return ((__func)base::Inven_Item::isEquipableItemType)(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int get_ui_id()
|
|
||||||
{
|
|
||||||
return *(int*)(this + 0x7);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IsTradeLimitAttachTypeItem()
|
bool IsTradeLimitAttachTypeItem()
|
||||||
{
|
{
|
||||||
return CallT<bool>(base::Inven_Item::IsTradeLimitAttachTypeItem, this);
|
return CallT<bool>(base::Inven_Item::IsTradeLimitAttachTypeItem, this);
|
||||||
|
|
@ -300,8 +301,7 @@ class DB_UpdateAvatarJewelSlot
|
||||||
public:
|
public:
|
||||||
static int makeRequest(int a1, unsigned int a2, void* src)
|
static int makeRequest(int a1, unsigned int a2, void* src)
|
||||||
{
|
{
|
||||||
typedef int (*__func)(int a1, unsigned int a2, void* src);
|
return CallT<int>(base::DB_UpdateAvatarJewelSlot::makeRequest, a1, a2, src);
|
||||||
return ((__func)base::DB_UpdateAvatarJewelSlot::makeRequest)(a1, a2, src);
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ class CSystemTime
|
||||||
public:
|
public:
|
||||||
static CSystemTime* G_CSystemTime(void)
|
static CSystemTime* G_CSystemTime(void)
|
||||||
{
|
{
|
||||||
return *(CSystemTime**)base::GlobalData::s_systemTime_;
|
return (CSystemTime*)base::GlobalData::s_systemTime_;
|
||||||
}
|
}
|
||||||
|
|
||||||
CSystemTime()
|
CSystemTime()
|
||||||
|
|
|
||||||
|
|
@ -195,6 +195,12 @@ namespace base
|
||||||
namespace CEquipItem
|
namespace CEquipItem
|
||||||
{
|
{
|
||||||
const int GetItemType = 0x08514D26;
|
const int GetItemType = 0x08514D26;
|
||||||
|
const int getAvatarSocket = 0x08150F36;
|
||||||
|
}
|
||||||
|
|
||||||
|
namespace stAvatarEmblemInfo_t
|
||||||
|
{
|
||||||
|
const int init = 0x081506E8;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace Inven_Item
|
namespace Inven_Item
|
||||||
|
|
@ -219,6 +225,8 @@ namespace base
|
||||||
namespace CInventory
|
namespace CInventory
|
||||||
{
|
{
|
||||||
const int GetAvatarItemMgrR = 0x80DD576;
|
const int GetAvatarItemMgrR = 0x80DD576;
|
||||||
|
const int GetAvatarItemMgrW = 0x08110C6C;
|
||||||
|
|
||||||
const int delete_item = 0x850400C;
|
const int delete_item = 0x850400C;
|
||||||
const int use_money = 0x84FF54C;
|
const int use_money = 0x84FF54C;
|
||||||
const int gain_money = 0x84FF29C;
|
const int gain_money = 0x84FF29C;
|
||||||
|
|
@ -360,6 +368,7 @@ namespace base
|
||||||
namespace CAvatarItemMgr
|
namespace CAvatarItemMgr
|
||||||
{
|
{
|
||||||
const int getJewelSocketData = 0x82F98F8;
|
const int getJewelSocketData = 0x82F98F8;
|
||||||
|
const int setEmblemSocketData = 0x082F91CE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -37,7 +37,7 @@ class PacketBuf;
|
||||||
class PacketGuard;
|
class PacketGuard;
|
||||||
class InterfacePacketBuf;
|
class InterfacePacketBuf;
|
||||||
class Dispatcher_ModItemAttr;
|
class Dispatcher_ModItemAttr;
|
||||||
|
class stAvatarEmblemInfo_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -95,11 +95,17 @@ namespace WongWork
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
//获取时装插槽数据
|
//获取时装插槽数据
|
||||||
int getJewelSocketData(WongWork::CAvatarItemMgr* a2)
|
int getJewelSocketData(int a2)
|
||||||
{
|
{
|
||||||
typedef int (*__func)(WongWork::CAvatarItemMgr* a1, void* a2);
|
return CallT<int>(base::WongWork::CAvatarItemMgr::getJewelSocketData, this, a2);
|
||||||
return ((__func)base::WongWork::CAvatarItemMgr::getJewelSocketData)(this, a2);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int setEmblemSocketData(int a2, stAvatarEmblemInfo_t * a3)
|
||||||
|
{
|
||||||
|
return CallT<int>(base::WongWork::CAvatarItemMgr::setEmblemSocketData, this, a2, a3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class CHackAnalyzer
|
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<int>(base::stAvatarEmblemInfo_t::init, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
class cUserHistoryLog
|
class cUserHistoryLog
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue