2022-9-2 01:27:03
This commit is contained in:
@@ -11,6 +11,7 @@ include_directories(${PROJECT_SOURCE_DIR}/include)
|
||||
|
||||
# 添加库源文件
|
||||
set(LIB_SOURCE
|
||||
"dispatch.cpp"
|
||||
"controller.cpp"
|
||||
"df_main.cpp"
|
||||
|
||||
|
||||
19
src/base.h
19
src/base.h
@@ -42,7 +42,7 @@ namespace base
|
||||
|
||||
namespace CUser
|
||||
{
|
||||
const int get_acc_id=0x080DA36E;
|
||||
const int get_acc_id = 0x080DA36E;
|
||||
const int get_state = 0x080DA38C;
|
||||
const int CheckItemLock = 0x8646942;
|
||||
const int SendNotiPacketMessage = 0x86886CE;
|
||||
@@ -56,6 +56,7 @@ namespace base
|
||||
const int IsGameMasterMode = 0x0811EDEE;
|
||||
const int isGMUser = 0x0814589C;
|
||||
const int exchange_interspace = 0x0865F7B0;
|
||||
const int setLastPacketID = 0x0867CBC4;
|
||||
}
|
||||
|
||||
namespace CStackableItem
|
||||
@@ -101,6 +102,9 @@ namespace base
|
||||
|
||||
namespace PacketBuf
|
||||
{
|
||||
const int PacketBuf_make = 0x0858C8C0;
|
||||
const int PacketBuf_destroy = 0x0858C8DC;
|
||||
const int bind_packet = 0x0858D4DE;
|
||||
const int get_len = 0x0858DA52;
|
||||
const int get_buf_ptr = 0x0858DA38;
|
||||
const int get_byte = 0x858CF22;
|
||||
@@ -176,11 +180,18 @@ namespace base
|
||||
|
||||
namespace cMyTrace
|
||||
{
|
||||
const int cMyTrace_make =0x0854F746;
|
||||
const int operator_ = 0x0854F788;
|
||||
const int cMyTrace_destroy =0x0854F746;
|
||||
const int cMyTrace_make = 0x0854F746;
|
||||
const int operator_ = 0x0854F788;
|
||||
const int cMyTrace_destroy = 0x0854F746;
|
||||
}
|
||||
|
||||
namespace IPacketDispatcher
|
||||
{
|
||||
namespace ParamBase
|
||||
{
|
||||
const int dispatch_template = 0x081258B6;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -6,9 +6,10 @@
|
||||
// Copyright (c) 2022. Vance All rights reserved
|
||||
//************************************
|
||||
|
||||
#include "controller.hpp"
|
||||
#include "controller.h"
|
||||
|
||||
Controller::Controller() :
|
||||
old_IPacketDispatcher_ParamBase_dispatch_template((IPacketDispatcher_ParamBase_dispatch_template_Type*)base::IPacketDispatcher::ParamBase::dispatch_template),
|
||||
old_UseJewel_dispatch_sig((UseJewel_dispatch_sig_Type*)base::Dispatcher_UseJewel::dispatch_sig),
|
||||
old_PacketDispatcher_doDispatch((PacketDispatcher_doDispatch_Type*)base::PacketDispatcher::doDispatch)
|
||||
{
|
||||
@@ -33,6 +34,8 @@ void Controller::init()
|
||||
|
||||
|
||||
|
||||
//mhook_IPacketDispatcher_ParamBase_dispatch_template.Hook((void**)&old_IPacketDispatcher_ParamBase_dispatch_template, (void*)hook_IPacketDispatcher_ParamBase_dispatch_template);
|
||||
|
||||
mhook_PacketDispatcher_doDispatch.Hook((void**)&old_PacketDispatcher_doDispatch, (void*)hook_PacketDispatcher_doDispatch);
|
||||
|
||||
mhook_UseJewel_dispatch_sig.Hook((void**)&old_UseJewel_dispatch_sig, (void*)hook_UseJewel_dispatch_sig);
|
||||
@@ -41,6 +44,33 @@ void Controller::init()
|
||||
|
||||
}
|
||||
|
||||
int Controller::hook_IPacketDispatcher_ParamBase_dispatch_template(int a1, int a2, int a3)
|
||||
{
|
||||
//[root@nimzgryilkxubzo game] # [DNF_PROJECT] Recv() class :1 id : 84 len : 21 callback : 0x81258b6 (nil)0x81258b6 0x8125a06 (nil)(nil)
|
||||
// [DNF_PROJECT] + 12 0x8bd8d54 : Dispatcher_ModItemAttr::dispatch_sig(CUser *,PacketBuf &)
|
||||
// [DNF_PROJECT] + 16 0x8bd8d58 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::check_state(CUser *,PacketBuf &)
|
||||
// [DNF_PROJECT] + 20 0x8bd8d5c : Dispatcher_ModItemAttr::read(PacketBuf &,MSG_BASE &)
|
||||
// [DNF_PROJECT] + 24 0x8bd8d60 : Dispatcher_ModItemAttr::process(CUser *,MSG_BASE &,ParamBase &)
|
||||
// [DNF_PROJECT] + 28 0x8bd8d64 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::send(CUser *,ParamBase&)
|
||||
//
|
||||
//
|
||||
// [DNF_PROJECT] + 12 0x8bd7dd4 : Dispatcher_Antibot::dispatch_sig
|
||||
// [DNF_PROJECT] + 16 0x8bd7dd8 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::check_state(CUser *,PacketBuf &)
|
||||
// [DNF_PROJECT] + 20 0x8bd7ddc : Dispatcher_Antibot::read(PacketBuf &,MSG_BASE &)
|
||||
// [DNF_PROJECT] + 24 0x8bd7de0 : Dispatcher_Antibot::process(CUser *,MSG_BASE &,ParamBase &)
|
||||
// [DNF_PROJECT] + 28 0x8bd7de4 : IPacketDispatcher<MSG_BASE,ParamBase,(ch_state)0>::send(CUser *,ParamBase&)
|
||||
|
||||
|
||||
//LOG("ParamBase_dispatch_template[ +12 :%p +16 :%p +20 :%p +24 :%p +28 :%p ]"
|
||||
// , *(int*)a1 + 12
|
||||
// , *(int*)a1 + 16
|
||||
// , *(int*)a1 + 20
|
||||
// , *(int*)a1 + 24
|
||||
// , *(int*)a1 + 28
|
||||
//);
|
||||
Controller::Get()->old_IPacketDispatcher_ParamBase_dispatch_template(a1, a2, a3);
|
||||
}
|
||||
|
||||
int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pUser, PacketBuf* pBuf)
|
||||
{
|
||||
printf("getCurCharacName :%s \n", pUser->getCurCharacName().c_str());
|
||||
@@ -50,7 +80,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
|
||||
// printf("pBuf :%s \n", Util::ToHexString((const unsigned char*)pBuf->get_buf_ptr(0),40).c_str());
|
||||
int state = pUser->get_state();
|
||||
printf("state :%d \n", state);
|
||||
LOG("state :%d \n", state);
|
||||
//校验角色状态是否允许镶嵌
|
||||
if (state != 3)
|
||||
return 0;
|
||||
@@ -62,13 +92,13 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
|
||||
//时装所在的背包槽
|
||||
int avartar_inven_slot = pBuf->get_short();
|
||||
printf("avartar_inven_slot :%d \n", avartar_inven_slot);
|
||||
LOG("avartar_inven_slot :%d \n", avartar_inven_slot);
|
||||
//时装item_id
|
||||
int avartar_item_id = pBuf->get_int();
|
||||
printf("avartar_item_id :%d \n", avartar_item_id);
|
||||
LOG("avartar_item_id :%d \n", avartar_item_id);
|
||||
//本次镶嵌徽章数量
|
||||
int emblem_cnt = pBuf->get_byte();
|
||||
printf("emblem_cnt :%d \n", emblem_cnt);
|
||||
LOG("emblem_cnt :%d \n", emblem_cnt);
|
||||
|
||||
if (pUser->CheckItemLock(2, avartar_inven_slot))
|
||||
{
|
||||
@@ -80,20 +110,20 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
CInventory* inven = pUser->getCurCharacInvenW();
|
||||
if (!inven)
|
||||
{
|
||||
printf("pUser->getCurCharacInvenW : error \n");
|
||||
LOG("pUser->getCurCharacInvenW : error \n");
|
||||
return 0;
|
||||
}
|
||||
Inven_Item* avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_AVARTAR, avartar_inven_slot);
|
||||
if (!avartar)
|
||||
{
|
||||
printf("inven->GetInvenRef : error \n");
|
||||
LOG("inven->GetInvenRef : error \n");
|
||||
return 0;
|
||||
}
|
||||
//校验时装 数据是否合法
|
||||
if (avartar->isEmpty() || (avartar->getKey() != avartar_item_id) || pUser->CheckItemLock(2, avartar_inven_slot))
|
||||
{
|
||||
|
||||
printf("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
|
||||
LOG("avartar->isEmpty() || avartar->getKey() || pUser->CheckItemLock() : error \n");
|
||||
return 0;
|
||||
}
|
||||
//获取时装插槽数据
|
||||
@@ -102,11 +132,11 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
int jewel_socket_data = inven_avartar_mgr->getJewelSocketData(avartar_add_info);
|
||||
if (!jewel_socket_data)
|
||||
{
|
||||
printf("jewel_socket_data : error \n");
|
||||
LOG("jewel_socket_data : error \n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
printf("jewel_socket_data :%s \n", Util::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str());
|
||||
LOG("jewel_socket_data :%s \n", Util::ToHexString((const unsigned char*)jewel_socket_data, 40).c_str());
|
||||
if (emblem_cnt <= 3)
|
||||
{
|
||||
std::map<int, std::pair<int, int>> emblems;
|
||||
@@ -124,7 +154,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
//校验徽章及插槽数据是否合法
|
||||
if (emblem->isEmpty() || (emblem->getKey() != emblem_item_id) || (avartar_socket_slot >= 3))
|
||||
{
|
||||
printf("emblem->isEmpty() || (emblem->getKey() : error \n");
|
||||
LOG("emblem->isEmpty() || (emblem->getKey() : error \n");
|
||||
pUser->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
@@ -135,14 +165,14 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
CDataManager* DataManager = CDataManager::G_CDataManager();
|
||||
if (!DataManager)
|
||||
{
|
||||
printf("CDataManager::G_CDataManager() : error \n");
|
||||
LOG("CDataManager::G_CDataManager() : error \n");
|
||||
pUser->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
CItem* citem = DataManager->find_item(emblem_item_id);
|
||||
if (!citem)
|
||||
{
|
||||
printf("DataManager->find_item() : error \n");
|
||||
LOG("DataManager->find_item() : error \n");
|
||||
pUser->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
@@ -150,7 +180,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
//校验徽章类型
|
||||
if (!citem->is_stackable() || (citem->GetItemType() != 20))
|
||||
{
|
||||
printf("citem->is_stackable() || (citem->GetItemType() : error \n");
|
||||
LOG("citem->is_stackable() || (citem->GetItemType() : error \n");
|
||||
pUser->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
@@ -163,14 +193,14 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
if (!(emblem_socket_type & avartar_socket_type))
|
||||
{
|
||||
//插槽类型不匹配
|
||||
printf("emblem_socket_type & avartar_socket_type\n");
|
||||
LOG("emblem_socket_type & avartar_socket_type\n");
|
||||
pUser->SendCmdErrorPacket(205, 209);
|
||||
return 0;
|
||||
}
|
||||
printf("avartar_socket_slot:%d emblem_inven_slot:%d emblem_item_id:%d\n", avartar_socket_slot, emblem_inven_slot, emblem_item_id);
|
||||
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);
|
||||
}
|
||||
printf("数据已读取!!!\n");
|
||||
LOG("数据已读取!!!\n");
|
||||
|
||||
for (auto& avartar_socket_slot : emblems)
|
||||
{
|
||||
@@ -181,7 +211,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
//设置时装插槽数据
|
||||
int emblem_item_id = avartar_socket_slot.second.second;
|
||||
*(int*)(jewel_socket_data + avartar_socket_slot.first * 6 + 2) = emblem_item_id;
|
||||
printf("徽章item_id=%d 已成功镶嵌进avartar_socket_slot=%d 的槽内!\n", emblem_item_id, avartar_socket_slot);
|
||||
LOG("徽章item_id=%d 已成功镶嵌进avartar_socket_slot=%d 的槽内!\n", emblem_item_id, avartar_socket_slot);
|
||||
}
|
||||
|
||||
//时装插槽数据存档
|
||||
@@ -189,7 +219,7 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
|
||||
//通知客户端时装数据已更新
|
||||
pUser->SendUpdateItemList(1, 1, avartar_inven_slot);
|
||||
printf("徽章镶嵌完毕!!!\n");
|
||||
LOG("徽章镶嵌完毕!!!");
|
||||
//回包给客户端
|
||||
InterfacePacketBuf* packet_guard = (InterfacePacketBuf*)PacketGuard::NewPacketGuard();
|
||||
|
||||
@@ -204,40 +234,51 @@ int Controller::hook_UseJewel_dispatch_sig(void* pDispatcher_UseJewel, CUser* pU
|
||||
return 0;
|
||||
}
|
||||
|
||||
int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* user, int packet_class, int packet_id, void* packet_src, int pecakt_len, int a7, int a8)
|
||||
int Controller::hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* user, int packet_class, int packet_id, char* packet_src, int packet_len, int a7, int a8)
|
||||
{
|
||||
void* pAction = *a1->get_dispatcher(packet_id);
|
||||
|
||||
if (pAction)
|
||||
int(***dispatcher)(int, CUser*, char*) = (int(***)(int, CUser*, char*))a1->get_dispatcher(packet_id);
|
||||
if (dispatcher)
|
||||
{
|
||||
LOG("Recv() class:%d id:%d len:%d data:%s callback:%p %p %p %p %p %p "
|
||||
//v32 = (**dispatcher)(dispatcher, user, v25);
|
||||
LOG("Recv() class:%d id:%d len:%d %p [ +00 :%p +12 :%p +16 :%p +20 :%p +24 :%p +28 :%p ]"
|
||||
, packet_class
|
||||
, packet_id
|
||||
, pecakt_len
|
||||
, Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str()
|
||||
, *((void**)pAction)
|
||||
, (void*)*((unsigned int*)pAction + 12)
|
||||
, (void*)*((unsigned int*)pAction + 16)
|
||||
, (void*)*((unsigned int*)pAction + 20)
|
||||
, (void*)*((unsigned int*)pAction + 24)
|
||||
, (void*)*((unsigned int*)pAction + 28)
|
||||
);
|
||||
}
|
||||
else
|
||||
{
|
||||
LOG("Recv() class:%d id:%d len:%d data:%s "
|
||||
, packet_class
|
||||
, packet_id
|
||||
, pecakt_len
|
||||
, Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str()
|
||||
, packet_len
|
||||
, (**dispatcher)
|
||||
, *(int*)dispatcher
|
||||
, *(int*)dispatcher + 12
|
||||
, *(int*)dispatcher + 16
|
||||
, *(int*)dispatcher + 20
|
||||
, *(int*)dispatcher + 24
|
||||
, *(int*)dispatcher + 28
|
||||
);
|
||||
|
||||
}
|
||||
|
||||
if (packet_id == Packet_UseItem)
|
||||
|
||||
if (packet_id == Packet_UseEquipmentMoveItem)
|
||||
{
|
||||
LOG("hook_PacketDispatcher_doDispatch packet_data :%s ", Util::ToHexString((const unsigned char*)packet_src, pecakt_len).c_str());
|
||||
PacketBuf* v25 = PacketBuf::NewPacketBuf();
|
||||
user->setLastPacketID(packet_id);
|
||||
v25->bind_packet(packet_src, packet_len);
|
||||
|
||||
|
||||
|
||||
LOG("Recv() class:%d id:%d len:%d packet_data :%s "
|
||||
, packet_class
|
||||
, packet_id
|
||||
, packet_len
|
||||
, Util::ToHexString((const unsigned char*)packet_src, packet_len).c_str()
|
||||
);
|
||||
|
||||
int result = CDispatch::Get()->UseEquipmentMoveItem(user, v25);
|
||||
|
||||
|
||||
|
||||
PacketBuf::DelPacketBuf(v25);
|
||||
return result;
|
||||
}
|
||||
return Controller::Get()->old_PacketDispatcher_doDispatch(a1, user, packet_class, packet_id, packet_src, pecakt_len, a7, a8);
|
||||
return Controller::Get()->old_PacketDispatcher_doDispatch(a1, user, packet_class, packet_id, packet_src, packet_len, a7, a8);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
#include "import.h"
|
||||
#include "Singleton.hpp"
|
||||
#include "sdk_class.hpp"
|
||||
#include "inline_hook.h"
|
||||
#include "utils.hpp"
|
||||
#include "dispatch.h"
|
||||
|
||||
|
||||
#define MAIN_OFFSET(offset) ((void *)((0x8048000) + (offset)))
|
||||
#define SUBHOOK_INIT(func, addr) \
|
||||
@@ -24,6 +21,8 @@ public:
|
||||
|
||||
|
||||
private:
|
||||
|
||||
static int hook_IPacketDispatcher_ParamBase_dispatch_template(int a1, int a2, int a3);
|
||||
/**
|
||||
* @brief hook修复镶嵌徽章
|
||||
* @param pDispatcher_UseJewel
|
||||
@@ -45,9 +44,12 @@ private:
|
||||
* @param a8
|
||||
* @return
|
||||
*/
|
||||
static int hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* a2, int a3, int packet_id, void* packet_src, int pecakt_len, int a7, int a8);
|
||||
static int hook_PacketDispatcher_doDispatch(PacketDispatcher* a1, CUser* a2, int a3, int packet_id, char* packet_src, int pecakt_len, int a7, int a8);
|
||||
|
||||
private:
|
||||
using IPacketDispatcher_ParamBase_dispatch_template_Type = decltype(hook_IPacketDispatcher_ParamBase_dispatch_template);
|
||||
IPacketDispatcher_ParamBase_dispatch_template_Type* old_IPacketDispatcher_ParamBase_dispatch_template;
|
||||
|
||||
using UseJewel_dispatch_sig_Type = decltype(hook_UseJewel_dispatch_sig);
|
||||
UseJewel_dispatch_sig_Type* old_UseJewel_dispatch_sig;
|
||||
|
||||
@@ -56,6 +58,7 @@ private:
|
||||
|
||||
|
||||
private:
|
||||
FuncHook mhook_IPacketDispatcher_ParamBase_dispatch_template;
|
||||
FuncHook mhook_UseJewel_dispatch_sig;
|
||||
FuncHook mhook_PacketDispatcher_doDispatch;
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "import.h"
|
||||
#include "controller.hpp"
|
||||
#include "controller.h"
|
||||
#define MY_VERSION ("BuildTime: " __DATE__ " " __TIME__)
|
||||
|
||||
char szGamePath[256];
|
||||
int n_sleep_time = 10000;
|
||||
@@ -509,7 +510,7 @@ int _reach_game_world(void* pThis, void* a2)
|
||||
int _Inter_LoadEtc_dispatch_sig(void* pThis, void* pUser, char* a3)
|
||||
{
|
||||
int result = Inter_LoadEtc_dispatch_sig(pThis, pUser, a3);
|
||||
printf("_Inter_LoadEtc_dispatch_sig begin");
|
||||
LOG("_Inter_LoadEtc_dispatch_sig begin");
|
||||
|
||||
//typedef double(__cdecl* FN_sqrt)(_In_ double _X);
|
||||
|
||||
@@ -517,14 +518,14 @@ int _Inter_LoadEtc_dispatch_sig(void* pThis, void* pUser, char* a3)
|
||||
|
||||
CUserCharacInfo_getCurCharacNo getCurCharacNo = (CUserCharacInfo_getCurCharacNo)(0x080CBC4E);
|
||||
int CurCharacNo = getCurCharacNo(pUser);
|
||||
printf("CurCharacNo :%d", CurCharacNo);
|
||||
LOG("CurCharacNo :%d", CurCharacNo);
|
||||
|
||||
CUserCharacInfo_getCurCharacName getCurCharacName = (CUserCharacInfo_getCurCharacName)0x8101028;
|
||||
|
||||
char* name = getCurCharacName(pUser);
|
||||
printf("CurCharacName :%s", name);
|
||||
LOG("CurCharacName :%s", name);
|
||||
|
||||
printf("_Inter_LoadEtc_dispatch_sig end");
|
||||
LOG("_Inter_LoadEtc_dispatch_sig end");
|
||||
return result;
|
||||
}
|
||||
|
||||
@@ -550,8 +551,8 @@ void loga()
|
||||
|
||||
//ServerParameterScript::setDungeonOpen
|
||||
|
||||
//CodeHook::WriteUChar(MAIN_OFFSET(0x22069B), 0x01);
|
||||
//ServerParameterScript::isDungeonOpen
|
||||
//CodeHook::WriteUChar(MAIN_OFFSET(0x22069B), 0x01);
|
||||
//ServerParameterScript::isDungeonOpen
|
||||
CodeHook::WriteUChar(MAIN_OFFSET(0x220894), 0x01);
|
||||
//Init DataManager
|
||||
CodeHook::WriteUChar(MAIN_OFFSET(0x258E80), 0xEB);
|
||||
@@ -623,14 +624,14 @@ void loga()
|
||||
void PrintTag()
|
||||
{
|
||||
printf("\n");
|
||||
printf("**********************************************************\n");
|
||||
printf("* DNF Server Plugin V%d.%02d *\n", Ver, Patch);
|
||||
printf("* *\n");
|
||||
printf("* /\\ /\\ *\n");
|
||||
printf("* *\n");
|
||||
printf("* __ Auther:Larva *\n");
|
||||
printf("* QQ Group:81411049 *\n");
|
||||
printf("**********************************************************\n");
|
||||
LOG("**********************************************************");
|
||||
LOG(" DNF Server Plugin %s ", MY_VERSION);
|
||||
LOG(" ");
|
||||
LOG(" /\\ /\\ ");
|
||||
LOG(" ");
|
||||
LOG(" __ ");
|
||||
LOG(" By:Vance ");
|
||||
LOG("**********************************************************");
|
||||
}
|
||||
|
||||
|
||||
|
||||
132
src/dispatch.cpp
Normal file
132
src/dispatch.cpp
Normal file
@@ -0,0 +1,132 @@
|
||||
//************************************
|
||||
// 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()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
int CDispatch::UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf)
|
||||
{
|
||||
int result = 0;
|
||||
|
||||
if (pBuf)
|
||||
{
|
||||
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(83, 213);
|
||||
return result;
|
||||
}
|
||||
|
||||
CInventory* inven = user->getCurCharacInvenW();
|
||||
if (!inven)
|
||||
{
|
||||
LOG("user->getCurCharacInvenW : error \n");
|
||||
return result;
|
||||
}
|
||||
|
||||
Inven_Item* equipment_avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, equipment_pos);
|
||||
if (!equipment_avartar)
|
||||
{
|
||||
LOG("inven->GetInvenRef : error \n");
|
||||
return result;
|
||||
}
|
||||
Inven_Item* item_avartar = inven->GetInvenRef(CInventory::INVENTORY_TYPE_ITEM, item_pos);
|
||||
if (!item_avartar)
|
||||
{
|
||||
LOG("inven->GetInvenRef : error \n");
|
||||
return result;
|
||||
}
|
||||
|
||||
if (equipment_avartar->isEmpty() )
|
||||
{
|
||||
LOG("服务器背包为空");
|
||||
return result;
|
||||
}
|
||||
if (equipment_avartar->getKey() != equipment_id)
|
||||
{
|
||||
LOG("需要操作的装备ID和数据库的装备ID不一致");
|
||||
return result;
|
||||
}
|
||||
|
||||
if (item_avartar->isEmpty())
|
||||
{
|
||||
LOG("需要操作的物品为空");
|
||||
return result;
|
||||
}
|
||||
|
||||
int item_id = item_avartar->getKey();
|
||||
|
||||
CDataManager* DataManager = CDataManager::G_CDataManager();
|
||||
|
||||
if (!DataManager)
|
||||
{
|
||||
LOG("G_CDataManager 错误");
|
||||
return result;
|
||||
}
|
||||
|
||||
CItem* equipment_citem = DataManager->find_item(equipment_id);
|
||||
CItem* item_citem = DataManager->find_item(item_id);
|
||||
|
||||
if (!equipment_citem || !item_citem)
|
||||
{
|
||||
LOG("获取pvf中数据失败!");
|
||||
return result;
|
||||
}
|
||||
|
||||
LOG("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
|
||||
LOG("Data: equipment_citem->GetItemType=%d item_citem->is_stackable=%d item_citem->GetItemType=%d"
|
||||
, equipment_citem->GetItemType()
|
||||
, item_citem->is_stackable()
|
||||
, item_citem->GetItemType()
|
||||
|
||||
);
|
||||
|
||||
//if (!item_citem->is_stackable() || (equipment_citem->GetItemType() != 20))
|
||||
//{
|
||||
// LOG("citem->is_stackable() || (citem->GetItemType() : error \n");
|
||||
// pUser->SendCmdErrorPacket(205, 209);
|
||||
// return 0;
|
||||
//}
|
||||
|
||||
/*
|
||||
缓冲Call (2000)
|
||||
密钥Call (装备位置,2)
|
||||
密钥Call (装备代码,4)
|
||||
密钥Call (物品位置,2)
|
||||
发包Call ()
|
||||
*/
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
28
src/dispatch.h
Normal file
28
src/dispatch.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#pragma once
|
||||
#ifndef __DISPATCH_H__
|
||||
#define __DISPATCH_H__
|
||||
#include "import.h"
|
||||
#include "inline_hook.h"
|
||||
#include "Singleton.h"
|
||||
#include "sdk_class.h"
|
||||
#include "utils.h"
|
||||
|
||||
class CDispatch
|
||||
{
|
||||
public:
|
||||
SINGLETON_DEFINE_S(CDispatch);
|
||||
CDispatch();
|
||||
~CDispatch();
|
||||
public:
|
||||
int UseEquipmentMoveItem(CUser* user, PacketBuf* pBuf);
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
private:
|
||||
|
||||
};
|
||||
|
||||
|
||||
#endif // __DISPATCH_H__
|
||||
|
||||
@@ -3,5 +3,6 @@ enum ENUM_PACKET_ID
|
||||
{
|
||||
Packet_UseItem = 84,
|
||||
|
||||
Packet_UseEquipmentMoveItem = 2000,
|
||||
};
|
||||
|
||||
};
|
||||
@@ -25,7 +25,6 @@ template<typename R, typename A, typename ... ARG> R CallT(A call_addr, const AR
|
||||
return R();
|
||||
}
|
||||
|
||||
class PacketBuf;
|
||||
class DB_UpdateAvatarJewelSlot;
|
||||
class CInventory;
|
||||
class CStackableItem;
|
||||
@@ -162,6 +161,12 @@ public:
|
||||
typedef int (*__func)(CUser* a1, PacketGuard* a2);
|
||||
return int(((__func)base::CUser::Send)(this, a2));
|
||||
}
|
||||
|
||||
CUser* setLastPacketID(int a2)
|
||||
{
|
||||
return CallT<CUser*>(base::CUser::setLastPacketID, this, a2);
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
class CStackableItem
|
||||
@@ -312,6 +317,24 @@ public:
|
||||
class PacketBuf
|
||||
{
|
||||
public:
|
||||
|
||||
static PacketBuf* NewPacketBuf()
|
||||
{
|
||||
void* v62 = malloc(0x20000);
|
||||
return CallT<PacketBuf*>(base::PacketBuf::PacketBuf_make, v62);
|
||||
}
|
||||
|
||||
static void DelPacketBuf(PacketBuf* a1)
|
||||
{
|
||||
CallT<int>(base::PacketBuf::PacketBuf_destroy, a1);
|
||||
free(a1);
|
||||
}
|
||||
|
||||
int bind_packet(char* a2, int a3)
|
||||
{
|
||||
return CallT<int>(base::PacketBuf::bind_packet, this, a2, a3);
|
||||
}
|
||||
|
||||
//取大小
|
||||
int get_len()
|
||||
{
|
||||
@@ -42,7 +42,7 @@ namespace Util
|
||||
nSize = vsnprintf(buff, sizeof(buff), formatstring, args);
|
||||
va_end(args);
|
||||
char szPrINT32[BUFFCOUNT + 50] = { 0 };
|
||||
sprintf(szPrINT32, "[GameHelpers] %s \n", buff);//wsprintfA
|
||||
sprintf(szPrINT32, "[DNF_PROJECT] %s \n", buff);//wsprintfA
|
||||
printf(szPrINT32);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user