Thema:
cfgeffectarea.json
Wie immer ein herzliches Willkommen beim heutigen Teil der Sendung 😁🤣.
Heute im Programm, die toxischen Zonen.
Also immer schön die Gasmasken aufsetzen, Schutzkleidung anlegen
und gerne den POX-Pen bereithalten 🤣.
Aber legen wir mal los, denn diese Datei beinhaltet 2 wichtige Dinge.
Zum einen befasst und enthält sie statische Positionen für toxische Zonen
und zum anderen Koordinaten für sichere Log-in Positionen, für den Fall,
ein Spieler hat sich in einem Gebiet ausgeloggt,
an der eine toxische Zone auftauchen kann.
Damit sichergestellt werden kann, dass Spieler, die keine Ausrüstung haben,
sich nach ihrem Log-in in einer toxischen Zone wiederfinden
und eines grauenhaften Todes sterben müssen,
nur weil sie mal eben eine Pause einlegen mussten,
werden sie für diese Fälle außerhalb einer Zone gespawnt.
Damit wir diesen Teil, da er relativ simpel ist, auch gleich abhaken können,
hier wieder der alt bekannte Inhalt 😅.
"SafePositions":[
[434, 13624],
[360, 10986],
[1412, 13505],
[1290, 11773],
[5742, 8568],
[4191, 4620],
[4949, 6569],
[1018, 7138],
[5041, 2640],
[6895, 7915],
[6128, 8120],
[4422, 8117],
[2811, 10209],
[1954, 2417],
[3633, 8708],
[5222, 5737],
[3546, 2630],
[2373, 5516],
[2462, 6879],
[1653, 3600],
[11774, 14570],
[8228, 9345],
[11100, 13400],
[9333, 8697],
[11513, 12203],
[4955, 10603],
[5090, 15054],
[6513, 14579],
[3483, 14941],
[4016, 11194],
[7607, 12384],
[4307, 9528],
[3266, 12352],
[4432, 13285],
[5473, 12455],
[9731, 13685],
[2745, 7784],
[8492, 14128],
[3501, 13292],
[7912, 10943],
[4165, 10134],
[10536, 7871],
[1467, 14288],
[5479, 9709],
[9453, 11963],
[319, 9212],
[8009, 14843],
[7206, 7158],
[12303, 13598],
[3435, 5959],
[4060, 12050],
[6633, 2988],
[870, 2095],
[10286, 9071],
[10371, 5690]
]
Alles anzeigen
Wie der Name "SafePositions" schon vermuten lässt, handelt es sich hier um die besagten sicheren Spawn Punkte.
Diese sind, wie man sehen kann, ganz simpel aufgelistet und beinhalten nichts anderes als 2 Koordinaten,
welche die "x" und "y" Koordinaten sind.
(Wir müssen hier leider 2-Dimensional denken, deswegen ist es dieses mal nicht die "z" Koordinate 😅).
"x" = X Achse (Horizontal von links nach rechts)
"y" = Y Achse (Vertikal von Unten nach Oben)
Wenn man sich die Karte mal ein wenig genauer anschaut, sehen wir wie weit ein solcher Spawn Punkt entfernt ist
und nicht grundsätzlich jede Zone einen solchen Punkt braucht.
Dies sollte in der Regel daran liegen, dass in diesen Fällen der nächstgelegene Punkt ausgewählt wird,
was also bedeutet, dass ein Spieler, der sich in Tisy ausgeloggt hat und sich einloggt,
während eine toxische Zone in Tisy ist, sich in Berenzino wiederfindet,
würde man sich eben auf nur diesen beschränken 🤣.
Er sollte sich eben beim nächstgelegenen Punkt wiederfinden.
Man könnte also in der Theorie ein wenig gemein sein und bis auf einen Punkt alle entfernen,
so würden sich alle Spieler nach solch einem Szenario an einem Punkt wiederfinden 🤣😅.
Aber das wäre ja gemein 😉😅.
Nein Spaß, das sollte es aber mit dieser Abteilung gewesen sein,
weshalb wir jetzt zur zweiten Tagesordnung übergehen.
Den erwähnten Statischen toxischen Zonen.
Da mir mitten im Bearbeiten und Vorschreiben dieses Beitrags noch die 1.28
eine Ohrfeige verpassen musste und unbedingt ein paar Dinge ändern musste,
musste ich hier nochmal alles ein wenig umarbeiten 👍😑.
Dadurch hat es leider etwas länger gedauert, aber ich hoffe mir sei Verziehen 🤣.
Als Erstes sollte man mal am Rande erwähnen, dass diese Zonen nicht wirklich statisch sind.
Sie werden nach jedem Server Neustart hervorgebracht und bleiben oder sollten,
bis zum nächsten Neustart an ihrer Position stehen, was sie eben in diesem Fall
zu einer statischen Zone macht.
Aber weiter im Text und hier ist es wichtig zu wissen, dass es 2 Möglichkeiten gibt.
Im Prinzip sind sie natürlich irgendwie gleich und erfüllen beide denselben Zweck.
Allerdings gibt es jetzt eine Kurze und eine ausführliche Möglichkeit, wenn man es so möchte.
Dafür nehmen wir folgende Beispiele und teilen sie eben mal schnell in ein Altes (< 1.28)
und ein neues System (> 1.28) ein.
Altes System (< 1.28).
"Areas": [
{ "AreaName": "Ship-SW",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 13684, 0, 11073 ],
"Radius": 100,
"PosHeight": 22,
"NegHeight": 10,
"InnerRingCount": 1,
"InnerPartDist": 50,
"OuterRingToggle": 1,
"OuterPartDist": 50,
"OuterOffset": 0,
"VerticalLayers": 0,
"VerticalOffset": 0,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
Alles anzeigen
Neues System (> 1.28).
"Areas": [
{ "AreaName": "Ship-Bow",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 13920, 0, 11170 ],
"Radius": 60,
"PosHeight": 5,
"NegHeight": 3,
"InnerPartDist": 100,
"OuterOffset": 20,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
Alles anzeigen
Jetzt haben wir aber wieder einige Parameter und Werte, die wichtig für diese Datei sind
und wie wir sehen, sind einige Parameter jeweils in beiden Versionen vertreten.
Da ich zum einen nicht alles neu und auch nicht alles doppeltgemoppelt aufschreiben will,
auch wenn ich diesen Beitrag schon 5 mal neu geschrieben habe 😅,
nehmen wir also alle Parameter nach einander durch und gehen dann wieder genauer auf das Thema ein.
"Areas" ===========> Zonen Einteilung in dieser Datei
Hiermit werden zu aller erst die Zonen von unseren oben genannten "SafePositions" getrennt.
Dies ist für diese Datei wichtig, da alles in diesem eingeklammerten Bereich auch nur
für unsere statischen Zonen wichtig ist und nichts mit den "SafePositions" zu tun hat.
Man könnte also den Bereich leer lassen und hätte am Ende keine statischen Zonen,
dafür aber eben immer noch die dynamischen Zonen
mit den zugehörigen Sicheren Spawn Punkte für Spieler.
Somit können wir uns also Merken, das es mit "[" anfängt, mit "]," aufhört
und wenn wir keine Statischen toxischen Zonen möchten,
es folgendermaßen aussehen lassen können.
Damit hätten wir eben keine statischen Zonen mehr auf unserer Karte.
Aber nun zu den Parametern.
"AreaName": "" = Zonen Name
Hier haben wir wieder die Bezeichnung und den Namen, der sich eben dieses mal auf unsere Zone bezieht.
"Type": "ContaminatedArea_Static" = Typ und Klassifizierung der Zone
Hier wird eben der Typ und in dem Fall "ContaminatedArea_Static" angegeben, damit der Server weiß,
das es sich eben um eine Statische toxische Zone handelt.
"TriggerType": "ContaminatedTrigger" = Auslöser Typ für das Event
Damit wird die Art bestimmt, wie diese Zone ausgelöst werden soll.
Die bisherigen Einstellungen würde ich empfehlenswerter weise lassen wie sie sind
und nicht ändern, wenn man nicht weiß, was man alles ändern kann.
Da muss ich mich grundsätzlich erst einmal mit einbeziehen,
da ich auch nicht weiß, was es alles an Möglichkeiten gibt
und auch nicht wirklich was gefunden habe 😅.
Tendenziell ist es aber, glaube ich bis hier auch alles eher der Programmierung
und dem Scripting gedacht.
"Data" ===========> Grunddaten für die toxische Zone
Wie es der Name schon sagt, kommen hier nun alle für die Zone wichtigen Daten rein 🤣.
"Pos": [ 13684, 0, 11073 ] = Position der Zone mit Koordinaten
Hier wird die Position der Zone auf der Karte wieder in der 3-Dimension festgelegt.
Dabei haben wir wieder folgende Koordinaten.
"x" = X Achse (Horizontal von links nach rechts)
"z" = Z Achse (Vertikal von Unten nach Oben)
"y" = Y Achse (Höhe zum Boden)
Hier müssen wir wie gesagt ein wenig 3-Dimensional denken und uns Vorstellen, wir schauen von Oben auf die Karte.
Jetzt haben wir die Koordinatenreihenfolge "Pos": [ x, y, z ]" und sehen beim Vergleich,
dass die "y" Koordinate mit "0" angegeben ist.
Das liegt daran, dass es eben nicht wie bei normalen Events die Höhe zum "0" Punkt bzw. zum Meeresspiegel ist,
sondern die Höhe zum Boden, auf dem sich auch unser Charakter bewegt.
Würden wir hier also beispielsweise den Wert "50" eintragen,
würde unser Zonen-Event 50 m über unserem Charakter liegen 😅.
"Radius": 100 = Zonen Radius in "m"
Damit wird der Radius der Zone in Metern angegeben.
"PosHeight": 22 = Zonen Höhe in "m" vom "0" Punkt
Hiermit wird im Grunde zusätzlich noch einmal die Höhe der Zone in Metern angegeben.
Sie wird hier vom "0" Punkt an gemessen, und geht damit in diesem Fall also vom Boden aus
22 Meter in die Höhe.
"NegHeight": 10 = Zonen Tiefe in "m" vom "0" Punkt
Hier haben wir das Gegenstück zur "PosHeight", denn hier wird in Metern angegeben,
wie weit die Zone vom Boden oder "0" Punkt in die Tiefe geht.
Grund dafür ist eigentlich simpel, falls sich jemand fragt, was das für einen Zweck hat.
Zum einen haben wir die Optik, denn je nach Grafik und Aufbau kann es doof aussehen,
wenn da so ein Donut über dem Boden schwebt und zum anderen, stelle man sich vor,
man hätte einen Hang, dann würde die Zone über ihm schweben
und man könnte sich Verstecken und das ganze von unten betrachten ohne das etwas passiert 🤣😅.
"InnerRingCount": 1 = Ringanzahl im inneren Bereich
Damit wird die Anzahl an Ringen im inneren Bereich der Zone angegeben,
auf dem wieder "Particle emitter" liegen können.
"InnerPartDist": 50 = Entfernung zwischen zwei "Particle emitter" in "m" auf inneren Ringen
Hier haben wir eine Entfernung in "m" auf gerader Linie zwischen den "emitter",
welche sich auf einem inneren Ring befinden.
"OuterRingToggle": 1 = Aktivieren oder Deaktivieren des Außenringes
Hier kann mit "1" oder "true" ein Außenring aktiviert werden, welcher zusätzlich zu den inneren Ringen existiert.
Mit "0" oder "false" kann dieser eben auch wieder deaktiviert werden.
"OuterPartDist": 50 = Entfernung zwischen zwei "Particle emitter" in "m" auf dem äußeren Ring
Hier haben wir wieder eine Entfernung in "m" auf gerader Linie zwischen den "emitter".
Diesmal eben auf dem äußeren Ring.
"OuterOffset": 0 = Entfernung des Außenrings zum Radius
Dies ist wie eine Art Versatz des äußeren Ringes zum eigentlichen Radius.
Dieser vergrößert die Zone mit einer Art Verdrängung, wie es bei einer Rauchwolke eben so ist.
Sie wächst in gewisser Weise nach außen.
"VerticalLayers": 0 = Anzahl vertikaler Schichten
Hierbei können wir, zusätzlich zur Bodenebene, einen weiteren Layer hinzufügen.
Im Prinzip hätte man dadurch eine Zone über einer Zone, wodurch diese höher wirken kann.
"VerticalOffset": 0 = Schichten Versatz
Hiermit legen wir einen Versatz oder Abstand zwischen den Ebenen oder Schichten fest.
"ParticleName" = Name und Pfad der Partikel einer toxischen Zone
Hier wird der Name und der Pfad zu den Partikeln angegeben.
In diesem Fall haben wir "graphics/particles/" als Pfad
und "contaminated_area_gas_bigass" als Datei für die Partikel.
"PlayerData" ===========> Spieler spezifische Grunddaten
"AroundPartName" = Name und Pfad von Partikeln um einen Spieler herum
Hier haben wir, wie bei der "ParticleName", einen Pfad
und den Zugehörigen "Partikel" Effekt um einen Spieler,
wenn dieser eine Zone betritt.
Wir haben "graphics/particles/" wieder als Pfad
und "contaminated_area_gas_around" als Datei für unseren Effekt.
"TinyPartName" = Name und Pfad von kleinen Partikeln um einen Spieler herum
Hier haben wir zusätzlich noch einmal einen Pfad
und den Zugehörigen "Partikel" Effekt von kleinen Partikeln,
die um einen Spieler herum erscheinen, wenn dieser eine Zone betritt.
Auch heir haben wir wieder "graphics/particles/" als Pfad
und "contaminated_area_gas_around_tiny" als Datei für unseren Effekt.
"PPERequesterType" = Typenbezeichnung des Post-Processing-Effekts
Dabei handelt es sich um eine Bezeichnung des Types,
welcher dafür verantwortlich ist, was wir als Spieler vor uns sehen,
wenn wir uns in einer Zone bewegen.
In diesem Fall ist es eben der Effekt "PPERequester_ContaminatedAreaTint".
Kommen wir nun noch kurz zu ein paar eventuellen Fragen,
wie "Was ist ein "Post-Processing-Effekt", "was ist ein Particle emitter",
oder "Was ist ein Particle".
Wir versuchen es so simpel wie Möglich, und ich hoffe einfach, dass es dadurch verständlich genug ist,
um zu verstehen, was gemeint ist und was wir einstellen 😅.
Was ist ein Particle:
Am Einfachsten erklärt können es 2- oder 3-Dimensionale Objekte sein, welche z.B. Rauch oder Feuer simulieren können.
Wir müssen hierbei nur zwischen dem Particle oder Partikel und dem Particle Effekt unterscheiden.
Der Particle Effekt wäre eine Rauchsäule, wohingegen der Particle nur ein einzelnes Element dieser Säule ist.
Rauch kann z.B. als ein 2-Dimensionales Bild dargestellt werden. Dieses lässt sich schieben, Drehen,
verkleinern, bewegen oder die farblich anpassen. Dies geschieht wieder durch unseren Particle Effekt.
Im Falle eines Bildes und damit auch gleich die Frage geklärt ist,
sehen wir dieses immer nur aus der Front Perspektive.
Es ist als würden wir um ein Blatt Papier herumlaufen,
welches sich aber immer mit uns dreht.
Was ist ein Particle emitter:
Einfach gesagt, ist es der Punkt, an dem unser Particle Effekt startet.
Von ihm ausgehend, werden z.B. Rauchwolken aufsteigen oder es wird ein Feuer dargestellt.
In Kombination, können wir uns also vorstellen, dass ein Helicrash einen Particle emitter besitzt.
Von diesem ausgehend, startet der Particle Effekt, welche z.B. die Richtung der Rauchwolke angibt,
welcher Particle (z.B. welches Bild) dargestellt wird und wie er sich verhalten soll.
Er wird z.B. vom emitter aus größer, dunkler und verschwindet beispielsweise anschließend.
Was ist ein "Post-Processing-Effekt:
Diesen Effekt kann man sich als eine Art Schablone vorstellen, welche zwischen unseren Bildschirm
und unser Auge gesetzt wird. In diesem Fall und da es ja bekanntlich doof wäre,
jedes mal eine neue Schablone auf unseren Monitor zu legen 🤣,
passiert dies im Prinzip auf digitalem Wege.
Es wird sozusagen eine Schablone zwischen dem Spiel
und dem gelegt, was wir endgültig auf dem Monitor sehen.
Jetzt gehen wir noch auf die Zonen direkt ein und wie sie funktionieren.
Dafür hab ich da mal was vorbereitet 🤣.
Nein, dank Bohemia, habe ich ein paar optische Aufklärungsbeispiele die ich ein wenig angepasst habe
und hoffe, dass es damit auch gleich ein wenig verständlicher wird 😅.
Hier aber auch der Link zur Bohemia Darstellung, in der auch nochmal
die "cfgeffectarea.json" ein wenig erklärt wird.
Bohemia Dayz Contaminated Areas Configuration
Als Erstes nehmen wir eine Zone von der Seitenansicht,
um die Optionen "Pos", "PosHeight", "NegHeight"
und ggf. "Radius" besser aufzuzeigen.
Als Nächstes nehmen wir noch eine Zone in der Draufsicht, um damit nochmal die Option "Radius"
und zusätzlich die Optionen "InnerRingCount", "InnerPartDist", "OuterPartDist" und "OuterOffset" darzustellen.
Die letzte Darstellung zeigt uns nochmal eine Draufsicht der Zone, wie sie am Ende aufgebaut wird.
Letzteres gilt aber hauptsächlich der Version 1.28, soll aber auch ein wenig aufzeigen,
wie sich die Zone beispielsweise aufbaut oder wie sie kalkuliert wird.
Hinzu kommen allerdings noch die Berechnungen einer Zone,
auf welche wir jetzt zusätzlich auch noch ein wenig eingehen.
Allerdings wird es ab hier auch ein klein wenig komplexer,
weswegen ich das auch erst hier ans Ende stelle.
Wem es also reicht, das ganze einfach mal gesehen zu haben, der kann den Teil gerne überspringen 😅🤣.
Kommen wir nun aber zum praktischen Rechenteil.
Damit wir Beispiele haben, werden wir uns einfach mal für alle Berechnungen
ein paar Beispiele zusammenstellen.
Ich trenne es hier aber wieder in die beiden Versionen vor und nach der 1.28.
Das hat einfach den Grund, dass es in der neuen Variante wohl etwas,
nennen wir es mal "Automatisierter" läuft.
Innere Ringe oder der Gleichen, werden automatisch erzeugt, um die Zone auszufüllen.
Wie wir im letzten Bild sehen, haben wir folgende Formeln, die aufzeigen, wie die Zone aufgebaut wird.
R<Rp
R<3 ∗ Rp
R>3 ∗ Rp
R = Radius + OuterOffset
Rp = InnerPartDist / 2
Die 3 steht meiner Meinung nach für die Formel und Funktion, die eingefügt wurde und davon ausgeht,
dass es nur noch oder maximal 2 innere Ringe in einer Zone gibt und eben einen äußeren Ring (2 + 1 = 3).
Nun legen wir hierfür mal 3 Beispiele fest.
{ "AreaName": "Zone-A",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 30,
"PosHeight": 20,
"NegHeight": 20,
"InnerPartDist": 100,
"OuterOffset": 15,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
{ "AreaName": "Zone-B",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 75,
"PosHeight": 20,
"NegHeight": 20,
"InnerPartDist": 100,
"OuterOffset": 20,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
{ "AreaName": "Zone-C",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 100,
"PosHeight": 20,
"NegHeight": 20,
"InnerPartDist": 100,
"OuterOffset": 60,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
Alles anzeigen
Nun müssen wir für uns für die Berechnung die Werte anschauen, die dafür auch von Bedeutung sind.
Diese minimieren sich auf "Radius", "OuterOffset" und "InnerPartDist".
Somit bleiben nur noch diese 3 Werte für diese Berechnung übrig, welche wir uns nun
für jedes Beispiel herauspicken und somit folgende Zeilen haben.
Für Zone-A:
Radius = 30
OuterOffset = 15
InnerPartDist = 100
Für Zone-B:
Radius = 75
OuterOffset = 20
InnerPartDist = 100
Für Zone-C:
Radius = 100
OuterOffset = 60
InnerPartDist = 100
Nun rufen müssen wir uns wieder unsere Werte für die Formeln ins Gedächtnis rufen,
welche wir für die Berechnung benötigen.
R = Radius + OuterOffset
Rp = InnerPartDist / 2
Somit haben wir nun folgende Werte.
Für Zone-A:
R = Radius + OuterOffset = 45
Rp = InnerPartDist / 2 = 50
Für Zone-B:
R = Radius + OuterOffset = 95
Rp = InnerPartDist / 2 = 50
Für Zone-C:
R = Radius + OuterOffset = 160
Rp = InnerPartDist / 2 = 50
Jetzt kommen die Formeln wieder ins Spiel, in welcher wir unsere Werte einsetzen können.
Und damit man nicht nochmal Scrollen muss, hier auch gleich noch einmal die Formel,
in der wir die Werte entsprechend eintragen können.
R<Rp
R<3∗Rp
R>3∗Rp
Für die Berechnung haben wir anschließend folgende Werte und
anschließend nochmal die endgültige Darstellung.
Für Zone-A:
45<50
45<3 ∗ 50 = 150
45>3 ∗ 50 = 150
Endgültige Darstellung
45<50
45<150
45>150
Für Zone-B:
95<50
95<3 ∗ 50 = 150
95>3 ∗ 50 = 150
Endgültige Darstellung
95<50
95<150
95>150
Für Zone-C:
160<50
160<3 ∗ 50 = 150
160>3 ∗ 50 = 150
Endgültige Darstellung
160<50
160<150
160>150
Das sieht wahrscheinlich auf den ersten Blick schlimmer aus als es eigentlich ist,
denn im Grunde können wir nun ein wenig abgleichen und schauen,
welche aussagen zutreffend sind.
Für Zone-A:
45<50 ✓
45<150 ✓
45>150 ×
Für Zone-B:
95<50 ×
95<150 ✓
95>150 ×
Für Zone-C:
160<50 ×
160<150 ×
160>150 ✓
Schauen wir uns nun unsere Ergebnisse an, sollten wir diese mit dem Bild zu diesen Berechnungen vergleichen
und feststellen, dass Zone-B wie oben im Bild den Aufbau einer Zone mit nur einem Ring hätte.
Zone-C hingegen ist so groß, dass sie zusätzlich einen Ring, bzw. "emitter" benötigt, um diese zu füllen.
Zone-A hat nun aber ein kleines Problem, da 2 Angaben zutreffen.
Hier würde aber nur die erste tatsächlich zutreffen, also 45<50, was daran liegt,
das einer unserer Partikel Effekte von alleine größer ist, als die Zone selbst.
Somit ist die Zone also mit nur einem abgedeckt und muss nicht unnötig Ringe darin aufbauen,
um diese zu füllen.
Dies sollte es grundlegend für die neue Variante gewesen sein.
Da das System aber abwärtskompatibel ist, müssen wir nun aber leider
auch noch zusätzlich darauf eingehen, wie es mit dem Berechnen der "emitter" aussieht,
da man in diesem Fall selber ein wenig schauen muss, wie sich das ganze ein wenig aufbaut.
Natürlich kann man dieses Prinzip auf beide Varianten anwenden,
allerdings müsste man in der neuen Variante auch wissen,
wie viele Ringe man am Ende tatsächlich hat 😅.
Aber hier mal die grundlegende Formel, die auch auf der Bohemia Webseite zu finden ist
und wieder 3 Beispiele, mit denen wir auf die schnelle arbeiten.
3 Beispiele.
{ "AreaName": "Zone-A",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 60,
"PosHeight": 22,
"NegHeight": 2,
"InnerRingCount": 1,
"InnerPartDist": 20,
"OuterRingToggle": 1,
"OuterPartDist": 30,
"OuterOffset": 0,
"VerticalLayers": 0,
"VerticalOffset": 0,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
{ "AreaName": "SZone-B",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 100,
"PosHeight": 22,
"NegHeight": 2,
"InnerRingCount": 1,
"InnerPartDist": 50,
"OuterRingToggle": 1,
"OuterPartDist": 50,
"OuterOffset": 0,
"VerticalLayers": 0,
"VerticalOffset": 0,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
{ "AreaName": "Zone-C",
"Type": "ContaminatedArea_Static",
"TriggerType": "ContaminatedTrigger",
"Data": {
"Pos": [ 0, 0, 0 ],
"Radius": 150,
"PosHeight": 22,
"NegHeight": 2,
"InnerRingCount": 2,
"InnerPartDist": 50,
"OuterRingToggle": 1,
"OuterPartDist": 40,
"OuterOffset": 0,
"VerticalLayers": 0,
"VerticalOffset": 0,
"ParticleName": "graphics/particles/contaminated_area_gas_bigass"
},
"PlayerData": {
"AroundPartName": "graphics/particles/contaminated_area_gas_around",
"TinyPartName": "graphics/particles/contaminated_area_gas_around_tiny",
"PPERequesterType": "PPERequester_ContaminatedAreaTint"
}
},
Alles anzeigen
Und hier die Formel.
2 PI / ACOS(1 - (x^2 / 2 ∗ y^2))
Als Anmerkung:
"x^2" bedeutet hoch 2, was also "x²" bedeutet und wer es noch kennt, mit "x ∗ x" gerechnet wird 😅.
Ich werde daher in meinen Beispielen "²" verwenden, sieht halt auch schöner aus 🤣.
Mal so zum Vergleich "2 PI / ACOS(1 - (x² / 2 ∗ y²))" 😅🤣.
Nun müssen wir erst einmal wissen, was "x" und "y" darstellt.
x = Platz zwischen den "emitter" des zu berechnenden Ringes = "InnerPartDist" oder "OuterPartDist"
y = Radius des zu berechnenden Ringes
Nun haben wir das Problem, dass wir wissen müssen, wie wir unsere Zone aufbauen wollen,
da dies ja hier nicht automatisch passiert.
Dafür müssen wir uns die Zeilen "InnerRingCount" und "OuterRingToggle" anschauen.
Haben wir "OuterRingToggle" mit dem Wert "1" angegeben, besitzt unsere Zone schon mal einen Ring,
da wir damit, wie oben beschrieben, den äußeren Ring erlauben.
Wird "InnerRingCount" zusätzlich mit "1" angegeben, hätte unsere Zone also 2 Ringe,
einmal einen Außenring und einen inneren Ring.
Geben wir bei "InnerRingCount" 2 an, hätten wir dementsprechend 3 Ringe.
Nun wissen wir schon mal, wie wir das zu berücksichtigen haben, müssen aber herausfinden,
wie groß unsere jeweiligen Ringe sind, da mit "Radius" nur die Größe des äußeren Ringes angegeben wird.
Da sollte man aber nicht zu viel Angst haben, denn das ist tatsächlich simpel,
da wir nur unseren "Radius" durch unsere Anzahl der Ringe teilen müssen 😅🤣.
Unsere Formel hierfür sollte also lauten:
Radius / (InnerRingCount + 1)
Nehmen wir dafür das Beispiel "Radius" = 150 und "InnerRingCount" = 2,
sollte unsere Formel also wie folgt aussehen.
150 / 3 = 50
Dies wiederum bedeutet für uns, dass der innerste Ring einen "Radius" von 50,
der mittlere Ring einen "Radius" von 100 und der äußerste wieder unseren "Radius" von 150 hat.
Als Gegenbeispiel nehmen wir nun mal noch schnell "Radius" = 150 und "InnerRingCount" = 1,
was für uns also heißt
150 / 2 = 75
Somit hat also unser innerer Ring einen "Radius" von 75 und unser äußerer wieder den Wert 150.
Wichtig ist natürlich zu beachten, dass wenn "OuterRingToggle" mit "0" angegeben ist
und "InnerRingCount" mit beispielsweise "2", wir in diesem Falle nur 2 und nicht 3 Ringe haben.
In diesem Fall würden wir zwar immer noch mit 3 Ringen rechnen,
müssen dies aber bei der Berechnung der "emitter" berücksichtigen.
Aber weiter im Text und weiter mit dem Kopfzerbrechen 🤣, denn nun kommen wir wieder zu unserer Formel,
mit der wir die "emitter" berechnen.
Wir erinnern uns nochmal an die Formel "2 PI / ACOS(1 - (x² / 2 ∗ y²))"
und schauen uns zur not die Bohemia Version mit dem Rechenweg für "x" = 20 und "y" = 105 an.
2 PI / ACOS(1 - (20² / 2 ∗ 105²)) = 2 PI / ACOS(1 - (400 / 2 ∗ 11025)) = 2 PI / ACOS(1 - (400 / 22050)) = 2 PI / ACOS(1 - 0,01814059) = 2 PI / ACOS(0,98185941) = 2 PI / 0,190765318 = 32,93672756
Das ganze können wir aber etwas aufhübschen, was meiner Meinung nach
auch gleich etwas verständlicher aussieht.
2 PI / ACOS(1 - (20² / 2 ∗ 105²))
= 2 PI / ACOS(1 - (400 / 2 ∗ 11025))
= 2 PI / ACOS(1 - (400 / 22050))
= 2 PI / ACOS(1 - 0,01814059)
= 2 PI / ACOS(0,98185941)
= 2 PI / 0,190765318
= 32,93672756
Nun aber endlich zu dem worauf alle gewartet haben und wir alle gespannt sind,
wie berechnen wir nun diese blöden "emitter" 🤣.
Nein, Spaß.
Ich würde glaube ich auch lieber ein Eis essen, aber Respekt an alle, die es bis hier hingeschafft
und durchgehalten haben 😅.
Jetzt aber wirklich 😅.
Nehmen wir wieder unsere 3 Beispiele von oben, haben wir folgende und für uns wichtigen Werte nochmal in Kurzform
und zusätzlich die Anzahl und Größe der Ringe, die wir berechnen konnten.
Für Zone-A:
Radius = 60
InnerRingCount = 1
InnerPartDist = 20
OuterRingToggle = 1
OuterPartDist = 30
Anzahl Ringe = 2
Radius Ring 1 = 30
Radius Ring 2 = 60
Für Zone-B:
Radius = 100
InnerRingCount = 1
InnerPartDist = 50
OuterRingToggle = 1
OuterPartDist = 50
Anzahl Ringe = 2
Radius Ring 1 = 50
Radius Ring 2 = 100
Für Zone-C:
Radius = 150
InnerRingCount = 2
InnerPartDist = 50
OuterRingToggle = 1
OuterPartDist = 40
Anzahl Ringe = 3
Radius Ring 1 = 50
Radius Ring 2 = 100
Radius Ring 3 = 150
Nun können wir das ganze Wissen anwenden und unsere "emitter" auf den Ringen berechnen,
so wie unsere Gesamtanzahl an "emitter" für unsere Zone.
Dafür fangen wir wieder mit Zone-A an, bei welcher wir nun die Berechnung für jeden der beiden Ringe vornehmen müssen.
Also haben wir eine Berechnung für Ring 1 und eine für Ring 2.
Wichtig zu beachten ist hier aber, welcher Ring mit welchem "...PartDist" berechnet wird.
In unserem Bsp. ist Ring 1 der innere Ring und wird in diesem Fall mit dem Wert der "InnerPartDist" berechnet.
Ring 2 ist der äußere Ring und wird daher mit dem Wert der "OuterPartDist" berechnet.
Die Gleichungen dafür sehen also in Kurzer und Rechenweg Variante folgendermaßen aus.
Zone-A Ring 1 = 2 PI / ACOS(1 - (20² / 2 ∗ 30²))
2 PI / ACOS(1 - (20² / 2 ∗ 30²))
= 2 PI / ACOS(1 - (400 / 2 ∗ 900))
= 2 PI / ACOS(1 - (400 / 1800))
= 2 PI / ACOS(1 - 0,22222222)
= 2 PI / ACOS(0,77777778)
= 2 PI / 0,67967382
= 9,24441272
Zone-A Ring 2 = 2 PI / ACOS(1 - (30² / 2 ∗ 60²))
2 PI / ACOS(1 - (30² / 2 ∗ 60²))
= 2 PI / ACOS(1 - (900 / 2 ∗ 3600))
= 2 PI / ACOS(1 - (900 / 7200))
= 2 PI / ACOS(1 - 0,125)
= 2 PI / ACOS(0,875)
= 2 PI / 0,50536051
= 12,43307536
Nach dieser Rechnung und wenn wir alles richtig gerechnet haben,
haben wir die Werte 9,24441272 für den inneren
und 12,43307536 für den äußeren Ring.
Für unsere Anzahl benötigen wir allerdings nur die Zahl vor dem Komma.
Somit haben wir also nur noch die Werte 9 und 12, welche wir zusammenrechnen können.
9 + 12 = 21 + 1 = 22
Unsere Zone hat also 22 "emitter" und lässt nun noch die Frage offen, warum wir nochmal + 1 rechnen?
Das ist wieder relativ simpel, denn es gibt immer einen Mittelpunkt, welcher eben einen "emitter" besitzt.
Diesen müssen wir einfach immer hinzurechnen, auch wenn dieser glaube den Kohl nicht Fett macht 🤣.
Seid der 1.28 ist das Maximum an "emitter" auf 1000 pro Zone limitiert,
um die Serverperformance aufrechtzuerhalten.
Um eventuell die Frage zu klären, wie man "ACOS" anwendet, hier mal noch schnell ein visuelles Bsp.,
des Windows Taschenrechners. In meinem Fall ist es gerade Windows 11,
sollte aber unter Windows 10 nicht anders sein 😅.
Als Erstes müssen wir unseren Taschenrechner öffnen und ihn von "Standard" auf "Wissenschaftlich" umstellen.
Anschließend stellen wir ihn, wenn es nicht schon eingestellt ist, von "DEG" auf "RAD".
Jetzt geben wir unseren Wert ein. In diesem Bsp. ist es "0,5", gehen auf "Trigonometrie",
anschließend auf "2ⁿᵈ" und sehen unser "cos⁻¹", welches wir jetzt nur noch ausführen
um unser Ergebnis zu erhalten.
Und schon hätten wir auch den Ausflug zum Taschenrechner überstanden und kommen langsam zum Abschluss 😅.
Dafür machen wir jetzt nur noch unsere letzten Hausaufgaben und rechnen unsere Letzten beiden Zonen aus.
Um das Scrollen noch einmal zu ersparen, hier noch einmal unsere Werte.
Für Zone-B:
Radius = 100
InnerRingCount = 1
InnerPartDist = 50
OuterRingToggle = 1
OuterPartDist = 50
Anzahl Ringe = 2
Radius Ring 1 = 50
Radius Ring 2 = 100
Für Zone-C:
Radius = 150
InnerRingCount = 2
InnerPartDist = 50
OuterRingToggle = 1
OuterPartDist = 40
Anzahl Ringe = 3
Radius Ring 1 = 50
Radius Ring 2 = 100
Radius Ring 3 = 150
Nun noch schnell zu unseren Rechenaufgaben und wir sollten mit diesem Thema endlich durch sein 😅.
Zone-B Ring 1 = 2 PI / ACOS(1 - (50² / 2 ∗ 50²))
2 PI / ACOS(1 - (50² / 2 ∗ 50²))
= 2 PI / ACOS(1 - (2500 / 2 ∗ 2500))
= 2 PI / ACOS(1 - (2500 / 5000))
= 2 PI / ACOS(1 - 0,5)
= 2 PI / ACOS(0,5)
= 2 PI / 1,04719755
= 6,00000001
Zone-B Ring 2 = 2 PI / ACOS(1 - (50² / 2 ∗ 100²))
2 PI / ACOS(1 - (50² / 2 ∗ 100²))
= 2 PI / ACOS(1 - (2500 / 2 ∗ 10000))
= 2 PI / ACOS(1 - (2500 / 20000))
= 2 PI / ACOS(1 - 0,125)
= 2 PI / ACOS(0,875)
= 2 PI / 0,50536051
= 12,43307536
Somit ergibt sich also nach unserem oben erwähnten Bsp. die Werte für Ring 1 mit "6" und Ring 2 mit "12".
Was uns am Ende mit unserem Mittelpunkt auf 19 "emitter" kommen lässt.
Jetzt noch unser letztes Beispiel und die letzte Zone für heute.
Zone-C Ring 1 = 2 PI / ACOS(1 - (50² / 2 ∗ 50²))
2 PI / ACOS(1 - (50² / 2 ∗ 50²))
= 2 PI / ACOS(1 - (2500 / 2 ∗ 2500))
= 2 PI / ACOS(1 - (2500 / 5000))
= 2 PI / ACOS(1 - 0,5)
= 2 PI / ACOS(0,5)
= 2 PI / 1,04719755
= 6,00000001
Zone-C Ring 2 = 2 PI / ACOS(1 - (50² / 2 ∗ 100²))
2 PI / ACOS(1 - (50² / 2 ∗ 100²))
= 2 PI / ACOS(1 - (2500 / 2 ∗ 10000))
= 2 PI / ACOS(1 - (2500 / 20000))
= 2 PI / ACOS(1 - 0,125)
= 2 PI / ACOS(0,875)
= 2 PI / 0,50536051
= 12,43307536
Zone-C Ring 3 = 2 PI / ACOS(1 - (40² / 2 ∗ 150²))
2 PI / ACOS(1 - (40² / 2 ∗ 150²))
= 2 PI / ACOS(1 - (1600 / 2 ∗ 22500))
= 2 PI / ACOS(1 - (1600 / 45000))
= 2 PI / ACOS(1 - 0,03555556)
= 2 PI / ACOS(0,96444444)
= 2 PI / 0,2674632
= 23,49177497
Und auch hier gilt wieder das Zusammenrechnen unserer "emitter" auf jedem Ring und das Einbeziehen unseres Mittelpunktes.
Folgend haben wir also diesmal nicht 2, sondern 3 Ringe, was also folgendes bedeutet.
6 + 12 + 23 = 41 + 1 = 42
Und siehe da, wir haben eine Gesamtanzahl von 42 "emitter" in unserer Zone und endlich auch das Ende erreicht 😅🤣.
Wichtig wäre eventuell noch zu erwähnen, das nicht aufrundet wird, selbst wenn nach dem Komma eine 9 steht.
Haben wir also zum Beispiel einen Wert oder ein Ergebnis von "2,9", bleibt es bei der "2".
Ebenso wichtig ist es auch noch, unsere "VerticalLayers" Einstellung zu berücksichtigen.
Haben wir hier nur einen Layer, also den Wert "0" haben wir nur unsere 42 "emitter".
Geben wir allerdings einen Wert mit "1" an, haben wir natürlich die doppelte Anzahl,
da unsere Zone 2 Schichten übereinander hat und somit auf 84 kommt.
Das ganze geht natürlich immer so weiter und wir hätten bei einem "VerticalLayers" Wert von "2"
eben die 3-fache Anzahl an "emitter"
So, das sollte es glaube ich gewesen sein, ist ja nun doch ne ganze Menge zusammen gekommen.
War zwar anfangs etwas anders gedacht, aber ist man einmal dabei,
verliert man auch schnell mal die Größe eines solchen Textes 😅.
Wie gesagt hat es etwas länger gedauert, da ich mehrmals neu angefangen habe,
aber ich hoffe, es sei mir verziehen und genauso hoffe ich das es ausführlich genug ist,
um das ganze zu verstehen.
Sollten dennoch Rechenfehler oder Fragen auftreten oder auffallen,
dann natürlich wie immer gern Bescheid geben 😊.
Ich für meinen Teil hoffe, es war interessant genug,
bedanke mich wie immer für die Geduld,
Durchhaltevermögen und Zeit 👍.
Und natürlich freue ich mich schon, wenn wir uns beim nächsten Thema wieder sehen 😁.