黃易群俠傳M脫機外掛應用程式黃易神行
4306
8

[發問] 請問如何判斷選中的是玩家/NPC/怪和技能冷卻時間問題??

nick_cch 發表於 2011-1-31 09:22:30 | 只看該作者 回帖獎勵 |倒序瀏覽 |
如題:
      有利害的大大可以教一下,如何判斷選中的是玩家/NPC/怪嗎?
      (板上有一篇有教,可是權限設定實在太高了YCT61B )
     還有另一個問題就是技能冷卻時間,當我發完技能後,
     然後去讀取技能冷卻時間都會讀取到0,用單步執行就可以讀取到資料
     想問大大們都是如何解決這個問題.YCT65B
收藏收藏 分享分享 讚 幹 分享分享 FB分享
回覆

使用道具 舉報


RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
RAINTCK 2011-1-31 10:50:49
GOBLE_OBJ(怪物信息指針)+$0B4
6:怪物
7:npc
9:寵物
技能冷卻應該是你沒有找對相應技能位置只讀取到第一個所以都是0
沒源碼只能判斷是這問題
我只是個初學者! 高手正在營幕前微笑
回覆

使用道具 舉報

nick_cch 當前離線
UID
1430378
熱心
64 值
嘉獎
0 次
違規
0 次
在線時間
143 小時
經驗
59 點
積分
21708
精華
0
最後登錄
2019-5-13
閱讀權限
60
註冊時間
2010-3-23
論壇幣
21432 幣
聯合幣
7 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 7Rank: 7Rank: 7
nick_cch 2011-1-31 14:06:25
謝謝 RAINTCK 大大的教學,我回家在試試看選中的問題.YCT41B
至於技能冷卻時間,當我用單步執行時是可以抓取到技能冷卻時間跟技能狀態,
但如果直接執行就抓不到值了都是0,有大大遇到跟我相同的問題嗎?
我是用VB6寫的,底下是我參考的源碼:

ReadProcessMemory(ProcessID, Pointer($A5BFB0+$1C),@ft, 4, tt);   //讀取一級基址
ReadProcessMemory(ProcessID, Pointer(ft+$20), @ft, 4, tt);   //人物基址
ReadProcessMemory(ProcessID, Pointer(FT+$101C), @jnfirst, 4, tt); //技能基址
ReadProcessMemory(ProcessID, Pointer(ft +$1020), @jnnum, 4, tt);  //技能總數
If jnnum > 0 Then
    For i:= 0 to jnnum - 1 do
    begin
   ReadProcessMemory(ProcessID, Pointer(jnfirst + I * 4), @jnbase , 4, ByteRead);//技能名稱基址
     ReadProcessMemory(ProcessID, Pointer(jnbase+$8), @jnID, 4, tt);  //技能ID
    UseSkill(jnID) ); //使用技能
     ReadProcessMemory(ProcessID, Pointer(jnbase +$10), @jnSJ, 4, tt);  //技能冷卻時間
     ReadProcessMemory(ProcessID, Pointer(jnbase +$18), @jnZT, 4, tt);  //技能狀態
    end;

end;
回覆

使用道具 舉報

RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
RAINTCK 2011-1-31 18:47:39
你遍歷完技能沒做判斷哪個技能是你所要的
離開FOR會停在最後一個
那個你可能還沒學到所以永遠不用冷確
我的寫法給你參考你可以想出自己的寫法
READPROCESSMEMORY(GAMES,Pointer(FIGURE_BASE_ADDR+$101c),@FIGURE_workman,4, PP);
      READPROCESSMEMORY(GAMES,Pointer(FIGURE_BASE_ADDR+$1020),@FIGURE_workman_con,4, PP);
      for I := 0 to FIGURE_workman_con - 1 do
      BEGIN
        READPROCESSMEMORY(GAMES,Pointer(FIGURE_workman+I*4),@FIGURE_workman_EAX,4, PP);
        if FIGURE_workman_EAX>0 then
        BEGIN
   READPROCESSMEMORY(GAMES,Pointer(FIGURE_workman_EAX+$8),@FIGURE_workman_ID,4,PP);
          READPROCESSMEMORY(GAMES,Pointer(FIGURE_workman_EAX+$18),@FIGURE_workman_CD,1, PP); //是否冷確 1冷卻中 0可用
          if (FIGURE_workman_ID=PP_MAGIC) then
            if (FIGURE_workman_CD=0) Then
              UseSkill(PP_MAGIC);
        END;
我只是個初學者! 高手正在營幕前微笑
回覆

使用道具 舉報

nick_cch 當前離線
UID
1430378
熱心
64 值
嘉獎
0 次
違規
0 次
在線時間
143 小時
經驗
59 點
積分
21708
精華
0
最後登錄
2019-5-13
閱讀權限
60
註冊時間
2010-3-23
論壇幣
21432 幣
聯合幣
7 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 7Rank: 7Rank: 7
5
nick_cch 2011-2-1 08:48:01
感謝 RAINTCK 大大辛苦的教學,我大概知道該怎麼寫了.
判斷選中的問題,我試了一下.
目前只能抓到選中的是玩家回傳值會是3(不知道對不對??),其他如NPC/怪回傳值都不對 =.=
有高手能幫我看一下嗎??YCT41B

ReadProcessMemory ProcessID, ByVal W2I_ROLE_BASE_ADDR + &HB0C, MID, 4, 0
If MID <> 0 Then '若有選中玩家
     ReadProcessMemory ProcessID, ByVal W2I_ENVIRON_BASE_ADDR + &H20, P123, 4, 0& '??
   
    ReadProcessMemory ProcessID, ByVal P123 + &H14, P●嚴禁張貼廣告●, 4, 0& '目前人數
     ReadProcessMemory ProcessID, ByVal P123 + &H24, Pmax, 4, 0& '最大人數
     ReadProcessMemory ProcessID, ByVal P123 + &H18, P123, 4, 0& '周圍玩家列表基址
     EAX = P123 + ((MID Mod Pmax)) * 4
    ReadProcessMemory ProcessID, ByVal EAX, ftt, 4, 0
    ReadProcessMemory ProcessID, ByVal ftt + &H4, EAX, 4, 0 '相映位置玩家指針
     ReadProcessMemory ProcessID, ByVal EAX + &HB4, GOBLE_OBJ, 2, 0&  
    '3:玩家; 6:怪物; 7:NPC; 9:寵物; A:為GM;
    ReadProcessMemory ProcessID, ByVal EAX + &H4B4, PLAYER_FIGURE_MAXHP, 4, 0
    ReadProcessMemory ProcessID, ByVal EAX + &H474, PLAYER_FIGURE_HP, 4, 0
回覆

使用道具 舉報

RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
6
RAINTCK 2011-2-1 11:39:24
你只讀了週圍玩家基址
ReadProcessMemory ProcessID, ByVal W2I_ENVIRON_BASE_ADDR + &H24, P123, 4, 0& '週圍怪物基址
選中之後先讀取怪物基址在讀取血量!血量0表示讀取的是玩家!在讀取玩家基址就能判斷選中的是怪物npc還是玩家
12C    //怪血量
我只是個初學者! 高手正在營幕前微笑
回覆

使用道具 舉報

無啦啦比人封 當前離線
UID
1039912
熱心
122 值
嘉獎
0 次
違規
0 次
在線時間
67 小時
經驗
98 點
積分
287
精華
0
最後登錄
2015-11-21
閱讀權限
25
註冊時間
2008-10-1
論壇幣
99 幣
聯合幣
43 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 3
7
無啦啦比人封 2011-2-4 10:14:24
我都用比較直接的 先說好..我也是個初學者 語法可能沒比高手們的直接 A_A

ReadProcessMemory(ProcessID, Pointer(W2I_ENVIRON_BASE_ADDR + $24), @W2I_MONSTER_BASE_ADDR, 4, tt ) ;  //周圍怪物基址
ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $14), @W2I_MONSTER_COUNT, 4, tt ) ;  //周圍怪物數量
ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $24), @W2I_MONSTER_MAXCOUNT, 4, tt ) ;  //周圍怪物最大數量(MAX = 769)
ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_BASE_ADDR + $18), @W2I_MONSTER_ADDR, 4, tt ) ;  //周圍怪物列表基址
  If W2I_MONSTER_ADDR > 0 Then
    For I:= 0 to W2I_MONSTER_MAXCOUNT - 1 do
    begin
    ReadProcessMemory(ProcessID, Pointer(W2I_MONSTER_ADDR + I * 4), @W2I_ENV_MONSTER_ADDR, 4, tt ) ;  //相應位置怪物地址(怪物ID % MAX)
    ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_ADDR + $4), @W2I_ENV_MONSTER_OBJ, 4, tt ) ;  //相應位置怪物指針
    ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ + $11c), @W2I_ENV_MONSTER_SN2, 4, tt ) ;  //相應位置怪物序號
    ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ + $b4), @W2I_ENV_MONSTER_TYPE, 4, tt ) ;  //相應位置怪物種類(6 怪物 7 NPC 9 寵物 A GM)
      If Pos(inttostr(W2I_ROLE_SELECT_OBJSN),inttostr(W2I_ENV_MONSTER_SN2))=1 Then
        Begin
          If W2I_ENV_MONSTER_TYPE=6 Then
            Begin
            OBJIS.caption := '6';
            ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ + $3c), @W2I_ENV_MONSTER_X, 4, tt ) ;  //相應位置怪物x坐標 取整(float/10)+400
            ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ + $40), @W2I_ENV_MONSTER_Z, 4, tt ) ;  //相應位置怪物z坐標 取整(float/10)
            ReadProcessMemory(ProcessID, Pointer(W2I_ENV_MONSTER_OBJ + $44), @W2I_ENV_MONSTER_Y, 4, tt ) ;  //相應位置怪物y坐標 取整(float/10)+550
            Attacting_Monster_Point_X := W2I_ENV_MONSTER_X;
            Attacting_Monster_Point_Y := W2I_ENV_MONSTER_Y;
            Attacting_Monster_Point_Z := W2I_ENV_MONSTER_Z;
          End;
          If W2I_ENV_MONSTER_TYPE=7 Then
            Begin
            OBJIS.caption := '7';
          End;
          If W2I_ENV_MONSTER_TYPE=9 Then
            Begin
            OBJIS.caption := '9';
          End;
      End;
  End;
//------------------------------------------------ 玩家檢查
ReadProcessMemory(ProcessID, Pointer(W2I_ENVIRON_BASE_ADDR + $20), @W2I_PLAYER_BASE_ADDR, 4, tt ) ;  //周圍玩家基址
ReadProcessMemory(ProcessID, Pointer(W2I_PLAYER_BASE_ADDR + $14), @W2I_PLAYER_COUNT, 4, tt ) ;  //周圍玩家數量
ReadProcessMemory(ProcessID, Pointer(W2I_PLAYER_BASE_ADDR + $24), @W2I_PLAYER_MAXCOUNT, 4, tt ) ;  //周圍玩家最大數量(MAX = 769)
ReadProcessMemory(ProcessID, Pointer(W2I_PLAYER_BASE_ADDR + $18), @W2I_PLAYER_ADDR, 4, tt ) ;  //周圍玩家列表基址
  If W2I_PLAYER_ADDR > 0 Then
    For I:= 0 to W2I_PLAYER_MAXCOUNT - 1 do
    begin
    ReadProcessMemory(ProcessID, Pointer(W2I_PLAYER_ADDR + I * 4),@W2I_ENV_PLAYER_ADDR, 4, tt );//相應位置玩家基址
    ReadProcessMemory(ProcessID, Pointer(W2I_ENV_PLAYER_ADDR + $4), @W2I_ENV_PLAYER_OBJ, 4, tt ) ;  //相應位置玩家指針
    ReadProcessMemory(ProcessID, Pointer(W2I_ENV_PLAYER_OBJ + $460), @W2I_ENV_PLAYER_SN, 4, tt ) ;  //相應位置玩家SN
      If Pos(inttostr(W2I_ROLE_SELECT_OBJSN),inttostr(W2I_ENV_PLAYER_SN))=1 Then
        Begin
        OBJIS.caption := '998';
      End;
  End;


998都是我自己定義而已
OBJIS 直接得出來就說明了是怪物還是玩家 !!
回覆

使用道具 舉報

nick_cch 當前離線
UID
1430378
熱心
64 值
嘉獎
0 次
違規
0 次
在線時間
143 小時
經驗
59 點
積分
21708
精華
0
最後登錄
2019-5-13
閱讀權限
60
註冊時間
2010-3-23
論壇幣
21432 幣
聯合幣
7 枚
幸運鑽
0 顆
招待卷
0 點
查看詳細資料
Rank: 7Rank: 7Rank: 7
8
nick_cch 2011-2-15 08:39:26
感謝大大們的指導,目前已經可以判斷了,
雖然感覺上我的方式有點怪,不過能用就好 ^^
另有一個問題想請問一下,就是自動發招部分,
假設設計五個招式自動發招,我該如何優化程式,
是設計成5個Timer來控制,還是單用一個Timer就好,
不知道大大們的設計概念為何??YCT65B
回覆

使用道具 舉報

RAINTCK 當前離線
UID
1569638
熱心
259 值
嘉獎
0 次
違規
0 次
在線時間
321 小時
經驗
158 點
積分
4295
精華
0
最後登錄
2018-10-27
閱讀權限
50
註冊時間
2010-10-21
論壇幣
3504 幣
聯合幣
47 枚
幸運鑽
6 顆
招待卷
2000 點
查看詳細資料
Rank: 6Rank: 6
9
RAINTCK 2011-2-15 11:51:33
我的方法是分別各自TIMES
如果只用一個TIMES又剛好同時CD完會產生同時發招其中一招發不出來的狀況
曾經想優化程式精簡成只使用一個TIMES經常看到發招了另一招又發把前面施放中的蓋過去
或許有先進大大們能解決這問題我能力不足只好分別開TIMES
把TIMES時間縮短同時發招太多次在野外會發生退避狀態的情形
我只是個初學者! 高手正在營幕前微笑
回覆

使用道具 舉報

您需要登錄後才可以回帖 登錄 | 註冊


手機版 | Archiver | 外掛聯合國

GMT+8, 2024-11-22 06:39 , Processed in 0.063456 second(s), 18 queries , Memcache On.

版權說明:
  本站不會製作、經銷、代理外掛程式。僅免費提供外掛程式下載前之掃毒及掃木馬等安全檢測驗證,協助會員遠離盜號危險程式。本站所有資料均來自網際網路收集整理,說明文字暨下載連結轉載自原程 式開發站。站上出現之公司名稱、遊戲名稱、程式等,商標及著作權,均歸各公司及程式原創所有,本站程式所有權歸外掛聯合國所有。本程式所有權歸外掛聯合國所有.......

回頂部
第二步?
第三步?