"Patcher" lädt bestimmte Formate nicht

  • Hallo,

    seit einiger Zeit bastel ich an einem eigenen Spiel. Da es eine Online-Funktion hat, kann es in
    der Anfangszeit immer wieder zu kleinen Updates kommen. Aus diesem Grund habe ich mir einen
    simplen Patcher gebastelt der die Dateien prüft und ggf. neue runterlädt / ersetzt.

    Nur irgendwie scheint der Patcher bestimmte Dateiformate nicht zu laden. Anstatt diese herunter
    zu laden, kommt nur der Hinweis das die Datei aktuell ist. Dabei handelt es sich um eine *.ini
    und um das Format *.rvdata.

    Sollte dem Patcher nicht eigentlich egal sein was er runterlädt? Die Dateien stehen in einer *.txt
    auf dem Server und der Patcher prüft eine Datei nach der Anderen und lädt diese herunter.

    //EDIT: Wenn ich eine der *.rvdata Files in z.B. *.png umbenenne, wird dieser heruntergeladen....
    Ich versteh es einfach nicht :(

    Einmal editiert, zuletzt von Pelix (4. November 2013 um 17:04)

  • Ja, das sollte dem Patcher eigentlich egal sein, der Fehler liegt wohl in deinem Code (oder deinem Server).
    Da wir dein Skript nicht kennen können wir dir bei deinem Problem aber nicht helfen.

  • Die Funktion mit dem Core Updater ganz unten einfach mal ignorieren. Das hat mit dem eigentlichen
    Problem nichts zutun. Ist nur die Funktion um den Patcher selbst zu updaten. :)

    Spoiler anzeigen
    [autoit]

    #Region ;**** Directives created by AutoIt3Wrapper_GUI ****
    #AutoIt3Wrapper_icon=E:\patcher.ico
    #AutoIt3Wrapper_UseUpx=n
    #AutoIt3Wrapper_Res_Language=1031
    #EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

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

    #include <ButtonConstants.au3>
    #include <GUIConstantsEx.au3>
    #include <ProgressConstants.au3>
    #include <StaticConstants.au3>
    #include <WindowsConstants.au3>
    #include <File.au3>
    #include <PatcherSettings.au3>
    #include <SendMessage.au3>
    #include <WINAPI.au3>

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

    Run("RunDll32.exe InetCpl.cpl,ClearMyTracksByProcess 8")

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

    Global Const $url = "pelix-media.de/game"
    Global Const $version = IniRead(@ScriptDir & "\patch.ini", "patch", "version", "Unknow")
    Global Const $ini_design = "1"

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

    Global Const $SC_DRAGMOVE = 0xF012

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

    If WinExists($win_title) Then Exit

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

    #region ### START Koda GUI section ### Form=
    $Form = GUICreate($win_title, 792, 697, 192, 124, $WS_POPUP, $WS_EX_LAYERED)
    GUISetBkColor(0x000000)

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

    _WinAPI_SetLayeredWindowAttributes($Form, 0x01, 255)

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

    $Background = GUICtrlCreatePic(@TempDir & "\Design1.bmp", 0, 0, 792, 697)
    _SetDesign($ini_design)
    GuiCtrlSetState(-1,$GUI_DISABLE)

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

    $Label1 = GUICtrlCreateLabel("Aktuelle Datei:", 65, 526, 73, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $Label2 = GUICtrlCreateLabel("Größe in KB:", 74, 550, 63, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $Label3 = GUICtrlCreateLabel("Noch zu laden:", 62, 574, 98, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $Label4 = GUICtrlCreateLabel("Geschwindigkeit:", 53, 598, 80, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $Label5 = GUICtrlCreateLabel("Client Version:", 67, 622, 71, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $Label6 = GUICtrlCreateLabel("Version 1.0", 60, 8, 690) ; Top = 385px
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    GUICtrlSetFont(-1, 7)

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

    $aktuelle_datei = GUICtrlCreateLabel("", 140, 526, 118, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $size = GUICtrlCreateLabel("", 140, 550, 118, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $load = GUICtrlCreateLabel("", 140, 574, 118, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $speed = GUICtrlCreateLabel("-", 140, 598, 118, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
    $client_version = GUICtrlCreateLabel($version, 140, 622, 118, 17)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

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

    $Progress = GUICtrlCreateProgress(290, 613, 460, 10)
    $Progress2 = GUICtrlCreateProgress(290, 626, 460, 18)
    $Update = GUICtrlCreateButton("Core Update", 468, 584, 89, 25, $WS_GROUP)

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

    $Start = GUICtrlCreateButton("Starten", 379, 584, 79, 25, $WS_GROUP)
    $Patch = GUICtrlCreateButton("Patchen", 290, 584, 79, 25, BitOR($BS_DEFPUSHBUTTON, $WS_GROUP))
    $Beenden = GUICtrlCreateButton("Beenden", 672, 584, 79, 25, $WS_GROUP)

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

    $news = GUICtrlCreateLabel("", 55, 263, 450, 235)
    GUICtrlSetColor(-1, 0xFFFFFF)
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

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

    #endregion ### END Koda GUI section ###

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

    If $CmdLine[0] > 0 Then
    If $CmdLine[1] = "-bypatcher" Then
    GUICtrlSetStyle($Start, $WS_VISIBLE)
    EndIf
    EndIf

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

    GUISetState(@SW_SHOW)
    While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
    Case $GUI_EVENT_CLOSE
    Exit
    Case $Patch
    _patch()
    Case $Start
    _start()
    Case $Beenden
    Exit
    Case $Update
    _update()
    Case $GUI_EVENT_PRIMARYDOWN
    _SendMessage($Form, $WM_SYSCOMMAND, $SC_DRAGMOVE, 0)

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

    EndSwitch
    WEnd

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

    Func _patch($iDelay1 = 50, $iDelay2 = 1000)
    $file = @ScriptDir & "\files.txt"
    FileDelete($file)
    InetGet("http://" & $url & "/files.txt", $file)
    $line = _FileCountLines($file)
    $line_max = _FileCountLines($file)
    If $line = 0 Then
    MsgBox(48, "Error", "Fehler beim übertragen der Patchlist!")
    Return ""
    EndIf

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

    InetGet("http://" & $url & "/news.txt", @ScriptDir & "\news.txt")
    $fOpen = FileOpen(@ScriptDir & "\news.txt")
    $fRead = FileRead($fOpen)
    GUICtrlSetData($news, $fRead)
    FileClose($fOpen)
    FileDelete(@ScriptDir & "\news.txt")

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

    $new_version = FileReadLine($file, $line)
    If $new_version <> $version Then
    IniWrite(@ScriptDir & "\patch.ini", "patch", "version", $new_version)
    EndIf

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

    $line = $line - 1

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

    DirCreate("Audio")
    DirCreate("Audio/BGM")
    DirCreate("Audio/BGS")
    DirCreate("Audio/ME")
    DirCreate("Audio/SE")
    DirCreate("Data")
    DirCreate("Fonts")
    DirCreate("Graphics")
    DirCreate("Graphics/Animations")
    DirCreate("Graphics/Battlers")
    DirCreate("Graphics/Characters")
    DirCreate("Graphics/Equipments")
    DirCreate("Graphics/Equipments/Female")
    DirCreate("Graphics/Equipments/Male")
    DirCreate("Graphics/Faces")
    DirCreate("Graphics/Parallaxes")
    DirCreate("Graphics/Pictures")
    DirCreate("Graphics/System")

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

    ;$old = 0
    $step = Ceiling(100/$line)

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

    While $line >= 1
    $datei = FileReadLine($file, $line)
    GUICtrlSetData($aktuelle_datei, $datei)
    $size_inet = InetGetSize("http://" & $url & "/" & $datei)
    $size_local = FileGetSize(@ScriptDir & $datei)
    GUICtrlSetData($size, Round($size_inet / 1024) & " KB")
    If $size_inet <> $size_local Then
    InetGet("http://" & $url & $datei, @ScriptDir & $datei, 1, 1)
    While 1
    $size_download = FileGetSize(@ScriptDir & $datei)
    ;$old = $size_download
    GUICtrlSetData($load, Round((($size_inet - $size_download) / 1024)) & " KB")
    ;GUICtrlSetData($speed, Round((($size_download - $size_inet) / 1024) / 1024) & " kb/s")
    ;~ $iPercent = Round($size_download / $size_inet * 100)
    $iPercent = (100 - $size_download / $size_inet * 100)
    GUICtrlSetData($Progress, $iPercent)
    Sleep($iDelay1)
    If $size_inet = $size_download Then
    ExitLoop
    EndIf

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

    WEnd
    Sleep($iDelay2)
    Else
    $datei = FileReadLine($file, $line)
    GUICtrlSetData($aktuelle_datei, $datei)
    GUICtrlSetData($size, "Aktuell")
    EndIf
    $line = $line - 1
    If $line = 0 Then
    GUICtrlSetData($aktuelle_datei, "")
    GUICtrlSetData($size, "")
    GUICtrlSetData($load, "")
    GUICtrlSetData($speed, "-")
    GUICtrlSetData($client_version, $new_version)
    GUICtrlSetStyle($Patch, $WS_DISABLED)
    GUICtrlSetStyle($Update, $WS_VISIBLE)
    GUICtrlSetStyle($Start, $WS_VISIBLE)
    EndIf

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

    ;~ GUICtrlSetData($Progress2, GUICtrlRead($Progress2) + $step)
    GUICtrlSetData($Progress2, 100 - $line / $line_max * 100)

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

    Sleep($iDelay1)
    WEnd
    FileDelete($file)
    EndFunc ;==>_patch

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

    Func _start()
    If FileExists(@ScriptDir & "\Game.exe") Then
    Run(@ScriptDir & "\Game.exe")
    ElseIf FileExists(@ScriptDir & "\Game.exe") Then
    Run(@ScriptDir & "\Game.exe")
    Else
    MsgBox(48, "Fehler", "Die Datei 'Game.exe' konnte nicht gefunden werden." & _
    @CRLF & "Prüfen Sie ob die Datei im selben Verzeichnis liegt.")
    EndIf

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

    EndFunc ;==>_start

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

    Func _update()
    $Msg = MsgBox(4, "Core Update", "Durch das Update wird die Anwendung neu gestartet." & _
    @CRLF & "Fortfahren?")
    If $Msg = 6 Then
    If FileExists(@ScriptDir & "\update.exe") Then
    Run(@ScriptDir & "\update.exe")
    Exit
    Else
    MsgBox(48, "Fehler", "Das Update konnte nicht durchgeführt werden." & _
    @CRLF & "Bitte wähle zuerst 'Patchen' im Menü!")
    EndIf
    EndIf
    EndFunc ;==>_update

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

    Func _SetDesign($ID)
    Switch $ID
    Case 1
    GUICtrlSetImage($Background, @TempDir & "\Design1.bmp")
    IniWrite(@ScriptDir & "\patch.ini", "design", "design", "1")

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

    Case Default
    GUICtrlSetImage($Background, @TempDir & "\Design1.bmp")
    EndSwitch
    EndFunc

    [/autoit]
  • Bitte ordentlich formatieren und in einen Spoiler packen.


    Erledigt. :)

    //EDIT: Hab vorerst eine alternative Lösung via FileMove gefunden. Funktioniert auch, ist wohl nur nicht die ideale Lösung :D

    Einmal editiert, zuletzt von Pelix (4. November 2013 um 17:36)

  • Hi,
    was sagen denn eigentlich die Errorcodes der Funktionen, welche angeblich nicht funktionieren?
    Da mal wieder 260 Zeilen gepostet wurden ohne eine einzige Zeile Debugging-Info, gehe ich davon aus, dass du uns diesen mühseligen Part überlässt, DEINE Arbeit zu machen....
    Da ich, und reihenweise andere User auch, absolut keine Lust haben, Debug-Zeilen in deinen Code einzufügen und zu analysieren, wirst du das wohl selbst machen müssen!

  • Es kommt keine Fehlermeldung .... er ignoriert die Datei einfach.
    Scheint irgendwie tatsächlich an dem Format zu liegen denn wie schon oben beschrieben, wenn ich die
    Datei in eine *.txt benenne, funktioniert es.

    Alternative Lösung bis jetzt: FileMove("Settings.txt","Settings.rvdata",1)

  • Hast du irgendwelche Stringfunktionen benutzt die das Dateiende auf ein Minimum begrenzen? Versuchs mal mit einer langen Dateiendung, wie schauts dann aus?


    Daran wird es nicht liegen. Das Format *.txt nimmt er, *.ini aber nicht .... also *.ini und *.rvdata wollen nicht.

  • Schonmal daran gedacht, das es nicht am Skript sondern vlt. am Server liegt? ;)

    Edit: Bevor gefragt wird ... es gibt diverse Direktiven, mit denen man Request auf bestimmte Dateiendungen abweisen kann. Als kleines Sicherheitsfeature bietet sich so etwas an, wenn man explizit den Zugriff auf .ini Dateien verbieten möchte. Man möchte ja nicht immer, das jeder in x-beliebige Konfigurationsdateien schauen kann ;).

    Solche DIrektiven lassen sich auch negieren. Das hat den Vorteil, das man explizit nur die Dateierweiterungen zulassen muss, die man auch wirklich nutzt und alle unbekannten (unerwünschten) damit natürlich automatisch gesperrt sind.

    Ist dein Server also so konfiguriert, das Zugriffe zum Beispiel nur auf .txt, .htm, .html, .jpeg, .bmp, .png als bekannte Dateitypen zugelassen sind, fallen alle anderen weg. Unter anderem auch .ini und .rvdata.

    Google -> ".htaccess FilesMatch"

  • Darüber hatte ich auch schon nachgedacht.

    Das komische ist nur, die patch.ini kann er runterladen und verwenden.
    Jedoch die *.ini die in der files.txt steht nicht. :/

    Der Server ist mein eigener, also kein Webspace. Hab da vollen Zugriff
    drauf und nicht einmal eine .htaccess irgendwo definiert die irgendwas
    verbieten könnte.

  • Hi,
    ich würde jedenfalls im Script die Parameter so einstellen, dass die Daten nicht aus dem Cache, sondern direkt vom Ziel gelesen werden. Zzt. liest das Script die Daten aus dem Cache und nicht von der Zieladresse!
    Dateien, die nicht im Cache stehen, werden so jedenfalls nicht gelesen.
    Das ist bei FTP übrigens genauso!