Autohaussystem - Besitzer soll Fahrzeuge umparken können

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,


    ich habe bei meinem Autohaussystem nun versucht, die Fahrzeuge die einem Autohaus gehören so vom Besitzer umparken zu lassen, dass es für den Käufer attraktiv aussieht.
    "Versucht" trifft es da am besten. Ich hatte eine schleife, die alle Fahrzeuge durchgeht und checkt ob es ein Autohausfahrzeug ist:
    for(new v;v<MAX_VEHICLES;v++) {
    if(AHCarInfo[v][aSeller] == pInfo[playerid][pAH]) {
    format(str,sizeof str,"%s{FFFFFF}Fahrzeug: %s | Preis: %s€\n",str,PlayerVehicle[AHCarInfo[v][aModel]-400],inspoints(AHCarInfo[v][aPrice]);
    }
    }
    Dabei kam aber nie etwas brauchbares raus.
    Daher frage ich nun hier ( Jeffry: :whistling: ) wie ich es am besten machen kann.
    Alle Fahrzeuge die zu einem Autohaus gehören sind in folgendem "Array" gespeichert:
    enum zSellerCarInfo
    {
    aID,//DatenbankID
    aModel,
    aPrice,
    aSeller,
    Float:aPosX,
    Float:aPosY,
    Float:aPosZ,
    Float:aPosA,
    aVeh//Das Fahrzeug"objekt"
    };
    new AHCarInfo[MAX_SELLERCARS][zSellerCarInfo];
    Und bevor jemand fragt, hier werden diese gespawnt:
    stock LoadDealerCars()
    {
    mysql_query("SELECT * FROM `Dealercars`");
    mysql_store_result();
    if(mysql_num_rows() != 0) {
    new str[1024],idx=0;
    while(mysql_fetch_row(str)) {
    sscanf(str, "e<p<|>ddddffffd>",AHCarInfo[idx]);
    AHCarInfo[idx][aVeh]=CreateVehicle(AHCarInfo[idx][aModel],AHCarInfo[idx][aPosX],AHCarInfo[idx][aPosY],AHCarInfo[idx][aPosZ],AHCarInfo[idx][aPosA],random(128),random(128),-1);
    Buycar[AHCarInfo[idx][aVeh]] = 1;
    idx++;
    }
    mysql_free_result();
    }
    return 1;
    }


    Wie genau kann ich es am besten machen?


    lg
    Deagle

  • Jetzt hast du eine Menge erklärt, aber das eigentliche vergessen. Was willst du mit den Fahrzeugen im Autohaus eigentlich machen? Umparken, ja, aber was hat das mit der Nachricht zu tun die du da formatierst?


    Beschreibe bitte genau was du mit umparken meinst, und was dabei gemacht werden soll.


    Position ändern? Position speichern?...

  • for(new v;v<MAX_SELLERCARS;v++) {
    if(AHCarInfo[v][aSeller] == pInfo[playerid][pAH]) {
    format(str,sizeof str,"%s{FFFFFF}Fahrzeug: %s | Preis: %s€\n",str,PlayerVehicle[AHCarInfo[v][aModel]-400],inspoints(AHCarInfo[v][aPrice]);
    }
    }


    Zuvor dürftest du das Array gesprengt haben.


    Das listitem bei OnDialogResponse fragst du genauso ab:
    new tmp=-1;
    for(new v;v<MAX_SELLERCARS;v++) {
    if(AHCarInfo[v][aSeller] == pInfo[playerid][pAH]) {
    tmp++;
    if(tmp==listitem) //ausgewähltes Fahrzeug
    }
    }

  • Das listitem bei OnDialogResponse fragst du genauso ab:


    Ich habe es nun mal ohne Dialoge gemacht.
    Folgendes Problem: Ich steige als "Besitzer" dieses Autohausfahrzeuges in das Fahrzeug ein, doch es passiert nicht das, was passieren soll.
    Hier der OnPlayerStateChange:
    if(newstate == PLAYER_STATE_DRIVER) {
    new veh=GetPlayerVehicleID(playerid);
    if(Buycar[veh] == 0) {
    //mein Code
    } else {
    if(AHCarInfo[veh][aSeller] == pInfo[playerid][pAH]) {
    SendClientMessage(playerid,COLOR_WHITE,"Du kannst das Ausstellungsfahrzeug mit dem Befehl '/parkcdcar' umparken.");
    SendClientMessage(playerid,COLOR_GREY,"Beachte: Dabei darf das Fahrzeug das Autohausgelände nicht verlassen!");
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[GetPlayerVehicleID(playerid)] = true;
    } else {
    TogglePlayerControllable(playerid, false);
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in einem Autohausauto!");
    }
    }
    }
    Ich bekomme keine Meldung.


    /e: Habe grad folgende Debugs reingehauen:
    } else {
    print("Check 1");
    printf("1 |-> AHCarInfo: %d | pAH: %d",AHCarInfo[veh][aSeller],pInfo[playerid][pAH]);
    if(AHCarInfo[veh][aSeller] == pInfo[playerid][pAH]) {
    printf("2 |-> AHCarInfo: %d | pAH: %d",AHCarInfo[veh][aSeller],pInfo[playerid][pAH]);
    SendClientMessage(playerid,COLOR_WHITE,"Du kannst das Ausstellungsfahrzeug mit dem Befehl '/parkcdcar' umparken.");
    SendClientMessage(playerid,COLOR_GREY,"Beachte: Dabei darf das Fahrzeug das Autohausgelände nicht verlassen!");
    GetVehicleParamsEx(GetPlayerVehicleID(playerid),engine,lights,alarm,doors,bonnet,boot,objective);
    SetVehicleParamsEx(GetPlayerVehicleID(playerid),VEHICLE_PARAMS_ON,lights,alarm,doors,bonnet,boot,objective);
    Motor[GetPlayerVehicleID(playerid)] = true;
    } else {
    print("Nicht Inhaber");
    TogglePlayerControllable(playerid, false);
    SendClientMessage(playerid,COLOR_WHITE,"Du bist in einem Autohausauto!");
    }
    }
    Mit diesem Ergebnis:

    Code
    [07:56:06] Check 1
  • new idx;
    for(new v;v<MAX_SELLERCARS;v++) {
    if(AHCarInfo[v][aVeh] == veh) {
    idx=v;
    break;
    }
    }
    Das muss vor den Check, bzw nach "new veh=...".
    Dann musst du die folgenden [veh] alle zu [idx] ändern.


    Du darfst nämlich nicht mit der vehicle id auf den Index zugreifen, sondern musst mit dem Index auf den Index zugreifen.

  • Entenhausen, das weckt Erinnerungen :D


    Also, so sieht momentan dein Code aus (etwas vereinfacht):


    new veh=GetPlayerVehicleID(playerid);
    if(AHCarInfo[veh][aSeller] == pInfo[playerid][pAH]) {


    Jetzt sagen wir mal, du sitzt in Vehicle ID 125 (das Fahrzeug mit der "Objekt ID" 125). Dann versuchst du auf "AHCarInfo[125][aSeller]" zuzugreifen. Das mag zwar nicht direkt einen Fehler geben, dennoch wird es zu Problemen kommen, da dieses Fahrzeug sicher nicht das 125. aus den AHCarInfo-Cars ist. Deshalb müssen wir herausfinden, zu welchem Index (das wo jetzt die 125 steht) die 125 passt.
    Das machen wir hier:


    new idx;
    for(new v;v<MAX_SELLERCARS;v++) {
    if(AHCarInfo[v][aVeh] == veh) {
    idx=v;
    break;
    }
    }


    Wir schauen, welches "AHCarInfo[v][aVeh]" (wobei v = alle Werte von 0 bis MAX_SELLERCARS-1) den Wert "veh" (also 125, die "Objekt ID") hat.
    Wenn wir dann wissen, zu welchem "v" die 125 gehört, dann speichern wir "v" in "idx" damit wir später darauf zugreifen können. Sagen wir mal, das AHCar 7 hat die "Objekt ID" 125.
    Dann greifst du nun so auf das Fahrzeug zu: "AHCarInfo[idx][aSeller]" => entspricht: AHCarInfo[7][aSeller]


    Und bei Index 7 haben wir nun auch den korrekten Verkäufer, für das Fahrzeug welches zu fährst.


    Du musst über den Index (hier: 7) auf das Fahrzeug-Array (!) zugreifen, nicht über die "Objekt ID" (hier 125 / GetPlayerVehicleID). Willst du auf das Fahrzeug direkt zugreifen (zum Beispiel für SetVehicleColor) musst du wiederum die 125 nehmen.



    Fazit: Auf das Array mit dem Index zugreifen, auf das Fahrzeug selbst über die "Objekt ID" zugreifen.


  • Wirklich Super erklärt! :thumbup::thumbup::thumbup:


    Nun klappt alles Wunderbar.
    Allerdings habe ich noch das folgende Problem:


    Wenn ich im Bestellmenü die Seite wechsle (Von 1 auf 2), wird die Vehikel-ID auf der 2. Seite nicht erhöht.
    Dazu habe ich hier zwei kleine Screens die das zeigen:


    Die hellblauen Punkte zeigen immer, wo ich gerade raufgeklickt habe.


    P.S.: Das mit dem Array klappt alles :)

  • Poste den Code mit dem du die Seite wechselst und den Code mit dem du den Dialog mit den Fahrzeug-Info's anzeigen lässt.


    new curpage = GetPVarInt(playerid, "vspawner_page");
    if(playertextid == gNextButtonTextDrawId[playerid] && GetPVarInt(playerid, "vspawner_active") != 0) {
    if(curpage < (GetNumberOfPages() - 1)) {
    SetPVarInt(playerid, "vspawner_page", curpage + 1);
    ShowPlayerModelPreviews(playerid);
    UpdatePageTextDraw(playerid);
    PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
    } else {
    PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
    }
    return 1;
    }
    else if(playertextid == gPrevButtonTextDrawId[playerid] && GetPVarInt(playerid, "vspawner_active") != 0) {
    if(curpage > 0) {
    SetPVarInt(playerid, "vspawner_page", curpage - 1);
    ShowPlayerModelPreviews(playerid);
    UpdatePageTextDraw(playerid);
    PlayerPlaySound(playerid, 1084, 0.0, 0.0, 0.0);
    } else {
    PlayerPlaySound(playerid, 1085, 0.0, 0.0, 0.0);
    }
    return 1;
    }
    if(GetPVarInt(playerid, "vspawner_active") != 0) {
    new x;
    while(x != SELECTION_ITEMS) {
    if(playertextid == gSelectionItems[playerid][x]) {
    ShowVehicleInfoData(playerid,x);
    PlayerPlaySound(playerid, 1083, 0.0, 0.0, 0.0);
    DestroySelectionMenu(playerid);
    CancelSelectTextDraw(playerid);
    SetPVarInt(playerid, "vspawner_active", 0);
    return 1;
    }
    x++;
    }
    }


    stock ShowVehicleInfoData(playerid, selecteditem)
    {
    new str[512],rnd=random(2500);
    format(str,sizeof str,"{FFFFFF}Du hast folgendes Fahrzeug ausgewählt.\n\nName: {00FF00}%s\n{FFFFFF}Importkosten: {FF0000}%s{FFFFFF}€\n{FFFFFF}Kostenaufschlag (für die Lieferanten): {FF0000}%s{FFFFFF}€\n\nGesamtkosten: {FF0000}%s{FFFFFF}€",PlayerVehicle[gItemList[selecteditem]-400],inspoints(DealerVehPrice[selecteditem]),inspoints(rnd),inspoints(DealerVehPrice[selecteditem]+rnd));
    SetPVarInt(playerid,"ImportVeh",selecteditem);
    SetPVarInt(playerid,"Lieferkosten",rnd);
    ShowPlayerDialog(playerid,DLG_AH_IMPORTCAR,DIALOG_STYLE_MSGBOX,"Fahrzeug importieren",str,"Import","Abbrechen");
    return 1;
    }

  • stock ShowVehicleInfoData(playerid, selecteditem)
    {
    new str[512],rnd=random(2500);
    selecteditem = selecteditem + (21 * (GetPVarInt(playerid, "vspawner_page") - 1));
    format(str,sizeof str,"{FFFFFF}Du hast folgendes Fahrzeug ausgewählt.\n\nName: {00FF00}%s\n{FFFFFF}Importkosten: {FF0000}%s{FFFFFF}€\n{FFFFFF}Kostenaufschlag (für die Lieferanten): {FF0000}%s{FFFFFF}€\n\nGesamtkosten: {FF0000}%s{FFFFFF}€",PlayerVehicle[gItemList[selecteditem]-400],inspoints(DealerVehPrice[selecteditem]),inspoints(rnd),inspoints(DealerVehPrice[selecteditem]+rnd));
    SetPVarInt(playerid,"ImportVeh",selecteditem);
    SetPVarInt(playerid,"Lieferkosten",rnd);
    ShowPlayerDialog(playerid,DLG_AH_IMPORTCAR,DIALOG_STYLE_MSGBOX,"Fahrzeug importieren",str,"Import","Abbrechen");
    return 1;
    }


    Das sollte schon genügen.