TCP Filetransfer

  • Wow, top! Danke :)

    Die Lösung war echt einfach, man muss nur drauf kommen :sleeping:

    StringSplit schiebt aber gerade ein wenig faxxen, da ein "|" als delimiter nicht in Frage kommt würde ich gerne soetwas hier einsetzen: "@c&/+", nur dann startet bei mir die Errorzeile:


    [autoit]

    ElseReturn MsgBox(64,"",$data[1] & "..." & $data[2])EndIf

    [/autoit]


    bei $data[2] stehen keine Daten. Gibt es dazu eine logische erklärung?

    EDIT: Sorry für die komischen Absätze, Opera und das Forum/AutoIT Source vertragen sich nicht!

  • $data[0] ist 4

    $data[1] ist der Befehl

    ...heist soviel wie 4 Strings die ich habe


    Mein Delimiter ist gerade "@@@" und ich sende


    [autoit]

    TCPSend($socket, "CHATSEND@@@" & GUICtrlRead($IN_USER) & ": " & GUICtrlRead($IN_CHAT))

    [/autoit]
  • Hey,


    gibt es eine noch sicherere Methode einen Text in ein Textfeld zu senden und mit {ENTER} zu bestätigen? ControlSend funktioniert sehr unzuverlässig!
    EDIT: Ok, das mit dem StringSplit hat sich geklärt, ich sollte wohl öfters die AutoIT hilfe nutzen :/
    Jetzt stehe ich aber vor einem anderen problem.
    Ich bin gerade dabei die Spielernamen + Nummern an den Client zu Senden, das ganze soll in eine ListView gepackt werden (damit die Spieler ausgewählt werden können und ggf. gekickt werden können). Ein ListView Eintrag nutzt ja den "|" Seperator, jetzt hat z.B. mein Clan das "|" als trennzeichen. Kann mir jemand da helfen?

    Einmal editiert, zuletzt von juloko1 (23. August 2012 um 00:07)

  • Es ist da aber nur ein Buchstabe möglich, oder? Gibt es irgendwo eine Tabelle wo man alle dafür verwendbaren Zeichen findet? In den Spielernamen kommen ziemlich viele unterschiedliche Zeichen vor :/

  • Wie wäre es wenn du als Trennzeichen in den Paketen einfach andere Zeichen benutzt und die Pakete dann später einfach mit StringReplace() und StringSplit() zurecht schneidest? :P

    LG
    Christoph :)

  • Guten Abend, ja - das hat geklappt, dann fehlen zwar die "|" in den Spielernamen, aber das ist ja nicht allzu tragisch.
    Jetzt zu dem nächsten Problem.

    Ich schaff es nicht, das hier umzusetzen.

    [autoit]

    For $i = 0 To 18 Step 1 ;18 Spieler
    If $IW5MP_PLAYER00[0] = "45" Then ;$IW5MP_PLAYER00 ist ein Array mit 45 Werten, davon brauche ich 2.
    $PLAYER00 = StringReplace($IW5MP_PLAYER00[9], "|", "") & "|" & $IW5MP_PLAYER00[35] ;
    Else
    $PLAYER00 = " | " ;Leerer Wert, da keine Spielerinformationen gefunden wurden / der Spielerslot ist leer
    EndIf
    Next

    [/autoit]

    So, das ganze würde ich gerne Automatisiert machen, nur wie kann ich $IW5MP_PLAYER00[0] und die $i zusammenkleben?
    Grüße

  • Guten Abend,

    das Script ist soweit fertig zusammengekleistert.
    Nun ist es bei dem Hoster des Server so, das ich die *.exe nicht selber Starten kann. So habe ich mir ein kleines extraprogramm geschrieben, mit dem ich von zuhause aus den Server Starten & Stoppen kann (dieses benutzt auch die TCPServer.au3)
    Jetzt stehe ich vor dem Problem das der Server nicht antwortet, wenn ich mit einem Client darauf connecten will.
    Kann es sein das ich diese UDF nicht 2x verwenden kann? Unterschiedliche Ports verwende ich ja.

    Grüße

  • Hey,

    nein - nicht im selben Script.
    Ich habe sozusagen 4 Programme (2x auf dem GameServer und 2x bei mir zuhause).
    2 davon sind nur dazu da, das Hauptscript zu Starten und zu Beenden. (Ich kann auf dem Server ja selber keine *.exe Dateien starten, deswegen hat das einmalig der Hoster übernommen). So brauche ich nur einmal ein kleines Programm zu starten und einen Button zu klicken. Dieser sendet ein "GO" bzw. "STOP" an den GameServer (Port: 23328).
    Jetzt wird das eigentliche Programm gestartet (was soweit auch gut funktioniert), nur scheitert es bisher daran, das der Client das Hauptprogramm nicht findet (Port: 23330).

  • Also das 2. Programm welches das Hauptprogramm startet funktioniert einwandfrei.
    Was ich auch schon hinbekommen hab ist ein TCPSend an meinen Computer.
    Ich werde später nochmal ein Grundgerüst bauen um zu gucken ob wenigstens das funktioniert.

    Grüße.

  • Nunja, es scheint nicht zu funktionieren.

    Hier das Script welches sich auf dem GameServer befindet:

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    TCPStartup()
    $socket = TCPConnect("217.87.49.XX", 23326)
    If @error Then
    IniWrite(@ScriptDir & "\error.log", "error", "error", "1")
    EndIf
    TCPSend($socket, "SUCCESS")
    TCPCloseSocket($socket)

    [/autoit]

    Und hier die auf meinem PC (welche natürlich zuerst gestartet wird):

    [autoit]

    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>

    [/autoit][autoit][/autoit][autoit]

    TCPStartup()
    $socket = TCPConnect("192.168.2.103", 23326)
    Sleep(10000)
    MsgBox(64,"",TCPRecv($socket, 1024))
    TCPCloseSocket($socket)

    [/autoit]

    Es wird immer die error.log Datei erstellt :/

  • Argh,

    alles klar. Der Hoster hatte den 2. Port wohl doch nicht freigegeben, der Test funktionierte aber jetzt - das Script oben war das falsche :o
    Ich melde mich sicher nochmal später ^^


    Grüße :)

  • Für diesen Post werden ihr mich bestimmt Steinigen, aber könnte vielleicht jemand mal rübergucken und die gröbsten Fehler beheben? An sich läuft das Script, nur ich kann mir vorstellen das einige Sachen einfach unnötig sind oder optimiert werden können.

    Server:

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=AERORAT.ico
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****
    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <WindowsConstants.au3>
    #include "TCPServer.au3" ; http://pastebin.com/Ht8vqAXN
    #include "NomadMemory.au3"

    [/autoit] [autoit][/autoit] [autoit]

    _TCPServer_RegisterEvent($TCPSERVER_RECEIVEDDATA, "ReceivedData")
    _TCPServer_Startup("127.0.0.1", 23333)

    [/autoit] [autoit][/autoit] [autoit]

    While Sleep(100)
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func ReceivedData($socket, $data)
    $data = StringSplit($data, "|")
    Switch $data[1] ; empfangene Daten
    Case "GETUPDATE"
    If ProcessExists("iw5mp_server.exe") Then
    $PID = ProcessExists("iw5mp_server.exe")
    $IW5MPProcess = _MemoryOpen($PID)
    ; => MAP
    $IW5MP_MAP = _MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","OFFSET","MAP",""), $IW5MPProcess, 'char[64]')
    ; => PLAYER
    $IW5MP_PLAYER0 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","0",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER1 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","1",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER2 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","2",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER3 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","3",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER4 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","4",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER5 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","5",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER6 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","6",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER7 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","7",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER8 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","8",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER9 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","9",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER10 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","10",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER11 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","11",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER12 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","12",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER13 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","13",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER14 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","14",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER15 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","15",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER16 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","16",""), $IW5MPProcess, 'char[1024]'),"\")
    $IW5MP_PLAYER17 = StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER","17",""), $IW5MPProcess, 'char[1024]'),"\")
    ;===> CHECK PLAYER AVAILABILITY
    ;~ For $i = 0 To 18 Step 1
    If $IW5MP_PLAYER0[0] = "45" Then
    $PLAYER0 = StringReplace($IW5MP_PLAYER0[9], "|", "") ;PLAYER 00
    Else
    $PLAYER0 = "/"
    EndIf
    If $IW5MP_PLAYER1[0] = "45" Then
    $PLAYER1 = StringReplace($IW5MP_PLAYER1[9], "|", "") ;PLAYER 01
    Else
    $PLAYER1 = "/"
    EndIf
    If $IW5MP_PLAYER2[0] = "45" Then
    $PLAYER2 = StringReplace($IW5MP_PLAYER2[9], "|", "") ;PLAYER 02
    Else
    $PLAYER2 = "/"
    EndIf
    If $IW5MP_PLAYER3[0] = "45" Then
    $PLAYER3 = StringReplace($IW5MP_PLAYER3[9], "|", "") ;PLAYER 03
    Else
    $PLAYER3 = "/"
    EndIf
    If $IW5MP_PLAYER4[0] = "45" Then
    $PLAYER4 = StringReplace($IW5MP_PLAYER4[9], "|", "") ;PLAYER 04
    Else
    $PLAYER4 = "/"
    EndIf
    If $IW5MP_PLAYER5[0] = "45" Then
    $PLAYER5 = StringReplace($IW5MP_PLAYER5[9], "|", "") ;PLAYER 05
    Else
    $PLAYER5 = "/"
    EndIf
    If $IW5MP_PLAYER6[0] = "45" Then
    $PLAYER6 = StringReplace($IW5MP_PLAYER6[9], "|", "") ;PLAYER 06
    Else
    $PLAYER6 = "/"
    EndIf
    If $IW5MP_PLAYER7[0] = "45" Then
    $PLAYER7 = StringReplace($IW5MP_PLAYER7[9], "|", "") ;PLAYER 07
    Else
    $PLAYER7 = "/"
    EndIf
    If $IW5MP_PLAYER8[0] = "45" Then
    $PLAYER8 = StringReplace($IW5MP_PLAYER8[9], "|", "") ;PLAYER 08
    Else
    $PLAYER8 = "/"
    EndIf
    If $IW5MP_PLAYER9[0] = "45" Then
    $PLAYER9 = StringReplace($IW5MP_PLAYER9[9], "|", "") ;PLAYER 09
    Else
    $PLAYER9 = "/"
    EndIf
    If $IW5MP_PLAYER10[0] = "45" Then
    $PLAYER10 = StringReplace($IW5MP_PLAYER10[9], "|", "") ;PLAYER 10
    Else
    $PLAYER10 = "/"
    EndIf
    If $IW5MP_PLAYER11[0] = "45" Then
    $PLAYER11 = StringReplace($IW5MP_PLAYER11[9], "|", "") ;PLAYER 11
    Else
    $PLAYER11 = "/"
    EndIf
    If $IW5MP_PLAYER12[0] = "45" Then
    $PLAYER12 = StringReplace($IW5MP_PLAYER12[9], "|", "") ;PLAYER 12
    Else
    $PLAYER12 = "/"
    EndIf
    If $IW5MP_PLAYER13[0] = "45" Then
    $PLAYER13 = StringReplace($IW5MP_PLAYER13[9], "|", "") ;PLAYER 13
    Else
    $PLAYER13 = "/"
    EndIf
    If $IW5MP_PLAYER14[0] = "45" Then
    $PLAYER14 = StringReplace($IW5MP_PLAYER14[9], "|", "") ;PLAYER 14
    Else
    $PLAYER14 = "/"
    EndIf
    If $IW5MP_PLAYER15[0] = "45" Then
    $PLAYER15 = StringReplace($IW5MP_PLAYER15[9], "|", "") ;PLAYER 15
    Else
    $PLAYER15 = "/"
    EndIf
    If $IW5MP_PLAYER16[0] = "45" Then
    $PLAYER16 = StringReplace($IW5MP_PLAYER16[9], "|", "") ;PLAYER 16
    Else
    $PLAYER16 = "/"
    EndIf
    If $IW5MP_PLAYER17[0] = "45" Then
    $PLAYER17 = StringReplace($IW5MP_PLAYER17[9], "|", "") ;PLAYER 17
    Else
    $PLAYER17 = "/"
    EndIf
    ;~ Next
    Return $IW5MP_MAP & "|" & $PLAYER0 & "|" & $PLAYER1 & "|" & $PLAYER2 & "|" & $PLAYER3 & "|" & $PLAYER4 & "|" & $PLAYER5 & "|" & $PLAYER6 & "|" & $PLAYER7 & "|" & $PLAYER8 & "|" & $PLAYER9 & "|" & $PLAYER10 & "|" & $PLAYER11 & "|" & $PLAYER12 & "|" & $PLAYER13 & "|" & $PLAYER14 & "|" & $PLAYER15 & "|" & $PLAYER16 & "|" & $PLAYER17
    Else
    Return "0"
    EndIf
    Case "CHATSEND"
    If ($data[0] = 2) Then
    ControlFocus("Call of Duty", "", "")
    Sleep(50)
    ControlSend("Call of Duty", "", "", 'say "' & $data[2] & '"')
    Sleep(50)
    ControlSend("Call of Duty", "", "", "{ENTER}")
    Else
    Return "Chat not Sent"
    EndIf
    Case "CHANGEMAP"
    If ($data[0] = 2) Then
    If $data[2] = "Aground" Then
    $CHANGEMAP = "mp_aground_ss"
    ElseIf $data[2] = "Arkaden" Then
    $CHANGEMAP = "mp_plaza2"
    ElseIf $data[2] = "Bakaara" Then
    $CHANGEMAP = "mp_mogadishu"
    ElseIf $data[2] = "Bootleg" Then
    $CHANGEMAP = "mp_mogadishu"
    ElseIf $data[2] = "Carbon" Then
    $CHANGEMAP = "mp_carbon"
    ElseIf $data[2] = "Dome" Then
    $CHANGEMAP = "mp_dome"
    ElseIf $data[2] = "Downturn" Then
    $CHANGEMAP = "mp_exchange"
    ElseIf $data[2] = "Erosion" Then
    $CHANGEMAP = "mp_courtyard_ss"
    ElseIf $data[2] = "Fallen" Then
    $CHANGEMAP = "mp_lambeth"
    ElseIf $data[2] = "Hardhat" Then
    $CHANGEMAP = "mp_hardhat"
    ElseIf $data[2] = "Interchange" Then
    $CHANGEMAP = "mp_interchange"
    ElseIf $data[2] = "Mission" Then
    $CHANGEMAP = "mp_bravo"
    ElseIf $data[2] = "Outpost" Then
    $CHANGEMAP = "mp_radar"
    ElseIf $data[2] = "Resistance" Then
    $CHANGEMAP = "mp_paris"
    ElseIf $data[2] = "Seatown" Then
    $CHANGEMAP = "mp_seatown"
    ElseIf $data[2] = "Terminal" Then
    $CHANGEMAP = "mp_terminal_cls"
    ElseIf $data[2] = "Underground" Then
    $CHANGEMAP = "mp_underground"
    ElseIf $data[2] = "Village" Then
    $CHANGEMAP = "mp_village"
    Else
    $CHANGEMAP = "Map not Found!"
    EndIf
    ControlFocus("Call of Duty", "", "")
    Sleep(25)
    ControlSend("Call of Duty", "", "", "map " & $CHANGEMAP)
    Sleep(25)
    ControlSend("Call of Duty", "", "", "{ENTER}")
    EndIf
    Case "KICK"
    ControlFocus("Call of Duty", "", "")
    Sleep(50)
    ControlSend("Call of Duty", "", "", 'kickclient "' & $data[2] & '"')
    Sleep(50)
    ControlSend("Call of Duty", "", "", "{ENTER}")
    Case "TEMPBAN"
    ControlFocus("Call of Duty", "", "")
    Sleep(50)
    ControlSend("Call of Duty", "", "", 'tempbanclient "' & $data[2] & '"')
    Sleep(50)
    ControlSend("Call of Duty", "", "", "{ENTER}")
    Case "BAN"
    ControlFocus("Call of Duty", "", "")
    Sleep(50)
    ControlSend("Call of Duty", "", "", 'banclient "' & $data[2] & '"')
    Sleep(50)
    ControlSend("Call of Duty", "", "", "{ENTER}")
    Case Else
    Return StringFormat('Error', $data)
    EndSwitch
    EndFunc

    [/autoit]

    Client:

    Spoiler anzeigen
    [autoit]

    #region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_Icon=AERORAT.ico
    #AutoIt3Wrapper_Outfile_x64=..\AERO_RAT.exe
    #endregion ;**** Directives created by AutoIt3Wrapper_GUI ****

    [/autoit] [autoit][/autoit] [autoit]

    #include <ButtonConstants.au3>
    #include <EditConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <GuiListView.au3>
    #include <INet.au3>
    #include <Array.au3>
    #include <GDIPlus.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sExtIP = "127.0.0.1"
    Global $sExtPORT = "23333"
    Global $LVI[18]
    Global $CB_PLAYER[18]
    Global $LB_PLAYER[18]
    Global $TCPCon = "0"
    $iPosTop = 0

    [/autoit] [autoit][/autoit] [autoit]

    #region ### START Koda GUI section ### Form=
    $GUI = GUICreate("Remote Admin Tool", 757, 406, 300, 100)
    $hBGPic = GUICtrlCreatePic(@ScriptDir & "\data\bg.jpg", 0, 0, 757, 406)
    GUICtrlSetState($hBGPic, $GUI_DISABLE)
    ;===> LOGIN
    ;~ $GRP_LOGIN = GUICtrlCreateGroup("Login", 6, $iPosTop, 401, 67, $BS_FLAT)
    $LB_USER = GUICtrlCreateLabel("Username:", 14, $iPosTop + 17, 55, 17)
    $LB_PASS = GUICtrlCreateLabel("Password:", 14, $iPosTop + 41, 53, 17)
    $LB_LOGINSTATUS = GUICtrlCreateLabel("", 190, $iPosTop + 19, 150, 17)
    $IN_USER = GUICtrlCreateInput("", 70, $iPosTop + 14, 105, 21)
    $IN_PASS = GUICtrlCreateInput("", 70, $iPosTop + 38, 105, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_PASSWORD))
    $BT_LOGIN = GUICtrlCreateButton("Login", 188, $iPosTop + 41, 104, 19, $BS_FLAT)
    $BT_LOGOUT = GUICtrlCreateButton("Logout", 296, $iPosTop + 41, 104, 19, $BS_FLAT)
    GUICtrlSetState($BT_LOGOUT, $GUI_DISABLE)
    ;===> /LOGIN
    ;===> CHAT
    ;~ $GRP_CHAT = GUICtrlCreateGroup("Chat", 6, $iPosTop + 70, 401, 304, $BS_FLAT)
    $ED_CHAT = GUICtrlCreateEdit("", 14, $iPosTop + 81, 384, 256, BitOR($ES_AUTOVSCROLL, $ES_AUTOHSCROLL, $ES_WANTRETURN))
    $IN_CHAT = GUICtrlCreateInput("", 14, $iPosTop + 341, 284, 21)
    $BT_CHATSEND = GUICtrlCreateButton("Send", 308, $iPosTop + 342, 90, 19, $BS_FLAT)
    ;===> /CHAT
    ;===> PLAYERS
    ;~ $GRP_PLAYERS = GUICtrlCreateGroup("Players", 414, $iPosTop, 340, 336, $BS_FLAT)
    $vTop = $iPosTop + 13
    For $i = 0 To 17
    $CB_PLAYER[$i] = GUICtrlCreateCheckbox($i + 1 & ":", 419, $vTop, 33, 17)
    $vTop = $vTop + 17
    Next
    $vTop = $iPosTop + 15
    For $i = 0 To 17
    $LB_PLAYER[$i] = GUICtrlCreateLabel("", 457, $vTop, 200, 17)
    $vTop = $vTop + 17
    Next
    $BT_KICK = GUICtrlCreateButton("Kick", 674, $iPosTop + 13, 71, 19, $BS_FLAT)
    $BT_TEMPBAN = GUICtrlCreateButton("Tempban", 674, $iPosTop + 35, 71, 19, $BS_FLAT)
    $BT_BAN = GUICtrlCreateButton("Ban", 674, $iPosTop + 57, 71, 19, $BS_FLAT)
    $BT_GETIP = GUICtrlCreateButton("Get IP", 674, $iPosTop + 79, 71, 19, $BS_FLAT)
    ;===> /PLAYERS
    ;===> INFO
    ;~ $GRP_SERVERINFO = GUICtrlCreateGroup("Server Info", 414, $iPosTop + 340, 340, 66, $BS_FLAT)
    $LB_CM = GUICtrlCreateLabel("Current Map:", 421, $iPosTop + 348, 65, 17)
    $LB_CURRENTMAP = GUICtrlCreateLabel("", 485, $iPosTop + 348, 175, 17)
    $CO_CHOOSEMAP = GUICtrlCreateCombo("Aground", 626, $iPosTop + 348, 118, 21)
    GUICtrlSetData($CO_CHOOSEMAP, "Arkaden|Bakaara|Bootleg|Carbon|Dome|Downturn|Erosion|Fallen|Hardhat|Interchange|Mission|Outpost|Resistance|Seatown|Terminal|Underground|Village")
    $BT_CHANGEMAP = GUICtrlCreateButton("Change Map", 625, $iPosTop + 374, 120, 19, $BS_FLAT)
    ;===> /INFO
    $hServerInfo = GUICtrlCreateLabel("Status:", 166, 380, 400, 17)
    GUICtrlSetBkColor($hServerInfo, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #endregion ### END Koda GUI section ###

    [/autoit] [autoit][/autoit] [autoit]

    Global $LOGGEDSTATUS = "0"

    [/autoit] [autoit][/autoit] [autoit]

    AdlibRegister("_Lock", 0)

    [/autoit] [autoit][/autoit] [autoit]

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    If $TCPCon = "1" Then
    TCPCloseSocket($socket)
    EndIf
    Exit
    Case $BT_LOGIN
    $READ_USER = GUICtrlRead($IN_USER)
    $READ_PASS = GUICtrlRead($IN_PASS)
    $PWTEST = StringSplit(_INetGetSource("***"), "|")
    If $READ_USER == $PWTEST[1] And $READ_PASS == $PWTEST[2] And $PWTEST[3] == "A" Then
    _Unlock("A")
    GUICtrlSetData($LB_LOGINSTATUS, "Level: " & $PWTEST[3] & " login authorized!")
    AdlibUnRegister("_ClearText")
    AdlibRegister("_ClearText", 5000)
    GUICtrlSetState($BT_LOGIN, $GUI_DISABLE)
    GUICtrlSetState($BT_LOGOUT, $GUI_ENABLE)
    Global $LOGGEDSTATUS = "1"
    AdlibRegister("_LoggedStatus", 0)
    ElseIf $READ_USER == $PWTEST[1] And $READ_PASS == $PWTEST[2] And $PWTEST[3] == "B" Then
    _Unlock("B")
    GUICtrlSetData($LB_LOGINSTATUS, "Level: " & $PWTEST[3] & " login authorized!")
    AdlibUnRegister("_ClearText")
    AdlibRegister("_ClearText", 5000)
    GUICtrlSetState($BT_LOGIN, $GUI_DISABLE)
    GUICtrlSetState($BT_LOGOUT, $GUI_ENABLE)
    Global $LOGGEDSTATUS = "1"
    AdlibRegister("_LoggedStatus", 0)
    Else
    GUICtrlSetData($LB_LOGINSTATUS, "Wrong Login Data")
    AdlibUnRegister("_ClearText")
    AdlibRegister("_ClearText", 5000)
    Global $LOGGEDSTATUS = "0"
    EndIf
    Case $BT_LOGOUT
    _Logout()
    Case $BT_KICK
    _DoToClient("KICK")
    Case $BT_TEMPBAN
    _DoToClient("TEMPBAN")
    Case $BT_BAN
    _DoToClient("BAN")
    Case $BT_GETIP
    _DoToClient("GETIP")
    Case $BT_CHATSEND
    TCPSend($socket, "CHATSEND|" & GUICtrlRead($IN_USER) & ": " & GUICtrlRead($IN_CHAT))
    GUICtrlSetData($IN_CHAT, "")
    Case $BT_CHANGEMAP
    TCPSend($socket, "CHANGEMAP|" & GUICtrlRead($CO_CHOOSEMAP))
    EndSwitch
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    Func _Logout()
    AdlibRegister("_Lock", 0)
    GUICtrlSetData($LB_LOGINSTATUS, "Logout Successful!")
    AdlibUnRegister("_ClearText")
    AdlibRegister("_ClearText", 5000)
    GUICtrlSetState($BT_LOGIN, $GUI_ENABLE)
    GUICtrlSetState($BT_LOGOUT, $GUI_DISABLE)
    Global $LOGGEDSTATUS = "0"
    AdlibUnRegister("_LoggedStatus")
    EndFunc ;==>_Logout

    [/autoit] [autoit][/autoit] [autoit]

    Func _Lock()
    GUICtrlSetState($IN_CHAT, $GUI_DISABLE)
    GUICtrlSetState($BT_KICK, $GUI_DISABLE)
    GUICtrlSetState($BT_TEMPBAN, $GUI_DISABLE)
    GUICtrlSetState($BT_BAN, $GUI_DISABLE)
    GUICtrlSetState($BT_GETIP, $GUI_DISABLE)
    GUICtrlSetState($BT_CHATSEND, $GUI_DISABLE)
    GUICtrlSetState($BT_CHANGEMAP, $GUI_DISABLE)
    AdlibUnRegister("_Lock")
    EndFunc ;==>_Lock

    [/autoit] [autoit][/autoit] [autoit]

    Func _Unlock($CLASS)
    GUICtrlSetState($IN_CHAT, $GUI_ENABLE)
    GUICtrlSetState($BT_KICK, $GUI_ENABLE)
    GUICtrlSetState($BT_TEMPBAN, $GUI_ENABLE)
    If $CLASS = "A" Then
    GUICtrlSetState($BT_BAN, $GUI_ENABLE)
    GUICtrlSetState($BT_GETIP, $GUI_ENABLE)
    EndIf
    GUICtrlSetState($BT_CHATSEND, $GUI_ENABLE)
    If $CLASS = "A" Then
    GUICtrlSetState($BT_CHANGEMAP, $GUI_ENABLE)
    EndIf
    EndFunc ;==>_Unlock

    [/autoit] [autoit][/autoit] [autoit]

    Func _ClearText()
    GUICtrlSetData($LB_LOGINSTATUS, "")
    AdlibUnRegister("_ClearText")
    EndFunc ;==>_ClearText

    [/autoit] [autoit][/autoit] [autoit]

    Func _LoggedStatus()
    If $LOGGEDSTATUS = "1" Then
    If $TCPCon = "0" Then
    TCPStartup()
    Global $socket = TCPConnect($sExtIP, $sExtPORT)
    If @error Then
    MsgBox(64, "Fehler", "Server N/A")
    _Logout()
    EndIf
    $TCPCon = "1"
    EndIf
    TCPSend($socket, "GETUPDATE")
    AdlibRegister("_ReciveData", IniRead(@ScriptDir & "\data.ini", "SET", "DELAY", "1250"))
    AdlibUnRegister("_LoggedStatus")
    Else
    AdlibUnRegister("_LoggedStatus")
    EndIf
    EndFunc ;==>_LoggedStatus

    [/autoit] [autoit][/autoit] [autoit]

    Func _ReciveData()
    $RECV_UPDATE = TCPRecv($socket, 1024)
    GUICtrlSetData($hServerInfo, $RECV_UPDATE)
    If $RECV_UPDATE = "0" Then
    ;~ GUICtrlSetData($hServerInfo, "Status: GameServer Offline!")
    ;~ TCPCloseSocket($socket)
    AdlibUnRegister("_ReciveData")
    AdlibRegister("_LoggedStatus", IniRead(@ScriptDir & "\data.ini", "SET", "DELAY", ""))
    Else
    $RECV_UPDATE = StringSplit($RECV_UPDATE, "|", 1)
    If $RECV_UPDATE[1] = "mp_aground_ss" Then
    $EX_MAPNAME = "Aground"
    ElseIf $RECV_UPDATE[1] = "mp_plaza2" Then
    $EX_MAPNAME = "Arkaden"
    ElseIf $RECV_UPDATE[1] = "mp_mogadishu" Then
    $EX_MAPNAME = "Bakaara"
    ElseIf $RECV_UPDATE[1] = "mp_bootleg" Then
    $EX_MAPNAME = "Bootleg"
    ElseIf $RECV_UPDATE[1] = "mp_carbon" Then
    $EX_MAPNAME = "Carbon"
    ElseIf $RECV_UPDATE[1] = "mp_dome" Then
    $EX_MAPNAME = "Dome"
    ElseIf $RECV_UPDATE[1] = "mp_exchange" Then
    $EX_MAPNAME = "Downturn"
    ElseIf $RECV_UPDATE[1] = "mp_courtyard_ss" Then
    $EX_MAPNAME = "Erosion"
    ElseIf $RECV_UPDATE[1] = "mp_lambeth" Then
    $EX_MAPNAME = "Fallen"
    ElseIf $RECV_UPDATE[1] = "mp_hardhat" Then
    $EX_MAPNAME = "Hardhat"
    ElseIf $RECV_UPDATE[1] = "mp_interchange" Then
    $EX_MAPNAME = "Interchange"
    ElseIf $RECV_UPDATE[1] = "mp_bravo" Then
    $EX_MAPNAME = "Mission"
    ElseIf $RECV_UPDATE[1] = "mp_radar" Then
    $EX_MAPNAME = "Outpost"
    ElseIf $RECV_UPDATE[1] = "mp_paris" Then
    $EX_MAPNAME = "Resistance"
    ElseIf $RECV_UPDATE[1] = "mp_seatown" Then
    $EX_MAPNAME = "Seatown"
    ElseIf $RECV_UPDATE[1] = "mp_terminal_cls" Then
    $EX_MAPNAME = "Terminal"
    ElseIf $RECV_UPDATE[1] = "mp_underground" Then
    $EX_MAPNAME = "Underground"
    ElseIf $RECV_UPDATE[1] = "mp_village" Then
    $EX_MAPNAME = "Village"
    Else
    $EX_MAPNAME = "Loading..."
    EndIf
    ;=========> PLAYERLIST
    For $i = 0 To 17
    If IsArray($RECV_UPDATE) Then
    If GUICtrlRead($LB_PLAYER[$i]) <> $RECV_UPDATE[$i + 2] Then
    GUICtrlSetData($LB_PLAYER[$i], $RECV_UPDATE[$i + 2])
    EndIf
    Else
    GUICtrlSetData($hServerInfo, "non Array")
    EndIf
    Sleep(20)
    Next
    GUICtrlSetData($LB_CURRENTMAP, $EX_MAPNAME)
    ;~ TCPCloseSocket($socket)
    AdlibUnRegister("_ReciveData")
    AdlibRegister("_LoggedStatus", IniRead(@ScriptDir & "\data.ini", "SET", "DELAY", ""))
    EndIf
    EndFunc ;==>_ReciveData

    [/autoit] [autoit][/autoit] [autoit]

    Func _DoToClient($ACTION)
    Switch $ACTION
    Case "KICK"
    For $i = 0 To 17
    If GUICtrlRead($CB_PLAYER[$i]) = 1 Then
    Global $vDoToClient = "KICK|" & $i
    GUICtrlSetState($CB_PLAYER[$i], $GUI_UNCHECKED)
    AdlibRegister("_SendAction", 0)
    EndIf
    Next
    Case "TEMPBAN"
    For $i = 0 To 17
    If GUICtrlRead($CB_PLAYER[$i]) = 1 Then
    Global $vDoToClient = "TEMPBAN|" & $i
    GUICtrlSetState($CB_PLAYER[$i], $GUI_UNCHECKED)
    AdlibRegister("_SendAction", 0)
    EndIf
    Next
    Case "BAN"
    For $i = 0 To 17
    If GUICtrlRead($CB_PLAYER[$i]) = 1 Then
    Global $vDoToClient = "BAN|" & $i
    GUICtrlSetState($CB_PLAYER[$i], $GUI_UNCHECKED)
    AdlibRegister("_SendAction", 0)
    EndIf
    Next
    Case "GETIP"
    For $i = 0 To 17
    If GUICtrlRead($CB_PLAYER[$i]) = 1 Then
    Global $vDoToClient = "GETIP|" & $i
    GUICtrlSetState($CB_PLAYER[$i], $GUI_UNCHECKED)
    AdlibRegister("_SendAction", 0)
    EndIf
    Next
    EndSwitch
    EndFunc

    [/autoit] [autoit][/autoit] [autoit]

    Func _SendAction()
    TCPSend($socket, $vDoToClient)
    $vDoToClient = ""
    AdlibUnRegister("_SendAction")
    EndFunc

    [/autoit]

    Eine Frage gerade: Es darf doch nur 1x TCPStartup und TCPConnect ausgeführt werden, richtig?

  • Zu deiner Frage:
    Ja, du solltest am Besten nur einmal TCPStartup und TCPShutdown ausführen (am Besten ganz am Anfang und am Ende).
    TCPConnect hingegen kannst du so oft verwenden wie du willst/musst, da es ja seinen kann, dass du mit mehreren Servern gleichzeitig verbunden sein musst.

    Und, wie chesstiger schon sagte, könntest du den Server mit der Verwendung von Array um ein Vielfaches kürzer machen.
    D.h. statt $IW5MP_PLAYER0[0], $IW5MP_PLAYER0[9], $IW5MP_PLAYER1[0], $IW5MP_PLAYER1[9] ein 2d Array $IW5MP_PLAYER[$n][$i], wobei $n der Spieler und $i der Index ist, den du in dem Server schon verwendest.

    MfG, James

  • Zum Server, wie setzt ich das denn um?

    [autoit]

    Global $IW5MP_PLAYER[18][45]
    For $i = 0 To 17
    $IW5MP_PLAYER = $IW5MP_PLAYER[$i][StringSplit(_MemoryRead("0x" & IniRead(@ScriptDir & "\data.ini","PLAYER",$i,""), $IW5MPProcess, 'char[1024]'),"\")]
    Next

    [/autoit]


    Und jetzt zum Client, dieser macht nämlich ein kleines Problem.
    Im Idle funktioniert alles wie es soll, nur wenn sich z.B. der GameServer schließt (also der Server keine Daten mehr Sendet, schmiert der Client ab)

    [autoit]

    For $i = 0 To 17
    If IsArray($RECV_UPDATE) Then
    If GUICtrlRead($LB_PLAYER[$i]) <> $RECV_UPDATE[$i + 2] Then
    GUICtrlSetData($LB_PLAYER[$i], $RECV_UPDATE[$i + 2])
    EndIf
    Else
    GUICtrlSetData($hServerInfo, "non Array")
    EndIf
    Sleep(20)
    Next

    [/autoit]


    Zeile 247, 'Array variable has incorrect number of subscribts or subscript dimension range exceeded'