Chatnachrichten und Erweiterungen in Dialogen

  • Hallo zusammen :)


    Im Moment verzweifel ich etwas an dem Erstellen eines Dialoges der in Mulitplayerbereichen eingesetzt werden soll. Und zwar sollen Piloten in einer Trainingsmission einen Dialog aufrufen können, um am Tower 6 verschiedene Optionen anfragen zu können ( Ein Fenster öffnet sich mit 6 verschiedenen Buttons) ( 2x Landen, 2 mal Starten, 1x Notlanden, 1x Lufteskorte). Der Grundaufbau des Dialogs klappt bestens, nur einzelne Feinheiten sind nicht so gelungen bzw klappen nicht.


    Zu meinem ersten Problem:


    Nach dem Drücken eines Buttons soll ein bestimmter Text mittels Sidechat von dem jeweiligen Spieler kreiert werden. Dachte da an "action = ... ". geht aber nicht weil ich schon action = "closedialog 0;" drin habe?


    Mein zweites Problem:


    Der Dialog soll nur aufgerufen werden können, wenn sich der jeweilige Spieler auch in einem Flugzeug befindet (Alle Flugzeuge besitzen Variablennamen im Szenario).
    Dachte daran mit addaction zu arbeiten. Das Problem ist aber dass man dann auch von ausserhalb darauf zugreifen kann wenn man neben dem FLugzeug steht, wenn sich ein spieler im flugzeug befindet, es soll aber nur auf dem Piloten, bzw Copilotensitz möglich sein.


    Und mein drittes und letztes Problem:


    Wenn eine Anfrage von einem Piloten gedrückt wurde, soll sich bei Spieler1 (Der der im Tower sitzt) ein Dialogfeld öffnen mit 3 Antwortmöglichkeiten, um auf die Anfrage zu antworten.


    Hier mal der vorhandene Dialog, ich hoffe ihr könnt verstehen was ich meine und könnt mir helfen :)



  • geht aber nicht weil ich schon action = "closedialog 0;" drin habe?

    Sollte kein Problem sein das da dazu rein zu packen. Schreib einfach action="[side player, 'Tower'] sideChat 'I am a message'; closeDialog 0;"



    Mein zweites Problem:
    [...]
    Und mein drittes und letztes Problem:

    Generell ist es meistens besser für jedes Problem einen eigenen Thread aufzumachen - die kosten nix ;)



    Der Dialog soll nur aufgerufen werden können, wenn sich der jeweilige Spieler auch in einem Flugzeug befindet (Alle Flugzeuge besitzen Variablennamen im Szenario).
    Dachte daran mit addaction zu arbeiten. Das Problem ist aber dass man dann auch von ausserhalb darauf zugreifen kann wenn man neben dem FLugzeug steht, wenn sich ein spieler im flugzeug befindet, es soll aber nur auf dem Piloten, bzw Copilotensitz möglich sein.

    addAction kann mit einer Bedingung (condition) erzeugt werden, sodass die Aktion nur angezeigt wird, wenn diese Bedingung erfüllt ist. Könntest dann vllt. sowas hier machen:


    Code
    1. <Objekt> addAction ["Some action", {hint "activated"}, [], 1.5, true, true, "", "count (['Driver', 'Turret'] arrayIntersect assignedVehicleRole _this) > 0"]

    Hierbei ist besagte Condition count (['Driver', 'Turret'] arrayIntersect assignedVehicleRole _this) > 0 was in Worten so viel heißt wie: Gebe true zurück, wenn der, dem diese Aktion möglicherweise angezeigt wird, entweder der Fahrer oder der Gunner (ich glaube das ist , was der Copilot ist) des Fahrzeuges ist, in dem er sich gerade befindet. Hab das nicht ausprobiert, aber prinzipiell sollte das so oder so ähnlich funktionieren...



    Wenn eine Anfrage von einem Piloten gedrückt wurde, soll sich bei Spieler1 (Der der im Tower sitzt) ein Dialogfeld öffnen mit 3 Antwortmöglichkeiten, um auf die Anfrage zu antworten.

    Hierfür dann einfach in dem entsprechenden Code die assignedVehicleRole von _this select 1 (dem der die Aktion aufgerufen hat) checken: if ("Driver" in assignedVehicleRole (_this select 1)) then {<Do stuff>}

  • Habs jetzt mal so gemacht:


    action = "closeDialog 0;_nul=[]ExecVM ""Script.sqf""";


    Ist es möglich eine abfrage mit if else im script zu machen, welche der 6 buttons gedrückt wurde (Die sind alle benannt button_01, button_02, usw...) um dann jeweils den passenden funkspruch rauszugeben sodass ich nur eine sqf dafür benötige, weil ich dafür jeweils seperate funksprüche ausgeben möchte.


    Und mit deiner Lödung für die addaction komme ich leider nicht weiter, zumindest funktioniert es auch nach ausprobieren nicht, es zeigt mir zumindest keine action an die ich ausführen könnte.

  • Ist es möglich eine abfrage mit if else im script zu machen, welche der 6 buttons gedrückt wurde (Die sind alle benannt button_01, button_02, usw...) um dann jeweils den passenden funkspruch rauszugeben sodass ich nur eine sqf dafür benötige, weil ich dafür jeweils seperate funksprüche ausgeben möchte.

    Klar - einfach bei den einzelnen Aktionen jeweils nen anderen Parameter Übergeben und das im Skript abfragen (am einfachsten über eine case-Struktur)



    Und mit deiner Lödung für die addaction komme ich leider nicht weiter, zumindest funktioniert es auch nach ausprobieren nicht, es zeigt mir zumindest keine action an die ich ausführen könnte.

    Dann schreib als Bedingung mal nur "true" rein und schau ob das geht. Wenn ja muss an der Bedingung gearbeitet werden. Wenn nein, hast irgendwo anders ein Problem...

  • Okay gerade nochmal im Wiki nachgelesen und der Befehl ist wohl kaputt.


    Dann versuchen wir es doch mal hiermit als Bedingung

    Code
    1. "vehicle _this != _this && driver vehicle _this == _this"

    Wenns richtig funktioniert sollte die Aktion dann nur dem Fahrer angezeigt werden...


    Sollte das nicht funktionieren, entferne mal den Teil mit dem && und Allem was danach kommt.

  • Funktioniert auf dem Pilotensitz ja :) jetzt versuch ich nurnoch den CoPiloten mit da rein zu basteln und dann sollte das passen.


    Haben sich dann die Befehle bezüglich des sich öffnenden Dialogfensters für Spieler1 auch erledigt wenn manche ja nichtmehr funktionieren?


    Und weißt du zufällig wie man die Abfrage in einem skript schreibt, welcher button vom Piloten gedrückt wurde im ersten Dialog?

  • Funktioniert auf dem Pilotensitz ja

    Na Halleluja xD



    jetzt versuch ich nurnoch den CoPiloten mit da rein zu basteln und dann sollte das passen.

    Dafür kannst du dann

    Code
    1. "vehicle _this != _this && (driver vehicle _this == _this || gunner vehicle _this == _this)"

    nehmen. Wenn das nicht tut, dann ersetze gunner mit commander und versuche das...



    Haben sich dann die Befehle bezüglich des sich öffnenden Dialogfensters für Spieler1 auch erledigt wenn manche ja nichtmehr funktionieren?

    Was sol sich erledigt haben? :28_thinking:


    Und weißt du zufällig wie man die Abfrage in einem skript schreibt, welcher button vom Piloten gedrückt wurde im ersten Dialog?

    Klar - einfach bei den einzelnen Aktionen jeweils nen anderen Parameter Übergeben und das im Skript abfragen (am einfachsten über eine case-Struktur)

  • this addAction ["Anfragenfenster öffnen", "AnfragenDialog.sqf", [], 1.5, true, true, "", "vehicle _this != _this && (driver vehicle _this == _this || gunner vehicle _this == _this)"]



    Das ist es endlich 8o <3


    Ok mit den parametern übergeben und abfragen hab ich noch keinerlei erfahrung, aber ich werd mich mal da reinlesen und evtl was zusammenzaubern, danke dir schonmal :thumbsup:

  • Ok mit den parametern übergeben und abfragen hab ich noch keinerlei erfahrung, aber ich werd mich mal da reinlesen und evtl was zusammenzaubern, danke dir schonmal

    Mach das - nur so viel: die Parameter mit addAction werden über das 3. Argument im Befehl spezifiziert und sind im Skript dann in der Variable _this verfügbar :)

  • vielleicht hast du noch einen kleinen letzten tipp, und zwar wenn die fahrzeuge respawnen verlieren sie ihre fähigkeit über addaction erneut abgerufen zu werden, wie ich das umgehene, kann, habs mit auslösern und allem probiert grade aber will nicht so wirklich

  • Hierbei ist besagte Condition count (['Driver', 'Turret'] arrayIntersect assignedVehicleRole _this) > 0 was in Worten so viel heißt wie: Gebe true zurück, wenn der, dem diese Aktion möglicherweise angezeigt wird, entweder der Fahrer oder der Gunner [...] des Fahrzeuges ist, in dem er sich gerade befindet.

    Nö.



    assignedVehicleRole gibt, wie der Name schon sagt, die vom Gruppenführer zugewiesene Rolle zurück. Wenn man selbst der Gruppenführer ist, dann ändert sich das mit dem Wechseln der Fahrzeugposition automatisch, aber sobald man selbst nicht der Gruppenführer ist, gibt der Befehl was ganz anderes wieder. 99% aller Skripte, die assignedVehicleRole so benutzen, sind verbuggt.