Cars Abspeichern

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


    wenn ich mich auslogge werden die Koordinaten meiner Autos alle auf 0 gesetzt,


    selbst wenn ich abfrage ob der Spieler überhaupt eingeloggt ist,


    außerdem wird das Fahrzeug beim disconnecten auch nicht zerstört.


    Bei dem Laden gibts keine Probleme, hab ich schon nachgeschaut.


    (So siehts in der Log aus wenn ich den server bspw restarte)


    UPDATE PlayerVehs SET carposx='0.000000', carposy = '0.000000', carposz = '0.000000', carposr = '0.000000' WHERE carid = '48'
    UPDATE PlayerVehs SET carposx='0.000000', carposy = '0.000000', carposz = '0.000000', carposr = '0.000000' WHERE carid = '49' //vermutlich das spielercar
    UPDATE PlayerVehs SET carposx='0.000000', carposy = '0.000000', carposz = '0.000000', carposr = '0.000000' WHERE carid = '48'
    UPDATE PlayerVehs SET carposx='0.000000', carposy = '0.000000', carposz = '0.000000', carposr = '0.000000' WHERE carid = '50'
    UPDATE PlayerVehs SET carposx='0.000000', carposy = '0.000000', carposz = '0.000000', carposr = '0.000000' WHERE carid = '50'




    Mein Code:


  • 1.
    if(!strcmp(cInfo[i][besitzer], name, false)) continue;
    zu:
    if(strcmp(cInfo[i][besitzer], name, false)) continue;


    2.
    Deine VCarID nutzt du doppelt, das ist falsch.
    Einmal nutzt du diese als Wert für die carid in der Datenbank und einmal für die vehicleid, die CreateVehicle zurück gibt.
    Teile das auf. Der Wert aus CreateVehicle (beim Erstellen und Laden) muss in eine andere Variable, als das was carid aus der Datenbank zurück gibt.


    Außerdem musst du die carid bei OnVehicleCreated auch in das Array weg speichern, sonst bringt es nichts.


    Sprich, du brauchst im Array einmal ein "dbCarID" und einmal dein "VCarID".
    VCarID nutzt du für alles was CreateVehicle, GetVehiclePos etc ist, und dbCarID nutzt du in den MySQL Funktionen, z.B. beim WHERE Statement. Damit greifst du auf den Datensatz des Fahrzeugs zu.

  • Sprich, du brauchst im Array einmal ein "dbCarID" und einmal dein "VCarID".
    VCarID nutzt du für alles was CreateVehicle, GetVehiclePos etc ist, und dbCarID nutzt du in den MySQL Funktionen, z.B. beim WHERE Statement. Damit greifst du auf den Datensatz des Fahrzeugs zu.

    Soweit so gut umgesetzt aber,



    Welchen wert soll ich denn dann jetzt genau laden beim CarLoad? Also was soll auf den Wert von carid in der DB gesetzt werden,


    dbCARID oder VCarID



    Und was ist mit abfragen wie diesen? if(cInfo[i][VCarID] == -1)



    Achja und wozu brauche ich VCarID denn eigentlich noch nach dem speichern? > also für den einzelnen spieler

  • Ja, aber nach nem neustart bzw nach OnGameModeInit wird die ja wieder auf -1 gesetzt,


    heißt ich kann dann doch nur einmal


    public OnPlayerDisconnect(playerid, reason)
    {
    //DisarmBis
    if(PlayerInfo[playerid][pLoggedIn] == false) return 1;
    KillTimer(DisArmTimerForPlayer[playerid]);
    KillTimer(DisArmerOnline[playerid]);
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    if(cInfo[i][VCarID] == -1) continue;


    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    // if(strlen(cInfo[i][besitzer] != name)) continue;
    if(strcmp(cInfo[i][besitzer], name, false)) continue;
    new Float:vehx, Float:vehy, Float:vehz,Float:vehr;
    GetVehiclePos(cInfo[i][VCarID], vehx, vehy, vehz);
    GetVehicleZAngle(cInfo[i][VCarID], vehr);
    new query[128];
    mysql_format(handle, query, sizeof(query), "UPDATE PlayerVehs SET carposx='%f', carposy = '%f', carposz = '%f', carposr = '%f' WHERE carid = '%d'",vehx,vehy,vehz,vehr,cInfo[i][dbCarID]);
    mysql_pquery(handle, query, "VehicleDisFinished");
    DestroyVehicle(cInfo[i][VCarID]);
    printf(query);
    cInfo[i][VCarID] = -1;


    }
    SaveUserStats(playerid);
    return 1;


    }
    benutzen? Da die ja auch nicht geladen wird, sicher, dass ich if(cInfo[i][VCarID] == -1) continue; nicht zu


    if(cInfo[i][dbCarID ] == -1) continue;


    ändern muss oder soll ich VCarID dann auf den wert von dbCarID setzen? verstehe ich nicht ganz


    /edit

  • Ja, das passt so.


    Nein, das sind unterschiedliche Werte, die darfst du nicht gegeneinander überschreiben.


    Nochmal:
    Die dbCarID ist die carid aus der Datenbank, die muss doch aber nicht gleich mit der vehicleid (VCarID) sein, die CreateVehicle zurück gibt. Das sind zwei völlig verschiedene Dinge. Somit musst du auch beides separat behandeln.


    Angenommen die carid im Datensatz ist 3, und du lädst dieses Fahrzeug jetzt, dann wird die 3 in dbCarID geschrieben. Anschließend wird das Fahrzeug mit CreateVehicle erstellt. Wenn du auf deinem Server davor schon 10 Fahrzeuge erstellt hast, dann erhält dies die vehicleid 11, damit ist dbCarID 3 und VCarID 11.

  • Okay, danke soweit, jedoch:





    Ich hab schon verstanden was du meinst, jedoch ist Fakt, das VCarID nach einem reconnect


    auf -1 gesetzt wird > ohne danach noch irgendwas mit /createcar zu machen.



    Heißt also ich kann beispielsweise mein Auto nicht abspeichern (funktioniert bei mir auch nicht)


    Da in der Abfrage ja if(cInfo[i][VCarID] == -1) continue; steht, was nach einem rejoin/reconnect


    ja wieder der Fall ist, wie kann ich das angehen?



    Mein Code sieht aktuell so aus:






    (Ist nur ein Beispiel, klar könnte man auch einen /parken command scripten, jedoch ist das ja nicht der einzige Fall wo if(cInfo[i][VCarID] == -1) abgefragt wird)

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Du erstellst das Fahrzeug doch mit CreateVehicle wieder. Da bekommst du dann den richtigen Wert doch wieder.

    Asoo, jetzt hab ich das verstanden, hab das jetzt auch mal geändert:


    Bei OnPlayerCarsLoad


    cInfo[i][VCarID] = CreateVehicle(cInfo[id][model],cInfo[id][c_x],cInfo[id][c_y],cInfo[id][c_z],cInfo[id][c_r],cInfo[id][VColor1],cInfo[id][VColor2],-1);



    und bei CreateVehicle
    cInfo[carid][dbCarID]=cache_insert_id();



    Allerdings funktionierts leider immer noch garnicht, einerseits wird die CarPosition nicht gespeichert beim DISCONNECT &


    nach dem Speichern stürzt der Server ab (sehr langsam) war davor aber auch schon so.



    Sieht man im Code sonst noch irgendwas falsches?

  • createPlayerCar(playerid,ownerid,modelid,Float:x,Float:y,Float:z,Float:r,Color1,Color2)
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][VCarID]!=-1)continue;
    strmid(cInfo[i][besitzer], GetName(ownerid), 0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
    cInfo[i][c_x]=x;
    cInfo[i][c_y]=y;
    cInfo[i][c_z]=z;
    cInfo[i][c_r]=r;
    cInfo[i][model]= modelid;
    // cInfo[i][VCarID] = i;
    cInfo[i][VCarID] = CreateVehicle(modelid,x,y,z,r,Color1,Color2,-1);
    new string[128];
    format(string,sizeof(string),"Das Auto cInfo[%i] wurde erstellt.",i);
    SendClientMessageToAll(COLOR_RED,string);
    SaveCarToDB(playerid,i);
    return 1;
    }
    return 1;
    }
    ocmd:createcar(playerid,params[])
    {
    new mid,pid;
    if(sscanf(params,"ui", pid,mid)) return SendClientMessage(playerid,COLOR_RED,"/createcar [ID] [CarID]");
    new Float:xc,Float:yc,Float:zc,Float:rc;
    GetPlayerPos(pid,xc,yc,zc);
    GetPlayerFacingAngle(pid,rc);
    createPlayerCar(playerid,pid,mid,xc,yc,zc,rc,0,0);
    return 1;
    }
    SaveCarToDB(playerid,carid)
    {
    new query[512];
    format(query, sizeof(query),"INSERT INTO `PlayerVehs` (carid,modelid, carposx, carposy, carposz,carposr, Color1, Color2,besitzer) VALUES ('%i','%i','%f', '%f', '%f','%f','%d','%d', '%s')",
    cInfo[carid][dbCarID],cInfo[carid][model], cInfo[carid][c_x],cInfo[carid][c_y],cInfo[carid][c_z],cInfo[carid][c_r],cInfo[carid][VColor1],cInfo[carid][VColor2],cInfo[carid][besitzer]);
    mysql_pquery(handle, query, "OnVehicleCreated", "di", playerid,carid);
    return 1;
    }
    forward OnVehicleCreated(playerid,carid);
    public OnVehicleCreated(playerid,carid)
    {
    // carid=cache_insert_id();
    //cInfo[carid][VCarID] = carid;
    cInfo[carid][dbCarID]=cache_insert_id();
    printf("Das Auto %i wurde erfolgreich von playerid %i erstellt",carid,playerid);
    }
    OnUserLogin
    new query[256];
    mysql_format(handle, query, sizeof(query), "SELECT * FROM PlayerVehs WHERE besitzer = '%e'", GetName(playerid));
    mysql_pquery(handle, query, "OnPlayerCarsLoad", "d", playerid);


    OnGameModeInit
    for(new i = 0; i < sizeof(cInfo); i++)
    {


    cInfo[i][VCarID] = -1;
    }
    forward OnPlayerCarsLoad(playerid); // bei Login
    public OnPlayerCarsLoad(playerid)
    {
    new num_rows;
    cache_get_row_count(num_rows);
    if(!num_rows)return 1;
    for(new i; i<num_rows; i++)
    {
    new id=getFreeCarID();
    cache_get_value_name_int(i, "carid", cInfo[id][dbCarID]);
    cache_get_value_name(i, "besitzer", cInfo[id][besitzer], MAX_PLAYER_NAME);
    cache_get_value_name_int(i, "modelid", cInfo[id][model]);
    cache_get_value_name_float(i, "carposx", cInfo[id][c_x]);
    cache_get_value_name_float(i, "carposy", cInfo[id][c_y]);
    cache_get_value_name_float(i, "carposz", cInfo[id][c_z]);
    cache_get_value_name_float(i, "carposr", cInfo[id][c_r]);
    cache_get_value_name_int(i, "Color1", cInfo[id][VColor1]);
    cache_get_value_name_int(i, "Color2", cInfo[id][VColor2]);
    cInfo[i][VCarID] = CreateVehicle(cInfo[id][model],cInfo[id][c_x],cInfo[id][c_y],cInfo[id][c_z],cInfo[id][c_r],cInfo[id][VColor1],cInfo[id][VColor2],-1);
    }
    return 1;
    }
    getFreeCarID()
    {
    for(new i=0; i<sizeof(cInfo); i++)
    {
    if(cInfo[i][VCarID]==-1) return i;
    }


    return -1;
    }
    public OnPlayerDisconnect(playerid, reason)
    {
    //DisarmBis
    if(PlayerInfo[playerid][pLoggedIn] == false) return 1;
    KillTimer(DisArmTimerForPlayer[playerid]);
    KillTimer(DisArmerOnline[playerid]);
    for(new i = 0; i < sizeof(cInfo); i++)
    {
    if(cInfo[i][VCarID] == -1) continue;


    new name[MAX_PLAYER_NAME];
    GetPlayerName(playerid,name,sizeof(name));
    // if(strlen(cInfo[i][besitzer] != name)) continue;
    if(strcmp(cInfo[i][besitzer], name, false)) continue;
    new Float:vehx, Float:vehy, Float:vehz,Float:vehr;
    GetVehiclePos(cInfo[i][VCarID], vehx, vehy, vehz);
    GetVehicleZAngle(cInfo[i][VCarID], vehr);
    new query[128];
    mysql_format(handle, query, sizeof(query), "UPDATE PlayerVehs SET carposx='%f', carposy = '%f', carposz = '%f', carposr = '%f' WHERE carid = '%d'",vehx,vehy,vehz,vehr,cInfo[i][dbCarID]);
    mysql_pquery(handle, query, "VehicleDisFinished");
    DestroyVehicle(cInfo[i][VCarID]);
    printf(query);
    cInfo[i][VCarID] = -1;


    }
    SaveUserStats(playerid);
    return 1;
    }
    forward VehicleDisFinished();
    public VehicleDisFinished()
    {


    printf("Vehicle abgespeichert");
    }



    Seperat auf https://pastebin.com/gsXqQDwj

  • Hab bei OnPlayerDisconnect jetzt auch mal den query wert auf 512 gesetzt, jetzt crasht der server auch nicht mehr und


    die Positon des Cars wird gespeichert, jedoch, wird das Auto einfach nicht geladen.


    In den MySQL logs steht nichts darüber, der code ist der gleiche nur das query bei OnPlayerDisconnect jetzt den wert 512 hat

  • Dann funktioniert es prinzipiell aber.
    Am besten du löschst jetzt nochmal alle Datensätze, wenn der Server aus ist, startest ihn dann wieder und legst dann nochmal neue Fahrzeuge an.


    Wenn der Server wieder abstürzt, poste bitte, was dir crashdetect im Server Log ausgibt.

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