Beiträge von Jeffry

    Dazu würde ich dir dann zwei Tabellen raten, das ist wesentlich einfacher aufzubauen und zu verwalten, als es in eine Spalte zu schreiben.


    Tabelle 1:
    Die Daten des Autos mitsamt der Datenbank ID des Spielers dem das Auto gehört (sagen wir Lukas hat die ID 1).


    Tabelle 2:
    ID (Auto Increment) | Fahrzeug_ID | Nutzer_ID


    ID: Einfach der Unique Key, damit es keine doppelten Zeilen gibt.
    Fahrzeug_ID: Die ID des Fahrzeugs, damit du es finden kannst
    Nutzer_ID: Die ID des Spielers der einen Schlüssel hat.



    Beispiel:
    Lukas (ID 1) gibt für seinen Cheetah (ID 54) einen Sclüssel an Tom (ID 5) und einen an Jerry (ID 125).


    Tabelle 1 sieht dann für den Cheetah so aus:
    54 | 415 | posX | posY | posZ | ... | 1 <= diese 1 ist der Besitzer


    Tabelle 2 (die ID ist egal, die wird einfach von der DB erstellt und ist für dich ohne Relevanz, wir nehmen einfach 24 und 25):
    24 | 54 | 5
    25 | 54 | 125


    => Somit hat auf Fahrzeug 54 Zugriff: Lukas (ID 1), da ihm das Fahrzeug gehört (steht so in Tabelle 1) und außerdem Tom (ID 5), da er in Zeile 24 in Tabelle 2 steht zur ID 54 und Jerry (ID 125), da er ebenfalls in Tabelle 2 zur ID 54 steht.



    Speichern kannst du es dann über eine Variable (sagen wir du hast maximal 5 Schlüssel):
    new Keys[MAX_FAHRZEUGE][5];
    Keys[54][0] = 1;
    Keys[54][1] = 5;
    Keys[54][2} = 128;



    Das ganze darf so natürlich nicht mit harten Zahlen im Code stehen, sondern muss dynamisch über die SQL-Abfrage geschehen.
    Dazu machst du dir am besten mal den Code mit den Abfragen, so weit wie du kommst.

    Kann es sein, dass dein OnPlayerConnect nicht bis zum Timer für normale Spieler durchgeführt wird?
    Setze den SetTimer mal ganz als erste Zeile in OnPlayerConnect und teste ob es dann geht.


    Ansonsten debugge mal den OnPlayerConnect, ob dies überhaupt aufgerufen wird. Wenn das nicht aufgerufen wird, dann hast du vielleicht einen Filterscript im Server, der die Ausführung im Gamemode verhindert.


    Ansonsten könntest du auch einen einzigen Timer bei OnGameModeInit erstellen, und dann eben im public einen Loop durch alle Spieler machen (for...). Dann hättest du keine X Timer am laufen.

    Also das was du da vor hast ergibt irgendwie keinen Sinn.
    Zudem ist die Syntax falsch, da die Variable gleich heißt wie der Wert aus dem Enum ("besitzer").


    Was genau willst du denn da machen? Hast du vielleicht noch etwas mehr Code als nur diesen, damit wir das nachvollziehen können, was du machen willst?

    Nö, deine Struktur die du abfragst ist:


    SELLER | MODEL | REWARD


    Keine ID.



    Wenn du die ID auch haben willst:

    SQL
    SELECT  `ID`, `Seller`, `Model`, `Reward` FROM `Ordereddealercars` WHERE `ID` = '%d'

    Wegen der ID 0 immer:
    ocmd:cbiz(playerid,params[])
    {
    if(!IsPlayerAdmin(playerid))return SendClientMessage(playerid,COLOR_GRAU,"** Du bist kein Admin! **");
    new Float:x,Float:y,Float:z;
    GetPlayerPos(playerid,x,y,z);
    new id=FreeBizID();
    strmid(bInfo[id][b_besitzer], "",0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
    strmid(bInfo[id][b_teilhaber],"",0, MAX_PLAYER_NAME, MAX_PLAYER_NAME);
    bInfo[id][b_preis] = 10000;
    bInfo[id][bx] = x;
    bInfo[id][by] = y;
    bInfo[id][bz] = z;
    bInfo[id][ix] = 0.0;
    bInfo[id][iy] = 0.0;
    bInfo[id][iz] = 0.0;
    bInfo[id][b_kasse] = 0;
    bInfo[id][b_interior] = 0;
    bInfo[id][b_id] = id; //Das hier hat gefehlt
    UpdateBiz(id);

    new query[256];
    format(query,256,"INSERT INTO business (b_x,b_y,b_z,i_x,i_y,i_z,interior,kaufpreis) VALUES ('%f','%f','%f','0.0','0.0','0.0','0','10000')",x,y,z);
    mysql_function_query(dbhandle,query,true, "CreateBiz","i",id);
    return 1;
    }


    Wegen der Beschreibung:
    else
    {
    //Besitzer
    bInfo[id][b_pickup] = CreatePickup(1272,1,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],-1);
    format(string,300,"\
    {00E49A}ID: {FEFEFE}%d\n\
    {00E49A}Besitzer: {FEFEFE}%s\n\
    {00E49A}Teilhaber: {FEFEFE}%s\n{00E49A}\n\
    {00E49A}Beschreibung: {FEFEFE}%s\n\
    {00E49A}Kasse: {FEFEFE}%d",
    bInfo[id][b_id],bInfo[id][b_besitzer],bInfo[id][b_teilhaber],bInfo[id][b_bs],bInfo[id][b_kasse]); //Hier war ein Parameter zu viel.
    bInfo[id][b_text] = Create3DTextLabel(string,COLOR_BLAU,bInfo[id][bx],bInfo[id][by],bInfo[id][bz],10,0,1);
    }


    Sind sonst noch Fehler vorhanden?

    Ich tippe darauf, dass du mit "seller" das Array AHInfo sprengst.


    JTrailerInfo[Jobtrailer[playerid]][jSeller] = seller;
    mal zu:
    JTrailerInfo[Jobtrailer[playerid]][jSeller] = seller;
    printf("seller = %d", seller);


    Was wird da geprintet?
    Und wie hast du AHInfo deklariert?

    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    printf("VehicleID: %d", GetPlayerVehicleID(playerid));
    Motor[GetPlayerVehicleID(playerid)] = true;
    //Ab hier geht nix mehr.
    printf("playerid: %d", playerid);
    inJob[playerid] = 1;
    print("inJob gesetzt");
    TruckerjobCP[playerid] = 120;
    print("TruckerjobCP gesetzt");
    SetPlayerCheckpoint(playerid,AHInfo[seller][zPosX],AHInfo[seller][zPosY],AHInfo[seller][zPosZ],7);


    Debugge es mal so. Was wird geprintet?
    (Der Compiler passt, das ist ja nur die Kopfzeile.)

    Klar ist das möglich.
    Du fragst den Datensatz ab und splittest die Werte, entweder manuell (MYSQL Lädt falsche werte) oder du nutzt sscanf und splittest es eben an jedem Semikolon.


    Falls du eine genauere Erklärung brauchst, oder am Code hängst, sag Bescheid.



    EDIT: Das was LeijaT unten schreibt stimmt natürlich. Also diese Variante solltest du wirklich nur benutzen, wenn du weißt was du machst. Ansonsten mache es mit zwei Tabellen.

    Du kannst ja mal versuchen, ob es besser wird, wenn du alles in einem Query sendest (falls das mit dem Plugin geht):
    format(query,sizeof(query),"UPDATE state SET Wert='%i' WHERE Variable='%s'; ",statemoney,"staatskasse");
    format(query,sizeof(query),"%sUPDATE state SET Wert='%i' WHERE Variable='%s'; ",query,farmone,"farmhanf");
    format(query,sizeof(query),"%sUPDATE state SET Wert='%i' WHERE Variable='%s'; ",query,farmtwo,"farmkoks");
    //usw...
    mysql_query(query);


    Da musst allerdings die Größe von "query" vergrößern, sonst passt nicht alles rein.



    PS: Dateien > MySQL :D

    new string[256],str[256],seller,model,reward,id,i; //Zu diesem Zeitpunkt ist i = 0
    mysql_query("SELECT * FROM `Ordereddealercars`");
    mysql_store_result();
    while(mysql_fetch_row_format(string))
    {
    sscanf(string,"p<|>iddd",id,seller,model,reward);
    db_ID[i] = id; //Hier wäre dann db_ID[0] = id (aus der DB), beim nächsten Durchlauf dann db_ID[1], etc...
    format(str,sizeof str,"%s{00FF00}%s {FFFFFF}für {00FF00}%s{FFFFFF}€\n",str,PlayerVehicle[model-400],inspoints(reward));
    i++; //hier wird i = 0 zu i = 1, dann i = 1 zu 1 = 2 [hatte im Code zuvor gefehlt *shame*]
    }
    mysql_free_result();
    if(strlen(str) > 0)
    {
    ShowPlayerDialog(playerid,DLG_TRUCKER_CARIMPORT,DIALOG_STYLE_LIST,"Fahrzeugbestellungen",str,"Auswählen","Abbrechen");
    }
    else
    {
    SendClientMessage(playerid,COLOR_LIGHTRED,"Es gibt zur Zeit keine Fahrzeugbestellungen!");
    }


    Jetzt sollte es klarer sein.

    Weißt du zufällig, ob das auch auf der aktuellen Version funktioniert? Immerhin war der letzt Post 2012.


    Laut dem Englischen Forum scheint es zu funktionieren, zumindest sehe ich niemanden der sich beschwert.
    Allerdings sind alle Download Links tot, wie ich gerade bemerkt habe.


    Hier ein Mirror aus dem Englischen Forum: http://forum.sa-mp.com/showpost.php?p=3209854&postcount=188


    Am besten einfach mal probieren, ob es (noch) geht. Selbst genutzt habe ich es nie.


    Ich habe Trooper[Y] eben mal angeschrieben, zwecks Aktualisierung der Download Links.

    Sobald man ein Fahrzeug bestellt, soll dieses in die Datenbank eingetragen werden.
    Trucker sollen dann Einsicht in diese Einträge haben (InGame) und aus dieser Einsicht wählen können (List-Dialog).


    Dafür ist es aber egal, ob der Index AUTO INCREMENT hat oder nicht. Wenn du die Datenbank-ID in eine Variable speicherst, auf die der Index verweist
    db_ID[listitem]
    dann funktioniert es auch mit einem AUTO INCREMENT.


    Eine wesentlich einfachere Möglichkeit wäre es, das ganze über eine Datei zu lösen. Dann brauchst du die neuen Fahrzeuge nur mit io_append hinten anfügen und die erledigten Fahrzeuge löschst du aus der Datei, die anderen Zeilen rücken logischerweise nach, wenn du eine Zeile löschst. Somit hast du das Problem gar nicht mehr.



    Falls du trotzdem das System gerne mit MySQL machen willst, dann sieht das so aus:
    new string[256],str[256],seller,model,reward,id,i;
    mysql_query("SELECT * FROM `Ordereddealercars`");
    mysql_store_result();
    while(mysql_fetch_row_format(string))
    {
    sscanf(string,"p<|>iddd",id,seller,model,reward);
    db_ID[i] = id;
    format(str,sizeof str,"%s{00FF00}%s {FFFFFF}für {00FF00}%s{FFFFFF}€\n",str,PlayerVehicle[model-400],inspoints(reward));
    i++;
    }
    mysql_free_result();
    if(strlen(str) > 0)
    {
    ShowPlayerDialog(playerid,DLG_TRUCKER_CARIMPORT,DIALOG_STYLE_LIST,"Fahrzeugbestellungen",str,"Auswählen","Abbrechen");
    }
    else
    {
    SendClientMessage(playerid,COLOR_LIGHTRED,"Es gibt zur Zeit keine Fahrzeugbestellungen!");
    }



    Und beim Select:
    format(query, sizeof(query), "SELECT `Seller`, `Model`, `Reward` FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);


    ebenso beim löschen des Datensatzes:
    format(query, sizeof(query), "DELETE * FROM `Ordereddealercars` WHERE `ID` = '%d'", db_ID[listitem]);
    mysql_query(query);



    Nicht vergessen die
    new db_ID[MAX_FAHRZEUGE];
    zu erstellen.


    Außerdem solltest du, sobald ein Spieler ein Fahrzeug ausgewählt hat, für alle die den Dialog mit den ganzen Autos offen haben, den Dialog neu anzeigen, da es sonst vorkommen kann, dass zwei Spieler den gleichen Index auswählen. Oder du fängst das ab, wenn der Datensatz nicht mehr existiert, dass dann eine Fehlermeldung kommt.

    Naja, der Code macht ja auch keinen Sinn. Der zählt ja nur wie viele Zeilen du hast und erstellt dann eine Zeile mit ID = Anzahl der Zeilen. Das gibt für mich keinen Sinn.


    Wenn du den SELECT weg machst, und anstelle von r in den Parametern von format eine 0 setzt (harte 0 wie bei dem anderen Code), dann sollte es klappen.


    Allerdings habe ich den Hintergrund deines Systems noch nicht verstanden, da dein erster Code sich irgendwie mit dem zweiten Code widerspricht.