No Rain / No Snow Boxen mit dem CK erstellen

E

Ehemaliger Benutzer

Gast
So, da jetzt das CK schon eine Zeit lang released ist, beginne ich mal meinen schon früher geplanten Thread zu folgendem Thema:


Da es mir schon immer sauer aufgestoßen ist, dass Regen und Schnee einfach so durch feste Objekte, die Kollision besitzen durchgeht ( Das stört schon arg ), habe ich dazu einen Thread im Allgemeinen Forum erstellt. Dieses Problem ist auch bei anderen früheren Bethesda Spielen bekannt.

Es kam die Idee auf Boxen zu erstellen, die die Regen, bzw. Schnee Textur einfach transparent machen würden. Somit würde die Engine unangetastet bleiben und auch kein
Performanceeinbruch entstehen.
Der Thread dazu ist hier:
http://forum.scharesoft.de/showthre...e-Fehlanzeige-oder-und-Bethesda-vs-EA-Ubisoft


Weiß jemand wie man das umsetzen könnte? Mein Wissen übers modding beschränkt sich lediglich auf 3D, Landschaftsgestaltung und AI...

grüße
Wombatz
 
Regen und Schnee, wird da nicht einfach ein Filter über das Bild gelegt? Von daher gibt es keine Kollision dafür. Merkt man auch wenn man z.B. schwimmt und dann den den Kopf nur etwas unter Wasser steckt, dann schneits auch Unterwasser.
 
  • Like
Reaktionen: 1 Person
Hm, und eine Layer-Box erstellen, die dann bestimmte Teile von diesem Filter befreit? Oder ist das ein Shader, der immer und überall entweder an oder aus ist?
 
Japp, Regen etc. is einfach n FX, der vor deiner Nase hängt. Kann man gut erkennen, wenn man bei Regen die FreeCam anschaltet und ein wenig vom Char wegfliegt, dann verschwindet der Regen.
 
  • Like
Reaktionen: 1 Person
Und diesen FX für bestimmte Bereiche zu deaktivieren geht nicht?

Vllt. indem man ganz winzige Wetterzonen einbaut, in denen kein Regen, etc. vorkommt?
Oder man einfach das FX vom Player weg verschiebt?

Hat da jemand eine Ahnung?
 
Oder könnte man einfach eine Layer-Box erstellen mit einem Skript, das wie folgt aussieht: (z.B.)

disable FX...


oder irgendwie so, Skripter, gibts da etwas?


Grüße
Wombatz
 
Und diesen FX für bestimmte Bereiche zu deaktivieren geht nicht?

Vllt. indem man ganz winzige Wetterzonen einbaut, in denen kein Regen, etc. vorkommt?

Die Regionen sind immer mind. eine Zelle groß und die Darstellung im Editor eh so abstrakt, dass es ein absolutes Glücksspiel wäre, einem bestimmten Objekt eine Region zuzuweisen. Außerdem passiert der Wetterwechsel nicht von 0 auf 100, das dauert immer etwas, selbst beim kleinsten Wert.

Oder könnte man einfach eine Layer-Box erstellen mit einem Skript, das wie folgt aussieht: (z.B.)

disable FX...

Kann sein, dann würde aber der komplette Regen FX verschwinden.
 
  • Like
Reaktionen: 1 Person
Die Regionen sind immer mind. eine Zelle groß und die Darstellung im Editor eh so abstrakt, dass es ein absolutes Glücksspiel wäre, einem bestimmten Objekt eine Region zuzuweisen. Außerdem passiert der Wetterwechsel nicht von 0 auf 100, das dauert immer etwas, selbst beim kleinsten Wert.

Ich hatte es schon geahnt, kenne es ja aus Oblivion. Naja, ein Versuch war es wert.

Kann sein, dann würde aber der komplette Regen FX verschwinden.

Das wäre das, was ich erreichen wollte, man betritt die Box und ...ZACK... Regen oder Schnee sind disabled (keine Übergänge wie bei Wetterzonen) und wenn man
die Box mit dem Script verlässt ...ZACK... wieder Regen oder Schnee.

Geht das nicht? Weiß jemand dazu was?
 
Außerdem passiert der Wetterwechsel nicht von 0 auf 100, das dauert immer etwas, selbst beim kleinsten Wert.
Wenn ich die Script-Referenz korrekt verstehe könnte man das Wetter mit ForceActive() unmittelbar ändern. (http://www.creationkit.com/ForceActive_-_Weather)


Kann sein, dann würde aber der komplette Regen FX verschwinden.
Mir ist dazu evtl. ein Workaround eingefallen:

1. Vor jeder Öffnung, aus der man nach draußen schauen kann ein FX_RainAndMistBeamNoGlow platzieren und auf disable setzen (http://www.creationkit.com/Disable_-_ObjectReference)
2. Wenn der Player die Box betritt und es es regnet, dann dieses RegenFX ausschalten (ka. was das für ein objekt sein könnte) (oder gleich das Wetter komplett mittels ForceActive() auf bewölkt umstellen) (siehe http://www.creationkit.com/Weather_Script)
3. die FX_RainAndMistBeamNoGlow aktivieren
4. Wenn Player die Box verlässt, dann wieder RegenFX aktivieren (bzw. Wetter auf Regen stellen) und die FX_RainAndMistBeamNoGlow Objekte wieder deaktivieren

Hab mal (ohne die Logik zu programmieren) ein paar der FX_RainAndMistBeamNoGlow Objekte vor eine überdachte Brücke plaziert und das sieht im CK eigentlich nicht schlecht aus:

(naja auf dem Screenshot ists nicht so hübsch wie animiert^^)

Jetzt muss das nur noch mit dem Script funktionieren^^


Was haltet ihr von der Idee?
 
  • Like
Reaktionen: 1 Person
Code:
Scriptname WetterTriggerbox extends ObjectReference

Weather Property w auto
Weather CurW

Event OnTriggerEnter(ObjectReference Player)

if(player == game.getplayer())
  curW = weather.getcurrentweather()
  if(curw != w)
    w.forceactive()
  endif
endif

EndEvent

Event OnTriggerLeave(ObjectReference Player)

if(curW)
  curW.forceactive()
endif

EndEvent

Der Property muss man noch den gewünschten Wetter-Typ zuweisen. Der Trigger kommt dann auf die Stelle, bei der das gewünschte Wetter sein soll.
Das betrifft jedoch die ganze Zelle und kann zu seltsamen Nebeneffekten kommen (Regen-Sound ist weg; wenn man im Haus zum Fenster hinausschaut, sieht man z.B. kein Regen, etc.).

EDIT: Ein wenig spät.
 
  • Like
Reaktionen: 1 Person
Danke erstmal; jetzt wird das Thema ja doch interessant. Ist ein guter Vorschlag, wenn man das dann noch mit dem richtigen Sound kombiniert (kann man das nicht auch im Skript machen?) sollte das ganz gut gehen.


Was mir gerade noch eingefallen ist: Per Skript, wenn der Spieler die Box betritt die Regentextur ändern (geht das?), auf einfach eine durchsichtige Textur. Soweit ich weiß gibt es Mods, die die Schneeflocken auf High-Res machen, dann müsste man doch auch die Textur auf transparent setzen können, oder ist das ein Trugschluss?


Der Workaround ist zwar klasse, aber sehr viel Arbeit :D
Wenns aber nur so geht, müssen wir da dann eben arbeiten :-D
 
Der Workaround hat einen Denkfehler: Es regnet ja nicht immer, sondern nur mit einer gewissen Wahrscheinlichkeit. Also z.B. SkyrimXYClimate = 20% Regenwahrscheinlichkeit, 20% Nebel, 20 % Sonnenschein etc. Das Script würde unabähngig davon IMMER anspringen, also auch bei Sonnenschein. Dazu kommt noch, dass jede Region ein eigenes Klima mit eigenen Wahrscheinlichkeitswerten hat.

Wombatz: Wenn Du den Regen komplett ausschaltest, ist das doch ein größerer Atmosphäre Killer als vorher. Man müsste den Regen schon noch außerhalb der Überdachung sehen können, sonst wäre so ein Projekt nutzlos.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person
Der Workaround hat einen Denkfehler: Es regnet ja nicht immer, sondern nur mit einer gewissen Wahrscheinlichkeit. Also z.B. SkyrimXYClimate = 20% Regenwahrscheinlichkeit, 20% Nebel, 20 % Sonnenschein etc. Das Script würde unabähngig davon IMMER anspringen, also auch bei Sonnenschein. Dazu kommt noch, dass jede Region ein eigenes Klima mit eigenen Wahrscheinlichkeitswerten hat.

Wenn man das derzeitige Wetter mit GetCurrentWeather() abruft und das mit GetClassification() == 2 (rainy) prüft, ob es gerade regnet, dann kann man doch darauf reagieren oder irre ich mich da?

Wombatz: Wenn Du den Regen komplett ausschaltest, ist das doch ein größerer Atmosphäre Killer als vorher. Man müsste den Regen schon noch außerhalb der Überdachung sehen können, sonst wäre so ein Projekt nutzlos.

Deshalb würde ich ja vor jedem "Fenster" ein FX_RainAndMistBeamNoGlow platzieren und das je nachdem ein- oder ausblenden (siehe Screenshot meines letzten Posts). Wenn du rausschaust, dann sieht das so aus, als würde es regnen...
 
  • Like
Reaktionen: 1 Person
Der Workaround hat einen Denkfehler: Es regnet ja nicht immer, sondern nur mit einer gewissen Wahrscheinlichkeit. Also z.B. SkyrimXYClimate = 20% Regenwahrscheinlichkeit, 20% Nebel, 20 % Sonnenschein etc. Das Script würde unabähngig davon IMMER anspringen, also auch bei Sonnenschein. Dazu kommt noch, dass jede Region ein eigenes Klima mit eigenen Wahrscheinlichkeitswerten hat.

Wombatz: Wenn Du den Regen komplett ausschaltest, ist das doch ein größerer Atmosphäre Killer als vorher. Man müsste den Regen schon noch außerhalb der Überdachung sehen können, sonst wäre so ein Projekt nutzlos.

Ja, das wird wahrscheinlich nur mit azraelbs FX_RainAndMistBeamNoGlow funktionieren und dem Skript.
Entweder man killt den Regen ganz, indem man in der Triggerbox die Regentextur (Auch ein FX hat eine Textur, sonst würde man es nnicht sehen) transparent macht/setzt... und gleichzeitig die FX_RainAndMistBeamNoGlow vor den Fenstern/Öffnungen aktiviert,

Oder man lässt bei Betreten der Triggerbox das Wetter schlagartig mit den von azraelb vorgeschlagenen Befehlen auf bewölkt ändern und aktiviert wieder die FX_RainAndMistBeamNoGlow vor den Fenstern/Öffnungen.
Bei dieser Methode müssen wir allerdings auch die Soundeffekte des prasselnden Regens und evtl. des Donners sowie die Lichteffekte von Blitzen auch noch zusätzlich zum bewölkten Wetter irgendwie enablen (Regen vor dem Fenster ohne Sound, oder dass das Gewitter plötzlich aufhört, es aber trotzdem vor dem Fenster regnet ist doch auch irgendwie seltsam, oder? :D ).
Das dürfte dann schon einiges an Arbeit werden. Bei der ersten Methode hat man das nicht, vorrausgesetzt sie funktioniert...

Was meint ihr dazu?
 
Zuletzt bearbeitet von einem Moderator:
Man müsste in meinem Skript oben nicht viel verändern, damit es so funktioniert, wie azraelb es vorgeschlagen hat:

Code:
Scriptname WetterTriggerbox extends ObjectReference

Weather Property w auto
Weather CurW

ObjectReference Property fx1 auto
ObjectReference Property fx2 auto
ObjectReference Property fx3 auto
; für jedes FX eine Property


Event OnTriggerEnter(ObjectReference Player)

if(player == game.getplayer())
  curW = weather.getcurrentweather()
  if(curW.getclassification() == 2)
    if(curW != w)
       fx1.enable()
       fx2.enable()
       fx3.enable()
       w.forceactive()
    endif
  endif
endif

EndEvent

Event OnTriggerLeave(ObjectReference Player)

if(curW) && (player == game.getplayer())
  fx1.disable()
  fx2.disable()
  fx3.disable()
  curW.forceactive()
endif

EndEvent

Ist aber sehr umständlich. Man muss für jeden Ort die FX platzieren und in den Properties eintragen. Für einzelne Orte jedoch durchaus machbar.
 
  • Like
Reaktionen: 1 Person
Und was ist bei deinem Skript mit den oben genannten Problemen? Bei Gewitter noch Blitze sichtbar/Donner hörbar, Regensounds, etc...?
Ist das automatisch so (eigentlich ja nicht, weil Wetter auf bewölkt gestellt wird, oder ?) ? Oder ist es schon im Skript drin? Wie fügt man es ein?
 
Wenn man das derzeitige Wetter mit GetCurrentWeather() abruft und das mit GetClassification() == 2 (rainy) prüft, ob es gerade regnet, dann kann man doch darauf reagieren oder irre ich mich da?

Das klingt logisch, könnte klappen. Es gibt übrigens mehrere Wetterarten, die Regen enthalten, die müssten also alle geprüft werden.

Und was ist bei deinem Skript mit den oben genannten Problemen? Bei Gewitter noch Blitze sichtbar/Donner hörbar, Regensounds, etc...?

Das sollte kein Problem sein, Donner etc. sind Bestandteil der Weather Datei aber unabhängig vom Regen FX. Man müsste also eine eigene Weather Datei erstellen, die sich von "rainyXY" nur durch den fehlenden Regen FX unterscheidet, die die Sounds aber noch enthält. Das habe ich schon selber gemacht, ist kein Problem. Einfach "rainyXY" duplizieren und bei FX "none" auswählen, fertig is das Regenwetter ohne Regen.
 
  • Like
Reaktionen: 1 Person
Mensch, das ist ja klasse :)

Da das so dann realisierbar wäre, wie sähe das Endprodukt aus? Das fertige Skript und was man sonst noch so braucht. Ich fasse mal zusammen:

Das Skript mit den beiden Befehlen GetCurrentWeather()zum derzeitigen Wetter abrufen und mit GetClassification() == 2 (rainy) prüft, ob es gerade regnet, und das für mehrere Wettertypen.
Den eigenen Wettertyp, der alles enthällt außer dem RegenFX und eine Location im Spiel :D

Und wie ist das dann mit dem was du gesagt hast. Da es mehrere Wettertypen gibt, die Regen enthalten müsste man jeden duplizieren und das FX ausschalten und das im Skript checken lassen?
Wäre ja seltsam, wenns ganz leicht regnet und auf einmal schüttet es und donnert es :D
 
Mensch, das ist ja klasse :)

Da das so dann realisierbar wäre, wie sähe das Endprodukt aus? Das fertige Skript und was man sonst noch so braucht. Ich fasse mal zusammen:

Das Skript mit den beiden Befehlen GetCurrentWeather()zum derzeitigen Wetter abrufen und mit GetClassification() == 2 (rainy) prüft, ob es gerade regnet, und das für mehrere Wettertypen.
Den eigenen Wettertyp, der alles enthällt außer dem RegenFX und eine Location im Spiel :D

Und wie ist das dann mit dem was du gesagt hast. Da es mehrere Wettertypen gibt, die Regen enthalten müsste man jeden duplizieren und das FX ausschalten und das im Skript checken lassen?
Wäre ja seltsam, wenns ganz leicht regnet und auf einmal schüttet es und donnert es :D

Das duplizierte Wetter ohne Regen, wäre dann das, das durch das Script getriggert wird. Also ja, wenn man es 100 % glaubwürdig machen wollen würde, müsste man auch da mehrere machen und jeweils dem Original zuordnen (es gibt z.B. Regen mit und ohne Wind, mit und ohne Gewitter etc.).

Aber ich würde mich nicht zu früh freuen.

WENN das alles funktioniert, wäre es immer noch ein ***** voll Arbeit. Wir sprechen hier von einem umfangreichen Script, das mit hunderten Objekten im Tamriel Worldspace verknüpft werden müsste. Die müsste man erstmal finden, d.h. die Map auswendig kennen etc. ich glaube nicht, dass diese Mod jemals in zufriedenstellender Form erscheint, lasse mich aber gerne eines besseren belehren ;-)
 
  • Like
Reaktionen: 1 Person
Das klingt logisch, könnte klappen. Es gibt übrigens mehrere Wetterarten, die Regen enthalten, die müssten also alle geprüft werden.

Sicher, dass das so ist? GetClassification() liefert nämlich nur folgende Werte zurück:
Return Value

-1: No classification
0: Pleasant
1: Cloudy
2: Rainy
3: Snow


Deshalb habe ich eigentlich vermutet, dass jedem einzelnen (Regen)Wetter die Classification 2 (=Rainy) zugeordnet ist.

Wenn das so ist, dann kann man das so handeln ohne rießige If-Else Zweige zu basteln...: (nicht erschrecken, die Hälfte des Codes sind Kommentare^^)
edit: Wenn nicht, dann sollte das trotzdem so funktionieren, nur dass man dann auch das Array durchläuft und die einzelnen Wetter prüft, wenn es nicht regnet...

Code:
; WICHTIG: Die beiden Arrys müssen in der selben Reihenfolge befüllt werden!
; Beispiel: Wenn RainWeathers[0] = "Starker Regen" ist, dann muss RainWeathersNoFx[0] auch "Starker Regen NoFx" sein!
Weather[] Property RainWeathers Auto
Weather[] Property RainWeathersNoFx Auto

; Gibt true zurück, wenn das CurrentWeather im Array PossibleActiveWeathers enthalten ist und geändert wurde
bool Function ChangeWeather(Weather CurrentWeather, Weather[] PossibleActiveWeathers, Weather[] PossibleWeathersToChange)  
  int i = 0
  While (i < PossibleActiveWeathers.length)
    If (PossibleActiveWeathers[i] == CurrentWeather)
      PossibleWeathersToChange[i].ForceActive()
      return true
    ElseIf (i < PossibleActiveWeathers.length -1)
      i++  ; Wenn Wetter noch nicht gefunden und noch weitere Wetter im Array übrig, dann prüfe nächstes Wetter
    Else
      return false
      ; Das Regenwetter ist nicht bekannt -> irgendwie auf Fehler reagieren
    EndIf
  EndWhile  
EndFunction

Event OnTriggerEnter(ObjectReference akActionRef)
  ;  ToDo: Prüfen, ob der der Player die Triggerbox betreten hat 
  ; @Kahmul Code: müsste hier die ObjectReference nicht zu einem Actor gecastet werden, damit man das mit game.getPlayer vergleichen kann?

  Weather CurrentWeather = GetCurrentWeather()
  ; Wenn CurrentWeather Regenwetter ist, dann das entsprechende NoFXWeather aktivieren
  If (CurrentWeather.GetClassification() == 2)
    If (ChangeWeather(CurrentWeather, RainWeathers, RainWeathersNoFx) == true)
      ; Wetter wurde auf entsprechendes NoFxWetter geändert  -  ToDo: RainBeamNoGlow Objekte... aktivieren
    Else
      ; Das Regenwetter ist nicht bekannt -> Keine Änderung durch die Wetter-Triggerbox (oder irgendwie auf Fehler reagieren...)
    EndIf
  EndIf
EndEvent

Event OnTriggerLeave(ObjectReference akActionRef)
  ;  ToDo: Prüfen, ob der der Player die Triggerbox betreten hat
  ; @Kahmul Code: müsste hier die ObjectReference nicht zu einem Actor gecastet werden, damit man das mit game.getPlayer vergleichen kann?
  
  Weather CurrentWeather = GetCurrentWeather()
  ; Wenn CurrentWeather Regenwetter ist, dann das entsprechende VanillaWeather aktivieren
  If (CurrentWeather.GetClassification() == 2)
    If (ChangeWeather(CurrentWeather, RainWeathersNoFx, RainWeathers) == true)
      ; NoFxWetter wurde auf entsprechendes  VanillaWetter geändert  -  ToDo: RainBeamNoGlow Objekte... deaktivieren
    Else
      ; Das Regenwetter ist nicht bekannt -> Keine Änderung durch die Wetter-Triggerbox (oder irgendwie auf Fehler reagieren...)
    EndIf
  EndIf  
EndEvent

Aber auch wenn das funktioniert, sehe ich noch ein Problem im Übergang, denn man kann zwar mit GetCurrentWeatherTransition() abfragen wie weit (%) der Übergang eines Wetters zu einem anderen vortgeschritten ist, und das evtl. auch durch verschieden starke RainBeamFx Objekte simulieren, aber ich sehe momentan keine Möglichkeit das Wetter beim betreten/verlassen der Box wieder auf den entsprechenden Übergang zu setzten

=> Wenn der Übergang fast abgeschlossen ist und man anschließend eine Box betritt / verlässt, dann hat man wieder ein Wetter mit 0% Übergang
Das ist allerdings reine Spekulation, hab eigentlich keine Ahnung wie das mit dem Übergang genau funktioniert (ich hab mir ja noch nichtmal den Wetterdialog/Wetterobjekt im CK angesehen) meine Infos habe ich alle nur aus der Script-Referenz gezogen/abgeleitet...
 
Zuletzt bearbeitet:
  • Like
Reaktionen: 1 Person