Haus System frage

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
  • Hi,


    nun geht es. Wieso war ich so doof und schreibe dort den Enum Namen rein :D


    Kannst du mir vielleicht noch erklären wie ich das mit dem /Deletehouse mache?
    Wie beschrieben, das Haus, dass in der Nähe von mir ist(3.0 Radius) soll gelöscht werden.


    Spoiler anzeigen
    ocmd:deletehouse(playerid, params[])
    {
    new Float:dPos[3];
    GetPlayerPos(playerid, dPos[0],dPos[1],dPos[2]);
    if(SpielerInfo[playerid][pAdmin] < 5) return SendClientMessage(playerid, error, "Du bist kein Admin!");
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosY],hInfo[i][PosX],hInfo[i][PosZ]))
    {

    hInfo[i][PosX] = 0;
    hInfo[i][PosY] = 0;
    hInfo[i][PosZ] = 0;
    hInfo[i][IntX] = 0;
    hInfo[i][IntY] = 0;
    hInfo[i][IntZ] = 0;
    hInfo[i][IntID] = 0;
    hInfo[i][VID] = 0;
    hInfo[i][Level] = 0;
    hInfo[i][Kaufpreis] = 0;
    hInfo[i][Mietpreis] = 0;
    hInfo[i][Gekauft] = 0;
    hInfo[i][Lock] = 0;

    Spoiler anzeigen
    new query[128];
    format(query, sizeof(query), "DELETE FROM House WHERE ID = '%d'", i);
    mysql_tquery(handle, query);
    return SendClientMessage(playerid, erfolg, "Haus wurde erfolgreich gelöscht.");
    }
    else {
    SendClientMessage(playerid, error, "Du bist nicht in der Nähe eines Hauses!");
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen


    Jeffry:



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • ocmd:deletehouse(playerid, params[])
    {
    if(SpielerInfo[playerid][pAdmin] < 5) return SendClientMessage(playerid, error, "Du bist kein Admin!");
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosY],hInfo[i][PosX],hInfo[i][PosZ]))
    {
    format(hInfo[i][Besitzer], 34, "");
    hInfo[i][PosX] = 0;
    hInfo[i][PosY] = 0;
    hInfo[i][PosZ] = 0;
    hInfo[i][IntX] = 0;
    hInfo[i][IntY] = 0;
    hInfo[i][IntZ] = 0;
    hInfo[i][IntID] = 0;
    hInfo[i][VID] = 0;
    hInfo[i][Level] = 0;
    hInfo[i][Kaufpreis] = 0;
    hInfo[i][Mietpreis] = 0;
    hInfo[i][Gekauft] = 0;
    hInfo[i][Lock] = 0;

    //Hier noch das Pickup etc löschen.

    new query[128];
    format(query, sizeof(query), "DELETE FROM House WHERE ID = '%d'", i);
    mysql_tquery(handle, query);
    return SendClientMessage(playerid, erfolg, "Haus wurde erfolgreich gelöscht.");
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe eines Hauses!");;
    }

  • Leider kommt immer "Du bist nicht in der Nähe eines Hauses" (Dieses Problem hatte ich davor schon ^^)


    Und das Pickup lösche ich so oder?:


    DestroyPickup(i);


    Jeffry:


    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Dann bist du nicht in der Nähe des Hauses.


    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosY],hInfo[i][PosX],hInfo[i][PosZ]))
    zu:
    printf("Haus Pos: %f / %f / %f", hInfo[i][PosY],hInfo[i][PosX],hInfo[i][PosZ]);
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid, x, y, z);
    printf("Spieler Pos: %f / %f / %f", x, y, z);
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosY],hInfo[i][PosX],hInfo[i][PosZ]))
    Was wird geprintet?



    Nein, mit:
    DestroyPickup(hInfo[i][pick_ID]);
    Zum Beispiel. Natürlich musst du es auch so erstellen.



  • Waren die Kord. vertauscht ^^
    Es war YXZ, hab dann einfach XYZ gemacht :p
    Nun funktioniert es :)


    Danke!


    Beim Enter und /Buy befehl, einfach abfragen bei welchem Haus er steht und dann meine Sachen hinschreiben oder?
    Jeffry:


    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Oh ja das stimmt, hat mich jetzt voll gewundert dass ich das übersehen habe ^^


    Wie kann ich abfragen, ob der Spieler der in der Nähe eines Hauses steht, auch der Besitzer davon ist?
    Wegen meinem Sellhouse :o


    ocmd:sellhouse(playerid, params[])
    {
    new string[64];
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(hInfo[i][Gekauft] != 1) return SendClientMessage(playerid, error, "Dieses Haus kannst du nicht verkaufen!");
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    hInfo[i][Gekauft] = 0;
    format(hInfo[i][Besitzer], 34, "%s",SpielerName(playerid));
    format(string, sizeof(string), "Besitzer: Niemand\nPreis: %d\nLevel: %d",hInfo[i][Kaufpreis],hInfo[i][Level]);
    Update3DTextLabelText(hInfo[i][Houselable], 0xB90000FF, string);
    GivePlayerMoney(playerid, hInfo[i][Kaufpreis]);
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe deines Hauses!");
    }
    }
    return 1;
    }


    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • ocmd:sellhouse(playerid, params[])
    {
    new string[64];
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    if(hInfo[i][Gekauft] != 1) return SendClientMessage(playerid, error, "Dieses Haus kannst du nicht verkaufen!");
    if(strcmp(hInfo[i][Besitzer], SpielerName(playerid))) return SendClientMessage(playerid, error, "Dieses Haus gehört nicht dir!");
    hInfo[i][Gekauft] = 0;
    format(hInfo[i][Besitzer], 34, "");
    format(string, sizeof(string), "Besitzer: Niemand\nPreis: %d\nLevel: %d",hInfo[i][Kaufpreis],hInfo[i][Level]);
    Update3DTextLabelText(hInfo[i][Houselable], 0xB90000FF, string);
    GivePlayerMoney(playerid, hInfo[i][Kaufpreis]);
    return 1;
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe deines Hauses!");
    }

  • Perfekt!


    Danke dir Jeffry:


    Kleines Problem, bei meinem Exit befehl.
    ocmd:exit(playerid, params[])
    {
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][IntX],hInfo[i][IntY],hInfo[i][IntZ]))
    {
    SetPlayerPos(playerid, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe eines Hauses!");
    }


    Ich geh in mein Haus rein, mache /exit und komme an einem anderen Haus raus, wieso :D?


    //edit:
    Zweites Problem behoben, hatte immer "Besitzer" leer beim erstellen, jedoch besteht das Problem mit dem Spawn immer noch.
    Mit freundlichen Grüßen
    Jeffry:



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

    2 Mal editiert, zuletzt von ENEF () aus folgendem Grund: Jeffry & Code hinzugefügt

  • Hast du es mal so versucht?
    ocmd:exit(playerid, params[])
    {
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][IntX],hInfo[i][IntY],hInfo[i][IntZ]))
    {
    SetPlayerPos(playerid, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]);
    SetPlayerInterior(playerid, 0);
    SetPlayerVirtualWorld(playerid, 0);
    return 1;
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe eines Hauses!");
    }


    Stimmen die Koordinaten auch überein, oder hast du vielleicht falsche eingetragen?

  • Hm auf einmal geht es so wie du es geschrieben hast :D


    Lag es an dem Return 1?



    Kleine Frage zum Thema mieten.
    Muss ich jetzt eine neue Spalte erstellen?
    ich denk mal mit varchar oder? aber kann man da nicht immer nur 1 name rein speichern :o?



    MfG



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Ja.


    Zwecks dem Mieten:
    Es wäre besser, eine neue Tabelle "Mieter" anzulegen, in der du die Haus ID und den Mieter-Name speicherst. So kannst du beliebig viele Mieter haben:
    1 | Hans
    1 | Horst
    2 | Fritz
    1 | Fritz
    3 | Tom
    2 | Horst
    1 | Tom
    ...

  • Okey.


    Soll ich dann in das Enum der Häuser noch
    Mieter[34]
    hinzufügen?
    Dann eine neue Tabelle erstellen und die dann dort speichern lassen?



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Wenn du unbegrenzt viele Mieter pro Haus haben willst, dann musst du ohne Variablen arbeiten, und bei einer Mieter-Abfrage direkt die Datenbank ansprechen, mit einem SELECT auf die Mietertabelle.
    Wenn du eine begrenzte Anzahl hast, musst du diese natürlich aus der Datenbank laden und vorher den Speicher als multidimensionales Array (Mieter[MAX_HAUS][MAX_MIETER][34]) reservieren.

  • Hört sich alles ziemlich kompliziert an ^^



    Also ich habs jetzt mal so versucht:
    #define MAX_MIETER 3
    new Mieter[MAX_HOUSE][MAX_MIETER][24];


    Und dann das mit der Tabelle erstellen wie beim Haus

    Spoiler anzeigen
    CreateMieterTable()
    {
    new query[256];
    format(query, sizeof(query), "CREATE TABLE IF NOT EXISTS `Mieter` (");
    format(query, sizeof(query), "%s`ID` int(11) NOT NULL PRIMARY KEY,", query);
    format(query, sizeof(query), "%s `Mieter` varchar(24) NOT NULL DEFAULT '0',", query);
    return 1;
    }

    LoadMieter
    Spoiler anzeigen
    LoadMieter()
    {
    CreateMieterTable();
    mysql_tquery(handle, "SELECT * FROM Mieter ORDER BY ID ASC", "LoadMieter_Data");
    return 1;
    }


    Und hier gibt es schon Probleme :D

    Spoiler anzeigen
    forward LoadMieter_Data();
    public LoadMieter_Data()
    {
    new rows;
    rows = cache_num_rows();
    for(new i=0; i<rows; i++)
    {
    cache_get_field_content(i, "Mieter", Mieter[MAX_HOUSE][MAX_MIETER][24],handle);
    }
    return 1;
    }

    Ist das alles bis jetzt richtig? Nein oder :D
    Ich bekomme nämlich schon hier:
    cache_get_field_content(i, "Mieter", Mieter[MAX_HOUSE][MAX_MIETER][24],handle);
    error 032: array index out of bounds (variable "Mieter")
    Diesen Error :x


    Nunja, irgendwie check ich es dann auch nicht beim Mieten Befehl, ist wohl etwas zu kompliziert grad für mich ^^


    Mit freundlichen Grüßen


    Jeffry:



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Wenn du nur 3 Mieter hast, dann mach einfach in deine andere Tabelle die Spalten "Mieter1", "Mieter2" und "Mieter3" rein, das passt dann. Ist zwar nicht mehr in der Normalform einer Datenbank dann, aber für die Anwendung reicht es allemal.
    Und dann kannst du es wie den Owner laden, eben Mieter1 bis 3.

  • Okey, hab ich jetzt so gemacht.


    Beim Command hab ich eine Frage.
    Wie mache ich es, wenn erstens alle Mieter schon belegt sind?
    Und wenn Mieter1 Belegt ist, dass er den Name dann bei Mieter 2 einträgt?



    Mit freundlichen Grüßen


    Jeffry:



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Hi Jeffry,


    wahrscheinlich bin ich wieder zu doof :D


    Aber wenn ich Mieten will, sagt er mir das dieses Haus voll ist also damit alle Mieter schon belegt sind.


    ocmd:mieten(playerid, params[])
    {
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(hInfo[i][Gekauft] != 1) return SendClientMessage(playerid, error, "Dieses Haus kannst du nicht Mieten!");
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    if(!strlen(hInfo[i][Mieter1])) return format(hInfo[i][Mieter1], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 1");
    else if(!strlen(hInfo[i][Mieter2])) return format(hInfo[i][Mieter2], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 2");
    else if(!strlen(hInfo[i][Mieter3])) return format(hInfo[i][Mieter3], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 3");
    else {
    SendClientMessage(playerid, error, "Du kannst hier nicht Mieten! Dieses Haus ist voll.");
    return 1;
    }
    }
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe eines Hauses!");
    }


    PS:
    Wie kann ich abfragen ob der Spieler schon besitzer eines Hauses ist, oder ob er schon irgendwo mietet?
    Das er halt davor /kündigen muss ?
    Und beim Payday noch so ne Sache, damit der Spieler die Miete abgezogen bekommt?


    Jeffry:
    Mit freundlichen Grüßen



    Die heutigen Noobs, sind die Profis von morgen! :thumbup:


    Danke an Jeffry für seine ständige Hilfsbereitschaft und freundliche Art. 8)

  • Möglicherweise hast du schon was drin stehen.
    Was steht im Log, wenn du es so schreibst?
    ocmd:mieten(playerid, params[])
    {
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(hInfo[i][Gekauft] != 1) return SendClientMessage(playerid, error, "Dieses Haus kannst du nicht Mieten!");
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    printf("'%s' | '%s' | '%s'", hInfo[i][Mieter1], hInfo[i][Mieter2], hInfo[i][Mieter3]);
    printf("'%d' | '%d' | '%d'", strlen(hInfo[i][Mieter1]), strlen(hInfo[i][Mieter2]), strlen(hInfo[i][Mieter3]));
    if(!strlen(hInfo[i][Mieter1])) return format(hInfo[i][Mieter1], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 1");
    else if(!strlen(hInfo[i][Mieter2])) return format(hInfo[i][Mieter2], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 2");
    else if(!strlen(hInfo[i][Mieter3])) return format(hInfo[i][Mieter3], 34, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 3");
    else
    {
    SendClientMessage(playerid, error, "Du kannst hier nicht Mieten! Dieses Haus ist voll.");
    return 1;
    }
    }
    }
    }

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