Sollte oder kann ich überhaupt beides nutzen, je nach Bedarf anders an verschiedenen Stellen? oder ist das dann doppelt definiert mit dem enum.
Im enum schreibst du nur pVehicleID[MAX_VEHICLE_SLOTS], alles Andere für die Vehicles haus du raus.
Um es zu speichern:
pInfo[playerid][pVehicleID][0], pInfo[playerid][pVehicleID][1], pInfo[playerid][pVehicleID][2], pInfo[playerid][pVehicleID][3], pInfo[playerid][pVehicleID][4]
So kannst du jeweils auf die 5 Indizes zugreifen 
Und in deinem ocmd test Command hast du:
pInfo[playerid][pVehicleID[1]], wenn dann müsste es: pInfo[playerid][pVehicleID][0] sein. (Das fängt bei 0 an, nicht bei 1.)
Zumal war halt der Array Index an der falschen Stelle.
Aber du müsstest halt noch prüfen, ob das Fahrzeug nicht 0 ist, ergo:
ocmd:test2(playerid)
{
new string[MAX_VEHICLE_SLOTS*18];
for(new i,v; i<MAX_VEHICLE_SLOTS; i++)
{
v = pInfo[playerid][pVehicleID][i];
if(!v) continue; //Hier besitzt er noch kein Fahrzeug
format(string,sizeof(string),"%s%s\n",string,GetVehicleName(GetVehicleModel(v)));
}
if(!string[0]) return SendClientMessage(playerid,-1,"* You don't own a vehicle yet!");
ShowPlayerDialog(playerid,999,DIALOG_STYLE_LIST,"Private Vehicles",string,"Okay","");
return 1;
}
Alles anzeigen
GetVehicleName, kannste z.B. hier her bekommen: https://forum.sa-mp.com/showthread.php?t=566775
Oder du hast natürlich schon so eine Funktion.
Falls er btw ein neues Auto kaufen mag, musst du einen leeren index finden:
stock FindFreeCarIndex(playerid)
{
for(new i; i<MAX_VEHICLE_SLOTS; i++)
{
if(!pInfo[playerid][pVehicleID][i]) return i;
}
return -1;
}
//Nutzung ist dann:
new i = FindFreeCarIndex(playerid);
if(i == -1) return SendClientMessage(playerid,-1,"* You own already "#MAX_VEHICLE_SLOTS#" vehicles!");
pInfo[playerid][pVehicleID][i] = CreateVehicle(...);
Alles anzeigen