Beiträge von Goldkiller

    Das SetVehicleNumberPlate stört in diesem Zusammenhang.


    • AddStaticVehicleEx(568,1654.1069,732.3977,10.6854,93.8157,9,39,30) - Gibt VehicleID zurück
    • SetVehicleNumberPlate - This function doesn't return a specific value


    Da du für den Parameter der VehicleID den Return-Wert von SetVehicleNumberPlate benutzt ( der ist ja nicht genau definiert ) ,klappt das ganze nicht ;).
    Nimm lieber eine Hilfsvariable,kann ja nicht Schaden.


    new vehicle;
    vehicle = AddStaticVehicleEx(568,1654.1069,732.3977,10.6854,93.8157,9,39,30);
    SetVehicleNumberPlate( vehicle , "DM");
    SetVehicleVirtualWorld( vehicle , 10 );

    Der Fehler liegt nicht in der Zeile , zumindest nicht wenn auch DIALOG_AH korrekt deklariert / definiert ist .
    Kannst die Zeile ja mal auskommentieren, es werden Sicherlich weiterhin Fehler angezeigt.

    Text-Arrays bzw String Arrays sind mindestens 2. Dimensional :


    new Gamemodes[][] = {
    {"Gamemode1"},
    {"Gamemode2"},
    {"Gamemode3"}
    };
    Dann kann man auch Beispielsweise den Code von FACE benutzen:
    new gamemoderandom = random(sizeof(Gamemodes));
    new gamemodestring [64];
    format(gamemodestring,sizeof(gamemodestring),"changemode %s",Gamemodes[gamemoderandom]);


    SendRconCommand(gamemodestring);

    Kann klappen, würde aber eher sagen nein. Je nachdem was du noch so in deinem Script hast kann es passieren, dass aus den 1000ms beispielsweise 1200ms werden.
    Kannst ja mal hier schauen die Timer-Zeiten:
    http://forum.sa-mp.com/showthread.php?t=289675


    Du kannst aber auch einfach machen,dass es 00:00 0 oder 00:00 1 ist.


    if(hour == 0 && minute == 0 && ( second == 0 || second == 1 ) )
    Oder
    if(hour == 0 && minute == 0 && ( 0 <= second <= 1 ) )
    Kann mir nicht vorstellen, dass der Timer so enorm off ist,dass es nicht klappt und glatt 2000ms überschreitet.

    Da steht:
    Entweder die hour / Stunde ist ist 0 , minute / Minute ist 0 und second / Sekunde ist 0 ( 00:00 und 0 ) ODER second / Sekunde ist 1 ( zB . 16:42 und 1 ) :


    Zitat

    Weil ich habe gerade überlegt, wenn ich das || verwende, alles davor weggeht, und jede Minute sobald Sekunde "1" ist eine Nachricht kommt.


    So ist es ja auch ;)

    Leider ist es jetzt immernoch nicht richtig. Du hast dir die Funktion StripNewLine wohl nicht so ganz genau angesehen. Sie entfernt das überflüsse "\r\n" ( Nicht direkt \r\n ), fügt es nicht hinzu !
    Ich weiss nicht wieso du glaubst,StripNewLine müsstest du anwenden bevor du in die Datei schreibst. Ich habe doch geschrieben du sollst sie anwenden,nachdem du eine Zeile ausgelesen hast.
    Damit du nicht weiterhin wie wild drauf rum rätst, so war es von Anfang an gemeint und beschrieben :
    public OnPlayerConnect(playerid)
    {
    // ...
    while(fread(internet,derstring))
    {
    StripNewLine( derString );
    if(strcmp(derstring,Name,true) == 0)
    {
    HatPC[playerid] = true;
    break;
    }
    }
    fclose(internet);
    return 1;
    }
    //..
    format(ausgabe,30,"%s\r\n",Name);
    //..
    new File:internet = fopen("internetnutzer.txt",io_append);
    if(internet)
    {
    fwrite(internet,ausgabe);
    fclose(internet);
    }


    Im übrigen sind da noch ein paar weitere Fehler.
    Im Dialog "case DIALOG_EDIT:" schreibst du in die Datei hinein. Du speicherst sie nachdem du sie geschlossen hast.Das funktioniert aber nicht.Du musst sie erst speichern,danach schließen. Bei /pdelete löschst du eine Zeile, speicherst und schließt die Datei aber nicht ( schließen ist nicht ganz so schlimm ). Du solltest die Datei mit INI_Close auch lieber immer manuell löschen,hast du an noch ein oder zwei weiteren Stellen im Code auch nicht gemacht.

    Ich kann das ja nicht einfach mitten in die Schleife tuen.


    Wieso sollte das nicht gehen ? Das muss sogar in die Schleife,sonst bewirkt es ja nichts. Die Funktion soll ja die ausgelesene Zeile bearbeiten. Ein besserer Zeitpunkt als in der Schleife gibt es in diesem Beispiel doch gar nicht,da bei jedem Durchgang der Schleife eine neue Zeile ausgelesen wird.


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

    Keine Ahnung auf wieviel. Ausprobieren und daraus schlau werden. Ich hab dir den Code sowieso mit 37ms angegeben. Das 500ms zu viel ist,sollte dir aber auch klar sein.Denn dann dauert es ja eine halbe Sekunden bis der Checkpoint angezeigt wird. Ich hatte es bei mir auf 60ms, hat auch wunderbar geklappt. Weiss aber auch nicht,wie weit du mit der Zeit runter gehen kannst. Ob jetzt 60ms oder 37ms, merken wirst du es sowieso nicht.

    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.

    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.

    Nein. So macht das ganze ja gar keinen Sinn.Du sollst erst DisablePlayerCheckpoint aufrufen und danach zeitversetzt SetPlayerCheckpoint. Sonst hast du ja genau das gleiche wie vorher auch.
    Außerdem ist hier ein f zu viel:
    SetTimerEx("CheckpointTimer", 500, 0, "ifffffi", playerid, x,y,z, size, type);


    Ich meinte es eher so:
    stock v_SetPlayerCheckpoint(playerid, Float:x, Float:y, Float:z, Float:size)
    {
    DisablePlayerCheckpoint(playerid);
    SetTimerEx("CheckpointTimer", 37, 0, "iffff", playerid, x,y,z, size); // 500 ist bischen viel. 37 ist gut,Primzahlen |o/
    return 1;
    }


    forward CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size);
    public CheckpointTimer(playerid, Float:x, Float:y, Float:z, Float:size)
    {
    SetPlayerCheckpoint(playerid, x,y,z,size);
    return 1;
    }

    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.

    Absolut nicht nützlich.


    Sorry,aber dein Codeschnipsel hat mMn hier absolut nichts verloren.
    Ich hab weder die Funktion IfSpielerInFrak ( Die Übrigens schlecht benannt ist ) noch die Farbe WHITE im Script. Wieso er auch in Fraktion 5 sein muss,weiss ich auch nicht.
    Man müsste also alles an seine Bedürfnisse anpassen. Da kann man es auch gleich selber machen.