dWeb - Internetsystem

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
  • Hab das Script nur überflogen, bei OnPlayerConnect ist aber definitiv ein Memory Leak mit der Datei,die geöffnet wird.
    Man brauch die Datei auch nicht weiter lesen, wenn bereits herausgefunden wurde, dass der Spieler einen PC hat.


    Ich würde auch wetten,dass entweder auf Windows oder Linux Servern die Sache mit dem Auslesen aus der Datei nicht klappt ( 2 extra Zeichen am Ende jeder Zeile ) .
    Kann mir nämlich nicht vorstellen,dass es jetzt durch SA:MP behoben wurden.


    //Edit:
    rCmd[]->computer(playerid)
    Das hast du definitiv nicht ausgibit getestet. Kauf mal mit mehr als nur einem Spieler über /computer einen PC und schau dir dann die Datei "internetnutzer.txt" an.

    Einmal editiert, zuletzt von Goldkiller ()

  • Habe es hochgeladen aber der Befehl /pcbuy scheint nicht zu klappen. Kannst du die ganze Story nicht einfach mal als zip hochladen :D ?


    //Server läuft auf Linux, weist du da was Gold?


    convertFFS converted your input in 0.02 seconds - Chuck Norris could have done it in 0.0003 seconds!

    Einmal editiert, zuletzt von Index.pwn ()

  • Hab das Script nur überflogen, bei OnPlayerConnect ist aber definitiv ein Memory Leak mit der Datei,die geöffnet wird.
    Man brauch die Datei auch nicht weiter lesen, wenn bereits herausgefunden wurde, dass der Spieler einen PC hat.



    Tatsächlich habe ich das mit dem internetnutzer nur überflogen.
    Mir fällt auch, ohne groß nachzugucken ein, das am ende ein \n\r hin müsste, damit eine neue Zeile begonnen wird.


    Zum herausfinden:
    Ich habe wohl vergessen die Datei zu schließen. Daran wirds wohl liegen, oder?


    Zum computer befehl:
    Ehrlich gesagt habe ich das noch nicht getestet.
    Vorher hab ich dem Boolean einfach den wert true gegeben, damit ich den Rest testen kann.


    Der Fehler mit der neuen Zeile sollte aber jetzt eigentlich behoben sein.
    Quellcode wird oben hineingepostet.

  • Besser ist es jetzt aber auch nicht unbedingt:


    public OnPlayerConnect(playerid)
    {
    // ...
    while(fread(internet,derstring))
    {
    if(strcmp(derstring,Name,true) == 0)
    {
    HatPC[playerid] = true;
    fclose(internet);
    }
    }
    return 1;
    }


    Angenommen ich stehe nicht in der Datei drin,was passiert dann ? Genau,die Datei wird nie geschlossen. Auch halte ich es für schlecht,die Datei einfach zu schließen ohne die Schleife zu beenden. Ein break würde definitiv nicht Schaden.


    Übrigens fehlt ein pastebin Link.

  • Das mit dem Line-by-line Reading hatte ich aus dem SA-MP Wiki.
    Da stand dies so, deswegen habe ich einfach darauf vertraut.


    Kann ich da einfach else verwenden? Kenn mich mit while schleifen nicht wirklich aus.
    Wenn ja, würde es dann einfach else fclose(internet) lauten?
    Sry, das ich das nicht so genau verstehe.


    Zum break:
    Hab ich gemacht, füg ich jetzt gleich ein.


    Zum Pastebin:
    Ich dachte es muss lediglich der Quellcode beigelegt sein, dies ist bei mir vorhanden.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Kannste mir das Filterscript mal auf meinen Server Spielen .. bekomme es Absolut nicht hin.
    (Nicht das FS auf denn Server machen, aber allgemein. Oder schick mir die .amx davon)


    convertFFS converted your input in 0.02 seconds - Chuck Norris could have done it in 0.0003 seconds!

  • Das "Line-By-Line Reading" von wiki.sa-mp.com ist ja auch richtig,du hast es aber falsch abgeändert:
    http://wiki.sa-mp.com/wiki/Fread
    public OnPlayerConnect(playerid)
    {
    new string[64]; // Create the string to store the read text in
    new File:example = fopen("Startup.txt", io_read); // Open the file
    while(fread(example, string)) //reads the file line-by-line
    {
    if(strcmp(string, "Ban", true) == 0) //if any of the lines in the file say "Ban" the system will ban the player
    {
    Ban(playerid); //bans the player
    }
    }
    fclose(example);
    return 1;
    }
    Da siehst du ja,dass die Datei NACH der Schleife geschlossen wird.Dadurch wird sichergestellt,dass sie ( die Datei ) immer geschlossen wird. Bei dir wird sich immernoch nur dann geschlossen,wenn der Spieler in der Datei steht.
    while bedeutet ja im Deutschen so viel wie "solange". Die Schleife läuft also solange die Bedingung wahr ist.
    while( fread( ... , ... ) ) {
    // ..
    }
    Die Schleife läuft solange wie fread wahr zurück gibt.Bedeutet so viel,wie :
    Die Schleife läuft so lange,bis es keine Zeile mehr aus der Datei auslesen kann. Aus welchem Grund auch immer ( Datei geschlossen, Am Ende der Datei angekommen usw. ).
    Das break bewirkt, dass automatisch die Schleife ( nur die Schleife,nicht die Funktion ! ) beendet wird. Dabei ist es egal ob es eine while,for oder do-while Schleife ist.


    Du solltest es so machen:
    public OnPlayerConnect(playerid)
    {
    new File:internet = fopen("internetnutzer.txt",io_readwrite); // readwrite ? read reicht
    new Name[24];
    new derstring[28]; // <- der Puffer muss auch etwas größer sein als Name.
    GetPlayerName(playerid,Name,24);
    while(fread(internet,derstring))
    {
    if(strcmp(derstring,Name,true) == 0)
    {
    HatPC[playerid] = true;
    break;
    }
    }
    fclose(internet);
    return 1;
    }

    Du solltest trotzdem noch den Text der via fread ausgelesen wird, durch eine Funktion wie StripNewLine / StripLN jagen. Denn wie gesagt, es wird entweder auf Linux oder auf Windows zZt nicht funktionieren. Die Funktion findest du via Google.


    Und ja,pastebin fehlt trotzdem. Steht ja in der Regel.

  • Dominik, kannst du Alle Befehle auflisten, die auch so gehen? /pcreate etc. Funktioniert nicht, nur /computer nach dem ich einen Computer laden gemappt habe.


    convertFFS converted your input in 0.02 seconds - Chuck Norris could have done it in 0.0003 seconds!