Beiträge von Jeffry

    Mit der GetVehicleIdx Funktion aus Post #8. Die kannst du ja auch zu GetVehicleSlot umbenennen.
    Beim Kauf musst du entsprechend prüfen, bei welchem slot die vehicleid 0 ist, sprich welcher leer ist.

    Der Code muss so aussehen:
    if(listitem == 1)
    {
    for(new slot=0;slot<MAX_PLAYER_VEHS;slot++)
    {
    if(PrivatCarInfo[slot][playerid][pfStored] == 1)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, slot, PrivatCarInfo[slot][playerid][pfModel]);
    }
    }
    if(!strlen(string)) ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    else ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }


    Außerdem lagerst du beim Ein- und Auslagern immer alle slots ein bzw. aus.
    Da musst du noch eine Abfrage einbauen, für welchen Slot das gemacht werden muss.

    Ja, da die "1000" in deinem Fall für die playerid steht.
    Dort trägst du am besten "MAX_PLAYERS" ein, das ist besser, da 1000 nicht notwendig sein wird.
    Danach fehlt dann die zweite Dimension der maximal möglichen Fahrzeuge (5). Erst dann darf das enum kommen.


    #define MAX_MOEGLICHE_AUTOS 5
    new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][carEnum];


    Die Erweiterung von 2 auf 3 Dimensionen zieht damit nach sich, dass alles angepasst werden muss, was mit PrivatCarInfo zu tun hat, da alles um die eine Dimension erweitert werden muss.
    Das geht leider nicht anders.

    So einfach geht das nicht.
    Die hinzuzufügende Dimension ist das MAX_MOEGLICHE_AUTOS.


    Und danach müssen alle Codes wie folgt angepasst werden:
    DestroyVehicle(PrivatCarInfo[playerid][pf_IDx]);
    zu:
    new idx = GetVehicleIdx(playerid, GetPlayerVehicleID(playerid));
    DestroyVehicle(PrivatCarInfo[playerid][idx][pf_IDx]);


    Dazu musst du eine Funktion erstellen, um über die ID des Fahrzeugs den Index herauszufinden.
    stock GetVehicleIdx(playerid, vehicleid)
    {
    for(new i; i < MAX_MOEGLICHE_AUTOS; i++)
    {
    if(PrivatCarInfo[playerid][i][pf_IDx] == vehicleid) return i;
    }
    return -1;
    }



    Und wie gesagt, es müssen alle Codes entsprechend angepasst werden.
    Das kann von Funktion zu Funktion anders aussehen, da musst du alle Fälle einzeln prüfen und anpassen. In 5 Minuten ist das nicht gemacht.

    Das System ist auf nur ein Fahrzeug ausgelegt.
    Um mehrere Fahrzeuge zu speichern, benötigt "PrivatCarInfo" eine weitere Dimension, sprich:
    new PrivatCarInfo[MAX_PLAYERS][MAX_MOEGLICHE_AUTOS][enumName];
    Die zweite ist neu.


    Dafür muss dann das ganze PrivatCarInfo-System angepasst werden.

    Du musst den String immer wieder "mitnehmen":
    if(listitem == 1)
    {
    if(PrivatCarInfo[playerid][pfStored] == 1)
    {
    for(new i; i < 5; i++)
    {
    format(string, sizeof(string), "%s{FFFF00}%i. {FFFFFF}Fahrzeug %i\n", string, i, PrivatCarInfo[playerid][pfModel][i]); //Ich habe das [i] hinzugefügt, ich nehme an das ist ein Array.
    }
    ShowPlayerDialog(playerid, DIALOG_GARAGE2, DIALOG_STYLE_LIST, "{FFFF00}Fahrzeuge", string, "Rausholen", "Zurück");
    }
    else
    {
    ShowPlayerDialog(playerid, DIALOG_GARAGE3, DIALOG_STYLE_MSGBOX, "{FFFF00}Garagenmenü", "{FFFFFF}Du hast zurzeit kein {FFFF00}Fahrzeug {FFFFFF} in deiner Garage.", "Okay", "");
    }
    }

    Bitte auf keinen Fall einen SELECT * ohne Bedingung auf die komplette Tabelle machen, das ist komplett am Sinn vorbei und überhaupt nicht performant! Wenn in der Datenbank 50.000 registrierte Spieler stehen, dann werden alle 50.000 Datensätze an den Server gesendet, das macht keinen Sinn.


    Um nur die Anzahl der Datensätze zu erhalten, reicht es, wie Douq auch schon sagte, einen SELECT COUNT zu machen, damit bekommt man genau einen Datensatz mit einem Wert zurück, anstatt die komplette Tabelle.

    COMMAND:orten(playerid,params[])
    {
    if(ImTutorial[playerid] != 0)return SendClientMessage(playerid,SAMP_ROT,""ACCINFO"Du hast keine erlaubnis diesen Befehl benutzen zu drüfen.");
    if(GetPVarInt(playerid,"Eingeloggt") == 0)return SendClientMessage(playerid,SAMP_WEISS,""ACCINFO"Du bist nicht eingeloggt!");
    if(Spieler[playerid][pAWAYFROMKEYBOARD] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im AFK-Modus und kannst somit keine Befehle nutzen."),SendClientMessage(playerid,SAMP_WEISS,""#HTML_BLAU"Verwendung:"#HTML_WEISS" /back");
    if(Spieler[playerid][pInPrison] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im Prison.");
    if(Spieler[playerid][pFriedhof] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist nicht in der Lage zu schrieben.");
    if(Spieler[playerid][pDeath] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist verletzt.");
    if(Spieler[playerid][pJailed] != 0)return SendClientMessage(playerid,SAMP_WEISS,"Du bist im Gefängnis.");
    if(Spieler[playerid][pTazerd] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist K.O/getazert.");
    if(Spieler[playerid][pCuffed] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Du bist gefesselt.");
    new pID,ortungsstring[128],Float:x,Float:y,Float:z;
    if(isPlayerInFrakt(playerid,1) || isPlayerInFrakt(playerid,6) || isPlayerInFrakt(playerid,2) || isPlayerInFrakt(playerid,16))
    {
    if(Spieler[playerid][pOrtungsgeraet] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Kein Ortungsgerät dabei.");
    if(sscanf(params,"i",pID))return SendClientMessage(playerid,SAMP_WEISS,""#HTML_BLAU"Benutze:"#HTML_WEISS"/orten [playerid]");
    format(ortungsstring,sizeof(ortungsstring),"Du versuchst %s (ID:%i) zu orten...",SpielerName(pID),pID);
    SendClientMessage(playerid,SAMP_WEISS,ortungsstring);
    if(Spieler[pID][pHandy] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
    if(Spieler[pID][pHandystate] == 0)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
    if(Spieler[pID][pDeath] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
    if(Spieler[pID][pFriedhof] == 1)return SendClientMessage(playerid,SAMP_WEISS,"Nicht ortbar.");
    format(ortungsstring,sizeof(ortungsstring),"Du hast %s (ID:%i) geortet. Nutze '/delcheck' um den Checkpoint zu entfernen.",SpielerName(pID),pID);
    SendClientMessage(playerid,GRUEN,ortungsstring);
    KillTimer(SpielerOrtenTimer[playerid]);
    GetPlayerPos(pID,x,y,z);
    SetPlayerCheckpoint(playerid,x,y,z,3);
    Spieler[playerid][pOrtenVehORPlayer] = 1;//1 playerid 2 veh 3 service accept
    Spieler[playerid][pOrtenVehIDplayerid] = pID;
    SpielerOrtenTimer[playerid] = SetTimerEx("SpielerOderFahrzeugOrten",1000,1,"iii",playerid,pID,1);
    Spieler[playerid][pIsearch] = 1;
    return 1;
    }
    return SendClientMessage(playerid,SAMP_WEISS,""ACCINFO"Du bist nicht in der jeweiligen Fraktion.");
    }

    Vor der Ticket-Abfrage:
    new driver = GetVehicleDriver(vehicleid);
    if(!IsPlayerConnected(driver))
    {
    new Float:x, Float:y, Float:z;
    GetPlayerPos(playerid,x,y,z);
    SetPlayerPos(playerid,x+2,y+2,z+2);
    Spieler[playerid][pTicket] = false;
    return SCM(playerid,GELB, "Du musst auf den Lockführer warten!");
    }