Ankündigung

Einklappen
Keine Ankündigung bisher.

Hilfe bei Kampfsystem Php

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Hilfe bei Kampfsystem Php

    Hey Leute,

    ich richte mich mit einem Problem an euch wo wir zu 3 einfach nicht mehr weiter wissen.

    Ich bin der Admin von einem One Piece Browsergame und ich bräuchte Hilfe oder eine Idee wie wir das mit dem Kampfsystem lösen könnten.

    Folgendes Problem, das Kampfsystem wie folge aufgebaut.


    Spieler geht auf Fight -> fight.php

    sieht eine Oberfläche vor wo entweder Kämpfe offen sind oder einen erstellen kann.


    Nun das Problem

    Kampftype Kopfgeld soll nur im 1 Vs 1 gehen und es wird auch so abgefragt, die Berechnung der Datenbank beläuft sich auf 1ms

    Kämpfer öffnet Fight -> nun klicken 2 Leute gleichzeitig auf Kampf beitreten und nun ist es ein 1 Vs 2

    Wir finden keine Lösung dafür das diese 1 Vs 2 nicht mehr stattfinden.

    Vielleicht hat hier wer eine Idee?

  • #2
    ich bin fest davon überzeugt, dass der Post ohne abküzungen und etwas mehr strait to the point einfacher zu vetstehen ist.

    Kommentar


    • #3
      Zitat von Sload Beitrag anzeigen
      Kämpfer öffnet Fight -> nun klicken 2 Leute gleichzeitig auf Kampf beitreten und nun ist es ein 1 Vs 2
      D.h. ihr habt eine Race-Condition programmiert und müsst diese umschreiben - wie das genau geht lässt sich so völlig ohne Code nicht sagen. Evtl. reicht es aber schon wenn ihr der Datenbank sagt dass nur zwei Leute für einen Kampf eingetragen werden können. Sobald noch ein zweiter versucht sich für den Kampf einzutragen wird der Query von der Datenbank mit einer Fehlermeldung abgewiesen (den Fehler müsstest du natürlich abfangen und dem Benutzer einen entsprechend lesbare Fehlermeldung vorsetzen).

      Kommentar


      • #4
        Zitat von tk1234 Beitrag anzeigen
        D.h. ihr habt eine Race-Condition programmiert und müsst diese umschreiben - wie das genau geht lässt sich so völlig ohne Code nicht sagen. Evtl. reicht es aber schon wenn ihr der Datenbank sagt dass nur zwei Leute für einen Kampf eingetragen werden können. Sobald noch ein zweiter versucht sich für den Kampf einzutragen wird der Query von der Datenbank mit einer Fehlermeldung abgewiesen (den Fehler müsstest du natürlich abfangen und dem Benutzer einen entsprechend lesbare Fehlermeldung vorsetzen).
        In der Datenbank wird bereits überprüft ob es ein 1 Vs 1 ist, nur wenn beide auf die Sekunde genau auf beitreten klicken sind sie manchmal schneller als der Server schalten kann.

        PHP-Code:
          else if ($type == && $mode != '1vs1')
                    {
                        
        $message 'Ein Kopfgeldkampf kann nur in einem 1 vs 1 ausgetragen werden.';
                    }
                    else if(
        $type == && !$player->IsVerified())
                    {
                        
        $message "Um Spaßkämpfe öffnen zu können, musst du erst verifiziert werden!"
        Type 1 = Kopfgeld Kampf

        Aber wie schon beschrieben ist der klick auf Kampf beitreten manchmal so genau gleichzeitig das der Server gar nicht erkennt ob 1 oder 2 Personen geklickt haben.

        Wir haben schon über ein Fighter Pool nachgedacht mit Cronjob leider zerrt das ganz schön an der Server Perfomance wenn da man den Cronjob ja minimum jede Minute durchlaufen lassen müsste.

        Kommentar


        • #5
          ich habs immer noch nicht kapiert ---
          ne queue ?
          https://www.php.net/manual/de/class.ds-queue.php

          Kommentar


          • #6
            Zitat von Sload Beitrag anzeigen
            In der Datenbank wird bereits überprüft ob es ein 1 Vs 1 ist, nur wenn beide auf die Sekunde genau auf beitreten klicken sind sie manchmal schneller als der Server schalten kann
            Das was du da postest ist PHP-Code (ohnehin relativ wenig aussagekräftig), der sehr nach Race-Condition aussieht. Wie die entsprechende Datenbanktabelle aussieht, verrätst du aber nicht - und die braucht einen Index o.ä. der verhindert dass zwei Gegner eingetragen werden können. Alternativ brauchst du wohl ein Locking um das Problem zu beheben - als Stichwort zum selbst weitersuchen sollte das erstmal reichen.

            Kommentar


            • #7
              Lass die Abfrage über ein Ajax laufen. So hast Du immer eine Live-Abfrage und wenn ein Kampf gebucht wird, lässt Du automatisch einen neuen Kampf 1 vs.1 starten.
              Am besten den DB-Slot belegen, der für Spieler 2 ist und entsprechend zweite Anfrage blockieren, wenn Eintrag gerade von anderen Nutzer "bearbeitet" wird (durch das Starten). Du kannst Datensätze sperren oder freigegeben lassen, während jemand an diesem "arbeitet". Sperre den Datenbanksatz sobald der erste Zugriff erfolgt, der zweite kriegt dann die Fehlermeldung das die Bearbeitung fehlgeschlagen ist, weil bereits jemand den Datensatz bearbeitet.

              Kommentar

              Lädt...
              X