Fehler bei dynamischem Car System

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
  • Nabend,
    ich scripte derzeit an einem eigenen Funserver, auf dem ich ein Car-System machen möchte (ich arbeite mit Dini)... Dazu muss ich sagen, dass ich erst vor kurzem mit scripten angefangen habe... Ich hab das Grundgerüst so aufgebaut, dass ich mit einem Befehl ein Fahrzeug erstellen kann, welches als Datei gespeichert und beim starten des Servers geladen wird.


    Das ist der Befehl:
    ocmd:testveh(playerid,params[])
    {
    if(IsPlayerAnAdmin(playerid,4))
    {
    new carid, Float:x, Float:y, Float:z, Float:angle, color1, color2;
    if(sscanf(params,"iii",carid,color1,color2)) return SendClientMessage(playerid,GRAU,"Benutze /testveh [ID]");


    GetPlayerPos(playerid, x,y,z);
    GetPlayerFacingAngle(playerid, angle);
    new id = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);


    CarInfo[id][aID] = id;
    CarInfo[id][aX] = x;
    CarInfo[id][aY] = y;
    CarInfo[id][aZ] = z;
    CarInfo[id][aAngle] = angle;
    CarInfo[id][aModel] = carid;
    CarInfo[id][aColor1] = color1;
    CarInfo[id][aColor2] = color2;
    CarInfo[id][aVer] = 0;
    SpeicherFahrzeug(id);
    SendClientMessage(playerid, GELB, "Car gespawnt!");
    }
    else
    {
    return 0;
    }
    return 1;
    }




    public SpeicherFahrzeug(carid)
    {
    new str[25];
    format(str, sizeof(str), "%d.car", carid);


    if(carid <= 0)
    {
    return 1;
    }
    else
    dini_Create(str);
    {
    dini_IntSet(str,"ID",CarInfo[carid][aID]);
    dini_FloatSet(str,"aX", CarInfo[carid][aX]);
    dini_FloatSet(str,"aY", CarInfo[carid][aY]);
    dini_FloatSet(str,"aZ", CarInfo[carid][aZ]);
    dini_FloatSet(str,"aAngle", CarInfo[carid][aAngle]);
    dini_IntSet(str,"Model",CarInfo[carid][aModel]);
    dini_IntSet(str,"Color1",CarInfo[carid][aColor1]);
    dini_IntSet(str,"Color2",CarInfo[carid][aColor2]);
    dini_IntSet(str,"Verkauft",CarInfo[carid][aVer]);
    }
    return 1;
    }



    Wenn ich ein Auto mit einem 2. Befehl verkaufe, wird die Variable "Verkauft" in der Datei von dem car auf "1" gesetzt und beim Laden aller Dateien werden alle cars, bei denen "Verkauft" auf 1 ist in eine andere Welt gesetzt (damit sich die ID's nicht verschieben).



    Nun habe ich noch einen 3. Befehl (noch nicht ganz fertig, war nur ein Test) mit dem ich ein car "kaufen" möchte... Wenn ich den Befehl eingebe, sollte eigentlich eine for-Schleife alle Dateien durchsuchen und bei der 1. stoppen, in der "Verkauft" auf 1 ist. Das Auto der Datei soll dann gelöscht und ein neues Auto erstellt werden. Zusätzlich sollen die Werte in der Datei dem neuen Auto angepasst werden.


    ocmd:testveh2(playerid,params[])
    {
    if(IsPlayerAnAdmin(playerid,4))
    {
    new carid, id, newid, Float:x, Float:y, Float:z, Float:angle, color1, color2;
    if(sscanf(params,"iii",carid,color1,color2)) return SendClientMessage(playerid,GRAU,"Benutze /testveh [ID]");

    GetPlayerPos(playerid, x,y,z);
    GetPlayerFacingAngle(playerid, angle);

    for(new i = 0; i < MAX_VEHICLES; i++)
    {
    new str[32];
    format(str, sizeof(str), "%d.car", i);


    if(dini_Int(str,"Verkauft") == 1)
    {
    i = id;
    format(str, sizeof(str), "%d.car", id);
    DestroyVehicle(id);

    newid = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);

    CarInfo[newid][aX]=x;
    CarInfo[newid][aY]=y;
    CarInfo[newid][aZ]=z;
    CarInfo[newid][aAngle]=angle;
    CarInfo[newid][aModel]=carid;
    CarInfo[newid][aColor1]= color1;
    CarInfo[newid][aColor2]= color2;
    CarInfo[newid][aVer]=0;


    dini_FloatSet(str,"aX", CarInfo[newid][aX]);
    dini_FloatSet(str,"aY", CarInfo[newid][aY]);
    dini_FloatSet(str,"aZ", CarInfo[newid][aZ]);
    dini_FloatSet(str,"aAngle", CarInfo[newid][aAngle]);
    dini_IntSet(str,"Model",CarInfo[newid][aModel]);
    dini_IntSet(str,"Color1",CarInfo[newid][aColor1]);
    dini_IntSet(str,"Color2",CarInfo[newid][aColor2]);
    dini_IntSet(str,"Verkauft",CarInfo[newid][aVer]);


    break;


    }
    }
    SendClientMessage(playerid, GELB, "Car gespawnt!");
    }
    else
    {
    return 0;
    }
    return 1;
    }



    Aus irgendeinen Grund wird die Datei dem neuen Auto aber nicht zugewiesen, und das Auto hat dann eine andere ID als es eigtl. haben sollte, da das vorherige car ja gelöscht wurde.


    Ich hoffe, ihr versteht was ich meine O.o



    Nun bin ich mir nicht sicher, ob es, so wie ich es gemacht habe, generell nicht geht, oder ob ich nur igendwo einen Fehler gemacht habe :/
    Würde mich über hilfreiche Antworten freuen.

  • Wofür brauhcst du die carid wenn du sie nirgends verwendest?
    Sollte das nicht eher so sein? new str[32];
    format(str, sizeof(str), "%d.car", carid);
    if(dini_Exists(str))
    {
    if(dini_Int(str,"Verkauft") == 1)
    {
    carid = id;
    DestroyVehicle(id);


    newid = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);


    CarInfo[newid][aX]=x;
    CarInfo[newid][aY]=y;
    CarInfo[newid][aZ]=z;
    CarInfo[newid][aAngle]=angle;
    CarInfo[newid][aModel]=carid;
    CarInfo[newid][aColor1]= color1;
    CarInfo[newid][aColor2]= color2;
    CarInfo[newid][aVer]=0;




    dini_FloatSet(str,"aX", CarInfo[newid][aX]);
    dini_FloatSet(str,"aY", CarInfo[newid][aY]);
    dini_FloatSet(str,"aZ", CarInfo[newid][aZ]);
    dini_FloatSet(str,"aAngle", CarInfo[newid][aAngle]);
    dini_IntSet(str,"Model",CarInfo[newid][aModel]);
    dini_IntSet(str,"Color1",CarInfo[newid][aColor1]);
    dini_IntSet(str,"Color2",CarInfo[newid][aColor2]);
    dini_IntSet(str,"Verkauft",CarInfo[newid][aVer]);



    }
    }
    else return SendClientMessage(playerid,COLOR,"Diese ID gibt es nicht!");

  • Danke für die Antwort, aber die carid brauche ich später nochmal, deswegen achte ich darauf, dass diese nicht durch Löschen und Erstellen von cars verschoben werden.


    Ich habe den Befehl jetzt nochmal etwas geändert, aber die for-Schleife drin gelassen:
    ocmd:testveh2(playerid,params[])
    {
    if(IsPlayerAnAdmin(playerid,4))
    {
    new carid, Float:x, Float:y, Float:z, Float:angle, color1, color2;
    if(sscanf(params,"iii",carid,color1,color2)) return SendClientMessage(playerid,GRAU,"Benutze /testveh [ID]");


    GetPlayerPos(playerid, x,y,z);
    GetPlayerFacingAngle(playerid, angle);


    for(new i = 1; i < MAX_VEHICLES; i++)
    {
    new str[100];
    format(str, sizeof(str), "%d.car", i);

    if(fexist(str))
    {
    if(dini_Int(str,"Verkauft")==1)
    {
    DestroyVehicle(i);


    i = CreateVehicle(carid, x+2,y,z,angle+4,color1,color2,-1);
    CarInfo[i][aX] = x;
    CarInfo[i][aY] = y;
    CarInfo[i][aZ] = z;
    CarInfo[i][aAngle] = angle;
    CarInfo[i][aModel] = carid;
    CarInfo[i][aColor1] = color1;
    CarInfo[i][aColor2] = color2;
    CarInfo[i][aVer] = 0;


    dini_FloatSet(str,"aX", CarInfo[i][aX]);
    dini_FloatSet(str,"aY", CarInfo[i][aY]);
    dini_FloatSet(str,"aZ", CarInfo[i][aZ]);
    dini_FloatSet(str,"aAngle", CarInfo[i][aAngle]);
    dini_IntSet(str,"Model",CarInfo[i][aModel]);
    dini_IntSet(str,"Color1",CarInfo[i][aColor1]);
    dini_IntSet(str,"Color2",CarInfo[i][aColor2]);
    dini_IntSet(str,"Verkauft",CarInfo[i][aVer]);
    return 1;
    }
    else
    {
    SendClientMessage(playerid,ROT,"Diese ID gibt es nicht!");
    }
    }
    }

    }
    else
    {
    return 0;
    }
    return 1;
    }


    Ob nun alles richtig ist, weiß ich nicht, aber es funktioniert erstmal so, wie ich es in meinem 1. Beitrag bereits beschrieben hatte.


    Nun habe ich aber ein neues Problem:
    Nachdem die for-Schleife alle Datein überprüft und keine Datei gefunden hat, in der "Verkauft" auf 1 ist, soll eine neue Datei stellt werden, wie mit dem 1. Befehl. Aber wo muss ich das ganze dann einfügen? In die for-Schleife kann ich es ja nicht einfügen, weil die sich ja wiederholt... :/