Server Files: Erklärung und Bedeutung

  • Thema:



    cfgundergroundtriggers.json


    Wie immer ein Herzliches Willkommen beim heutigen Thema 😁.


    Hier befassen wir uns, wie das Thema ja schon vermuten lässt,

    mit der "cfgundergroundtriggers.json", welche im Grunde dafür verantwortlich ist,

    uns ein wenig an der Nase herumzuführen und uns glauben lässt,

    wir wären in einem Keller, Bergwerk oder eben einem Bunker.

    Eben allem, was sich ggf. unter der Erde befindet

    oder eben sonst keinerlei Licht von außen hereinkommt.


    Warum es uns an der Nase herumführt 🤔?


    Im Prinzip ist es ganz einfach, da im Spiel selber immer eine gewisse Art

    von Lichtquelle vorhanden ist, insofern z.B. die Sonne scheint oder es eben Tag ist.

    Dadurch ist es leider auch in Räumen, in denen keine Sonne hinkommen würde, hell.

    Hiermit lässt sich dieses System allerdings ein wenig umgehen.


    Wir können versuchen das ganze mal auf simple Art und Weise zu erklären,

    um das Prinzip eines Servers zu verstehen.

    Denn es ist nicht so, dass es irgendwo eine direkte Spielwelt gibt,

    auf der wir uns tatsächlich mit unserem Charakter bewegen

    und uns mit unseren Freunden treffen 🤣.

    Tatsächlich müssen wir uns damit abfinden, dass wir eigentlich alleine

    in Chernarus unterwegs sind und andere Spieler eigentlich eine Art Illusion darstellen.

    Jeder kann natürlich seine eigene Meinung haben, und es sich auf seine Art erklären,

    aber um meinen Gedanken ein wenig näherzubringen, stellen wir uns einfach folgende Situation vor.


    Wir wollen mit ein paar Freunden D&D spielen, welche aber leider nicht gleich um die Ecke wohnen.

    Man könnte auch Monopoly nehmen, falls nicht jeder weiß was D&D ist 🤣.

    Nun hat in unserer Situation jeder unserer Freunde ein Monopoly zuhause,

    was uns zu der Idee führt, dass wir uns in einem Discord oder Team Speak zusammenfinden.

    Gesagt, getan, baut jeder unserer Freunde sein Monopoly bei sich zuhause im Keller auf.

    Wir stellen allerdings nicht nur eine Figur, sondern auch die Figuren

    all unserer Freunde auf unser Spielbrett, und selbes machen natürlich unsere Freunde.

    Einen unserer Freunde ernennen wir zum Dungeon Master oder Spielleiter.

    Dieser hat nun leider die Aufgabe, all unsere Bewegungen und Aktionen zu notieren,

    was ihn also leider daran hindert tatsächlich selber zu Spielen 😫.

    Er erledigt also Papierkram und schreibt unsere Würfelzahlen auf,

    wann wir bei wem in welchem Hotel übernachtet haben,

    und wann wir über los oder ins Gefängnis mussten 😅.

    Wir spielen also jeder für sich auf einem eigenen Brett,

    bei uns zuhause, während eben einer unserer Freunde zuhause sitzt, unser Spiel Koordiniert

    und darauf achtet, das wir uns an die Regeln halten.

    Er kann uns mitteilen, welcher Spieler was gewürfelt hat,

    womit wir die Figuren unserer Freunde auch bei uns zuhause bewegen können,

    falls wir sie mal falsch gesetzt haben und irgendjemanden auffordern,

    und 4,5 Millionen zu zahlen, weil er angeblich auf unserer Schlossallee steht 🤣.


    Unser Spielleiter ist im Grunde unser Server.

    Er selber Spielt also selber nicht aktiv

    und hat kein direkt eigenes Spielbrett.

    Es ist Vielmehr in seinem Kopf und er tauscht mit uns

    die von ihm notierten Daten aller anderen Spieler aus,

    damit wir eben die Spielfiguren der anderen Spieler

    auf unserem Brett bewegen können.


    Auch wenn es eventuell ein doofer Vergleich ist, hoffe ich mal,

    man kann es ein wenig nachvollziehen und versteht wie ich das ganze meine.

    Denn nun können wir uns mal noch folgendes vorstellen.

    Unser Spielleiter kann wenn er es möchte auch gern mal die Spielregeln ändern.

    In unserem Fall und um einen Vergleich zur "cfgundergroundtriggers.json" zu ziehen,

    legt er nach jedem überqueren, des "LOS" Feldes fest, das der Spieler,

    der es überquert für 2 Züge das Licht im Keller ausmacht 😁.

    So ist es nur bei dem Spieler Dunkel, welcher "LOS" überquert,

    während es bei allen anderen Hell ist.


    SO, viel Text für wenig Datei 🤣😅.

    Aber wie gesagt, hoffe ich einfach, dass man das Prinzip somit wenigstens ein wenig verstehen kann

    und vor allem, was ich mit der aussage "alleine spielen" meine,

    auch wenn es ein merkwürdiges Beispiel ist 😅.



    Aber kommen wir nun zum eigentlich wichtigen Teil, nämlich unserer "cfgundergroundtriggers.json".

    Hier fangen wir wieder natürlich auch nochmal mit der Grunddatei an.



    Jetzt müssen wir uns das Ganze in 3 teilen vorstellen.

    Es gibt äußere so wie innere "Trigger" und zusätzliche "Krumen",

    die sich zwischen den Bereichen befinden.

    Man könnte sich die "Krumen" als eine Art Dimmschalter vorstellen,

    den wir nach jedem überqueren in der Helligkeit einstellen.



    Fangen wir aber erst mal wieder mit den Einstellungen an.


    "Position": [ 0, 0, 0] = Position des "Trigger" mit Koordinaten


    Hierbei handelt es sich wie bei allen anderen um Koordinaten,

    welche wieder einen Mittelpunkt darstellen.

    Dabei gilt hier wieder die Reihenfolge "[ x, z, y ]".


    "x" = X Achse (Horizontal von links nach rechts)

    "z" = Z Achse (Höhe zum 0. Punkt und der Wasseroberfläche)

    "y" = Y Achse (Vertikal von Unten nach Oben)



    "Orientation": [ 0, 0, 0 ] = Positionsanpassung / Orientierung / Ausrichtung


    Wie bei anderen Objekten wird oder können wir unseren "Trigger" oder "Bereich" anpassen.

    Dazu haben wir wieder die Möglichkeit es zu drehen, zu neigen oder zu kippen,

    was in diesem Fall die Reihenfolge "[ y, p, r ]" festlegt

    und wir ggf. auch noch aus der "cfggameplay.json Extras: objectSpawnersArr" kennen.


    y = Yaw = Drehung um die eigene Achse in °

    p = Pitch = Neigung nach links oder rechts in °

    r = Roll = Kippen nach vorn oder hinten in °



    "Size": [ 0, 0, 0 ] = "Trigger" oder "Bereich" Größe in Koordinaten


    Hier müssen wir wissen und beachten, dass es sich bei diesen "Bereichen" um ein Viereck in jeder Form handelt.

    Wir legen hier also eine Art Raum fest, in dem wir uns am Ende als Spieler befinden

    und uns eben die Dunkelheit vortäuscht, als würde man eine dicke Decke über einen Tisch legen

    unter dem wir uns befinden.

    Wie auch bei der "Position" gilt hier "[ x, z, y ]" als Ausrichtung und als Mittelpunkt.

    Das bedeutet also, dass bei einer Größe von z.B. 10 m Länge unser Raum vom Mittelpunkt aus

    5 m in die entsprechende Richtung gerückt wird.

    Ein wenig weiter unten kommen wir zu einer kleinen visuellen Erklärung 😁.



    "EyeAccommodation" = Dunkelheit als Wert in "%"


    Hiermit können wir die Dunkelheit bestimmen, bei der in "%" die Helligkeit bestimmt wird.

    Dabei gilt "1" als "100 %", "0" als eben "0 %" und beispielsweise "0.5" wären "50 %".



    "Breadcrumbs": [] = Krumen / Übergänge (Checkpoints) für Zwischenstufen


    Dabei handelt es sich um eine Art Checkpoints, die wir als Spieler ablaufen

    um am Ende den Tiefsten und dunkelsten Punkt dieses Raumes oder Bereiches zu erreichen.

    Die Krumen oder Checkpoints liegen hier immer in diesem angelegten Raum

    und sind kein eigener Raum. Auch hier kommen wir etwas weiter unten zu einer kurzen Erklärung 😉.



    "InterpolationSpeed" = Übergangsgeschwindigkeit als Wert in "sec"


    Hier können wir in mit einem Wert in Sekunden bestimmen, wie schnell ein Übergang zwischen "Triggern" vollzogen werden soll.

    Es wird also beispielsweise bei einem Wert von "5" ein Übergang von 5 Sekunden stattfinden,

    Was allerdings meist unnötig ist, da die Übergänge schon mit den "Breadcrumbs" festlegen.

    Ich bin mir zwar unsicher, bin aber der Meinung, dass bei einer Nichtangabe dieses Wertes immer der Wert "1" gilt.



    Nun kommen wir noch zu 2 Werten, welche nur in den "Breadcrumbs" verwendet werden.


    "UseRaycast" = "Raycasting" Verwendung


    Hierbei wird mit "1" / "true" oder mit "0" / "false" die Nutzung von "Raycasting" aktiviert.

    Ich bin leider immer noch kein Programmierer, was es mir also etwas schwerer macht,

    das ganze zu erklären 🤣😅.

    Daher würde ich jetzt mal auf die schnelle auf einen "Wikipedia" Eintrag verweisen,

    damit jeder, der daran Interesse hat, eventuell selber nochmal genauer nachlesen kann.


    Wikipedia: Raycasting



    "Radius" = Entfernung in "m" für Anpassung / Beeinflussung durch den Krumen


    Hiermit kann eine Entfernung in Metern angegeben werden, inwieweit der Krumen oder "Checkpoint"

    die angegebene Licht- oder Sichtanpassung beeinflussen kann.

    Dabei gilt der Wert "-1" als eine Einstellung, bei der ein Standardwert genutzt wird.

    Ich hab da leider auch noch keine genaue Erfahrung, was hier wie wo oder wann angepasst wird

    und empfehle daher entweder wie in der Vanilla Einstellung alles auf "-1" zu lassen

    oder ggf. einfach selber ausprobieren.

    Versuch macht eben klug 😉😁.



    Nun aber zum Allgemeinen, denn beim Aufbau eines "Unterirdischen" Bereiches,

    und nein er muss nicht zwingend unter der Erde sein 😅, ist es wichtig eine Art Startpunkt zu haben.

    Dieser sollte in der Regel schon vor dem Eintritt in beispielsweise einen Bunker vorhanden sein.

    In der Vanilla Livonia Variante haben wir dafür den folgenden ersten Trigger.


    Code
            {     
                "Position": [ 749.738708, 533.460144, 1228.527954],
                "Orientation": [ 0, 0, 0 ],
                "Size": [ 15, 5.6, 10.8 ],
                "EyeAccommodation": 1,
                "Breadcrumbs": [],
                "InterpolationSpeed": 1
            }, 


    Dieser hat die Koordinaten vor der Bunkertür und die entsprechende Größe,

    um zu verhindern, dass wir als Spieler an diesem Punkt vorbeilaufen können.

    Hier auch gleich ein Bildausschnitt mit der Position des "Triggers".


    7fxx2dK.png


    Zusätzlich haben wir die Einstellung "EyeAccommodation" mit dem Wert "1",

    was dafür sorgt, dass wir keinen Unterschied zur eigentlichen Tageszeit haben,

    da quasi die Einstellung für unseren "Lichtschalter" deaktiviert ist.

    Dies ist also unser Startpunkt für alle darauffolgenden "Trigger".



    Als Nächstes kommt nun der erste Raum und somit der "eigentlich" erste Bereich, der betreten wird.


    Code
            {     
                "Position": [ 735.0, 533.7, 1229.1 ],
                "Orientation": [ 0, 0, 0 ],
                "Size": [ 15, 5.6, 10.8 ],
                "EyeAccommodation": 0,
                "Breadcrumbs":
                [ 


    Abgesehen von Koordinaten und Größe, welche nun so angepasst sind, dass beide Bereiche aneinandergrenzen,

    haben wir hier wieder die Einstellung "EyeAccommodation", welche mit dem Wert "0" versehen ist.

    Dadurch ist dieser Bereich eigentlich in vollkommene Dunkelheit gehüllt, was bedeuten würde,

    wir würden innerhalb einer Sekunde in einem Raum in vollkommener Dunkelheit stehen.

    Hinzu kommt, dass wir ja nun wissen, dass bei uns, auf unserem Bildschirm,

    eigentlich die Sonne verschwindet, was also auch bedeutet,

    dass es auch draußen vollkommen dunkel wäre.


    Nun könnte man ja behaupten:


    "🤔 Es gibt doch die Einstellung "InterpolationSpeed" 🤓,

    womit ich diesen Übergang verzögern kann."


    So einfach ist das in der Praxis aber leider nicht 😅, denn das einzige was wir damit erreichen,

    wäre eine Verzögerung aber keine Beseitigung des Problems.

    Man würde also einen Raum betreten und während wir im Türrahmen stehen bleiben,

    macht einfach jemand langsam das Licht aus und gleichzeitig würde jemand die Sonne verschwinden lassen,

    während es bei unserem Kumpel, der genau hinter uns steht, noch Taghell ist 🤣.



    Daher kommen wir auch gleich zu den oben erwähnten Krumen / Breadcrumbs,

    welcher sich in unserem eigentlichen Bereich befindet.

    Dafür nehmen wir uns einfach auf die schnelle nochmal das komplette Beispiel.



    Auch hierfür und um den erwähnten Raum mit den enthaltenen Krumen darzustellen,

    Gibt es mal eine kleine Matheaufgabe. Aber dieses Mal ist sie relativ simpel 😅.

    Dafür nehmen wir als Erstes unsere Koordinate des Raumes "[ 735.0, 533.7, 1229.1 ]".

    Als Nächstes können wir jetzt das Wissen anwenden, welches wir über den Mittelpunkt

    und die "Size" haben, um eben die Größe des Raumes über Koordinaten bestimmen zu können.

    Dafür können wir die "Size" Werte "[ 15, 5.6, 10.8 ]" nehmen und diese erst einmal halbieren.

    Somit ergeben sich die Werte 7,5, 2,8 und 5,4. Jeweils vom Mittelpunkt aus in die entsprechende Richtung.


    ziu3bFH.png


    Jetzt können wir unsere Koordinaten des Raumes und seinem Mittelpunkt mit unseren Werten berechnen,

    in dem wir zum jeweiligen Wert + und - unserer halben "Size" Werte rechnen.

    Klingt schlimmer als es sich anhört 😅.

    Aber einfach gesagt rechnet man z.B. 735.0 + 7,5 und einmal 735.0 - 7,5 usw.

    Um das Ganze auch schnell hinter uns zu Bringen, machen wir also folgendes.


    Mittelpunkt = Position 735.0, 533.7, 1229.1


    735,0 - 7,5 = 727,5

    735,0 + 7,5 = 742,5


    533,7 - 2,8 = 530,9

    533,7 + 2,8 = 536,5


    1229,1 - 5,4 = 1223,7

    1229,1 + 5,4 = 1234,5


    (Zum Rechnen mit 'nem Taschenrechner am besten immer "." durch "," ersetzen, der kommt sonst damit nicht zurecht

    und ich werde, damit man nicht durcheinander kommt "." mit "," ersetzen. Es sieht halt auch besser aus 😅)


    Aber wozu das ganze nun gut ist, schauen wir uns mit den Positionen jedes Krumen / Breadcrumbs an.

    Es sollte sich jede Position immer zwischen den Werten befinden, die wir ausgerechnet haben.

    Als Beispiel nehmen wir uns einfach die ersten 3 Positionen, den Rest kann jeder für sich nachschauen.

    Damit lässt sich aber noch einmal überprüfen, dass sich unsere Krumen auch wirklich in dem Bereich befinden,

    für den wir die Krumen auch setzen.

    Schließlich können wir auch keinen Lichtschalter außerhalb unserer Wohnung anbringen,

    anschließend die Tür zu machen und versuchen ihn zu betätigen 🤣.

    So in Etwa sollte man sich dies eben auch mit den Krumen für einen Bereich vorstellen.


    Aber wie gesagt, hier nochmal zum Überprüfen.

    Ich setze jetzt nur schnell die Werte der einzelnen Positionen zwischen die berechneten Koordinaten

    und hoffe, man versteht somit einigermaßen was gemeint ist 😅.


    Krumen Nummer 1


    727,5

    741,294556

    742,5


    530,9

    531,522729

    536,5


    1223,7

    1227,548218

    1234,5


    Krumen Nummer 2


    727,5

    741,273071

    742,5


    530,9

    531,522729

    536,5


    1223,7

    1229,310547

    1234,5


    Krumen Nummer 3


    727,5

    739,904

    742,5


    530,9

    531,6

    536,5


    1223,7

    1230,51

    1234,5



    Nun noch zum letzten Teil, nämlich dem Aufbau eines "Untergrund" Areals.

    Dafür könnte man vorrangig erst mal ein paar Regeln und Grundlagen festhalten,

    die ein wenig Beachtung bekommen sollten.


    Darunter Zählen, dass wie schon erwähnt, immer ein Startpunkt außerhalb angelegt werden sollte oder muss.

    Diesen nennt man unter anderem auch "Outer Trigger" oder "Außen Trigger". Anschließend und der Vollständigkeit halber

    erwähnen wir am besten auch gleich, dass ein Areal mit Krumen ein "Transitional" / "Übergang" ist

    und alle nachfolgenden im inneren eben die "Inner Trigger" sind oder eben "Innere Trigger" 😅.


    Als Nächstes und auch da wie schon erwähnt, sollten Übergänge / Krumen innerhalb eines Trigger-Bereiches liegen.


    Wie auch schon erwähnt, sollte man einen Übergang nicht einfach nur über eine Übergangsgeschwindigkeit

    sondern mit den erwähnten Krumen erstellen.


    Als Nächstes sollten wir wissen, das wir keine doppelten Krumen und Übergänge anlegen müssen,

    da sie in beide Richtungen funktionieren.


    Die Krumen selber sollten am besten so Platziert werden, das es Optisch passt

    und wir z.B. nicht auf eine Wand zu laufen, es einfach dunkler wird,

    obwohl von hinten noch die Sonne scheint.


    Am besten also über enge Gassen und Ecken platzieren um schöne Übergänge zu schaffen

    und viel Experimentieren 😉.


    Ein Areal welches sich in einem simulierten Untergrund befindet und einen Ein- und einen Ausgang haben,

    sollten entsprechend mit Krumen versehen werden.


    🤔 mehr ist, es glaube ich auch nicht, abgesehen davon, dass man natürlich seine Konstruktion

    immer nochmal überprüfen und nach Fehlern Ausschau halten sollte.



    Jetzt kommen wir aber zu unserem kleinen Beispiel des Aufbaus.

    Dafür hab ich einen Tunnel mit einer Draufsicht in verschiedenen Abschnitten angelegt.

    Der Tunnel selbst, wie Areale und Übergänge angelegt werden können

    und sich unsere Dunkelheit verhalten kann.


    Es handelt sich nur um ein grobes Beispiel, aber hier wäre erst mal der Aufbau des Tunnels selbst.

    Er hat 2 Fahrtrichtungen, davon jede getrennt, aber durch einen Gang miteinander verbunden

    und an jedem Ein- und Ausgang gibt es einen Notausgang.

    Die Tunnel selber sind nicht von außen zugänglich

    genauso wenig wie 2 der Notausgänge.


    XYQVUf2.png


    Wir haben hier also einen Ein- und einen Ausgang so wie die Gestrichelte Linie,

    welche darstellen soll, wie wir durch diesen Tunnel gelangen können.



    Im nächsten Bild sehen wir, wie die Bereiche beispielsweise angeordnet werden können.

    Dabei sind zum einen die Werte und Angaben für die "EyeAccommodation" und die "Breadcrumbs" Markiert.

    Nicht Perfekt und auch der Außenbereich fehlen, aber ich hoffe da kann man drüber hinwegsehen,

    es soll ja nur eine grobe Darstellung sein 😅.


    NDS1gzS.png


    Die "Breadcrumbs" sind hierbei jeweils in den Gängen Bzw. den Türen, wenn man sich diese ein wenig hinzudenkt.

    Der "Trigger" oder Bereich soll hier ein wenig Kennzeichnen, das sich dieser Zwar über alle drei Räume erstreckt,

    dieser aber quasi in oder durch die einzelnen "Breadcrumbs" getrennt ist.



    Als Nächstes noch einmal das Gleiche, aber nur die "Trigger" ohne Tunnel.


    9CejPDs.png


    Soll nur noch einmal ein wenig die Einteilung darstellen 😅.



    Als Letztes haben wir nun noch unsere Tunnel, welche eben in Dunkelheit und ihre Übergänge eingeteilt sind.


    rXLaN66.png


    Hier geht es mehr oder weniger nur nochmal grob um die Veranschaulichung der Dunkelheit im Inneren

    und wie sich die Übergänge auf die Helligkeit in den Räumen auswirkt,

    trotz dessen, dass wir bei der Einstellung "EyeAccommodation" den Wert "0" gesetzt haben.



    So, aus die Maus, jetzt wird es Duster 🤣.

    Nein, es sollte es eigentlich auch mit diesem Thema gewesen sein.

    Ich hoffe wie immer ich habe nichts vergessen,

    bin für Änderungs- oder Verbesserungsvorschläge immer offen,

    Freue mich, euch beim nächsten Thema wieder an Bord zu haben,

    bedanke mich wieder für Zeit, Interesse, Geduld

    und eure Aufmerksamkeit 😅.


    Bis zum Nächsten Thema 😁👍