First Person Script

  • [...] 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. [...]


    Du hast es dir bereits selbst beantwortet:

    [...] 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. [...]


    Die möglichkeit existiert noch immer
    die funktionen machen nämlich nichts anderes als sich gegenseitig zu überschreiben und das macht das dingen generell gefährtlich (zudem ist die nutzung von onFooBar befehlen der nutzung von EventHandlern weit nach hinten zu stellen! EventHandler sind schlicht die bessere möglichkeit gerade weil ArmA hier die bessere kontrolle hat und im grunde so performance auch einsparen könnte (zumindest in der theorie))


    zudem sind die onFooBar EHs schlicht weg relikte aus alter zeit sind die nur wegen der abwertskompatibilität noch nicht rausgeflogen sind und schon längst durch ordentliche native event handler (und nicht die eigenwillige scripted solution die man mit AddStackedEventHandler erreicht (die zudem auch noch einen zu großen SQF overhead hat)) ersetzt worden


    [...] In einem vorherigen Post, schriebst Du noch: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. [...]


    sowas steht meist im wiki sodass man es nicht mehr selbst testen muss


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


    korrekt
    die preferierte methode sollte jedoch natives SQF sein und nicht eine SQF funktion die verhalten auf teufel komm raus erzwingt (wie es addStackedEventHandler macht)


    greets
    X39

  • man kann es überlisten wenn man schneller als 1 frame ist d.h. 0.033 sekunden bei 30 FPS, 0.016 sekunden bei 60 FPS und da muss man dann noch der "Input Lag" und Render Transfair lag berechenen damit währe es dann ca nochmal geschätzt 0.005 sekunden schneller(da ist nen reider schätzwert und von Hardware zu Hardware unterschiedlich). Das heißst also man müsste schneller reagieren können als man es könnte. Dazu ist sobald man wieder im spiel ist das Draw3D wieder Altiv und man wird wieder in First Person gesetzt. Damit ist der einzigste Punkt wie man es überlisten kann wenn man Cheat Tools benutzt oder Übermenschliche Reaktionen haben. Und dann bringt es nicht mal viel da man so oder so wieder in die First Person gezwungen wird


  • In einem vorherigen Post, schriebst Du noch: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.


    Hier mal die Referenz zum Bi Wiki ;)
    https://community.bistudio.com…_3:_Event_Handlers#Draw3D

  • @jokoho482
    Ich kenne die dazugehörigen Artikel aus der BIS WIKI, ich verlinke ja selber in meinen Beiträgen immer gerne wieder darauf.
    Es war nur so, dass dein Satz so klang als hättest du es selbst ausprobiert, das Ganze also etwas unmissverständlicher hätte formuliert sein können.


    Ich sehe es gleich wie du:
    Dass der Draw3D EH beim heraustabben nicht weiterläuft sollte kein Problem darstellen, denn sobald man wieder das Spiel maximiert und etwas sieht, tritt der EH ja umgehend wieder in Kraft und führt das Script weiter aus.
    Für den Spieler dürfe dadurch kein Vorteil entstehen, da das umschalten zwischen den Perspektiven während dem reintabben sehr wahrscheinlich unbemerkt geschehen würde (dazu kommt noch der fadeout/in effekt beim Perspektivenwechsel).
    btw. Der "Editieren" Button beisst nicht ;)



    @X39
    Danke für die ausführliche Erklärung.
    Das die onSchiessmichtot EH per addStackedEH lediglich gescriptet sind und dadurch einen overhead verursachen wusste ich nicht.
    Ich dachte diese wären in A3 mittlerweile nativ in die Engine integriert (denken/glauben != wissen), aber da hat BIS scheinbar nur Halbe Arbeit geleistet.


    Dass sich die EH mittels addStackedEH immer noch gegenseitig überschreiben, konnte ich bisher jedoch nicht reproduzieren, ausser wenn man mutwillig die gleiche ID verwendet.
    Um dies zu verhindern kann man zwar die vorhandenen stackedEH vorher per Script abfragen und entsprechend eine andere ID verwenden, die Frage ist nur ob dies auch jeder Scripter/Missionsbauer dann auch so macht...
    Zudem reicht es schon, wenn jemand in seinem Script einfach onEachFrame ohne addStackedEH verwendet und alle davor (mit addStackedEH) hinzugefügten EH gehen flöten, die Sache bleibt also weiterhin sehr riskant in der Benutzung.


    Die performanteste Lösung wäre ja ein "KeyDown" (+JoystickButton+MouseButtonDown) displayEH, mit einer Abfrage der actionKeys, aber das ist leider nicht Narrensicher und wäre zudem auch leicht zu umgehen.


    Also wenn es unbedingt eine "sofort reagierende" Funktion (da ja keine agierende Funktion vorhanden ist) sein muss, dann addMissionEventHandler + "Draw3D" verwenden, ausser natürlich auf Dedicated Servern/Clients (Stichwort: Headless Client), welche kein Display haben.


    Danke für die Infos soweit
    Grees KiloSwiss

  • Ich will eure Diskussion nicht unterbrechen aber welche Lösung habt ihr denn nun für einen Leihen, ich habe ein klein wenig den Überblick verloren was nun die "sinnvollste" Lösung ist.


    Danke und weitermachen ;)

    Passwords are like underwear. You should change them often (okay, maybe not every day). Don’t share them. Don’t leave them out for others to see (no sticky notes!). Oh, and they should be sexy. Wait, sorry, I mean they should be mysterious. In other words, make your password a total mystery to others.
    :thumbsup:

  • [...] Dass sich die EH mittels addStackedEH immer noch gegenseitig überschreiben, konnte ich bisher jedoch nicht reproduzieren, ausser wenn man mutwillig die gleiche ID verwendet.
    Um dies zu verhindern kann man zwar die vorhandenen stackedEH vorher per Script abfragen und entsprechend eine andere ID verwenden, die Frage ist nur ob dies auch jeder Scripter/Missionsbauer dann auch so macht...
    Zudem reicht es schon, wenn jemand in seinem Script einfach onEachFrame ohne addStackedEH verwendet und alle davor (mit addStackedEH) hinzugefügten EH gehen flöten, die Sache bleibt also weiterhin sehr riskant in der Benutzung. [...]


    dürfte sogar noch lustiger werden wenn die CBA variante statt der BI variante genutzt wird da die sich gegenseitig überschreiben dürften (insofern CBA hier nicht dafür sorge getragen hat das sie zu der BIS variante kompatibel sind wovon ich nicht ausgehe)


    [...] Die performanteste Lösung wäre ja ein "KeyDown" (+JoystickButton+MouseButtonDown) displayEH, mit einer Abfrage der actionKeys, aber das ist leider nicht Narrensicher und wäre zudem auch leicht zu umgehen. [...]


    es ist narrensicher (das ist ja das witzige daran) jedoch aufgrund von actionKeys nicht möglich da actionKeys kaputt ist seit ArmA 3 begann (STRL/ALT/SHIFT + AnyKey = garbage)


    Ich will eure Diskussion nicht unterbrechen aber welche Lösung habt ihr denn nun für einen Leihen, ich habe ein klein wenig den Überblick verloren was nun die "sinnvollste" Lösung ist.


    Danke und weitermachen ;)


    http://armaworld.de/threads/37…=2307&viewfull=1#post2307
    bzw.
    http://armaworld.de/threads/37…=2876&viewfull=1#post2876

  • @Kilo
    Wegen CBA: Fast in jeder Mission läuft CBA mit. Und wenn ich ein Addon mit rennen lasse, wieso soll ich diese Funktion dann nicht nutzen?


    Da hast du leider unrecht z.b. bei der GeCo läuft kein CBA mit und wenn man auf den meisten Public Servern schaut dort auch nicht wenn man so oder so in first Person bleiben möchte dann kann man auch einfach nen höheren schierigkeits modus einstell BZW es in den Einstellungen des server so setzten das man halt einfach nicht in die 3rd Person kommt. daher denke ich das man dieses Script ohne CBA oder sonstige Mods Lauf fähig sein sollte.


    aber das ist leider nicht Narrensicher und wäre zudem auch leicht zu umgehen.


    Action Key EventHandler haben mehr fehler als man denkt z.b. wenn man die Taste mit doppel druck belegt hat dann springt er garnicht mehr an.

  • Hoffe man kann mir hier weiter helfen also ich versuche diesen code so umzubauen das er mit addMissionEventHandler läuft aber irgendwie will das nicht so ganz.
    Was man noch dazusagen sollte ich bin nicht wirklich bewandert in sqf oder dergleichen ist also mehr ein try & error bei mir.


    was bei rausgekommen ist aber erstens nicht funktioniert und zweitens wohl aus der falsche ansatz war:


  • Bei 1.) fehlt in der while-Schleife ein sleep. Die globale Variable thirdperson_allowed hat keinen OFPEC tag. remoteControl scheint mir hier der falsche Befehl zu sein. Eine Schleife für jedes Fahrzeug ist außerdem völlig übertrieben.
    Bei 2.) zähle ich 4 sich-öffnende geschweifte Klammern und 5 sich-schließende geschweifte Klammern. So kann das nicht funktionieren. Außerdem ist die lokale _vehi-Variable im Code-Block des Eventhandlers nicht definiert. Ein Dedicated-Server hat schon per Definition kein Interface. Der Ausdruck "isDedicated && hasInterface" wird immer falsch zurückgeben und der then-Block wird damit nie ausgeführt.

  • Bei 1.) fehlt in der while-Schleife ein sleep. Die globale Variable thirdperson_allowed hat keinen OFPEC tag. remoteControl scheint mir hier der falsche Befehl zu sein. Eine Schleife für jedes Fahrzeug ist außerdem völlig übertrieben.

    Also das erste Script funktioniert aufjedenfall. Möchte ja auch nicht bei jeden Fahrzeug 3rdperson sondern nur bei ganz bestimmten.

  • Code
    1. if (isPlayer) then
    2. {
    3. private _my3rdperson = addMissionEventHandler
    4. ['Draw3D',
    5. {
    6. player switchCamera "EXTERNAL";
    7. }
    8. ];
    9. };

    Aufrufen würde ich es über addaction


    Code
    1. ID01 = this addAction ["EX", "externeansicht.sqf", true, 0, false, true, "", "driver _target == player"]; ID02 = this addAction ["IN", "interneansicht.sqf", true, 0, false, true, "", "driver _target == player"];

    Frage hat dies auch unnötig viele Schleifen zufolge?
    Meine Absicht ist es immer noch das nur max. 2-3 Spieler dies nutzen können.