修复徽章镶嵌
This commit is contained in:
@@ -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<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;
|
||||
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;
|
||||
|
||||
Reference in New Issue
Block a user