修复徽章镶嵌
This commit is contained in:
@@ -39,8 +39,8 @@ void Controller::init()
|
||||
08179043 0x1 97 B8
|
||||
0817904E 0x1 8C AD
|
||||
*/
|
||||
Mem::WriteUChar((void*)(0x08179043), 0xB8); //异界被击
|
||||
Mem::WriteUChar((void*)(0x0817904E), 0xAD); //异界被击
|
||||
Mem::WriteUChar((void*)(0x08179043), 0xB8);
|
||||
Mem::WriteUChar((void*)(0x0817904E), 0xAD);
|
||||
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@ void Controller::init()
|
||||
|
||||
mhook_UseJewel_dispatch_sig.Hook((void**)&old_UseJewel_dispatch_sig, (void*)hook_UseJewel_dispatch_sig);
|
||||
|
||||
mhook_UseJewel_dispatch_sig.Hook((void**)&old_Dispatcher_ModItemAttr_dispatch_sig, (void*)hook_Dispatcher_ModItemAttr_dispatch_sig);
|
||||
mhook_Dispatcher_ModItemAttr_dispatch_sig.Hook((void**)&old_Dispatcher_ModItemAttr_dispatch_sig, (void*)hook_Dispatcher_ModItemAttr_dispatch_sig);
|
||||
|
||||
mhook_PacketDispatcher_doDispatch.Hook((void**)&old_PacketDispatcher_doDispatch, (void*)hook_PacketDispatcher_doDispatch);
|
||||
|
||||
@@ -88,186 +88,33 @@ int Controller::hook_IPacketDispatcher_ParamBase_dispatch_template(int a1, int a
|
||||
|
||||
int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* user, PacketBuf* pBuf)
|
||||
{
|
||||
printf("getCurCharacName :%s \n", user->getCurCharacName().c_str());
|
||||
printf("getCurCharacNo :%d \n", user->getCurCharacNo());
|
||||
printf("get_buf_ptr :%p %p \n", pBuf->get_buf_ptr(0));
|
||||
printf("get_len :%d \n", pBuf->get_len());
|
||||
|
||||
// printf("pBuf :%s \n", Util::ToHexString((const unsigned char*)pBuf->get_buf_ptr(0),40).c_str());
|
||||
int state = user->get_state();
|
||||
LOG("state :%d \n", state);
|
||||
//校验角色状态是否允许镶嵌
|
||||
if (state != 3)
|
||||
return 0;
|
||||
|
||||
int isEnableAvatarSocketAction = user->isEnableAvatarSocketAction();
|
||||
if (isEnableAvatarSocketAction)
|
||||
user->SendCmdErrorPacket(205, (unsigned char)isEnableAvatarSocketAction);
|
||||
//解析packet_buf
|
||||
|
||||
//时装所在的背包槽
|
||||
int avartar_inven_slot = pBuf->get_short();
|
||||
LOG("avartar_inven_slot :%d \n", avartar_inven_slot);
|
||||
//时装item_id
|
||||
int avartar_item_id = pBuf->get_int();
|
||||
LOG("avartar_item_id :%d \n", avartar_item_id);
|
||||
//本次镶嵌徽章数量
|
||||
int emblem_cnt = pBuf->get_byte();
|
||||
LOG("emblem_cnt :%d \n", emblem_cnt);
|
||||
|
||||
if (user->CheckItemLock(2, avartar_inven_slot))
|
||||
{
|
||||
user->SendCmdErrorPacket(205, 213);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取时装道具
|
||||
CInventory* inven = user->getCurCharacInvenW();
|
||||
if (!inven)
|
||||
{
|
||||
LOG("pUser->getCurCharacInvenW : error \n");
|
||||
return 0;
|
||||
}
|
||||
Inven_Item* avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
|
||||
if (!avartar)
|
||||
{
|
||||
LOG("inven->GetInvenRef : error \n");
|
||||
return 0;
|
||||
}
|
||||
//校验时装 数据是否合法
|
||||
if (avartar->isEmpty() || (avartar->getKey() != avartar_item_id) || user->CheckItemLock(2, avartar_inven_slot))
|
||||
{
|
||||
|
||||
LOG("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
|
||||
return 0;
|
||||
}
|
||||
//获取时装插槽数据
|
||||
WongWork::CAvatarItemMgr* avartar_add_info = 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)
|
||||
{
|
||||
LOG("jewel_socket_data : error \n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
LOG("jewel_socket_data :%s \n", Util::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str());
|
||||
if (emblem_cnt <= 3)
|
||||
{
|
||||
std::map<int, std::pair<int, int>> emblems;
|
||||
for (int i = 0; i < emblem_cnt; i++)
|
||||
{
|
||||
//徽章所在的背包槽
|
||||
int emblem_inven_slot = pBuf->get_short();
|
||||
//徽章item_id
|
||||
int emblem_item_id = pBuf->get_int();
|
||||
//该徽章镶嵌的时装插槽id
|
||||
int avartar_socket_slot = pBuf->get_byte();
|
||||
|
||||
//获取徽章道具
|
||||
Inven_Item* emblem = inven->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, emblem_inven_slot);
|
||||
//校验徽章及插槽数据是否合法
|
||||
if (emblem->isEmpty() || (emblem->getKey() != emblem_item_id) || (avartar_socket_slot >= 3))
|
||||
{
|
||||
LOG("emblem->isEmpty() || (emblem->getKey() : error \n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//校验徽章是否满足时装插槽颜色要求
|
||||
|
||||
//获取徽章pvf数据
|
||||
CDataManager* DataManager = CDataManager::G_CDataManager();
|
||||
if (!DataManager)
|
||||
{
|
||||
LOG("CDataManager::G_CDataManager() : error \n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
CStackableItem* citem = (CStackableItem*)DataManager->find_item(emblem_item_id);
|
||||
if (!citem)
|
||||
{
|
||||
LOG("DataManager->find_item() : error \n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//校验徽章类型
|
||||
if (!citem->is_stackable() || (citem->GetItemType() != 20))
|
||||
{
|
||||
LOG("citem->is_stackable() || (citem->GetItemType() : error \n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
|
||||
//获取徽章支持的插槽
|
||||
int emblem_socket_type = citem->getJewelTargetSocket();
|
||||
|
||||
//获取要镶嵌的时装插槽类型
|
||||
int avartar_socket_type = *(short*)(jewel_socket_data + avartar_socket_slot * 6);
|
||||
if (!(emblem_socket_type & avartar_socket_type))
|
||||
{
|
||||
//插槽类型不匹配
|
||||
LOG("emblem_socket_type & avartar_socket_type\n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
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);
|
||||
}
|
||||
LOG("数据已读取!!!\n");
|
||||
|
||||
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("徽章item_id=%d 已成功镶嵌进avartar_socket_slot=%d 的槽内!\n", emblem_item_id, avartar_socket_slot);
|
||||
}
|
||||
|
||||
//时装插槽数据存档
|
||||
DB_UpdateAvatarJewelSlot::makeRequest(user->getCurCharacNo(), avartar->get_ui_id(), (void*)jewel_socket_data);
|
||||
|
||||
//通知客户端时装数据已更新
|
||||
user->SendUpdateItemList(1, 1, avartar_inven_slot);
|
||||
LOG("徽章镶嵌完毕!!!");
|
||||
//回包给客户端
|
||||
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
|
||||
|
||||
packet_guard->put_header(1, 204);
|
||||
packet_guard->put_int(1);
|
||||
packet_guard->finalize(1);
|
||||
user->Send((PacketGuard*)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE ret = CDispatch::Get()->UseJewel_dispatch_sig(pDispatcher_UseJewel, user, pBuf);
|
||||
int result = (ret == PAK_ERROR) ? 1 : 0;
|
||||
// 08217C06 分解
|
||||
return 0;
|
||||
return result;
|
||||
}
|
||||
|
||||
int Controller::hook_Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_ModItemAttr* dis_mod, CUser* user, PacketBuf* pBuf)
|
||||
{
|
||||
PacketBuf new_buf;
|
||||
memcpy(&new_buf, pBuf, sizeof(PacketBuf));
|
||||
int equipment_pos = new_buf.get_short();
|
||||
int equipment_id = new_buf.get_int();
|
||||
int item_pos = new_buf.get_short();
|
||||
short equipment_pos = 0;
|
||||
int equipment_id = 0;
|
||||
short item_pos = 0;
|
||||
|
||||
if ((unsigned __int8)new_buf.get_short(&equipment_pos) != 1
|
||||
|| (unsigned __int8)new_buf.get_int(&equipment_id) != 1
|
||||
|| (unsigned __int8)new_buf.get_short(&item_pos) != 1)
|
||||
{
|
||||
user->SendCmdErrorPacket(84, -1);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
CInventory* CurCharacInvenW = user->getCurCharacInvenR();
|
||||
|
||||
auto item_inven = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, item_pos);
|
||||
|
||||
LOG(u8"UseEquipmentMoveItem [ equipment_pos:%d equipment_id:%d item_pos:%d item_id:%d ]"
|
||||
, equipment_pos
|
||||
, equipment_id
|
||||
, item_pos
|
||||
, item_inven->getKey()
|
||||
);
|
||||
|
||||
if (!item_inven->isEmpty() && item_inven->getKey() == ITEM_ID_YIJIRUHUN)
|
||||
{
|
||||
ENUM_PACK_RET_TYPE ret = CDispatch::Get()->Dispatcher_ModItemAttr_dispatch_sig(dis_mod, user, pBuf);
|
||||
@@ -312,7 +159,7 @@ int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* us
|
||||
, packet_class
|
||||
, packet_id
|
||||
, packet_len
|
||||
, Util::ToHexString((const unsigned char*)packet_src, packet_len).c_str()
|
||||
, Utils::ToHexString((const unsigned char*)packet_src, packet_len).c_str()
|
||||
);
|
||||
|
||||
if (v25)
|
||||
|
||||
Reference in New Issue
Block a user