ng tin đồ rớt
ra. Mảng này gồm 256 đối tượng, nằm bắt đầu ở địa
chỉ tĩnh 0x00DC2750, kích thước mỗi đối tượng là
0x03C4. Ta chỉ cần lấy phần dữ liệu ở đầu đối tượng
và định nghĩa thành lớp CObj của chúng ta như dưới
đây.
Code:
class CObj //dung nham lan voi CObject cua VC++
day nhe
{
public:
int m_nID; // -1 la do ko ton tai, > 0 la ton tai
int m_nData1; // Unused data
int m_ObjKind; // 3=item, 4=money,..10=Property
Box
int m_Index;
WORD m_RegX, m_RegY; // Toa do Region
int m_nData2[2">; // Unused data
int m_MapX, m_MapY; // 0x001C, toa do Cell
int m_OffX, m_OffY; // 0x0024, toa do Off trong Cell
int m_nData3[13">; // Unused data
char m_szName[32">; // 0x0060
int m_nData4; // Unused data
int m_nColor; // Mau cua do (0=trang, 3=xanh, ?
=vang...)
int m_nData5[3">; // Unused data
int m_nMoneyNum; // Luong tien
public:
void GetMapPos0;
};
Chặc, đến đây các bạn lại thấy quá dễ để tính tọa độ
của đồ rồi đúng ko, cũng theo cách tính như ở CNpc
thôi. Nhặt đồ thì dễ hơn đánh quái nhiều, tìm cái đồ
nào ở gần thì nhặt. Khoảng cách có thể nhặt đô trong
Game đặt là 64, nhưng nếu cần các bạn cứ tìm trong
khoảng 200-300 gì đó, nhân vật chỉ cần nhích đi một
chút là nhặt được đồ. Các bạn còn nhớ cái biến thành
viên m_nObjectIdx trong lớp CNpc ko? Nó sẽ xác định
địa chỉ cần gán cho đối tượng người chơi để nhặt đồ
(cũng theo vị trí của đồ trong mảng 256 đối tượng
kia)
Bổ sung: Lần đầu tiên khi nhân vật bắt đầu đánh, các
bạn phải gán chiêu thức vào m_ActiveSkill ở OFFSET
0x0114 nhé (tham khảo thêm bài viết của TinhLaGi).
Ngoài ra ở phần trên tôi có bỏ sót một biến thành
viên tại địa chỉ Offset 0x0C58, đó là m_nSkillRadius -
bán kính hiệu quả của chiêu thức. Trước khi gán lệnh
đánh, bạn gán giá trị này một số nhỏ, ví dụ 75 chẳng
hạn là bán kính quyền cơ bản, nhân vật sẽ tiếp sát rồi
mới đánh quái. Nếu ko để chế độ đánh tiếp cận, sau
khi đánh 1 chiêu có bán kính hiệu quả = 0 (ví dụ
NLTD), các bạn lại phải gán lại số này đủ lớn, nếu ko
nhân vật sẽ chạy lại sát quái mà vẫn ko với tay đánh
được. Có thể gán = 75 hoặc thậm chí = 5000, game sẽ
tự reset lại.
Thêm nữa, phần đọc tọa độ của nhân vật, Npc & Obj
có một số bạn dùng địa chỉ offset 0x0D20, 0x1088..
gì đó. Thực ra các địa chỉ này chỉ là kết quả của các
tính toán hoặc gán tham số tọa độ cho các thao tác
của nhân vật nên đôi khi mình đọc ra sẽ thu được một
kết quả không chính xác.
Bài viết tiếp theo tôi sẽ đề cập đến việc điều khiển
nhân vật chạy đến một tọa độ cho trước.
Bài 3 – Điều khiển nhân vật chạy
Nào hôm nay chúng ta sẽ nghiên cứu đến cái việc
điều khiển quái chạy. Dưới đây là các biến thành viên
bổ sung cho lớp CNpc:
Code:
class CNpc
{
public:
...
int CmdKind; //0x1088, 2=walk, 3=run
int Param_X;
int Param_Y;
};
Để cho nhân vật chạy hoặc đi bộ đến 1 điểm nào đó,
các bạn gán các giá trị thích hợp vào các địa chỉ trên,
bao gồm loại lệnh (chạy, đi bộ) và tọa độ X, Y.
SendMessage(WM_HOOK_WRITE, ...3);
SendMessage(WM_HOOK_WRITE, ...nX);
SendMessage(WM_HOOK_WRITE, ...nY);
Tuy nhiên, công việc ko chỉ dừng lại ở đó, nếu ko
nhân vật sẽ tự giật lại vị trí cũ. Bước tiếp theo là
chúng ta phải gửi một gói tin đến server, báo rằng
nhân vật di chuyển đến tọa độ mới. Như các bạn biết,
đôi khi mạng lag, ta điều khiển nhân vật chạy được
một đoạn nó lại giật lại chỗ cũ là vì gói tin báo đã ko
gửi



Quảng cáo 
Facebook
Twitter