Hilfe mit Haus System

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
  • Guten Tag Community!
    Ich brauche Hilfe mit mein Haus System.
    Wenn ich ein Haus erstelle ist noch alles richtig, aber ich kann es nicht sofort kaufen erst nach dem Restart.
    So wenn ich es kaufe und den Server restarte, kann man das Haus wieder kaufen obwohl ich in der Datenbank als Besitzer drinne stehe.
    Wenn man es erstellt ist auch der 3DLabelText so wie wenn man es kaufen kann und das pickup ist auch grün,
    wenn man es Kauft ändert sich der Label und das Pickup auch. Soweit geht alles.
    Wenn ich den Server restarte ist das Pickup wieder grün und der text ist so, ob man das Haus erstellt hat.
    Nun gut hier ist der Code:


    public LoadHaus()
    {
    new num_rows,num_fields;
    cache_get_data(num_rows,num_fields,dbhandle);
    if(!num_rows)return 1;
    for(new i=0; i<num_rows; i++)
    {
    new id = GetFreeHouseID();
    hInfo[id][hx] = cache_get_field_content_float(i,"hx",dbhandle);
    hInfo[id][hy] = cache_get_field_content_float(i,"hy",dbhandle);
    hInfo[id][hz] = cache_get_field_content_float(i,"hz",dbhandle);
    hInfo[id][i_x] = cache_get_field_content_float(i,"ix",dbhandle);
    hInfo[id][i_y] = cache_get_field_content_float(i,"iy",dbhandle);
    hInfo[id][i_z] = cache_get_field_content_float(i,"iz",dbhandle);
    hInfo[id][h_interior] = cache_get_field_content_int(i,"h_interior",dbhandle);
    new tmp_name[MAX_PLAYER_NAME];
    strmid(hInfo[id][h_besitzer],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));
    cache_get_field_content(i,"h_besitzer",tmp_name,dbhandle);
    hInfo[id][h_level] = cache_get_field_content_int(i,"kauflevel",dbhandle);
    hInfo[id][h_preis] = cache_get_field_content_int(i,"kaufpreis",dbhandle);
    hInfo[id][db_id] = cache_get_field_content_int(i,"id",dbhandle);
    UpdateHaus(id);
    printf("Haus %d wurde erfolgreich Geladen.",id);
    }
    return 1;
    }


    UpdateHaus(id)
    {
    new string[250];
    if(hInfo[id][h_pickup])
    {
    DestroyPickup(hInfo[id][h_pickup]);
    }
    if(hInfo[id][h_text])
    {
    Delete3DTextLabel(hInfo[id][h_text]);
    }
    if(!strlen(hInfo[id][h_besitzer]))
    {
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}-unbekannt-\n\
    {007AFF}Level: {FEFEFE}%d\n\
    {007AFF}Kaufpreis: {FEFEFE}%d$\n\
    {007AFF}Beschreibung: {FEFEFE}Dieses Haus steht zum Verkauf.\n\n\
    Benutze /buyhouse um das Haus zu kaufen",
    hInfo[id][h_level],hInfo[id][h_preis]);
    hInfo[id][h_pickup] = CreatePickup(1273, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    print("UpdateHaus ohne Besitzer wurde aufgerufen");
    }
    else
    {
    format(string,250,"\
    {007AFF}Besitzer: {FEFEFE}%s\n\
    {007AFF}Level: {FEFEFE}%d\n\
    {007AFF}Miete: {FEFEFE}0$",
    hInfo[id][h_besitzer],hInfo[id][h_level]);
    hInfo[id][h_pickup] = CreatePickup(1272, 1, hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],-1);
    hInfo[id][h_text] = Create3DTextLabel(string,COLOR_ROT,hInfo[id][hx],hInfo[id][hy],hInfo[id][hz],10,0,1);
    print("UpdateHaus mit Besitzer wurde aufgerufen");
    }
    return 1;
    }


    ocmd:createhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht Eingeloggt!");
    if(pInfo[playerid][pAdmin] <6)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht befugt diesen Befehl zu nutzen!");
    new klevel,kpreis;
    if(sscanf(params,"ii",klevel,kpreis))return SCM(playerid,COLOR_GRAU,"INFO: /createhouse [kauflevel] [kaufpreis]");
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);

    new query[250];
    new id = GetFreeHouseID();
    hInfo[id][hx] = x;
    hInfo[id][hy] = y;
    hInfo[id][hz] = z;
    hInfo[id][i_x] = 0.0;
    hInfo[id][i_y] = 0.0;
    hInfo[id][i_z] = 0.0;
    hInfo[id][h_interior] = 0;
    hInfo[id][h_level] = klevel;
    hInfo[id][h_preis] = kpreis;
    strmid(hInfo[id][h_besitzer], "",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(query,250,"INSERT INTO haus (hx,hy,hz,ix,iy,iz,h_interior,kauflevel,kaufpreis) VALUES ('%f','%f','%f','0.0','0.0','0.0','0','%i','%i')",
    x,y,z,klevel,kpreis);
    mysql_function_query(dbhandle,query,true,"CreateHaus","i",id);
    UpdateHaus(id);
    printf("%s",query);
    return 1;
    }


    ocmd:buyhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    if(HasPlayerHaus(playerid))return SendClientMessage(playerid,COLOR_GRAU,"Du hast bereits ein Haus.");
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(!strlen(hInfo[i][h_besitzer]))
    {
    if(GetPlayerMoney(playerid) < hInfo[i][h_preis])return SCM(playerid,COLOR_GRAU,"Du hast nicht genügend Geld für das Haus!");
    if(GetPlayerScore(playerid) < hInfo[i][h_level])return SCM(playerid,COLOR_GRAU,"Du hast nicht das nötige Level für das Haus!");
    GivePlayerMoney(playerid,-hInfo[i][h_preis]);
    strmid(hInfo[i][h_besitzer], SpielerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(string,128,"** Du hast das Haus erfolgreich für %d$ gekauft. **",hInfo[i][h_preis]);
    SCM(playerid,COLOR_GELB,string);
    UpdateHaus(i);
    SaveHaus(i);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Dieses Haus ist bereits verkauft.");
    }
    return 1;
    }

  • Haus wieder kaufen Problem:
    new tmp_name[MAX_PLAYER_NAME];
    strmid(hInfo[id][h_besitzer],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));
    cache_get_field_content(i,"h_besitzer",tmp_name,dbhandle);

    zu:
    new tmp_name[MAX_PLAYER_NAME];
    cache_get_field_content(i,"h_besitzer",tmp_name,dbhandle);
    strmid(hInfo[id][h_besitzer],tmp_name,0,sizeof(tmp_name),sizeof(tmp_name));

    in LoadHaus.


    Zwecks des anderen Problems:
    Poste bitte die CreateHaus Funktion.


    PS: Als kleine Anmerkung: Einen Code in Denglisch zu schreiben ist nicht gerade toll, da kommt man sehr oft durcheinander. Besser wäre "LoadHouse" oder "LadeHaus", ebenso für die anderen Funktionen. ;)

  • Bekommst du eine Nachricht, wenn du das Haus kaufen willst, es aber nicht geht?
    Wenn nein, dann füge mal das hier in den Befehl nach
    for(new i=0; i<sizeof(hInfo); i++)
    {

    ein:
    printf("dbid: %d / besitzer: %s", hInfo[i][db_id], hInfo[i][h_besitzer];


    Was wird dann geprintet?

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Habe das "printf" in den buyhouse Befehl rein gemacht.
    So wenn ich /buyhouse eingebe passiert nix, er printet auch nix.


    ocmd:buyhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    if(HasPlayerHaus(playerid))return SendClientMessage(playerid,COLOR_GRAU,"Du hast bereits ein Haus.");
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(!strlen(hInfo[i][h_besitzer]))
    {
    if(GetPlayerMoney(playerid) < hInfo[i][h_preis])return SCM(playerid,COLOR_GRAU,"Du hast nicht genügend Geld für das Haus!");
    if(GetPlayerScore(playerid) < hInfo[i][h_level])return SCM(playerid,COLOR_GRAU,"Du hast nicht das nötige Level für das Haus!");
    GivePlayerMoney(playerid,-hInfo[i][h_preis]);
    strmid(hInfo[i][h_besitzer], SpielerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(string,128,"** Du hast das Haus erfolgreich für %d$ gekauft. **",hInfo[i][h_preis]);
    SCM(playerid,COLOR_GELB,string);
    UpdateHaus(i);
    SaveHaus(i);
    printf("dbid: %d / besitzer: %s", hInfo[i][db_id], strlen(hInfo[i][h_besitzer]));
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Dieses Haus ist bereits verkauft.");
    }
    return 1;
    }

  • Du hast es an die falsche Stelle gesetzt:
    ocmd:buyhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    if(HasPlayerHaus(playerid))return SendClientMessage(playerid,COLOR_GRAU,"Du hast bereits ein Haus.");
    for(new i=0; i<sizeof(hInfo); i++)
    {
    printf("i: %d / dbid: %d / besitzer: %s / near: %d", i, hInfo[i][db_id], hInfo[i][h_besitzer], IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]));
    if(!hInfo[i][db_id])continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(!strlen(hInfo[i][h_besitzer]))
    {
    if(GetPlayerMoney(playerid) < hInfo[i][h_preis])return SCM(playerid,COLOR_GRAU,"Du hast nicht genügend Geld für das Haus!");
    if(GetPlayerScore(playerid) < hInfo[i][h_level])return SCM(playerid,COLOR_GRAU,"Du hast nicht das nötige Level für das Haus!");
    GivePlayerMoney(playerid,-hInfo[i][h_preis]);
    strmid(hInfo[i][h_besitzer], SpielerName(playerid),0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(string,128,"** Du hast das Haus erfolgreich für %d$ gekauft. **",hInfo[i][h_preis]);
    SCM(playerid,COLOR_GELB,string);
    UpdateHaus(i);
    SaveHaus(i);
    return 1;
    }
    return SCM(playerid,COLOR_GRAU,"Dieses Haus ist bereits verkauft.");
    }
    return 1;
    }


    Hab auch gleich noch etwas dazugefügt, kann vielleicht nützlich sein.

  • So nun kam das raus:


  • Ok, sehr gut.
    War das jetzt das allererste Haus welches du erstellt hast, also war zuvor noch keins in der Datenbank? Wenn ja, poste bitte die GetFreeHouseID Funktion.
    Wenn nein, welches dann? Poste dann ebenfalls die GetFreeHouseID Funktion.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Hmm. Nimm folgenden Code:
    ocmd:createhouse(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht Eingeloggt!");
    if(pInfo[playerid][pAdmin] <6)return SendClientMessage(playerid,COLOR_GRAU,"Du bist nicht befugt diesen Befehl zu nutzen!");
    new klevel,kpreis;
    if(sscanf(params,"ii",klevel,kpreis))return SCM(playerid,COLOR_GRAU,"INFO: /createhouse [kauflevel] [kaufpreis]");
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);

    new query[250];
    new id = GetFreeHouseID();
    hInfo[id][hx] = x;
    hInfo[id][hy] = y;
    hInfo[id][hz] = z;
    hInfo[id][i_x] = 0.0;
    hInfo[id][i_y] = 0.0;
    hInfo[id][i_z] = 0.0;
    hInfo[id][h_interior] = 0;
    hInfo[id][h_level] = klevel;
    hInfo[id][h_preis] = kpreis;
    strmid(hInfo[id][h_besitzer], "",0,MAX_PLAYER_NAME,MAX_PLAYER_NAME);
    format(query,250,"INSERT INTO haus (hx,hy,hz,ix,iy,iz,h_interior,kauflevel,kaufpreis) VALUES ('%f','%f','%f','0.0','0.0','0.0','0','%i','%i')",
    x,y,z,klevel,kpreis);
    printf("create: id: %d", id);
    mysql_function_query(dbhandle,query,true,"CreateHaus","i",id);
    UpdateHaus(id);
    printf("%s",query);
    return 1;
    }


    public CreateHouse(id)
    {
    hInfo[id][db_id]=cache_insert_id();
    printf("function: %d -> %d", id,hInfo[id][db_id]);
    return 1;
    }


    Dann erstelle 2 Häuser ein paar Meter voneinander entfernt. Dann versuche das zweite Haus zu kaufen. Dann poste den Log von beiden prints.

  • Also nun folgendes, wenn ich 1 Haus erstelle geht es.
    Sobald ich noch eins erstelle geht das andere weg, aber in der Datenbank ist es weiterhin.
    Kaufen geht leider noch nicht.


  • Aaah und ich sags vorhin noch :wacko:
    mysql_function_query(dbhandle,query,true,"CreateHaus","i",id);
    zu:
    mysql_function_query(dbhandle,query,true,"CreateHouse","i",id);


    Dann dürfte es klappen.


    Das solltest du dringends vereinheitlichen. Entweder englisch oder deutsch.