📄 mod05readinfo.bas
字号:
On Error Resume Next
Dim BaseAdr As Long, TempAdr As Long
Dim i As Integer
Dim NpcTaskNum As Long, NpcTaskNumZ As Long, rwid As Long, NpcTaskAdrF As Long
Dim BuffEnum(36) As Byte, BuffL As Long, NpcTaskName As String
ProcessID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If ProcessID Then
Main.ListLuck.Clear
ReadProcessMemory ProcessID, ByVal PartAdr + &H4, TempAdr, 4, 0
ReadProcessMemory ProcessID, ByVal TempAdr + &H8, TempAdr, 4, 0
ReadProcessMemory ProcessID, ByVal TempAdr + &H14, TempAdr, 4, 0& '14'4d0
ReadProcessMemory ProcessID, ByVal TempAdr + &H180, BaseAdr, 4, 0&
ReadProcessMemory ProcessID, ByVal BaseAdr + &HF8, NpcTaskNum, 4, 0& 'NPC任务总数量
ReadProcessMemory ProcessID, ByVal BaseAdr + &HFC, NpcTaskNumZ, 4, 0& 'NPC任务数量
ReadProcessMemory ProcessID, ByVal BaseAdr + &HF0, NpcTaskAdrF, 4, 0& 'NPC任务基址
For i = 0 To NpcTaskNumZ - 1
ReadProcessMemory ProcessID, ByVal NpcTaskAdrF + &H98 * i + &H38, rwid, 4, 0& '任务id
ReadProcessMemory ProcessID, ByVal NpcTaskAdrF + &H98 * i, TempAdr, 4, 0& '
ReadProcessMemory ProcessID, ByVal TempAdr, BuffEnum(0), 36, BuffL
NpcTaskName = Left$(BuffEnum, 36)
NpcTaskName = Trim(KillChr0(Trim(NpcTaskName)))
Main.ListLuck.AddItem i & "|" & rwid & "|" & NpcTaskName
Next i
End If
CloseHandle ProcessID
End Sub
'===============================================================================================
''按名称获取玩家位置
Function ReadPlayPos(PName As String) As String
On Error Resume Next
Dim BaseAdr As Long, TempAdr As Long, PPlayID As Long
Dim i As Integer
Dim PlayAdrB As Long, PlayNum As Long, PlayAdrF As Long, PlayMax As Long
Dim PlayName As String, PlayX As Single, PlayY As Single
Dim BuffEnum(36) As Byte, BuffL As Long
PPlayID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If PPlayID Then
'玩家相关
ReadProcessMemory PPlayID, ByVal PartAdr + &H28, TempAdr, 4, 0
ReadProcessMemory PPlayID, ByVal TempAdr + &H138, PlayAdrB, 4, 0
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H18, PlayAdrF, 4, 0 '读出玩家列表的首地址
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H24, PlayMax, 4, 0 '读出玩家数组的最大值
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H14, PlayNum, 4, 0 '周围玩家数量
Main.LVNpc(2).ListItems.Clear
If PlayNum > 0 Then
For i = 0 To PlayMax - 1
BaseAdr = PlayAdrF + i * 4
ReadProcessMemory PPlayID, ByVal BaseAdr, TempAdr, 4, 0
If TempAdr > 0 Then
ReadProcessMemory PPlayID, ByVal TempAdr + &H4, BaseAdr, 4, 0
ReadProcessMemory PPlayID, ByVal BaseAdr + EcxPartX, PlayX, 4, 0 '目标位置X
ReadProcessMemory PPlayID, ByVal BaseAdr + EcxPartY, PlayY, 4, 0 '目标位置Y
ReadProcessMemory PPlayID, ByVal BaseAdr + EcxPartName, TempAdr, 4, 0 '目标名称
ReadProcessMemory PPlayID, ByVal TempAdr, ByVal VarPtr(BuffEnum(0)), 36, BuffL
PlayName = Left$(BuffEnum, 36)
PlayName = Trim(KillChr0(Trim(PlayName)))
Erase BuffEnum
If PName = PlayName Then
ReadPlayPos = Trim(Str(Fix(PlayX))) & "|" & Trim(Str(Fix(PlayY)))
Exit Function
End If
End If
Next i
End If
End If
CloseHandle PPlayID
ReadPlayPos = "A|A"
End Function
''按名称获取玩家ID
Function ReadPlayId(PName As String) As Long
On Error Resume Next
Dim BaseAdr As Long, TempAdr As Long, PPlayID As Long
Dim i As Integer
Dim PlayAdrB As Long, PlayNum As Long, PlayAdrF As Long, PlayMax As Long
Dim PlayName As String, PlayID As Long
Dim BuffEnum(36) As Byte, BuffL As Long
PPlayID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If PPlayID Then
'玩家相关
ReadProcessMemory PPlayID, ByVal PartAdr + &H28, TempAdr, 4, 0
ReadProcessMemory PPlayID, ByVal TempAdr + &H138, PlayAdrB, 4, 0
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H18, PlayAdrF, 4, 0 '读出玩家列表的首地址
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H24, PlayMax, 4, 0 '读出玩家数组的最大值
ReadProcessMemory PPlayID, ByVal PlayAdrB + &H14, PlayNum, 4, 0 '周围玩家数量
Main.LVNpc(2).ListItems.Clear
If PlayNum > 0 Then
For i = 0 To PlayMax - 1
BaseAdr = PlayAdrF + i * 4
ReadProcessMemory PPlayID, ByVal BaseAdr, TempAdr, 4, 0
If TempAdr > 0 Then
ReadProcessMemory PPlayID, ByVal TempAdr + &H4, BaseAdr, 4, 0
ReadProcessMemory PPlayID, ByVal BaseAdr + EcxPartId, PlayID, 4, 0 '玩家ID
ReadProcessMemory PPlayID, ByVal BaseAdr + EcxPartName, TempAdr, 4, 0 '目标名称
ReadProcessMemory PPlayID, ByVal TempAdr, ByVal VarPtr(BuffEnum(0)), 36, BuffL
PlayName = Left$(BuffEnum, 36)
PlayName = Trim(KillChr0(Trim(PlayName)))
Erase BuffEnum
If PName = PlayName Then
ReadPlayId = PlayID
Exit Function
End If
End If
Next i
End If
End If
CloseHandle PPlayID
ReadPlayId = 0
End Function
''按ID读取玩家名称
Function ReadNameById(TeamerID As Long) As String
On Error Resume Next
Dim BaseAdr As Long, TempAdr As Long, PNameID As Long
Dim PlayAdrB As Long, PlayNum As Long, PlayAdrF As Long, PlayMax As Long
Dim BuffEnum(36) As Byte, BuffL As Long, TeamerName As String
PNameID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If PNameID Then
ReadProcessMemory PNameID, ByVal PartAdr + &H28, TempAdr, 4, 0
ReadProcessMemory PNameID, ByVal TempAdr + &H138, PlayAdrB, 4, 0
ReadProcessMemory PNameID, ByVal PlayAdrB + &H18, PlayAdrF, 4, 0 '读出玩家列表的首地址
ReadProcessMemory PNameID, ByVal PlayAdrB + &H24, PlayMax, 4, 0 '读出玩家数组的最大值
If TeamerID <> 0 Then
BaseAdr = PlayAdrF + (TeamerID Mod PlayMax) * 4
ReadProcessMemory PNameID, ByVal BaseAdr, TempAdr, 4, 0
ReadProcessMemory PNameID, ByVal TempAdr + &H4, TempAdr, 4, 0
ReadProcessMemory PNameID, ByVal TempAdr + EcxPartName, TempAdr, 4, 0 '目标名称
ReadProcessMemory PNameID, ByVal TempAdr, ByVal VarPtr(BuffEnum(0)), 36, BuffL
TeamerName = Left$(BuffEnum, 36)
TeamerName = Trim(KillChr0(Trim(TeamerName)))
End If
Erase BuffEnum
End If
CloseHandle PNameID
If Len(TeamerName) = 0 Then
ReadNameById = "未知"
Else
ReadNameById = TeamerName
End If
End Function
''按ID读取好友名称
Function ReadFNameById(FId As Long) As String
On Error Resume Next
Dim BaseAdr As Long, TempAdr As Long, PFNameID As Long
Dim FriendAdrB As Long, FriendNum As Long, FriendAdrF As Long, FriendMax As Long
Dim BuffEnum(36) As Byte, BuffL As Long, FriendName As String
PFNameID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If PFNameID Then
ReadProcessMemory PFNameID, ByVal PartAdr + &H28, TempAdr, 4, 0
ReadProcessMemory PFNameID, ByVal TempAdr + EcxFriend, FriendAdrB, 4, 0
ReadProcessMemory PFNameID, ByVal FriendAdrB + &H24, FriendAdrF, 4, 0 '好友列表的首地址
ReadProcessMemory PFNameID, ByVal FriendAdrB + &H30, FriendMax, 4, 0 '好友数组最大值
ReadProcessMemory PFNameID, ByVal FriendAdrB + &H20, FriendNum, 4, 0 '好友总数量
If FriendNum > 0 Then
If FId <> 0 Then
BaseAdr = FriendAdrF + (FId Mod FriendMax) * 4
ReadProcessMemory PFNameID, ByVal BaseAdr, TempAdr, 4, 0
If TempAdr > 0 Then
ReadProcessMemory PFNameID, ByVal TempAdr + &H4, BaseAdr, 4, 0
ReadProcessMemory PFNameID, ByVal BaseAdr + &H18, TempAdr, 4, 0 '目标名称
ReadProcessMemory PFNameID, ByVal TempAdr, ByVal VarPtr(BuffEnum(0)), 36, BuffL
FriendName = Left$(BuffEnum, 36)
FriendName = Trim(KillChr0(Trim(FriendName)))
Erase BuffEnum
End If
End If
Erase BuffEnum
End If
End If
CloseHandle PFNameID
If Len(FriendName) = 0 Then
ReadFNameById = ReadNameById(FId)
Else
ReadFNameById = FriendName
End If
End Function
''读取技能是否完成
Function ReadSDoStat(RSkillId As Long) As Boolean
Dim BaseAdr As Long, TempAdr As Long
Dim i As Integer
Dim SkillFAdr As Long, SkillNum As Long, SkillAdr As Long
Dim SkillID As Long, SkillLTime As Long
ProcessID = OpenProcess(PROCESS_ALL_ACCESS Or PROCESS_VM_OPERATION Or PROCESS_VM_READ Or PROCESS_VM_WRITE, False, hProcId)
If ProcessID Then
ReadProcessMemory ProcessID, ByVal PartAdr + &H28, BaseAdr, 4, 0 '二级基址
ReadProcessMemory ProcessID, ByVal BaseAdr + EcxSkillNum, SkillNum, 4, 0 '技能个数
ReadProcessMemory ProcessID, ByVal BaseAdr + EcxSkillFAdr, SkillFAdr, 4, 0 '已学技能首地址
For i = 0 To SkillNum - 1
ReadProcessMemory ProcessID, ByVal SkillFAdr + i * &H4, SkillAdr, 4, 0 '已学技能的第几个(Jn_i=0技能数-1)
ReadProcessMemory ProcessID, ByVal SkillAdr + &H8, SkillID, 4, 0 '技能ID
If RSkillId = SkillID Then
ReadProcessMemory ProcessID, ByVal SkillAdr + &HC, SkillLTime, 4, 0 '技能剩余冷却时间
If SkillLTime > 0 Then
ReadSDoStat = True
Else
ReadSDoStat = False
End If
Exit Function
End If
Next i
End If
CloseHandle ProcessID
ReadSDoStat = False
End Function
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -