Teleport per onMapClick

  • Multiplayer

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Teleport per onMapClick

    Hallo liebe ArmA World Community,

    ich habe gerade einen Gedanken hänger... aber zunächst erstmal mein Code, um einen Spieler per onMapClick zu seiner gewünschten Position teleportieren zu lassen:

    Quellcode

    1. _bool = false;
    2. openMap [true, false];
    3. while {alive player && visibleMap} do
    4. {
    5. onMapSingleClick "player setPos _pos; _bool = true; ['#(argb,8,8,3)color(0,0,0,1)', [safeZoneX, safeZoneY, safeZoneW, safeZoneH], [5,5], 2, 1] spawn BIS_fnc_textTiles; onMapSingleClick ''; true;";
    6. waitUntil {!visibleMap or _bool};
    7. if (_bool) then
    8. {
    9. sleep 1;
    10. openMap [false, false];
    11. };
    12. onMapSingleClick " ''; true";
    13. };
    Alles anzeigen

    Ich habe folgendes Problem mit dem Code:
    Ich möchte, dass die Map sich nach 1 Sekunde, nachdem der Spieler teleportiert wurde, selbst schließt, damit der Effekt ['#(argb,8,8,3)color(0,0,0,1)', [safeZoneX, safeZoneY, safeZoneW, safeZoneH], [5,5], 2, 1] spawn BIS_fnc_textTiles richtig zur Geltung kommt. Daher auch diese _bool Geschichte...

    Leider ist es so, dass die variable nicht von onMapClick weiter gegeben wird, und ich möchte nur ungern eine globale Variable verwenden (womit es funktionieren würde).
    Das Script soll von mehr als ein Spieler benutzt werden und ich habe Angst vor hängern von ArmA, wenn eine globale Variable von vielen Spielern verwendet wird.


    Wie schaffe ich es, dass openMap [false, false]; 1 sekunde nach dem OnMapClick ausgeführt wird?
    Ich bin mir sicher es gibt eine einfach Lösung, ich komme nur nicht drauf :P

    Vielen Lieben Dank im Vorraus

    Chibi
  • Also zunächst mal wäre es ratsam die "stapelbare" Variante des EHs zu verwenden. Das wäre dann sowas hier

    Quellcode

    1. addMissionEventHandler ["MapSingleClick", {<SomeCode>}];

    Außerdem irritiert mich, dass du den EH in einer while Schleife hinzufügst. Warum nicht einmal hinzufügen und gut ist (Was du mit dem zweiten onMapSingleClick vorhast erschließt sich mir nicht ganz)?

    Um also deine eigentliche Frage zu beantworten bezüglich des Delays. Das könnte man so lösen:

    Quellcode

    1. addMissionEventHandler [
    2. "MapSingleClick",
    3. {
    4. // teleport player
    5. player setPos (_this select 1);
    6. // call arbitrary functions here
    7. // make sure the map closes one sec from now
    8. [] spawn {sleep 1; openMap false;};
    9. }
    10. ];
    Alles anzeigen

    Das sollte das von dir beschriebene Problem lösen auch wenn ich mich dabei nur auf die Aussage bezüglich des Delays beziehe, da ich wie gesagt nicht verstehe was du mit dem restlichen Code versuchst zu erreichen :11_unknown:

    PS: Das Ganze über spawn zu regeln erlaubt es den delay einfach über einen sleep zu regeln, was die einfachste Möglichkeit ist, wenn man kein Per-Frame-Framework einsetzt
    Entwickler von SQDev
  • Raven schrieb:


    Außerdem irritiert mich, dass du den EH in einer while Schleife hinzufügst. Warum nicht einmal hinzufügen und gut ist (Was du mit dem zweiten onMapSingleClick vorhast erschließt sich mir nicht ganz)?
    Das entfernt den Eventhandler wieder. Falls man die Map schließt.

    Chibi Chi schrieb:

    Leider ist es so, dass die variable nicht von onMapClick weiter gegeben wird, und ich möchte nur ungern eine globale Variable verwenden (womit es funktionieren würde).
    Das Script soll von mehr als ein Spieler benutzt werden und ich habe Angst vor hängern von ArmA, wenn eine globale Variable von vielen Spielern verwendet wird.
    Lokale variablen propagieren nicht in neue Script Instanzen. Also das mit der Lokalen variable kannst du vergessen.
    Ich glaube du hast nicht verstanden wie globale Variablen funktionieren.
    Die kann überhaupt nicht "von vielen Spielern verwendet werden".
  • dedmen schrieb:

    Ich glaube du hast nicht verstanden wie globale Variablen funktionieren.
    Die kann überhaupt nicht "von vielen Spielern verwendet werden".
    Da musste ich doch glatt noch mal an die Bücher, und wieder etwas gelernt ;)
    Also goblale Variable != public Variable.

    Damit kann ich nicht nur das Script zum laufen bringen, sondern habe auch wieder neues Grundwissen bekommen!
    Viel Dank dedmen! (Und natürlich auch Raven!)

    Es ist schön zu sehen, wie Ihr nicht nur mir, sondern auch vielen Anderen Leute hier im Forum helft :)
  • Ich mache das so (nur mal als Beispiel)

    Quellcode

    1. drunkenport_single =
    2. {
    3. testteleport = false;
    4. openmap [true,false];
    5. titletext ["auf der Karte den Teleportpunkt anklicken","plain"];
    6. onMapSingleClick "onMapSingleClick ''; teleportpos = _pos; testteleport = true";
    7. waitUntil {sleep 1; (!visiblemap OR testteleport OR !alive player)};
    8. if (!testteleport OR !alive player) exitWith
    9. {
    10. teleportpos = nil;
    11. hint parseText format["<t size='1.25' color='#ff0000'>Teleport abgebrochen</t>"];
    12. titletext ["","plain"];
    13. };
    14. player setPos teleportpos;
    15. titletext ["","plain",0.2];
    16. hint parseText format["<t size='1.25' color='#208000'>Teleport erfolgreich</t>"];
    17. openmap [false,false];
    18. };
    Alles anzeigen
    player addaction [format ["<t color='#F0E68C'>Teleport Spieler</t>"], drunkenport_single];
    Gehirn ist keine Seife. Es wird nicht weniger, wenn man es benutzt!

    Beste Band der Welt
  • Drunken Officer schrieb:

    Ich mache das so (nur mal als Beispiel)

    Quellcode

    1. drunkenport_single =
    2. {
    3. testteleport = false;
    4. openmap [true,false];
    5. titletext ["auf der Karte den Teleportpunkt anklicken","plain"];
    6. onMapSingleClick "onMapSingleClick ''; teleportpos = _pos; testteleport = true";
    7. waitUntil {sleep 1; (!visiblemap OR testteleport OR !alive player)};
    8. if (!testteleport OR !alive player) exitWith
    9. {
    10. teleportpos = nil;
    11. hint parseText format["<t size='1.25' color='#ff0000'>Teleport abgebrochen</t>"];
    12. titletext ["","plain"];
    13. };
    14. player setPos teleportpos;
    15. titletext ["","plain",0.2];
    16. hint parseText format["<t size='1.25' color='#208000'>Teleport erfolgreich</t>"];
    17. openmap [false,false];
    18. };
    Alles anzeigen
    player addaction [format ["<t color='#F0E68C'>Teleport Spieler</t>"], drunkenport_single];
    Die globale variable da macht keinen Sinn. addAction wandelt das Script in einen String um und speichert den String.