添加进入人物和退出人物hook

This commit is contained in:
小疯
2022-09-12 18:11:08 +08:00
parent 2ccdac8561
commit cdca473ec3
10 changed files with 590 additions and 78 deletions

View File

@@ -8,7 +8,8 @@
#include "dispatch.h"
CDispatch::CDispatch()
CDispatch::CDispatch() :
last_move_map_tickcount(0)
{
}
@@ -124,6 +125,11 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
//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
@@ -190,7 +196,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
//inven->delete_item(1, emblem_inven_slot, 1, 8, 1);
auto invenW = user->getCurCharacInvenW();
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))
{
int a9 = AccountCargo->InsertItem(&new_equipment_item, empty_slot);
@@ -203,7 +209,8 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
packet_guard->finalize(1);
user->Send((PacketGuard*)packet_guard);
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
LOG(u8"user->Send((PacketGuard*)packet_guard)", a9);
SendNoti(user, "已完成装备跨界");
return PAK_OK;
}
else
@@ -213,6 +220,7 @@ ENUM_PACK_RET_TYPE CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
packet_guard->finalize(0);
user->Send((PacketGuard*)packet_guard);
PacketGuard::DelPacketGuard((PacketGuard*)packet_guard);
SendNoti(user, "装备跨界失败");
}
return PAK_IGNORE;
}
@@ -457,7 +465,6 @@ 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);
}
LOG("数据已读取!!!\n");
for (auto& avartar_socket_slot : emblems)
{
@@ -468,7 +475,6 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
//设置时装插槽数据
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);
}
//时装插槽数据存档
@@ -476,7 +482,6 @@ ENUM_PACK_RET_TYPE CDispatch::UseJewel_dispatch_sig(void* pDispatcher_UseJewel,
//通知客户端时装数据已更新
user->SendUpdateItemList(1, 1, avartar_inven_slot);
LOG("徽章镶嵌完毕!!!");
//回包给客户端
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
@@ -485,8 +490,74 @@ 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"已完成徽章镶嵌");
return PAK_OK;
}
return PAK_IGNORE;
}
ENUM_PACK_RET_TYPE CDispatch::MoveMap_dispatch_sig(void* a1, CUser* user, PacketBuf* pBuf)
{
USER_DATA data;
if (user_map.Find(user, &data))
{
auto CurTickCount = CSystemTime::G_CSystemTime()->getCurTickCount();
if (CurTickCount >= last_move_map_tickcount)
{
if ((CurTickCount - last_move_map_tickcount) <= 1000)
{
data.abnormal_data_count++;
}
last_move_map_tickcount = CurTickCount;
}
user_map.Change(user, data);
//判断异常次数是否大于等于3
if (data.abnormal_data_count >= 3)
{
return PAK_ERROR;
}
}
return PAK_OK;
}
ENUM_PACK_RET_TYPE CDispatch::Inter_LoadEtc_dispatch_sig(void* a1, CUser* user, char* a3)
{
user->getCurCharacNo();
user->getCurCharacName();
user_map.Push(user, {});
return PAK_OK;
}
ENUM_PACK_RET_TYPE CDispatch::DisPatcher_ReturnToSelectCharacter_dispatch_sig(void* a1, CUser* user, char* a3)
{
user_map.Erase(user);
return PAK_OK;
}
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();
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);
}
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);
user->SendNotiPacketMessage(out_str, type);
}