22.01.2013, 10:44 | #1 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Einfacher Wetterwechsel (Bewölkung) im MP?
Hallo zusammen
Ich schon wieder (mit einer neuen Frage zu meinem Lieblingsthema Lokalität), sorry. Ich möchte einen ganz einfachen Wetterwechsel (Bewölkung) in meiner gehosteten MP-Mission bewirken. Hat jemand Erfahrung damit? Es gibt da ein paar Fragen, zu denen ich via Suche nichts genaues (häufig ist alles schwammig formuliert) gefunden habe. 1. Startwetter Zu Beginn meiner Mission soll das Wetter perfekt sein (klare Vollmondnacht) und sich auch nicht ändern. Deshalb habe ich beide Schiebregler (Akutell/Vorhersage) im Editor komplett an den rechten Rand geschoben. Da auch der Forecast-Regler keine Änderung zulässt, bleibt das Wetter für Host und Clients immer schön > richtig oder falsch? 2. SetOvercast An einem bestimmten Punkt in meiner Mission löst ein Auslöser (auf Grund einer wahrgewordenen PublicVariable) diverse Dinge aus. Neu möchte ich in diesem Auslöser auch eine Bewölkung (Ausschluss Mondlicht!) für Host und Clients einbauen. Den Befehl dazu habe ich im Arma-Wiki gefunden: Code:
300 setOvercast 0.8 Code:
If (!isServer) then {300 setOvercast 0.8}; Gesetzt der Fall, Punkt 2 konnte erledigt werden und innerhalb von ca. 5 Minuten ändert das Wetter bei allen Spielern auf bewölkt. Bleibt das nun bei allen so (oder hat hier der Forecast-Schiebregler noch irgend einen Einfluss)? Es tut mir leid, dass ich euch immer wieder mit solchen Lokalitätsfragen belästige. Das scheint einfach mein "Buch mit 7 Siegeln" zu sein (und man kann es alleine kaum testen, sonst würde ich es via trial und error versuchen). Danke für eure Hilfe |
22.01.2013, 18:55 | #2 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
Kein Problem, dafuer ist das Forum doch da Das Problem mit ArmA und dem Wetter ist das es lokal geregelt wird und somit eigentlich auf jedem Client etwas, oder auch voellig, anders ist. Ich habe dazu auch mal ein Script gebastelt, Day & Weather Script, um das Wetter simuliert auf jeden client synchron zu halten. Das Script setzt jedoch ein Wetter zu beginn und behaelt dieses die gesamte Mission ueber. Das ist richtig so, Der erste Wert mit dem aktuellen Wetter mach eigentlich nichts anderes als der Befehl 0 setOverCast x und der zwote Regler fuer die Vorhersage 3600 setOverCast x. Wobei ich jetzt nicht die genaue Zeit fuer den Wetterwechsel weiß, koennten auch 7200 sekunden oder weniger als 3600 sein. Um einen Wetterwechsel mitten im Spiel auf allen Clients zu vollziehen wuerde ich folgendermaßen vorgehen: 1. Im Editor wie du es schon gemacht hast dein Startwetter vorgeben, bei Vorhersage die selben Werte einstellen wie beim Startwetter, sollte im Normalfall dann auf allen Clients auch so eingestellt sein beim Missionsbeginn. 2. Einen Ausloeser mit bei aktivierung: Code:
WetterSyncen=true;publicvariable "WetterSyncen"; Code:
0=[]spawn{0 setOvercast 1;sleep 0.1;3600 setOvercast 1;0 setRain 1;sleep 0.1;3600 setRain 1}; Wenn du das Beispiel von mir anwendest sollte das Wetter fuer ein Stunde lang so bleiben. Der Regeler im Missionseditor hat dann keinen Einfluss mehr auf das Wetter. Mit dieser Methode aenderst du das allgemeine Wetter und den Regen, der Wind wird jedoch in diesem Beispiel nicht gesynct, sollte fuer deine Zwecke ja aber auch keine Rolle spielen. gruß hoschi |
23.01.2013, 09:12 | #3 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Hey Hoschi. Danke, das tönt ja vielversprechend.
Noch eine Frage zu Deinem Code aus Punkt 3: Ich würde gerne den Wetterwechsel langsam vollziehen (400 Sekunden = ca. 7 Minuten) und dann das Wetter bis zum Missionsende behalten (sagen wir sicherheitshalber ca. 3 Std.). Regen bräuchte ich nicht, könnte ich aber dank Deinem Code auch gleich für alle verhindern. Ich müsste also die Werte ein wenig anpassen, jedoch ohne den Codeaufbau zu verändern (siehe rote Markierungen im Code unten). Was mich dabei ein wenig unsicher macht, ist die Zeit des Wetterwechsels und die davon abhängige Sleep-Dauer. Gehe ich richtig in der Annahme, dass die Sleep-Dauer gleich gross (oder grösser) sein sollte, als die Zeit, die der Wetterwechsel benötigt? Eine solche Anpassung macht natürlich nur dann Sinn, wenn die 400 Sekunden für alle Clients in etwa gleich funktionieren (das sollte ja mehr oder weniger gegeben sein, da alle Clients in etwa versuchen dasselbe zu machen, oder?). Code:
0=[]spawn{400 setOvercast 0.65;sleep 410;10800 setOvercast 0.65;0 setRain 0;sleep 0.1;10800 setRain 0}; Nachtrag: Ich sehe gerade, dass der Regen hier ja auch erst nach dem vorherigen Sleep von 410 Sek. gesetzt wird. Ich möchte den Code aber nicht umkehren, da es sonst (sofern man Regen auf 1 setzt), gleich zu Beginn des Wetterwechsels - also wenn das Wetter noch schön ist - anfängt zu regnen. Man muss so natürlich in Kauf nehmen, dass es während der 400 Sekunden Wetterwechsel beim einen oder anderen Client evtl. kurz regnet (wobei der Wert setOvercast 0.65 noch keinen Regen bringen sollte, 1 hingegen schon). Geändert von Wolkenbeisser (23.01.2013 um 10:05 Uhr). Grund: Zusätzliche Bemerkungen |
23.01.2013, 18:29 | #4 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
korrekt, der Denkansatz von Dir ist da schon richtig. Die Sleep dauer muss etwas groeßer sein als der Befehl fuer den Wetterwechsel. Hierbei kann man auch einfach die Abfolge der Befehle aendern und noch eine While Schleife anfuegen um den Regen permanent zu unterdruecken. Die Abfolge sollte bei allen Clients die selbe sein, denn jeder Client fuehrt ja auch den selben Code aus. Code:
0=[]spawn{400 setOvercast 0.65;0 setRain 0;sleep 0.1;10800 setRain 0;sleep 402;10800 setOvercast 0.65;while {true} do {0 setrain 0;sleep 1}}; 1. Aendere das Wetter in 400 Sekunden auf den Wert 0.65. 2. Setze den Regen in 0 Sekunden auf den Wert 0. 3. Warte 0,1 Sekunden (um sicher zu gehen das die Befehle auch ausgefuehrt werden). 4. Setze den Regen in 10800 Sekunden auf den Wert 0, was den Regen fuer die Zeitspanne der Wetteraenderung Unterdruecken sollte. 5. Warte 402 Sekunden 6. Setze das Wetter in 10800 Sekunden auf den Wert 0.65, was das Wetter fuer den Rest der Spieldauer konstant halten sollte. 7. In einer While Schleife setze jede sekunde den Regen sofort auf 0. Somit wechselt das Wetter in ~7 Minuten auf den Wert 0.65 und der Regen wird permanent unterdrueckt, quasi jede Sekunde auf den Wert 0 gesetzt. Das sehe ich auch so. Waehrend dem Wechsel des Wetters von sagen wir 0 auf 1 kann es natuerlich zu Regenbildung durch die Engine kommen. Man koennte aber auch einfach von Anfang an ein Spawnscript laufen lassen was den Regen permanent unterdrueckt oder nur bis Ereignis x eintritt. Code:
0=[]spawn{x=true;while (x) do {0 setrain 0; sleep 1}} gruß hoschi Geändert von Moerderhoschi (23.01.2013 um 18:38 Uhr). |
23.01.2013, 23:14 | #5 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Danke für Deine ausführlichen Infos, Hoschi
Ich habe das von Dir genannte Beispiel genommen (das mit dem eingeschobenen setRain) und es funktioniert tadellos. Zumindest schon mal in einem Test mit mir als Host und einzigem Client. Wenn alles nach Plan läuft, werde ich die Mission mit dem Wetterwechsel Morgen Abend mit meinen Kumpels testen können. Die werden sich wundern, wieso ich mich ständig nach dem Wetter erkundige. Sofern ich hier nichts weiteres poste hat alles erwartungsgemäss geklappt. Danke nochmals allen Beteiligten und Grüsse aus der Schweiz (wo der Befehl '2 setOvercast 1' sehr häufig dann ausgeführt wird, wenn ich das Haus verlasse) |
24.01.2013, 11:57 | #6 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Es ist anzunehmen, dass sleep Zeiten bei den Clients unterschiedlich lang sein können. So würde ich für MP den Wetter-Takt beim Server/Host regeln und den jeweiligen Wetterbefehl mit publicVariable senden. Das hat auch den Vorteil, dass so zufälliges Wetter erstellt werden kann.
Beim Server/Host den "Wetterbefehl" als Text in in die globle Variable WetterNeu verfassen, und mit publicVariable an den Auslöser senden. z.B: Code:
WetterNeu = "400 setOvercast 0.65;0 setRain 0"; publicVariable "WetterNeu"; Code:
Auslöser: Achse A und B: 0 Aktivierung : Keiner | Mehrfach Bedingung : not isNil "WetterNeu" Bei Akt. : call compile WetterNeu; WetterNeu = NIL Hier noch ein Beispiel für begrenztes zufälliges Wetter: Code:
_wolken = format["%1 setOvercast %2;", floor((random 300)+200), floor((random 50)+50)/100]; _regen = format["%1 setRain %2;", floor((random 400)+300), floor((random 40)+10)/100]; WetterNeu = _wolken + _regen; publicVariable "WetterNeu"; Wolken: Zeitraum 200-500, Stärke 0,5 - 1,0 Regen : Zeitraum 300-700, Stärke 0,1 - 0,5 Geändert von Vienna (24.01.2013 um 13:46 Uhr). |
24.01.2013, 16:00 | #7 (permalink) |
Registriert seit: 05.11.2010
Ort: Schweiz
Beiträge: 297
|
Hi Vienna. Danke für Deine Infos. Betreffend unterschiedlicher Sleepzeiten: Ich gehe mal davon aus, dass wir hier von einer Abweichung von max. ein paar Sekunden reden, oder? Das Runterzählen der Sekunden - wenn dann einmal gestartet - sollte ja dann auf jeder Maschine ziemlich exakt die 400 Sekunden dauern (ich vermute hier wird die Systemuhr der jeweiligen Maschine verwendet). Ich denke, dass es hier also höchstens vor Zählbeginn (aus übermittlungstechnischen Gründen wie Lags und so), oder evtl. nachher zu leichten Verzögerungen kommen kann. Da es hier aber nur um einen Wetterwechsel geht, kann eine solche "Sleepungleichheit" evtl. in Kauf genommen werden, es sei denn ich liege komplett falsch mit meiner Annahme über die mögliche Abweichung. Dann bitte melden, danke. Trotzdem hast Du natürlich recht, dass bei Deiner Variante die Wetterzustände auf den Clients 'gleicher' sind. Je nach Art der zu übermittelnden Befehle kann das schon mal den Unterschied zwischen 'Leben' und 'Tod' eines Spielers ausmachen. |
24.01.2013, 18:29 | #8 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
Bei dieser Anforderung kommt es auf 1 Sekunde nicht an. Dieser Code bewirkt nur das innerhalb von 400 Sekunden das Wetter auf den Wert 0.65 gestellt wird. Was nach den 400 Sekunden passiert ist davon nicht mehr abgedeckt. Das Wetter wird sich wieder aendern und zwar auf jedem Client anders. Das selbe beim Regen, ein einfaches 0 setrain 0 ohne schleife die es permanent bei diesem Wert haelt ist zwar moeglich jedoch wenn das Wetter sich verschlechtert wird es trotzdem anfangen zu regnen. Diese Variante haelt das Wetter nicht konstant. Auch hier wird nicht der weitere Verlauf des Wetters beruecksichtigt so das nach der umstellung des Wetters und nach einer Zeit X wieder auf jedem Client wilkuehr herschen wird. Richtig, der Zeitunterschied ist hierbei so trivial so das es fuer deinen Anwendungszweck vollkommen vernachlaessigt werden kann. Das sehe ich anders. Teste das Beispiel von Vienna mal im Zeitraffer durch, ich hatte nach der kompletten ausfuehrung des Codes den Zeitraffer aktiviert und nach 15 Minuten immer unterschiedliches Wetter bei 3 Testlaeufen. Sobald die 400 sekunden abgelaufen sind wird das Wetter auf einen random Wert gesetzt (y setOvercast x). Bei 3 Versuchen hatte ich einen Overcast Wert von [0.19 | 0.05 | 0.72]. gruß hoschi |
24.01.2013, 21:20 | #9 (permalink) |
Registriert seit: 16.06.2009
Beiträge: 5
|
hi
nutz am besten das hier: Dynamic Weather Effects Script - Scripts - Armaholic Dynamic Weather Effects Script Einfach einzubauen, sehr gut zu konfigurieren und funzt einwandfrei im MP Sollte imho standard sein in allen Missionen |
25.01.2013, 02:19 | #10 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das Wetterprogramm von Armaholic ist sicher tadellos, aber es geht ja hier auch ums Programmieren solch einer Routine.
Ich gehe davon aus, dass man das Wetter über eine längere Missionsdauer steuern kann und nicht nur eine einmalige Wetteränderung haben will. Da sollte z.B. ein spät angesetzter Wolkenbruch bei allen Spielern gleichzeitig beginnen. Um annähernd überall gleiches Wetter im Spiel zu haben, ist es notwendig das Schlechtwetter auch wieder gezielt abklingen zu lassen. Der Empfänger-Auslöser ist simpel. Die Ereignis-Steuerung von Seiten des Host/Servers ist aufwendiger. Hier ein genauerer Ansatz für etwas unterschiedliches Wetter, als in meinen obigen Post. Die Spieler sollen sich ja nicht die Uhren nach dem Wetter stellen können. Code:
//Nur Server/Host! //Sonnenscheindauer (Schönwetter Voreinstellung im Editor) sleep ((random 300)+300); //Wolken ein _wolkenZeit = floor((random 300)+200); WetterNeu = format["%1 setOvercast %2;", _wolkenZeit, floor((random 50)+50)/100]; publicVariable "WetterNeu"; //Schlechtwetterdauer sleep (_wolkenZeit + 100 + random 200); //Wolken aus WetterNeu = "60 setOvercast 0;"; publicVariable "WetterNeu"; //Sonnenscheindauer sleep ((random 300)+600); //Wolken ein ... |
25.01.2013, 13:00 | #11 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Bis 60% Bewölkung gibt es keinen Regen! Test: 0 setOvercast 0.60; 0 setRain 1; Wer keinen automatischen Regen will, darf keine Bewölkung über 60% einstellen. Ein Zufallswert dafür könnte so aussehen: floor((random 20)+40)/100 Das ergibt eine Bewölkungsstärke zwischen 40 und 60% Die Dauer des Regens ist abhängig von der eingestellten Bewölkungsstärke. Dauerregen ist möglich mit: 0 setOvercast 1; 0 setRain 1; |
25.01.2013, 23:51 | #12 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
Es besteht dann aber immer noch die Problematik dass das Wetter sich wieder aendern kann, auch auf einen Wert ueber 0.60.
Man muss diesen Wert permanent erzwingen um einer Wetteraenderung vor zu beugen. Ich hatte beim testen immer den Fall das sich das Wetter wieder geaendert hat wenn man den Zusatand nicht permantent erzwingt. gruß hoschi Geändert von Moerderhoschi (26.01.2013 um 00:03 Uhr). |
26.01.2013, 13:14 | #13 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Das deckt sich nicht mit meinen Tests. Bei 0 setOvercast 0.60; 0 setRain 1; ist es durchgehend bewölkt ohne Regen, obwohl der Regen auf 100% eingestellt ist.
Eben so ist es bei 0 setOvercast 0; durchgehend sonnig und bei 0 setOvercast 1; 0 setRain 1; regnet es durchgehend. Sonst ist der Regen etwas "launiger". Er ist abhängig von der Wolkenstärke und tritt mit Zeitabständen auf. Getestet in Arma2 in der originalen letzten Version, ohne Zusatzprogramme. Laut Wiki dürfte es bei overcast bis 70% nicht regnen. http://community.bistudio.com/wiki/setRain Insgesamt sollte die Bewölkungsstärke bei den Spielern gleich sein. Regenzeiten werden bei unter 100% unterschiedlich sein. |
26.01.2013, 14:35 | #14 (permalink) |
Registriert seit: 02.07.2006
Ort: Kabul
Alter: 38
Beiträge: 2.666
|
Ich habe das ganze nocheinmal getestet mit dem Ergebnis dass das Wetter sich wieder einmal aendert.
Ich habe die Mission mit einem Overcast von 0.65 & Regen von 0 gestartet. Nach den 3 Sekunden wurde der OverCastForeCast von der Engine per random auf 1 gestellt. Dannach wurde mit dem Zeitraffer die Mission laufen gelassen bis die Spielzeit bei 60 Minuten angekommen ist. Es wurde eine Wetteraenderung von +0.07 auf ~0.722 festgestellt. D.h. Nach einer gewissen Zeit x veraendert sich das Wetter so stark das es zu Regen kommen kann! Je nachdem wie lange eine Mission dauert kann es also schon notwendig sein den Regen mit einer Schleife 1 setRain 0 zu unterdrucken wenn man ihn absolut nicht in der Mission haben will. Testmission ist im Anhang. gruß hoschi |
26.01.2013, 15:51 | #15 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Jetzt sehe ich das Problem! Es ist die automatische folgende Wettereinstellung. Dem ist aber leicht entgegen zu wirken. Kopiere in deinen Testauslöser folgende Wettersteurung:
Code:
temp = 0 spawn { 3 setOvercast 0.65; 0 setRain 0; sleep 4; 3600 setOvercast 0.64 } Damit ist es erforderlich nach Ende der Wetterwandelzeit gleich einen solchen zweiten Wetter-Befehl nachzusenden. Geändert von Vienna (26.01.2013 um 16:47 Uhr). |
26.01.2013, 22:43 | #17 (permalink) |
Registriert seit: 12.07.2004
Ort: Wien
Beiträge: 1.917
|
Korrekt, darin liegt schon die Lösung. Ich habe dein "diesen Wert permanent erzwingen" als kurzzeitiges Takten missverstanden, weil ich der Meinung war, dass ein eingestelltes Wetter bis zu einem neuen Wetterbefehl erhalten bleibt. Meine Meinung entstand durch den Umstand, weil bei einem im Editor auf 100% eingestelltes Schönwetter über die gesamte Spielzeit erhalten bleibt. Das gilt auch für ein dort 100% eingestelltes Schlechtwetter.
Wer im MP für alle Spieler gleiches Wetter haben will, muss das Wetter über die gesamte Spielzeit synchronisieren. Ausgenommen 100% Schön- oder Schlechtwettereinstellung im Editor. |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
Themen-Optionen | |
Ansicht | |
|
|