UpdateLabel überschreibt sich

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 Breadfish-Community,


    ich bin gerade das Haussystem von Dini auf MySQL umzuschreiben und ich benötige kleine Hilfe beim Hauskaufen...


    Die Häuser werden erfolgreich geladen bis hier hin gibt's keine Probleme allerdings wenn man das Haus kauft wird der 3D Text nicht geupdatet...


    Enum:

    enum hInfo
    {
    h_id,
    hOwned,
    hOwner[MAX_PLAYER_NAME],
    hDescr[50],
    Float:hEntrx,
    Float:hEntry,
    Float:hEntrz,
    Float:hIntx,
    Float:hInty,
    Float:hIntz,
    hInt,
    hRentable,
    hPrice,
    hRent,
    Text3D:hLabel,
    hPick,
    hIntid,
    hLocked,
    hKasse,
    hDate
    }


    new HouseInfo[MAX_HOUSES][hInfo];



    if(strcmp(cmd, "/hauskaufen", true) == 0 )
    {
    for(new i = 0; i<MAX_HOUSES; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 5.0, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]))
    {
    if(PlayerInfo[playerid][pOwnPerso] == 1)
    {
    if(!HouseInfo[i][hOwned])
    {
    if(GetPlayerMoney(playerid) < HouseInfo[i][hPrice])
    {
    SendClientMessage(playerid, Grey, "Du hast nicht genug Geld!");
    return 1;
    }
    if(PlayerInfo[playerid][pHouseKey] != MAX_HOUSES+1)
    {
    SendClientMessage(playerid, Grey, "Du besitzt bereits ein Haus!");
    return 1;
    }


    PlayerInfo[playerid][pHouseKey] = i;
    GivePlayerMoney(playerid, -HouseInfo[i][hPrice]);
    SendClientMessage(playerid, Grey, "Glückwunsch zum Kauf der Immobilie!");
    new query[56], hname[MAX_PLAYER_NAME];
    GetPlayerName(playerid, hname, sizeof(hname));
    format(query, sizeof(query), "UPDATE haus SET Owned=1, Owner='%s' WHERE id='%i'", hname, HouseInfo[i][h_id]);
    mysql_function_query(dbhandle, query, false, "", "");
    HouseInfo[i][hOwned] = 1;
    GetPlayerName(playerid, sendername, MAX_PLAYER_NAME);
    format(HouseInfo[i][hOwner], MAX_PLAYER_NAME, "%s", sendername);
    UpdateHouseLabel();
    //SaveHouses();
    //PlayerUpdate(playerid);
    PlayerInfo[playerid][pHatIrgenteinHome] = 1;
    return 1;
    }
    }
    else
    {
    SendClientMessage(playerid,COLOR_RED,"Du benötigst erst einen Perso Tipp : Benutze /navi Stadthalle.");
    }
    }
    }
    return 1;
    }


    Hier soll es updaten:

    stock UpdateHouseLabel()
    {
    for(new i = 0; i<MAX_HOUSES; i++)
    {
    new str[128];
    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    UpdateDynamic3DTextLabelText(HouseInfo[i][hLabel], COLOR_HOUSELABEL, str);
    }
    return 1;
    }


    Das ganze basiert sich auch auf dem Streamer (wegen Dynamic etc)...


    Weiß einer woran kann es liegen?



    Wie gesagt es steht der Preis umd zum Verkauf sobald ich '/hauskaufen' betätige wird dadraiuf geschrieben das es mir gehört...


    Lg
    J0a9

  • Ahh, dann sind da zwei Labels aufeinander.


    Mach zuerst mal folgendes:
    UpdateHouseLabel();
    zu:
    UpdateHouseLabel(i);


    Und:
    stock UpdateHouseLabel(i)
    {
    new str[128];
    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    UpdateDynamic3DTextLabelText(HouseInfo[i][hLabel], COLOR_HOUSELABEL, str);
    return 1;
    }


    Dan updatest du nicht immer alle Häuser, sondern nur das eine.


    Dann poste bitte den Code, mit dem du die Häuser und Labels erstellst, und die Daten dazu.

  • Jeffry,


    hier wird das Pickup und Label erstellt:



    forward LoadHouse();
    public LoadHouse()
    {
    new num_fields, num_rows, str[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows == 1)
    {
    for(new i = 0; i<MAX_HOUSES; i++)
    {
    HouseInfo[i][h_id] = cache_get_field_content_int(0,"id",dbhandle);
    HouseInfo[i][hOwned] = cache_get_field_content_int(0,"Owned",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i, "Owner", tmp_name, dbhandle);
    strmid(HouseInfo[i][hOwner], tmp_name, 0, sizeof(tmp_name), sizeof(tmp_name));
    //HouseInfo[i][hDescr] =
    HouseInfo[i][hEntrx] = cache_get_field_content_float(0,"Enterx",dbhandle);
    HouseInfo[i][hEntry] = cache_get_field_content_float(0,"Entery",dbhandle);
    HouseInfo[i][hEntrz] = cache_get_field_content_float(0,"Enterz",dbhandle);
    HouseInfo[i][hIntx] = cache_get_field_content_float(0,"Intx",dbhandle);
    HouseInfo[i][hInty] = cache_get_field_content_float(0,"Inty",dbhandle);
    HouseInfo[i][hIntz] = cache_get_field_content_float(0,"Intz",dbhandle);
    HouseInfo[i][hInt] = cache_get_field_content_int(0,"hInt",dbhandle);
    HouseInfo[i][hRentable] = cache_get_field_content_int(0,"Rentable",dbhandle);
    HouseInfo[i][hPrice] = cache_get_field_content_int(0,"Price",dbhandle);
    HouseInfo[i][hRent] = cache_get_field_content_int(0,"Rent",dbhandle);
    HouseInfo[i][hIntid] = cache_get_field_content_int(0,"Intid",dbhandle);
    HouseInfo[i][hLocked] = cache_get_field_content_int(0,"Locked",dbhandle);
    HouseInfo[i][hKasse] = cache_get_field_content_int(0,"Kasse",dbhandle);
    HouseInfo[i][hDate] = cache_get_field_content_int(0,"Date",dbhandle);


    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    HouseInfo[i][hLabel] = CreateDynamic3DTextLabel(str, COLOR_HOUSELABEL, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz], 15, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, -1, -1, -1, 15);
    if(!HouseInfo[i][hOwned]) HouseInfo[i][hPick] = CreatePickup(1273, 1,HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    else HouseInfo[i][hPick] = CreatePickup(19522, 1, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);


    }
    }
    return 1;
    }


    Lg
    J0a9

  • Du hast immer nur Zeile 0 ausgelesen.
    Schreibe es so:
    forward LoadHouse();
    public LoadHouse()
    {
    new num_fields, num_rows, str[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows > 0)
    {
    for(new i = 0; i<num_rows; i++)
    {
    HouseInfo[i][h_id] = cache_get_field_content_int(i,"id",dbhandle);
    HouseInfo[i][hOwned] = cache_get_field_content_int(i,"Owned",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i, "Owner", tmp_name, dbhandle);
    strmid(HouseInfo[i][hOwner], tmp_name, i, sizeof(tmp_name), sizeof(tmp_name));
    //HouseInfo[i][hDescr] =
    HouseInfo[i][hEntrx] = cache_get_field_content_float(i,"Enterx",dbhandle);
    HouseInfo[i][hEntry] = cache_get_field_content_float(i,"Entery",dbhandle);
    HouseInfo[i][hEntrz] = cache_get_field_content_float(i,"Enterz",dbhandle);
    HouseInfo[i][hIntx] = cache_get_field_content_float(i,"Intx",dbhandle);
    HouseInfo[i][hInty] = cache_get_field_content_float(i,"Inty",dbhandle);
    HouseInfo[i][hIntz] = cache_get_field_content_float(i,"Intz",dbhandle);
    HouseInfo[i][hInt] = cache_get_field_content_int(i,"hInt",dbhandle);
    HouseInfo[i][hRentable] = cache_get_field_content_int(i,"Rentable",dbhandle);
    HouseInfo[i][hPrice] = cache_get_field_content_int(i,"Price",dbhandle);
    HouseInfo[i][hRent] = cache_get_field_content_int(i,"Rent",dbhandle);
    HouseInfo[i][hIntid] = cache_get_field_content_int(i,"Intid",dbhandle);
    HouseInfo[i][hLocked] = cache_get_field_content_int(i,"Locked",dbhandle);
    HouseInfo[i][hKasse] = cache_get_field_content_int(i,"Kasse",dbhandle);
    HouseInfo[i][hDate] = cache_get_field_content_int(i,"Date",dbhandle);

    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    HouseInfo[i][hLabel] = CreateDynamic3DTextLabel(str, COLOR_HOUSELABEL, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz], 15, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, -1, -1, -1, 15);
    if(!HouseInfo[i][hOwned]) HouseInfo[i][hPick] = CreatePickup(1273, 1,HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    else HouseInfo[i][hPick] = CreatePickup(19522, 1, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);

    }
    }
    return 1;
    }

  • es klappt immer noch nicht...
    Es wird nicht geupdatet es wird einfach da drauf geschrieben...


    Soll ich es mal ohne "UpdateDynamic3DTextLabelText" und "CreateDynamic3DTextLabel" verwenden sondern das normale
    also mit "Updates3DTextLabelText"?


    Macht es einen unterschied?


    Lg
    J0a9

  • Was steht so im Server Log?
    forward LoadHouse();
    public LoadHouse()
    {
    new num_fields, num_rows, str[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows > 0)
    {
    for(new i = 0; i<num_rows; i++)
    {
    printf("Lade: %d", i);
    HouseInfo[i][h_id] = cache_get_field_content_int(i,"id",dbhandle);
    HouseInfo[i][hOwned] = cache_get_field_content_int(i,"Owned",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i, "Owner", tmp_name, dbhandle);
    strmid(HouseInfo[i][hOwner], tmp_name, i, sizeof(tmp_name), sizeof(tmp_name));
    //HouseInfo[i][hDescr] =
    HouseInfo[i][hEntrx] = cache_get_field_content_float(i,"Enterx",dbhandle);
    HouseInfo[i][hEntry] = cache_get_field_content_float(i,"Entery",dbhandle);
    HouseInfo[i][hEntrz] = cache_get_field_content_float(i,"Enterz",dbhandle);
    HouseInfo[i][hIntx] = cache_get_field_content_float(i,"Intx",dbhandle);
    HouseInfo[i][hInty] = cache_get_field_content_float(i,"Inty",dbhandle);
    HouseInfo[i][hIntz] = cache_get_field_content_float(i,"Intz",dbhandle);
    HouseInfo[i][hInt] = cache_get_field_content_int(i,"hInt",dbhandle);
    HouseInfo[i][hRentable] = cache_get_field_content_int(i,"Rentable",dbhandle);
    HouseInfo[i][hPrice] = cache_get_field_content_int(i,"Price",dbhandle);
    HouseInfo[i][hRent] = cache_get_field_content_int(i,"Rent",dbhandle);
    HouseInfo[i][hIntid] = cache_get_field_content_int(i,"Intid",dbhandle);
    HouseInfo[i][hLocked] = cache_get_field_content_int(i,"Locked",dbhandle);
    HouseInfo[i][hKasse] = cache_get_field_content_int(i,"Kasse",dbhandle);
    HouseInfo[i][hDate] = cache_get_field_content_int(i,"Date",dbhandle);

    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    HouseInfo[i][hLabel] = CreateDynamic3DTextLabel(str, COLOR_HOUSELABEL, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz], 15, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, -1, -1, -1, 15);
    printf("Label %d an %f / %f / %f erstellt.", _:HouseInfo[i][hLabel], HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    if(!HouseInfo[i][hOwned]) HouseInfo[i][hPick] = CreatePickup(1273, 1,HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    else HouseInfo[i][hPick] = CreatePickup(19522, 1, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    }
    }
    return 1;
    }

  • Serverlog:


  • bei Gamemodeinit habe ich:


    HausConnect();


    Und das dazugehärige Public:

    forward HausConnect();
    public HausConnect()
    {
    new query[56];
    format(query, sizeof(query), "SELECT * FROM haus");
    mysql_function_query(dbhandle, query, true, "LoadHouse", "");
    return 1;
    }


    Lg
    J0a9

  • Nein sonst steht das nirgends.


    Wie gesagt ich habe unter GameModeInit "HausConnect()" gemacht da hab ich auch ein Pulic gemacht zum laden
    und zum aufrufen der "LoadHouse".


    Ich verstehe nur nicht was jetzt HausConnect() mit den Labels zu tun hat...
    Unter LoadHouse werden die Häuser geladen und ggf. falls es Häuser gibt das Pickup und das Label gesetzt, nur
    beim Updaten ist es fail, soweit ich es verstehe.


    //Edit:
    Ich hatte auch versucht das Label bei "UpdateHouseLabel" zu löschen und dann neu zu setzten hat aber ebenfalls nicht geklapt... :(


    Lg
    J0a9

  • forward LoadHouse();
    public LoadHouse()
    {
    static bool:called;
    if(called) return 1;
    called = true;
    new num_fields, num_rows, str[128];
    cache_get_data(num_rows,num_fields,dbhandle);
    if(num_rows > 0)
    {
    for(new i = 0; i<num_rows; i++)
    {
    printf("Lade: %d", i);
    HouseInfo[i][h_id] = cache_get_field_content_int(i,"id",dbhandle);
    HouseInfo[i][hOwned] = cache_get_field_content_int(i,"Owned",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i, "Owner", tmp_name, dbhandle);
    strmid(HouseInfo[i][hOwner], tmp_name, i, sizeof(tmp_name), sizeof(tmp_name));
    //HouseInfo[i][hDescr] =
    HouseInfo[i][hEntrx] = cache_get_field_content_float(i,"Enterx",dbhandle);
    HouseInfo[i][hEntry] = cache_get_field_content_float(i,"Entery",dbhandle);
    HouseInfo[i][hEntrz] = cache_get_field_content_float(i,"Enterz",dbhandle);
    HouseInfo[i][hIntx] = cache_get_field_content_float(i,"Intx",dbhandle);
    HouseInfo[i][hInty] = cache_get_field_content_float(i,"Inty",dbhandle);
    HouseInfo[i][hIntz] = cache_get_field_content_float(i,"Intz",dbhandle);
    HouseInfo[i][hInt] = cache_get_field_content_int(i,"hInt",dbhandle);
    HouseInfo[i][hRentable] = cache_get_field_content_int(i,"Rentable",dbhandle);
    HouseInfo[i][hPrice] = cache_get_field_content_int(i,"Price",dbhandle);
    HouseInfo[i][hRent] = cache_get_field_content_int(i,"Rent",dbhandle);
    HouseInfo[i][hIntid] = cache_get_field_content_int(i,"Intid",dbhandle);
    HouseInfo[i][hLocked] = cache_get_field_content_int(i,"Locked",dbhandle);
    HouseInfo[i][hKasse] = cache_get_field_content_int(i,"Kasse",dbhandle);
    HouseInfo[i][hDate] = cache_get_field_content_int(i,"Date",dbhandle);

    if(!HouseInfo[i][hOwned]) format(str, sizeof str, "%s\nZum Verkauf\nPreis: %d€", HouseInfo[i][hDescr], HouseInfo[i][hPrice]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 0) format(str, sizeof str, "%s\nBesitzer: %s",HouseInfo[i][hDescr], HouseInfo[i][hOwner]);
    else if(HouseInfo[i][hOwned] && HouseInfo[i][hRentable] == 1) format(str, sizeof str, "%s\nBesitzer: %s\nMiete: %d$\n/mieten zum Mieten",HouseInfo[i][hDescr], HouseInfo[i][hOwner], HouseInfo[i][hRent]);
    HouseInfo[i][hLabel] = CreateDynamic3DTextLabel(str, COLOR_HOUSELABEL, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz], 15, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 1, -1, -1, -1, 15);
    printf("Label %d an %f / %f / %f erstellt.", _:HouseInfo[i][hLabel], HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    if(!HouseInfo[i][hOwned]) HouseInfo[i][hPick] = CreatePickup(1273, 1,HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    else HouseInfo[i][hPick] = CreatePickup(19522, 1, HouseInfo[i][hEntrx], HouseInfo[i][hEntry], HouseInfo[i][hEntrz]);
    }
    }
    return 1;
    }


    Dann sollte es so passen.
    Poste gegebenefalls nochmal den Log.

  • Anscheinend lag es doch beim LoadHouses, es klappt nun einwandfrei!


    Ja, es wurde - wie der Log zeigt - mit jedem Spieler-Connect aufgerufen. Da wir nicht wissen warum, habe ich es jetzt so unterbunden, dass es nochmal aufgerufen wird.


    static bool:called; //Bleibt im Wert erhalten, da static
    if(called) return 1; //Wenn es einmal aufgerufen wurde, dann beende es sofort
    called = true; //Erster Aufruf, danach kommt er hier nicht mehr hin.


    Damit du auch weißt, warum es klappt.

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