số biến thành viên cần dùng
(phần ... là phần dữ liệu chưa dùng tới, các bạn phải
đặt một mảng BYTE với kích thước tương ứng vào đó
để các địa chỉ OFFSET của các biến được chính xác)
Code:
#define NPC_BASE_ADD 0x00D3A570
#define NPC_DATA_SIZE 0x00007E4C
#define MAX_NPC 256
#define PLAYER_INDEX 1
class CNpc
{
...
DWORD m_NpcKind; //0x0020 1=mod, 1=player,...
...
DWORD m_Doing; //0x00EC 1=stand, 2=walk,
3=run...
...
int m_CurLife; //0x0B44
int m_CurLifeMax;
int m_CurLifeRep;
int m_CurMana;
int m_CurManaMax;
...
BOOL m_bRideHorse; //0x0D58
char Name[32">; //0x0D5C Ten nhan vat
int m_n***;
...
BOOL m_FightMode; //0x0EAC
};
// Tim cua so va xac dinh Game Process Handle o
day
...
CNpc Npc;
LPBYTE lpBaseAdd, lpCurAdd;
//Read start Address of Npc Array
ReadProcessMemory(m_hVLProcess, (LPBYTE)NPC_
BASE_ADD, (LPVOID)&lpBaseAdd, 4, NULL);
//Start Address of PLAYER
lpCurAdd = lpBaseAdd + PLAYER_INDEX*NPC_DATA_
SIZE;
//Read PLAYER ìnormation
ReadProcessMemory(m_hVLProcess, lpCurAdd,
(LPVOID)&Npc, sizeof(CNpc), NULL);
...
Khi đọc được các thông số máu và mana rồi ta có thể
dùng hàm PostMessage(hWnd, WM_KEYDOWN...) để
gửi phím 1, 2, 3. Các bạn thấy ở trên có 1 biến m_
FightMode dùng để xác định nhân vật đang ở chế độ
đánh (ở bản đồ có quái) hoặc đang ở trong thành
(không dùng chiêu được). Căn cứ vào đó ta có thể gửi
phím 1, 2, 3 khi cần thiết (m_FightMode=TRUE). Nếu
nhân vật về thành rồi khỏi bơm máu nữa (nhiều khi
dính độc về cả phút mà cứ đứng trong thành bơm
máu thì phí quá).
Linh tinh khác: Game VLTK có định nghĩa một số hàm
macro có thể dùng ở dòng gõ CHAT, ví dụ:
“/Switch Horse”, “/Switch Sit”, “/SayPhrase 0”, , “/
SayPhrase 1” các bạn thử mà xem, cũng thũ vị lắm.
Các bạn mở file UIconfig.ini sẽ thấy nhiều hàm hơn.
Dưới đây là đoạn code mà có thể thêm vào chương
trình của mình dùng để chat hoặc chạy một hàm
macro trong Game. Bạn có thể lập trình lên xuống
ngựa hay ngồi xuống, đứng lên, ... mà ko phải dùng
WM_KEYDOWN gửi phím tắt V, M (vì ở chế độ phím
Mặc định, nhấn V sẽ ko ngồi đâu).
Code:
void PostChatMessage(LPCTSTR szChatMsg)
{
//Set focus to CHAT edit control
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_
RETURN, 0x001C0001);
//Clear CHAT edit control
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_
DOWN, 0x00500001);
while (szChatMsg[0">)
{
::PostMessage(m_hVLWin, WM_CHAR, LOBYTE
(szChatMsg[0">), 0);
szChatMsg++;
}
//Set focus to Game Window
::PostMessage(m_hVLWin, WM_KEYDOWN, VK_
RETURN, 0x001C0001);
}
Đến đây các bạn có thể lập được một chương trình tự
buff mana, ngồi rao bán hàng rồi đấy. Ở bài 2 tôi sẽ
nói về cách xác định tọa độ nhân vật (cũng giống như
của các Npc khác) và đồ. Địa chỉ OFFSET tọa độ của
nhân vật & Npc không phải là 0x10F8 như các bạn
tưởng đâu, đó là địa chỉ đích Npc sẽ chạy tới, sẽ đánh
tới... nếu nhân vật ngồi xuống, giá trị này sẽ bằng 0.
Bài 2 – Lấy thông tin về tọa độ nhân vật, tự tìm quái
đánh, tự nhặt đồ
Hix, được các bác admin quan tâm, em lại viết tiếp.
Bây giờ đến phần toạ độ của nhân vật. Bổ sung thêm
các biến thành viên vào lớp CNpc, chúng ta có các
thông tin về toạ độ và thông tin đối tượng cần đánh/
theo sau/ đồ cần nhặt:
Code:
class CNpc
{
public:
...
int m_NextAdd; //0x000C – xac dinh Npc ton tai hay
ko
...
int m_ActiveSkill; //0x0114 – ky nang dang su dung
...
int m_MapX, m_MapY, m_MapZ; //0x0D0C – toa do
Cell
int m_O



Quảng cáo 
Facebook
Twitter