Car ID ist immer 0 ?

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
  • Schönen guten Abend,


    ich schreibe grade ein Dynamisches Carsystem... Laden/Speichern/Erstellen funktioniert soweit, nur beim auslesen habe ich ein kleines Problemchen.
    Undzwar ist die ID des Fahrzeuges immer 0.. dabei steht in der Datenbank was anderes. Sprich er nimmt immer das Fahrzeug 0 aus der Datenbank...



    ganz oben

    MAX_AHC 75



    new AutoHausCar[MAX_AHC][KaufCar],
    AHC[MAX_AHC];



    Unter OnPlayerStateChange


    for(new i; i<MAX_AHC; i++)
    {
    if(!IstAHC(vehicleid))continue;
    format(string,sizeof(string),"ID: {FFAA00}%d{FEFEFE} Kosten: {FFAA00}%d${FEFEFE}",AutoHausCar[i][cID],AutoHausCar[i][Kosten]);
    return ShowPlayerDialog(playerid,DIALOG_EAHC,DIALOG_STYLE_LIST,string,"Fahrzeug Umparken","Auswahl","Abbrechen");
    }


    wie ich die Fahrzeuge Lade:


    stock LoadAHC()
    {
    new query[128];
    mysql_query("SELECT * FROM `AutoHausCars`");
    mysql_store_result();
    for(new i; i<mysql_num_rows(); i++)
    {
    if(i>=MAX_AHC)break;
    mysql_retrieve_row();
    mysql_fetch_field_row(query,"cID"); AutoHausCar[i][cID] = strval(query);
    mysql_fetch_field_row(query,"Modelid"); AutoHausCar[i][Modelid] = strval(query);
    mysql_fetch_field_row(query,"Kosten"); AutoHausCar[i][Kosten] = strval(query);
    mysql_fetch_field_row(query,"posx"); AutoHausCar[i][posx] = floatstr(query);
    mysql_fetch_field_row(query,"posy"); AutoHausCar[i][posy] = floatstr(query);
    mysql_fetch_field_row(query,"posz"); AutoHausCar[i][posz] = floatstr(query);
    mysql_fetch_field_row(query,"posr"); AutoHausCar[i][posr] = floatstr(query);
    AHC[i] = CreateVehicle(AutoHausCar[i][Modelid],AutoHausCar[i][posx],AutoHausCar[i][posy],AutoHausCar[i][posz],AutoHausCar[i][posr],0,0,5000);
    }
    mysql_free_result();
    }


    stock IstAHC


    stock IstAHC(vehicleid)
    {
    for(new a; a<(sizeof(AHC)); a++)
    {
    if(AHC[a] != vehicleid)continue;
    {
    return 1;
    }
    }
    return 0;
    }


    Wo ist bitte der Fehler ? -.-

  • stock IstAHC(vehicleid)
    {
    for(new a; a<(sizeof(MAX_AHC)); a++)
    {
    if(AHC[i][cID] != vehicleid)continue;
    {
    return 1;
    }
    }
    return 0;
    }
    So sollte es richtig sein, erklärt sich von selbst hoffe ich sonst einfach nachfragen.


    Advertising has us chasing cars and clothes, working jobs we hate so we can buy shit we don’t need.
    – Tyler Durden


    Sobald Werbung im Spiel ist, bist du, die Nutzerin, der Nutzer, das Produkt.


  • Erklärt sich nicht von selbst.
    Variable i gibt es gar nicht, sizeof(MAX_AHC) wird mMn nicht mal kompilieren ( MAX_AHC ist keine Variable ) und "AHC" ist kein mehrdimensionales Array.


    Zitat

    Undzwar ist die ID des Fahrzeuges immer 0.. dabei steht in der Datenbank was anderes. Sprich er nimmt immer das Fahrzeug 0 aus der Datenbank...


    Woran erkennst du denn,dass das Fahrzeug immer die ID 0 hat ? Das einzige wo du die ID direkt ausließt ist ja hier:

    Zitat

    mysql_fetch_field_row(query,"cID"); AutoHausCar[i][cID] = strval(query);


    Lass doch mal direkt per print "query" und / oder den Wert hinter "AutoHausCar[i][cID]" ausgeben.


    //Edit: Vielleicht auch mal definieren,was cID genau sein soll. Soll es die vehicleid sein,die auch von SA:MP Server vergeben wird oder eine einzigartige ID die von der Datenbank vergeben wird.

  • //Edit: Vielleicht auch mal definieren,was cID genau sein soll. Soll es die vehicleid sein,die auch von SA:MP Server vergeben wird oder eine einzigartige ID die von der Datenbank vergeben wird.


    Es soll eine Einzigartite ID sein, damit die Datenbank genau weiß wenn ich ein Fahrzeug lösche, welches ich meine.


    Beim Laden gibt er das aus:
    [13:11:42] Car ID 0 geladen
    [13:11:42] Car ID 1 geladen


    Edit: Also liegt hier der Fehler ?


    for(new i; i<MAX_AHC; i++)
    {
    if(!IstAHC(vehicleid))continue;
    format(string,sizeof(string),"ID: {FFAA00}%d{FEFEFE} Kosten: {FFAA00}%d${FEFEFE}",AutoHausCar[i][cID],AutoHausCar[i][Kosten]);
    return ShowPlayerDialog(playerid,DIALOG_EAHC,DIALOG_STYLE_LIST,string,"Fahrzeug Umparken","Auswahl","Abbrechen");
    }

  • Kommt drauf an.
    Nur unter "OnPlayerStateChange" reicht der von dir gezeigte Code nicht. newstate muss zumindest PLAYER_STATE_DRIVER oder PLAYER_STATE_PASSENGER sein, sonst kannst du die dort nicht richtig mit GetPlayerVehicleID arbeiten.


    Zitat

    for(new i; i<MAX_AHC; i++)
    {
    if(!IstAHC(vehicleid))continue;
    format(string,sizeof(string),"ID: {FFAA00}%d{FEFEFE} Kosten: {FFAA00}%d${FEFEFE}",AutoHausCar[i][cID],AutoHausCar[i][Kosten]);
    return ShowPlayerDialog(playerid,DIALOG_EAHC,DIALOG_STYLE_LIST,string,"Fahrzeug Umparken","Auswahl","Abbrechen");
    }


    Ganz genau hab ich auch nicht verstanden,wieso du in der Schleife IstAHC() prüfst.
    Ich denke mal, du möchtest beim Einsteigen in eines dieser Fahrzeuge die zum Autohaus gehören den Dialog anzeigen.
    Was dir dann aber fehlt,ist der richtige Index im Array AutoHausCar bzw AHC der zu der vehicleid passt.
    Könntest also passend zu IstAHC eine Funktion anlegen, die dir an Hand der vehicleid den korrekten Index liefert. Mit dem müsstest du dann weiterarbeiten für den Dialog:


    if(!IstAHC(vehicleid) ) return print("Kein Autohaus Fahrzeug");
    new index = GetAHCIndex(vehicleid);
    format(string,sizeof(string),"ID: {FFAA00}%d{FEFEFE} Kosten: {FFAA00}%d${FEFEFE}",AutoHausCar[index ][cID],AutoHausCar[index ][Kosten]);
    return ShowPlayerDialog(playerid,DIALOG_EAHC,DIALOG_STYLE_LIST,string,"Fahrzeug Umparken","Auswahl","Abbrechen");

    GetAHCIndex gibt es natürlich noch nicht ;).


    //Edit: Rechtschreibung :huh:


  • Hm, aber warum sollte ich eine Extra Funktion dafür schreiben, ich meine bei meinem ATM & Telefonzellensystem funktioniert das auch ohne -.- ... da habe ich das ganze ähnlich aufgebaut:


    ocmd:deltele(playerid,params[])
    {
    new string[64];
    for(new i; i<MAX_TELE; i++)
    {
    if(!IsPlayerInRangeOfPoint(playerid,1.0,Telefonzelle[i][x2],Telefonzelle[i][y2],Telefonzelle[i][z2]))continue;
    SetPVarInt(playerid,"Telezelle",i);
    format(string,sizeof(string),"Telefonzelle ID: %d",i);
    return ShowPlayerDialog(playerid,DIALOG_ETELE,DIALOG_STYLE_LIST,string,"Telefonzelle Löschen","Auswahl","Abbrechen");
    }
    return SendClientMessage(playerid,Weiss,"Du bist an keiner Telefonzelle!");
    }

  • Da hast du zwar keine eigenen Funktion zum zurückgeben des Indexes sondern prüfst in der Schleife direkt auf den exakten Eintrag in dem du die Position vergleichst.
    if(!IsPlayerInRangeOfPoint(playerid,1.0,Telefonzelle[i][x2],Telefonzelle[i][y2],Telefonzelle[i][z2]))continue;
    Du filterst damit ja auf den richtigen Index. Ist ja nicht wirkliche eine andere Logik dahinter als die, die ich meinte mit prüfen von vehicleid auf AHC.

  • Da hast du zwar keine eigenen Funktion zum zurückgeben des Indexes sondern prüfst in der Schleife direkt auf den exakten Eintrag in dem du die Position vergleichst.
    if(!IsPlayerInRangeOfPoint(playerid,1.0,Telefonzelle[i][x2],Telefonzelle[i][y2],Telefonzelle[i][z2]))continue;
    Du filterst damit ja auf den richtigen Index. Ist ja nicht wirkliche eine andere Logik dahinter als die, die ich meinte mit prüfen von vehicleid auf AHC.


    Okay, habe ich auch schon dran gedacht, ist aber schwachsinn :D
    Kannst du mir die Funktion schreiben ich habe nähmlich kp wie ich die aufbauen soll :|

  • Kann ja,mach ich aber nicht.


    Was ist denn daran so schwer. Eine Schleife durch alle AHC Einträge und prüfen ob der Wert hinter einem Index einem Parameter ( vehicleid ) gleicht. Sind
    die Werte identisch,dann den Index zurückgeben. Findet man keinen Treffer, ungültigen Wert zurückgeben ( nicht 0(!) ).


    Spoiler anzeigen
    Das wäre ja schon die Funktion nur mit anderen Rückgabewerten. Siehe diesen Beitrag.

  • Es kann ja bei dir auch nur 0 oder 1 zurückgegeben werden.
    Weisst du überhaupt was ein Index bei einem Array ist ? Sonst nochmal in die Materia Arrays einlesen.
    Der Index ist bei GetAHCIndex hinter der Variable a.


    Was ist denn daran so schwer. Eine Schleife durch alle AHC Einträge und prüfen ob der Wert hinter einem Index einem Parameter ( vehicleid ) gleicht. Sind
    die Werte identisch,dann den Index zurückgeben.
    Findet man keinen Treffer, ungültigen Wert zurückgeben ( nicht 0(!) ).

    Das wäre ja schon die Funktion nur mit anderen Rückgabewerten. Siehe diesen Beitrag.


    //Edit:
    Die Funktion von dir ist übrigens mist. Ich hab doch geschrieben,dass IstAHC passt bis auf die return-Werte.


  • Danke Goldkiller 8)