Что нового

[Сеть, интернет] PlayerRadar монитор персонажа в игре

Dellroc

Осваивающий
Сообщения
151
Репутация
31
Всегда хотел такую феньку, чтобы можно было мониторить передвижения бота в игре и не требовалось разворачивать игру или идти к другому компу.
Данная программа работает и по сети.
Код:
#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
Аналог работающий без сетки через "stdout"
Код:
#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- другие игроки.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Так ты после каждого пакета реконнектишься. Хитёр! ;D
Не могу сказать что скрипты будут для меня полезными, но к репе +1 однозначно.
:thumbs_up:
 
Верх