Beiträge von Jeffry

    Das id darf dort nicht sein.
    Grundsätzlich kannst du es so etwas kompakter schreiben:
    forward HausUpdate();
    public HausUpdate()
    {
    mysql_pquery(handle, "SELECT * FROM haus WHERE update = 1", "HausUpdat","");
    return 1;
    }

    Das könnte von einem ähnlichen Problem verursacht werden. Eventuell werden die Fahrzeuge gelöscht und deren Neon dazu aber nicht, oder die Variablen nicht zurück gesetzt.


    Wenn du das alles sauber zurück setzt, dann dürfte der Fehler nicht auftreten.

    Ja, aber nicht im enum, sondern in einer Schleife bei OnGameModeInit:
    for(new i = 0; i < sizeof(array); i++) array[i][label] = Text3D:INVALID_3D_TEXTID;


    Und zusätzlich dort, wo das Label gelöscht wird:
    if(array[i][label] != Text3D:INVALID_3D_TEXTID) Delete3DTextLabel(array[i][label]);
    array[i][label] = Text3D:INVALID_3D_TEXTID;

    Das passt, da dürfte kein Fehler auftreten. Kannst du bitte versuchen den Fehler nachzustellen?
    Eventuell hat es sich durch deine Änderung bereits erledigt.


    Zu dem neuen Fehler:
    Prüfe bitte alle im Code angegebenen Spalten der Tabelle und die Bezeichner, ob dies alles mit der Datenbank übereinstimmt.

    Der Error bezieht sich auf ein mysql_tquery, die Zeile ist ein mysql_pquery, hast du das geändert?
    Falls ja, wie sieht die HausUpdat Funktion jetzt aus?


    Tritt der Error im Log weiterhin auf?

    @Jeffry Im MySQL Log steht auch nichts großartiges

    Setze vor das mysql_format bitte mal einen Print, und dann einen Print in OnPlayerLoginDialog.
    Wie sieht die zeitliche Differenz hier aus?


    Eventuell liegt es ja gar nicht an MySQL selbst.


    Tritt diese starke Verzögerung auch auf, wenn du das Absenden des Queries auskommentierst? Den Dialog siehst du dann nicht mehr, aber vielleicht kannst du es an etwas anderem erkennen.

    Hast du das jetzt nicht so gemacht, wie Shyim und ich es dir erklärt haben?
    Dann wird das Haus nur neu erstellt, wenn auch ein Update stattgefunden hat, und das dürfte ja recht selten der Fall sein.

    Versuche es so:
    mysql_format(myCon, string, sizeof(string), "SELECT * FROM `script_accounts` WHERE `Admin` > 0 ORDER BY `Admin` DESC");


    Füge eventuell das Query so mal in das SQL Feld deiner Datenbank ein, und schaue, was dort ausgegeben wird.

    Du darfst keine neue ID suchen, sondern musst die aktuelle Index-ID finden:
    forward HausUpdat();
    public HausUpdat()
    {
    new num_rows, hid, tmp_name[MAX_PLAYER_NAME], id;
    cache_get_row_count(num_rows);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    cache_get_value_name_int(i, "id", hid);
    id=getHausID(hid);
    if(id == -1) continue; //Haus existiert nicht
    cache_get_value_name_float(i, "h_x", hInfo[id][h_x]); //Float
    cache_get_value_name_float(i, "h_y", hInfo[id][h_y]); //Float
    cache_get_value_name_float(i, "h_z", hInfo[id][h_z]); //Float
    cache_get_value_name_float(i, "ih_x", hInfo[id][ih_x]); //Float
    cache_get_value_name_float(i, "ih_y", hInfo[id][ih_y]); //Float
    cache_get_value_name_float(i, "ih_z", hInfo[id][ih_z]); //Float
    cache_get_value_name_int(i, "h_interior", hInfo[id][h_interior]); //Float
    cache_get_value_name(i, "besitzer", hInfo[id][h_besitzer]); //Float
    strmid(hInfo[id][h_besitzer], tmp_name, 0, sizeof(tmp_name), sizeof(tmp_name));
    cache_get_value_name_int(i, "h_preis",hInfo[id][h_preis]); //Float
    updateHaus(id);
    }
    return 1;
    }


    Mit:
    stock getHausID(hid)
    {
    for(new i = 0; i < sizeof(hInfo); i++)
    {
    if(hInfo[i][h_id] == hid) return i;
    }
    return -1;
    }

    Macht es nicht mehr Sinn in der Datenbank ein Feld zu habe wie lastupdate und dort steht immer ein Timestamp drin, der sich aktualisiert wenn sich der Datensatz anpasst.

    Auf jeden Fall.


    Entweder per Timestamp oder über ein einfaches Flag (Spalte die auf 1 gesetzt wird, wenn ein Update ansteht). Über das Flag können dem Panel auch Informationen übergeben werden (1 = Update steht an / 0 = Update erfolgt / 2 = Fehler ... ?).


    Vom Vorgehen:
    1.
    Das Update im Panel setzt die Spalte "update" auf 1.


    2.
    Im PAWN Code läuft ein Timer, der alle 10 Sekunden folgendes Query absendet:

    SQL
    SELECT * FROM houses WHERE update = 1;


    3.
    Das wird per mysql_pquery an ein Callback weitergegeben und der Cache wird dann dort ausgelesen.


    4.
    Anhand der ID lässt sich dann bestimmen, welches Haus aktualisiert werden soll.


    5.
    Daten aus dem Cache auslesen und updateHaus für diese ID aufrufen.


    6.
    Query zurücksenden:

    SQL
    UPDATE houses SET update = 0 WHERE id = '%d';