Problem mit Multiplayer-Shooter: Manchmal wird ein Spieler nicht von einem Clienten entfernt, wenn er das Spiel verlässt



  • Hi!

    Es gibt da ein Problem mit einem Multiplayer-Egoshooter. Manche Spieler klagen darüber, dass Spieler in deren Liste (Also nur clientseitig) nicht mehr verschwinden. Sie werden angezeigt, als wären sie tot, aber serverseitig haben sie das Spiel längst verlassen (Das Problem ist dann, dass man durch diese "toten" Spieler nicht hindurchgehen kann und sie somit enge Passagen blockieren könnten).

    Nun, da wollte ich der Sache auf den Grund gehen. Das Spiel arbeitet mit DirectPlay und ich habe die entsprechende interne Nachricht gefunden, welche einen Spieler aus der clientseitigen Liste eines Spieler entfernt. Diese Nachricht wird bei einem Verlassen logischerweise an alle Clienten gesandt, und zwar mit DPNSEND_GUARANTEED.
    Somit verstehe ich nicht, warum das bei manchen Spielern nicht funktioniert. Die Nachricht wird also 100% empfangen. Dass der Server einen Fehler macht und Spieler auslässt, möchte ich vorerst ausschließen (Immerhin ein einfacher spread...).

    Habt ihr eine Idee, was das sein könnte? Meine Theorie ist, dass das dann passiert, wenn ein Client das Spiel gerade minimiert hat. Dafür spricht auch einiges (Befragungen...).
    Könnte das so sein? Macht Windows dann vielleicht irgendetwas anders?

    (Habe einen Test gemacht. Als ich so eine Verlassen-Nachricht manuell an einen Spieler gesendet habe, bei dem so ein "toter" Spieler war, hat dieser das Spiel verlassen. Es würde also funktionieren... würde doch diese Nachricht auch verarbeitet werden...)

    Danke für jede Antwort!
    MFG



  • Suppe schrieb:

    Die Nachricht wird also 100% empfangen.

    Bei einem Netzwerk wird nichts mit 100% Wahrscheinlichkeit empfangen. Du solltest die Kommunikation ändern. Statt zu senden, dass ein Spieler das Spiel verlassen hast, sendest du eine Liste von allen Spielern, die noch im Spiel sind. Sollte ein Client diese Nachricht verpassen, so wird er alle Spieler aktualisieren, sobald eine ähnliche Nachricht nochmal gesendet wird.

    Weiterhin könntest du einbauen, dass ein Client diese Liste abfragt, wenn er eine längere Zeit, sagen wir eine Minute, keine Befehle mehr von einem Bestimmten Spieler empfangen hat.



  • Achso ne sorry, ist nicht mein Spiel.

    DPNSEND_GUARANTEED ist doch bestimmt wie TCP, also kommt es 100% an, sonst würde es ja nicht so heißen... wenn man sich darauf nicht verlassen könnte, wäre das fatal.

    Ich bin mir also weiterhin sicher, dass es mit dem Minimieren zusammenhängt.

    MfG



  • Suppe schrieb:

    DPNSEND_GUARANTEED ist doch bestimmt wie TCP, also kommt es 100% an, sonst würde es ja nicht so heißen... wenn man sich darauf nicht verlassen könnte, wäre das fatal.

    Aber so ist es nun mal. Auf TCP kannst du dich auch nicht zu 100% verlassen. Das Paket wird nicht ankommen, wenn du das Netzwerkkabel durchschneidest.

    Suppe schrieb:

    Ich bin mir also weiterhin sicher, dass es mit dem Minimieren zusammenhängt

    Was macht denn das Programm, wenn es minimiert wird? Ignoriert es dann sämtlichen Netzwerkverkehr? Die Sache ist, dass man nach der Beschreibung nicht sagen kann, was schief geht.

    DPNSEND_GUARANTEED kommt übrigens nicht garantiert an. Du kannst nur einen Timeout angeben, der sagt, wie lange der Client mit der Empfangsbestätigung warten darf, bevor der Server das Paket erneut sendet.



  • Okok aber ich kann von einem Normalfall ausgehen.

    Also bei DPNSEND_GUARANTEED kann ich davon ausgehen, dass der Empfänger die Nachricht auch bekommt. Wiegesagt zumindest in meinem Fall.

    Wenn minimiert wird, werden normalerweise trotzdem Spieler entfernt, wenn sie den Server verlassen. Aber manchmal klappt es anscheinend doch nicht...

    MfG



  • Suppe schrieb:

    Wenn minimiert wird, werden normalerweise trotzdem Spieler entfernt, wenn sie den Server verlassen. Aber manchmal klappt es anscheinend doch nicht...

    Dann ist in dem Spiel wohl ein Bug. Aber ohne weitere Informationen, kann ich dir zumindest nicht weiter helfen. Schnappt euch einen Debugger und schaut, ob die Nachricht wirklich ankommt. Oder ob es an etwas anderem im Spiel liegt, weswegen die Nachricht nicht verarbeitet wird.

    Vielleicht ist auch nur das Timeout-Intervall zu groß bzw. zu klein.


Anmelden zum Antworten