Beiträge von Jeffry

    Nein, du siehst ja vielleicht auch mal mehr als einen Spieler, sprich du brauchst ein zweidimensionales Array als Speicher, mit Index 1 playerid und Index 2 forplayerid, oder umgekehrt.

    Kaliber:
    Das macht keinen Sinn. Dann kann er sich ja unendlich viele Fahrzeuge kaufen, wobei immer das zuletzt erstellte wieder überschrieben wird.
    Wie du siehst, steht im dialog drin, dass PlayerInfo[playerid][pCarLimit] auf 1 gesetzt wird, wenn ein Fahrzeug gekauft wird, wenn du dann abfragst ob es 1 ist, dann kann man sich kein Fahrzeug kaufen wenn man keins hat, und wenn man eines hat, dann kann man sich eins kaufen. Das macht keinen Sinn, da letzteres nie erreicht wird.
    Außerdem war ein paar Zeilen drunter die Abfrage ob es 1 ist nochmal drin, sprich es hätte ohnehin nicht funktioniert, gezahlt hätte er zwar, aber das wars auch.



    Problem ist bei dem Code den er verwendet, dass er voller Fehler ist, und daher die Variablen z.T. nicht korrekt zurückgesetzt werden.
    Deshalb machen wir es hier auch mal wie beim Problem zuvor, dass wir die Position des Fahrzeugs das er angeblich bereits besitzt abfragen, und wenn die 0 ist (wie im Problem zuvor), dann kann er sich ein neues Fahrzeug kaufen, ansonsten nicht.


    Schreibe es so. Wenn es nicht geht, poste bitte den print und sage uns welche Meldung im Chat erscheint.

    Spoiler anzeigen
    if(dialogid == DIALOG_AUTOHAUS)
    {
    //new FreeSlot = -1;
    new FreeSlot;
    if(!response)
    {
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    }
    if(response)
    {
    new preis = Kaufliste[Spectating[playerid]][Preis];
    if(PlayerInfo[playerid][pKreditkarte] == 1 && PlayerInfo[playerid][pKreditkartebenutzen] == 1)
    {
    if(Kaufliste[Spectating[playerid]][Autolevel]-1 >= PlayerInfo[playerid][pLevel])
    {
    format(string, sizeof(string), "Du hast nicht das Benötigte Level für das Fahrzeug (benötigt: %d)", Kaufliste[Spectating[playerid]][Autolevel]);
    SendClientMessage(playerid, COLOR_ERRORTEXT, string);
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    return 1;
    }
    if(preis < PlayerInfo[playerid][pBank])
    {
    PlayerInfo[playerid][pKreditkartenkosten] += preis;
    SendClientMessage(playerid,COLOR_YELLOW,"Du hast erfolgreich mit deiner Kreditkarte bezahlt, der Betrag wird beim Payday abgebucht.");
    }
    else
    {
    format(string, sizeof(string), "Du hast nicht genug Geld für das Auto (benötigt: $%i)", preis);
    SendClientMessage(playerid, COLOR_ERRORTEXT, string);
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    return 1;
    }
    }
    else
    {
    if(Kaufliste[Spectating[playerid]][Autolevel]-1 >= PlayerInfo[playerid][pLevel])
    {
    format(string, sizeof(string), "Du hast nicht das Benötigte Level für das Fahrzeug (benötigt: %d)!", Kaufliste[Spectating[playerid]][Autolevel]);
    SendClientMessage(playerid, COLOR_ERRORTEXT, string);
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    return 1;
    }
    new Float:x, Float:y, Float:z;
    GetVehiclePos(Carlist[playerid][FreeSlot][Carid], x, y, z);
    printf("preis: %d / cash: %d / %f/%f/%f", preis, PlayerInfo[playerid][pCash], x, y, z);
    if(x != 0.0 || y != 0.0 || z != 0.0)
    {
    SendClientMessage(playerid, COLOR_ERRORTEXT, "Du hast bereits ein Fahrzeug.");
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    return 1;
    }
    if(preis <= PlayerInfo[playerid][pCash])
    {
    GivePlayerMoneys(playerid, -preis);
    }
    else
    {
    format(string, sizeof(string), "Du hast nicht genug Geld für das Auto (benötigt: $%i)!", preis);
    SendClientMessage(playerid, COLOR_ERRORTEXT, string);
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    RemovePlayerFromVehicle(playerid);
    return 1;
    }
    }
    for(new i=0; i<MaxVeh[playerid]; i++)
    {
    if(Carlist[playerid]_[Typ] == -1)
    {
    FreeSlot=i;
    break;
    }
    }
    /*if(PlayerInfo[playerid][pCarLimit] == 1)
    {
    SendClientMessage(playerid,COLOR_RED,"Du hast bereits die maximale Anzahl an Privatfahrzeugen erreicht (1).");
    return 1;
    }*/
    /*if(FreeSlot == -1)
    {
    SendClientMessage(playerid,COLOR_RED,"Du hast bereits die maximale Anzahl an Privatfahrzeugen erreicht.");
    return 1;
    }*/
    new autohaus = Kaufliste[Spectating[playerid]][Autohaus];
    Carlist[playerid][FreeSlot][Typ] = Spectating[playerid];
    Carlist[playerid][FreeSlot][pos_x] = Autospawns[autohaus][pos_x];
    Carlist[playerid][FreeSlot][pos_y] = Autospawns[autohaus][pos_y];
    Carlist[playerid][FreeSlot][pos_z] = Autospawns[autohaus][pos_z];
    Carlist[playerid][FreeSlot][z_angle] = Autospawns[autohaus][z_angle];
    Carlist[playerid][FreeSlot][SpawnSaveX] = Autospawns[autohaus][pos_x];
    Carlist[playerid][FreeSlot][SpawnSaveY] = Autospawns[autohaus][pos_y];
    Carlist[playerid][FreeSlot][SpawnSaveZ] = Autospawns[autohaus][pos_z];
    Carlist[playerid][FreeSlot][SpawnSaveRot] = Autospawns[autohaus][z_angle];
    Carlist[playerid][FreeSlot][Status] = 0;
    Carlist[playerid][FreeSlot][Lock] = 0;
    Carlist[playerid][FreeSlot][Carid] = CreateTunedCar(playerid, FreeSlot);
    Carlist[playerid][FreeSlot][Meter] = 0;
    Kilometerstand[Carlist[playerid][FreeSlot][Carid]] = 0.00;
    Gas[Carlist[playerid][FreeSlot][Carid]] = GasDaten[GetVehicleModel(Carlist[playerid][FreeSlot][Carid])-400][Tankvolumen];
    SetPlayerCheckpoint(playerid,Carlist[playerid][FreeSlot][pos_x],Carlist[playerid][FreeSlot][pos_y],Carlist[playerid][FreeSlot][pos_z],10.0);
    ForAllPlayers(i)
    {
    if(IsPlayerConnected(i))
    {
    SetVehicleParamsForPlayer(Kaufliste[Spectating[playerid]][Carid], i, 0, 0);
    }
    }
    TogglePlayerControllable(playerid,1);
    RemovePlayerFromVehicle(playerid);
    PlayerInfo[playerid][pCarLimit] = 1;
    SendClientMessage(playerid,COLOR_GREEN,"Du hast dir erfolgreich das Fahrzeug gekauft.");
    SendClientMessage(playerid,COLOR_GREEN,"Du kannst dein Fahrzeug mit (/park) parken.");
    if(Kaufliste[Spectating[playerid]][Autohaus] == 2)
    {
    BizInfo[14][bTill] += (preis/100)*15;
    ExtortionBiz(14, (preis/100)*10);
    BizInfo[14][bProducts]--;
    }
    if(Kaufliste[Spectating[playerid]][Autohaus] == 0)
    {
    SBizInfo[17][sbTill] += (preis/100)*15;
    ExtortionSBiz(17, (preis/100)*10);
    SBizInfo[17][sbProducts]--;
    }
    if(Kaufliste[Spectating[playerid]][Autohaus] == 1)
    {
    SBizInfo[18][sbTill] += (preis/100)*15;
    ExtortionSBiz(18, (preis/100)*10);
    SBizInfo[18][sbProducts]--;
    }
    if(Kaufliste[Spectating[playerid]][Autohaus] == 3)
    {
    SBizInfo[19][sbTill] += (preis/100)*25;
    ExtortionSBiz(19, (preis/100)*10);
    SBizInfo[19][sbProducts]--;
    }
    Spectating[playerid] = -1;
    }
    return 1;
    }

    Sag es ihm doch einfach wie, anstatt fünf mal hin und her zu posten... :pinch:


    @PeeteeTV:
    if(preis <= PlayerInfo[playerid][pCash] && PlayerInfo[playerid][pCarLimit] == 0)


    Zu
    printf("cash %d / limit %d", PlayerInfo[playerid][pCash], PlayerInfo[playerid][pCarLimit]);
    if(preis <= PlayerInfo[playerid][pCash] && PlayerInfo[playerid][pCarLimit] == 0)


    Was wird geprintet, wenn du den Dialog ab schickst?

    Poste bitte dann mal beide Arrays mit den Daten und beide enums dazu. Sonst kann ich mir das nur schwer vorstellen, wie du das haben willst.
    Wäre auch gut wenn du dazu schreibst, welche die Koordinaten des Markers sind und die Koordinaten sind zu denen er teleportiert werden soll.

    Schreibe es einfach mal so, klappt es dann?

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bdInfo); i++)
    {
    printf("DEBUG: Aufgerufen: %d", i);
    printf("db_id: %d", bdInfo[i][db_id]);
    if(!bdInfo[i][db_id])continue;
    printf("ib_x: %f", bdInfo[i][ib_x]);
    if(bdInfo[i][ib_x]==0.0)continue;
    printf("Range: %d", IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]));
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bdInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bdInfo[i][ib_x],bdInfo[i][ib_y],bdInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bdInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }

    Wieso eigentlich 15 Durchläufe?
    new bdInfo[MAX_SHOP][buildingsEnum] = {
    {"Bürger Shot Nord",1559,1199.2811,-918.6648,43.1191}, // BSE1
    {"Bürger Shot West",1559,810.9824,-1616.2720,13.5469}, // BSE2
    {"Bürger Shot Nord",1559,1872.7986,2071.6619,11.0625}, // BSE3
    {"Bürger Shot Nord-West",1559,2472.3940,2034.2115,11.0625}, // BSE4
    {"Bürger Shot West",1559,2169.9138,2795.8726,10.8203} // BSE5
    };
    Hier sind nur 5.


    Ist es Absicht, dass du bsInfo im Befehl geschrieben hast anstatt bdInfo, oder nicht? Ändere das ggf mal.

    Debugge es mal so (mit Werten):

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    printf("DEBUG: Aufgerufen: %d", i);
    printf("db_id: %d", bsInfo[i][db_id]);
    if(!bsInfo[i][db_id])continue;
    printf("ib_x: %f", bsInfo[i][ib_x]);
    if(bsInfo[i][ib_x]==0.0)continue;
    printf("Range: %d", IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]));
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bsInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bsInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }

    Ah, die Debugs hast du schon gemacht, das spart natürlich sehr viel Arbeit, schön dass das mal jemand macht. :thumbup:


    Teste es mal so:

    Spoiler anzeigen
    ocmd:enter(playerid,params[])
    {
    if(pInfo[playerid][pEingeloggt] == 0)return SendClientMessage(playerid,COLOR_GRAU,"Info: Du bist nicht Eingeloggt!");
    new string[128];
    for(new i=0; i<sizeof(bsInfo); i++)
    {
    print("DEBUG: Aufgerufen");
    if(!bsInfo[i][db_id])continue;
    print("bsInfo[i][db_id]");
    if(bsInfo[i][ib_x]==0.0)continue;
    print("bsInfo[i][ib_x] >0.0");
    if(!IsPlayerInRangeOfPoint(playerid, 2, bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]))continue;
    printf("IsPlayerInRangeOfPoint(playerid, 2, bdInfo[%i][bd_x], bdInfo[%i][bd_y],bdInfo[%i][bd_z]",i,i,i);
    format(string,128,"{C8C8C8}Sie können das Geschäft nicht betreten. {E90000}(Lager leer)");
    if(bsInfo[i][b_prods] <1)return SCM(playerid,COLOR_GRAU,string);
    SetPlayerPos(playerid,bsInfo[i][ib_x],bsInfo[i][ib_y],bsInfo[i][ib_z]);
    print("SetPlayerPos");
    SetPlayerInterior(playerid,bsInfo[i][b_interior]);
    print("SetPlayerInterior");
    SetPlayerVirtualWorld(playerid,i);
    SetPVarInt(playerid,"tmp_ID",i);
    printf("x='%f' | y='%f' | z='%f'",bdInfo[i][bd_x], bdInfo[i][bd_y],bdInfo[i][bd_z]);
    return 1;
    }
    for(new i=0; i<sizeof(hInfo); i++)
    {
    if(!hInfo[i][db_id])continue;
    if(hInfo[i][i_x] == 0.0)continue;
    if(!IsPlayerInRangeOfPoint(playerid,2,hInfo[i][hx],hInfo[i][hy],hInfo[i][hz]))continue;
    if(hInfo[i][h_lock] == 1)
    {
    if(!strcmp(hInfo[i][h_besitzer],SpielerName(playerid),true))
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    return 1;
    }
    return GameTextForPlayer(playerid,"~r~Abgeschlossen",1000,1);

    Spoiler anzeigen
    }
    else if(hInfo[i][h_lock] == 0)
    {
    SetPlayerPos(playerid,hInfo[i][i_x],hInfo[i][i_y],hInfo[i][i_z]);
    SetPlayerInterior(playerid,hInfo[i][h_interior]);
    SetPlayerVirtualWorld(playerid,i);
    }
    return 1;
    }
    return 1;
    }


    Das tmp_i war eigentlich nicht nötig.

    format(string,sizeof string, "%s hat %s zu einem Level %d Admin befördert/degradiert.",PlayerName(playerid),PlayerName(para1));
    Zu
    format(string,sizeof string, "%s hat %s zu einem Level %d Admin befördert/degradiert.",PlayerName(playerid),PlayerName(para1),level);


    Edit
    Und
    new level = strval(tmp);
    tmp = strtok(cmdtext, idx);
    Zu
    tmp = strtok(cmdtext, idx);
    new level = strval(tmp);