Multiaccount-System funktioniert nicht.

Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hey,


    ich habe mithilfe von einer Person ein Multiaccount-Erkennungssystem geschrieben, dennoch klappt dies nicht wie gewünscht :



    Das sind dennoch 2 völlig unterschiedliche Spieler mit verschiedenen IPs.
    Das System erfasst aus irgendeinem Grund alle Spieler die in der Datenbank existieren....


    Aber es soll nur Leute erfassen die mit der gleicher IP registriert sind ( wurden ).


    Hier der Code bei OnPlayerConnect :


    Manueller Befehl dafür :




  • Wenn du mal 10000 registrierte User hast, dann schmiert dir bei diesem Code der Server ab, ob steht für einige Zeit, da du dann beim Connect des Users mindestens 30000 Queries absendest. Selbst wenn jedes Query nur 10ms braucht um zu antworten (was sehr gut wäre), würde der Server 300 Sekunden lang stehen (5 Minuten).
    Danach fliegen wahrscheinlich alle User vom Server wegen Timeout oder ähnlichem.


    Selbst bei 300 registrierten Usern wären es schon mindestens 10 Sekunden Stillstand.



    Du kannst das ganze mit einem einzigen Query abfragen, anstatt jeden Spieler in der Datenbank zu prüfen.

    SQL
    SELECT id, name FROM spieler WHERE last_ip = '%s' AND name != '%s' ORDER BY id DESC;


    So bekommst du alle Konten mit der gleichen IP zurück, das neuste als erstes.

  • Also der Code lautet jetzt so :




    Bekomme 4 Errors :




  • Natürlich sollst du das Query nicht einfach nur in den Code einfügen, das macht ja keinen Sinn.


    format(query, sizeof(query), "SELECT id, name FROM spieler WHERE last_ip = '%s' AND name != '%s' ORDER BY id DESC;", GetName(playerid), GetIP(playerid));
    mysql_query(query);
    mysql_store_result();
    new rows = mysql_num_rows();
    //...Result hier auslesen.


    Beispiel hier:
    http://wiki.sa-mp.com/wiki/MySQL#mysql_retrieve_row


    Das solltest du aber auch bereits in deinem Code an anderen Stellen so oder ähnlich haben, du lässt ja die Stats auch laden.

  • Habe wirklich 0 Plan von MYSQL wie man das macht, tut mir Leid.


    Kenne mich damit kein bisschen, hatte den Code auch nicht selber geschrieben, sondern schreiben lassen, habe das jetzt so :


    Errors :


  • Dann solltest du es dringendst lernen.
    Es bringt ja nichts, wenn dir dein Server von jemand anderem geschrieben wird.


    Der Code sollte so aussehen:
    new huan[145];
    for(new i=0, j = GetPlayerPoolSize(); i <= j; i++)
    {
    if(!IsPlayerConnected(i))continue;
    if(IsPlayerNPC(i))continue;
    if(strcmp(GetIP(playerid), GetIP(i), true))continue; // Wenn ip_address noch nicht auf dem Server gefunden wurde!
    //ip_address stimmt mit bereits verbundener IP überein
    format(huan,sizeof(huan),"[MULTIACCOUNT] %s(%d) (IP: %s) wurde vom System erkannt! Multiaccount mit der ID %d (Name: %s, IP: %s)", PlayerName(playerid), playerid, GetIP(playerid), i, PlayerName(i), GetIP(i));
    SendClientMessageToAdmins(huan, GELB);
    print(huan);
    }
    //Check für offline accounts
    format(query, sizeof(query), "SELECT id, name FROM spieler WHERE last_ip = '%s' AND name != '%s' ORDER BY id DESC;", PlayerName(playerid), GetIP(playerid));
    mysql_query(query);
    mysql_store_result();
    new rows = mysql_num_rows(), id, name[MAX_PLAYER_NAME];
    for(new i=0; i<rows; i++)
    {
    mysql_retrieve_row();
    mysql_fetch_field_row(huan,"id"); id = strval(huan);
    mysql_fetch_field_row(name,"name");
    format(huan,sizeof(huan),"[MULTIACCOUNT] Der Spieler %s betreibt Multiaccounting! IP: %s (Übereinstimmung mit %s)", PlayerName(playerid), GetIP(playerid), name);
    SendClientMessageToAdmins(huan, GELB);
    print(huan);
    }
    mysql_free_result();

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • 3374 : Zeile 14


    3375 : Zeile 15


    3371 : Zeile 21


    3373 : Zeile 13

  • new query;
    zu:
    new query[256];


    format(huan,sizeof(huan),"[MULTIACCOUNT] Der Spieler %s betreibt Multiaccounting! IP: %s (Übereinstimmung mit %s)", PlayerName(playerid), GetIP(playerid), name);
    zu:
    format(huan,sizeof(huan),"[MULTIACCOUNT] Der Spieler %s betreibt Multiaccounting! IP: %s (Übereinstimmung mit %s (ID: %d))", PlayerName(playerid), GetIP(playerid), name, id);

  • Alles Klar danke dir,


    hat geklappt, ich versuche es mal wenn ich die Zeit dafür finde bzw. ein Tester online ist.


    //
    Habe es mit mir selber getestet und es printen lassen.


    Hatte 2 Accounts und dann wurde geprintet :


    [15:16:37] [MULTIACCOUNT] Der Spieler lolz betreibt Multiaccounting! IP:************** (Übereinstimmung mit Pagno)


    Aber wenn ich /macheck (manueller Befehl) verwendet habe kam "Keine Multiaccounts vorhanden".


    Hier der Befehl :


    Stimmen die IDs? @Jeffry

    2 Mal editiert, zuletzt von Pagno ()

  • Es kommt immeronch keine Multiaccounts vorhanden.


    //


    Ich habe bemerkt dass nicht alle User in der Datenbank eine IP zugewiesen bekommen haben in der Spalte last_ip.


    Code
    mysql_SetString("spieler", "last_ip", GetIP(playerid), "name", PlayerName(playerid));

    Benutze ich wenn ich den Account erstelle (Stock).



    Also mein ganzer Befehl sieht so aus :



  • Benutze ich wenn ich den Account erstelle (Stock).

    Das sollte eigentlich immer benutzt werden, quasi sobald der Spieler auf den Server connected.


    Ich find deinen Code auch super Merkwürdig,
    du schleißt aus deinem "Online Check" den Spieler den du suchst bereits aus



    for(new i=0, j = GetPlayerPoolSize(); i <= j; i++)
    {
    if(i==pid)continue; // sich selbst ausblenden <-- hier sollte vermutlich playerid stehen und nicht pid
    // pid ist die ID die du suchst

    Du hast hier aber ein problem, das System würde immer anschlagen, schließlich befindet sich der Spieler ja auf dem Server.


    Es besteht natürlich das Problem, dass es 2 Spieler im gleichen Haushalt geben könnte, nur wäre das irgendwie kein (wirklicher) Multiaccount.
    Es handelt sich da ja um 2 Leute.


    mMn solltest du den Online Check einfach streichen, denn der "offline" Check reicht völlig aus.
    Die IPs(Daten) sind ohnehin schon in der Datenbank, warum nicht einfach die Daten nehmen die man schon hat ?

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Hey,


    habe die Online-Prüfung weggelassen, sondern lasse jetzt durch /macheck (pid) jetzt die Offline-Accounts bzw. die Accounts in der Datenbank finden, aber leider klappt das nicht so ganz.



    Es kommt einfach immer keine Multiaccounts gefunden, obwohl ich 2 Accounts in der Datenbank habe, mit der ich mit der gleichen IP registriert habe.

  • format(query, sizeof(query), "SELECT id, name FROM spieler WHERE last_ip = '%s' AND name != '%s' ORDER BY id DESC;", PlayerName(playerid), GetIP(playerid));

    Du hast hier
    1. PlayerName und GetIP vertauscht (das müsstest du sogar in deiner Log sehen)
    2. nimmst du die IP von ausführenden Spieler, den suchst du aber nicht.
    Statt "playerid" einfach pid nehmen
    Den gleichen Fehler machst du auch in deiner SendClientMessage

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • Also wäre es so richtig ? :


  • format(query, sizeof(query), "SELECT id, name FROM spieler WHERE last_ip = '%s' AND name != '%s' ORDER BY id DESC;", GetIP(pid), PlayerName(pid));

    Nicht ganz. Du willst, ja den der sucht ausschließen, also musst du schon playerid bei PlayerName lassen.
    Ansonsten ist der Code in Ordnung.

    "Bevor ich mir Informationen aus der "Bild" hole,
    werde ich anfangen, Wahlergebnisse danach vorauszusagen,
    neben welchen Busch unsere Katze gepinkelt hat."

    Margarete Stokowski

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen