Jedes Auto Speichern?

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
  • Huhu,


    ich habe eine Frage undzwar ist es möglich jedes Fahrzeug, dass es auf meinem Server gibt zu speichern?
    Bzw Speichern in dem Sinne:


    Ich habe ein Kilometer System und möchte, dass es für jedes Fahrzeug auf meinem Server gespeichert wird.


    Habe es bisjetzt so:



    forward saveCar();
    public saveCar()
    {
    for (new i=0; i< MAX_VEHICLES; i++)
    {
    new vehicle;
    vehicle = GetPlayerVehicleID(i);
    new autos[255];
    format(autos, sizeof(autos), "/Autos/%i.ini", vehicle);
    if ( !dini_Exists(autos) ) { dini_Create(autos); }
    dini_FloatSet(autos,"Gefahrene KM", vehicles[vehicle][vehicleKm]);
    }
    return 1;
    }


    und natürlich das laden:



    forward loadCar();
    public loadCar()
    {
    for (new j=0; j< MAX_VEHICLES; j++)
    {
    new vehicle;
    vehicle = GetPlayerVehicleID(j);
    new autos[255];
    format(autos, sizeof(autos), "/Autos/%i.ini", vehicle);
    if ( !dini_Exists(autos) ) { dini_Create(autos); }
    vehicles[vehicle][vehicleKm] = dini_Float(autos,"Gefahrene KM");
    }
    return 1;
    }
    und SaveCar unter OngamemodeExit


    Leider Speichert er nichts weder erstellt noch eine Datei mit der VehicleID


    Hoffe einer kann mir helfen :)


    P.S: Order "Autos" ist erstellt


    MfG


    Kevin

  • Bitte benutz doch den PAWN BB-Code


    Der Code nochmal übersichtlich:


    forward saveCar();
    public saveCar()
    {
    for (new i=0; i< MAX_VEHICLES; i++)
    {
    new vehicle;
    vehicle = GetPlayerVehicleID(i);
    new autos[255];
    format(autos, sizeof(autos), "/Autos/%i.ini", vehicle);
    if ( !dini_Exists(autos) ) { dini_Create(autos); }
    dini_FloatSet(autos,"Gefahrene KM", vehicles[vehicle][vehicleKm]);
    }
    return 1;
    }


    und natürlich das laden:



    forward loadCar();
    public loadCar()
    {
    for (new j=0; j< MAX_VEHICLES; j++)
    {
    new vehicle;
    vehicle = GetPlayerVehicleID(j);
    new autos[255];
    format(autos, sizeof(autos), "/Autos/%i.ini", vehicle);
    if ( !dini_Exists(autos) ) { dini_Create(autos); }
    vehicles[vehicle][vehicleKm] = dini_Float(autos,"Gefahrene KM");
    }
    return 1;
    }

    Mit freundlichen Grüßen,
    Derakar

  • Sobald ich das mit dem " [/pwn] mach, schiebt er bei mir alles in eine Zeile...


    Der Pawn BB Code - Die richtige Anwendung



    EDIT:

    Da ich bemerkt habe, dass du dich gut auskennst mit Scripten usw.
    Könntest du ebend mal in einem Threadvon mir nachgucken? Benötige es dringend... Jeffry:


    Ahh, dachte das sei schon erledigt, weil du dich bedankt hattest.


    Schreibe es so:
    forward saveCar();
    public saveCar()
    {
    for (new i=0; i < MAX_VEHICLES; i++)
    {
    new autos[32];
    format(autos, sizeof(autos), "/Autos/%i.ini", i);
    if ( !dini_Exists(autos) )
    {
    dini_Create(autos);
    }
    dini_FloatSet(autos,"Gefahrene KM", vehicles[i][vehicleKm]);
    }
    return 1;
    }


    forward loadCar();
    public loadCar()
    {
    for (new j=0; j < MAX_VEHICLES; j++)
    {
    new autos[32];
    format(autos, sizeof(autos), "/Autos/%i.ini", j);
    if ( !dini_Exists(autos) )
    {
    dini_Create(autos);
    }
    vehicles[j][vehicleKm] = dini_Float(autos,"Gefahrene KM");
    }
    return 1;
    }

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • Habe mich bedankt, da er mir den Code nochmal übersichtlich hingeschrieben hat.


    Habe nun dein Schnipsel getestet, er erstellt zwar die Dateien aber nicht die Eigentlichen Fahrzeug ids.
    Er speichert dennoch die Kilometer bloß es wird jetzt schwer 2000 Dateien durchzugucken in welche Datei genau..


    Habe gerade nachgeschaut, habe zz. 141 Autos auf meinem Server.


    D.h. er müsste eig. 141 Dateienerstellen.
    er erstellt aber genau 2001 Dateien.
    Die Dateien sehen wie folgt aus:


    0
    1
    10
    100
    1000
    1001 - 2001
    2
    20
    200
    2000


    Eine Idee? :D


    MfG

  • Habe grad nachgeschaut, in einer Datei sei ein Auto ca 5000 KM gefahren, was nicht sein kann..


    Hier mal ein Beispiel wie ich meine Fahrzeuge erstelle:
    lspdcar[0]=CreateVehicle(596,1558.9219,-1710.9008,5.5059,0.6407,162,1,-1); // lspdcar1
    lspdcar[1]=CreateVehicle(596,1562.3774,-1710.7616,5.5064,3.3127,162,1,-1); // lspdcar2
    lspdcar[2]=CreateVehicle(596,1565.8649,-1710.9077,5.5042,357.2282,162,1,-1); // lspdcar3
    lspdcar[3]=CreateVehicle(596,1570.1058,-1710.8044,5.5062,0.8896,162,1,-1); // lspdcar4
    lspdcar[4]=CreateVehicle(596,1574.3531,-1710.7686,5.5069,2.1109,162,1,-1); // lspdcar5
    lspdcar[5]=CreateVehicle(596,1578.7871,-1710.6569,5.5072,358.7660,162,1,-1); // lspdcar6
    lspdcar[6]=CreateVehicle(596,1583.6697,-1710.6595,5.5069,356.7186,162,1,-1); // lspdcar7
    lspdcar[7]=CreateVehicle(596,1587.5743,-1710.6823,5.5067,359.1919,162,1,-1); // lspdcar8
    lspdcar[8]=CreateVehicle(596,1591.5151,-1710.6036,5.5063,1.1170,162,1,-1); // lspdcar9
    lspdcar[9]=CreateVehicle(596,1595.5037,-1710.6510,5.5070,0.3941,162,1,-1); // lspdcar10


    Aus dem prinzip, da ich die Fahrzeuge noch brauche.. Z.b. für eine Abfrage für /motor ob der Spieler in solch einem Auto ist und berechtigt ist...


    Könntest du mit Teamviewer oder so mal schauen wenn du Lust hättest? Oder einfach mal reden und so sagen^^

  • Dann würde ich es so schreiben:
    forward saveCar();
    public saveCar()
    {
    new autos[32];
    for (new i=0; i < sizeof(lspdcar); i++)
    {
    format(autos, sizeof(autos), "/Autos/lspdcar%i.ini", i);
    if ( !dini_Exists(autos) )
    {
    dini_Create(autos);
    }
    dini_FloatSet(autos,"Gefahrene KM", vehicles[lspdcar[i]][vehicleKm]);
    }
    return 1;
    }


    forward loadCar();
    public loadCar()
    {
    new autos[32];
    for (new j=0; j < sizeof(lspdcar); j++)
    {
    format(autos, sizeof(autos), "/Autos/lspdcar%i.ini", j);
    if ( !dini_Exists(autos) )
    {
    dini_Create(autos);
    }
    vehicles[lspdcar[j]][vehicleKm] = dini_Float(autos,"Gefahrene KM");
    }
    return 1;
    }


    Nein, sorry. TeamViewer oder TeamSpeak nutze ich für Support nicht, da das viel zu lange dauert, die Zeit habe ich nicht. Eine Antwort dauert eine Minute, bei TeamViewer kommt es meistens auf eine Stunde raus.

  • So, nach gefühlten 100 tests habe ich nun ein überblick vom ganzen.


    Mit deinem Schnipsel speichert er alles. Dennoch schreibt er eine Falsche Zahl um genauer zu sein nimmt er die Kilometer mal 1000.
    Z.b. Ich bin 5km gefahren zeigt aber 5000 an.
    Habe dann ganz einfach das hier gemacht aber nur bei savecar


    (vehicles[lspdcar[i]][vehicleKm]/1000)


    Sobald ich den Server ausschalte und einschalte, ladet er nichts. dennoch ist in der Datei der alte Wert.


    Idee?


    Zudem wunder ich mich, angenommen ich lösche nochmal alle Dateien von den Fahrzeugen.
    Ich Starte den Server -> Es werden neue erstellt -> in den Dateien steht überall 0.000000km gefahren.
    Sobald ich aber in eines der Fahrzeuge einsteige zeigt er bei den LSPD Cars 2.33 zu viel an. Sprich ich bin noch kein stück gefahren, zeigt aber 2.33 an. Dies wird dann nach serverclose logischerweise gespeichert.
    Bei den Motorrädern zeigt er komischerweise nur 2.31 zu viel an und beim Infernus 2.30.


    Misteriöse angelegenheit.


    Ich poste mal überall wo ich [vehicleKm] benutze:


    enum vehicleData {
    Float:vehicleKm,
    Float:vLastX,
    Float:vLastY,
    Float:vLastZ
    };
    new vehicles[MAX_VEHICLES][vehicleData];


    bei save- und loadcar


    und bei meinem Speedometer:


    forward Speedometer(playerid);
    public Speedometer(playerid)
    {
    if ( IsPlayerConnected(playerid) )
    {
    if( IsPlayerInAnyVehicle(playerid) )
    {
    new string[255];
    new vehicleid = GetPlayerVehicleID(playerid);
    if ( GetPlayerState(playerid) == PLAYER_STATE_DRIVER )
    {
    new Float:x2, Float:y2, Float:z2, Float:output;
    GetVehiclePos(vehicleid, x2, y2, z2);
    output = floatsqroot(floatpower(floatabs(floatsub(x2, vehicles[vehicleid][vLastX])), 2)+floatpower(floatabs(floatsub(y2, vehicles[vehicleid][vLastY])), 2)+floatpower(floatabs(floatsub(z2, vehicles[vehicleid][vLastZ])), 2));
    vehicles[vehicleid][vehicleKm] += output;
    vehicles[vehicleid][vLastX] = x2; vehicles[vehicleid][vLastY] = y2; vehicles[vehicleid][vLastZ] = z2;
    }
    format(string,sizeof(string),"%.2f",(vehicles[vehicleid][vehicleKm]/1000));
    TextDrawSetString(Speedo7[playerid], string);
    }
    }
    return 1;
    }


    Hoffe kannst helfen.. bin selber überfordert. Danke dir jetzt schon für deine ganzen Bemühungen :)  Jeffry:

  • Warum er dir das in 1000'fachen Wert speichert kann ich dir so nicht sagen, das müsste man mal debuggen. Aber wenn es mit /1000.0 (!) geht, dann ist ja gut.
    Wenn du aber sagst, er lädt es nicht mehr, lädt er es denn, wenn du das /1000 weg machst, unabhänngig davon, ob jetzt 5000 ist der Date steht?


    Zwecks den 2.33/2.31/2.30:
    Das liegt daran, dass du die Position zwischen zwei Punkten berechnest. Am Anfang sind deine vLastX(etc) aber alle 0, sprich es wird die Distanz vom 0-Punkt zum Spawn-Punkt berechnet. Du müsstest das abfangen, indem du nur output dazuzählst, wenn die drei Last's nicht 0 sind:


    if(vehicles[vehicleid][vLastX] != 0.0 && vehicles[vehicleid][vLastY] != 0.0 && vehicles[vehicleid][vLastZ] != 0.0) vehicles[vehicleid][vehicleKm] += output;


    Dann wäre zumindest das behoben.



    Teste das mit dem Speichern/Laden mal ohne die Division durch 1000, und schau ob er dann was lädt.
    Wenn nicht, dann liegt es möglicherweise daran, dass du versuchst die Daten zu laden, bevor du die Fahrzeuge erstellt hast (Reihenfolge des Codes bei OnGameModeInit). Es müssen erst die Fahrzeuge erstellt werden, dann können die Daten geladen werden.

  • Wieder mal einige Dinge getestet,
    das mit dem Speichern/Laden klappt nun wunderbar. Habe das Laden einfach ans ende von GamemodeInit gepackt. Danke dafür.
    Zwecks den 2.33 usw. hat dein Code auch funktioniert, ebenfalls danke.


    Nun aber, sobald ich den Server ausmache, dividiert er jedesmal die KM durch 1000. Ich könnte auch einfach die Division entfernen, dann ist es aber nicht mehr so übersichtlich.
    Eine Idee wie er dies einmalig machen könnte und dann niewieder? Wenn nicht, dann lass ich einfach die Division weg, jeder kann durch 1000 Rechnen, das ist nicht das Problem.
    Das wichtigste war einfach, dass er alles Speichert/Lädt und nicht zu viel anzeigt.


    E:


    Das heisst also, ich muss jetzt für jedes erstellte Fahrzeug das hier machen?:


    for (new i=0; i < sizeof(lspdcar); i++)
    {
    format(autos, sizeof(autos), "/Autos/lspdcar%i.ini", i);
    if ( !dini_Exists(autos) )
    {
    dini_Create(autos);
    }
    dini_FloatSet(autos,"Gefahrene KM", vehicles[lspdcar[i]][vehicleKm]);
    }


    Bloß anstatt lspdcar die anderen Definitonen...


    Wie sieht das aus bei den Fraktionsautos? Habe vor ein Fraktionsautohaus zu machen für Gangs und Mafien.
    Dort wird ebenfalls das Auto erstellt.


    Dann einfach z.b. gangcar[vehicle][++] = CreateVehicle(...)


    Nur ein Beispiel ob das so funktionieren würde.. und bei Load/Save car anstatt lspdcar gangcar... ?
    Müsste so klappen eigentlich..

  • Ok, super!


    Ich gehe mal davon aus, du meinst die Anzeige, bei der du es in Kilometern angezeigt haben willst, anstatt in Metern, und das jeder durch 1000 rechnen kann. Wenn ja, dann ist das kein Problem. Du musst einfach nur bei dem format in dem du die Distanz als string für das Textdraw formatierst durch 1000 rechnen, also z.B. so:
    format(string, sizeof(string), "%0.2fkm", Distanz/1000.0);
    Dann bleibt die Variable gleich (wird nicht geteilt), aber die Anzeige ist in km.


    Zwecks dem Speichern/Laden von anderen Fahrzeugen:
    Ja, für alle Fahrzeuge jeweils so. Variable und Dateiname umbenennen, so dass es passt. Vom Prinzip her ist es immer das gleiche, auch für neue Fahrzeuge die du noch hinzufügen willst.

  • Die Kilometer werden mir wie folgt angezeigt z.b. : Kilometer: 5.23
    Sprich die Distanz ist schon in KM angegeben.


    Egal, ich danke dir trotzdem für alles und deine Bemühungen, du hast es echt drauf :)
    Ich wäre nie auf die Idee gekommen - und viele andere bestimmt auch nicht - das laden ans Ende zumachen.
    Logisches Denken ist dabei, aber bei sowas .. hätt ich nie gedacht :D


    Danke dir nochmals :)


    Bis dann

  • Nix da egal, wenn schon, denn schon. ;)


    Wenn es in Kilometern angezeigt wird, und du es aber in Metern haben willst ist es eben andersherum, sprich du musst es * 1000 machen (oder, falls du es noch drin hast, beim Speichern die Division durch 1000 raus machen, falls du es beim Laden nicht wieder mit 1000 multiplizierst [sonst wird es ja mit jedem Speichern um das 1000-fache kleiner!]).
    Also ggf. so:
    format(string, sizeof(string), "%dkm", floatround(Distanz*1000.0));


    PS: Danke für das Lob, freut mich :)

  • Mir gefällt deine Einstellung :)


    Nun denn, ich will die Kilometer natürlich in Kilometer haben. Sprich er soll sie in KM anzeigen ( was er tut ) und auch so speichern.
    Das mit dem mal 1000 Multiplizieren ist garkeine schlechte Idee. Beim Speichern durch 1000 dividieren und beim laden mal 1000 Multiplizieren.


    Wie mach ich eigentlich, dass er mir nur eine Stelle nach dem Komma anzeigt? Sprich: 3.1
    Habe es zz. so: 3.23


    MfG :)

  • Muss jetzt nur noch testen ob das Dividieren durch 1000 und beim laden das Multiplizieren mal 1000 klappt.


    Er schiesst mir aber folgenden Error raus:


    error 022: must be lvalue (non-constant)


    In dieser Zeile: vehicles[lspdcar[j]][vehicleKm]*1000 = dini_Float(autos,"Gefahrene KM");


    P.S: Wenn dies gelöst wäre kann ich auch testen ob er nur eine Stelle nach dem komma zeigt :)


    E: Text verändert

  • Super! Das Speichern und Laden funktioniert nun einwandfrei. Er speichert sie richtig in KM und gibt es auch so wieder.


    Er zeigt auch jetzt nur eine Nachkommastelle an, danke dafür :)


    Habe noch eine andere Frage bezüglich dieser Autos...


    Ich habe ein /veh Befehl der wie folgt aussieht:


    if(strcmp(cmd, "/veh", true) == 0)
    {
    if(IsPlayerConnected(playerid))
    {
    if (Spieler[playerid][Admin] < 4)
    {
    SendClientMessage(playerid, COLOR_GRAD1, "Dir ist es nicht erlaubt, diesen Befehl zu benutzen!");
    return 1;
    }
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /veh [autoid] [farbe1] [farbe2]");
    return 1;
    }
    new car;
    car = strval(tmp);
    if(car < 400 || car > 611) { SendClientMessage(playerid, COLOR_GREY, "Fahrzeug-ID kann nicht unter 400 und über 611 sein!"); return 1; }
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /veh [autoid] [farbe1] [farbe2]");
    return 1;
    }
    new color1;
    color1 = strval(tmp);
    if(color1 < 0 || color1 > 126) { SendClientMessage(playerid, COLOR_GREY, "Die Farbe kann nicht unter 0 und über 126 sein!"); return 1; }
    tmp = strtok(cmdtext, idx);
    if(!strlen(tmp))
    {
    SendClientMessage(playerid, COLOR_GRAD2, "Benutze: /veh [autoid] [farbe1] [farbe2]");
    return 1;
    }
    new color2;
    color2 = strval(tmp);
    if(color2 < 0 || color2 > 126) { SendClientMessage(playerid, COLOR_GREY, "Die Farbe kann nicht unter 0 und über 126 sein!"); return 1; }
    new Float:X,Float:Y,Float:Z;
    GetPlayerPos(playerid, X,Y,Z);
    new carid = AddStaticVehicleEx(car, X,Y,Z, 0.0, color1, color2, 60000);
    CreatedCars[CreatedCar] = carid;
    CreatedCar ++;
    format(string, sizeof(string), "Fahrzeug %d wurde gespawned.", carid);
    SendClientMessage(playerid, COLOR_GREY, string);
    }
    return 1;
    }


    Das Problem ist hierbei nur, dass wenn man den Server startet und sich ein Auto spawnt zeigt er plötzlich an: "Fahrzeug 201 wurde gespawned".
    Wenn ich 2-3 Autos Spawne und paar Minuten warte, fängt er ab 1 an, sprich es funktioniert erst dann normal.
    Habe diese new´s erstellt:


    new CreatedCars[100];
    new CreatedCar = 0;


    Habe auch ein /destroycars Befehl wo die gespawneten Autos destroyed werden. Aber nicht die "verbuggten: 201..."
    Eine Idee?


    Zudem ist die Frage, wie ich jetzt abfrage ob ein Spieler in solch einem Auto sitzt, damit er den Motor starten kann..


    Mein Motor Befehl:


    for(new i=0;i<sizeof(lspdcar);i++)
    {
    if(vid == lspdcar[i])
    {
    if(Spieler[playerid][Team] == 1 || Spieler[playerid][Team] == 2 || Spieler[playerid][Team] == 3)
    {
    if(motor[vid] == 1)
    {
    format(string, sizeof(string), "* %s stellt den Motor ab.", SpielerName(playerid));
    ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_OFF,light,alarm,doors,bonnet,boot,objective);
    motor[vid] = 0;
    }
    else if(motor[vid] == 0)
    {
    format(string, sizeof(string), "* %s betätigt die Zündung. Der Motor springt an!", SpielerName(playerid));
    ProxDetector(30.0, playerid, string, COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE,COLOR_PURPLE);
    SetVehicleParamsEx(vid,VEHICLE_PARAMS_ON,light,alarm,doors,bonnet,boot,objective);
    motor[vid] = 1;
    }
    }
    else { SendClientMessage(playerid,COLOR_GRAD2,"Du besitzt nicht die passenden Schlüssel für dieses Fahrzeug!"); }
    }
    }



    Hoffe kannst helfen :p


    Danke dir nochmal für alles und für die weiteren Hilfen :)

  • Zu Problem 1:
    Ein Problem ist das nicht wirklich, weil es ja sein kann, dass du nach ein paar Minuten das Fahrzeug 1 gelöscht hast, sprich wenn du dann wieder ein Fahrzeug erstellst, bekommt es die ID 1. Da du wahrscheinlich 200 Fahrzeuge im Server zu Beginn hast fängt es bei 201 an. Wird dann irgendwann die ID 1 entfernt (warum auch immer?), wird die 1 wieder frei.
    Also generell würde ich das, was ich sehe, nicht als Problem sehen.



    Zu Problem 2:
    Da fügst du einfach eine weitere Schleife hinzu, die durch "CreatedCars" loopt, gleich wie bei den "lspdcar" Fahrzeugen.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen