TCP Send Problem

  • hi,
    Ich bin gerade dabei einen multiplayer für das spiel Oblivion zu schreiben. ingame klapt auch alles nur bei der daten übertragung hängts grade :(
    zum test wollte ich die spieler position aus einer ini auslesen und senden nur leider kommen von 6 gesendeten koordinaten nur eine an... und zwar PosX (siehe script)

    Client

    Spoiler anzeigen
    [autoit]

    TCPStartup()

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

    $SO = TCPConnect("192.168.2.103", 65432)
    If $SO = -1 Then
    MsgBox(0,"Error","Verbinden fehlgeschlagen")
    Exit
    Else
    While 1
    $PosX = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosX","NONE")
    $PosY = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosY","NONE")
    $PosZ = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosZ","NONE")
    $RotaX = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaX","NONE")
    $RotaY = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaY","NONE")
    $RotaZ = IniRead("C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaZ","NONE")
    TCPSend($SO,"PosX||" & $PosX)
    TCPSend($SO,"PosY||" & $PosY)
    TCPSend($SO,"PosZ||" & $PosZ)
    TCPSend($SO,"RotaX||" & $RotaX)
    TCPSend($SO,"RotaY||" & $RotaY)
    TCPSend($SO,"RotaZ||" & $RotaZ)
    WEnd
    EndIf

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

    TCPShutdown()

    [/autoit]

    Server

    Spoiler anzeigen
    [autoit]

    #include <GUIConstantsEx.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #Region ### START Koda GUI section ### Form=
    $Form1 = GUICreate("Show Pos", 397, 187)
    $Group1 = GUICtrlCreateGroup("Pos", 8, 8, 185, 169)
    $Label1 = GUICtrlCreateLabel("Pos X", 32, 40, 32, 17)
    $Label2 = GUICtrlCreateLabel("Pos Y", 32, 80, 32, 17)
    $Label3 = GUICtrlCreateLabel("Pos Z", 32, 120, 32, 17)
    $Label7 = GUICtrlCreateLabel("Label7", 82, 40, 98, 17)
    $Label8 = GUICtrlCreateLabel("Label8", 82, 80, 98, 17)
    $Label9 = GUICtrlCreateLabel("Label9", 82, 120, 98, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    $Group2 = GUICtrlCreateGroup("Rota", 200, 8, 185, 169)
    $Label4 = GUICtrlCreateLabel("Rota X", 224, 40, 37, 17)
    $Label5 = GUICtrlCreateLabel("Rota Y", 224, 80, 37, 17)
    $Label6 = GUICtrlCreateLabel("Rota Z", 224, 120, 37, 17)
    $Label10 = GUICtrlCreateLabel("Label10", 270, 40, 98, 17)
    $Label11 = GUICtrlCreateLabel("Label11", 270, 80, 98, 17)
    $Label12 = GUICtrlCreateLabel("Label12", 270, 120, 98, 17)
    GUICtrlCreateGroup("", -99, -99, 1, 1)
    GUISetState(@SW_SHOW)
    #EndRegion ### END Koda GUI section ###

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

    TCPStartup()
    $ip = "192.168.2.103" ;Server IP (seine eigene)
    $port = 65432
    $socket = TCPListen($ip,$port)

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

    $PosX = "NONE"
    $PosY = "NONE"
    $PosZ = "NONE"
    $RotaX = "NONE"
    $RotaY = "NONE"
    $RotaZ = "NONE"

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

    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    TCPShutdown()
    Exit

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

    EndSwitch
    $con = TCPAccept($socket)
    If $con >= 0 Then
    $rec = ""
    $rec &= TCPRecv($con,256)
    $APos = StringSplit($rec,"||",0)
    If Not @error Then
    If $APos[1] = "PosX" Then
    $PosX = $APos[3]
    ElseIf $APos[1] = "PosY" Then
    $PosY = $APos[3]
    ElseIf $APos[1] = "PosZ" Then
    $PosZ = $APos[3]
    ElseIf $APos[1] = "RotaX" Then
    $RotaX = $APos[3]
    ElseIf $APos[1] = "RotaY" Then
    $RotaY = $APos[3]
    ElseIf $APos[1] = "RotaZ" Then
    $RotaZ = $APos[3]
    EndIf
    EndIf
    EndIf
    GUICtrlSetData($Label7,$PosX)
    GUICtrlSetData($Label8,$PosY)
    GUICtrlSetData($Label9,$PosZ)
    GUICtrlSetData($Label10,$RotaX)
    GUICtrlSetData($Label11,$RotaY)
    GUICtrlSetData($Label12,$RotaZ)
    WEnd
    TCPShutdown()

    [/autoit]

    ini

    Spoiler anzeigen
    Code
    [Position]
    PosX=27194.9701320802
    PosY=70635.6574972543
    PosZ=3583.90041321406
    RotaX=2.93927186413386
    RotaY=0
    RotaZ=241.170299230355

    auserdem sendet es die PosX auch nur ein mal :S
    help plz

    2 Mal editiert, zuletzt von M☻x (13. Mai 2010 um 20:38)

  • Super Idee!
    Ich liebe das Spiel. Es gab mal nen Multiplayer, aber den findet man nirgens mehr...

    Könnte es sein, dass du die Variable immer löschst, und dann an den leeren String was dranhängst? Ich versteh den Sinn nicht...

    [autoit]

    $rec = ""
    $rec &= TCPRecv($con,256)

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit]
    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • so hab ich das aus einem tcp beispiel genommen den sin verrsteh ich auch nicht ganz aber bis jetzt gings damit eigentlich
    Edit hab es ma geändert kommt aber trotzdem nur PosX an

  • ok ich bin jetzt schon mal einen schritt weiter
    das problem war das

    [autoit]

    TCPSend($socket,"XXX")
    TCPSend($socket,"YYY")

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

    ;ergeben am server

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

    $rec = TCPRecv($con,256)
    $rec = "XXXYYY"

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

    ;also nur 1 string

    [/autoit]

    jetzt hab ich den client folgendermassen umgeschrieben
    EDIT: noch mal vereinfacht ;)

    Spoiler anzeigen
    [autoit]

    TCPStartup()
    While 1
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosX")
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosY")
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","PosZ")
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaX")
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaY")
    _TCP_IniSend("192.168.2.103",65432,"C:\Users\Geithe\Documents\My Games\Oblivion\Pluggy\User Files\PlayerPos.ini","Position","RotaZ")
    WEnd
    TCPShutdown()

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

    Func _TCP_IniSend($ip,$port,$inipath,$section,$key)
    $SO = TCPConnect($ip,$port)
    If $SO = -1 Then Exit
    $X = IniRead($inipath,$section,$key,"NONE")
    TCPSend($SO,$key & "||" & $X)
    TCPCloseSocket($SO)
    EndFunc

    [/autoit]


    so sendet er zumindest wie gewünscht ( als einzelstrings )
    nur leider verändern sich die ausgegeben werte auf dem server nicht wenn ich sie in der clientsite ini ändere
    woran könnte das liegen ?

    2 Mal editiert, zuletzt von M☻x (13. Mai 2010 um 20:03)

  • Du willst einen Multiplayer für ein Spiel programmieren like SAMP für GTA San Andreas?

    Da brauchst du aber ein DirectX Hook und noch mehr.

  • für oblivion ist das relativ leicht da ein komplexes construction set mitgeliefert wird ;)
    wie gesagt ingame klappt schon alles ich muss nur noch die aktuellen daten rüber bringen

    Edit: könnte es sein das ich TCPTimeout verändern muss ?

  • ok , ich hab den fehler gefunden es hatter überhaupt nichts mit dem script zu tun :rofl:

  • ganz dum von mir
    ich hab einen mod für das spiel geschrieben der die spielerposition in eine ini schreibt
    aber vergessen den mod anzuschalten :pinch: