=======以下為腳本代碼======= [Name] [HotKey] [TargetName] [Script] Sub LoadFirstData //第一次要载入初始化资料 Sub main Sub testXY Sub Change_Hotkey //更换脚本 Sub id_102000000 Sub id_101030200 //岩石山II Sub LoadMap_Chk //载入新地图检查 //------角色移动------------- Sub Move_D //往下移动 Sub Move_R //往右移动 Sub Move_L //往左移动 Sub Move_U //往上移动 Sub Jmp_LU //向左上跳 Sub Jmp_RU //向右上跳 Sub Jmp_LD //向左下跳 Sub Jmp_RD //向右下跳 Sub Jmp_U //跳起来按上 Sub U //--------------- EndSub Sub Skill_Chk //侦测技能 Sub Sk1_Chk //技能1施放 Sub Info_MapID Sub Info_Chan_Red Sub Info_MonNum Sub Info_AtkNum Sub Info_ThingNum Sub Info_BreathStop
使用前必須準備三種程式:
2.KKMacro (最好使用Beta2)-上方的載點便是最新版本
3.deMSwZ15 (注意:是1.5版 並非2.1)-此程式本站不提供下載,請自行搜索下載
前言:既上次靠左打怪有小看到自動走地圖,但其實程式碼是臨時加上去,並沒有彈性的功能,也很容易造成程式碼過長,現在這篇不用在那麼攏長的寫自動走地圖了,由於進階版的我已經刪除(開發單一地圖打怪用會比較實在),除非遇到很難走的地圖,不然現在用精準上下左右走路都是沒問題的,所以今天我先示範勇士之村走到東方岩石I的程式碼,往後你也可以用這種簡單的方式去寫自動走地圖(局限於簡單易走的地圖),但是有人會問我真實性如何?其實除了在城鎮中的快速傳點外,我都有高達99%的可能可以過地圖,為何如此確定呢?小弟昨天晚上開始去研究WZ檔,赫然發現一些可以幫助腳本執行更加方便的資訊,就是Map(地圖)資訊,這部份往後我會放可以直接找到地圖的傳點座標與繩子樓梯座標的程式,所以現在大家也必須要學習WZ程式,請至WZ修改區學習,小漾等大大的文章都有教學,如何複製地圖資訊這樣。
---------------------
自動走地圖示範重點Code(兩個小bug修正):代碼:
Sub main
Call LoadFirstData //載入基本資料
Call Reset_Value //初始化移動變數
Call SelectMapID_Go //選擇地圖走向
While true
Sleep 500
Call WorldMap_1 //執行世界地圖1 (維多利亞)
EndWhile
EndSub
//地圖資訊-----------------------------------------
Sub SelectMapID_Go //選擇行徑地圖
Call Info_MapID
If (PtrMapID == 102000000) //勇士之村
//往東方入口
con1 = 22
EndIf
If (PtrMapID == 101040000) //東方入口
//往東方岩石I
con1 = 11
EndIf
//ex:為何con1 = 22 還有 11?
// 後面會告訴你們
EndSub
Sub WorldMap_1 //維多利亞
Call Info_MapID
Call SelectMapID_Go
Call Reset_Value
oldid = PtrMapID
If PtrMapID == 102000000 //勇士之村
Call id_102000000
Return
EndIf
If PtrMapID == 101040000 //東方入口
Call id_101040000
Call Change_Hotkey
//更換腳本
EndIf
EndSub
Sub Change_Hotkey //更換腳本且結束此腳本
KeyPressH cha_key
Exit
EndSub
Sub id_102000000 //勇士之村的地圖ID
//勇士之村
If (con1 == 22) //走到22編號的傳點(稍後說明22由來)
//東方入口
While true
x = -190
Call Move_L //往走到-190
x = 2484
Call Move_R //往右走到2484
KeyPress Up //快速傳點 ---------這裡(原本進入傳點 我寫成往上爬=.=)
x = 2597
Call Move_R //往右走到2597
Sleep 500
KeyPress Up //走入下個傳點 ---------這裡(原本進入傳點 我寫成往上爬=.=)
Call LoadMap_Chk //檢查是否載入新地圖
If (newid == -1) //載入則結束副程式
Return
EndIf
EndWhile //沒載入就再重走一次
EndIf
EndSub
Sub id_101040000 //以下自己推演一次
//東方入口
If (con1 == 11)
//東方岩石山I
While true
x = 2360
Call Move_R
Call Jmp_RU
y = 1544
Call Move_U
x = 2370
Call Move_L
Call Jmp_LU
Call Jmp_RU
Call Jmp_RU
Call Jmp_U
Call Jmp_LU
x = 2270
Call Move_L
Sleep 500
KeyPress Up
Call LoadMap_Chk
If (newid == -1)
Return
EndIf
EndWhile
EndIf
EndSub
Sub LoadMap_Chk //載入新地圖檢查
Sleep 3000
Call Info_MapID
newid = PtrMapID
If (oldid != newid)
oldid = newid
newid = -1
EndIf
EndSub
這邊有個部份就是con1 = 22與 11的地方要解釋,
由於我在WZ檔中,找到每張地圖的傳點都有屬於它的編號,
所以未來只要照著WZ的編號走就好,也方便統一規格,
由上面範例來說,地圖是可以做連續(或者連結)的,
我之前有測試過勇士之村到遺墓I(骷髏犬)是沒問題的,
那時候是用進階走路下去寫的,因為在中間有些比較困難,
所以也會採用到比較好(或說精準一點)的走路方法,
另外大家會發現我這次給的腳本的程式碼會相對較少,
因為我今天想出一個方法治這種問題,那就是執行多個腳本(多執行緒?),
今天我測試過可以一次開兩個腳本,
所以以後將腳本定為一個大功能(小功能的集合)的整合,
走完地圖就發出按下腳本熱鍵,在Exit自己,
所以就是走路與打怪的腳本分開,這樣可以讓腳本淺顯易懂,
不過這次加入WZ的原因就是如果要寫自動走地圖,
可以從WZ當中的Map找到地圖資訊(包刮傳點x,y 繩子樓梯),
裡面又可以利用怪物出生點與怪物移動的範圍來寫範圍練功腳本,
就好像你跟怪物一樣擁有碰撞偵測,並不會超出範圍,也不會沒有開無敵而掉落,
因為你是用記憶體在讀的,只要瞭解碰撞的原則後,就可以寫出安全範圍值,
由於說太多不實際,等ME更新後我在拍影片實際操作
地图自走示范
113
MapleStory
//---------------------------
//[自动走地图脚本]
//请设定走完后的脚本热键
//以便系统继续执行
//此为范例版本 往后请按照此方法写
//脚本示范制作:js155036
//---------------------------
//----指标宣告区------
Dim Ptr, PtrL, PtrR, PtrU, PtrD, PtrMapID, PtrChan
Dim PtrX, PtrY, PtrRed, PtrMonNum, PtrAtkNum
Dim PtrHp, PtrMp, PtrBreathStop, PtrThingNum
//----结束指标宣告----
//---一般变数宣告-----
Dim rope
Dim setHp, setMp, graycolor, scan_color
Dim atk_key, pik_key, jmp_key, ski_key
Dim hp_key, mp_key, cha_key, autologin_key
Dim sk1_key, sk1_timer, sk1_act, timer1
Dim sk2_key, sk2_timer, sk2_act, timer2
Dim sk3_key, sk3_timer, sk3_act, timer3
Dim now_time, pub_timer, num
Dim x, y, w, lr, q, chkkey
Dim con1
Dim oldid,newid,
//----结束宣告变数---------
scan_color = 1
//设定使用颜色扫描(1)或者记忆体读取(0)
PtrHp = 220
PtrMp = 328
//如果scan_color = 1 这两个底限设定才有用
//如果scan_color = 0 这两个变数不用设定了
setHp = 80
//如果scan_color = 1 则为设定百分比补血
//如果scan_color = 0 则为血量值小于补血
setMp = 20
//如果scan_color = 1 则为设定百分比补魔
//如果scan_color = 0 则为魔力值小于补魔
//设定热键.atk:一般攻击, pik:捡东西, jmp:跳起来
//hp:补血, mp:补魔, cha:换脚本
atk_key = VK(Ctrl)
pik_key = VK(Z)
jmp_key = VK(Alt)
ski_key = VK(Delete)
hp_key = VK(Home)
mp_key = VK(End)
cha_key = VK(F4)
//sk1_key 技能1按键设定
//sk1_act 是否启动此技能 0:不启动 1:启动
//sk1_timer 技能施放间隔时间 1000 = 1秒
sk1_key = VK(V)
sk1_act = 0
sk1_timer = 1000
sk2_key = VK(PageDown)
sk2_act = 1
sk2_timer = 200000
sk3_key = VK(PageUp)
sk3_act = 1
sk3_timer = 48000
//人物是否在绳子或楼梯上 没有:0 有:1 (此处不用改,要改除非人物在绳子上)
rope = 0
autologin_key = VK(F6)
//侦测断线判断按键
EndSub
//Call testXY
Call Auto_Login
Call LoadFirstData
Call Reset_Value
Call SelectMapID_Go
While true
Sleep 500
Call Auto_Login
Call WorldMap_1
EndWhile
EndSub
Call Info_XY
MsgBox PtrX
MsgBox PtrY
Exit
EndSub
//地图资讯-----------------------------------------
Sub SelectMapID_Go //选择行径地图
Call Info_MapID
If PtrMapID == 102000000 //勇士之村
//往东方入口
con1 = 22
EndIf
If PtrMapID == 101040000 //东方入口
//往东方岩石I
con1 = 11
EndIf
If PtrMapID == 101030400 //东方岩石I
//往岩石路I
con1 = 1
EndIf
If PtrMapID == 101030300 //岩石路I
//往岩石路II
con1 = 1
EndIf
If PtrMapID == 101030200 //岩石路II
//往岩石路III
con1 = 1
EndIf
If PtrMapID == 101030100 //岩石路III
//往遗迹发掘I
con1 = 1
EndIf
If PtrMapID == 101030101 //遗迹发掘I
//往遗迹发掘II
con1 = 1
EndIf
If PtrMapID == 101030102 //遗迹发掘II
//往遗迹发掘III
con1 = 1
EndIf
If PtrMapID == 101030103 //遗迹发掘III
//遗迹营地
con1 = 1
EndIf
If PtrMapID == 101030104 //遗迹营地
//遗迹墓地I
con1 = 1
EndIf
EndSub
Sub WorldMap_1 //维多利亚
Call Info_MapID
Call SelectMapID_Go
Call Reset_Value
oldid = PtrMapID
If PtrMapID == 102000000 //勇士之村
Call id_102000000
Return
EndIf
If PtrMapID == 101040000 //东方入口
Call id_101040000
EndIf
If PtrMapID == 101030400 //东方岩石I
Call id_101030400
EndIf
If PtrMapID == 101030300 //岩石路I
Call id_101030300
EndIf
If PtrMapID == 101030200 //岩石路II
Call id_101030200
EndIf
If PtrMapID == 101030100 //岩石路III
Call id_101030100
EndIf
If PtrMapID == 101030101 //遗迹发掘I
Call id_101030101
EndIf
If PtrMapID == 101030102 //遗迹发掘II
Call id_101030102
EndIf
If PtrMapID == 101030103 //遗迹发掘III
Call id_101030103
EndIf
If PtrMapID == 101030104 //遗迹营地
Call id_101030104
EndIf
If PtrMapID == 101030105 //练功地点
Call Change_Hotkey
//更换脚本
EndIf
EndSub
Sleep 3000
KeyPressH cha_key
Exit
EndSub
//勇士之村
If (con1 == 22)
//东方入口
While true
x = -190
Call Move_L
x = 2484
Call Move_R
Call U
x = 2686
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If (newid == -1)
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101040000
//东方入口
If (con1 == 11)
//东方岩石山I
While true
x = 2360
Call Move_R
Call Jmp_RU
y = 1544
Call Move_U
x = 2370
Call Move_L
Call Jmp_LU
Call Jmp_RU
Call Jmp_RU
Call Jmp_U
Call Jmp_LU
x = 2270
Call Move_L
Sleep 500
Call U
Call LoadMap_Chk
If (newid == -1)
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030400 //东方岩石I
If con1 == 1 //岩石山I
While true
x = 1255
Call Move_R
Call Jmp_RU
x = 1420
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030300 //岩石山I
If con1 == 1 //岩石山II
While true
x = 1335
Call Move_R
Call Jmp_RU
x = 1470
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
If con1 == 1 //岩石山III
While true
x = 1335
Call Move_R
Call Jmp_RU
x = 1480
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030100 //岩石山III
If con1 == 1 //遗迹I
While true
x = 958
Call Move_R
Call Jmp_RU
y = 984
Call Move_U
Call Jmp_RU
x = 1150
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030101 //遗迹I
If con1 == 1 //遗迹II
While true
x = 940
Call Move_R
Call Jmp_RU
y = 406
Call Move_U
Call Jmp_LU
y = 245
Call Move_U
x = 780
Call Move_L
Call Jmp_LU
y = -21
Call Move_U
Call Jmp_RU
x = 825
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030102 //遗迹II
If con1 == 1 //遗迹III
While true
x = -240
Call Move_L
Call Jmp_LU
y = 132
Call Move_U
Call Jmp_U
y = -327
Call Move_U
Call Jmp_RU
y = -494
Call Move_U
x = -92
Call Move_R
Call Jmp_RU
x = 862
Call Move_R
Call Jmp_RU
y = -794
Call Move_U
Call Jmp_U
x = 1337
Call Move_R
Call Jmp_RU
x = 1440
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndIf
Sub id_101030103 //遗迹III
If con1 == 1 //营地
While true
x = -468
Call Move_R
Call Jmp_RU
y = 106
Call Move_U
Call Jmp_RU
y = -265
Call Move_U
x = 80
Call Move_R
Call Jmp_RU
y = -460
Call Move_U
Call Jmp_U
x = 369
Call Move_R
Call Jmp_RU
x = 728
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sub id_101030104 //营地
If con1 == 1 //遗墓I
While true
x = -1395
Call Move_R
Call Jmp_RU
Call Jmp_RU
y = 606
Call Move_U
x = -127
Call Move_R
Sleep 500
Call U
Call LoadMap_Chk
If newid == -1
Return
EndIf
EndWhile
EndIf
EndSub
Sleep 3000
Call Info_MapID
newid = PtrMapID
If (oldid != newid)
oldid = newid
newid = -1
EndIf
EndSub
Sub Reset_Value //坐标方向初始值
x = 0
y = 0
w = 0
lr =0
q = 0
chkkey = 1
KeyUpH Up
KeyUpH Down
KeyUpH Left
KeyUpH Right
KeyUpH Up
KeyUpH Down
KeyUpH Left
KeyUpH Right
EndSub
While true
Call Info_XY
If (PtrY < y)
If (chkkey == 1)
KeyDownH Down
chkkey = 0
EndIf
EndIf
If (PtrY > y)
If (chkkey == 0)
KeyUpH Down
chkkey = 1
Call Reset_Value
Return
EndIf
EndIf
EndWhile
EndSub
While true
Call HpMp_Chk
Call Info_XY
If (PtrX < x)
If (chkkey == 1)
KeyDownH Right
chkkey = 0
EndIf
EndIf
If (PtrX > x)
If (chkkey == 0)
KeyUpH Right
KeyUpH Right
Call Reset_Value
Return
EndIf
EndIf
EndWhile
EndSub
While true
Call Auto_Login
Call HpMp_Chk
Call Info_XY
If (PtrX > x)
If (chkkey == 1)
KeyDownH Left
chkkey = 0
EndIf
EndIf
If (PtrX < x)
If (chkkey == 0)
KeyUpH Left
chkkey = 1
Call Reset_Value
Sleep 200
Return
EndIf
EndIf
EndWhile
EndSub
While true
Call Auto_Login
Call HpMp_Chk
Call Info_XY
If (PtrY > y)
If (chkkey == 1)
KeyDownH Up
chkkey = 0
EndIf
EndIf
If (PtrY < y)
If (chkkey == 0)
KeyUpH Up
chkkey = 1
Call Reset_Value
Sleep 200
Return
EndIf
EndIf
EndWhile
EndSub
KeyDownH Left
KeyDownH Up
KeyPress jmp_key
Sleep 500
KeyUpH Left
KeyUpH Up
Sleep 250
Call Reset_Value
EndSub
KeyDownH Right
KeyDownH Up
KeyPress jmp_key
Sleep 500
KeyUpH Right
KeyUpH Up
Sleep 250
Call Reset_Value
EndSub
KeyDownH Left
KeyPress jmp_key
Sleep 500
KeyUpH Left
Sleep 250
Call Reset_Value
EndSub
KeyDownH Right
KeyPress jmp_key
Sleep 500
KeyUpH Right
Sleep 250
Call Reset_Value
EndSub
KeyDownH Up
KeyPress jmp_key
Sleep 250
KeyUpH Up
Call Reset_Value
EndSub
KeyPress Up
EndSub
//---键盘副程式区----------------------------------------------
Sub HpMp_Chk //侦测Hp
num = num + 1
While num > 10
num = 0
If scan_color == 1
//使用颜色扫描
graycolor = GetPixel(PtrHp+setHp,588)
//如果颜色取得为灰色点的话,则血量低于了
If graycolor == 12435133
//如果目前血量小于设定的血量
Sleep 250
KeyPress hp_key
//按下补血按键
Sleep 250
EndIf
graycolor = GetPixel(PtrMp+setMp,588)
//如果颜色取得为灰色点的话,则魔力低于了
If graycolor == 12435133
//如果目前魔力小于设定的魔力
Sleep 250
KeyPress mp_key
//按下补魔按键
Sleep 250
EndIf
Return
EndIf
If scan_color == 0
//使用记忆体读取
ReadMemory "MapleStory", 0x00400800, PtrHp
//从记忆体中读取血量值后,指定给PtrHp
If PtrHp < setHp
//如果目前血量小于设定的血量
Sleep 250
KeyPress hp_key
//按下补血按键
Sleep 250
EndIf
ReadMemory "MapleStory", 0x00400804, PtrMp
//从记忆体中读取魔力值后,指定给PtrMp
If PtrMp < setMp
//如果目前魔力小于设定的魔力
Sleep 250
KeyPress mp_key
//按下补魔按键
Sleep 250
EndIf
Return
EndIf
EndWhile
If sk1_act == 1
Call Sk1_Chk
EndIf
If sk2_act == 1
Call Sk2_Chk
EndIf
If sk3_act == 1
Call Sk3_Chk
EndIf
EndSub
now_time = GetTick()
If now_time >= timer1
Sleep 500
KeyPress sk1_key
Sleep 500
timer1 = now_time + sk1_timer
EndIf
EndSub
Sub Sk2_Chk //技能2施放
now_time = GetTick()
If now_time >= timer2
Sleep 500
KeyPress sk2_key
Sleep 500
timer2 = now_time + sk2_timer
EndIf
EndSub
Sub Sk3_Chk //技能3施放
now_time = GetTick()
If now_time >= timer3
Sleep 500
KeyPress sk3_key
Sleep 500
timer3 = now_time + sk3_timer
EndIf
EndSub
Sub Auto_Login
Call Info_UDLR
If PtrU == -2143 && PtrD == 220
If PtrL == -317 && PtrR == 407
Sleep 5000
KeyPressH F6
Exit
EndIf
EndIf
EndSub
//----游戏基本资讯-------------------------------------------
Sub Info_XY
//人物座标
ReadMemory "MapleStory", 0x00A0A604, Ptr
ReadMemory "MapleStory", Ptr + 0x0BA4, PtrX
ReadMemory "MapleStory", Ptr + 0x0BA8, PtrY
EndSub
Sub Info_RDLR
//ReadMemory "MapleStory", 0x00A0B568, Ptr
//ReadMemory "MapleStory", Ptr + 0x03CC, PtrX
//ReadMemory "MapleStory", Ptr + 0x03D0, PtrY
//上下左右墙位置
ReadMemory "MapleStory", 0x00A0A5F4, Ptr
ReadMemory "MapleStory", Ptr + 0x24, PtrL
ReadMemory "MapleStory", Ptr + 0x28, PtrU
ReadMemory "MapleStory", Ptr + 0x2C, PtrR
ReadMemory "MapleStory", Ptr + 0x30, PtrD
EndSub
//地图ID
ReadMemory "MapleStory", 0x00A0B568, Ptr
ReadMemory "MapleStory", Ptr + 0x045C, PtrMapID
EndSub
//频道
ReadMemory "MapleStory", 0x00A0A614, Ptr
ReadMemory "MapleStory", Ptr + 0x2048, PtrChan
//红点
ReadMemory "MapleStory", 0x00A0A5FC, Ptr
ReadMemory "MapleStory", Ptr + 0x18, PtrRed
EndSub
//怪物数量
ReadMemory "MapleStory", 0x00A0A5F8, Ptr
ReadMemory "MapleStory", Ptr + 0x24, PtrMonNum
//每次都会多一?
EndSub
//攻击次数
ReadMemory "MapleStory", 0x00A0A604, Ptr
ReadMemory "MapleStory", Ptr + 0x1D50, PtrAtkNum
EndSub
//地上物品数量
ReadMemory "MapleStory", 0x00A0B4D8, Ptr
ReadMemory "MapleStory", Ptr + 0x14, PtrThingNum
EndSub
//呼吸数值
ReadMemory "MapleStory", 0x00A0A604, Ptr
ReadMemory "MapleStory", Ptr + 0x360, PtrBreathStop
EndSub
//----------------