Mysql Haus Bug

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
  • Hallo Brotfische,


    Bei dem Haussystem wird beim laden immer die MysqlID 0 ausgelesen.


    OnGameModeInit:
    new querye[256];
    format(querye, sizeof(querye), "SELECT * FROM haus");
    mysql_function_query(dbhandle, querye, true, "OnHausesLoad", "");


    Public:
    public OnHausesLoad()
    {
    new num_fields,num_rows;
    cache_get_data(num_rows,num_fields,dbhandle);
    printEx("Numrows: %d Numfields: %d",num_rows,num_fields);
    if(!num_rows)return 0;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeHausID();
    hInfo[id][h_x] = cache_get_field_content_float(i, "h_x", dbhandle);
    hInfo[id][h_y] = cache_get_field_content_float(i, "h_y", dbhandle);
    hInfo[id][h_z] = cache_get_field_content_float(i, "h_z", dbhandle);
    hInfo[id][ih_x] = cache_get_field_content_float(i, "ih_x", dbhandle);
    hInfo[id][ih_y] = cache_get_field_content_float(i, "ih_y", dbhandle);
    hInfo[id][ih_z] = cache_get_field_content_float(i, "ih_z", dbhandle);
    hInfo[id][h_interior] = cache_get_field_content_int(i, "h_interior", dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i, "besitzer", tmp_name, dbhandle);
    format(hInfo[id][h_besitzer],25,tmp_name);
    hInfo[id][h_id] = cache_get_field_content_int(i, "id", dbhandle);
    hInfo[id][h_preis] = cache_get_field_content_int(i, "h_preis", dbhandle);
    hInfo[id][h_mietpreis] = cache_get_field_content_int(i, "h_mietpreis", dbhandle);
    hInfo[id][h_maxmieter] = cache_get_field_content_int(i, "h_maxmieter", dbhandle);
    hInfo[id][h_geschlossen] = cache_get_field_content_int(i, "h_geschlossen", dbhandle);
    updateHaus(id);
    printEx("i = %d - id = %d - MySQLID: %d - Besitzer: %s", i, id, hInfo[id][h_id],hInfo[id][h_besitzer]);
    }
    return 1;
    }








    Ich hoffe ihr könnt mir helfen :)



    MfG German_ScripterHD


    Mit freundlichen Grüßen
    German_ScripterHD

  • Schreib erstmal deinen Code ordentlich ^^
    mysql_function_query(dbhandle, "SELECT * FROM `haus`", true, "OnHausesLoad", ""); //OnGameModeInit
    public OnHausesLoad()
    {
    new num_rows = cache_get_row_count(dbhandle);
    if(!num_row)return;
    for(new i=0, id, tmp_name[MAX_PLAYER_NAME]; i<num_rows; i++)
    {
    id=getFreeHausID(),
    hInfo[id][h_id] = cache_get_field_content_int(i, "id", dbhandle),
    cache_get_field_content(i, "besitzer", hInfo[id][h_besitzer], dbhandle, MAX_PLAYER_NAME),
    hInfo[id][h_x] = cache_get_field_content_float(i, "h_x", dbhandle),
    hInfo[id][h_y] = cache_get_field_content_float(i, "h_y", dbhandle),
    hInfo[id][h_z] = cache_get_field_content_float(i, "h_z", dbhandle),
    hInfo[id][ih_x] = cache_get_field_content_float(i, "ih_x", dbhandle),
    hInfo[id][ih_y] = cache_get_field_content_float(i, "ih_y", dbhandle),
    hInfo[id][ih_z] = cache_get_field_content_float(i, "ih_z", dbhandle),
    hInfo[id][h_interior] = cache_get_field_content_int(i, "h_interior", dbhandle),
    hInfo[id][h_preis] = cache_get_field_content_int(i, "h_preis", dbhandle),
    hInfo[id][h_mietpreis] = cache_get_field_content_int(i, "h_mietpreis", dbhandle),
    hInfo[id][h_maxmieter] = cache_get_field_content_int(i, "h_maxmieter", dbhandle),
    hInfo[id][h_geschlossen] = cache_get_field_content_int(i, "h_geschlossen", dbhandle),
    printf("i = %d - id = %d - MySQLID: %d - Besitzer: %s", i, id, hInfo[id][h_id],hInfo[id][h_besitzer]),
    updateHaus(id);
    tmp_name[0] = '\0', id = false;
    }
    return;
    }


    Zeig mal folgende Funktionen, "updateHaus" und "getFreeHausID".


    mfg :thumbup:

  • stock updateHaus(id)
    {
    SendClientMessageToAllEx(COLOR_GRAY,"HausID: %d Besitzer: %s",id,hInfo[id][h_besitzer]);
    new string[128];
    if(hInfo[id][h_pickup])
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text])
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strcmp(hInfo[id][h_besitzer],"Staat", true))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "{008E00}Haus zum Verkauf\n{FFFFFF}Preis: {D1D1D1}$%d\n{FFFFFF}Besitzer: {D1D1D1}%s\n{FFFFFF}/buyhouse", hInfo[id][h_preis], hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_WHITE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else if(strcmp(hInfo[id][h_besitzer],"Staat", true))
    {
    hInfo[id][h_pickup]=CreatePickup(1272, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "{FFFFFF}Hausnummer: {D1D1D1}%d\n{FFFFFF}Besitzer: {D1D1D1}%s\n{FFFFFF}Mieter: {D1D1D1}%d/%d\n{FFFFFF}Mietpreis: {D1D1D1}$%d", hInfo[id][h_id], hInfo[id][h_besitzer],GetHouseMieter(hInfo[id][h_id]),hInfo[id][h_maxmieter],hInfo[id][h_mietpreis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_WHITE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    return 1;
    }


    stock getFreeHausID()
    {
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(hInfo[i][h_id]==0)return i;
    }
    return 0;
    }


    Mit freundlichen Grüßen
    German_ScripterHD

  • if(!strcmp(hInfo[id][h_besitzer],"Staat", true))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "{008E00}Haus zum Verkauf\n{FFFFFF}Preis: {D1D1D1}$%d\n{FFFFFF}Besitzer: {D1D1D1}%s\n{FFFFFF}/buyhouse", hInfo[id][h_preis], hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_WHITE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else if(strcmp(hInfo[id][h_besitzer],"Staat", true))
    {
    hInfo[id][h_pickup]=CreatePickup(1272, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "{FFFFFF}Hausnummer: {D1D1D1}%d\n{FFFFFF}Besitzer: {D1D1D1}%s\n{FFFFFF}Mieter: {D1D1D1}%d/%d\n{FFFFFF}Mietpreis: {D1D1D1}$%d", hInfo[id][h_id], hInfo[id][h_besitzer],GetHouseMieter(hInfo[id][h_id]),hInfo[id][h_maxmieter],hInfo[id][h_mietpreis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_WHITE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    Das macht keinen Sinn.


    Zeig mal deine Datenbankstruktur.


    mfg :thumbup:


  • Wieso macht das keinen Sinn?
    Er fragt nur ab ob das Haus dem Staat gehört oder nicht.

  • Also wenn das Haus niemand gehört (Staat) dann zählt er die Häuser weiter, sobald das Haus nicht mehr dem Staat gehört sondern einem Spieler zählt er nicht mehr weiter...
    Stimmt was mit dem format nicht?:


    format(hInfo[id][h_besitzer],25,tmp_name);
    (Steht oben unter OnHausesLoad();)





    Ich hoffe ihr könnt mir helfen :D


    MfG German_ScripterHD


    Mit freundlichen Grüßen
    German_ScripterHD

  • Das ist wircklich komisch...
    Sobald dort ein anderer Text steht außer Staat?

  • Dein Problem hat sich zwar erledigt, du hast trotzdem noch einen Fehler drin:


    Das ist so keine gute Idee.
    Mal angenommen du hättest folgendes:
    hInfo[0][h_id] = 0;
    Dann klappt alles wunderbar. Der Wert bei i wäre in der Schleife 0 und durch return i bekommst du als Antwort 0.
    Wären jetzt aber für alle Indizes der Wert bei h_id != 0, dann würdest du innerhalb der Schleife zu keinem Ergebnis kommen. Nach der Schleife folgt aber ein return 0, was dir vormacht, der Index 0 wäre frei und gleichzeitig nicht frei.
    Du benutzt den Index 0 für "Der Index ist frei" in der Schleife, "Kein Index mehr frei" außerhalb der Schleife. Beides darf es aber nicht sein.
    Anstatt return 0 solltest du sowas wie return INVALID_HOUSE_INDEX o.Ä. benutzen. Müsstest dann aber auch nach der Nutzung von getFreeHausID darauf prüfen.