查看單個文章
舊 2004-10-16, 08:57 AM   #2 (permalink)
psac
榮譽會員
 
psac 的頭像
榮譽勳章
UID - 3662
在線等級: 級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時級別:30 | 在線時長:1048小時 | 升級還需:37小時
註冊日期: 2002-12-07
住址: 木柵市立動物園
文章: 17381
現金: 5253 金幣
資產: 33853 金幣
預設

網路遊戲外掛製作之我所見(2)

上回對五種檔案類型的外掛做了一個大體的概括,大家對這幾種外掛都有了一定的瞭解,現在就依次(製作難度)由淺到深談談我對外掛製作的一些認識吧~~~~

首先,先來談一下動作式的外掛,這也是我第一次寫外掛時做的最簡單的一種。


記得還在「石器」時代的時候,我看到別人掛著一種軟體(外掛)人物就可以四外遊走(當時我還不知道外掛怎麼回事^_^),於是找了這種軟體過來研究(拿來後才聽別人說這叫外掛),發現這種東東其實實現起來並不難,仔佃看其實人物的行走無非就是滑鼠在不同的地方點來點去而已,看後就有實現這功能的衝動,隨後跑到MSDN上看了一些資料,發現這種實現這幾個功能,只需要幾個簡單的API函數就可以搞定:



1、首先我們要知道現在滑鼠的位置(為了好還原現在滑鼠的位置)所以我們就要用到API函數GetCursorPos,它的使用方法如下:
BOOL GetCursorPos(

LPPOINT lpPoint // address of structure for cursor position
);
2、我們把滑鼠的位置移到要到人物走到的地方,我們就要用到SetCursorPos函數來移動滑鼠位置,它的使用方法如下:
BOOL SetCursorPos(

int X, // horizontal position
int Y // vertical position
);
3、模擬滑鼠發出按下和放開的動作,我們要用到mouse_event函數來實現,具休使用方法用下:
VOID mouse_event(

DWORD dwFlags, // flags specifying various motion/click variants
DWORD dx, // horizontal mouse position or position change
DWORD dy, // vertical mouse position or position change
DWORD dwData, // amount of wheel movement
DWORD dwExtraInfo // 32 bits of application-defined information
);
在它的dwFlags處,可用的事件很多如移動MOUSEEVENTF_MOVE,左鍵按下MOUSEEVENTF_LEFTDOWN,左鍵放開MOUSEEVENTF_LEFTUP,具體的東東還是查一下MSDN吧~~~~~
好了,有了以前的知識,我們就可以來看看人物移走是怎麼實現的了:

getcursorpos(point);
setcursorpos(ranpoint(80,windowX),ranpoint(80,windowY));//ranpoint是個自製的隨機坐標函數
mouse_event(MOUSEEVENTF_LEFTDOWN,0,0,0,0);
mouse_event(MOUSEEVENTF_LEFTUP,0,0,0,0);
setcursorpos(point.x,point.y);

看了以上的程式碼,是不是覺得人物的遊走很簡單啦~~,舉一仿三,還有好多好東東可以用這個技巧實現(我早就說過,TMD,這是垃圾外掛的做法,相信了吧~~~),接下來,再看看遊戲裡面自動攻擊的做法吧(必需遊戲中攻擊支持快捷鍵的),道理還是一樣的,只是用的API不同罷了~~~,這回我們要用到的是keybd_event函數,其用法如下:
VOID keybd_event(

BYTE bVk, // virtual-key code
BYTE bScan, // hardware scan code
DWORD dwFlags, // flags specifying various function options
DWORD dwExtraInfo // additional data associated with keystroke
);
我們還要知道掃瞄碼不可以直接使用,要用函數MapVirtualKey把鍵值轉成掃瞄碼,MapVirtualKey的具體使用方法如下:


UINT MapVirtualKey(

UINT uCode, // virtual-key code or scan code
UINT uMapType // translation to perform
);
好了,比說此快接鍵是CTRL+A,接下來讓我們看看實際程式碼是怎麼寫的:

keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),0,0);
keybd_event(65,mapvirtualkey(65,0),0,0);
keybd_event(65,mapvirtualkey(65,0),keyeventf_keyup,0);
keybd_event(VK_CONTROL,mapvirtualkey(VK_CONTROL,0),keyeventf_keyup,0);

首先模擬按下了CTRL鍵,再模擬按下A鍵,再模擬放開A鍵,最後放來CTRL鍵,這就是一個模擬按快捷鍵的週期。


(看到這裡,差不多對簡易外掛有了一定的瞭解了吧~~~~做一個試試?如果你舉一仿三還能有更好的東東出來,這就要看你的領悟能力了~~,不過不要高興太早這只是才開始,以後還有更複雜的東東等著你呢~~)
psac 目前離線  
送花文章: 3, 收花文章: 1625 篇, 收花: 3196 次
向 psac 送花的會員:
25077667 (2014-04-04)
感謝您發表一篇好文章