Beiträge von ray187

    Bin mir da nicht 100% sicher da ich das Verhalten von fread nicht kenne bzw. was es zurück gibt wenn nichts gelesen wird. Ich gehe mal von NULL aus, von daher



    new File:Grovekasse = fopen("frakkasse.txt",io_readwrite);
    fread(Grovekasse,Inhalt);
    if(!Inhalt[0])
    {
    new string[15];
    format(string,15,"%d",gskasse);
    fwrite(Grovekasse,string); // string muss gleich dem startwert sein
    gskasse = 200000; // oder was auch immer dein startwert ist
    }
    else
    {
    gskasse = strval(Inhalt);
    }
    fclose(Grovekasse);


    Aber bevor Du fragst ob es klappt, teste es doch einfach selbst aus. Wenn deine stringcmp Methode funktioniert, dann verwende diese ansonsten probier halt mal meine.

    Hast geschafft, jetzt ist der Code schön deutlich ;).


    Ich hab ihn überflogen und kann Dir nicht wirklich sagen warum die Probleme auftreten. Ich nehme mal an du nutzt keine Streamer oder sonstiges für Pickups etc.


    Gibt der Compiler Fehler aus? Und bist Du Dir sicher den Server nach updaten des Scripts neugestartet zu haben?

    Klar aber das ist letzten Endes dir überlassen. Manche meiner Queries gehen über 3 Zeilen, da muss ich dann schon auch mal cutten ;).


    Falls dein Query länger ist als die Bildschirmbreite dann sowieso. Wenn du jetzt aber nur ein Query mit zwei Werten hast, dann isses natürlich übertrieben ;)


    Beispiel:

    format(query,sizeof(query),"UPDATE `table` SET `value`='%d' WHERE `value`='%d';",new_value,old_value);


    Das würde ich jetzt nicht auf mehrere Zeilen verteilen ;).

    Die zweite Frage kann ich dir Anhand der Code Ausschnitte nicht beantworten.


    Zur ersten:


    Nochmal, das Query das die Probleme verursacht ist eine "INSERT INTO.." richtig? Dein Query ist nicht korrekt, da Du versuchst mehr Werte - als Du Spalten angegeben hast - einzufügen oder umgekehrt, mehr Spalten angegeben hast als Werte eingefügt werden sollen.


    Und jetzt nochmal mein Beispiel, wie so ein Fehler auftreten kann:



    mysql_query("INSERT INTO (spalte1,spalte2) VALUES (wert1,wert2,wert3);"); // Hier wird versucht in 2 Spalten 3 Werte einzufügen - Fehler: Failed to exeute query. Column count doesn't match value count at row 1.


    Jetzt kannst Du in deinem Script nach eben diesem Query suchen und die Anzahl der Werte/Spalten vergleichen und den Fehler beheben.

    Kann sein, dass ich Dich da falsch verstanden hab.
    Wenn Du die Fraktionskasse abspeicher willst, dann prüfst Du halt ob der Eintrag bereits besteht - wie auch immer der aussehen mag. Meins war nur ein Beispiel. Allerdings schreibst Du wieder im darauffolgenden Text, was mein Beispiel eigentlich abdeckt.


    Deswegen die Frage direkt: Wie speicherst Du den Wert der Fraktionskasse denn in deiner File ab bzw wie möchtest Du es abspeichern?

    Zu mySQL errors: Die kannste wörtlich übersetzen:


    "Failed to exeute query. Column count doesn't match value count at row 1." Wird denke ich ein "INSERT INTO" sein - deine Spaltenanzahl ist nicht gleich mit der Werte Anzahl.


    Bsp.: INSERT INTO (spalte1,spalte2) VALUES (wert1,wert2,wert3) <- 3 Werte, nur 2 Spalten.


    Versuch bitte, immer erstmal selbst die Fehler genau unter die Lupe zu nehmen, bevor Du dich ans Board wendest.


    Deinem Pastebin Code mangelt es stark an sauberer Intendation - den kann ich mir so nicht anschauen - aber ich denke mein Hinweis sollte Dir schon helfen ;).

    Ich arbeite gar nicht mit Filesystemen von daher bin ich mir nicht sicher ob ich Dir eine große Hilfe sein kann.


    Zunächst mal zum Fehler: strval(..) konvertiert einen String zu einem Integer, fwrite allerdings erwartet einen String und keinen Integer - daher der Fehler.


    Ich versteh nicht ganz was str[1] soll.


    fread liest meines Wissens nach Zeile für Zeile, also machst du folgendes:


    Du schleifst durch Die Zeilen und vergleichst ob
    gskasse=2000000
    schon drinsteht (strcmp und warsch. musst auch den String "gskasse" für den Vergleich vom Rest trennen [strtok, sscanf]).


    Falls ja, machst nichts weiter, falls nein schreibst gskasse=200000 rein.

    Sorry,


    Du rufst eine Funktion auf, die beide gerade erstellen Funktionen abdeckt. Beispiel:



    forward SpielerGestorben(playerid,killerid);


    public SpielerGestorben(playerid,killerid)
    {
    SendClientMessage(playerid, 0xAA3333AA, "Besuche uns bald wieder =).");
    SetPlayerHealth(playerid, 100);
    SetPlayerPos(playerid,0.0,0.0,0.0);
    TogglePlayerControllable(playerid, 0);
    SendClientMessage(killerid, 0xAA3333AA, "Raus mit dir du hast den Staat genug Geld gekostet =).");
    SetPlayerPos(killerid,0.0,0.0,0.0);
    TogglePlayerControllable(killerid, 0);
    return 1;
    }


    public OnPlayerDeath(playerid, killerid, reason)
    {
    // ...
    SetTimerEx("SpielerGestorben",60000,0,"dd",playerid,killerid); // anstelle der beiden anderen SetTimerEx
    //...


    Begründung: Wenn es so einfach ist, auf einen Timer zu verzichten, sollte man dem nachgehen. Die Verwendung von Timern sollten so weit wie möglich eingeschränkt werden und gerade in diesem Beispiel ist es absolut nicht nötig zwei Timer zu verwenden.


    Der Code über meinem Post wird übrigens nicht funktionieren, da die Timer Funktion falsch aufregufen wird. Meiner ist aber auch nicht getestet ;).

    Wie gesagt, wenn du zwei Timer für eine Sache verwendest verdoppelst Du damit den "Ressourcenverbrauch" - was in diesem Fall absolut sinnlos ist.


    Mach eine gemeinsame Funktion



    forward blabla(playerid,killerid);
    public blabla(playerid,killerid)
    {


    }



    SetTimerEx("blabla",60000,0,"dd",playerid,killerid);


    Verwende auch "d" wenn es sich um eine "normale" Dezimalzahl handelt. "i" wird für alle Dez-Zahlen benutzt - Hex + Okt + Dez.

    Dann machst ne if Abfrage ob's die Zeile gskasse schon gibt und nur falls nicht schreibst sie nochmal rein unter OnGameModeInit.

    Kannst alle wortwörtlich übersetzen:



    Tag mismatch -> falscher Variablentyp.
    Unreachable Code -> z.B. unter einem "return" verwendest Du noch Code -> dieser kann nicht ausgeführt werden.
    symbol is never used -> Du erstellst eine Variable die Du nicht verwendest.