Http_get bei GameEnd?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Http_get bei GameEnd?

    Hi
    ich hab ein "System" mit php geschrieben. Ich wollte mich jetzt sozusagen abmelden, wenn der Spieler das Spiel beendet. Wenn ich jetzt aber http_get ausführe, macht der das nicht. Ich schätze mal, dass ist so, weil das ja Asynchronous ist. Kann ich das dennoch irgendwie benutzen. Ich brauche übrigens nicht die Daten zurück. Ich muss nur der Seite klar machen, dass ich jetzt weg bin und das mit einem Seitenaufruf funktioniert.
    Leider gibt es ja nicht ein http_get ohne Asynchronous...
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ich bin kein Netzwerk Experte etc... was ich aber schwer denke, das das game end event nur triggert solang das spiel noch "läuft".

    Was heissen mag: Das Spiel wird beendet, egal was dort noch drin steht.
    Das System wartet nicht bis "alle" Codes im Game End event abgearbeitet sind.

    Müsstest das Spiel beenden iwie abfangen, alle dateien / Netzwerkedingens abarbeiten und erst dann das spiel wirklich beenden lassen.

    Wird das spiel unerwartet unterbrochen, muss dein server den Spieler nach 2-3 min automatisch abmelden, falls vom Spieler keine Antwort bekommt.

    Kann mich aber auch irren und mich gerne berichtigen lassen :)
  • Hast du es mal außerhalb vom GM getestet, ob es da funktioniert? Kann ja sein, dass der Fehler in deinem PHP Skript liegt.
    Davon abgesehen, solltest du für alles, was den Status des Servers verändert, Post Requests verwenden.


    Atomicmaster schrieb:

    Das System wartet nicht bis "alle" Codes im Game End event abgearbeitet sind.
    Doch, das macht es.
    Ausnahme ist natürlich, wenn ein neuer Thread erzeugt wird. In dem Fall würde der GM die Ausführung fortsetzen und den Thread, wenn er noch nicht beendet ist, wahrscheinlich einfach killen. Dazu müsste er aber erstmal Threads (ohne dll) unterstützen.
  • -$Marvin$- schrieb:

    Atomicmaster schrieb:
    Das System wartet nicht bis "alle" Codes im Game End event abgearbeitet sind.

    Doch, das macht es.
    Ausnahme ist natürlich, wenn ein neuer Thread erzeugt wird. In dem Fall würde der GM die Ausführung fortsetzen und den Thread, wenn er noch nicht beendet ist, wahrscheinlich einfach killen. Dazu müsste er aber erstmal Threads (ohne dll) unterstützen.


    Gut zu wissen... dann zieh ich meine Aussage mal zurück :) Ich ging nur davon aus, da ich glaube ich bei meinem aktuellen Spiel einfach einen Sound abspielen lassen wollte beim beenden des Spieles. Und das ist einfach nie geschehen. Der Sound kam nicht.
    Deswegen war ich der Meinung, mein Spiel wird "zu schnell" beendet und der Code einfach nich mehr ausgeführt. Aber danke fürs Aufklären :)
  • Ansonsten funktioniert alles. Also ausserhalb vom Game End. Selten funktioniert es auch...
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ausnahme ist natürlich, wenn ein neuer Thread erzeugt wird. In dem Fall würde der GM die Ausführung fortsetzen und den Thread, wenn er noch nicht beendet ist, wahrscheinlich einfach killen. Dazu müsste er aber erstmal Threads (ohne dll) unterstützen.

    Was natürlich sein kann ist, dass der GM für die asynchronen Events eigene Threads erstellt (wie sonst könnten die asynchron neben dem Spiel laufen? > Dafür sind Threads ja da.) Und da könnte genau das zutreffen was du bereits gesagt hast. Nämlich dass das Spiel beendet und der Thread (in dem nun der Code sitzt) einfach gestoppt wird wodurch dieser keine Zeit hat noch irgendetwas nennenswertes fertigzubringen.

    Was ich deshalb machen würde ist das Game-end-event nicht direkt aufzurufen sondern abwarten bis das asynchrone event das ausloggen (sei es erfolgreich oder nicht erfolgreich) abgeschlossen hat. (und erst dann würde ich das Spiel beenden.)
  • Ich wollte aber diese Phase des ausloggens dann machen, wenn der Spieler z.B. auf das x klickt...
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ich weis dass das bei gm8 noch da war. Hätte ich auch gerne benutzt. Bei Studio hab ich dies aber nicht gefunden...
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Ich wollte aber diese Phase des ausloggens dann machen, wenn der Spieler z.B. auf das x klickt...

    Für sowas wirst du wohl eine art timeout einbauen müssen. (So wie viele andere spiele mit onlinefunktionalität).
    Kein programmierer kann gewährleisten dass ein Spieler sich ordentlich ausloggt, sondern stattdessen einfach den "X"-Knopf drückt oder gar Alt+F4 betätigt.
  • Also die Funktionsweise ist da auch, dass im Webspace nur eine Ip abgespeichert wird, falls man der Server ist. Jetzt soll die wieder gelöscht werden, falls dieser auf x drückt. Wenn das nicht passiert, braucht ein neuer Client etwas, bis er merkt, dass er doch Server wird...
    Ist alles noch testweise und funktioniert, nur das halt beim ersten start des Spiels das immer sehr lange lädt.
    @LEWA
    Ich glaub ich bau auch ein Timeout ein.

    jetzt wirds Offtopic:
    Es gibt doch keine Timeout bzw. Ping Funktion beim Networking?
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Naja. Ein Session Timeout könnte dir da doch helfen. Oder du pingst jede Minute dem Server um zu zeigen, dass du noch online bist. Falls nichts von dieser IP Adresse (Benutzer) kommt, kannst dir sicher sein, dass das Spiel A) Kein Internet mehr hat, oder B) nicht mehr läuft.
    Je mehr Käse, desto mehr Löcher.
    Je mehr Löcher, desto weniger Käse.
    Ergo: Je mehr Käse, desto weniger Käse.
  • Das hab ich mir halt auch gedacht. Wäre cool Wenn Gm da eins ohne Async rausbringt...
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • husi012 schrieb:

    Das hab ich mir halt auch gedacht. Wäre cool Wenn Gm da eins ohne Async rausbringt...

    Wie gesagt, so einfach ist die sache nunmal nicht. Ein programmabbruch kann jederzeit ohne vorwarnung erfolgen. (Sei der auslöser der User selbst oder etwas anderes.)
    Was z.B: machst du wenn beim Spieler der Rechner aufgrund eines Stromausfalls abstürzt oder Windows crasht?
    Bei solch einem Szenario kann man nicht einfach so noch schnell einen HTTP request an den server schicken um den Spieler korrekt auszuloggen. Deshalb wird bei so ziemlich allen netzwerkbasierten Applikationen auf irgendeine art und weise geprüft ob die Verbindung zum Spieler existiert. Falls die verbindung unterbrochen wurde (bevor sich der Spieler ausgeloggt hat) wird einfach seine Session gekillt und es werden evtl. weitere Maßnahmen ergriffen die diesen Fall behandeln.

    Bei PHP ist nun das Problem dass du bei einem "einfachen" Webserver nur Code ausführst, wenn du einen Request zum server sendest. Bei einem Java basiertem Server kannst du anhand einer TCP connection (oder gar anhand eigener UDP "i'm still living" packeten) prüfen ob der Spieler noch am anderen Ende der Leitung vorhanden ist oder nicht. Falls nicht, kannst du ganz einfach gegenmaßnahmen ergreifen (connection killen, sonstigen code ausführen der z.B: den Spieler korrekt ausloggt, etc...) Bei PHP ist das etwas eingeschränkter da dieser (im gegensatz zu einem Java Server) nicht permanent ein Programm in einem Thread ausführt was diese Art von programmverhalten nur schwer ermöglicht. Nun, es ist vielleicht schwer, aber nicht unmöglich:

    Ich bin da leider kein experte auf diesem gebiet, aber soweit ich gelesen habe kann man PHP scripts auf einem Server anhand von "Cron Jobs" in gewissen Zeitabständen automatisch ausführen lassen. (Programmiere zwar in PHP, hab CronJobs aber noch nie verwendet.)
    Sprich: du könntest jede 10 sekunden einen skript starten der z.B: von jedem Spieler die ankunft des letzten Packetes prüft. Wenn der Zeitstempel des Packetes einen gewissen Zeitraum überschreitet (wie z.B: 20 sekunden) könntest du diese information als Time-out interpretieren und den Spieler schon auf PHP seite korrekt ausloggen. (Falls er sich davor noch nicht ausgeloggt hat.)
    Das Problem an der sache ist dass viele (wenn nicht sogar alle) gratis-webhoster die PHP server anbieten diese Art von PHP programmierung nicht zulassen (was verständlich ist.)
    Du wirst da also gegebenenfalls einen kostenpflichtigen (oder gar eigenen) server hosten müssen wenn du das auf diese Art und Weise realisieren möchtest.
  • Ich habs jetzt sogar doch geschafft.
    Ich hab im GameEnd eine Variable auf false gesetzt. Dann http_get aufgerufen und dann eine While-Schleife die solange im Leerlauf läuft, bis diese Variable vom HttpEvent auf true gemacht wird.
    Daraus kann man folgern, dass in der While-Schleife auch sowas zwischendurch geprüft wird!
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe