Haus lädt nicht

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
  • Hi,


    ich habe mal ein altes Haussystem rausgekramt, welches BlackAce mir geschrieben hatte. Beim testen allerdings stellte ich fest, dass keine Häuser geladen werden.


    Die Häuser sind in der MySQL-Tabelle vorhanden (2 Stk).
    Hier der Code, wo sie geladen werden:
    //OnGameModeInit
    mysql_query("SELECT * FROM `haeuser`");
    mysql_store_result();
    new rows = mysql_num_rows();
    mysql_free_result();
    for(new h;h<rows;h++)
    {
    LoadHouse(h);
    }


    stock LoadHouse(HouseID)
    {
    new str[128];
    sscanf(str, "e<p<|>dfffdds[24]ddddfffdds[24]s[24]s[24]s[24]s[24]s[24]>",HausInfo[HouseID]);
    print("str:");
    printf("%s",str);
    print("enum:");
    printf("%d | %f | %f | %f | %d | %d | %s",HausInfo[HouseID][hID],HausInfo[HouseID][hPosX],HausInfo[HouseID][hPosY],HausInfo[HouseID][hPosZ],HausInfo[HouseID][hLevel],HausInfo[HouseID][hPreis],HausInfo[HouseID][hBesitzer]);
    return 1;
    }
    mein Print-Debugging hat folgendes ausgegeben:

    Code
    [01:56:49] str:
    [01:56:49] 
    [01:56:49] enum:
    [01:56:49] 0 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 | 
    [01:56:49] str:
    [01:56:49] 
    [01:56:49] enum:
    [01:56:49] 0 | 0.000000 | 0.000000 | 0.000000 | 0 | 0 |


    Und hier ist die MySQL-Logdatei:


    Was genau klappt da ned?


    lg

  • An deiner Stelle wirde ich es nicht so machen.

    PHP
    sscanf(str, "e<p<|>dfffdds[24]ddddfffdds[24]s[24]s[24]s[24]s[24]s[24]>",HausInfo[HouseID]);


    nach kurz oder lang bekommst du da viele Fehler rein, machs lieber einzelnt
    nach dem Muster

    PHP
    new
    format
    query
    while
    [Auslesen]

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Das wird so nichts, woher soll sscanf denn wissen was es für daten ziehen soll?
    Lade die häuser lieber alle auf einmal beim serverstart, ansonsten verbrauchst du viel zu viele querys.
    Das realisierst du mit dem Query zum auslesen, der while schleife in der du alles ausliest, und gut ist.
    Solltest du damit probleme haben sag einfach bescheid.

  • Auf Anfrage in PN:


    //OnGameModeInit
    mysql_query("SELECT * FROM `haeuser`");
    mysql_store_result();
    new str[256], h;
    while(mysql_fetch_row(str))
    {
    LoadHouse(h, str);
    h++;
    }
    mysql_free_result();


    stock LoadHouse(HouseID, str[256])
    {
    sscanf(str, "e<p<|>dfffdds[24]ddddfffdds[24]s[24]s[24]s[24]s[24]s[24]>",HausInfo[HouseID]);
    printf("str: %s",str);
    printf("enum: %d | %f | %f | %f | %d | %d | %s",HausInfo[HouseID][hID],HausInfo[HouseID][hPosX],HausInfo[HouseID][hPosY],HausInfo[HouseID][hPosZ],HausInfo[HouseID][hLevel],HausInfo[HouseID][hPreis],HausInfo[HouseID][hBesitzer]);
    return 1;
    }


    Unter der Voraussetzung, dass das sscanf so stimmt.

  • Minimassenzitat


    Ich denke mal das dass in diesem Falle die schleife übernimmt.
    while(mysql_fetch_row(str))


    mfg :thumbup:


    Nunja, ich habe es nun mal so unter OnGameModeInit geklatscht:
    mysql_query("SELECT * FROM `haeuser`");
    mysql_store_result();
    new str[512], h;
    h=mysql_num_rows();
    for(new j;j<h;j++) {
    while(mysql_fetch_row(str)) {
    LoadHouse(j, str);
    }
    }
    mysql_free_result();
    Und dann der große Moment............
    Die beiden Logdateien:


    Das scheint zu klappen :3

  • Die for-Schleife macht keinen Sinn. Es funktioniert zwar, aber der Code ist trotzdem recht sinnlos, da nur der erste Index der Schleife etwas bewirkt, daher kannst du dir das sparen.


    mysql_query("SELECT * FROM `haeuser`");
    mysql_store_result();
    new str[512], h;
    while(mysql_fetch_row(str))
    {
    LoadHouse(h, str);
    h++;
    }
    mysql_free_result();


    Schreib es so.

  • mysql_query("SELECT * FROM `haeuser` WHERE gekauft = 1");


    Je nach dem wie die Spalte in deiner Tabelle aussieht.


    Also geht im Prinzip auch, dass ich die ID auslese?


    Dann noch eine formelle Frage:
    mysql_query("SELECT * FROM `haeuser`");
    mysql_store_result();
    new str[512], h;
    while(mysql_fetch_row(str))
    {
    LoadHouse(h, str);
    h++;
    }
    mysql_free_result();
    Woher weiß "h" denn, wie viele Einträge in der Tabelle sind?

  • Ja, du kannst es mit jeder Spalte machen.
    mysql_query("SELECT * FROM `haeuser` WHERE ID < 5");
    Würde die ersten 5 Häuser Laden.



    while(mysql_fetch_row(str))
    Hierdurch weiß h, wann es aufhören soll. Es liest einfach alle Zeilen aus, die er geladen bekommt. Sobald er keine mehr hat (while => solange) hört er auf.