//************************************ // 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(); int rarity = equipment_citem->get_rarity(); LOG(u8"Data: equipment_citem->GetItemType=%d item_citem->is_stackable=%d item_citem->GetItemType=%d" , equipment_Type , 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; } Inven_Item new_equipment_item = {}; invenR->GetInvenSlot(&new_equipment_item, CInventory::INVENTORY_TYPE_ITEM, equipment_pos); int v9 = 0; //返回给客户端的错误码 if (item_id == 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(); LOG(u8"ins_item.IsTradeLimitAttachTypeItem :%d", new_equipment_item.IsTradeLimitAttachTypeItem()); LOG(u8"AccountCargo->CheckInsertCondition :%d", AccountCargo->CheckInsertCondition(&new_equipment_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(&new_equipment_item, empty_slot); user->SendUpdateItemList(1, new_equipment_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; } } /* 缓冲Call (2000) 密钥Call (装备位置,2) 密钥Call (装备代码,4) 密钥Call (物品位置,2) 发包Call () */ return PAK_OK; } ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_ModItemAttr* dis_mod, CUser* user, PacketBuf* pBuf) { if (user->get_state() != 3 || !user->getCurCharacR()) { user->SendCmdErrorPacket(84, 0xD1u); return PAK_IGNORE; } int equipment_pos = pBuf->get_short(); int equipment_id = pBuf->get_int(); int item_pos = pBuf->get_short(); auto CurCharacInvenW = (CInventory*)user->getCurCharacInvenW(); Inven_Item equipment_inven = {}; CurCharacInvenW->GetInvenSlot(&equipment_inven, CInventory::INVENTORY_TYPE_ITEM, equipment_pos); if (equipment_inven.isEmpty() || equipment_inven.getKey() != equipment_id) { user->SendCmdErrorPacket(84, 4); return PAK_IGNORE; } CEquipItem* equipment_item = (CEquipItem*)CDataManager::G_CDataManager()->find_item(equipment_id); if (!equipment_item) { user->SendCmdErrorPacket(84, 4); return PAK_IGNORE; } int equipment_Type = equipment_item->GetItemType(); if (equipment_Type <= 9 || equipment_Type > 21 || equipment_Type == 11) { user->SendCmdErrorPacket(84, 19); return PAK_IGNORE; } Inven_Item item_inven = {}; CurCharacInvenW->GetInvenSlot(&item_inven, CInventory::INVENTORY_TYPE_ITEM, item_pos); if (item_inven.isEmpty()) { user->SendCmdErrorPacket(84, 17); return PAK_IGNORE; } if (user->CheckItemLock(1, equipment_pos)) { user->SendCmdErrorPacket(84, 0xD5u); return PAK_IGNORE; } if (item_inven.getKey() != ITEM_ID_YIJIRUHUN) { user->SendCmdErrorPacket(84, 17); return PAK_IGNORE; } int grade = equipment_item->get_grade(); int rarity = equipment_item->get_rarity(); int attach_type = equipment_item->GetAttachType(); auto add_info = item_inven.get_add_info(); if (equipment_item->GetAttachType() != 3) { user->SendCmdErrorPacket(84, 19); return PAK_IGNORE; } if (equipment_inven.package != 0) { user->SendCmdErrorPacket(84, 18); return PAK_IGNORE; } if (CurCharacInvenW->delete_item(CInventory::INVENTORY_TYPE_ITEM, item_pos, 1, 3, 1) != 1) { user->SendCmdErrorPacket(84, -3); return PAK_IGNORE; } equipment_inven.package = 1; CurCharacInvenW->update_item( CInventory::INVENTORY_TYPE_ITEM, equipment_pos, equipment_inven); dis_mod->_SendResult(user, 1, item_pos, equipment_pos); return PAK_IGNORE; }