Vehicles mit der richtigen ID laden, brauche denkhilfe

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
  • Hallo,
    ich brauche wieder denkhilfe da ich wieder am Vehiclesystem hänge.
    Ich weiss nicht wie ich die ID´s der Vehicles aus der Datenbank mit den richtigen Vehicle ID´s verknüpfe.
    Wie kann ich das am besten machen so dass ich später halt die Vehicles parken kann, wenn ich im fahrzeug sitze (getplayervehicleid), der auch weis das fahrzeugid nr soundso auch zum fahrzeug aus der db gehört.
    Es muss ja die DB id = der echten vehicleid sein damitt ich die immer abfragen kann oder?
    Wenn ich dann aber lücken in der DB habe z.b. löscht einer sein vehicle dann ist die ID ja weg somit funktioniert meine (schlaue*) logik wieder nicht.


    Ich kann grad nicht so weit denken darum bitte ich um hilfe :D


    Enums der Fahzeuge, Normale Vehicles extra und PlayerVehicles extra
    enum Fahrzeuge
    {
    fvID,
    fvModel,
    Float:fvX,
    Float:fvY,
    Float:fvZ,
    Float:fvA,
    fvColor1,
    fvColor2,
    fvType
    //Vehicle Types
    //0 = Standart
    //1 = Grün
    //2 = Lila
    //3 = Gelb
    //100 = Admin
    //101 = Polizei
    //10 = CarShop 1
    //11 = CarShop 2
    }


    enum PlayerFahrzeuge
    {
    fvID,
    fvModel,
    Float:fvX,
    Float:fvY,
    Float:fvZ,
    Float:fvA,
    fvColor1,
    fvColor2,
    fvPaintjob,
    fvPrice,
    fvLocked,
    fvNeon,
    fvBesitzer[MAX_PLAYER_NAME]
    }


    Abfrage wenn einer im Fahrzeug und wenn Typ.. so und so dann Mache dies und das
    if(newstate == PLAYER_STATE_DRIVER)
    {

    new veh = GetPlayerVehicleID(playerid);
    if(Vehicles[veh][fvID] == veh)
    {
    SendClientMessage(playerid, green, "Selbe ID");
    }
    else
    {
    SendClientMessage(playerid, red, "Andere ID");
    }

    if(Vehicles[GetPlayerVehicleIDEX(playerid)][fvType] == 10)
    {
    SendClientMessage(playerid, green, "{FF0000}[SERVER] {FFFFFF}Du kannst dir das Fahzeug mit /buyvehicle kaufen");
    }
    else if(Vehicles[GetPlayerVehicleID(playerid)][fvType] == 11)
    {
    SendClientMessage(playerid, green, "{FF0000}[SERVER] {FFFFFF}Du kannst dir das Fahzeug mit /buyvehicle kaufen");
    }
    }


    MySql Stock um die Normalen/Player Vehicles zu Laden
    stock LoadPlayerVehicle(playerid)
    {
    new ID, String[1000], Name[MAX_PLAYER_NAME], Query[500];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name, Name);
    format(Query, sizeof(Query), "SELECT * FROM `PlayerVehicles` WHERE `Besitzer` = '%s'", Name);
    mysql_query(Query);
    mysql_store_result();
    if(mysql_num_rows() > 0)
    {
    while(mysql_fetch_row(String))
    {
    sscanf(String, "p<|>iiffffiiiiiis[200]", PlayerVehicles[ID][fvID], PlayerVehicles[ID][fvModel], PlayerVehicles[ID][fvX], PlayerVehicles[ID][fvY], PlayerVehicles[ID][fvZ], PlayerVehicles[ID][fvA], PlayerVehicles[ID][fvColor1], PlayerVehicles[ID][fvColor2], PlayerVehicles[ID][fvPaintjob], PlayerVehicles[ID][fvPrice], PlayerVehicles[ID][fvLocked], PlayerVehicles[ID][fvNeon], PlayerVehicles[ID][fvBesitzer]);
    PlayerVehicles[ID][fvID] = AddStaticVehicle(PlayerVehicles[ID][fvModel], PlayerVehicles[ID][fvX], PlayerVehicles[ID][fvY], PlayerVehicles[ID][fvZ], PlayerVehicles[ID][fvA], PlayerVehicles[ID][fvColor1], PlayerVehicles[ID][fvColor2]);
    SetVehicleHealth(PlayerVehicles[ID][fvID], 999.0);
    ID++;
    }
    }
    mysql_free_result();
    return 1;
    }


    stock LoadVehicles()
    {
    new ID = 1, String[1000];
    mysql_query("SELECT * FROM `Vehicles`");
    mysql_store_result();
    if(mysql_num_rows() > 0)
    {
    while(mysql_fetch_row(String))
    {
    sscanf(String, "p<|>iiffffiii", Vehicles[ID][fvID], Vehicles[ID][fvModel], Vehicles[ID][fvX], Vehicles[ID][fvY], Vehicles[ID][fvZ], Vehicles[ID][fvA], Vehicles[ID][fvColor1], Vehicles[ID][fvColor2], Vehicles[ID][fvType]);
    Vehicles[ID][fvID] = AddStaticVehicleEx(Vehicles[ID][fvModel], Vehicles[ID][fvX], Vehicles[ID][fvY], Vehicles[ID][fvZ], Vehicles[ID][fvA], Vehicles[ID][fvColor1], Vehicles[ID][fvColor2], (5*60));
    SetVehicleHealth(Vehicles[ID][fvID], 999.0);
    ID++;
    }
    }
    mysql_free_result();
    printf("--> %i Vehicles Loaded FromMySQL", ID);
    return 1;
    }


    Abfrage ob Vehicle ID = DatenbankID?!
    stock GetPlayerVehicleIDEX(playerid)
    {
    new veh = GetPlayerVehicleID(playerid);
    if(Vehicles[veh][fvID] == veh) return veh;
    for(new i; i < MAX_VEHICLES; i++)
    {
    if(Vehicles[i][fvID] == veh) return i;
    }
    return -1;
    }


    Parkbefehl (NOCH NICHT FERTIG DA ICH NICHT WEIS WIE ICH DAS AM BESTEN MACHEN KANN)
    CMD:park(playerid, params[])
    {
    if(GetPlayerState(playerid)==PLAYER_STATE_DRIVER)
    {
    if((!strcmp(PlayerVehicles[GetPlayerVehicleID(playerid)][fvBesitzer], SpielerNameAnzeige(playerid), false)))
    {
    new Float:vehx, Float:vehy, Float:vehz, Float:veha, Name[MAX_PLAYER_NAME], SQL[500];
    GetPlayerName(playerid, Name, MAX_PLAYER_NAME);
    mysql_real_escape_string(Name, Name);


    GetVehiclePos(GetPlayerVehicleID(playerid), vehx, vehy, vehz);
    GetVehicleZAngle(GetPlayerVehicleID(playerid), veha);


    format(SQL, sizeof(SQL), "UPDATE PlayerVehicles SET VehicleX = '%f' VehicleY = '%f' VehicleZ = '%f' VehicleAngle = '%f' WHERE Besitzer = '%s'", vehx, vehy, vehz, veha, Name);
    mysql_query(SQL);
    SendClientMessage(playerid, green, "{FF0000}[SERVER] {FFFFFF}Du hast das Fahrzeug geparkt");
    }
    else
    {
    SendClientMessage(playerid, red, "{FF0000}[SERVER] {FFFFFF}Das ist nicht dein Fahzeug");
    }
    }
    else
    {
    SendClientMessage(playerid, red, "{FF0000}[SERVER] {FFFFFF}Du musst als Fahrer im Fahrzeug sitzen");
    }
    return 1;
    }

    mfg
    Ali ;)

  • Ganz einfach (zummindest von der Logik her :D)
    Deine Autos haben immer 2 ID's. Einmal die eindeutige ID in deiner Datenbank (Auto Increment) und einmal die Fahrzeug-ID die von SA-MP selber vergeben wird.


    Deine Tabelle sieht also Praktisch so aus: EID | IID | VehicleModel | Color,position,etc.


    EID - Eindeutige ID, die per Auto Increment von MySQL vergeben wird.
    VehicleModel - die ID die das Fahrzeug Ingame bekommt. bei jedem Serverstart, wenn du die Autos lädst wird diese ID der EID zugewiesen.


    Wenn du Ingame ein Fahrzeug erstellst - Fahrzeug erstellen, Und die FahrzeugID mit in die Tabelle eintragen.


    Okay, so einfach hört sich das doch nicht an xD Aber wenn man es einmal verstanden hat dann ist es ganz einfach.
    Ich gebe dir mal als Beispiel den Code aus meinem Script:



    mysql_query("SELECT * FROM `autos`");
    mysql_store_result();
    new query[256];
    new RID, ID, mid,col1,col2,schild[20]; new Float:x,Float:y,Float:z,Float:angle,sp,sttt,intt;
    new vehicleid = 0;
    new str[256];
    while(mysql_fetch_row(str))
    {
    sscanf(str, "p<|>iiiiis[256]i{i}ffff{i}{i}iiiiiiiiiiiiiiii",RID,ID,mid,col1,col2,schild,sttt,x,y,z,angle,sp,Tuning[vehicleid][Hood],Tuning[vehicleid][Roof],Tuning[vehicleid][Sideskirt],Tuning[vehicleid][Lamps],Tuning[vehicleid][Nitro],Tuning[vehicleid][Exhaust],Tuning[vehicleid][Wheels],Tuning[vehicleid][Stereo],Tuning[vehicleid][Hydraulics],Tuning[vehicleid][FrontBumper],Tuning[vehicleid][RearBumper],Tuning[vehicleid][VentRight],Tuning[vehicleid][VentLeft],Tuning[vehicleid][Paintjob],intt);
    ID = CreateVehicle(mid,x,y,z,angle,col1,col2,0);
    Tuning[ID][Spoiler] = sp;
    Tuning[ID][Hood] = Tuning[vehicleid][Hood];
    Tuning[ID][Roof] = Tuning[vehicleid][Roof];
    Tuning[ID][Sideskirt] = Tuning[vehicleid][Sideskirt];
    Tuning[ID][Lamps] = Tuning[vehicleid][Lamps];
    Tuning[ID][Nitro] = Tuning[vehicleid][Nitro];
    Tuning[ID][Exhaust] = Tuning[vehicleid][Exhaust];
    Tuning[ID][Wheels] = Tuning[vehicleid][Wheels];
    Tuning[ID][Stereo] = Tuning[vehicleid][Stereo];
    Tuning[ID][Hydraulics] = Tuning[vehicleid][Hydraulics];
    Tuning[ID][FrontBumper] = Tuning[vehicleid][FrontBumper];
    Tuning[ID][RearBumper] = Tuning[vehicleid][RearBumper];
    Tuning[ID][VentRight] = Tuning[vehicleid][VentRight];
    Tuning[ID][VentLeft] = Tuning[vehicleid][VentLeft];
    Tuning[ID][Paintjob] = Tuning[vehicleid][Paintjob];
    AddVehicleComponent(ID,sp);
    AddVehicleComponent(ID,Tuning[vehicleid][Hood]);
    AddVehicleComponent(ID,Tuning[vehicleid][Roof]);
    AddVehicleComponent(ID,Tuning[vehicleid][Sideskirt]);
    AddVehicleComponent(ID,Tuning[vehicleid][Lamps]);
    AddVehicleComponent(ID,Tuning[vehicleid][Nitro]);
    AddVehicleComponent(ID,Tuning[vehicleid][Exhaust]);
    AddVehicleComponent(ID,Tuning[vehicleid][Wheels]);
    AddVehicleComponent(ID,Tuning[vehicleid][Stereo]);
    AddVehicleComponent(ID,Tuning[vehicleid][Hydraulics]);
    AddVehicleComponent(ID,Tuning[vehicleid][FrontBumper]);
    AddVehicleComponent(ID,Tuning[vehicleid][RearBumper]);
    AddVehicleComponent(ID,Tuning[vehicleid][VentRight]);
    AddVehicleComponent(ID,Tuning[vehicleid][VentLeft]);
    ChangeVehiclePaintjob(ID,Tuning[vehicleid][Paintjob]);
    VehPos[ID][vehx] = x;
    VehPos[ID][vehy] = y;
    VehPos[ID][vehz] = z;
    VehPos[ID][vehangle] = angle;
    SetVehicleNumberPlate(ID,schild);
    ChangeVehicleColor(ID,col1,col2);
    format(query, 128, "UPDATE autos SET ID = %d WHERE RID = %d",ID,RID); //Wichtige Zeile
    mysql_query(query);
    Tuning[ID][Colo1] = col1;
    Tuning[ID][Colo2] = col2;
    LinkVehicleToInterior(ID,intt);
    }


    Und das war eigentlich schon der ganze Buh. Also abgesehen das mit diesen VehPos Angaben. Da hab ich mir ein Enum erstellt damit ich die Positionen der Fahrzeuge auch im Script und nicht nur in der DB habe, damit man sein Fahrzeug z.B. Ingame Umparken kann ohne es zu löschen.