88.网游逆向分析与插件开发-物品使用-物品使用策略管理UI的设计

内容参考于:易道云信息技术研究院VIP课

上一个内容:物品交换的逆向分析与C++封装-CSDN博客

码云地址(ui显示角色数据 分支):https://gitee.com/dye_your_fingers/sro_-ex.git

码云版本号:f1b9b1a69ac3e2c32a671a9d34f38bf5b02c9ac1

代码下载地址,在 SRO_EX 目录下,文件名为:SRO_Ex-物品使用策略管理UI的设计.zip

链接:https://pan.baidu.com/s/1W-JpUcGOWbSJmMdmtMzYZg

提取码:q9n5

--来自百度网盘超级会员V4的分享

HOOK引擎,文件名为:黑兔sdk.zip

链接:https://pan.baidu.com/s/1IB-Zs6hi3yU8LC2f-8hIEw

提取码:78h8

--来自百度网盘超级会员V4的分享

以 物品交换的逆向分析与C++封装-CSDN博客 它的代码为基础进行修改

添加控件:

窗口0

 窗口1

变量的名是什么详情看:mfc的添加变量

CUIWnd_0.h文件的修改:添加ui输入框变量

#pragma once
#include "afxdialogex.h"

// CUIWnd_0 对话框

class CUIWnd_0 : public CDialogEx
{
	DECLARE_DYNAMIC(CUIWnd_0)

public:
	CUIWnd_0(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CUIWnd_0();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE_0 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	// 玩家信息
	CString txt_Player;
	BOOL OnInitDialog();
	void ShowPlayerTxt();
	CString txtWeapon;
	CString txtMP;
	CString txtHPEx;
	CString txtHP;
	int HpMin;
	int HpExMin;
	int MpMin;
	afx_msg void OnBnClickedButton1();
};

CUIWnd_0.cpp文件的修改:新加 OnBnClickedButton1函数,OnBnClickedButton1函数是应用按钮的点击事件处理函数

// CUIWnd_0.cpp: 实现文件
//

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_0.h"
#include "GameBase.h"
#include "extern_all.h"

// CUIWnd_0 对话框
CUIWnd_0* UI_0;
void _stdcall TimeProc(HWND, UINT, UINT_PTR, DWORD) {
	if (UI_0) {
		UI_0->ShowPlayerTxt();
	}
}

IMPLEMENT_DYNAMIC(CUIWnd_0, CDialogEx)

CUIWnd_0::CUIWnd_0(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_0, pParent)
	, txt_Player(_T(""))
	, txtWeapon(_T("瞬间回城卷轴"))
	, txtMP(_T("MP 回复草药 (特)"))
	, txtHPEx(_T("紫色棒棒糖"))
	, txtHP(_T("HP 回复草药 (特)"))
	, HpMin(75)
	, HpExMin(40)
	, MpMin(60)
{
	UI_0 = this;
}

CUIWnd_0::~CUIWnd_0()
{
}

void CUIWnd_0::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Text(pDX, IDC_EDIT1, txt_Player);
	DDX_Text(pDX, IDC_EDIT9, txtWeapon);
	DDX_Text(pDX, IDC_EDIT5, txtMP);
	DDX_Text(pDX, IDC_EDIT6, txtHPEx);
	DDX_Text(pDX, IDC_EDIT7, txtHP);
	DDX_Text(pDX, IDC_EDIT2, HpMin);
	DDX_Text(pDX, IDC_EDIT3, HpExMin);
	DDX_Text(pDX, IDC_EDIT4, MpMin);
}

BOOL CUIWnd_0::OnInitDialog()
{
	CDialogEx::OnInitDialog();
	::SetTimer(this->m_hWnd, 0x100001, 10, TimeProc);
	return TRUE;
}

void CUIWnd_0::ShowPlayerTxt()
{
	UpdateData(TRUE);
	if ((_pgamebase) && (_pgamebase->SRO_Player)) {
		CString txtTmp;
		txtTmp.Format(L"角色名:[%s] 等级[lv:%d]\r\n", _pgamebase->SRO_Player->Name.wcstrByName(), _pgamebase->SRO_Player->LV);
		txt_Player = txtTmp;
		txtTmp.Format(L"经验值:[%d] 技能点[%d]\r\n", _pgamebase->SRO_Player->Exp, _pgamebase->SRO_Player->SkillPoint);
		txt_Player += txtTmp;
		txtTmp.Format(L"血量:[%d/%d]\r\n", _pgamebase->SRO_Player->HP, _pgamebase->SRO_Player->MaxHP);
		txt_Player += txtTmp;
		txtTmp.Format(L"蓝量:[%d/%d]\r\n", _pgamebase->SRO_Player->MP, _pgamebase->SRO_Player->MaxMP);
		txt_Player += txtTmp;
		txtTmp.Format(L"坐标:[%f][%f][%f]\r\n", _pgamebase->SRO_Player->x, _pgamebase->SRO_Player->h, _pgamebase->SRO_Player->y);
		txt_Player += txtTmp;
		// 计算百分比
		txtTmp.Format(L"怒气:[%f/100]\r\n", (float)_pgamebase->SRO_Player->Rage/5*100);
		txt_Player += txtTmp;
	}
	UpdateData(FALSE);
}


BEGIN_MESSAGE_MAP(CUIWnd_0, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CUIWnd_0::OnBnClickedButton1)
END_MESSAGE_MAP()


// CUIWnd_0 消息处理程序


void CUIWnd_0::OnBnClickedButton1()
{
	UpdateData(TRUE);
}

CUIWnd_1.h文件的修改:添加了列表的点击事件

#pragma once
#include "afxdialogex.h"

// CUIWnd_1 对话框

class CUIWnd_1 : public CDialogEx
{
	DECLARE_DYNAMIC(CUIWnd_1)

public:
	CUIWnd_1(CWnd* pParent = nullptr);   // 标准构造函数
	virtual ~CUIWnd_1();

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_PAGE_1 };
#endif

protected:
	virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持

	DECLARE_MESSAGE_MAP()
public:
	afx_msg void OnBnClickedButton1();
	CListBox lstPack;
	afx_msg void OnBnClickedButton2();
	afx_msg void OnBnClickedButton3();
	CString txtInfo;
	afx_msg void OnLbnSelchangeList1();
};

CUIWnd_1.cpp文件的修改:添加了列表的点击事件

// CUIWnd_1.cpp: 实现文件
//

#include "pch.h"
#include "htdMfcDll.h"
#include "CUIWnd_1.h"
#include "afxdialogex.h"
#include "extern_all.h"


// CUIWnd_1 对话框

IMPLEMENT_DYNAMIC(CUIWnd_1, CDialogEx)

CUIWnd_1::CUIWnd_1(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_PAGE_1, pParent)
	, txtInfo(_T(""))
{

}

CUIWnd_1::~CUIWnd_1()
{
}

void CUIWnd_1::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_LIST1, lstPack);
	DDX_Text(pDX, IDC_EDIT1, txtInfo);
}


BEGIN_MESSAGE_MAP(CUIWnd_1, CDialogEx)
	ON_BN_CLICKED(IDC_BUTTON1, &CUIWnd_1::OnBnClickedButton1)
	ON_BN_CLICKED(IDC_BUTTON2, &CUIWnd_1::OnBnClickedButton2)
	ON_BN_CLICKED(IDC_BUTTON3, &CUIWnd_1::OnBnClickedButton3)
	ON_LBN_SELCHANGE(IDC_LIST1, &CUIWnd_1::OnLbnSelchangeList1)
END_MESSAGE_MAP()


// CUIWnd_1 消息处理程序


void CUIWnd_1::OnBnClickedButton1()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PBackPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetPackBack();

	lstPack.ResetContent();
	for (int i = 0; i < _PackBack->PackCount(); i++)
	{

		PITEM item = _PackBack->GetItem(i);
		if ((item != NULL) && (item->Type)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}

}


void CUIWnd_1::OnBnClickedButton2()
{
	// int count = _pgamebase->SRO_Control->GetPPack()->GetPackBack()->PackCount();
	CString tmp;
	// tmp.Format(L"%d", count);
	// AfxMessageBox(tmp);
	PEquipPack _PackBack = _pgamebase->SRO_Control->GetPPack()->GetEquipBack();

	lstPack.ResetContent();
	for (int i = 0; i < 13; i++)
	{

		PITEM item = _PackBack->GetItem((EquipType)i);
		if ((item != NULL) && (item->Type > 0)) {
			tmp.Format(L"[%s][数量:%d][耐久:%d/%d]\n", item->GetNameByWide(), item->Count, item->Durabillty, item->MaxDurabillty);
			lstPack.AddString(tmp);
		}
	}
}


void CUIWnd_1::OnBnClickedButton3()
{
	// 不能一起调用,如果一起调用只有第一个会生效,可能需要多线程处理,多线程时需要加锁防止出现数据冲突的问题
	// _pgamebase->SRO_Control->MangeItem(0x46, 0x7, 0x0, 0x0);// 丢物品
	// _pgamebase->SRO_Control->MangeItem(0x46, 0x1, 0x47, 0x6);// 穿装备
	// _pgamebase->SRO_Control->MangeItem(0x46, 0x4, 0x47, 0x6);// 换装备
	// _pgamebase->SRO_Control->MangeItem(0x46, 0x10, 0x46, 0x16, -1);// 移动物品
	_pgamebase->SRO_Control->MangeItem(0x46, 0x5, 0x46, 0x17, 2000);// 拆分物品


}

void CUIWnd_1::OnLbnSelchangeList1()
{
	int n = lstPack.GetCurSel();
	if (n > -1) {
		lstPack.GetText(n, txtInfo);
		UpdateData(FALSE);
	}
}

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-02 09:00:07       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-02 09:00:07       106 阅读
  3. 在Django里面运行非项目文件

    2024-02-02 09:00:07       87 阅读
  4. Python语言-面向对象

    2024-02-02 09:00:07       96 阅读

热门阅读

  1. 【Git】多个托管平台Git账户配置

    2024-02-02 09:00:07       51 阅读
  2. C++ 多线程

    2024-02-02 09:00:07       40 阅读
  3. Django 中的 connection.cursor() 执行 SQL 用法

    2024-02-02 09:00:07       39 阅读
  4. git 删除gitlab上指定的文件夹或者文件

    2024-02-02 09:00:07       47 阅读
  5. [Git版本控制系统]

    2024-02-02 09:00:07       51 阅读
  6. Oracle Months_between 用法

    2024-02-02 09:00:07       54 阅读
  7. IP 了解

    IP 了解

    2024-02-02 09:00:07      52 阅读
  8. C# 求幂算法,最大公约数,最小公倍数

    2024-02-02 09:00:07       49 阅读
  9. js寄⽣组合继承和优缺点

    2024-02-02 09:00:07       49 阅读