Problem bei Selfmade Carsystem

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 liebe SA-MP Community :)


    Ich habe ein Problem mit meinem Selfmade Carsystem.
    Erstmal ein paar Infos zum System damit ihr euch ein bischen vortsellen könnt wie es aussieht.
    - Es wird momentan noch mit Dini gespeichert (Tuning, Spawn, Besitzer, Key1-3, Reallife Sachen (Tank, Motorschaden...))
    - Es ist komplett Dynamisch (d.h. man kann ein beliebiges Auto egal wo und egal zu welchem Preis spawnen (Es steht beim Spawn zum Verkauf))
    - Und wie bereits erwähnt ein komplettes Selfmade ... kein GF Carsystem oder so.
    - Jedes Auto bekommt eine eigene ID
    So, beim letzten Punkt liegt aber auch mein Problem.
    Die vehicleid vom Script aus stimmt mit der ID vom Auto überein (beim Zerstören des Autos, beim Löschen eines Autos und beim Neu spawnen eines Autos).
    Doch sobald man einen Server Neustart macht, Stimmen die ID's nicht mehr überein und jedes Auto hat falsche Informationen.
    d.h. bei einem Sultan zb, wird die ModelID eines Sabres angezeigt und die falschen Besitzer.


    Ich weis nicht wie ich diese ID verschiebung verhindern kann ...
    Ich bitte euch um hilfe :)


    mfg
    Ronon_Dex

  • du gibst jeden auto eine id also du nummeriest durch, diese id ist für das array, in dem enum musst du dann nur noch ne variable haben, in der du die vehicle id von createveh. hast.

  • new SpawnedVehicles[MAX_VEHICLES];


    //... Deine Autos auf diese Variablen laden mit


    for (new i = 0; i < MAX_VEHICLES; i ++)
    {
    SpawnedVehicles[i] = AddStaticVehicle....;
    }


    http://wiki.sa-mp.com/wiki/AddStaticVehicle
    http://wiki.sa-mp.com/wiki/CreateVehicle
    http://wiki.sa-mp.com/wiki/CreateVehicleEx


    Das return gibt die VehicleID raus


    Wie färgt man ab ob welches Auto es ist?


    Ganz einfach


    forward IsSpawnedVehicle(vehicleid);


    public IsSpawnedVehicle(vehicleid)
    {
    for(new i = 0; i < sizeof(SpawnedVehicles); i++)
    {
    if(vehicleid == SpawnedVehicles[i]) return 1;
    }
    return 0;
    }


    //Ungetestet... So bitteschön

  • Es funkioniert leider immernoch nicht ... die Id's verschieben sich weiterhin


    vllt hilft ja das:
    Das Laden der Fahrzeuge:
    for(new i = 1; i < MAX_VEHICLES; i++)
    {
    new string[32];
    format(string, sizeof(string), "Autos/Car_%d.nec", i);
    if(fexist(string))
    {
    LadeFahrzeug(i);
    CreateVehicle(CarInfo[i][model], CarInfo[i][carx], CarInfo[i][cary], CarInfo[i][carz], CarInfo[i][cara],-1, -1, -1);
    //printf("AutoID: %d VehicleID: %d", CarInfo[i][ID], i);
    LadeFahrzeug(i);
    CarInfo[i][motorschaden] = 0;
    }
    }


    und dann ein Befehls beispiel womit ich die richtige Id abfrage:
    ocmd:papiere(playerid,params[])
    {
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    for(new veh=1;veh<MAX_VEHICLES;veh++)
    {
    if(CarInfo[veh][ID] == GetPlayerVehicleID(playerid))
    {
    new string[200];
    format(string,sizeof(string),"ID: %d - Model: %d\nBesitzer: %s\nKey1: %s\nKey2: %s\nKey3: %s\n\nAktueller Preis: %d",
    CarInfo[veh][ID],
    CarInfo[veh][model],
    CarInfo[veh][car_besitzer],
    CarInfo[veh][car_key1],
    CarInfo[veh][car_key2],
    CarInfo[veh][car_key3],
    CarInfo[veh][car_preis]);
    ShowPlayerDialog(playerid, 136, DIALOG_STYLE_MSGBOX,"Papiere des Fahrzeugs", string, "","");
    }
    }
    return 1;
    }

  • Ohje ^^ Du hat absoult nicht mein Beitrag gelesen ^^


    Beim ersten speicherst du es mit der CarID das ist der Fehelr dran!
    Lese mein Beitrag vorher nochmal durch udn mach es so dann klappt es 100%

  • Ich hatte das schon so probiert wie du es gemeint hast
    .. nur wieder raus gemacht da es nicht ging ...


    Oder ich habe es einfach falsch gemacht


    //Edit: nun habe ich es so://
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    new string[32];
    format(string, sizeof(string), "Autos/Car_%d.nec", i);
    if(fexist(string))
    {
    //if(IsSpawnedVehicle(i))
    LadeFahrzeug(i);
    SpawnedVehicles[i] = CreateVehicle(CarInfo[i][model], CarInfo[i][carx], CarInfo[i][cary], CarInfo[i][carz], CarInfo[i][cara],-1, -1, -1);
    LadeFahrzeug(i);
    CarInfo[i][motorschaden] = 0;
    }
    }


    Ich weis nur nicht genau, wo ich die abfrage hin tun soll, denn wenn ich sie in den Befehl einbaue, ist die Id ja trotzdem verschoben -.-
    und wenn ich sie bei OnGamemodeInit reintu werden die vehs garned erst gespawned ...


    //Edit: Infos


    Ich wesi nicht ob ihr das richtig versteht was ich meine:
    DIe Ids sind immer die richtigen, erst nachdem ein GMX gemacht wird, werden die Autos in falscher reihenfolge gespawned, aber nur wenn ein Auto Gelöscht wurde zB:
    Auto1 Auto2 Auto3 -- GMX -- alles in Ordnung
    Auto1 Auto3 -- GMX -- Auto 3 hat ID2 und kann ncihtmehr benutzt werden

    2 Mal editiert, zuletzt von Growen ()

  • Hier die Enum Struktur:
    enum Auto
    {
    model,
    farbe1,
    farbe2,
    Float:carx,
    Float:cary,
    Float:carz,
    Float:cara,
    car_besitzer[32],
    car_key1[32],
    car_key2[32],
    car_key3[32],
    car_preis,
    ID,
    motorschaden,
    Tankinhalt,
    PaintJob,
    Nos,
    Hyd,
    Vents,
    Lamps,
    Wheels,
    Hood,
    Roof,
    Auspuff,
    Spoiler,
    StossR,
    StossF,
    SideR,
    SideL,
    Nummernschild

    }
    new CarInfo[MAX_VEHICLES][Auto];


    Speichern
    CMD:
    ocmd:ccreate(playerid,params[])
    {
    new Float:x,
    Float:y,
    Float:z,
    Float:a,
    fahrzeug,
    kostet;
    if(sscanf(params, "dd",fahrzeug,kostet))
    {
    return SendClientMessage(playerid,gelb2,"Benutze: /erstellen [MODEL] [PREIS]");
    }
    else if (kostet < 0)
    {
    return SendClientMessage(playerid,rot,"Fahrzeug zu billig !");
    }
    else if (kostet > 450000)
    {
    return SendClientMessage(playerid,rot,"Fahrzeug zu teuer !");
    }
    else if (fahrzeug > 611)
    {
    return SendClientMessage(playerid,rot,"Ungültige ID !");
    }
    else if (fahrzeug < 400)
    {
    return SendClientMessage(playerid,rot,"Ungültige ID !");
    }
    else if(Spieler[playerid][AdminLevel] > 1)
    {
    GetPlayerPos(playerid,x,y,z);
    GetPlayerFacingAngle(playerid,a);
    new idx = CreateVehicle(fahrzeug, x,y,z+1.5,a,random(30),random(30),-1);
    CarInfo[idx][ID] = idx;
    CarInfo[idx][carx] = x;
    CarInfo[idx][cary] = y;
    CarInfo[idx][carz] = z;
    CarInfo[idx][cara] = a;
    CarInfo[idx][model] = fahrzeug;
    CarInfo[idx][farbe1] = random(30);
    CarInfo[idx][farbe2] = random(30);
    CarInfo[idx][car_preis] = kostet;
    SpeicherFahrzeug(idx);
    LadeFahrzeug(idx);
    SendClientMessage(playerid,gruen,"Fahrzeug erfolgreich erstellt !");
    PutPlayerInVehicle(playerid, idx, 0);
    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof name);
    log(name,"Befehl: ccreate");
    }
    return 1;
    }


    Speichern an sich:
    public SpeicherFahrzeug(carid)
    {
    if(carid <= 0)
    {
    return 1;
    }
    CarInfo[carid][model] = GetVehicleModel(carid);
    new str[25];
    format(str, sizeof(str), "Autos/Car_%d.nec", carid);
    dini_Create(str);
    {
    dini_IntSet(str,"ID",CarInfo[carid][ID]);
    dini_IntSet(str,"Model",CarInfo[carid][model]);
    dini_IntSet(str,"Farbe1",CarInfo[carid][farbe1]);
    dini_IntSet(str,"Farbe2",CarInfo[carid][farbe2]);
    dini_FloatSet(str,"x",CarInfo[carid][carx]);
    dini_FloatSet(str,"y",CarInfo[carid][cary]);
    dini_FloatSet(str,"z",CarInfo[carid][carz]);
    dini_FloatSet(str,"a",CarInfo[carid][cara]);
    dini_IntSet(str,"Preis",CarInfo[carid][car_preis]);
    dini_Set(str,"Besitzer","Keiner");
    dini_Set(str,"Key1","Keiner");
    dini_Set(str,"Key2","Keiner");
    dini_Set(str,"Key3","Keiner");
    dini_IntSet(str,"Motorschaden",0);
    dini_IntSet(str,"Tankinhalt",100);
    dini_IntSet(str,"Lackierung",0);
    dini_IntSet(str,"Nitro",0);
    dini_IntSet(str,"Hydraulik",0);
    dini_IntSet(str,"Vents",0);
    dini_IntSet(str,"Lamps",0);
    dini_IntSet(str,"Wheels",0);
    dini_IntSet(str,"Hood",0);
    dini_IntSet(str,"Roof",0);
    dini_IntSet(str,"Auspuff",0);
    dini_IntSet(str,"Spoiler",0);
    dini_IntSet(str,"StossR",0);
    dini_IntSet(str,"StossF",0);
    dini_IntSet(str,"SideR",0);
    dini_IntSet(str,"SideL",0);
    dini_Set(str,"Nummernschild","Classic");
    return LadeFahrzeug(carid);
    }
    }


    Laden der Fahrzeuge:
    public LadeFahrzeug(carid)
    {
    new str[25],nummer[9];
    format(str, sizeof(str), "Autos/Car_%d.nec", carid);
    if(carid == 0)
    {
    return 1;
    }
    if(fexist(str))
    {
    CarInfo[carid][ID] = dini_Int(str,"ID");
    CarInfo[carid][model] = dini_Int(str,"Model");
    CarInfo[carid][farbe1] = dini_Int(str,"Farbe1");
    CarInfo[carid][farbe2] = dini_Int(str,"Farbe2");
    CarInfo[carid][carx] = dini_Float(str,"x"); // hier laden wir die Werte
    CarInfo[carid][cary] = dini_Float(str,"y");
    CarInfo[carid][carz] = dini_Float(str,"z");
    CarInfo[carid][cara] = dini_Float(str,"a");
    CarInfo[carid][car_preis] = dini_Int(str,"Preis");
    format(CarInfo[carid][car_besitzer],32,"%s",dini_Get(str,"Besitzer"));
    format(CarInfo[carid][car_key1],32,"%s",dini_Get(str,"Key1"));
    format(CarInfo[carid][car_key2],32,"%s",dini_Get(str,"Key2"));
    format(CarInfo[carid][car_key3],32,"%s",dini_Get(str,"Key3"));
    CarInfo[carid][motorschaden] = dini_Int(str,"Motorschaden");
    CarInfo[carid][Tankinhalt] = dini_Int(str,"Tankinhalt");
    CarInfo[carid][PaintJob] = dini_Int(str,"Lackierung");
    CarInfo[carid][Nos] = dini_Int(str,"Nitro");
    CarInfo[carid][Hyd] = dini_Int(str,"Hydraulik");
    CarInfo[carid][Vents] = dini_Int(str,"Vents");
    CarInfo[carid][Lamps] = dini_Int(str,"Lamps");
    CarInfo[carid][Wheels] = dini_Int(str,"Wheels");
    CarInfo[carid][Hood] = dini_Int(str,"Hood");
    CarInfo[carid][Roof] = dini_Int(str,"Roof");
    CarInfo[carid][Auspuff] = dini_Int(str,"Auspuff");
    CarInfo[carid][Spoiler] = dini_Int(str,"Spoiler");
    CarInfo[carid][StossR] = dini_Int(str,"StossR");
    CarInfo[carid][StossF] = dini_Int(str,"StossF");
    CarInfo[carid][SideR] = dini_Int(str,"SideR");
    CarInfo[carid][SideL] = dini_Int(str,"SideL");

    ChangeVehicleColor(carid,CarInfo[carid][farbe1],CarInfo[carid][farbe2]);
    format(CarInfo[carid][Nummernschild],9,"%s",dini_Get(str,"Nummernschild"));
    format(nummer,sizeof(nummer),"%s",CarInfo[carid][Nummernschild]);
    SetVehicleNumberPlate(CarInfo[carid][ID],nummer);
    if(CarInfo[carid][PaintJob] > 0) {ChangeVehiclePaintjob(CarInfo[carid][ID],CarInfo[carid][PaintJob]);}
    if(CarInfo[carid][Nos] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Nos]);}
    if(CarInfo[carid][Hyd] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Hyd]);}
    if(CarInfo[carid][Wheels] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Wheels]);}
    if(CarInfo[carid][Auspuff] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Auspuff]);}
    if(CarInfo[carid][SideL] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][SideL]);}
    if(CarInfo[carid][SideR] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][SideR]);}
    if(CarInfo[carid][StossF] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][StossF]);}
    if(CarInfo[carid][StossR] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][StossR]);}
    if(CarInfo[carid][Spoiler] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Spoiler]);}
    if(CarInfo[carid][Roof] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Roof]);}
    if(CarInfo[carid][Hood] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Hood]);}
    if(CarInfo[carid][Vents] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Vents]);}
    if(CarInfo[carid][Lamps] > 0) {AddVehicleComponent(CarInfo[carid][ID],CarInfo[carid][Lamps]);}

    new engine,lights,alarm,doors,bonnet,boot,objective;
    GetVehicleParamsEx(carid,engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(carid,VEHICLE_PARAMS_OFF,lights,alarm,doors,bonnet,boot,objective);
    motor[carid] = false;
    }
    return 1;
    }


    Und Unter GamemodeInit:
    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    new string[32];
    format(string, sizeof(string), "Autos/Car_%d.nec", i);
    if(fexist(string))
    {
    //if(IsSpawnedVehicle(i))
    LadeFahrzeug(i);
    SpawnedVehicles[i] = CreateVehicle(CarInfo[i][model], CarInfo[i][carx], CarInfo[i][cary], CarInfo[i][carz], CarInfo[i][cara],-1, -1, -1);
    LadeFahrzeug(i);
    CarInfo[i][motorschaden] = 0;
    }
    }


    abfragen der IDs:
    ocmd:papiere(playerid,params[])
    {
    if(!IsPlayerInAnyVehicle(playerid)) return 1;
    for(new veh=1;veh<MAX_VEHICLES;veh++)
    {
    if(CarInfo[veh][ID] == GetPlayerVehicleID(playerid))
    {
    new string[200];
    format(string,sizeof(string),"ID: %d - Model: %d\nBesitzer: %s\nKey1: %s\nKey2: %s\nKey3: %s\n\nAktueller Preis: %d",
    CarInfo[veh][ID],
    CarInfo[veh][model],
    CarInfo[veh][car_besitzer],
    CarInfo[veh][car_key1],
    CarInfo[veh][car_key2],
    CarInfo[veh][car_key3],
    CarInfo[veh][car_preis]);
    ShowPlayerDialog(playerid, 136, DIALOG_STYLE_MSGBOX,"Papiere des Fahrzeugs", string, "","");
    }
    }
    return 1;
    }

  • Der Fehler liegt schon am Speichern und Laden! Du speicherst es mit Datei%d = carid?!


    Das sollst eben nicht! Lese mein Beitrag durch dann müsstest du es hinkriegen. Nicht nach Carid speichern sondern jedes Auto hat eine feste ID... CarID wurde bei mir über eine Funktion abgefragt

  • man ich versteh ned wie du das willst ...
    kannst du vllt mal die Stücke von oben rauskopieren, bei meinem Post ,und es so umändern wie du es meinst, das es geht ?


    ich habe nähmlich keine Vorstellugn wo das rein soll und wie ich das alles aufbauen soll ...



    ..Man ich hatte noch nie so große problem wie bei diesem dämlichen Carsystem -.-


    //Edit:


    Leute bitte macht euch doch mal ein bischen die mühe hier was ordentliches rein zu schreiben.
    Ich weis das sehr viele Leute hier wissen was ich machen muss.
    ich verstehe nur nicht warum sie nur knappe oder garkeine Antworten geben :(
    Es wäre wirklich sehr sehr nett wenn jemand mit mir dieses Problem lösen könnte ... :)

    2 Mal editiert, zuletzt von Growen ()


  • Hier steht alles drin... vehicleid ist die carid von der du schreibst... Habe leider nicht die Zeit dir das jetzt fertig zu scripten...
    Über eine Forschleife frägst du sozusagen die CARID ab... Sprich scheiß egal welche CARID das Auto1 hat es wird gefunden...

  • Ich werd dir jetzt auch mal versuchen zu helfen, da du hier ja ziemlich verzweifelst und dir keiner so richtig helfen kann.
    Ich benutze zwar kein Dini, aber

    dini_Create(str);
    { //1. Klammer
    dini_IntSet(str,"ID",CarInfo[carid][ID]);
    dini_IntSet(str,"Model",CarInfo[carid][model]);
    dini_IntSet(str,"Farbe1",CarInfo[carid][farbe1]);
    dini_IntSet(str,"Farbe2",CarInfo[carid][farbe2]);
    dini_FloatSet(str,"x",CarInfo[carid][carx]);
    dini_FloatSet(str,"y",CarInfo[carid][cary]);
    dini_FloatSet(str,"z",CarInfo[carid][carz]);
    dini_FloatSet(str,"a",CarInfo[carid][cara]);
    dini_IntSet(str,"Preis",CarInfo[carid][car_preis]);
    dini_Set(str,"Besitzer","Keiner");
    dini_Set(str,"Key1","Keiner");
    dini_Set(str,"Key2","Keiner");
    dini_Set(str,"Key3","Keiner");
    dini_IntSet(str,"Motorschaden",0);
    dini_IntSet(str,"Tankinhalt",100);
    dini_IntSet(str,"Lackierung",0);
    dini_IntSet(str,"Nitro",0);
    dini_IntSet(str,"Hydraulik",0);
    dini_IntSet(str,"Vents",0);
    dini_IntSet(str,"Lamps",0);
    dini_IntSet(str,"Wheels",0);
    dini_IntSet(str,"Hood",0);
    dini_IntSet(str,"Roof",0);
    dini_IntSet(str,"Auspuff",0);
    dini_IntSet(str,"Spoiler",0);
    dini_IntSet(str,"StossR",0);
    dini_IntSet(str,"StossF",0);
    dini_IntSet(str,"SideR",0);
    dini_IntSet(str,"SideL",0);
    dini_Set(str,"Nummernschild","Classic");
    return LadeFahrzeug(carid);
    } //2. Klammer



    Soweit ich weiß, gehören da doch keine Klammern hin, oder? (Wie gesagt, benutze kein Dini)


    Und probier es auch statt CreateVehicle mit AddStaticVehicle.