[Denkanstoß] Dialog Liste

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
  • Hey,


    ich bräuchte einen kleinen Denksnstoß, bzw. eine kleine theoretische Anleitung zu folgendem.


    Ich möchte, dass ein "listitem" mit dem aktivieren eines bestimmten cmds in einem dialog auftaucht, und mit einem weiteren cmd wieder verschwindet.


    Beispiel:
    Spieler A benutzt /duell. => Herausforderung soll in /duellliste aufgelistet werden.
    Sobald Spieler A /cancel benutzt soll die Herausforderung aus dem Dialog gelöscht werden.


    Wie stelle ich das an?


    Danke!

  • dies ist Dynamisch lösbar


    kleiner Denk anstoß:
    mit einer for-schleife die Variablen durch gehen und wer Aktiviert ist soll angezeigt werden
    falls du jetzt nur "Bahnhof" verstehst, brauchst nur sagen, denn mach ich ein kleines beispiel

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Ich möchte PVars weitgehendst vermeiden, da man sie ja in 99,9% aller Fälle nicht braucht.


    "%s\n%s" sind doch nur zwei Zeilen...? Wie genau läuft das ab?


    Und btw: GetMaxPlayers() in einer for-Schleife ist suboptimal. Eine Konstante wäre besser. Der Compiler wird es ja einfacher haben eine Konstante abzurufen, anstatt einer Funktion.

  • Ich möchte PVars weitgehendst vermeiden, da man sie ja in 99,9% aller Fälle nicht braucht.


    "%s\n%s" sind doch nur zwei Zeilen...? Wie genau läuft das ab?


    Und btw: GetMaxPlayers() in einer for-Schleife ist suboptimal. Eine Konstante wäre besser. Der Compiler wird es ja einfacher haben eine Konstante abzurufen, anstatt einer Funktion.


    GetMaxPlayers() liest aber die in der Serverconfig eingestellte maximale Anzahl von Verbindungen aus.
    Eine Konstante wäre bei 500.
    Man könnte es auch redefinen, aber es ist ja, wie du im Titel schon genannt hast, ein Denkanstoß und bestimmt nicht dazu da, es zu copy und pasten. Daher kannst du es ja anpassen. ^^


    Er geht mit der Schleife alle durch und hängt gibt der Variable str immer ihren eigenen Wert und ein Backslash n und dann den neuen Wert.
    Somit sind es nicht nur 2 Items, wenn es mehr, als 2 Spieler sind.

  • Okay, die genaue Funktionsweise ist mir trotz Erklärung immer noch schleierhaft, aber naja.
    Noch eine kurze Anmerkung zur Stringgröße: 256 Zeichen ist das Limit aller Zeichen insgesamt, die verwendet werden, oder das Limit eines listitems?

  • Ein String (Zeichenkette) ist eigentlich ein Array. In jedem Feld des Arrays kann ein Zeichen gespeichert werden. Somit ist das die Anzahl aller Zeichen.


    Ich erklär dir am besten mal die Funktionsweise der Auflistung nochmal:


    Die For Schleife wiederholt sich so oft, wie es die Funktion GetMaxPlayers() sagt. Wenn nun 250 Spieler das Maximum des Servers ist, welches man eingestellt hat, geht die Schleife exakt 250 mal durch.
    Dabei wird die Variable i pro Durchgang um eins erhöht.
    i im ersten Durchgang ==> 1
    i im zweiten Durchgang ==> 2
    usw.


    Somit kann man jede PlayerID durchlaufen und damit auch jeden Spieler.
    Man frägt also für jeden Spieler eine Variable ab. In Deinem Fall die Variable, die besagt, dass genau der Spieler, dessen playerid = i ist, ein Duell möchte.
    Wenn die Variable 1 ist (If Abfrage) möchte er ein Duell und soll im Dialog angezeigt werden.
    Somit macht man nun per Format() die Auflistung.
    Jetzt sagen wir es gibt folgende Spieler:


    ID 1 = Manyula (möchte ein Duell)
    ID 2 = John_Hunter
    ID 3 = Kye (möchte ein Duell)
    ID 4 = Whatever


    Die Schleife ist bei ID 1 angekommen: str = Manyula\n
    Die Schleife ist bei ID 2 angekommen: str = Manyula\n
    Die Schleife ist bei ID 3 angekommen: str = Manyula\nKye
    Die Schleife ist bei ID 4 angekommen: str = Manyula\nKye


    Bei der Zuweisung einer Variable gibt es einen L-Wert und einen R-Wert.
    L = Links, R = Rechts


    i = i+1;


    Der Variable str wird somit immer der eigene Wert zugewiesen (der nach dem zweiten Durchgang "Manyula\n" beinhaltet) und der neue Wert (in dem Fall "Kye").
    Somit enthält am Ende dann die Variable str = Manyula\nKye


    Ich hoffe, das war jetzt verständlich genug, wenn auch sehr umfangreich. ^^

  • Umfangreich ist i.d.R. immer gut. Vielen Dank für deine Mühe, jetzt macht es schon mehr Sinn. ;)


    Ich werd mich mal ransetzen!


    EDIT: Okay, ich bin immer noch verwirrt.
    Wo baue ich die Schleife ein? Im Command, oder unter dem Callback?

    Einmal editiert, zuletzt von Manyula ()

  • Das löst du im Callback nicht mit "listitems", sondern mit inputtext.
    Nicht wundern! Auch wenn listitems abgeschickt werden wird der Text aus der Listitem-Zeile auch als "inputtext" ausgegeben.
    "Manyula - MapName - Waffe" -> Format
    Und um das "auseinander" zu reißen musst du sscanf benutzen.
    sscanf(inputtext, "p<->sss", ...)
    Müsste so gehen, kann es hier aber schlecht erklären -> Tutorial

  • Das ist alles doch ziemlich viel Neuland...
    Ich versteh jetzt nicht, warum ich da mit sscanf einen String splitten muss? Würde sich bitte jmd die Mühe machen ein Musterbeispiel für das, was im Callback gemacht werden muss, zu machen?

  • kleiner tipp es geht auch viel leichter
    mit einer Schleife

    PHP
    new string[256],ID;
    format(string,256,"");
    for(new i=0; i<MAX_PLAYERS; i++)
    {
    	Var[playerid][ID][Playerid] = i;
    	format(string,256,"%s%s\n",string,GetName(i));
    	ID++;
    }
    ShowPlayerDialog(...);


    PHP
    OnDialogRespose
    pID = Var[playerid][listitem][Playerid];
    pID ist denn die ID von denn Spieler, der ein Duell will

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • Das mit dem 3D Array verstehe Ich auch nicht.
    Du musst es nicht mit sscanf machen, sondern du kannst die Werte auch direkt beim Befehl /duell zwischenspeichern!


    Z.B.: Duell_Waffe[playerid]. Duell_Map[playerid]
    Kannst natürlich auch ein Enum benutzen.


    Bei der Schleife musst du dann die listitems wieder irgendwie zu den Spielerids zuordnen ;)


    Würde sagen mit sscanf ist das besser.