Beiträge von Studs

    Also mit dem Spieler gaga habe ich jetzt 4 fahrzeuge erstellt, alle laden auch, jedoch habe ich einmal auch mit dem nutzer


    Pulsare ein Auto erstellt, das lädt nicht > und dann hab ich mit dem nutzer nochmal /createcar gemacht dann ist der server gecrasht

    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

    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

    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?

    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)

    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

    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

    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:


    Das mit dem Laden funktioniert ja schonmal hab ich auch in den mysql logs gecheckt,



    jedoch wird mir weiterhin gesagt ich wäre nicht versichert, irgendwas stimmt mit den beiden


    werten beim zuordnen oder so nicht, sieht doch alles korrekt aus?



    Lädt irgendwie nicht, bekomme immer die nachricht mein shop seie nicht versichert,




    Hi,


    ich bin gerade dabei eine Versicherung für meinen Shop zu scripten,


    bisher geht auch alles gut, bis auf ein Problem wo ich nicht genau weiß


    wie ich das anpacken soll.


    Das Ding ist, wenn der Spieler Online kommt soll dieser wissen ob er eine Versicherung hat und


    wenn ja wann diese abläuft, bisher habe ich nur eine abfrage OB der spieler einen Shop hat,


    aber der Shop muss ja auch dem besitzer zugeteilt werden, da rätsel ich ein bisschen



    Das hier ist unter OnUserLogin,




    Das hier ist der Dialog, da klappt auch alles, da ich hier ja auch MakeShop[playerid] = i; benutze bei /edit


    Mit OwnedShop gehts nicht, da ich bei hatPlayerShop ja auch nicht wirklich den richtigen shop (den, den der spieler beistzt)


    als "i" zuordnen kann.



    Wie finde ich raus ob ein bestimmter Shop Owner Online ist?


    Bspw. bei einem Rob Command, falls der Owner von dem Shop connected ist,



    soll er eine Nachricht bekommen wer seinen shop ausgeraubt hat.


    Da man dabei ja 2 for new schleifen braucht (oder so) kann ich das vom code her noch nicht


    Super, danke ^^


    Jetzt werden alle Pickups und Labels angezeigt


    /Edit


    Meine Frage wäre jetzt tatsächlich noch, wie es möglich wäre mehrere Ausgänge in einem Interior zu nutzen?


    Heißt wenn ich in ein 24/7 Shop gehe und rausgehen möchte, dass ich dann auch zurück an den richtigen ausgang gebracht werde


    und nicht ausversehen in der nähe eines anderen bin

    / probiere ich mal aus.



    Und kann leider nicht mitreden, da ich das auch nicht zu 100% verstehe



    Jetzt kriege ich tatsächlich den Fehler, dass die max anzahl an shops erreicht wurde,


    auch nachdem ich MAX_SHOPS auf 500 gesetzt habe (die shop id wäre in dem falle falls der shop erstellt werden würde 431)



    Würde der Code allein von der logik her (alles zusammen) funktionieren