Pfandflaschen System

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
  • Guten Tag,


    Mein Name lautet MrPawn.
    Und zwar bräuchte ich hilfe bei meinem Pfandflaschen System.
    Es gehört zu meinem Dynamischen Mülltonnen System.
    Und zwar habe ich versucht alle 10 Minuten random an eine Tonnenid flaschen zu verteilen, das klappt auch nicht ganz.
    Datenbank:

    Print Result:


    Script:

    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    new rand = 0 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 1000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+12 WHERE id=%i", rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 60*1000*10, true);
    printf("Es wurden 12 Pfandflaschenan ID: %i übermittelt!",rand);
    }
    mysql_free_result();
    }
    return 1;
    }


    ocmd:pfandsuchen(playerid)
    {
    new str[3], Float:X, Float:Y, Float:Z, query[128], string[256], rand = 0 + random(12);
    for(new i;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", i);
    mysql_query(query);
    mysql_store_result();
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    X = mysql_GetFloat("nlr_tonne", "X", "id", str), Y = mysql_GetFloat("nlr_tonne", "Y", "id", str), Z = mysql_GetFloat("nlr_tonne", "Z", "id", str);
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))continue;
    mysql_free_result();
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen-%i WHERE id=%i",rand, i);
    mysql_query(query);
    }
    uInfo[playerid][sPfandflaschen] += rand;
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast %i {EBFF00}Pfandflaschen{FFFFFF} aus der {EBFF00}Mülltonne{FFFFFF} gekramt!", rand);
    SendClientMessage(playerid, COLOR_GREEN, string);
    return 1;
    }


    Bei Pfandsuchen tritt das Problem auf der von überall die Pfandflaschen kramen kann.

  • Zu deinem ersten Problem, du musst den Code aus der Schleife holen:
    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=1;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 1000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+12 WHERE id=%i", rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 60*1000*10, true);
    printf("Es wurden 12 Pfandflaschenan ID: %i übermittelt!",rand);
    }
    mysql_free_result();
    return 1;
    }



    Zum zweiten Problem: Hier genau andersrum, du musst den Code in die Schleife Packen:
    ocmd:pfandsuchen(playerid)
    {
    new str[3], Float:X, Float:Y, Float:Z, query[128], string[256], rand = 1 + random(12);
    for(new i;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", i);
    mysql_query(query);
    mysql_store_result();
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    X = mysql_GetFloat("nlr_tonne", "X", "id", str), Y = mysql_GetFloat("nlr_tonne", "Y", "id", str), Z = mysql_GetFloat("nlr_tonne", "Z", "id", str);
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))continue;
    mysql_free_result();
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen-%i WHERE id=%i",rand, i);
    mysql_query(query);
    uInfo[playerid][sPfandflaschen] += rand;
    format(string, sizeof(string), "ERFOLGREICH: {FFFFFF}Du hast %i {EBFF00}Pfandflaschen{FFFFFF} aus der {EBFF00}Mülltonne{FFFFFF} gekramt!", rand);
    SendClientMessage(playerid, COLOR_GREEN, string);
    return 1;
    }
    return SendClientMessage(playerid, COLOR_RED, "Keine Tonne hier.");
    }


    Ich habe dir mal deine MySQL Queries gelassen wie sie sind, da ich nicht weiß wie du die Funktionen (mysql_GetFloat) hast, aber unter Umständen ist das recht Ressourcenlastig geschrieben. Aber in erster Linie schauen wir mal, dass es überhaupt geht.


  • Leider ist es aktuell so, wenn es diese ID nicht gibt, versucht er es trotzdem zu übergeben



    Aktueller Code:



    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=1;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_field_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }

  • Ich hatte auf dem Screen garkeine Tonnen ;)
    Deswegen verwundert mich es ja das so große Zahlen kommen.
    Aktuell klappt /pfandsuchen einwandfrei und wenn tonnen in der Datenbank eingetragen sind, bekommt immer einer von den beiden Pfandflaschen, aber wenn keine Tonnen eingetragen sind, dann kommen große Zahlen.
    Aber warum ?(

  • fällt mir spontan keine Erklärung dazu ein, debugge es mal, vielleicht bringt das die Lösung:


    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=1;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = 1 + random(count);
    printf("rand = %d | count = %d", rand, count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }


    Was wird geprintet, wenn dieser Code aufgerufen wird (bitte einmal mit und einmal ohne Tonnen in der DB).

  • Das was in der Schleife steht, printet er garnicht ?



    Aktueller CODE:


    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }


    Es Funktioniert ja alles, nur ich möchte wenn keine Tonne eingetragen wird das er dann auch hinschreibt das sie nicht übergeben wurde ..


    Mit Tonne:



    Also wenn eine Tonne eingetragen wird, dann klappt es wunderbar aber sonst..

  • Ach, natürlich! Gut, dass so ein Debug einem immer auf die Sprünge hilft.
    random(0) ist ja auch Käse.^^


    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    if(count == 0)
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    print("Es wurde keine Tonne gefunden!");
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!mysql_num_rows())
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    printf("Es konnten keine Pfandflaschen an ID: %i übermittelt werden!",rand);
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }

  • Danke dies Klappt nun wunderbar, nun habe ich aber ein Fehler in meinem /dtonne befehl..
    Und zwar wenn ich in der nähe einer tonne bin , dann zeigt er mir den Dialog an und sagt gleichzeitig das ich nicht in der nähe bin.

    ocmd:dtonne(playerid)
    {
    new str[3], Float:X, Float:Y, Float:Z, string[256];
    if(uInfo[playerid][sAdminlevel] < 6)return SendClientMessage(playerid, COLOR_LIGHTRED, "FEHLER: {FFFFFF}Du hast nicht das Recht dazu.");
    GetPlayerPos(playerid, X, Y, Z);
    for(new i=1;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    X = mysql_GetFloat("nlr_tonne", "X", "id", str), Y = mysql_GetFloat("nlr_tonne", "Y", "id", str), Z = mysql_GetFloat("nlr_tonne", "Z", "id", str);
    if(!IsPlayerInRangeOfPoint(playerid, 3.0, X, Y, Z))continue;
    SetPVarInt(playerid, "mID", i);
    format(string, sizeof(string), "{FFFFFF}Möchtest du wirklich die {EBFF00}Mülltonne{FFFFFF} mit der ID: {EBFF00}%i{FFFFFF} entfernen?", i);
    ShowPlayerDialog(playerid, DIALOG_TONNE, DIALOG_STYLE_MSGBOX, "Mülltonne", string, "Ja", "Nein");
    break;
    }
    return SendClientMessage(playerid, COLOR_LIGHTRED, "FEHLER: {FFFFFF}Du stehst an keiner Tonne!");
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Gut danke, das klappt nun auch
    Jetzt ergibt es aber ein weiteres Problem..
    Und zwar übergibt er nur noch an die ID 1.




    Aktueller CODE:
    public Pfandadd()
    {
    new str[3], count, query[128];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = 1 + random(count);
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!count)
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    print("Es konnten keine Pfandflaschen an ID: ? übermittelt werden!");
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }

  • Können wir uns darauf einigen, dass die IDs bei 0 anfangen? Du wechselst das nämlich nach Belieben ab, das macht wenig Sinn. ;)


    public Pfandadd()
    {
    new str[3], count, query[128], exists[MAX_TONNEN];
    for(new i=0;i<MAX_TONNEN;i++)
    {
    format(str, 3, "%i", i);
    if(mysql_GetFloat("nlr_tonne", "X", "id", str) < 1.0)continue;
    count ++;
    exists[i] = 1;
    printf("Exists: %d -> count = %d", i, count);
    }
    new rand = random(count), tmp;
    for(new i=0; i<MAX_TONNEN; i++)
    {
    if(exists[i] == 1)
    {
    if(tmp == rand)
    {
    rand = i;
    break;
    }
    tmp++;
    }
    }
    format(query, sizeof(query), "SELECT * nlr_tonne WHERE id=%i", rand);
    mysql_query(query);
    mysql_store_result();
    if(!count)
    {
    KillTimer(Tonnentimer);
    Tonnentimer = SetTimer("Pfandadd", 10000, false);
    print("Es konnten keine Pfandflaschen an ID: ? übermittelt werden!");
    }
    else
    {
    KillTimer(Tonnentimer);
    new rand1 = 1 + random(11);
    format(query, sizeof(query), "UPDATE nlr_tonne SET Pfandflaschen=Pfandflaschen+%i WHERE id=%i",rand1, rand);
    mysql_query(query);
    Tonnentimer = SetTimer("Pfandadd", 10000, true);
    printf("Es wurden %i Pfandflaschen an ID: %i übermittelt!",rand1,rand);
    }
    mysql_free_result();
    return 1;
    }


    Zwischenspeichern und dann den random-Wert auslesen. Müsste passen.