//************************************ // FileName: D:\VisualStudioSource\dnf_project\src\Dispatch.cpp // FullName: D:\VisualStudioSource\dnf_project\src // Date: 2022/09/01 // By: Vance // Copyright (c) 2022. Vance All rights reserved //************************************ #include "dispatch.h" CDispatch::CDispatch() { } CDispatch::~CDispatch() { } ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf) { if (user->get_state() != 3) { LOG(u8"玩家状态不正常!"); return PAK_IGNORE; } int v110 = CSecu_ProtectionField::Get()->Check(user, 38); if (v110) { user->SendCmdErrorPacket(84, v110); return PAK_IGNORE; } LOG(u8"UseEquipmentMoveItem :%s ", Util::ToHexString((const unsigned char*)pBuf->get_buf_ptr(0), 40).c_str()); int equipment_pos = pBuf->get_short(); //装备位置 int equipment_id = pBuf->get_int(); //装备代码 int item_pos = pBuf->get_short(); //物品位置 //1 物品栏 2 时装 if (user->CheckItemLock(1, equipment_pos)) { user->SendCmdErrorPacket(84, 0xD5); return PAK_IGNORE; } CInventory* invenR = user->getCurCharacInvenR(); if (!invenR) { LOG(u8"user->getCurCharacInvenW : error \n"); return PAK_IGNORE; } Inven_Item* equipment_InvenRef = invenR->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, equipment_pos); if (!equipment_InvenRef) { LOG(u8"inven->GetInvenRef : error \n"); return PAK_IGNORE; } Inven_Item* item_avartar = invenR->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, item_pos); if (!item_avartar) { LOG(u8"inven->GetInvenRef : error \n"); return PAK_IGNORE; } if (equipment_InvenRef->isEmpty()) { LOG(u8"equipment_InvenRef->isEmpty"); return PAK_IGNORE; } if (equipment_InvenRef->getKey() != equipment_id) { LOG(u8"equipment_InvenRef->getKey() != equipment_id"); user->SendCmdErrorPacket(4, 0); return PAK_IGNORE; } if (item_avartar->isEmpty()) { LOG(u8"item_avartar->isEmpty"); return PAK_IGNORE; } int item_id = item_avartar->getKey(); CDataManager* DataManager = CDataManager::G_CDataManager(); if (!DataManager) { LOG(u8"G_CDataManager error"); return PAK_IGNORE; } CItem* equipment_citem = DataManager->find_item(equipment_id); CItem* item_citem = DataManager->find_item(item_id); LOG(u8"equipment_citem +12: %p" , *(int*)equipment_citem + 12 ); if (!equipment_citem || !item_citem) { LOG(u8"!equipment_citem || !item_citem"); return PAK_IGNORE; } LOG(u8"UseEquipmentMoveItem [ equipment_pos:%d equipment_id:%d item_pos:%d item_id:%d ]" , equipment_pos , equipment_id , item_pos , item_id ); //Data: equipment_citem->GetItemType=147418664 item_citem->is_stackable=1 item_citem->GetItemType=11 int equipment_Type = ((CEquipItem*)equipment_citem)->GetItemType(); LOG(u8"Data: equipment_citem->GetItemType=%d item_citem->is_stackable=%d item_citem->GetItemType=%d" , (*(int(**)(CItem*))(*(int*)equipment_citem + 12))(equipment_citem) , item_citem->is_stackable() , item_citem->GetItemType() ); if (equipment_Type <= 9 || equipment_Type > 21 || equipment_Type == 11) { LOG(u8"equipment_Type <= 9 || equipment_Type > 21 || equipment_Type == 11"); user->SendCmdErrorPacket(84, 0xD5); return PAK_IGNORE; } if (item_citem->is_stackable() != true || item_citem->GetItemType() != ITEM_TYPE_CONSUMABLES) { LOG(u8"item_citem->is_stackable() != true || item_citem->GetItemType() != ITEM_TYPE_CONSUMABLES"); //没有镜像手机认证,无法使用该功能 user->SendCmdErrorPacket(205, 209); return PAK_IGNORE; } int v9 = 0; //返回给客户端的错误码 switch (item_id) { case ITEM_ID_KUAJIESHI: { LOG(u8"user->CheckInTrade:%d", user->CheckInTrade()); if (user->CheckInTrade()) { v9 = 19; } if (!user->IsExistAccountCargo()) { v9 = 19; LOG(u8"user->IsExistAccountCargo :%d", user->IsExistAccountCargo()); } else { CAccountCargo* AccountCargo = user->GetAccountCargo(); invenR = user->getCurCharacInvenR(); Inven_Item ins_item = {}; invenR->GetInvenSlot(&ins_item, CInventory::INVENTORY_TYPE_ITEM, equipment_pos); LOG(u8"ins_item.IsTradeLimitAttachTypeItem :%d", ins_item.IsTradeLimitAttachTypeItem()); LOG(u8"AccountCargo->CheckInsertCondition :%d", AccountCargo->CheckInsertCondition(&ins_item)); int empty_slot = 0; if (AccountCargo->CheckSlotEmpty(empty_slot) != 1) { empty_slot = AccountCargo->GetEmptySlot(); if (empty_slot < 0) { v9 = 4; LOG("AccountCargo->CheckSlotEmpty :%d", empty_slot); return PAK_IGNORE; } } LOG(u8"empty_slot :%d", empty_slot); //inven->delete_item(1, emblem_inven_slot, 1, 8, 1); auto invenW = user->getCurCharacInvenW(); InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard(); if (invenW->delete_item(CInventory::INVENTORY_TYPE_ITEM, equipment_pos, 1, 37, 1) && invenW->delete_item(CInventory::INVENTORY_TYPE_ITEM, item_pos, 1, 37, 1)) { int a9 = AccountCargo->InsertItem(&ins_item, empty_slot); user->SendUpdateItemList(1, ins_item.GetItemSpace(), equipment_pos); user->SendUpdateItemList(1, item_avartar->GetItemSpace(), item_pos); user->send_itemspace(12); packet_guard->put_header(1, 2000); packet_guard->put_int(1); packet_guard->finalize(1); user->Send((PacketGuard*)packet_guard); PacketGuard::DelPacketGuard((PacketGuard*)packet_guard); LOG(u8"user->Send((PacketGuard*)packet_guard)", a9); return PAK_OK; } else { packet_guard->put_header(1, 2000); packet_guard->put_int(0); packet_guard->finalize(0); user->Send((PacketGuard*)packet_guard); PacketGuard::DelPacketGuard((PacketGuard*)packet_guard); } return PAK_IGNORE; } } break; case ITEM_ID_YIJIRUHUN: { } break; default: break; } /* */ //if (!item_citem->is_stackable() || (equipment_citem->GetItemType() != 20)) //{ // LOG("citem->is_stackable() || (citem->GetItemType() : error \n"); // pUser->SendCmdErrorPacket(205, 209); // return 0; //} /* [DNF_PROJECT] Recv() class:1 id:2000 len:21 packet_data :01 D0 07 15 00 00 00 36 E2 41 37 12 00 09 00 AD 6B 00 00 03 00 [DNF_PROJECT] UseEquipmentMoveItem :01 D0 07 15 00 00 00 36 E2 41 37 12 00 09 00 AD 6B 00 00 03 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 [DNF_PROJECT] UseEquipmentMoveItem [ equipment_pos:9 equipment_id:27565 item_pos:3 item_id:2660238 ] [DNF_PROJECT] Data: equipment_citem->GetItemType=0 item_citem->is_stackable=1 item_citem->GetItemType=11 */ /* 缓冲Call (2000) 密钥Call (装备位置,2) 密钥Call (装备代码,4) 密钥Call (物品位置,2) 发包Call () */ return PAK_OK; }