Hab vor 2 Wochen angefangen ein Script zu schreiben, welches Daten eines HL1 (+ Mods) Server ausliest und diese ausgibt.
Screen:
[Blockierte Grafik: http://img-up.net/img/Clipboard0RjGl.jpg]
Code:
Spoiler anzeigen
#include <String.au3>
#include <GUIConstants.au3>
#include <ie.au3>
;#NoTrayIcon
Dim $A2S_INFO = _HexToString("FFFFFFFF") & "TSource Engine Query" & _HexToString("00")
Dim $A2S_SERVERQUERY_GETCHALLENGE = _HexToString("FFFFFFFF57")
Dim $A2S_RULES = _HexToString("FFFFFFFF56")
Dim $A2S_PLAYER = _HexToString("FFFFFFFF55")
global $s_ip
global $s_port
global $data
global $rServerInfo[7]
global $ServerMap
global $ServerName
global $ServerIsPass
global $ServerPing
global $ServerPlayers
global $ServerSlots
global $ServerPassword
global $defaultstatus = "Ready"
global $Ping
global $abfrage = 0
global $i = 0
global $challenge
; GUI!
[/autoit] [autoit][/autoit] [autoit]$g_main = GUICreate("Server Query Tool by Sascha - [WIP]", 386, 250, 272, 161)
$e_ip = GUICtrlCreateInput("83.142.80.79:27040", 56, 16, 161, 21)
;$e_port = GUICtrlCreateInput("27040", 216, 16, 73, 21)
$l_ipport = GUICtrlCreateLabel("IP/Port:", 8, 16, 41, 17)
$b_go = GUICtrlCreateButton("Go", 296, 16, 81, 17, 0)
$gr_infos = GUICtrlCreateGroup("Infos", 8, 48, 369, 137)
$l_servername = GUICtrlCreateLabel("Servername:", 16, 72, 64, 17)
$l_servername_e = GUICtrlCreateLabel("", 88, 72, 284, 20)
$l_map = GUICtrlCreateLabel("Map:", 16, 88, 28, 17)
$l_map_e = GUICtrlCreateLabel("", 88, 88, 284, 20)
$l_player = GUICtrlCreateLabel("Player:", 16, 104, 36, 17)
$l_player_e = GUICtrlCreateLabel("", 88, 104, 284, 20)
$l_ping = GUICtrlCreateLabel("Ping:", 16, 120, 28, 17)
$l_ping_e = GUICtrlCreateLabel("", 88, 120, 284, 20)
$l_password = GUICtrlCreateLabel("Password: ", 16, 136, 56, 17)
$l_password_e = GUICtrlCreateLabel("", 88, 136, 284, 20)
$b_connect = GUICtrlCreateButton("Connect", 104, 192, 169, 17, $BS_CENTER)
$l_statusbar = GUICtrlCreateLabel($defaultstatus, 2, 232, 382, 16, $SS_SUNKEN)
GUISetState(@SW_SHOW)
While 1
; status
If ProcessExists("hl.exe") Then
sleep(50)
$test = GUICtrlSetData($l_statusbar,"Counter-Strike started - HF & GL")
Else
sleep(50)
GUICtrlSetData($l_statusbar,$defaultstatus)
EndIf
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
UDPShutdown()
Exit
Case $b_go
GUICtrlSetData($b_go,"Refresh")
If $abfrage = 0 Then
GUICtrlSetData($l_statusbar,"Sende " & $A2S_INFO & " an " & $rServerInfo[6]) ;status
Else
_refresh()
GUICtrlSetData($l_statusbar,"Refreshing...") ; status
EndIf
$Address = StringSplit(GUICtrlRead($e_ip), ":")
$s_ip = $Address[1]
$s_port = $Address[2]
sleep(1000)
_getdata()
_getchallenge()
_getrules()
_getplayers()
GUICtrlSetData($l_servername_e,$ServerName)
sleep(80)
GUICtrlSetData($l_map_e,$ServerMap)
sleep(80)
GUICtrlSetData($l_player_e,$ServerPlayers & "/" & $ServerSlots)
sleep(80)
GUICtrlSetData($l_ping_e,$ServerPing)
sleep(80)
GUICtrlSetData($l_password_e,$ServerIsPass)
GUICtrlSetData($l_statusbar,$defaultstatus) ;status
$abfrage = 1
Case $b_connect
GUICtrlSetData($l_statusbar,"Checking Password...") ;status
If $ServerIsPass = "Yes" Then
$ServerPassword = InputBox("","Enter password")
GUICtrlSetData($l_statusbar,"Starting...")
$connect = _IECreate("steam://connect/" & $rServerInfo[6] & "/" & $ServerPassword,"",0)
Sleep(1000)
_IEQuit($connect)
Else
GUICtrlSetData($l_statusbar,"Starting...")
$connect = _IECreate("steam://connect/" & $rServerInfo[6],"",0)
Sleep(1000)
_IEQuit($connect)
EndIf
EndSwitch
WEnd
;#######################
; FUNKTIONEN!
;#######################
Func _refresh()
$ServerName = ""
$ServerMap = ""
$ServerPing = ""
$ServerIsPass = ""
$ServerSlots = ""
$ServerPlayers = ""
EndFunc
func _getchallenge()
UDPStartup()
$socketc = UDPOpen($s_ip,$s_port)
UDPSend($socketc,$A2S_SERVERQUERY_GETCHALLENGE)
$getchallenge = UDPRecv($socketc,999999)
$challenge = BinaryToString($getchallenge)
$challenge = StringTrimLeft($challenge, 4)
;MsgBox(0,"",$challenge)
EndFunc
func _getrules()
UDPStartup()
$socket = UDPOpen($s_ip,$s_port)
UDPSend($socket,$A2S_RULES & $challenge)
$rules = UDPRecv($socket, 99999)
$Serverrules = BinaryToString($rules)
;MsgBox(0,"",$Serverrules)
EndFunc
func _getplayers()
UDPStartup()
$socket = UDPOpen($s_ip,$s_port)
UDPSend($socket, $A2S_PLAYER & $challenge)
$player = UDPRecv($socket,99999)
$ServerPlayerInfos = BinaryToString($player)
;MsgBox(0,"",$ServerPlayerInfos)
EndFunc
func _getdata()
UDPStartup()
$socket = UDPOpen($s_ip,$s_port)
UDPSend($socket,$A2S_INFO)
$incoming = UDPRecv($socket,9999999)
$data = BinaryToString($incoming)
; status begin
If $incoming > 0 Then
GUICtrlSetData($l_statusbar,"Daten erhalten")
Else
GUICtrlSetData($l_statusbar,"Fehler beim Empfangen")
EndIf
sleep(1000)
GUICtrlSetData($l_statusbar,$defaultstatus)
; status end
If stringleft($data,4) == _HexToString("FFFFFFFF") Then
$data = StringTrimLeft($data, 5)
; IP & Port verschwinden lassen
Do
$data = StringTrimLeft($data, 1)
Until StringLeft($data, 1) = Chr(0)
$data = StringTrimLeft($data, 1)
; Servernamen holen
Do
$ServerName = $ServerName & StringLeft($Data, 1)
$Data = StringTrimLeft($Data, 1)
Until StringLeft($Data, 1) = Chr(0)
$Data = StringTrimLeft($Data, 1)
; Map holen
Do
$ServerMap = $ServerMap & StringLeft($Data, 1)
$Data = StringTrimLeft($Data, 1)
Until StringLeft($Data, 1) = Chr(0)
$Data = StringTrimLeft($Data, 1)
; Game verschwinden lassen
Do
$Data = StringTrimLeft($Data, 1)
Until StringLeft($Data, 1) = Chr(0)
$Data = StringTrimLeft($Data, 1)
; Info loswerden ~~
Do
$Data = StringTrimLeft($Data, 1)
Until StringLeft($Data, 1) = Chr(0)
$Data = StringTrimLeft($Data, 1)
; Serverpw holn
$ServerPlayers = Asc(StringLeft($Data, 1))
$Data = StringTrimLeft($Data, 1)
; Slotanzahl
$ServerSlots = Asc(StringLeft($Data, 1))
$Data = StringTrimLeft($Data, 4)
; Serverpasswortabfrage
$ServerIsPass = Asc(StringLeft($Data, 1))
If String($ServerIsPass) = "1" Then
$ServerIsPass = "Yes"
Else
$ServerIsPass = "No"
EndIf
; Server anpingen
If Ping($s_ip) <> 0 Then
$ServerPing = Ping($s_ip)
Else
$ServerPing = "Time out"
EndIf
; alles in einen Array schreiben
$rServerInfo[0] = $ServerName
$rServerInfo[1] = $ServerMap
$rServerInfo[2] = $ServerPlayers
$rServerInfo[3] = $ServerSlots
$rServerInfo[4] = $ServerIsPass
$rServerInfo[5] = $ServerPing
$rServerInfo[6] = $s_ip & ":" & $s_port
EndIf
EndFunc
Todo:
- UDP Packet Rules zerlegen (Gott, is das ne kack Arbeit mit AutoIt...)
- UDP Packet Playerstats zerlegen
- Rules + Playerstats im GUI ausgeben
- Favouriten Liste für Server
- Code säubern
Edit: 20 Hits, keine Antwort