#include #include #include #include #include #include ; some options Dim $mIPAdress = "213.163.64.5" Dim $mPort = 27015 Dim $Friends[6] = ["-=ZOH","Kim","Killa.at", "Manadar", "DTkiddin", "Goldberg"] ; end options Dim $Map = "" UDPStartup() $GUI = GUICreate("Favorite Server Monitor", 303, 450, 297, 156) GUISetOnEvent($GUI_EVENT_CLOSE,"CloseMaybe") $Group1 = GUICtrlCreateGroup("Add Friend", 5, 5, 295, 50) GUICtrlCreateLabel("Username: ", 15, 25, 58, 18) $Inp_AddFriend = GUICtrlCreateInput("", 75, 23, 161, 21) $Btn_AddFriend = GUICtrlCreateButton("Add", 245, 20, 45, 25, 0) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("Players", 5, 60, 295, 275) $Lst_Players = GUICtrlCreateListView("", 15, 80, 275, 240, BitOR($LVS_SHOWSELALWAYS, $LVS_NOSORTHEADER, $LVS_REPORT) ) _GUICtrlListView_SetExtendedListViewStyle($Lst_Players, BitOR($LVS_EX_GRIDLINES, $LVS_EX_FULLROWSELECT, $LVS_EX_SUBITEMIMAGES) ) _GUICtrlListView_SetUnicodeFormat($Lst_Players,True) _GUICtrlListView_AddColumn($Lst_Players, "Players", 255) $hImage = _GUIImageList_Create(11,11) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap(GUICtrlGetHandle($Lst_Players), 0xFFFFFF, 11, 11)) _GUIImageList_Add($hImage, _GUICtrlListView_CreateSolidBitMap(GUICtrlGetHandle($Lst_Players), 0x00FF00, 11, 11)) _GUICtrlListView_SetImageList($Lst_Players, $hImage, 1) GUICtrlCreateGroup("", -99, -99, 1, 1) GUICtrlCreateGroup("Game Info", 5, 340, 295, 75) $Lbl_Servername = GUICtrlCreateLabel("", 80, 358, 211, 20, 0x0B ,$WS_EX_STATICEDGE) GUICtrlCreateLabel("Gamename:", 15, 360, 61, 17) GUICtrlCreateLabel("Map:", 15, 385, 28, 17) $Lbl_Mapname = GUICtrlCreateLabel("", 80, 383, 211, 20, 0x0B , $WS_EX_STATICEDGE) GUICtrlCreateGroup("", -99, -99, 1, 1) $Btn_Refresh = GUICtrlCreateButton("Refresh now", 50, 420, 95, 25, 0) $Btn_Settings = GUICtrlCreateButton("Settings", 155, 420, 95, 25, 0) GUISetState(@SW_SHOW) AdlibEnable("_GUI_Update", 3000) _GUI_Update() While 1 Sleep(100) WEnd Func _GUI_Update() $ServerInfo = _GetServerInfo() If (UBound($ServerInfo) < 4) Then Return GUICtrlSetData($Lbl_Servername, $ServerInfo[0]) GUICtrlSetData($Lbl_Mapname, $ServerInfo[1]) If ($ServerInfo[1] <> $Map) Then $Map = $ServerInfo[1] SetMap($Map) EndIf $Players = $ServerInfo[3] _GUICtrlListView_DeleteAllItems(GUICtrlGetHandle($Lst_Players)) For $i = 0 to UBound($Players)-2 __ArraySearch($Friends,$Players[$i],0,0,0,1) If Not @error Then _GUICtrlListView_AddItem($Lst_Players, $Players[$i],1) Else _GUICtrlListView_AddItem($Lst_Players, $Players[$i],0) EndIf Next EndFunc Func _GetServerInfo() Local $Return[4] $Gameinfo = _UDPQuery( _HexToQueryString("FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 6E 65 20 51 75 65 72 79 00 ") ) $GameinfoSplit = StringSplit(_QueryToString($Gameinfo), @CRLF, 1) If (UBound($GameinfoSplit) < 4) Then Return $Return[0] = $GameinfoSplit[2] $Return[1] = $GameinfoSplit[3] $Return[2] = $GameinfoSplit[5] ;ConsoleWrite("Gamename: " & $Gamename & @CRLF & "Map: " & $Map & @CRLF & "Gamemode: " & $Gamemode & @CRLF) $Reply = _UDPQuery( _HexToQueryString("FF FF FF FF 55 00 00 00 00 ") ) $Players = _UDPQuery( BinaryMid($Reply,1,4) & Binary("0x55") & BinaryMid($Reply,6) ) ;ConsoleWrite("Players: " & @CRLF & _PlayerQueryToString($Players) & @CRLF & @CRLF) $myvar = _PlayerQueryToNameArray($Players) ;ConsoleWrite("Players: " & UBound($myvar)-1 & "/36" & @CRLF & @CRLF) $Return[3] = $myvar Return $Return ;ConsoleWrite( _ArrayToString($myvar,@CRLF) ) EndFunc Func _UDPQuery($pStringQuery) $lUDPOpen = UDPOpen($mIPAdress, $mPort) $lUDPSend = UDPSend($lUDPOpen, $pStringQuery ) $lReturn = "" $lRecv = "" For $x = 0 to 10 $lReturn &= UDPRecv($lUDPOpen,2048) if $lReturn Then While $lRecv <> "" $lRecv &= UDPRecv($lUDPOpen,2048) Sleep(5) WEnd ExitLoop EndIf Next Return $lReturn EndFunc Func _HexToQueryString($lHexQuery) $lSplit = StringSplit($lHexQuery," ") $lHexQuery = "" For $x = 1 to $lSplit[0] If $lSplit[$x] Then $lHexQuery &= Chr((Dec($lSplit[$x]))) EndIf Next Return $lHexQuery EndFunc Func _QueryToString($lQueryString) $lQueryString = StringTrimLeft($lQueryString,2) $lSplit = StringSplit($lQueryString,"") $lStringQuery = "" For $x = 1 to $lSplit[0] Step 2 if $x = $lSplit[0] Then ExitLoop $thisChar = $lSplit[$x] & $lSplit[$x+1] If $thisChar Then $thisDec = Dec($thisChar) if $thisDec > 31 AND $thisDec < 255 Then $lStringQuery &= Chr($thisDec) EndIf if $thisDec == 0 OR $thisDec == 14 Then $lStringQuery &= @CRLF EndIf EndIf Next For $i = 0 to 5 $lStringQuery = StringReplace($lStringQuery, @CRLF & @CRLF, @CRLF) Next Return $lStringQuery EndFunc Func _PlayerQueryToNameArray($pInput) $pTempString = StringTrimLeft($pInput,2) $lSplit = _StringSplitIn($pTempString,2) Dim $null = 0 Dim $lResult[1] For $i = 7 to UBound($lSplit)-1 If Dec($lSplit[$i]) = 0 Then ;ConsoleWrite("null found at pos: " & $i & @CRLF) $null += 1 $lastnull = $i ;ConsoleWrite("Looping from " & $i & " to " & $i+10 & @CRLF) For $n = $i To $i+10 If $n = UBound($lSplit)-1 Then ExitLoop EndIf If Dec($lSplit[$n]) = 0 Then $lastnull = $n EndIf Next ;ConsoleWrite("trailing null found at pos: " & $lastnull & @CRLF) $ignorenext = $lastnull - $i if ($lastnull <> $i) Then $ignorenext += 1 EndIf $i = $lastnull+$ignorenext ReDim $lResult[UBound($lResult)+1] ;ConsoleWrite(">1up" & @CRLF) Else ;ConsoleWrite("[" & $i & "] hex: " & $lSplit[$i] & " dec: " & Dec($lSplit[$i]) & " char: " & Chr(Dec($lSplit[$i])) & @CRLF ) ;ConsoleWrite("[" & UBound($lResult)-1 & "] = " & $lResult[UBound($lResult)-1] & @CRLF) $lResult[UBound($lResult)-1] &= Chr(Dec($lSplit[$i])) EndIf Next Return $lResult EndFunc Func _StringSplitIn($pString,$pNumber) Local $lOutput[1], $i = 0 While 1 $lOutput[$i] = StringLeft($pString,$pNumber) $pString = StringTrimLeft($pString,$pNumber) If StringLen($pString) = 0 Then ExitLoop EndIf $i += 1 ReDim $lOutput[$i+1] WEnd Return $lOutput EndFunc ;; I modified this function to ignore @ + & ~ % at the start of the array function ;; It is handy when you need to find a member by name, and not rank+name ;; I'll make this proper later. Func __ArraySearch(Const ByRef $avArray, $vWhat2Find, $iStart = 0, $iEnd = 0, $iCaseSense = 0, $fPartialSearch = False) Local $iCurrentPos, $iUBound, $iResult If Not IsArray($avArray) Then SetError(1) Return -1 EndIf $iUBound = UBound($avArray) - 1 If $iEnd = 0 Then $iEnd = $iUBound If $iStart > $iUBound Then SetError(2) Return -1 EndIf If $iEnd > $iUBound Then SetError(3) Return -1 EndIf If $iStart > $iEnd Then SetError(4) Return -1 EndIf If Not ($iCaseSense = 0 Or $iCaseSense = 1) Then SetError(5) Return -1 EndIf For $iCurrentPos = $iStart To $iEnd Select Case $iCaseSense = 0 If $fPartialSearch = False Then If ($avArray[$iCurrentPos] = $vWhat2Find) Then SetError(0) Return $iCurrentPos EndIf Else $iResult = StringInStr($vWhat2Find, $avArray[$iCurrentPos], $iCaseSense) If $iResult > 0 Then SetError(0) Return $iCurrentPos EndIf EndIf Case $iCaseSense = 1 If $fPartialSearch = False Then If $avArray[$iCurrentPos] == $vWhat2Find Then SetError(0) Return $iCurrentPos EndIf Else $iResult = StringInStr($vWhat2Find, $avArray[$iCurrentPos], $iCaseSense) If $iResult > 0 Then SetError(0) Return $iCurrentPos EndIf EndIf EndSelect Next SetError(6) Return -1 EndFunc ;==>__ArraySearch Func CloseMaybe() Exit EndFunc