Missions Bau mit "Eventhandlern"

  • Hey Liebe ArmAworld Comunity,


    da ich mich viele Jahre in der ArmA Comunity rumgetrieben habe und auch verschiedenste arten von Missions Bau gesehen haben und relativ oft sehr große Probleme darinne gesehen habe wollte ich hier mal kurz zeigen/erklären wie man es vielleicht machen kann ohne das man 1. die übersicht verliert und 2. Performance zu sparen.


    Wie bin ich überhaubt darauf gekommen das so zu machen.
    Also angefangen hat es als ich verstanden hatte was man mit Spawn und Waituntils im grundlegenden Storry missions bau alles beweltigen kann(das heißst man hat eine art Story board in dem von oben nach unten die gesamte geschichte seht und man damit etwas mehr übersicht hat darüber was wann wo Passiert). Jedoch ist mir schon nach einiger zeit aufgefallen das dieses ein sehr Unschönes und unperformantes Stück missions bau ist das einen sehr starken Script Lag erzeugt. Und ich habe viel ausprobiert und geschaut wie man das regeln kann und habe lange keine Idee gehabt, Doch zu irgendeiner Späten Nacht stunde in einem Teamspeak erinnerte ich mich daran das ein bekannter ArmA Spieler von mir meinte das man doch Missionen eigendlich mit Eventhandlern Viel Performanter zubauen sein muss. Jedoch als dieses damals mir vorgeschlagen wurde wusste ich noch nicht wie ich das umsetzten. Aber dafür ist mir vor einpaar wochen die Idee dazu gekommen.


    Ich habe 2 kleine Scripts dafür geschrieben 1x eins das ein Event hinzuführt und 1x ein Script ein Script das ein Event Triggert.




    addMissionEventHandler:


    triggerMissionEventhandler:


    wenn ihr eure mission Testen wollt dann fügt einfach ein JK_Debug = true; in die Init und dann bekommt ihr Dialog und hint ausgaben. um die zu deaktivieren löscht/Kommentiert dies dann aus


    Das Script ist sicherlich noch nicht fehler frei da ich es nur mal "geschreiben" habe und noch nicht testen konnte


    PastBin:http://pastebin.com/WN5rvR8P

  • Ich selbst würde für ein Storyboard wohl eher auf den missionConfigFile zurückgreifen. (Ist aber eher eine persönliche Präferenz)


    Um auf die Eventhandler zu sprechen zu kommen:
    Du hast Recht: man kann Missionen mit Eventhandlern deutlich performanter machen. Jedoch denke ich, dass da eher die "addEventHandler" funktionalität gemeint ist.
    Beispielsweise könnte man für Kill-Missionen einen "Killed"-Eventhandler auf das jeweilige Ziel packen. Der funktioniert dann sozusagen als Weiterschaltbedingung.
    Oder auch einen "FiredNear" - Eventhandler, wenn Beispielsweise ein Alarm losgehen soll, sobald Schüsse fallen.
    Informationen aus einem Behälter sammeln, oder auch von einer Leiche aufsammeln mit "Take"-Eventhandlern.
    Es gibt da sehr viele Möglichkeiten.
    Kurz noch ein Beispiel:

    Code
    1. [COLOR=#FF8040][COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#7A7A7A]"DORB_TASK_1"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#000000]true[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#7A7A7A]"Neutralisieren sie den feindlichen Offizier"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"Neutralisieren"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"Vermuteter Aufenthaltsort"[/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#8B3E2F][B]([/B][/COLOR][COLOR=#191970][B]getPosATL[/B][/COLOR] DORB_KILLTARGET[COLOR=#8B3E2F][B])[/B][/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"AUTOASSIGNED"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#FF0000]0[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#000000]true[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#000000]true[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]""[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#000000]true[/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR] [COLOR=#191970][B]spawn[/B][/COLOR] BIS_fnc_setTask[COLOR=#8B3E2F][B];[/B][/COLOR]
    2. DORB_KILLTARGET [COLOR=#191970][B]addEventHandler[/B][/COLOR] [COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#7A7A7A]"killed"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR] [COLOR=#8B3E2F][B]{ [/B][/COLOR][COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#7A7A7A]"DORB_TASK_1"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"SUCCEEDED"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#000000]true[/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR] [COLOR=#191970][B]spawn[/B][/COLOR] BIS_fnc_taskSetState[COLOR=#8B3E2F][B]; [/B][/COLOR][COLOR=#8B3E2F][B]}[/B][/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR][COLOR=#8B3E2F][B];[/B][/COLOR][/COLOR]

    Made with KK's SQF to BBCode Converter






    Eine ähnliche Funktionalität zu deiner Funktion, jedoch nur Lokal, liefern übrigens auch die BIS ScriptedEventHandler.

    Code
    1. [COLOR=#FF8040][COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#191970][B]missionNamespace[/B][/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"DORB_TESTHANDLER"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"hint format['Ich teste einen BIS-Handler und er gibt mir *%1* aus.',_this select 0];"[/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR] [COLOR=#191970][B]call[/B][/COLOR] BIS_fnc_addScriptedEventHandler[COLOR=#8B3E2F][B];
    2. [/B][/COLOR]
    3. [COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#191970][B]missionNamespace[/B][/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#7A7A7A]"DORB_TESTHANDLER"[/COLOR][COLOR=#8B3E2F][B],[/B][/COLOR][COLOR=#8B3E2F][B][[/B][/COLOR][COLOR=#7A7A7A]"alles was ich will"[/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR][COLOR=#8B3E2F][B]][/B][/COLOR] [COLOR=#191970][B]call[/B][/COLOR] BIS_fnc_callScriptedEventHandler[COLOR=#8B3E2F][B];[/B][/COLOR][/COLOR]

    Made with KK's SQF to BBCode Converter



    Um einmal beispielhaft einen Anwendungsfall zu demonstrieren:

    Made with KK's SQF to BBCode Converter

  • erstmal danke den BIS_fnc_addScriptedEventHandler kannte ich noch nicht. Jedoch sind mir ein paar elementare probleme an diesem aufgefallen


    1. Kein Override schutz
    2. Bei trigger Event hast du kein Target


    Und es sind viele BI typischen sachen drinne die einfach unnötig sind für das system EH da ich ja nur Missions Seitige sachen damit verändern will. Dazu werden leute die auf deiner mission Spiele z.b. probleme bekommen wenn du sachen wie uiNamespace/ProfileNameSpace verwendest da sie damit nicht mehr bei UINameSpace ohne Neustart und bei profileNameSpace nicht mehr ohne Profil zurücksetzten/Variable aus dem pNS zu löschen auf server kommen