初版
This commit is contained in:
237
src/dispatch.cpp
237
src/dispatch.cpp
@@ -8,18 +8,15 @@
|
||||
|
||||
#include "dispatch.h"
|
||||
|
||||
CDispatch::CDispatch() :
|
||||
last_move_map_tickcount(0)
|
||||
CDispatch::CDispatch() : last_move_map_tickcount(0)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
CDispatch::~CDispatch()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser *user, PacketBuf *pBuf)
|
||||
{
|
||||
|
||||
if (user->get_state() != 3)
|
||||
@@ -34,41 +31,39 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
LOG(u8"UseEquipmentMoveItem :%s ", Utils::ToHexString((const unsigned char*)pBuf->get_buf_ptr(0), 40).c_str());
|
||||
LOG(u8"UseEquipmentMoveItem :%s ", Utils::ToHexString((const unsigned char *)pBuf->get_buf_ptr(0), 40).c_str());
|
||||
|
||||
short equipment_pos = 0;
|
||||
int equipment_id = 0;
|
||||
short item_pos = 0;
|
||||
|
||||
if ((unsigned __int8)pBuf->get_short(&equipment_pos) != 1
|
||||
|| (unsigned __int8)pBuf->get_int(&equipment_id) != 1
|
||||
|| (unsigned __int8)pBuf->get_short(&item_pos) != 1)
|
||||
if ((unsigned __int8)pBuf->get_short(&equipment_pos) != 1 || (unsigned __int8)pBuf->get_int(&equipment_id) != 1 || (unsigned __int8)pBuf->get_short(&item_pos) != 1)
|
||||
{
|
||||
user->SendCmdErrorPacket(84, -1);
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
//1 物品栏 2 时装
|
||||
// 1 物品栏 2 时装
|
||||
if (user->CheckItemLock(1, equipment_pos))
|
||||
{
|
||||
user->SendCmdErrorPacket(84, 0xD5);
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
CInventory* invenR = user->getCurCharacInvenR();
|
||||
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);
|
||||
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);
|
||||
Inven_Item *item_avartar = invenR->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, item_pos);
|
||||
if (!item_avartar)
|
||||
{
|
||||
LOG(u8"inven->GetInvenRef : error \n");
|
||||
@@ -95,7 +90,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
|
||||
int item_id = item_avartar->getKey();
|
||||
|
||||
CDataManager* DataManager = CDataManager::G_CDataManager();
|
||||
CDataManager *DataManager = CDataManager::G_CDataManager();
|
||||
|
||||
if (!DataManager)
|
||||
{
|
||||
@@ -103,11 +98,9 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
CEquipItem* equipment_citem = (CEquipItem*)DataManager->find_item(equipment_id);
|
||||
CStackableItem* item_citem = (CStackableItem*)DataManager->find_item(item_id);
|
||||
LOG(u8"equipment_citem +12: %p"
|
||||
, *(int*)equipment_citem + 12
|
||||
);
|
||||
CEquipItem *equipment_citem = (CEquipItem *)DataManager->find_item(equipment_id);
|
||||
CStackableItem *item_citem = (CStackableItem *)DataManager->find_item(item_id);
|
||||
LOG(u8"equipment_citem +12: %p", *(int *)equipment_citem + 12);
|
||||
|
||||
if (!equipment_citem || !item_citem)
|
||||
{
|
||||
@@ -115,28 +108,17 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
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
|
||||
);
|
||||
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();
|
||||
// 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();
|
||||
if (rarity != 4)
|
||||
{
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
|
||||
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()
|
||||
);
|
||||
|
||||
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)
|
||||
{
|
||||
@@ -149,17 +131,15 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
{
|
||||
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; //返回给客户端的错误码
|
||||
int v9 = 0; // 返回给客户端的错误码
|
||||
if (item_id == ITEM_ID_KUAJIESHI)
|
||||
{
|
||||
LOG(u8"user->CheckInTrade:%d", user->CheckInTrade());
|
||||
@@ -175,8 +155,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
}
|
||||
else
|
||||
{
|
||||
CAccountCargo* AccountCargo = user->GetAccountCargo();
|
||||
|
||||
CAccountCargo *AccountCargo = user->GetAccountCargo();
|
||||
|
||||
LOG(u8"ins_item.IsTradeLimitAttachTypeItem :%d", new_equipment_item.IsTradeLimitAttachTypeItem());
|
||||
LOG(u8"AccountCargo->CheckInsertCondition :%d", AccountCargo->CheckInsertCondition(&new_equipment_item));
|
||||
@@ -193,9 +172,9 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
}
|
||||
}
|
||||
LOG(u8"empty_slot :%d", empty_slot);
|
||||
//inven->delete_item(1, emblem_inven_slot, 1, 8, 1);
|
||||
// inven->delete_item(1, emblem_inven_slot, 1, 8, 1);
|
||||
auto invenW = user->getCurCharacInvenW();
|
||||
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
|
||||
InterfacePacketBuf *packet_guard = (InterfacePacketBuf *)PacketGuard::NewPacketGuard();
|
||||
LOG("%p", invenW);
|
||||
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))
|
||||
{
|
||||
@@ -207,8 +186,8 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
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);
|
||||
user->Send((PacketGuard *)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard *)packet_guard);
|
||||
SendNoti(user, "已完成装备跨界");
|
||||
|
||||
return PAK_OK;
|
||||
@@ -218,8 +197,8 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
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);
|
||||
user->Send((PacketGuard *)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard *)packet_guard);
|
||||
SendNoti(user, "装备跨界失败");
|
||||
}
|
||||
return PAK_IGNORE;
|
||||
@@ -233,10 +212,10 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
密钥Call (物品位置,2)
|
||||
发包Call ()
|
||||
*/
|
||||
return PAK_OK;
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_ModItemAttr* dis_mod, CUser* user, PacketBuf* pBuf)
|
||||
ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_ModItemAttr *dis_mod, CUser *user, PacketBuf *pBuf)
|
||||
{
|
||||
if (user->get_state() != 3 || !user->getCurCharacR())
|
||||
{
|
||||
@@ -247,15 +226,13 @@ ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_Mod
|
||||
int equipment_id = 0;
|
||||
short item_pos = 0;
|
||||
|
||||
if ((unsigned __int8)pBuf->get_short(&equipment_pos) != 1
|
||||
|| (unsigned __int8)pBuf->get_int(&equipment_id) != 1
|
||||
|| (unsigned __int8)pBuf->get_short(&item_pos) != 1)
|
||||
if ((unsigned __int8)pBuf->get_short(&equipment_pos) != 1 || (unsigned __int8)pBuf->get_int(&equipment_id) != 1 || (unsigned __int8)pBuf->get_short(&item_pos) != 1)
|
||||
{
|
||||
user->SendCmdErrorPacket(84, -1);
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
auto CurCharacInvenW = (CInventory*)user->getCurCharacInvenW();
|
||||
auto CurCharacInvenW = (CInventory *)user->getCurCharacInvenW();
|
||||
Inven_Item equipment_inven = {};
|
||||
CurCharacInvenW->GetInvenSlot(&equipment_inven, CInventory::INVENTORY_TYPE_ITEM, equipment_pos);
|
||||
|
||||
@@ -264,12 +241,12 @@ ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_Mod
|
||||
user->SendCmdErrorPacket(84, 4);
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
CEquipItem* equipment_item = (CEquipItem*)CDataManager::G_CDataManager()->find_item(equipment_id);
|
||||
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))
|
||||
,
|
||||
(*(int (**)(CItem *))(*(_DWORD *)equipment_item + 12)), ((int (**)(CItem *))(*(_DWORD *)equipment_item + 12))
|
||||
|
||||
);
|
||||
|
||||
@@ -307,8 +284,8 @@ ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_Mod
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
int grade = equipment_item->get_grade(); //掉落等级
|
||||
int rarity = equipment_item->get_rarity(); //稀有
|
||||
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();
|
||||
|
||||
@@ -339,7 +316,7 @@ ENUM_PACK_RET_TYPE CDispatch::Dispatcher_ModItemAttr_dispatch_sig(Dispatcher_Mod
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* user, PacketBuf* pBuf)
|
||||
ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void *pDispatcher_UseJewel, CUser *user, PacketBuf *pBuf)
|
||||
{
|
||||
printf("getCurCharacName :%s \n", user->getCurCharacName().c_str());
|
||||
printf("getCurCharacNo :%d \n", user->getCurCharacNo());
|
||||
@@ -349,22 +326,20 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
// 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 PAK_IGNORE;
|
||||
|
||||
int isEnableAvatarSocketAction = user->isEnableAvatarSocketAction();
|
||||
if (isEnableAvatarSocketAction)
|
||||
user->SendCmdErrorPacket(205, (unsigned char)isEnableAvatarSocketAction);
|
||||
//解析packet_buf
|
||||
// 解析packet_buf
|
||||
|
||||
short avartar_inven_slot = 0; //时装所在的背包槽
|
||||
int avartar_item_id = 0; //时装item_id
|
||||
char emblem_cnt = 0; //本次镶嵌徽章数量
|
||||
short avartar_inven_slot = 0; // 时装所在的背包槽
|
||||
int avartar_item_id = 0; // 时装item_id
|
||||
char emblem_cnt = 0; // 本次镶嵌徽章数量
|
||||
|
||||
if ((unsigned __int8)pBuf->get_short(&avartar_inven_slot) != 1
|
||||
|| (unsigned __int8)pBuf->get_int(&avartar_item_id) != 1
|
||||
|| (unsigned __int8)pBuf->get_byte(&emblem_cnt) != 1)
|
||||
if ((unsigned __int8)pBuf->get_short(&avartar_inven_slot) != 1 || (unsigned __int8)pBuf->get_int(&avartar_item_id) != 1 || (unsigned __int8)pBuf->get_byte(&emblem_cnt) != 1)
|
||||
{
|
||||
user->SendCmdErrorPacket(205, -1);
|
||||
return PAK_IGNORE;
|
||||
@@ -376,31 +351,31 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
//获取时装道具
|
||||
CInventory* CurCharacInvenW = user->getCurCharacInvenW();
|
||||
// 获取时装道具
|
||||
CInventory *CurCharacInvenW = user->getCurCharacInvenW();
|
||||
if (!CurCharacInvenW)
|
||||
{
|
||||
LOG("pUser->getCurCharacInvenW : error \n");
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
Inven_Item* avartar_inven_item = CurCharacInvenW->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
|
||||
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_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;
|
||||
}
|
||||
//获取时装插槽数据
|
||||
// 获取时装插槽数据
|
||||
auto avartar_add_info = avartar_inven_item->get_add_info();
|
||||
auto inven_avartar_mgr = (WongWork::CAvatarItemMgr*)CurCharacInvenW->GetAvatarItemMgrW();
|
||||
auto inven_avartar_mgr = (WongWork::CAvatarItemMgr *)CurCharacInvenW->GetAvatarItemMgrW();
|
||||
|
||||
stAvatarEmblemInfo_t* JewelSocketData = (stAvatarEmblemInfo_t*)inven_avartar_mgr->getJewelSocketData(avartar_add_info);
|
||||
stAvatarEmblemInfo_t *JewelSocketData = (stAvatarEmblemInfo_t *)inven_avartar_mgr->getJewelSocketData(avartar_add_info);
|
||||
|
||||
if (!JewelSocketData)
|
||||
{
|
||||
@@ -408,27 +383,27 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
LOG("jewel_socket_data 1:%s \n", Utils::ToHexString((const unsigned char*)JewelSocketData, 30).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;
|
||||
for (int i = 0; i < emblem_cnt; i++)
|
||||
{
|
||||
//徽章所在的背包槽
|
||||
// 徽章所在的背包槽
|
||||
short emblem_inven_slot = 0;
|
||||
pBuf->get_short(&emblem_inven_slot);
|
||||
//徽章item_id
|
||||
// 徽章item_id
|
||||
int emblem_item_id = 0;
|
||||
pBuf->get_int(&emblem_item_id);
|
||||
//该徽章镶嵌的时装插槽id
|
||||
// 该徽章镶嵌的时装插槽id
|
||||
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 = CurCharacInvenW->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))
|
||||
{
|
||||
LOG("emblem->isEmpty() || (emblem->getKey() : error \n");
|
||||
@@ -436,17 +411,17 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
//校验徽章是否满足时装插槽颜色要求
|
||||
// 校验徽章是否满足时装插槽颜色要求
|
||||
|
||||
//获取徽章pvf数据
|
||||
CDataManager* DataManager = CDataManager::G_CDataManager();
|
||||
// 获取徽章pvf数据
|
||||
CDataManager *DataManager = CDataManager::G_CDataManager();
|
||||
if (!DataManager)
|
||||
{
|
||||
LOG("CDataManager::G_CDataManager() : error \n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
CStackableItem* citem = (CStackableItem*)DataManager->find_item(emblem_item_id);
|
||||
CStackableItem *citem = (CStackableItem *)DataManager->find_item(emblem_item_id);
|
||||
if (!citem)
|
||||
{
|
||||
LOG("DataManager->find_item() : error \n");
|
||||
@@ -454,7 +429,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
//校验徽章类型
|
||||
// 校验徽章类型
|
||||
if (!citem->is_stackable() || (citem->GetItemType() != 20))
|
||||
{
|
||||
LOG("citem->is_stackable() || (citem->GetItemType() : error \n");
|
||||
@@ -462,21 +437,19 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
//获取徽章支持的插槽
|
||||
// 获取徽章支持的插槽
|
||||
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
|
||||
//获取要镶嵌的时装插槽类型
|
||||
// 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
|
||||
// 获取要镶嵌的时装插槽类型
|
||||
|
||||
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))
|
||||
{
|
||||
//插槽类型不匹配
|
||||
// 插槽类型不匹配
|
||||
LOG("emblem_socket_type & avartar_socket_type\n");
|
||||
user->SendCmdErrorPacket(205, 209);
|
||||
return PAK_IGNORE;
|
||||
@@ -490,30 +463,29 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
LOG("jewel_socket_data 2:%s \n", Utils::ToHexString((const unsigned char*)JewelSocketData, 30).c_str());
|
||||
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(), (unsigned int)avartar_add_info, (void*)JewelSocketData);
|
||||
// 时装插槽数据存档
|
||||
DB_UpdateAvatarJewelSlot::makeRequest(user->getCurCharacNo(), (unsigned int)avartar_add_info, (void *)JewelSocketData);
|
||||
|
||||
//通知客户端时装数据已更新
|
||||
// 通知客户端时装数据已更新
|
||||
user->SendUpdateItemList(1, 1, avartar_inven_slot);
|
||||
//回包给客户端
|
||||
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
|
||||
// 回包给客户端
|
||||
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);
|
||||
user->Send((PacketGuard *)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard *)packet_guard);
|
||||
SendNoti(user, "已完成徽章镶嵌");
|
||||
return PAK_OK;
|
||||
}
|
||||
return PAK_IGNORE;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::MoveMap_dispatch_sig(void* a1, CUser* user, PacketBuf* pBuf)
|
||||
ENUM_PACK_RET_TYPE CDispatch::MoveMap_dispatch_sig(void *a1, CUser *user, PacketBuf *pBuf)
|
||||
{
|
||||
USER_DATA data;
|
||||
if (user_map.Find(user, &data))
|
||||
@@ -531,7 +503,7 @@ ENUM_PACK_RET_TYPE CDispatch::MoveMap_dispatch_sig(void* a1, CUser* user, Packet
|
||||
|
||||
user_map.Change(user, data);
|
||||
|
||||
//判断异常次数是否大于等于3
|
||||
// 判断异常次数是否大于等于3
|
||||
if (data.abnormal_data_count >= 3)
|
||||
{
|
||||
return PAK_ERROR;
|
||||
@@ -540,7 +512,7 @@ ENUM_PACK_RET_TYPE CDispatch::MoveMap_dispatch_sig(void* a1, CUser* user, Packet
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::Inter_LoadEtc_dispatch_sig(void* a1, CUser* user, char* a3)
|
||||
ENUM_PACK_RET_TYPE CDispatch::Inter_LoadEtc_dispatch_sig(void *a1, CUser *user, char *a3)
|
||||
{
|
||||
user->getCurCharacNo();
|
||||
user->getCurCharacName();
|
||||
@@ -549,17 +521,17 @@ ENUM_PACK_RET_TYPE CDispatch::Inter_LoadEtc_dispatch_sig(void* a1, CUser* user,
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::DisPatcher_ReturnToSelectCharacter_dispatch_sig(void* a1, CUser* user, char* a3)
|
||||
ENUM_PACK_RET_TYPE CDispatch::DisPatcher_ReturnToSelectCharacter_dispatch_sig(void *a1, CUser *user, char *a3)
|
||||
{
|
||||
|
||||
user_map.Erase(user);
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser* user, int Goods_No, int item_id, int Cera_Type, InterfacePacketBuf* pbuf)
|
||||
ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser *user, int Goods_No, int item_id, int Cera_Type, InterfacePacketBuf *pbuf)
|
||||
{
|
||||
|
||||
if (Cera_Type == 0) //0是点券 1是代币
|
||||
if (Cera_Type == 0) // 0是点券 1是代币
|
||||
{
|
||||
CeraShopBonusCodeType cera_shop_bonus_code_;
|
||||
if (CGameDataManager::Get()->is_cera_shop_bonus_code(Goods_No, &cera_shop_bonus_code_))
|
||||
@@ -596,33 +568,31 @@ ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser* user, int Goods_No,
|
||||
auto item = CDataManager::G_CDataManager()->find_item(BonusItem.item_id);
|
||||
if (item)
|
||||
{
|
||||
//if (item->is_stackable()
|
||||
// if (item->is_stackable()
|
||||
// && ((*(int(**)(CItem*))(*(_DWORD*)item + 12))(item) == 16 // GetItemType
|
||||
// || (*(int(**)(CItem*))(*(_DWORD*)item + 12))(item) == 34)) // GetItemType
|
||||
{
|
||||
int inserted = -1;
|
||||
Inven_Item v60 = {};
|
||||
*(_DWORD*)((char*)&v60 + 2) = BonusItem.item_id;
|
||||
*(_DWORD*)((char*)&v60 + 7) = BonusItem.item_num;
|
||||
*(_DWORD *)((char *)&v60 + 2) = BonusItem.item_id;
|
||||
*(_DWORD *)((char *)&v60 + 7) = BonusItem.item_num;
|
||||
|
||||
(*(void(**)(CItem*, Inven_Item*))(*(_DWORD*)item + 8))(item, &v60);
|
||||
(*(void (**)(CItem *, Inven_Item *))(*(_DWORD *)item + 8))(item, &v60);
|
||||
|
||||
auto CurCharacInvenW = user->getCurCharacInvenW();
|
||||
auto CurCharacInvenW = user->getCurCharacInvenW();
|
||||
|
||||
inserted = CurCharacInvenW->insertItemIntoInventory(v60, 15, 1, 0);
|
||||
if (inserted == -1)
|
||||
{
|
||||
auto CurCharacNo = user->getCurCharacNo();
|
||||
|
||||
((WongWork::CMailBoxHelper*)(user))->ReqDBSendNewMailCashShop(&v60, 0, CurCharacNo, 1, 0, 0);
|
||||
|
||||
((WongWork::CMailBoxHelper *)(user))->ReqDBSendNewMailCashShop(&v60, 0, CurCharacNo, 1, 0, 0);
|
||||
}
|
||||
else
|
||||
{
|
||||
user->SendUpdateItemList(1, 0, inserted);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -630,34 +600,32 @@ ENUM_PACK_RET_TYPE CDispatch::ProcessIPG_ResultOutput(CUser* user, int Goods_No,
|
||||
pbuf->put_int(BonusItem.item_id);
|
||||
pbuf->put_int(BonusItem.item_num);
|
||||
|
||||
std::vector <unsigned char> code;
|
||||
std::vector<unsigned char> code;
|
||||
for (int i = 0; i < 0x30; i++)
|
||||
{
|
||||
code.push_back(0x90);
|
||||
}
|
||||
//0817964F 0817967F
|
||||
CMem::WriteBytes((void*)0x0817964F, code.data(), code.size());
|
||||
// 0817964F 0817967F
|
||||
CMem::WriteBytes((void *)0x0817964F, code.data(), code.size());
|
||||
return PAK_OK;
|
||||
}
|
||||
}
|
||||
IPG_END:
|
||||
std::vector <unsigned char> code = {
|
||||
0x8B, 0x85, 0x04, 0xFF, 0xFF, 0xFF, 0x89, 0x44, 0x24, 0x04, 0x8D, 0x85, 0x14, 0xFF, 0xFF, 0xFF,
|
||||
0x89, 0x04, 0x24, 0xE8, 0xD5, 0x22, 0xF5, 0xFF, 0x8B, 0x85, 0x00, 0xFF, 0xFF, 0xFF, 0x89, 0x44,
|
||||
0x24, 0x04, 0x8D, 0x85, 0x14, 0xFF, 0xFF, 0xFF, 0x89, 0x04, 0x24, 0xE8, 0xBD, 0x22, 0xF5, 0xFF
|
||||
};
|
||||
CMem::WriteBytes((void*)0x0817964F, code.data(), code.size());
|
||||
std::vector<unsigned char> code = {
|
||||
0x8B, 0x85, 0x04, 0xFF, 0xFF, 0xFF, 0x89, 0x44, 0x24, 0x04, 0x8D, 0x85, 0x14, 0xFF, 0xFF, 0xFF,
|
||||
0x89, 0x04, 0x24, 0xE8, 0xD5, 0x22, 0xF5, 0xFF, 0x8B, 0x85, 0x00, 0xFF, 0xFF, 0xFF, 0x89, 0x44,
|
||||
0x24, 0x04, 0x8D, 0x85, 0x14, 0xFF, 0xFF, 0xFF, 0x89, 0x04, 0x24, 0xE8, 0xBD, 0x22, 0xF5, 0xFF};
|
||||
CMem::WriteBytes((void *)0x0817964F, code.data(), code.size());
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::Init_done(int argc, const char** argv)
|
||||
ENUM_PACK_RET_TYPE CDispatch::Init_done(int argc, const char **argv)
|
||||
{
|
||||
|
||||
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
ENUM_PACK_RET_TYPE CDispatch::importCashShopItemList(const std::string* str)
|
||||
ENUM_PACK_RET_TYPE CDispatch::importCashShopItemList(const std::string *str)
|
||||
{
|
||||
/**
|
||||
|
||||
@@ -698,7 +666,7 @@ ENUM_PACK_RET_TYPE CDispatch::importCashShopItemList(const std::string* str)
|
||||
int is_random = ScanInt();
|
||||
if (is_random == 1)
|
||||
{
|
||||
CGameDataManager::Get()->get_cera_shop_bonus_item_map_rand()->Push(index_, { item_id, item_num, true });
|
||||
CGameDataManager::Get()->get_cera_shop_bonus_item_map_rand()->Push(index_, {item_id, item_num, true});
|
||||
}
|
||||
CGameDataManager::Get()->add_cera_shop_bonus_item(index_, item_id, item_num, is_random);
|
||||
}
|
||||
@@ -706,25 +674,24 @@ ENUM_PACK_RET_TYPE CDispatch::importCashShopItemList(const std::string* str)
|
||||
return PAK_OK;
|
||||
}
|
||||
|
||||
void CDispatch::SendMsg(CUser* user, int pack_id, int status, const std::string& str)
|
||||
void CDispatch::SendMsg(CUser *user, int pack_id, int status, const std::string &str)
|
||||
{
|
||||
char out_str[0xff] = {};
|
||||
memset(out_str, 0, sizeof(out_str));
|
||||
DNFFLib::ConvertGBKtoUTF8((char*)str.c_str(), out_str);
|
||||
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
|
||||
DNFFLib::ConvertGBKtoUTF8((char *)str.c_str(), out_str);
|
||||
InterfacePacketBuf *packet_guard = (InterfacePacketBuf *)PacketGuard::NewPacketGuard();
|
||||
packet_guard->put_header(1, pack_id);
|
||||
packet_guard->put_int(status);
|
||||
packet_guard->put_int(strlen(out_str));
|
||||
packet_guard->put_str(out_str, strlen(out_str));
|
||||
user->Send((PacketGuard*)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
|
||||
user->Send((PacketGuard *)packet_guard);
|
||||
PacketGuard::DelPacketGuard((PacketGuard *)packet_guard);
|
||||
}
|
||||
|
||||
void CDispatch::SendNoti(CUser* user, const std::string& str, NOTI_PACKETMESSAGE_TYPE type)
|
||||
void CDispatch::SendNoti(CUser *user, const std::string &str, NOTI_PACKETMESSAGE_TYPE type)
|
||||
{
|
||||
char out_str[0xff] = {};
|
||||
memset(out_str, 0, sizeof(out_str));
|
||||
DNFFLib::ConvertGBKtoUTF8((char*)str.c_str(), out_str);
|
||||
DNFFLib::ConvertGBKtoUTF8((char *)str.c_str(), out_str);
|
||||
user->SendNotiPacketMessage(out_str, type);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user