TextDraw Autohaus-System, aber wie?

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
  • Moin Fische,


    Ich habe vor ein Autohaus-System über klickbare TextDraws zu machen.
    Ich bin ein recht neuer Scripter, kenne allerdings die Grundlagen gut.
    Ein Autohaus-System mithilfe von Dialogen wären für mich kein Problem, ich wollte allerdings etwas extravagantes.
    Nun habe ich den Salat, ich habe keine Ahnung wie ich mithilfe von TextDraws ein solches System zustande bringen soll.
    Wie bekomme ich/das Script heraus welche/s Fahrzeug-ID/Fahrzeug gerade im TextDraw angewählt ist, sodass dieses Fahrzeug dann gespawnt wird.



    Bild des Textdraws:


  • Also vom sin heer ist es genau so als wenn du das mit Dialogen machst , nur anstatt das bei OnPlayerDialogResponse einzutragen trägst du den Code hier ein:





    Sry wegen den int? weiß nicht wie das heißt XD




    ps.


    Wenn du was nicht verstanden hast kannst du gerne auf meine Ts³ kommen ich helfe dir gerne



    84.200.7.169

    3 Mal editiert, zuletzt von Includ ()

  • Als erstes: Danke für die fixxe Antwort um diese späte Uhrzeit.


    Ok, dann lag ich doch im Kopf nicht ganz so falsch.
    Arbeite ich wie bei den Dialogen auch mit Case-Switch bzw. if-listitem, oder anders?
    Sprich wie frag ich ab welches Fahrzeug gerade in der Box zu sehen ist bzw. welches gerade ausgewählt ist?


  • public OnPlayerClickPlayerTextDraw(playerid, PlayerText:playertextid)
    {
    if(playertextid == car1[playerid])
    {
    spawncar(411)// nur ein beispiel
    }
    if(playertextid == car2[playerid])
    {
    spawncar(420)// nur ein beispiel
    }
    //Ganz genau genommen arbeitest du mit einem if filter
    }
    }


    so musst du das machen wenn du dass genau so machen möchtest wie es das Bild zeigt ;D

  • Ok, weitesgehend verstehe ich den Aufbau mittlerweile.
    Aber wie ich sehe müsste ich für jedes Fahrzeug ein eigenes PreviewTextDraw anfertigen, ist das richtig?



    z.B.


    if(playertextid == InfernusPrev[playerid]
    {
    CreateVehicle(411,weitereDaten);
    }
    else if(playertextid == CheetahPrev[playerid]
    {
    CreateVehicle(415,weitereDaten);
    }

  • genau da du allgemein nicht abfragen kannst was da auf dem Bild ist XDXD

    Hehe, wenn es so einfach wäre.


    Ok, jetzt brauche ich aber im Prinzip immer noch die Funktion der Pfeile die zwischen jeweiligen PreviewTextDraws auswählt, sowie versch. Autohäuser die versch. Autos anzeigt.
    Das wären auch meine letzten Anliegen, wenn du mir dabei noch hilfst, werde ich dich vor dem schlafen gehen anbeten :D


    Bedanken möchte ich mich allerdings trotzdem schon, du hast mir sehr viel weiter geholfen.

  • Mach es doch nicht so kompliziert.


    Wenn du bei einem Autohaus bist, hast du ja eine Liste an Fahrzeugen die dort angeboten werden.


    Dann kannst du es so ungefähr schreiben. Ein Int Array mir alles Car IDs die es dort zu kaufen geben soll.
    new car_list_dealership_sf_grotti[10] = {460, ...};


    Danach brauchst du eine Variable, in der du speicherst wo der Spieler in dieser Liste gerade ist. Kannst du mit einem PVar machen oder mit einem Array, etc.


    new player_car_dealership_pos[MAX_PLAYERS]; // Oben in das Skriptnew player_car_dealership_curr[MAX_PLAYERS];


    public OnPlayerClickTextDraw(playerid, Text:clickedid) {if(clickedid == pfeil_next) {player_car_dealership_pos[playerid] ++;update_car_dealership_textdraw_for_player(playerid);} else if(clickedid == pfeil_prev) {player_car_dealership_pos[playerid] --;update_car_dealership_textdraw_for_player(playerid);}}
    Für die Pfeile brauchst du keine Player TextDraws, da keine direkt Spielerbezogenen Aktionen ausgelöst werden.


    Dann brauchst du die Funktion "update_car_dealership_textdraw_for_player".
    Dort brauchst du eine Abfrage, mit deinen Autohaus IDs, ob der Fahrzeuglisten Iterator des Spielers sich außerhalb der Liste des jeweiligen Autohauses befindet und wenn nötig, den Iterator dann auf 0 oder die größte Zahl setzen, wenn außerhalb der Liste und du musst natürlich die Textdraws, mit der Fahrzeug Anzeige updaten.


    Und um performance zu sparen, kannst du in OnPlayerClickTextDraw ein switch; case; benutzen.

    public OnPlayerClicktextDraw(...) {
    switch(clickedid) {
    case pfeil_next: {
    ...;
    }
    }
    }

  • Vorab:
    Erstelle die Textdraws, die einen veränderlichen Wert haben (Fahrzeuganzeige, Preis) als Player-Textdraws, sonst sieht jeder Spieler das Gleiche, es könnten ja auch mal zwei Leute dort sein.
    Die Textdraws wie die Pfeile und die Texte, die immer gleich sind, erstellst du als normale Textdraws.


    Dann nimmst du dir ein Array für alle Spieler:
    new ahID[MAX_PLAYERS];


    Beim Öffnen des Menüs setzt du dann ahID auf den Startwert, also zum Beispiel die 400:
    ahID[playerid] = 400;
    Falls du nicht alle Fahrzeuge dort haben willst, dann hier die ID des Array-Indexes (wahrscheinlich 0) an dem es anfangen soll.


    Und dann an den Pfeilen:
    ahID[playerid]++;
    bzw:
    ahID[playerid]--;


    Entsprechend der ahID kannst du dann das Fahrzeug-Model anzeigen lassen, und da dies eine globale Variable ist, kannst du beim Bestätigen den Wert von ahID auslesen und das Fahrzeug spawnen lassen:
    CreateVehicle(ahID[playerid], x, y, z, /*etc...*/);
    Oder wenn du es über ein Array machst, dann wäre es die Index-Referenz, also:


    CreateVehicle(deinArray[ahID[playerid]], x, y, z, /*etc...*/);


    In dem Array stehen dann die Model IDs.



    Falls du ein Array hast und damit so nicht klar kommst, poste das Array bitte.

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen
  • Danke für eure Antworten .fr3ak und Jeffry



    So würde dann das Array aussehen, richtig?


    Wie ändere ich eigentlich das Model in der TextDrawPreview?
    soweit ich das testen konnte, funktioniert der Name der Fahrzeuge gut, nur das Model in der TextDraw wird nicht geändert.

  • Alles klar, danke mein gutster.


    Ich möchte rein zur Überprüfung noch einmal den Code schicken wenn man auf einen Pfeil drückt.

    Code
    if(playertextid==AutoHPfeil[playerid])
    	{
    		SportAutos[ahID[playerid]]++;
    		PlayerTextDrawSetPreviewModel(playerid,AutoHB1[playerid],SportAutos[ahID[playerid]]);
    		PlayerTextDrawShow(playerid,AutoHB1[playerid]);
    		PlayerTextDrawSetPreviewModel(playerid,AutoHB2[playerid],SportAutos[ahID[playerid]]);
    		PlayerTextDrawShow(playerid,AutoHB2[playerid]);
    	}
  • Aber, wie stelle ich jetzt die Preise für die einzelnen Fahrzeuge ein

    Entweder über einen zweiten Eintrag im Array, sprich hinter der Model ID, und dann greifst du über ein enum darauf zu (Model/Preis).
    Oder über ein zweites Array, das die Preise zum Model enthält, in gleicher Reihenfolge.



    wie baue mit diesem System verschiedene Autohäuser ein?

    Kommt darauf an was die verschiedenen Autohäuser verschieden macht. Preise, Modelle, ...?
    Eventuell ebenfalls im gleichen Array, mit einer ID für das Autohaus im enum.



    Falls du Hilfe zum Code brauchst, sag Bescheid.

  • Kommt darauf an was die verschiedenen Autohäuser verschieden macht. Preise, Modelle, ...?

    Es soll komplett andere Fahrzeuge mit den dazugehörigen Preisen beinhalten.


    //EDIT
    Enum und Array sehen folgerndermaßen aus:

    Einmal editiert, zuletzt von rgnbgnhnd ()

  • Dann würde ich es dir per enum empfehlen:
    enum autoEnum {
    autohaus,
    model,
    preis
    }


    new SportAutos[][autoEnum]={
    {0, 411, 50000},
    {0, 520, 1000},
    {0, 419, 999999},
    {0, 400, 15000},
    {1, 415, 50000},
    {1, 411, 60000},
    {1, 423, 70000},
    {1, 555, 10000},
    {1, 444, 44444} //An letzter Stelle kein Komma
    //...
    };


    Auf die ModelID kommst du dann z.B. so:
    AutohausAutos[ahID[playerid]][model]



    Was hier wichtig ist:
    Beim Start am Autohaus musst du die richtige Stelle für das erste Fahrzeug finden (Schleife und Autohaus ID ablgeichen, für den ersten Index).
    Bei der Prüfung ob das letzte Auto erreicht ist, musst du abfragen, ob das Array am Ende angekommen ist (sizeof) oder ob die nächste Index-ID zu einem anderen Autohaus gehört.

  • Soweit funktioniert alles, ich muss nur noch den Fahrzeugnamen sowie den Preis in das Textdraw schreiben.
    mit den mehreren Autohäusern werde ich mich wohl erst beschäftigen wenn die Fahrzeugnamen und der Preis passt.