SQF Scripting lernen durch "Abschauen" - Mission "Defend Sarahni"

    • Tut- Complete

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

    • SQF Scripting lernen durch "Abschauen" - Mission "Defend Sarahni"

      Hallo zusammen,

      als ich damals meine ersten Schritte im ArmA3 Missions Skripting (SQF Programmierung) gewagt habe, hab ich mir - wie vermutlich jeder andere auch - bei youtube entsprechende Videos angesehen und schriftliche Tutorials durchforstet.

      Am meisten gelernt habe ich jedoch von anderen Missionsskriptern, indem ich mir deren Missionsdateien angesehen und diese analysiert habe. Das war oft mühsam, zumal 99% aller ArmA3 Missionen in unverständlichem Spaghetti Code geskriptet sind, getreu dem Motto "Hauptsache funktioniert". Selbst der Autor hat da oft Schwierigkeiten Monate später nachzuvollziehen, wie der Code en detail funktioniert.

      Da ich es den Nachfolgegenerationen einfacher machen möchte und ich mich über jeden neuen Skripter in der Szene freue, möchte ich hier eine vollständige Missionsdatei zur Verfügung stellen, welche
      • verständlich geskriptet,
      • intuitiv strukturiert und
      • mit umfangreichen Features ausgestattet ist.
      Die Mission beinhaltet vielleicht nicht alles aber doch sehr vieles, was man sich als Skripter so wünscht:
      • Dynamische, wiederkehrende Feindspawns in Angriffs- und Verteidigungsmissionen
      • Aufmunitionieren von CSW via ACE Menü
      • Bau umfangreicher Verteidigungsstellungen via ACE Menü
      • Überfliegende Jets die via Rauchemission die Deutschlandflagge in den Himmel zeichnen
      • Aufräumskripts für entfernte, umbemannte oder dauerhaft schwimmende Feindeinheiten
      • Skripts zum Umdrehen geflippter Fahrzeuge
      • Zeitliche Synchronisierung von Server und Client
      • Client-Server-Kommunikation
      • Grafisches Infomeldungssystem
      • Dynamische Fallschirmspringer
      • Feindinfantrie-absetzende Helikopter/Straßenfahrzeuge
      • Patroullierende Fahrzeuge mit gelegentlich aussteigenden Haus-durchsuchenden Infanteristen
      • Auf TFAR Gespräche oder gefallene Schüsse aggressiv reagierende Feinde
      • JIP-fähige Kartenmarkierungen
      • Gruppenteleport
      • Fahrzeug- und Kistenspawn mit Standardloadouts
      • Regenerierbare Fuhrparks
      • Intro-Kamera-Fahrt und Intro-Video
      • Fortschrittsanzeigen
      • Soundmanagement
      • Recycling von Missionskisten zur Missionserfüllung
      • Spawnpunkt-Auswahl-Dialog
      • Dynamischer Gruppenbeitritt auch ohne Sichtkontakt zu anderen Gruppenmitgliedern
      • Briefingeinträge und abschließende Debriefing
      • Erhöhter Benzinverbrauch von Fahrzeugen um Logistik einen Sinn zu geben
      • Verzögerung bis zur vollständigen Erschöpfung nach Sprinten/schnellem Laufen
      • Automatische Erkennung des San-Status und der Marschrichtung aller aktiven Gruppen im Feld
      • Dynamische umfangreiche Roadblocks
      • Zeitgesteuerte Marker-basierte HE- und Rauchmörserskripte
      • Alarm bei bewegter Missionskiste mit sofortigem feindlichen Gegenangriff
      • Bomberangriffe
      • Durch lautes TFAR reden/schreien vertreibbare Zivilisten
      • Umfangreiche Debug Skripte zum Anzeigen von Feindpositionen und Feindbewegungen auf Minimap
      • Streaming Slot auf Basis von Zeus ohne Bearbeitungsrechte aber freier Sicht/Bewegung
      • Gebäude- und Bunkerbesetzung durch Feinde
      • Herumlaufende bzw. herumfahrende (ab und zu parkende) Zivilisten
      • Dynamische Landungsboote mit Austieg und Weitermarsch zu Fuß
      • Kreisförmige und wegpunkt-gestützte Feindpatroullien
      • Scharfschützenspawn
      • Zufällige Zusammensetzung feindlicher Infantriegruppen/Fahrzeugbesatzungen
      • Spawn bemannter statischer Waffen
      • Überfliegende (nicht angreifende) Feindhelis zur Steigerung der Immersion beim Anmarsch auf Missionsziel
      • Automatische Generierung neuer Patroullienwegpunkte, wenn Feind KI zu lange still steht/blockiert wurde
      • Operationszentrale mit mehreren konfigurierbaren Monitoren zur Übertragung der Helmkameras im Feld befindlicher Soldaten zzgl. Sat-Sicht, Nacht-Sat-Sicht und Thermal-Sat-Sicht
      • Öffne (konfigurierbare) Türen/Schranken bei Missionsstart
      Viel Spaß beim "Abschauen" und selber skripten: ludwig-software.de/arma3editin…DefendSahrani6_0.Sara.zip


      Beste Grüße,
      Schmitt

      PS: Hiermit erteile ich die Erlaubnis die Skripte zu kopieren und ganz oder teilweise für eigene Missionen zu nutzen.

      PPS: Während die aktuelle Mission in Summe zwei Teilmissionen - einen Angriff auf die Stadt 'Paraiso' sowie eine Verteidigung der Stadt 'Pita' beinhaltet (wobei man die Mission ohne großen Aufwand auf jede andere ArmA3 Map anpassen kann) - bin ich gerade dabei die Missionsdatei durch Skripten einen Insurgency-Modus auch für Public Server als Endlosmission nutzbar zu machen. Das Ergebnis werde ich dann wieder hier mit euch teilen.


      Bei Interesse am BW Mod/ArmA3/ACE3 empfehle ich die Events des Jägerzug Achilles I
    • fn_aktualisiereServerTaktgeber.sqf
      Private ["_temp"];
      Erstens sollte man das private keyword dem private ARRAY command vorziehen. zweitens verwendest du diese _temp variable nirgendwo. Drittens warum Private groß geschrieben?
      fn_aktualisiereClientTaktgeber.sqf
      Willst du das sich der Takt in einer Sekunde um 10 erhöht? Dieser Code den du da hast gibt garkeine Garantie über das Timing. der Takt könnte in einer Sekunde zwischen 0 und 10 mal erhöht werden.
      fn_arrayIndex.sqf
      Wieder private ARRAY genutzt obwohl das private keyword hier sehr einfach zu nutzen wäre.
      BIS_fnc_Param is deprecated. Wir haben jetzt das params command in der Engine.
      typeName _array != "ARRAY" ist auch doof. isEqualType ist viel schneller.

      clientServerKommunikation. Was soll das denn bitte sein? PVEH? :D Wir haben remoteExec nicht ohne Grund bekommen.

      Ich habe jetzt in 6 von 6 Dateien die ich angesehen habe Probleme gefunden. Ich würde gerne alles auflisten aber dafür habe ich gerade keine Zeit.
      Ich würde dir empfehlen packe das ganze auf Github. Und lass die Community deine Probleme beheben.
      Dieser Code sieht aus als wäre er über ein Jahr alt. Es hat sich seitdem einiges in der Engine verändert.

      Deine Idee finde ich super. Aber Material für Lernzwecke sollte so Perfekt wie möglich umgesetzt sein. Und wenn man bedenkt das dies für Lernzwecke sein soll. Wo sind dann die Kommentare? In deinen Funktionsheadern fehlen Beschreibung und Parameter. Und allgemein habe ich bisher wenig Kommentare gesehen die erklären was ein bestimmter Code abschnitt tut und warum er so geschrieben wurde wie er ist.

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von dedmen ()

    • also ich habe schon gleich das problem das vieles auf Deutsch ist... man sollte eigendlich nicht irgendwas in deutsch scripten.
      dazu sind aufrufe wie
      _handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
      waitUntil {scriptDone _handle};

      einfach sinnlos dann nutz man einfach call.

      dazu sind 90% der KRON_Strings functionen schon von vanilla commands oder functionen verfügbar.

      dazu nutzt du ace d.h. auch CBA da braucht man sachen wie ein eigens event system nicht.

      und dann noch DETUSCHE Function/Variablen namen da bekomme ich echt nen rappler

      was ich auch nicht ganz checke is warum du so viele threads öffnest. da sollte man einiges mit CBA machen das sollte es alles etwas besser laufen


      SQF Scripting lernen durch "Abschauen leider kann man sich auch das falsche abschauen. und das ist die Gefahr bei solchen Sachen
      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
    • Die Idee dazu finde ich nicht schlecht, ganz im Gegenteil. Vielleicht könnten dedmen und/oder jokoho482 auch sowas umfangreiches in einer Mission anbieten.

      Mein kleiner Kritikpunkt an der Mission wäre lediglich, das keine Mods genutzt werden für solche Beispiele. Ich zb. habe ca 50% nicht, daher ist die Mission für mich nicht anschaubar.

      Ich kann es nur noch mal betonen, die Idee finde ich top :thumbsup: .
      Vielleicht gibt es ja noch ein Remake auf Vanillabasis oder jemand anders springt in die Bresche :)
    • Jetzt muss ich doch mal wieder etwas schreiben, obwohl ich mir gesagt habe, dass ich grundsätzlich auf solch ein Verhalten nicht mehr reagieren wollte.

      Es bietet ein Mitglied der Community hier für Neueinsteiger und die, die Anschauungsmaterial benötigen und lernen wollen, eine unglaublich umfangreiche Mission an (und ich gehe davon aus, dass vieles Marke Eigenbau ist). Das alleine geht weit über das hinaus, was viele hier an "Hilfe" anbieten oder anderen zukommen lassen. Und nicht nur das, er stellt seine Arbeit auch zur Verfügung. Und zwar vollständig, zur eigenen Weiterverwendung und Modifikation.

      Wo steht in seinem Post, dass seine Skripe besonders "lesenswert" und "lehrreich" sind, wo behauptet er, dass sein Code top aktuell und völlig fehlerfrei ist? Zufällige kenne ich Schmitt und seine Arbeit auch aus eigener Erfahrung und kann daher garantieren, dass die Mission einwandfrei funktioniert.

      Über was wird hier nun hergezogen? Ohne dass danach gefragt wurde und ohne, dass die folgenden Punkte irgendeine Relevanz hätten:
      • "private keyword dem private ARRAY command vorziehen" Was ein Blödsinn, als wenn das hier irgendwas zu suchen hätte, völlige Geschmackssache
      • "BIS_fnc_Param is deprecated. Wir haben jetzt das params command in der Engine", stimmt, schande auf sein Haupt, wie kann er nicht absolut aktuellen Code verwenden! Ich aktualisiere auch immer ALL meine Projekte und schaue, dass ich stets die neuesten Befehle verwende, ganz nach dem Motto "change a running system as often as possible"
      • "typeName _array != "ARRAY" ist auch doof. isEqualType ist viel schneller." Nein! Wirklich! Das ist ja....da ist doch gleich das ganze Thema des Threads verfehlt. Also wenn Schmitt das nicht weiß...moment vielleicht weiß er es sogar! Er verwendet ein "!=" oh Gott. Ernsthaft? Lächerlich
      • "Dieser Code sieht aus als wäre er über ein Jahr alt. Es hat sich seitdem einiges in der Engine verändert." Tatsächlich....wie ich schon sagte, wir haben alle nichts besseres zu tun, als unseren Code permanent gegenzuprüfen.
      • Und das Fazit: "Ich würde dir empfehlen packe das ganze auf Github. Und lass die Community deine Probleme beheben." Ich stimme generell mit dem Vorschlag, Github zu nutzen überein, wenn es ein Communityprojekt wäre. Ist es aber nicht, aber immerhin der einzige akzeptable Vorschlag im gesamten Beitrag. Aber sorry "deine Probleme beheben", wusste nicht, dass er welche hat. Du Schmitt? Siehst du mal, jetzt hast du schon offiziell Probleme, nett oder?
      • "vieles auf Deutsch ist." Echt, in einem deutschen Forum als Lehrmaterial für die deutsche Community, ein Unding! Da hat man gleich wieder was, wo man sich drauf stürzen kann. Nur nebenbei auch wieder völlig Geschmackssache, für den hier gedachten Zweck sicherlich sinnvoller als Englisch und ja, ich behaupte, wer SQF lernen will und so intelligent ist, dass auch bis zu einem gewissen Grad zu schaffen, wird die Transferleistung bewerkstelligen können, später, sofern er es wünscht, auf Englisch seinen Code zu schreiben. Will er das aber nicht - Blasphemie! - dann ist mir das genauso recht.
      • "_handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
        waitUntil {scriptDone _handle};

        einfach sinnlos dann nutz man einfach call." Nett, aber falsch. Es ist nicht sinnlos, aber in der Tat wäre ein call hier genauso zielführend. Es ist aber doch ein Unterschied, ob etwas "sinnlos" ist oder eben nicht soo perfekt wie man es gerne selber hätte.
      An dieser Stelle höre ich auf, da ich eh so gut wie jeden einzelnen Satz zerrissen habe.

      Ich möchte klar hervorheben, dass ich meinen Vorrednern zugute halte, dass ihre Absichten sicherlich nur die besten waren (na klar) und sie nur helfen wollten (na klar). Und es ist in einer Community natürlich von Vorteil, wenn man die Arbeiten der anderen gegenprüft und gemeinsam so für alle bessere Qualität zur Verfügung stellt. Aber muss das so öffentlich geschehen? Sind die genannten Punkte tatsächlich zielführend bzw. kritikwürdig für das, was der Threadersteller erreichen möchte? UND vor allem, lassen sie erkennen, dass man die Arbeit des Kollegen wertschätzt und gutheißt? Für mich leider nicht und deswegen sah ich mich genötigt, diesen Post zu schreiben. Sicherlich kann man immer optimieren und keiner von euch Herren wird bei mehreren hundert Zeilen Code alles perfekt machen so dass nicht ein anderer von euch Aasgeiern über ihn herfallen wird, aber es macht so viel mehr Spaß, sich bei anderen auszutoben!

      Es ist diese Grundhaltung, die mich stört..."Laden wir uns die Mission mal runter und schauen wir, was er da überhaupt anbietet. Oh, Fehler, Fehler...FEHLER! Jetzt habe ich doch schon 3 Fehler gefunden, unfassbar. Wie kann der sich erdreisten, sowas anzubieten, das hätte ihm doch auffallen müssen, also für mich geht das gar nicht, da wollen wir mal loslegen". Seufz...wenn wir alle nur so viel Zeit über hätten. Ich begrüße die Eigeninitiative, die dahintersteckt, den Code begutachten und bewerten zu wollen. Frage ist nur, ob es auf dem hier geschehenen Level überhaupt gefragt war.

      Ich finde es sehr schön, dass du, Schmitt, ein solches Angebot von Dir aus gestartet hast und dass du so umfangreiches Anschauungsmaterial bereitstellst. Damit hilfst du all jenen, die über die Standard 0815 Missionsideen hinauskommen wollen und nach Umsetzungsmöglichkeiten Ausschau halten. Viel mehr kann dein Angebot auch nicht beinhalten. Niemand kann erwarten, dass es der heilige Gral von SQF ist und niemand wird ernsthaft die Skripte auf Qualitätsstandards prüfen, da es weder das Ziel des Projektes ist, noch eine Community dahinter steht, sondern ein einzelner Mann. Wenn ich guten Code anschauen möchte, kann ich mir die Github-Repositories von ACE oder CBA anschauen, obwohl die Dokumentation von ACE in vielen Dingen genauso fragwürdig, fehlerhaft und schlichtweg nichtexistent ist wie hier kritisiert. In diesem Sinne begrüße ich dein Angebot, da es eine m.M.n. eklatante Lücke schließt, nämlich umfangreiches Anschauungsmaterial, dass auch als solches ausgewiesen ist (Missionen "klauen" können wir alle).

      In diesem Sinne würde ich es abschließend begrüßen, wenn man gewisse Beiträge nicht stets von der gleichen hohen Warte aus begutachtete und kritisierte. Wenn jemand um Qualitätsverbesserung, Hinweise zur Codequalität oder um konkrete Stellungsname zu Performance oder Ressourcenbedarf bittet, dann ist er hier mit Sicherheit an der richtigen Stelle und es gibt jede Menge kompetente und erfahrene Mitglieder, die ihm hier sehr professionelle Hilfe bieten können. Dieselben Mitglieder sind aber leider allzuoft nicht in der Lage, zwischen verschiedenen Anfrageformen zu unterscheiden und neigen dazu, alles nur durch eine einzige Brille wahrzunehmen. Das finde ich schade und auch manchmal schlicht communityschädlich, wenn Personen verprellt werden. Wir haben alle unterschiedliche Ansichten, Ausbildungshintergründe, schlichtweg unterschiedliche Kenntnissstände und nicht zuletzt auch unterschiedliche Geschmäcker, was bestimmte Standards angeht. Sofern jemand nicht eure eigenen Standards angreift - man verzeihe mir erneut die Blasphemie - wäre es eventuell gewinnbringender, anderen auch ihre Ansichten, Standards und Vorlieben zu lassen, anstatt ihnen die eigenen intoleranterweise aufzuzwingen.

      PS: Echte Fehler sollte man natürlich in guter Absicht immer berichten dürfen, und so sind einige der oben genannten Punkte sicherlich berechtigt aufgeführt, ich denke, es ist klar, welche andere Art der Stellungnahme ich hier kritisieren wollte. Danke
      PSS: Es ist auch kein persönlicher Angriff gegen dedmen oder jokoho, die ich beide sehr schätze, sondern ein Hinweis in eigener Sache, dass ich ihre Beiträge hier für kontraproduktiv halte

      @Greni Guter Punkt, das sehe ich ähnlich, als Anschauungsmaterial wäre es ideal, eine Mission zu haben, die nur auf CBA und ACE3 basiert, hier wäre also die Community gefragt. Ich denke, die Mission ist so real im Jägerzug Achilles im Einsatz, daher auch die Modabhängigkeiten. Aber ein guter Punkt
      Autor des SQF-Scriptquide
      Missionsbauer der OPT

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von James ()

    • Besten Dank für das Feedback. Besonderen Dank an James für die Interpretation der Lage, die sich mit meiner deckt.

      Ich freue mich nun auf weitere vollständige Missionen anderer Community Mitglieder. Durch die entstehende Sammlung wird man Geschmacksunterschiede der Skripter erkennen und der ein oder andere Skripter wird auch schon die aller neusten Coding Standards inkl. vollständigem Wissen bzgl. CBA vorweisen können. Trotzdem soll sich davon bitte niemand abschrecken lassen: Wenn ihr eine Mission geskriptet habt, welche sich als Anschauungsmaterial für Skript-Neulinge eignet (also keinen wirren Spaghetti Code sondern strukturierte Skripte) dann stellt dieses Material bitte gerne hier zur Verfügung.

      Gerne möchte ich noch die Gelegenheit nutzen, um Neulingen zu erklären, dass die Kritik/Geschmacksunterschiede meiner Coding-erfahrenen Forum-Kollegen auf sehr hohem Niveau liegen. Ein Niveau, dass die meisten angehenden Missionsskripter niemals erreichen werden und auch nicht zwingend müssen. Ich weiß nicht, wieviel tausend Zeilen meine Mission mittlerweile enthält. Dort gibt es immer mal Themen, die man anders lösen kann. Solche Profi-Themen klären wir gerne in separaten Threads/auf einem Teamspeak/beim kommenden ArmA Treffen o.ä. aber damit müssen wir keine Skript-Neulinge behelligen. Ich bin gerne bereit mich weiterzubilden und von euch (Profis) zu lernen. Aber wenn ihr (Neulinge) euch praktikable Ziele setzt, dahingehend eine fehlerfreie, performante, leicht wartbare, verständlich strukturierte Mission zu erstellen, dann findet ihr genau das in der vorliegenden Mission wieder. So einfach ist das.

      Die Mission fand am 27.05.17 zusammen mit drei Partnerclans sowie Gastspielern statt (60 Mann in Summe) und lief trotz des Feature-Reichtums einwandfrei und hoch performant. Die Mission ist nicht über Nacht sondern über einen Zeitraum von mehreren Jahren entstanden und bildete in vorherigen Versionen bereits das Fundament für frühere große Missionen wie z. B. eine TvT70 am 16.05.2016. Außerdem basiert der Code auf jenem meiner Life Mod 'Schmitty's Life'.

      Danke noch für die Hinweise, dass die Mod-Abhängigkeit stört beim Analysieren/Testen dieser Missionsvorlage. Die derzeitige Weiterentwicklung der Mission wird Vanilla kompatibel sein.


      Bei Interesse am BW Mod/ArmA3/ACE3 empfehle ich die Events des Jägerzug Achilles I
    • Ich möchte mich auch bei @[JgZg-A] Schmitt bedanken! Danke für deine Mühe! Ich werde es mir direkt mal ansehen. Ich selbst kann dir zwar noch kein Feedback gegeben doch sage dir jetzt schonmal danke. Da es helfen wird. Ganz großes Danke für deine Mühe!

      Edit: Ich finde gut das du es in einem Deutschsprachigen Forum auf Deutsch machst. Für Hobby Missionsbauer echt eine Erleichterung. Finde ich sehr stark! :)

      LG
      Martin
    • [JgZg-A] Schmitt schrieb:

      Danke noch für die Hinweise, dass die Mod-Abhängigkeit stört beim Analysieren/Testen dieser Missionsvorlage. Die derzeitige Weiterentwicklung der Mission wird Vanilla kompatibel sein.
      Vielen Dank für Deine Mühen...das wäre auch meine einzige Anregung gewesen! Vielen Dank das Du dir das annimmst und es weiterentwickelst. Werde mir es dann nochmal in Ruhe anschauen, denn auch bei mir fehlen die Hälfte der Mods, und ich möchte diese nicht erst downloaden. Tolle Arbeit...weiter so!
    • Danke [JgZg-A] Schmitt.

      [JgZg-A] Schmitt schrieb:

      Ich freue mich nun auf weitere vollständige Missionen anderer Community Mitglieder.
      Generell finde ich eine veröffentliche Mission als "auseinandernehmbar", so haben wir doch alle das Arma-Skripten gelernt.
      Ich finde es gut, daß Kommentare und Variablennamen auch mal in deutsch geschrieben sind, ist schließlich meine Muttersprache.
      Wird in unserer Gruppe auch so gehandhabt.

      Einziger Kritikpunkt von mir ist die Verwendung von Mods. Sollte erstmal mit Vanilla anfangen.

      Meine Mission "(Co20)Das Tanoa Kartell" kann meinetwegen auch von den anderen heruntergemacht werden...
    • [3.JgKp]James schrieb:

      "private keyword dem private ARRAY command vorziehen" Was ein Blödsinn, als wenn das hier irgendwas zu suchen hätte, völlige Geschmackssache
      nein leider nicht private als keyword ist schneller als private ARRAY oder private STRING

      [3.JgKp]James schrieb:

      stimmt, schande auf sein Haupt, wie kann er nicht absolut aktuellen Code verwenden! Ich aktualisiere auch immer ALL meine Projekte und schaue, dass ich stets die neuesten Befehle verwende, ganz nach dem Motto "change a running system as often as possible"
      das ist das problem warum so viele sachen leider immer und immer beschissener laufen. wenn man nicht mal seine system updated kommen halt öfter fehler rein aus die die man vermeidet. Und wenn man so ein code "veröffentlich" und als [size=10]lernen durch "Abschauen"[/size] möchte sollte man doch noch mal rüber gehen und mal updaten und uptodate bringen.

      [3.JgKp]James schrieb:

      "typeName _array != "ARRAY" ist auch doof. isEqualType ist viel schneller." Nein! Wirklich! Das ist ja....da ist doch gleich das ganze Thema des Threads verfehlt. Also wenn Schmitt das nicht weiß...moment vielleicht weiß er es sogar! Er verwendet ein "!=" oh Gott. Ernsthaft? Lächerlich
      warum ist das lächerlich es ist ein correcter punkt. _array isEqualType [] ist weit aus schneller als typeName und != string.

      [3.JgKp]James schrieb:

      "_handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
      waitUntil {scriptDone _handle};

      einfach sinnlos dann nutz man einfach call." Nett, aber falsch. Es ist nicht sinnlos, aber in der Tat wäre ein call hier genauso zielführend. Es ist aber doch ein Unterschied, ob etwas "sinnlos" ist oder eben nicht soo perfekt wie man es gerne selber hätte.
      der punkt hinter sinnlos ist hier in diesem fall ehr das es einfach keinen sinn macht hier keinen call zu nutzen weil der call Suppsendded ist und man damit kein handle speicher oder scriptDone pro frame abfragen muss.

      ich meinte das auch nicht als Negativer flame sondern als kritik um das zuverbessern.
      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:

      nein leider nicht private als keyword ist schneller als private ARRAY oder private STRING
      Ja und wo ist denn das Problem. Der Unterschied liegt doch wahrscheinlich wie bei den meisten deine Verbesserungsvorschläge bei Hundertstel Sekunden oder?
      Es ist zwar vllt sinnvoll darauf hinzuweisen, aber die Mission/Projekt richtet sich an ANFÄNGER die froh sind wenn sie es überhaupt zum laufen bekommen.
      Also: Es ist richtig aber am Thema vorbei.


      jokoho482 schrieb:

      warum ist das lächerlich es ist ein correcter punkt. _array isEqualType [] ist weit aus schneller als typeName und != string.
      siehe oben :)


      jokoho482 schrieb:

      der punkt hinter sinnlos ist hier in diesem fall ehr das es einfach keinen sinn macht hier keinen call zu nutzen weil der call Suppsendded ist und man damit kein handle speicher oder scriptDone pro frame abfragen muss.
      Aber es funktioniert! Wenn du das Script callst musst du dir im klaren sein ob du in scheduled oder unscheduled environment unterwegs bist.
      Mit Spawn kannst du dir sichersein das es scheduled ist und kannst tendenziell erstmal ALLE Befehle nutzen, was im unscheduled ja nicht geht.


      Ach ja danke @[JgZg-A] Schmitt ich hoffe das dir die Veröffentlichung der Idee nicht die Motivation geraubt hat.
      Freue mich schon auf die Version ohne Modabhängigkeiten, um mir das ganze auch ingame anschauen zu können :)
    • Ich finde es immer super, wenn Scripter ihre Funktionen zur freien Verfügung stellen. Persönlich habe ich auch nur durch "Abschauen" gelernt.

      Solange man nicht die Art und Weise der Scripte für bare Münze nimmt, kann man sich hier einiges Abschauen.
      Wenn man "guten" Arma 3 Code lesen will, schaut man sich die großen Projekte an, an welchen mehrere Duzend Programmierer arbeiten. (bspw. ACE, CBA, ArmaAtWar, etc.)
      Wenn der Anspruch nur funktionierender Code ist, ist dieses Projekt zur Anschauung vollkommen ausreichend.

      Ich könnte mir vorstellen, dass die Gemüter mit einem kleinen Hinweis, dass Teile des Codes inzwischen veraltet sind, beruhigt werden können.
      Die Intension von Dedmen und Joko hatte ich so verstanden, dass Sie Anfängern direkt die optimale Programmierweise beibringen wollen. (Ich denke aber, dass es ganz von selbst, mit wachsender Erfahrung, kommt.)
    • Fabi schrieb:

      Ach ja danke @[JgZg-A] Schmitt ich hoffe das dir die Veröffentlichung der Idee nicht die Motivation geraubt hat.
      Ganz und gar nicht. Das Forum lebt von Kritik. Und es muss auch erlaubt sein, mal ein bisschen überspitzt zu formulieren oder vermeintlich über das Ziel hinaus zu schießen. Mach ich selbst oft genug, als ob ich so etwas jemandem übel nehmen könnte.

      Berechtigte Kritik nehme ich auch gerne auf und setze sie in künftigen Skriptdateien um. So gefällt es mir durchaus, dass @jokoho482 hier Möglichkeiten zur Code Beschleunigung aufzeigt. Das ist m. E. z. B. dann relevant, wenn man verschachtelte Schleifen mit hunderten Wiederholungen durchführt, sodass sich Hunderstel Sekunden zu ganzen Sekunden addieren. Und genau dann rede ich auch gern über Möglichkeiten zu Code Beschleunigung.

      Während es aktuell in meinen Skripten beispielsweise heißt ...

      Quellcode: fn_spawneJetsMitDeutschlandFlaggeTeil3.sqf

      1. Private [
      2. "_ueberflugPos", "_angriffSpawnPos", "_grp", "_fahrzeugTypName", "_flugzeug",
      3. "_wpPositions", "_squadTyp", "_ueberflugEndePos", "_bombe", "_abwurfPos1",
      4. "_abwurfPos2", "_abwurfPos3", "_ueberflugEndeVerlaengerungPos", "_qualmEffekt", "_faktor", "_rauchFarbe"
      5. ];
      6. (...)





      ... müsste ich dies auf Basis von @'jokoho482''s Tipps (Umstellung auf Englisch mal außen vorgelassen) ändern zu ...

      Quellcode: fn_spawneJetsMitDeutschlandFlaggeTeil3.sqf (optimiert?)

      1. private "_ueberflugPos";
      2. private "_angriffSpawnPos";
      3. private "_grp";
      4. private "_fahrzeugTypName";
      5. private "_flugzeug";
      6. private "_wpPositions";
      7. private "_squadTyp";
      8. private "_ueberflugEndePos";
      9. private "_bombe";
      10. private "_abwurfPos1";
      11. private "_abwurfPos2";
      12. private "_abwurfPos3";
      13. private "_ueberflugEndeVerlaengerungPos";
      14. private "_qualmEffekt";
      15. private "_faktor";
      16. private "_rauchFarbe";
      17. (...)
      Alles anzeigen

      Wenn mich mal die Muse packt, dann lass ich ausgeben, wieviel Zeit das bei der Ausführung spart - wenn überhaupt.

      Bzgl. der Änderung von aktuell ...

      Quellcode: fn_mpPaketAusfuehren.sqf

      1. if (typeName _empfaenger == typeName "") then
      ... auf ...

      Quellcode: fn_mpPaketAusfuehren.sqf (optimiert?)

      1. if (_empfaenger isEqualType "") then
      ... bin ich leidenschaftslos. Hier gefällt mir @'jokoho482' Vorschlag sogar besser als meine bisherige Herangehensweise und wenns auch noch schneller ist, umso besser. Mach ich dann also künftig mit isEqualType.

      Den execVM Befehl hab ich in meiner gesamten Mission (in Summe ca. 190 Skriptdateien) genau ein einziges (!) Mal verwendet. Nämlich beim zitierten Fall:

      Quellcode

      1. _handle = [] execVM "thirdparty\KRON_Strings\KRON_Strings.sqf";
      2. // Stringmanipulation durch dieses externe Modul ermöglichen
      3. waitUntil {scriptDone _handle};

      Wobei dies nicht meinem Programmierstil sondern lediglich der Anweisung des Mod-Bauers des KRON_Strings Skriptpakets entspricht:

      Quellcode: KRON_Strings README.txt

      1. The library must be loaded once before it can be used.
      2. Either in your init.sqs, or in your specific script, put the following code:
      3. nul=[] execVM "KRON_Strings.sqf";
      Ich hab hier keine Not gesehen, von der Readme abzuweichen. Und sehe diese Not immer noch nicht.

      @dedmen hat oben noch meinen Taktgeber kritisiert. Der funktioniert jedoch tadelos. Ich hab ihn damals eingeführt um auf Altis Life Server Ampelschaltungen zu realisieren, die garantieren, dass alle Verkehrsteilnehmer zur gleichen Zeit diegleiche Farbe sehen. Alle 3 Sekunden gibt der Server den Clients den aktuellen Stand des Taktgebers durch. In der Zwischenzeit erhöht sich der Clienttaktgeber selbst im Zehntelsekundentakt bis zur nächsten Synchronisierung.

      Quellcode: fn_aktualisiereClientTaktgeber.sqf (clientseitig)

      1. client_taktgeber = 0.0;
      2. while {true} do
      3. {
      4. client_taktgeber = client_taktgeber + 0.1;
      5. sleep 0.1;
      6. };

      Quellcode: fn_aktualisiereServerTaktgeber.sqf (serverseitig)

      1. diag_log "Server-Taktgeber und Zeitsynchronisierung initialisieren ...";
      2. server_taktgeber = 0;
      3. [] spawn
      4. {
      5. while {true} do
      6. {
      7. server_taktgeber = server_taktgeber + 1;
      8. client_taktgeber = server_taktgeber; // damit auch der server die richtige client_taktgeber zeit hat
      9. sleep 1;
      10. if (server_taktgeber % 3 == 0) then
      11. {
      12. publicVariable "server_taktgeber";
      13. };
      14. };
      15. };
      Alles anzeigen

      Quellcode: fn_initialisiereClientEventHandler.sqf (clientseitig)

      1. "server_taktgeber" addPublicVariableEventHandler {
      2. client_taktgeber = _this select 1; // client_taktgeber wird auf den Wert von server_taktgeber gesetzt
      3. };
      Ein für mich durchaus interessantes Thema sind Lösungsansätze bzgl. meiner Client-Server-Kommunikationsskripte, also meiner beiden Dateien: fn_mpPaketAusfuehren.sqf und fn_mpPaketSenden.sqf. Diese Funktionen erlauben mir über all in meinen Skripten Konstrukte wie z. B. diese hier:

      Quellcode

      1. [["winningFanfare"], "schmitt_fnc_wiedergebenVonMusik", "AN_CLIENTS"] spawn schmitt_fnc_mpPaketSenden;
      2. [["hinweis", "Einsatz der Bundeswehr erfolgreich!"], "schmitt_fnc_meldungEinreihen", "AN_CLIENTS"] spawn schmitt_fnc_mpPaketSenden;
      3. [[_ueberflugPos], "schmitt_fnc_spawneJetsMitDeutschlandFlaggeTeil2", "AN_SERVER"] spawn schmitt_fnc_mpPaketSenden;
      Die Logik dahinter: "Bitte Parameterliste in Funktion seitens aller Clients oder seitens Server ausführen." Ich finds schön lesbar. Die offizielle Alternative scheint remoteExec zu sein mit der Funktionsweise:

      Quellcode

      1. [<params>] remoteExec ["someScriptCommand", -2]; // -2 steht hier für "alle clients, nicht server"
      Damit das funktioniert muss man jedoch scheinbar manuell alle remote ausführbaren Funktionen explizit whitelisten via CfgRemoteExec. Klingt für mich nicht sonderlich benutzerfreundlich. (wenn auch natürlich sicherer in puncto Hacking-Schutz). Ich bin hier noch nicht überzeugt von meiner Client-Server-Kommunikation abzuweichen, gebe aber zu, dass die remoteExec sehr vernünftig scheint. Die Funktion remoteExec gibt es seit ArmA3 Version 1.5 und somit seit August 26, 2015. Meine Client-Server-Kommunikationsskripte habe ich im Sommer 2014 programmiert.


      Was mich natürlich interessieren würde, ist ob jemand in meinen Skripten auch relevante Problemstellen findet, die man wirklich optimieren sollte, weil man die Skriptdateien sonst keinem zumuten kann. Der Wechsel auf remoteExec z. B. ist ein großer Knacker. Themen von diesem Kaliber würden mich interessieren. Wenn auch nicht an dieser Stelle. Hier würde ich nun viel lieber Missionsdateien anderer Programmierer aufgelistet sehen, als dass wir uns hier positiv oder negativ an Kleinigkeiten in meinen Dateien aufgeilen.


      Bei Interesse am BW Mod/ArmA3/ACE3 empfehle ich die Events des Jägerzug Achilles I
    • [JgZg-A] Schmitt schrieb:

      ... müsste ich dies auf Basis von @jokoho482's Tipps (Umstellung auf Englisch mal außen vorgelassen) ändern zu ...
      Das wäre nicht das, was joko gemeint hat.

      C-Quellcode: fn_spawneJetsMitDeutschlandFlaggeTeil3.sqf (ALT)

      1. Private [
      2. "_ueberflugPos", "_angriffSpawnPos", "_grp", "_fahrzeugTypName", "_flugzeug",
      3. "_wpPositions", "_squadTyp", "_ueberflugEndePos", "_bombe", "_abwurfPos1",
      4. "_abwurfPos2", "_abwurfPos3", "_ueberflugEndeVerlaengerungPos", "_qualmEffekt", "_faktor", "_rauchFarbe"
      5. ];
      6. [...]
      7. _ueberflugPos = [_this,0,[],[[]]] call BIS_fnc_param;
      8. _rauchFarbe = [_this,1,[],[[]]] call BIS_fnc_param;
      9. _angriffSpawnPos = [(_ueberflugPos select 0) - 1500, (_ueberflugPos select 1) + 0, (_ueberflugPos select 2) + 30]; // weit im Westen, Flug nach Osten
      10. _squadTyp = SQUADTYP_FLIEGERBOMBEANGRIFF;
      11. [...]
      Alles anzeigen
      Dort könnte man das privatisieren mittels folgendem lösen:

      C-Quellcode: fn_spawneJetsMitDeutschlandFlaggeTeil3.sqf (Neues Beispiel)

      1. [...]
      2. params [["_ueberflugPos",[],[[]]],["_rauchFarbe",[],[[]]]];
      3. private _angriffSpawnPos = [(_ueberflugPos select 0) - 1500, (_ueberflugPos select 1) + 0, (_ueberflugPos select 2) + 30]; // weit im Westen, Flug nach Osten
      4. private _squadTyp = SQUADTYP_FLIEGERBOMBEANGRIFF;
      5. [...]
    • Ich habe es vielleicht in meinem letzten Kommentar nicht deutlich genug rüber gebracht. Jeder Scripter macht Fehler. Und nicht jeder kann alles wissen.
      Und jetzt Stundenlang jeden einzelnen Fehler in deinen Scripts mit dir durch zu gehen wäre purer Irrsinn und Zeitverschwendung.
      Niemand von den "Profis" könnte es perfekt machen.

      Deswegen ja Open-source auf Github. Dort kann die gesamte Community zusammenwirken und ihr wissen einbringen. Und dann kann auch keiner sagen "Ey, da ist etwas falsch". Wenn das jemand sagt soll er es doch selbst berichtigen.

      Die Aussage:

      [3.JgKp]James schrieb:

      Zufällige kenne ich Schmitt und seine Arbeit auch aus eigener Erfahrung und kann daher garantieren, dass die Mission einwandfrei funktioniert.
      Das ist ja schön und gut. Ich und @jokoho482 haben auch nie behauptet das sie nicht funktioniert. Selbst die größten Müll Scripts, die man irgendwo in den weiten des Internets findet, funktionieren. Sonst würde man sie ja auch nicht posten. Aber für Lehrmaterial das Scripten und vorallem "richtiges" Scripten lehren soll, reicht das nicht.

      Und diese Mammutaufgabe tausende Zeilen möglichst perfekten und richtigen Code zu schreiben und diesen auch noch gründlich zu kommentieren damit dies jeder versteht würde ich niemandem allein zutrauen. Nichtmal BI selbst könnte das schaffen.
      Deswegen, Packs auf Github und lass dir von der Community dabei helfen.

      Vor etwas über einem Jahr hatte ich noch weitaus weniger Ahnung als die meisten hier. Dann habe ich mir eben solche Kritik angehört wie ich sie hier abgegeben habe und mich verbessert. Ich habe sogar andere Scripter darum gebeten mich zu Kritisieren. So lernt man gut zu Scripten, und nicht indem man den unkommentierten und teils fehlerhaften Code anderer Leute anschaut und vielleicht etwas falsches Schlussfolgert.
      Dieses Projekt jedoch hat das Potential zu einem Profi zu werden, den man um Rat fragt wenn man sich nicht sicher ist.

      Ich bin kein Missionsbauer. Also auch wenn jemand gerne hätte das ich eine Komplett perfekt gescriptete Mission zu Lernzwecken baue, wird dies nie passieren.
      Ich würde auch nicht sagen das ich ein besonders guter Scripter bin. Aber in meiner Zeit mit TFAR habe ich gelernt zu Optimieren und eine ganze Menge an Erfahrung dabei gesammelt.

      P.S. Zum Taktgeber nochmal. Es gibt keine Garantie das dein sleep 0.1 für 0.1 sekunden wartet. Es ist höchstwahrscheinlich länger.
      Wenn du eine zwischen Client/Server synchronisierte Zeit brauchst nehm CBA's MissionTime oder diag_tickTime auf dem Server oder den Clients. diag_tickTime ist dann nur zwischen Server und Clients unterschiedlich, ist aber extrem genau da es nach der Computeruhr läuft.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von dedmen ()

    • Hallo zusammen (sowohl Kritiker als auch Befürworter)

      Ich "lebe" von solchen Veröffentlichungen. Daran kann ich nicht nur sehen wie andere ihre Missionen aufbauen und wiederverwenden, sondern auch was sie falsch machen als auch was neu bei Arma ist.

      2 Dinge würde ich echt super finden.
      1. Zu notieren welche Mods (inkl. Versionsnummer ) verwendet werden
      2. Die Missionen auf Github oder ähnlichen ablegen um schneller und strukturierter auf Fehler und Verbesserungen reagieren zu können.

      Ich habe bei anderen "Sprachen" am besten durch anfügen von kleinen Änderungen oder Verbesserungen vom Code gelernt. Vielleicht würde dies hier auch funktionieren.