Häuser Daten updaten

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, ich würde gerne meine Häuser Daten in bestimmten Minuten Takt Updaten lassen. Hierzu habe ich einen Timer in OnGameModeInitd erstellt.


    Und folgenden Code als Abruf geschrieben



    forward Hausupdate();
    public Hausupdate()
    {
    for(new i=0; i<sizeof(hInfo); i++)
    {
    OnHausesLoad();
    updateHaus(i);
    }
    return 1;
    }



    updateHaus(id)
    {
    new string[128];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else
    {
    hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_BUSBLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    return 1;
    }



    public OnHausesLoad()
    {
    new num_rows;
    cache_get_row_count(num_rows);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeHausID();
    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
    new tmp_name[MAX_PLAYER_NAME];
    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, "id",hInfo[id][h_id]); //Float
    cache_get_value_name_int(i, "h_preis",hInfo[id][h_preis]); //Float
    new string[128];
    if(!strlen(hInfo[id][h_besitzer]))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else
    {
    hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_BUSBLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    }
    return 1;
    }

    Die Häuser werden bei mir in jeder Sekunde kurz Destroyt und wieder hinzugefügt. Das ist aber nicht das Problem. Der Preis wird nicht geupdatet und das ist viel mehr das Problem.


    //push 18.11.2016

    Einmal editiert, zuletzt von robbi2304 ()

  • Warum willst du das machen?
    bzw was ist mit Speichern?
    und das mit der Sekunde wegploppen liebt an diesen Schnipsel
    if(hInfo[id][h_pickup] != -1) {DestroyPickup(hInfo[id][h_pickup]);}if(hInfo[id][h_text] != Text3D:-1) {Delete3DTextLabel(hInfo[id][h_text]);}
    Und ausserdem Wegen dem hier...
    for(new i=0; i<sizeof(hInfo); i++) { OnHausesLoad(); updateHaus(i); }
    Du lässt also OnHausesLoad(); um die 100-500 mal ausführen je nach dem wie viele häuser du hast???
    Also du lässt in einer schleife ne näste schleife machen HÄÄÄ
    machd as mal so XD
    forward Hausupdate();public Hausupdate(){ for(new i=0; i<sizeof(hInfo); i++) { updateHaus(i); } OnHausesLoad(); return 1;}


    wobei vergiss dass ich würd einfach so amchen XD



    forward Hausupdate();
    public Hausupdate()
    {
    OnHausesLoad();
    return 1;
    }


    updateHaus(id)
    {
    new string[128];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else
    {
    hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_BUSBLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    return 1;
    }


    public OnHausesLoad()
    {
    new num_rows;
    cache_get_row_count(num_rows);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeHausID();
    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
    new tmp_name[MAX_PLAYER_NAME];
    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, "id",hInfo[id][h_id]); //Float
    cache_get_value_name_int(i, "h_preis",hInfo[id][h_preis]); //Float
    updateHaus(id);
    }
    return 1;
    }

    Wobei ich wiegesagt nicht ganz verstehe warum du die Häuser nochmal von der Datenbank auslsesen lassen willst...

    Einmal editiert, zuletzt von Mogly1 ()

  • Weil ich ein Control Pandl mir ertellen lassen habe wo man sein Haus verkaufen kann und diese Daten dann auch aktualisiert werden sollen wenn die Daten durchs CP in der Datenbank verändert wird


    // Deine Code ergänzung bringt mir nicht die Lösung.


    Ich will das die Daten also neu aus der Datenbank gelesen werden und angezeigt werden.

    Einmal editiert, zuletzt von robbi2304 ()

  • 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.
    Somit könntest du in einem Timer immer Abfragen ob in den letzten X Sekunden/Minuten ein Datensatz aktualisiert wurde und nur diese Häuser aktualisieren anstatt einfach alle :)

  • 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';
  • Ich habs nun mal probiert und hoffe ich habe es zumindest einigermaßen verstanden.



    forward HausUpdate(id);
    public HausUpdate(id)
    {
    new query[128];
    mysql_format(handle, query, sizeof(query),"SELECT * FROM haus WHERE update = 1;");
    mysql_pquery(handle, query, "HausUpdate2", "i"); //2884
    print(query);
    print("Erfolgreich");
    return 1;
    }
    forward HausUpdate2(id);
    public HausUpdate2(id)
    {
    new query[400];
    format(query,sizeof(query),"UPDATE haus SET update = 0 WHERE id = '%d';");
    mysql_format(handle,query,false,"","");
    print(query);
    print("Erfolgreich2");
    updateHaus(id);
    }


    Kriege nun aber noch Errors aus den Logs


    Code
    [16:11:40] [plugins/mysql] mysql_pquery: callback error: parameter count does not match format specifier length (F:\Projekte 2016\SAMP-Projekte\crass-gaming.eu\Server\16.11.2016\mysql-R41-win32\gamemodes\beispiel.pwn:2884)
    [16:11:51] [plugins/mysql] mysql_pquery: callback error: parameter count does not match format specifier length (F:\Projekte 2016\SAMP-Projekte\crass-gaming.eu\Server\16.11.2016\mysql-R41-win32\gamemodes\beispiel.pwn:2884)
    [16:12:03] [plugins/mysql] mysql_pquery: callback error: parameter count does not match format specifier length (F:\Projekte 2016\SAMP-Projekte\crass-gaming.eu\Server\16.11.2016\mysql-R41-win32\gamemodes\beispiel.pwn:2884)
    [16:12:14] [plugins/mysql] mysql_pquery: callback error: parameter count does not match format specifier length (F:\Projekte 2016\SAMP-Projekte\crass-gaming.eu\Server\16.11.2016\mysql-R41-win32\gamemodes\beispiel.pwn:2884)
  • Hab das ganze nun so gemacht aber scheinbar bin ich da falsch



    forward HausUpdate(id);
    public HausUpdate(id)
    {
    new query[128];
    mysql_format(handle, query, sizeof(query),"SELECT * FROM haus WHERE update = 1");
    mysql_pquery(handle,"HausUpdate2","i","id");
    print(query);
    print("Erfolgreich");
    return 1;
    }
    forward HausUpdate2(id);
    public HausUpdate2(id)
    {
    new query[400];
    format(query,sizeof(query),"UPDATE haus SET update = 0 WHERE id = '%d';");
    mysql_format(handle,query,false,"","id");
    mysql_pquery(handle,query);
    print(query);
    print("Erfolgreich2");
    updateHaus(id);
    }

  • Okay somit ist schonmal das Problem behoben.


    Nun bekomme ich aber noch nen error in den Logs angezeigt


    cache_get_row_count: no active cache


    in



    updateHaus(id)
    {
    new string[128];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else
    {
    hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_BUSBLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    return 1;
    }

  • //Edit



    Das Updaten klappt nun. Nun meine Frage, wenn er das Update durchführt, löscht er den alten Wert nicht. Es wird also immer nur ein neuer Wert hinzugefügt.





    forward HausUpdat();
    public HausUpdat()
    {



    new num_rows;
    cache_get_row_count(num_rows);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id=getFreeHausID();
    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
    new tmp_name[MAX_PLAYER_NAME];
    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, "id",hInfo[id][h_id]); //Float
    cache_get_value_name_int(i, "h_preis",hInfo[id][h_preis]); //Float
    updateHaus(id);



    }
    return 1;
    }



    updateHaus(id)
    {
    new string[128];
    if(hInfo[id][h_pickup] != -1)
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text] != Text3D:-1)
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    hInfo[id][h_pickup]=CreatePickup(1273, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Zum Verkauf\nKosten: %i$\n/hauskaufen", hInfo[id][h_preis]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_RED, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    else
    {
    hInfo[id][h_pickup]=CreatePickup(1239, 1, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], -1);
    format(string,sizeof(string), "Besitzer: %s\n/enter", hInfo[id][h_besitzer]);
    hInfo[id][h_text]=Create3DTextLabel(string, COLOR_BUSBLUE, hInfo[id][h_x], hInfo[id][h_y], hInfo[id][h_z], 10, 0, 1);
    }
    return 1;
    }

    2 Mal editiert, zuletzt von robbi2304 ()

  • 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;
    }

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen