Häuser Speichern - Nur "benutzte" Häuser speichern?

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 "Spät"-Abend zusammen,


    ich bin vorhin mal wieder dazu gekommen, ein wenig zu scripten, und es trat sofort ein Problem auf.
    Ich möchte meine Häuser gerne so speichern, dass nur die benutzten, also auch wirklich die eingetragenen gespeichert werden.
    Sprich die Häuser, wo die Interior-ID über 0 liegt.


    Momentan ist es so:

    public SaveHouses()
    {
    print("Debug 1");
    new i = 0, mainQuery[1537], secondQuery[256];
    print("Debug 2");
    while(i<MAX_HOUSES && Haus[i][hInterior] > 0)
    {
    print("Debug 3");
    format(secondQuery, sizeof(secondQuery), "UPDATE `script_houses` SET `EnterX`='%f', `EnterY`='%f', `EnterZ`='%f', `ExitX`='%f', `ExitY`='%f', `ExitZ`='%f', ",
    Haus[i][EnterX], Haus[i][EnterY], Haus[i][EnterZ], Haus[i][ExitX], Haus[i][ExitY], Haus[i][ExitZ]);
    strcat(mainQuery, secondQuery);
    print("Debug 4");
    format(secondQuery, sizeof(secondQuery), "`Interior`='%d', `Besitzer`='%s', `Name`='%s', `Preis`='%d', `Mieten`='%d', `Lock`='%d', `MietPreis`='%d' `Kasse`='%d' WHERE id = '%d'",
    Haus[i][hInterior], Haus[i][hBesitzer], Haus[i][hName], Haus[i][hPreis], Haus[i][hMieten], Haus[i][hLock], Haus[i][hMietPreis], Haus[i][hKasse], Haus[i][hdbID]);
    mysql_function_query(myCon, mainQuery, false, "", "");
    print("Debug 5");
    i++;
    }
    printf("[SAVE] Häuser wurden gespeichert. (%d/%d)", i, MAX_HOUSES);
    return 1;
    }


    Er kommt lediglich bis Debug 2 und beim "Häuser wurden gespeichert" wird 0/200 angezeigt.
    Wenn ich die Abfrage rausnehme geht es, allerdings werden dann alle gespeichert, was ich wiederum nicht möchte.


    Die Interior-ID wird auch richtig ausgelesen.



    public LoadHouses()
    {
    new rows, fields, count;
    cache_get_data(rows, fields);
    for(new i;i<rows;i++)
    {
    new houseID = cache_get_field_content_int(i, "id");
    if(houseID < MAX_HOUSES)
    {
    Haus[houseID][hdbID] = cache_get_field_content_int(i, "id");
    Haus[houseID][EnterX] = cache_get_field_content_float(i, "EnterX"); printf("Haus[%d][EnterX]: %f", houseID, Haus[houseID][EnterX]);
    Haus[houseID][EnterY] = cache_get_field_content_float(i, "EnterY");
    Haus[houseID][EnterZ] = cache_get_field_content_float(i, "EnterZ");
    Haus[houseID][ExitX] = cache_get_field_content_float(i, "ExitX");
    Haus[houseID][ExitY] = cache_get_field_content_float(i, "ExitY");
    Haus[houseID][ExitZ] = cache_get_field_content_float(i, "ExitZ");
    Haus[houseID][hInterior] = cache_get_field_content_int(i, "Interior"); printf("Haus[%d][hInterior]: %d", houseID, Haus[houseID][hInterior]);
    cache_get_field_content(i, "Besitzer", Haus[houseID][hBesitzer], myCon, 32);
    cache_get_field_content(i, "Name", Haus[houseID][hName], myCon, 32);
    Haus[houseID][hPreis] = cache_get_field_content_int(i, "Preis");
    Haus[houseID][hMieten] = cache_get_field_content_int(i, "Mieten");
    Haus[houseID][hLock] = cache_get_field_content_int(i, "Lock");
    Haus[houseID][hMietPreis] = cache_get_field_content_int(i, "MietPreis");
    Haus[houseID][hKasse] = cache_get_field_content_int(i, "Kasse");
    count++;
    }
    }
    printf("[LOAD] Häuser geladen: %d/%d", count, MAX_HOUSES);
    return 1;
    }
    Häuser geladen: 2/200 kommt dort.
    Interior ID "debug":
    Haus[1][hInterior]: 4
    Haus[2][hInterior]: 3


    Also gleich wie in der Datenbank. (ID 1 = Interior 4, ID 2 = Interior 3)


    Ich wüsste nicht woran dies liegen könnte.
    Ich bedanke mich bei den Leuten die mir helfen möchten! :)

  • Ersetz mal die while-Schleife durch eine for-Schleife:

    new count = 0;
    for(new i = 0; i<MAX_HOUSES;i++)
    {
    if(Haus[i][hinterior] > 0)
    {
    //Hier dein Speichervorgang für das Haus mit der ID "i"
    count ++:
    }
    }
    printf("[SAVE] Häuser wurden gespeichert. (%d/%d)", count, MAX_HOUSES);


    Grund: Die While-Schleife führt so lange etwas aus, wie die Abfrage erüllt ist. Deine Abfrage ist so: So lange i kleiner ist als MAX_HOUSES und das Interior des aktuellen Hauses i größer ist als 0. Sollte ein aktuelles Haus i also kein Interior größer 0 haben, wird die Schleife abgebrochen und die restlichen Häuser werden erst garnicht mehr überprüft.