Всегда хотел такую феньку, чтобы можно было мониторить передвижения бота в игре и не требовалось разворачивать игру или идти к другому компу.
Данная программа работает и по сети.
Скрипт отсылки пакетов
Аналог работающий без сетки через "stdout"
Отсылка пакетов (генератор) пример(исходник к сожелению не сохранился):
В конце опишу обрабатываемый пакет. В одном пакете данных должна идти вся необходимая информация, т.к. со следующего пакета она перезапишется.
Пример1: Packet|Player|200|200|Mob|50|50|Hero|250|200
Пример2: Packet|Player|250|150|Mob|150|350|Mob|250|200
player- собственно сам персонаж. Первые две цифры (200 и 200, 250и150) - кординаты х и у.
Mob- это мобы.
Hero- другие игроки.
Данная программа работает и по сети.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#NoTrayIcon
Opt("GUIOnEventMode", 1)
Opt('MustDeclareVars', 1)
HotKeySet("{ESC}", "_exit")
Func _exit()
TCPShutdown()
Exit
EndFunc ; _exit
Global $Hero=0, $Mob=0, $Player=0,$GUI,$guiData[100]
Global $ReadTCP=0
TCPStartup()
Local $LocalIP = @IPAddress1, $LocalPort = 5454
Local $MainSocket = TCPListen($LocalIP, $LocalPort)
If $MainSocket = -1 Then
MsgBox(0,"Socket creation fail","Socket creation fail")
_exit()
EndIf
_GUI()
Func _GUI()
Local $pic1
$GUI = GUICreate("Player Radar v0.1", 500, 500,10,10)
GUICtrlCreatePic(@ScriptDir & "\map.jpg", 0, 0, 500, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
GUISetState()
While 1
$ReadTCP = ReadTCP()
ReadData($ReadTCP,$guiData)
Sleep(100)
WEnd
EndFunc
Func ReadTCP()
Local $ConnectedSocket = -1, $ClientIP
Local $msg, $recv
Do
ToolTip("Ждём подключения")
$ConnectedSocket = TCPAccept($MainSocket)
Until $ConnectedSocket <> -1
$ClientIP = SocketToIP($ConnectedSocket)
While 1
ToolTip("Получаем пакет")
$recv = TCPRecv($ConnectedSocket, 4096)
If @error Then Return "Ошибка получения пакета"
$recv = BinaryToString($recv, 4)
If $recv <> "" Then
TCPCloseSocket($ConnectedSocket)
Return $recv
EndIf
ToolTip("")
WEnd
Return "Конец функции"
EndFunc
Func SocketToIP($SHOCKET)
Local $sockaddr, $aRet
$sockaddr = DllStructCreate("short;ushort;uint;char[8]")
$aRet = DllCall("Ws2_32.dll", "int", "getpeername", "int", $SHOCKET, _
"ptr", DllStructGetPtr($sockaddr), "int*", DllStructGetSize($sockaddr))
If Not @error And $aRet[0] = 0 Then
$aRet = DllCall("Ws2_32.dll", "str", "inet_ntoa", "int", DllStructGetData($sockaddr, 3))
If Not @error Then $aRet = $aRet[0]
Else
$aRet = 0
EndIf
$sockaddr = 0
Return $aRet
EndFunc
Func ReadData($tData, ByRef $tArray)
Local $array,$t=0
If $tData = "" Then Return "Нет пакетов"
$array = StringSplit($tData, "|")
If Not IsArray($array) Or UBound($array)<3 Then Return "Пакет не распознан"
If $tArray[0]<>"" Then
For $i=0 To UBound($tArray) - 1
If $tArray[$i]="" Then ExitLoop
GUICtrlDelete($tArray[$i])
$tArray[$i]=""
Next
EndIf
For $i = 2 To UBound($array) - 1
Select
Case $array[$i]="Player"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0xFF0000)
$t+=1
Case $array[$i]="Mob"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0x00FF00)
$t+=1
Case $array[$i]="Hero"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0x0000FF)
$t+=1
EndSelect
Next
Return "ok"
EndFunc
Код:
HotKeySet("{ESC}", "_exit")
Func _exit()
TCPShutdown()
Exit
EndFunc ; _exit
Example()
Func Example()
TCPStartup()
Local $ConnectedSocket = -1, $szData
Local $NetIP = @IPAddress1
Local $NetPort = 5454
While 1 ;Loop forever asking for data to send to the SERVER
$ConnectedSocket = TCPConnect($NetIP, $NetPort)
If @error Then
MsgBox(4112, "Error", "TCPConnect failed with WSA error: " & @error)
_exit()
EndIf
$szData = InputBox("Data for Server", @LF & @LF & "Enter data to transmit to the SERVER:")
If @error Or $szData = "" Then _exit() ; If they cancel the InputBox or leave it blank we exit our forever loop
TCPSend($ConnectedSocket, StringToBinary($szData, 4))
;If @error Then ExitLoop ; If the send failed with @error then the socket has disconnected
WEnd
EndFunc ;==>Example
Код:
#include <GUIConstantsEx.au3>
#Include <Constants.au3>
#include <Array.au3>
#NoTrayIcon
Opt("GUIOnEventMode", 1)
Opt('MustDeclareVars', 1)
HotKeySet("{ESC}", "_exit")
Func _exit()
AdlibUnRegister("_GUI")
Exit
EndFunc ; _exit
Global $tPid = Run("generator.exe", '', @SW_SHOW, $STDOUT_CHILD)
Global $Hero=0, $Mob=0, $Player=0,$GUI,$guiData[100]
AdlibRegister("Monitor",1000)
_GUI()
Func _GUI()
Local $pic1
$GUI = GUICreate("Player Radar v0.1", 500, 500,10,10)
GUICtrlCreatePic(@ScriptDir & "\map.jpg", 0, 0, 500, 500)
GUISetOnEvent($GUI_EVENT_CLOSE, "_exit")
GUISetState()
While 1
Sleep(1000)
WEnd
EndFunc
Func Monitor()
ConsoleWrite(@CRLF&"Результат = "&ReadMem($tPid,$guiData)&@CRLF)
EndFunc
Func ReadMem($Pid, ByRef $tArray)
Local $Data="",$array,$t=0
If $Pid = "" Or $Pid = -1 Then Return "Не найден процесс"
$Data = StdoutRead($Pid)
If $Data = "" Then Return "Нет пакетов"
ConsoleWrite(@CRLF&$data&@CRLF)
$array = StringSplit($data, "|")
If Not IsArray($array) Or UBound($array)<3 Then Return 2
If $tArray[0]<>"" Then
For $i=0 To UBound($tArray) - 1
If $tArray[$i]="" Then ExitLoop
GUICtrlDelete($tArray[$i])
$tArray[$i]=""
Next
EndIf
For $i = 2 To UBound($array) - 1
Select
Case $array[$i]="Player"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0xFF0000)
$t+=1
Case $array[$i]="Mob"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0x00FF00)
$t+=1
Case $array[$i]="Hero"
$tArray[$t]=GUICtrlCreateLabel("",$array[$i+1],$array[$i+2],10,10)
GUICtrlSetBkColor(-1, 0x0000FF)
$t+=1
EndSelect
Next
Return "ok"
EndFunc
Код:
Global $i = 0
While 1
Sleep(100)
$i += 1
$t="x"&$i&"|"&"y"&$i
ConsoleWrite($t)
WEnd
Пример1: Packet|Player|200|200|Mob|50|50|Hero|250|200
Пример2: Packet|Player|250|150|Mob|150|350|Mob|250|200
player- собственно сам персонаж. Первые две цифры (200 и 200, 250и150) - кординаты х и у.
Mob- это мобы.
Hero- другие игроки.