Beiträge von [EGC] selEcT

    Hi


    Ich gehe mal stark davon aus, dass Du mehrere fahrzeuge in der selben Tabelle speicherst, also musst Du mit WHERE arbeiten:


    grob gesagt:
    SELECT blabla FROM vehicles WHERE lala = lalal



    müsste ich nicht, da ich ja die abfrage mit MAX mache, und da gibt er mir nur einen wert aus (und das immer --> auto inkrement!)


    Trooper:


    und wie erklärst du dir dann, das alles richtig in der tabelle ist? :D die vID wird dort aber nicht reingeschrieben --> auto inkrement.
    was soll denn noch falsch sein? -.-'

    Hallo Leute!


    Ich hab ein kleines Problem. Wenn ich bei meinem Carsystem ein Auto kaufe, ruf ich eine Funktion auf, die das Fahrzeug in eine MySQL-Tabelle schreibt:



    //---------------MySQLVehicleCreate--------
    stock MySQLVehicleCreate(vehicleid)
    {
    MySQLCheck();
    mysql_query("INSERT INTO vehicles (felder) VALUES (inhalte)");
    new data[MAX_STRING];
    mysql_query("SELECT MAX(vID) FROM vehicles");
    mysql_store_result();
    mysql_fetch_field("vID",data);
    Vehicle[vehicleid][vID] = strval(data);
    format(data,sizeof(data),"vID: %d, data: %s",Vehicle[vehicleid][vID],data);
    SendClientMessageToAll(C_GREEN, data);
    return 0;
    }


    Allerdings gibt er mir da bei vID 0 aus und bei data gar nichts!
    In der Tabelle ist aber auch alles da und die vID ist 78, also sollte es eigentlich auch 78 ausgeben!


    Wenns euch hilft: ich benutze das Plugin von Strickenkid.


    Ich hoffe jemand kann mir helfen..


    MFG selEcT

    Eine veränderte Query verbessert zwar deine Performance und macht den Code einfacher, er stellt aber keine Lösung für das von dir geschilderte Problem dar


    ja, wäre auch zu schön gewesen..


    ich habs nun statt vID mal mit vVehicleID versucht.. geht auch nicht..



    edit:
    also, ich habs nun mal probiert, in dem ich am schluss der Zuweisung und der Erstellung des Fahrzeuges das hinzugefügt hab:


    Vehicle[v+1][vID] = 0;


    das funktioniert und es werden alle Fahrzeuge richtig ausgelesen. Das könnte ich so machen, da die Fahrzeuge so nur beim GameModeStart ausgelesen werden..


    Allerdings frag ich mich noch immer, wieso das nicht korrekt funktioniert!

    Es wäre vieleicht besser wenn du die Gruppe in der mysql_query abfrage einbeziehst..
    sprich
    new query[256];
    format(query, sizeof(query), "SELECT * FROM vehicles WHERE vGroup = '%s'",group);
    mysql_query(query);
    Und dann alles was ausgegeben wird laden/erstellen lassen :)


    k, probier ich mal, könnte funktionieren..


    hmm.. geht immer noch nicht mit dieser Funktion:



    stock MySQLGetVehicles(group[])
    {
    MySQLCheck();
    new query[MAX_STRING],data[MAX_STRING];
    format(query, MAX_STRING, "SELECT * FROM vehicles WHERE vGroup='%s'",group);
    mysql_query(query); mysql_store_result();
    if(mysql_num_rows())
    {
    while(mysql_fetch_row_data())
    {
    for(new v=0;v<MAX_VEHICLES;v++)
    {
    if(!Vehicle[v][vID])
    {
    mysql_fetch_field("vID",data); Vehicle[v][vID] = strval(data);
    mysql_fetch_field("vModel",data); Vehicle[v][vModel] = strval(data);
    mysql_fetch_field("vPosX",data); Vehicle[v][vPosX] = floatstr(data);
    mysql_fetch_field("vPosY",data); Vehicle[v][vPosY] = floatstr(data);
    mysql_fetch_field("vPosZ",data); Vehicle[v][vPosZ] = floatstr(data);
    mysql_fetch_field("vAngle",data); Vehicle[v][vAngle] = floatstr(data);
    mysql_fetch_field("vColor1",data); Vehicle[v][vColor1] = strval(data);
    mysql_fetch_field("vColor2",data); Vehicle[v][vColor2] = strval(data);
    mysql_fetch_field("vRespawn",data); Vehicle[v][vRespawn] = strval(data);
    mysql_fetch_field("vHealth",data); Vehicle[v][vHealth] = floatstr(data);
    mysql_fetch_field("vPrice",data); Vehicle[v][vPrice] = strval(data);
    mysql_fetch_field("vGroup",data); strmid(Vehicle[v][vGroup],data,0,sizeof(data),255);
    Vehicle[v][vVehicleID] = AddStaticVehicleEx(Vehicle[v][vModel],Vehicle[v][vPosX],Vehicle[v][vPosY],Vehicle[v][vPosZ],Vehicle[v][vAngle],Vehicle[v][vColor1],Vehicle[v][vColor2],Vehicle[v][vRespawn]);
    SetVehicleHealth(Vehicle[v][vVehicleID],Vehicle[v][vHealth]);
    printf("Vehicle %d created (Group: %s).",Vehicle[v][vVehicleID],Vehicle[v][vGroup]);
    break;
    }
    }
    }
    }
    return 0;
    }

    D:\Dropbox\amigos_0.0.1.pwn(2052) : error 032: array index out of bounds (variable "data")
    D:\Dropbox\amigos_0.0.1.pwn(2052) : error 006: must be assigned to an array


    ;)


    ich probiers mit data="0"; ;)


    aber es funzt net..

    Ich nehme an, das mysql_fetch_field klappt nicht,
    und die 105 ist ein anderer Wert aus der Spalte...


    hab ich auch gedacht, dem ist aber nicht so.. ausserdem hab ich auch nach dem vID gesucht, es taucht genau mal dort in dieser Funktion auf..


    Hast du vieleicht schon davor noch Fahrzeuge auf dem Server erstellt? Also bevor die Fahrzeuge aus der MySQL Datenbank gelesen werden?


    Nein, deshalb kommt es mir ja auch ein bisschen komisch vor..



    Ich verstehe auch nicht ganz wieso du MAX_VEHICLES auf 100 definierst..
    Das heißt du möchtest also insgesamt nur 100 Fahrzeuge auf deinem Server dulden?


    Das ist nur am Anfang, um Ressourcen zu sparen. wieso soll ich max-vehicles auf 500 definieren, obwohl es auf dem ganzen server nur 70 fahrzeuge gibt? ;) (die nicht gelöscht werden können, vorerst)

    ja, das ist mir schon klar ;) hab ja auch gesagt, dass ich (um weitere fehler auszuschliessen) vor der funktion die Vehicle[vehicleid][vID] Variable ausgelesen habe und der Wert dort bei allen auf 0 gesetzt war ;)


    hmm wie erklärst du dir dann das jede zweite Vehicle[vehicleid][vID] Variable auf 105 gesetzt ist, obwohl ich das nicht auslese..?

    Hallo leute..


    ich hab ein Problem, wo ich nicht weiss, weshalb das kommt..


    In der MySQL-Tabelle befinden sich 64 Fahrzeuge. Die werden allerdings nicht alle ausgelesen.


    Also, ich hab ganz oben



    #undef MAX_VEHICLES
    #define MAX_VEHICLES 100


    d.h. wenn er alle Fahrzeuge geladen hat, bleiben 36 ids von MAX_VEHICLES übrig.


    wenn der Server gestartet wird, wird eine Funktion aufgerufen:

    MySQLGetVehicles("bicycles");
    //... noch 7 weitere davon


    Und hier die Funktion:



    stock MySQLGetVehicles(group[])
    {
    MySQLCheck();
    new data[256];
    mysql_query("SELECT * FROM vehicles");
    mysql_store_result();
    while(mysql_fetch_row_data())
    {
    mysql_fetch_field("vGroup",data);
    if(!strcmp(group,data,true))
    {
    for(new v=0;v<MAX_VEHICLES;v++)
    {
    if(!Vehicle[v][vID])
    {
    mysql_fetch_field("vID",data); Vehicle[v][vID] = strval(data);
    mysql_fetch_field("vModel",data); Vehicle[v][vModel] = strval(data);
    mysql_fetch_field("vPosX",data); Vehicle[v][vPosX] = floatstr(data);
    mysql_fetch_field("vPosY",data); Vehicle[v][vPosY] = floatstr(data);
    mysql_fetch_field("vPosZ",data); Vehicle[v][vPosZ] = floatstr(data);
    mysql_fetch_field("vAngle",data); Vehicle[v][vAngle] = floatstr(data);
    mysql_fetch_field("vColor1",data); Vehicle[v][vColor1] = strval(data);
    mysql_fetch_field("vColor2",data); Vehicle[v][vColor2] = strval(data);
    mysql_fetch_field("vRespawn",data); Vehicle[v][vRespawn] = strval(data);
    mysql_fetch_field("vHealth",data); Vehicle[v][vHealth] = floatstr(data);
    mysql_fetch_field("vPrice",data); Vehicle[v][vPrice] = strval(data);
    mysql_fetch_field("vGroup",data); strmid(Vehicle[v][vGroup],data,0,sizeof(data),255);
    Vehicle[v][vVehicleID] = AddStaticVehicleEx(Vehicle[v][vModel],Vehicle[v][vPosX],Vehicle[v][vPosY],Vehicle[v][vPosZ],Vehicle[v][vAngle],Vehicle[v][vColor1],Vehicle[v][vColor2],Vehicle[v][vRespawn]);
    SetVehicleHealth(Vehicle[v][vVehicleID],Vehicle[v][vHealth]);
    printf("Vehicle %d created (Group: %s).",Vehicle[v][vVehicleID],Vehicle[v][vGroup]);
    break;
    }
    }
    }
    }
    return 0;
    }


    eigentlich logisch, oder?


    Nur werden dann insgesamt 47 Fahrzeuge gespawnt.


    Dann hab ich mal mit printf debugging gemacht.


    Dabei fand ich heraus, das nur jede zweite vID-Variable 0 ist!!


    wenn ich aber vor der Funktion alle vID auslese, gibt es mir da immer 0 aus!


    d.h. nachdem das erste Fahrzeug gespawnt ist, sieht das so aus


    v 0 ist vID 0
    Fahrzeug gespawnt
    v 0 ist vID 1
    v 1 ist vID 105 (WARUM 105??!!)
    v 2 ist vID 0
    nächstes Fahrzeug gespawnt
    v 0 ist vID 1
    v 1 ist vID 105 (WARUM 105??!!)
    v 2 ist vID 2
    v 3 ist vID 105 (hier auch wieder?!)


    usw.


    Hat da jemand eine Erklärung dazu?


    die Variable vID wird NIE sonst irgendwie gesetzt!


    Bin am verzweifeln :S


    MFG selEcT

    ab und zu komm ich mir vor, als wäre ich im falschen film.. ich habe gar nichts bei OnPlayerUpdate..


    Also:


    public OnPlayerDeath(playerid, killerid, reason)
    {
    Player[playerid][pDead] = 1;
    return 1;
    }
    public OnPlayerSpawn(playerid)
    {
    if(Player[playerid][pDead])
    {
    KillTimer(TimerDead[playerid]);
    ResetPlayerWeapons(playerid);
    SetPlayerPos(playerid,4074.2412,-227.9981,59.2378);
    SetPlayerFacingAngle(playerid, 91.7882);
    SetPlayerInterior(playerid, 0);
    TogglePlayerControllable(playerid, 0);
    TimerDead[playerid] = SetTimerEx("Dead",1000,1,"i",playerid);
    }
    }
    public Dead(playerid)
    {
    Player[playerid][pDeadCounter]++;
    if(Player[playerid][pDead] == 1 && Player[playerid][pDeadCounter] == 120)
    {
    Player[playerid][pDead] = 0;
    Player[playerid][pDeadCounter] = 0;
    SendClientMessage(playerid, C_GREEN, "Du wurdest aus dem Krankenhaus entlassen!");
    if(!Player[playerid][pAFK]) { TogglePlayerControllable(playerid,1); }
    KillTimer(TimerDead[playerid]);
    }
    return 1;
    }



    jo.. ich weiss nicht..

    nein..


    es geht nicht um das krankenhaus und dann spawn, sondern das ich sterbe --> spawne --> auf "spawn" klicken muss und erst DANN ins krankenhaus gejagt werde ;) nach dem krankenhaus funktioniert alles super



    edit: weisst du überhaupt was ich meine..?


    hab schon vieles ausprobiert.. iwie bei OnPlayerDeath auf ne position porten --> ist keine schöne lösung..

    ich hab da ja einen Timer drin ;) sobald er ins krankenhaus kommt (bei OnPlayerDeath --> playerdeath = 1 --> danach spawnt er neu und in OnPlayerSpawn hab ich dann, if playerdeath == 1... spawn in krankenhaus..

    also, ich logge mich ein, dann spawn ich das erste mal, dann stirb ich, dann spawn ich am selben ort wie beim ersten mal, einfach mit dem spawn dialog, dann klick ich dort auf spawn, dann lande ich im krankenhaus. dann bin ich wieder "am leben", stirb dann nochmal und spawn dann aber richtig!


    ach ja, kein gf ;)

    Moin


    Hab da ein kleines Problem mit diesem Standard Spawndialog von SAMP.


    Also


    Ich komm auf den Server, logge mich ein und spawn auch ganz normal (wie es sein sollte).


    Jetzt setz ich mal die gravity auf 0 und flieg ein wenig in die Höhe. Danach setz ich die gravity wieder auf 0.008 und sterbe dann. Nun sollte ich ins Krankenhaus kommen (wie sollte es auch anders sein?)!


    Allerdings kommt hier eben dieser Spawndialog?! Sobald ich dort auf Spawn klicke, lande ich im Krankenhaus!


    Wie kann ich diesen Spawndialog umgehen? Das ist ja nur der Augenblick zwischen Tot und Spawn..?


    MFG selEcT