First Person Script

    • Tut- Diskussionen

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

    • 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

      Quellcode

      1. if (!isDedicated) then {
      2. waitUntil {!isNull (findDisplay 46)};
      3. if (difficultyEnabled "3rdPersonView") then
      4. {
      5. while {true} do {
      6. waitUntil {cameraView == "EXTERNAL" || cameraView == "GROUP"};
      7. if (((vehicle player) == player) && (speed (vehicle player)) >= 2) then { /// Spieler wechselt in die Ego sobald er sich in eine Richtung bewegt (Wenn der Spieler steht kann er in die Außenperspektive wechseln)
      8. player switchCamera "INTERNAL";
      9. };
      10. sleep 0.1;
      11. if (((vehicle player) != player) && (speed (vehicle player)) >= 40) then { /// Bei einer Geschwindigkeit von 40 km/h wechselt man in die Ego-perspektive (der Wert 1 (1km/h) lässt einen nur in die 3rd Person wenn das Fahrzeug nicht in Bewegung ist)
      12. (vehicle player) switchCamera "Internal";
      13. };
      14. sleep 0.1;
      15. };
      16. };
      17. };
      Alles anzeigen



      3. init.sqf

      in die "init.sqf" einfügen:

      Quellcode

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



      4. ausprobieren, weiterentwickeln, verbessern

      greetz Methking
      Methking | [SRU] Strike Response Unit | www.coop-central.com
    • [C-L-F] NetFusion;1289 schrieb:

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

      Da ich kein Fan von

      PHP-Quellcode

      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)
    • PHP-Quellcode

      1. // -- First Person and Thrid Person
      2. #define enableFirstPersonOnly // Aktiviert First Person Only Deaktivieren mit //
      3. enableVehicle3rdPerson = true; // 3rd Person in Fahrzeugen erlaubt
      4. enable3rdPersonInBase = 300; // Entferntung von der Basis bis 3D Person Deaktiviert wird bei 0 immer First Person
      5. //first person only
      6. #ifdef enableFirstPersonOnly
      7. if (difficultyEnabled "3rdPersonView") then
      8. {
      9. JK_FPV_EVH = addMissionEventHandler ['Draw3D', {
      10. if ((cameraView == 'EXTERNAL') && (player distance (getMarkerPos 'respawn_west') > enable3rdPersonInBase) && (!enableVehicle3rdPerson || (vehicle player == player))) then {
      11. vehicle player switchCamera 'INTERNAL';
      12. };
      13. }];
      14. };
      15. #endif
      Alles anzeigen


      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
      SIGNATUR START
      Wer Rechtschreibfehler findet darf sie behalten
      ACE3 Core Developer
      CBA A3 Developer
      Developer of Dynasound, Enhance SoundScape, Immerse, Suppress and Align
      SIGNATUR ENDE
    • ich mache es so.
      Ich lasse es initplayerlocal.sqf folgendees script laden
      [1] execVM "fnc\dof_fnc_ansicht.sqf"

      der Code

      Quellcode

      1. /*
      2. Hier kann entgegen der erlaubten Servereinstellung eine 3rd Personen unterbunden werden.
      3. Das Script hat Clientseitig zu laufen
      4. 0 = immer erlaubt
      5. 1 = nur im Fahrzeug
      6. 2 = niemals erlaubt
      7. */
      8. sleep 2;
      9. if (!local player) exitWith {};
      10. waitUntil {!isNull player};
      11. waitUntil {player == player};
      12. private ['_ansicht'];
      13. _ansicht = _this select 0;
      14. if (_ansicht == 0) exitWith {hint "Server allows 3rd person"};
      15. // im Auto
      16. while {_ansicht == 1} do
      17. {
      18. waitUntil {sleep 1; vehicle player == player && alive player && cameraOn == player && cameraView == "External" };
      19. player switchCamera "internal";
      20. };
      21. //niemals
      22. while {_ansicht == 2} do
      23. {
      24. waitUntil {sleep 1; cameraView == "External" };
      25. player switchCamera "internal";
      26. };
      Alles anzeigen


      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
      SIGNATUR START
      Wer Rechtschreibfehler findet darf sie behalten
      ACE3 Core Developer
      CBA A3 Developer
      Developer of Dynasound, Enhance SoundScape, Immerse, Suppress and Align
      SIGNATUR ENDE
    • jokoho482 schrieb:

      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 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

      Quellcode

      1. dof_fnc_ansichtkontrolle =
      2. {
      3. DOF_ansicht = _this select 0;
      4. _id = ['WasfuereinID', 'onEachFrame',
      5. {
      6. if (DOF_ansichtt == 1 && vehicle player == player && alive player && cameraOn == player && cameraView == 'External') then {player switchCamera 'internal'};
      7. if (DOF_ansicht == 2 && cameraView == 'External') then {player switchCamera 'internal'};
      8. }] call BIS_fnc_addStackedEventHandler;
      9. };
      10. [1] spawn dof_fnc_ansichtkontrolle;
      Alles anzeigen
    • Drunken Officer schrieb:

      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

      Quellcode

      1. dof_fnc_ansichtkontrolle =
      2. {
      3. DOF_ansicht = _this select 0;
      4. _id = ['WasfuereinID', 'onEachFrame',
      5. {
      6. if (DOF_ansichtt == 1 && vehicle player == player && alive player && cameraOn == player && cameraView == 'External') then {player switchCamera 'internal'};
      7. if (DOF_ansicht == 2 && cameraView == 'External') then {player switchCamera 'internal'};
      8. }] call BIS_fnc_addStackedEventHandler;
      9. };
      10. [1] spawn dof_fnc_ansichtkontrolle;
      Alles anzeigen


      ...
      armaworld.de/threads/372-First…=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


      PHP-Quellcode

      1. // -- First Person and Thrid Person
      2. #define JK_var_enableFirstPersonOnly // Aktiviert First Person Only Deaktivieren mit //
      3. JK_var_enableVehicle3rdPerson = true; // 3rd Person in Fahrzeugen erlaubt
      4. JK_var_enable3rdPersonInBase = 300; // Entferntung von der Basis bis 3D Person Deaktiviert wird bei 0 immer First Person
      5. if(!isDedicated && hasInterface) then
      6. {
      7. #ifdef JK_var_enableFirstPersonOnly
      8. JK_FPV_EVH = addMissionEventHandler ['Draw3D', {
      9. if ((cameraView == 'EXTERNAL') && (((enable3rdPersonInBase) < (player distance (getMarkerPos 'respawn_west')) && (enable3rdPersonInBase < (player distance (getMarkerPos 'respawn_east'))) && (enable3rdPersonInBase < (player distance (getMarkerPos 'respawn_guerrila'))) && (!enableVehicle3rdPerson || (vehicle player == player))))) then {
      10. vehicle player switchCamera 'INTERNAL';
      11. };
      12. }];
      13. #endif
      14. };
      Alles anzeigen


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

      PHP-Quellcode

      1. // -- First Person and Thrid Person
      2. #define JK_var_enableFirstPersonOnly // Aktiviert First Person Only Deaktivieren mit //
      3. JK_var_enableVehicle3rdPerson = true; // 3rd Person in Fahrzeugen erlaubt
      4. JK_var_enable3rdPersonInBase = 300; // Entferntung von der Basis bis 3D Person Deaktiviert wird bei 0 immer First Person
      5. if(!isDedicated && hasInterface) then
      6. {
      7. #ifdef JK_var_enableFirstPersonOnly
      8. JK_FPV_EVH = addMissionEventHandler ['Draw3D', {
      9. if (cameraView in ['INTERNAL','GUNNER']) exitWith {};
      10. if ((JK_var_enable3rdPersonInBase) > (player distance (getMarkerPos "respawn_west"))) exitWith {};
      11. if ((JK_var_enable3rdPersonInBase) > (player distance (getMarkerPos "respawn_east"))) exitWith {};
      12. if ((JK_var_enable3rdPersonInBase) > (player distance (getMarkerPos "respawn_guerrila"))) exitWith {};
      13. if (JK_var_enableVehicle3rdPerson && (vehicle player != player)) exitWith {};
      14. vehicle player switchCamera "INTERNAL";
      15. }];
      16. #endif
      17. };
      Alles anzeigen


      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
      SIGNATUR START
      Wer Rechtschreibfehler findet darf sie behalten
      ACE3 Core Developer
      CBA A3 Developer
      Developer of Dynasound, Enhance SoundScape, Immerse, Suppress and Align
      SIGNATUR ENDE
    • @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:

      Quellcode

      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:

      Quellcode

      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
    • X39 schrieb:

      ...
      armaworld.de/threads/372-First…=2307&viewfull=1#post2307
      addMissionEventHandler nutzen! NICHT onEachFrame! Das dingen ist "outdated" wie sch.
      ...

      ich will nur noch mal X39 wieder hohlen ;)
      und ja stimmt das habe ich vergessen
      SIGNATUR START
      Wer Rechtschreibfehler findet darf sie behalten
      ACE3 Core Developer
      CBA A3 Developer
      Developer of Dynasound, Enhance SoundScape, Immerse, Suppress and Align
      SIGNATUR ENDE
    • 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

      Quellcode

      1. if ((_this select 0) == 1) then
      2. {
      3. [
      4. {
      5. if (vehicle player == player && {cameraOn == player && {cameraView == 'External'}}) then {player switchCamera 'internal'};
      6. },
      7. 1,
      8. [] //
      9. ] call CBA_fnc_addPerFrameHandler;
      10. };
      11. if ((_this select 0) == 2) then
      12. {
      13. [
      14. {
      15. if (cameraView == 'External') then {player switchCamera 'internal'};
      16. },
      17. 1,
      18. [] //
      19. ] call CBA_fnc_addPerFrameHandler;
      20. };
      Alles anzeigen
    • @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.


      jokoho482 schrieb:

      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:

      jokoho482 schrieb:

      ... 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?