First Person Script

  • Mit dem folgenden Schritten kannst du ganz einfach einstellen ob 3rd Person in deiner Mission erlaubt ist oder nicht,
    ob man in einem Fahrzeug die Außenperpektive verwenden darf und oder bei welcher Geschwindigkeit! (bei Missionen mit Piloten sehr hilfreich)



    1. SQF anlegen

    erstelle in deinem Missionsordner eine sqf-datei und benenne sie beliebig. z.B.: "3rd.sqf"
    erstelle eine "init.sqf" falls noch nicht vorhanden


    öffne die Datei mit einen beliebigen Programm wie z.B.: Notepad oder den normalen Editor.



    2. der code für die 3rd.sqf




    3. init.sqf


    in die "init.sqf" einfügen:

    Code
    1. nul=[] execVM "3rd.sqf";



    4. ausprobieren, weiterentwickeln, verbessern


    greetz Methking

  • Zitat von [C-L-F] NetFusion;1289

    Ein super Script was ich auch schon oft (in ähnlicher Form) in Aktion gesehen habe.


    Da ich kein Fan von

    PHP
    1. while {true} do { ... };


    bin, empfehle ich für deine zweite Version ein rekursive Variante zu bauen.


    leider gibt es hier keine wirklich andere lösung
    actionKeys gibt sowie jemand ein ALT/SHIFT/CTRL zu der einzel taste hinzufügt nur noch müll raus womit die möglichkeit einen eventhandler hier für zu nutzen weg fällt (außer man nimmt in kauf das es nicht immer funktionieren wird)


  • Das die das was ich Aktuell in meinem Template Drinne habe und das sollte etwas Performace Sparen weil man keine While schleifen und auch keine waitUntils braucht :D
    Diese Zeilen einfach in die Init oder InitPlayerLocal reinschreiben und die Variablen sollten alles andere erklären.
    Es ist zwar etwas anders in bezug auf die wann es zurück schaltet aber sollte ja einfach anzupassen sein

  • ich mache es so.
    Ich lasse es initplayerlocal.sqf folgendees script laden
    [1] execVM "fnc\dof_fnc_ansicht.sqf"


    der Code


    Wobei der Rückgriff von Joko auf den Missi-EH Draw3D richtig gut ist

  • ok als erster kleiner tipp nutzte kein execVm das ding ist sowas von überholt wie nichts anders. und 2. würde ich keine whiles benutzten die können sich gerne mal aufhängen in einem asynchron umgebung also ehr nen PFEH benutzten und den dann nach bedarf hinzufügen oder entfehrnen

  • ok als erster kleiner tipp nutzte kein execVm das ding ist sowas von überholt wie nichts anders. und 2. würde ich keine whiles benutzten die können sich gerne mal aufhängen in einem asynchron umgebung also ehr nen PFEH benutzten und den dann nach bedarf hinzufügen oder entfehrnen


    PerFrame EventHandler (also über https://community.bistudio.com/wiki/addMissionEventHandler und draw3D) sind jedoch kritisch wenn man zu viele von ihnen verwendet
    haben jedoch natürlich den vorteil das sie sofort agieren (und solange actionKeys noch immer müll zurück gibt ... unsere einzige möglichkeit um sofort zu agieren)

  • Hm ich habe jetzt mal rumprobiert und bin auf diese Lösung gestoßen:
    0 = immer erlaubt
    1 = nur im Fahrzeug
    2 = niemals erlaubt


    Eintrag in der InitPlayerlocal.sqf

  • Hm ich habe jetzt mal rumprobiert und bin auf diese Lösung gestoßen:
    0 = immer erlaubt
    1 = nur im Fahrzeug
    2 = niemals erlaubt


    Eintrag in der InitPlayerlocal.sqf


    ...
    http://armaworld.de/threads/37…=2307&viewfull=1#post2307
    addMissionEventHandler nutzen! NICHT onEachFrame! Das dingen ist "outdated" wie sch.
    (der code hinter dem link ist auch noch nicht optimal jedoch nutzt er addMissionEventHandler, optimalerweise würde noch lazyEvaluation zumindest für die erste condition angwandt)


    bzgl. performance, Lieber duplikate anstatt abfragen ohne ende (if(DOF_ansicht == 1) then füge einen anderen ondraw3d EH hinzu als wenn == 1)

  • ich habe in meinem Template LazyEvaluation benutzt nur beim umwandeln auf die AW Variante das ausversehen rausgeworfen :S
    weil bei mir sind gefühlte 200 weitere abfragen drinne




    und wie währe es damit? könnte das vielleicht schneller sein



    damit ist es wenigstens übersichtlicher


    Allerding hat draw3d das Problem das es nur solange ausgeführt wird wie man Im Game ist und nicht im pause menü oder nicht rausgetabt ist D.H. das script ist zu umgehen wenn man raus tabt oder esc drück im selben moment wie man 3rd Person geht und es dauert trotzdem immer noch ein frame wo man in der außen perspective ist bevor man wieder in die innen perspective gewungen wird

  • jokoho482
    Mit diesem Code können die Spieler nicht mehr durch ihr Visier schauen.
    Du müsstest die Zeile 9 aus deinem zweiten Codeblock ändern in:

    Code
    1. [COLOR=#007700][FONT=monospace]if ([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]cameraView in[/FONT][/COLOR][COLOR=#007700][FONT=monospace] [[/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"INTERNAL","GUNNER"][/FONT][/COLOR][COLOR=#007700][FONT=monospace]) [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]exitWith [/FONT][/COLOR][COLOR=#007700][FONT=monospace]{};[/FONT][/COLOR]


    Zudem ist es ratsamer dafür ein "onEachFrame" eventHandler mittels addStackedEventHandler zu verwenden, den kann man nicht mit raus tabben überlisten.


    Hier ein stark simplifiziertes Beispiel, welches 3rd person view in Fahrzeugen erlaubt und für Infanteristen blockiert:

    Code
    1. ['Disable3rd', 'onEachFrame', {
    2. if (cameraView in ['INTERNAL','GUNNER']) exitWith {};
    3. if (vehicle player != player) exitWith {};
    4. vehicle player switchCamera "INTERNAL";
    5. }] call BIS_fnc_addStackedEventHandler;


    Hoffe ich konnte helfen.
    Greez KiloSwiss

  • Ich habe durch einen Link von Rockhount folgenden Code mir zusammen gebaut. Es benötigt CBA. Vorteil ist, es rennt zwangsläufig per Frame, da man den Delay einstellen kann. Hier habe ich diesen auf 1 Sekunde gestellt.
    Der Aufruf erfolgt Local (InitPlayerLocal.sqf): [1] spawn compile preprocessFileLineNumbers "fnc\dof_fnc_externeansicht.sqf";
    // 1 nur im Fahrzeug
    // 2 niemals


  • Drunken Officer
    Wozu das CBA Addon als künstliche Voraussetzung schaffen, wenn ArmA3 die benötigten Funktionen bereits von Haus aus mitbringt?
    Bei ArmA2 konnte ich das zurückgreifen auf CBA verstehen, dort war es aber auch noch so dass man um onEachFrame, onPlayerConnected, etc. besser einen grossen Bogen gemacht hat, da sich diese EventHandler gegenseitig überschrieben.


    In ArmA3 hat man jedoch die Möglichkeit mittels addStackedEventHandler (wurde oben bereits verlinkt), mehrere EH parallel zu erstellen und diese individuell wieder zu entfernen.
    Der "Umweg" über CBA ist somit in ArmA3 nicht mehr nötig und das Überschreiben eines bereits vorhandenen EH ist auch keine Gefahr mehr (sofern man nicht bei der ID einen Fehler macht).



    Zudem verstehe ich X39s Abneigung gegenüber dem onEachFrame EH nicht, es wäre durchaus interessant zu erfahren auf welchen Erfahrungen/Wissen diese beruht, man lernt ja schliesslich nie aus.



    Ich habe mal versucht Draw3D und es ist beinahe unmöglich in 3rd Person zu gehen man muss 1 FPS oder weniger haben um das zu überlisten

    Du hast es erst jetzt getestet?
    In einem vorherigen Post, schriebst Du noch:

    ... D.H. das script ist zu umgehen wenn man raus tabt oder esc drück im selben moment wie man 3rd Person geht ...

    Das hörte sich (zumindest für mich) so an, als hättest Du dies bereits ausprobiert und wärst zu eben dem beschriebenen Ergebnis gekommen.
    Entschuldige wenn ich dich da falsch verstand habe.


    Also gehe ich recht in der Annahme, dass es sowohl mit addStackedEventHandler + onEachFrame funktioniert, als auch mit addMissionEventHandler + Draw3D und zwar ohne dass man die Funktion überlisten kann?