Beiträge von Jeffry

    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.

    Du könntest versuchen das ganze entweder über die Taste oder über die Animation die der Spieler ausführt, bei OnPlayerUpdate abzufragen, falls das passt, dann den Spieler kurz zu freezen und wieder zu entfreezen und dazu return 0 zu machen, damit der Schuss nicht synchronisiert wird.


    Wäre ein Versuch wert.

    Bergabfuhr_Stationen[berg_Checkpoint][B_fX]
    Hier (und bei allen bei denen das noch so ist) muss anstatt berg_Checkpoint die Anzahl der vom Spieler gesammelten Checkpoints rein. berg_Checkpoint ist immer 1 (siehe in deinem enum), daher zeigt es dir den 2. Checkpoint an.

    Das letzte hat den Typ 0, da stimmt was nicht.
    Hast du die Tabelle zuvor geleert?


    Leere die Tabelle nochmal, lege drei Häuser an und poste dann den Log dazu, der ist wichtig, damit nachvollzogen werden kann, was passiert.

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

    Oooh, böser Fehler von mir. Habe das tmp++ eine Ebene versetzt eingefügt.
    So passt es:
    new count, tmp;
    for(new j=0; j<sizeof(HouseInfo); j++) if(HouseInfo[j][h_int] == inter && HouseInfo[j][h_type] == type) count++;
    printf("count: %d", count);
    for(new j=0; j<sizeof(InteriorInfo); j++)
    {
    printf("%d == %d | %d == %d", InteriorInfo[j][int_ID], inter, InteriorInfo[j][int_type], type);
    if(InteriorInfo[j][int_ID] == inter && InteriorInfo[j][int_type] == type)
    {
    printf("%d == %d", tmp, count);
    if(tmp == count)
    {
    printf("Nutze InteriorInfo %d", j);
    HouseInfo[i][h_exitX] = InteriorInfo[j][int_exitX];
    HouseInfo[i][h_exitY] = InteriorInfo[j][int_exitY];
    HouseInfo[i][h_exitZ] = InteriorInfo[j][int_exitZ];
    }
    tmp++;
    }
    }

    if(!strlen(/*Mieter1*/)) //Mieter 1 setzen
    else if(!strlen(/*Mieter2*/)) //Mieter 2 setzen
    else if(!strlen(/*Mieter3*/)) //Mieter 3 setzen
    else //alle voll

    Debugge es mal so:
    new count, tmp;
    for(new j=0; j<sizeof(HouseInfo); j++) if(HouseInfo[j][h_int] == inter && HouseInfo[j][h_type] == type) count++;
    printf("count: %d", count);
    for(new j=0; j<sizeof(InteriorInfo); j++)
    {
    printf("%d == %d | %d == %d", InteriorInfo[j][int_ID], inter, InteriorInfo[j][int_type], type);
    if(InteriorInfo[j][int_ID] == inter && InteriorInfo[j][int_type] == type)
    {
    printf("%d == %d", tmp, count);
    if(tmp == count)
    {
    printf("Nutze InteriorInfo %d", j);
    HouseInfo[i][h_exitX] = InteriorInfo[j][int_exitX];
    HouseInfo[i][h_exitY] = InteriorInfo[j][int_exitY];
    HouseInfo[i][h_exitZ] = InteriorInfo[j][int_exitZ];
    }
    }
    tmp++;
    }


    Was steht im Log, wenn du die Häuser erstellst? Und was steht in der Datenbank?
    Nicht vergessen die Datenbank vorher zu leeren.

    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.

    Beim Erstellen:
    HouseInfo[i][h_exitX] = InteriorInfo[i][int_exitX];
    HouseInfo[i][h_exitY] = InteriorInfo[i][int_exitY];
    HouseInfo[i][h_exitZ] = InteriorInfo[i][int_exitZ];


    new count, tmp;
    for(new j=0; j<sizeof(HouseInfo); j++) if(HouseInfo[j][h_int] == inter && HouseInfo[j][h_type] == type) count++;
    for(new j=0; j<sizeof(InteriorInfo); j++)
    {
    if(InteriorInfo[j][int_ID] == inter && InteriorInfo[j][int_type] == type)
    {
    if(tmp == count)
    {
    HouseInfo[i][h_exitX] = InteriorInfo[j][int_exitX];
    HouseInfo[i][h_exitY] = InteriorInfo[j][int_exitY];
    HouseInfo[i][h_exitZ] = InteriorInfo[j][int_exitZ];
    }
    }
    tmp++;
    }


    Das dürfte sein was du willst.

    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.