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
  • Jap, ich hatte bei Createhouse den Besitzer zu 'Niemand' gemacht ^^
    Habs raus nun geht es.


    Aber wie gesagt, ich kann mich jetzt 3 mal einmieten und auch als Besitzer eines Hauses mieten, das soll ja nicht sein :/


    Und die Sache mit Payday, damit er bei dem Haus wo er wohnt das Geld(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)

  • 1.)
    if(!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter2]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter3]) || !strcmp(SpielerName(playerid), hInfo[i][Besitzer]))
    {
    return SendClientMessage(playerid, 0xFF0000FF, "Error: Du bist bereits Mieter oder Besitzer dieses Hauses.");
    }


    2.)
    Eine Schleife durch alle Häuser und nach gleichen Prinzip wie bei 1.) das Geld abziehen.

  • Hi,


    habe es so:
    for(new i=0; i<MAX_HOUSE; i++) {
    if(SpielerName(playerid), hInfo[i][Mieter1] || hInfo[i][Mieter2] || hInfo[i][Mieter3])
    {
    GivePlayerMoney(playerid, -hInfo[i][Mietpreis]); }
    }


    Ist das richtig? kanns gerade nicht Testen da ich keinen 2ten PC habe ^^


    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)

  • Achso, dachte das muss nur beim Command so sein^^


    Also so wäre es dann richtig, stimmts ?


    Payday
    for(new i=0; i<MAX_HOUSE; i++) {
    if(!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter2]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter3]))
    {
    return GivePlayerMoney(playerid, -hInfo[playerid][Mietpreis]);
    }
    }


    Spoiler anzeigen
    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(!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter2]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter3]) || !strcmp(SpielerName(playerid), hInfo[i][Besitzer]))
    {
    return SendClientMessage(playerid, error, "Du bist bereits Mieter oder Besitzer dieses Hauses.");
    }
    if(!strlen(hInfo[i][Mieter1])) return format(hInfo[i][Mieter1], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 1"), SaveAllHouses();
    else if(!strlen(hInfo[i][Mieter2])) return format(hInfo[i][Mieter2], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 2"), SaveAllHouses();
    else if(!strlen(hInfo[i][Mieter3])) return format(hInfo[i][Mieter3], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 3"), SaveAllHouses();
    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!");
    }


    Es ist ja möglich, dem Haus noch eine Kasse zu geben und einfach beim Payday das abgezogene Geld vom Spieler in die Kasse einzahlen zu lassen, oder?



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


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

  • Mal wieder übersehen ^^
    Danke Jeffry :)


    Nein man soll sich nur in 1 einmieten dürfen :D


    Mit freundlichen Grüßen


    /Edit:
    Jeffry:


    Gibt ein kleines Problem, wenn 2 Spieler Online sind, bekommt der 2te Spieler(Der nicht eingemietet ist, oder kein Haus besitzt) trotzdem die Miete meines Hauses abgezogen?
    2tens kann er sich nicht einmieten, obwohl die Tabelle leer ist bzw Spalte?


    Mein kompletter Payday:

    Spoiler anzeigen
    public PayDay(playerid)
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    new string[128],string1[128], gehalt = GiveFrakGehalt(playerid);
    SendClientMessage(playerid,info,"|____________Zahltag___________|");
    format(string, sizeof(string), "Gehalt: %i$",gehalt);
    SendClientMessage(playerid,hinweis,string);
    SpielerInfo[playerid][pPayday] = 0;
    SpielerInfo[playerid][Kontostand] += gehalt;
    for(new i=0; i<MAX_HOUSE; i++) {
    format(string1,sizeof(string1),"Deine Miete beträgt: %d",hInfo[i][Mietpreis]);
    if(!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter2]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter3]))
    {
    return GivePlayerMoney(playerid, -hInfo[i][Mietpreis]), SendClientMessage(playerid, info, string1);
    }
    }
    SetPVarInt(playerid, "pLevelPunkte", GetPVarInt(playerid, "pLevelPunkte")+1);
    if(GetPVarInt(playerid, "pLevelPunkte") == RequiredPoints(playerid))
    {
    GivePlayerScore(playerid,1);
    SetPVarInt(playerid, "pLevelPunkte", 0);
    SpielerInfo[playerid][pLevel] ++;
    SendClientMessage(playerid,erfolg,"Herzlichen Glückwunsch, du bist ein Level gestiegen!");
    }
    }
    return 1;
    }


    Und der Mietebefehl:

    Spoiler anzeigen
    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(!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter2]) || !strcmp(SpielerName(playerid), hInfo[i][Mieter3]) || !strcmp(SpielerName(playerid), hInfo[i][Besitzer]))
    {
    return SendClientMessage(playerid, error, "Du bist bereits Mieter oder Besitzer dieses Hauses.");
    }
    if(!strlen(hInfo[i][Mieter1])) return format(hInfo[i][Mieter1], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 1"), SaveAllHouses();
    else if(!strlen(hInfo[i][Mieter2])) return format(hInfo[i][Mieter2], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 2"), SaveAllHouses();
    else if(!strlen(hInfo[i][Mieter3])) return format(hInfo[i][Mieter3], 24, "%s",SpielerName(playerid)), SendClientMessage(playerid, erfolg, "Mieter 3"), SaveAllHouses();
    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!");
    }


    Echt komisch.. Ich kann auch nur 1 Haus kaufen, egal mit welchem Account?
    Mieten kann ich komischerweise gar keins mehr...



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


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

    Einmal editiert, zuletzt von ENEF ()

  • Ach, hatte vergessen, dass du es auf leer gestellt hast.
    public PayDay(playerid)
    {
    if(GetPVarInt(playerid,"Eingeloggt") == 1)
    {
    new string[128],string1[128], gehalt = GiveFrakGehalt(playerid);
    SendClientMessage(playerid,info,"|____________Zahltag___________|");
    format(string, sizeof(string), "Gehalt: %i$",gehalt);
    SendClientMessage(playerid,hinweis,string);
    SpielerInfo[playerid][pPayday] = 0;
    SpielerInfo[playerid][Kontostand] += gehalt;
    for(new i=0; i<MAX_HOUSE; i++)
    {
    format(string1,sizeof(string1),"Deine Miete beträgt: %d",hInfo[i][Mietpreis]);
    if((!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) && strlen(hInfo[i][Mieter1])) || (!strcmp(SpielerName(playerid), hInfo[i][Mieter2]) && strlen(hInfo[i][Mieter2])) || (!strcmp(SpielerName(playerid), hInfo[i][Mieter3]) && strlen(hInfo[i][Mieter3])))
    {
    GivePlayerMoney(playerid, -hInfo[i][Mietpreis]), SendClientMessage(playerid, info, string1);
    break;
    }
    }
    SetPVarInt(playerid, "pLevelPunkte", GetPVarInt(playerid, "pLevelPunkte")+1);
    if(GetPVarInt(playerid, "pLevelPunkte") == RequiredPoints(playerid))
    {
    GivePlayerScore(playerid,1);
    SetPVarInt(playerid, "pLevelPunkte", 0);
    SpielerInfo[playerid][pLevel] ++;
    SendClientMessage(playerid,erfolg,"Herzlichen Glückwunsch, du bist ein Level gestiegen!");
    }
    }
    return 1;
    }


    Gleiches Prinzip beim mieten:
    if((!strcmp(SpielerName(playerid), hInfo[i][Mieter1]) && strlen(hInfo[i][Mieter1])) || (!strcmp(SpielerName(playerid), hInfo[i][Mieter2]) && strlen(hInfo[i][Mieter2])) || (!strcmp(SpielerName(playerid), hInfo[i][Mieter3]) && strlen(hInfo[i][Mieter3])) || (!strcmp(SpielerName(playerid), hInfo[i][Besitzer]) && strlen(hInfo[i][Besitzer])))

  • Okey, danke schonmal.


    Aber wenn mehrere Häuser existieren und ich bsp mit 2 PCs on bin, und jeweils eins Kaufen mit einem Account, kann man nur eins Kaufen/Betreten/Verlassen


    Woran kann das liegen?


    Jeffry:



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


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

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


    Also:
    Ich erstelle mit Spieler1 zwei Häuser und kaufe Haus1 mit Spieler1.
    Spieler2 kann sich einmieten, bekommt das Geld jetzt abgezogen so wie es sein soll.


    Jedoch, wenn ich mit Spieler2 nicht irgendwo eingemietet bin, kann ich mir das Haus2 nicht kaufen, da kommt dann immer "Dieses Haus steht nicht zum Verkauf!"


    Code:

    Spoiler anzeigen
    ocmd:buyhouse(playerid, params[])
    {
    new string[64];
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(hInfo[i][Gekauft] != 0) return SendClientMessage(playerid, error, "Dieses Haus steht nicht zum verkauf!");//hier
    if(hInfo[i][Level] > SpielerInfo[playerid][pLevel]) return SendClientMessage(playerid, error, "Dein Level ist zu gering!");
    if(hInfo[i][Kaufpreis] > SpielerInfo[playerid][pGeld]) return SendClientMessage(playerid, error, "Dein Geld ist zu gering!");
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    hInfo[i][Gekauft] = 1;
    format(hInfo[i][Besitzer], 34, "%s",SpielerName(playerid));
    format(string, sizeof(string), "Besitzer: %s\nMiete: %d\nLevel: %d",hInfo[i][Besitzer],hInfo[i][Mietpreis],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 eines Hauses!");
    }


    Ich hab jetzt Angst, dass da noch mehr Probleme auftreten könnten ^^


    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)

  • Diese drei Abfragen müssen nach der IsPlayerInRangeOfPoint Abfrage kommen.
    if(hInfo[i][Gekauft] != 0) return SendClientMessage(playerid, error, "Dieses Haus steht nicht zum verkauf!");//hier
    if(hInfo[i][Level] > SpielerInfo[playerid][pLevel]) return SendClientMessage(playerid, error, "Dein Level ist zu gering!");
    if(hInfo[i][Kaufpreis] > SpielerInfo[playerid][pGeld]) return SendClientMessage(playerid, error, "Dein Geld ist zu gering!");
    Also in der Ebene die IsPlayerInRangeOfPoint öffnet.

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Hi,


    nun funktioniert es. Danke :)
    Nächstes Problem :wacko:


    Vorhin hab ich dir ja gesagt, dass wenn ich in Haus1 rein gehe, komme ich bei Haus2 wieder raus.
    Wenn ich bei Haus2 rein gehe, komme ich bei Haus1 raus.


    Ich verstehe es nicht, vorhin wars irgendwie weg wo du das return 1; gemacht hast, jetzt ist es wieder da :whistling:


    Spoiler anzeigen
    ocmd:enter(playerid, params[])
    {
    for(new i=0; i<MAX_HOUSE; i++)
    {
    if(hInfo[i][Gekauft] != 1) return SendClientMessage(playerid, error, "Dieses Haus kannst du nicht betreten!");
    {
    if(IsPlayerInRangeOfPoint(playerid, 3.0, hInfo[i][PosX],hInfo[i][PosY],hInfo[i][PosZ]))
    {
    SetPlayerPos(playerid, hInfo[i][IntX],hInfo[i][IntY],hInfo[i][IntZ]);
    SetPlayerInterior(playerid, hInfo[i][IntID]);
    SetPlayerVirtualWorld(playerid, hInfo[i][VID]);
    return 1;
    }
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe deines Hauses!");
    }
    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!");
    }


    Sorry wenn ich zuviel Frage ^^


    //Edit:
    Was mir aufgefallen ist(ich weiß aber nicht ob es dauerhaft so ist)
    Wenn ich in das Haus1 gehe, und es wieder verlasse funktioniert es.
    Jedoch gehe ich bei Haus2 rein komme ich bei Haus1 raus.


    Ich hab es auch noch nicht mit mehreren Häusern versucht, jedoch buggt es und das soll nicht so sein :D


    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)

    Einmal editiert, zuletzt von ENEF () aus folgendem Grund: Überarbeitet

  • Schreibe den Enter Befehl so:
    ocmd:enter(playerid, params[])
    {
    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 betreten!");
    SetPlayerPos(playerid, hInfo[i][IntX],hInfo[i][IntY],hInfo[i][IntZ]);
    SetPlayerInterior(playerid, hInfo[i][IntID]);
    SetPlayerVirtualWorld(playerid, hInfo[i][VID]);
    return 1;
    }
    }
    return SendClientMessage(playerid, error, "Du bist nicht in der Nähe deines Hauses!");
    }


    Zwecks dem Problem:
    Laut Code kann das nicht sein, außer du hast Haus 1 und Haus 2 dieselben Koordinaten im Interior gegeben.

  • Hi.


    Also, ich hab's jetzt noch mal intensiv getestet.
    Egal in welches Haus ich rein gehe, ich komme bei den erst erstellten Haus wieder raus.


    Ja habe ich, nur eine andere virtuelle Welt.
    Aber ist das deswegen? Es soll ja nicht nur 1 Haus mit dem Interior geben, sollte ja schon mehrere geben dürfen.


    Jeffry:


    Mit freundlichen Grüßen


    PS: in der Datenbank hat jeder seine richtige PosX/Y/Z(die Koord. an die er raus kommen soll)



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


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

  • Das erklärt es.


    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]) && GetPlayerVirtualWorld(playerid) == hInfo[i][VID])
    {
    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!");
    }

  • Hey iPit, ich habe das so geregelt das wenn ein Datenbank eintrag für die VirtualWorld kommt, es mit AUTO_INCREMENT hochgesetzt wird. So musst du dies nicht immer selber rausfinden sondern es wird automatisch hochgezählt. Bei bestimmten Interioren zählst du dann einfach von oben nach unten.(So würde ich dies handhaben)

    Einmal editiert, zuletzt von CaZe ()

  • Hi Jeffry.


    Nun funktioniert es endlich, danke !
    Woran lag es denn?


    Kleine Frage noch ^^
    Wenn ich jetzt bsp. ein Dialog machen will, wo Hausbesitzer ihre Miete ändern können und Mieter raus werfen können.
    Wie mach ich das dann, dass der Hausbesitzer nur sein Haus verändert?
    Und ich versuche immer Abzufragen(Falls das Haus gelockt ist) damit nur die nicht rein können, die nicht Mieten oder kein Besitzer sind.
    Leider krieg ich das nicht so auf die Reihe ^^


    Hast du vielleicht ein bsp. für mich?


    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)

  • Also soll ich jetzt dann Abfragen welches Haus welchem Spieler gehört am Name oder wie?
    Oder an der Virtuellen Welt?
    Sollte ich da dann beim Createhouse befehl das Virtuelle Welt raus nehmen?
    Und dann irgendwie mache n das bei jedem Haus das Interior um 1 hoch geht?


    Ich verstehs grad nicht ganz :/



    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)

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