Construction Set Skriptthread zum Construction Set

@Schmelz: Das ist genau der gleiche Script wie er ihn gepostet hat.

@ rojep: setWeather für sanften Übergang ins neue Wetter, forceWeather für sofortigen Wechsel.
 
  • Like
Reaktionen: Finkreghan
Vielen Dank für das verbesserte Script an Schmelz, beim schlichten abändern der befehle veränderte sich das Wetter tatsächlich nicht.
Aber auch ein Danke an Guldor, für die befehle.

Ich habe nun leider noch ein Problem.

Mit dem Script wird das Wetter zwar geändert, jedoch solange schnell hintereinander wie ich innerhalb der Trigger-Box stehe. Soll heißen am Himmel wechselt das Wetter alle 2 Frames vom Oblivion- zum Tamriel-Wetter und das Wetter das zuletzt aktiviert wurde bleibt bestehen wenn ich den Trigger-Bereich verlasse.

Man müsste doch irgendwie einbauen können, dass das Script nur ein einziges Mal durchläuft, solange ich innerhalb der Box bin ?
 
Code:
scn blablabla

short doonce

begin ontrigger

short status

if doonce == 0
     set doonce to 1
     if (status == 0)
          setclimate tamrielclimate
          set status to 1
     else
          setclimate obliviontestclimate
          set status to 0
     endif
endif

end
versuchs mal so
 
Das sollte so gehen:
Code:
scn name

short triggered
short state


Begin onTriggerActor player

if triggered
 return
endif
set triggered to 1
if state
 set state to 0
 forceWeather DefaultWeather 1
else
 set state to 1
 forceWeather OblivionDefault 1
endif
return

end


Begin GameMode

if triggered
 set triggered to 0
endif

end
 
Zuletzt bearbeitet:
Leider funktionieren diese Scripts bei mir auch nicht. Nach wie vor ein Flackern am Himmel und anschließend willkürliche Auswahl des Wetters.

mfg rojep
 
Das wird funktionieren (ist Diarhoe's nur angepasst):

Code:
scn Scriptname

short triggered
short state

Begin onTriggerActor player
if triggered == 0
    set triggered to 1
    if state
        set state to 0
        forceWeather DefaultWeather 1
    else
        set state to 1
        forceWeather OblivionDefault 1
    endif
endif
return
end

Begin GameMode
set triggered to 0
end

Edit.: Bemerkt, dass es noch eleganter geht
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Finkreghan
Ich hab auch mal ne Frage:

Das Script kommt auf ein Objekt und soll, sobald dieses einen NPC oder eine Kreatur trifft (es wird per Script bewegt), wie ein Pfeil in ihm stecken bleiben. (Und ihn töten)

edit: und es soll, wenn es auf eine Wand, oder den Boden trifft, normal nach Hawok runterfallen und liegen bleiben.
ist das etwa zu anspruchsvoll?
 
Wahrscheinlich schon. Ersteres kann ich mir noch vorstellen, indem du einen Trigger an der gleichen Position wie das Objekt verschiebst (bestmöglich besitzt das Objekt selbst sogar Triggerkollision). Falls das nicht funktioniert könntest du mal schauen, wie es in der Mod "Fearsome Magicka" (in deutscher Version auch hier zu finden) gemacht wurde. Wenn ich mich recht erinnere (aus dem Demovideo) gibt es dort Objekte, die auf NPCs zufliegen und bei Kontakt Schaden verursachen. Allerdings benutzt die Mod auch deutlich mehr Skriptpotential in Form von OBSE, Pluggy, ScreenEffects (nicht fürs Skripten relevant), RefStuff und ALGOHOL (weiß nicht, inwiefern genannte Plugins speziell für diesen Zauber benötigt werden).

Das zweite halte ich für unmöglich solange das Objekt nicht eigene Havokeigenschaften besitzt. Das zu Skripten wäre wirklich zu viel. Zu überprüfen, ob das Objekt gegen Wand, Gegenstand oder Boden prallt, könnte allerdings klappen, wenn du abfragst, ob es sichtbar ist ("getLOS"). Das dürfte allerdings auf Dauer an der Performance ziehen.
 
Das mit dem Triggern sollte klappen, muss ich mal probieren.
Das Objekt ist eigentlich ganz normal mit Havok, reicht es dann einfach das ändern der Position per Script zu unterbrechen. (Kehrt es dann von selbst zur Physik zurück?

Andere Sache: Das Objekt dreht sich im Kreis um den Spieler (immer mit der gleichen Seite nach vorne (setAngel z ang_z (= rpos (das ist die Position auf dem Kreis in Winkel) + 90)
Jetzt soll das Objekt sich noch um die eigene Achse drehen. (Hier muss ich ja die Position auf dem Kreis für die Änderung der y- und x-Winkel einrechnen, aber wie???)
 
Einfach im GameMode pro frame die rotation um eine bestimmte Konstante addieren? Falls dir das nicht helfen sollte, kopiere doch einfach das Script hier rein, so lässt es sich immer noch am einfachsten helfen.
 
Einfach im GameMode pro frame die rotation um eine bestimmte Konstante addieren?
Du musst dir das etwas anders vorstellen: Als Grundlage für die zweite (und dritte) Rotationsachse die du änderst, dient nicht wie du vielleicht denkst, das Objekt selbst, sondern das normale Koordinatensystem von Oblivion. Soll heißen, es macht einen Unterschied (in Bezug auf das Objekt), ob es Parallel zu einer Achse ist, oder nicht. Hierbei ist ja entscheidend, dass sich dieses Verhätniss ständig ändert.
Die Grundlage dieses Scriptes kommt vom Wiki, und f.fin1 übergibt der Mathlibrary den Kreispositionswinkel. f.fout und f.fout2 geben sinus und cosinus zurück.

Code:
ScriptName CirclingAroundThePlayerScript

short constantsset ; did we set the constants?

float rspeed ; in degrees/s
float hdist ; horizontal distance from the player
float rpos ; position on the circle
float mod_x ; positions relative to the player
float mod_y
float mod_z
float org_x ; position of the player
float org_y
float org_z
float ang_x ; rotation of the dagger
float ang_y
float ang_z

Begin GameMode

    ; setting up constants
    if constantsset == 0
        set rspeed       to  100 ; constant radial speed
        set mod_z        to 110 ; constant height
        set hdist        to 50 ; constant distance
        set constantsset to   1 ; done setting up the constants
    endif

    ; updating the position on the circle (rpos)
    set rpos to rpos + ( rspeed * getSecondsPassed )
    if rpos > 360
        set rpos to rpos - 360
    endif

    ; setting the mods, via the SinCosTan function
    set f.fin1 to rpos
    setStage f 15                ; SinCosTan(rpos) function call
    set mod_x to f.fout  * hdist ; sin(rpos) * hdist
    set mod_y to f.fout2 * hdist ; cos(rpos) * hdist

    ; getting the player's position
    set org_x to player.getPos X
    set org_y to player.getPos Y
    set org_z to player.getPos Z

    ; setting my own position
    set org_x to org_x + mod_x
    setPos X, org_x
    set org_y to org_y + mod_y
    setPos Y, org_y
    set org_z to org_z + mod_z
    setPos Z, org_z

[B]    ; setting my own z-rotation
    set ang_z to rpos + 90
    setAngle z ang_z

    ; setting my own y-rotation
    ;set ang_y to ...
    ;setAngle y ang_y

    ; setting my own x-rotation
    ;set ang_x to ...
    ;setAngle x ang_x[/B]

End

Das Fette ist der Entscheidende Teil.
Die z-Rotation sorgt dafür, dass immer die gleiche Stelle nach vorne zeigt.
Die y- und x-Rotationen müssen jetzt irgentwie in abhängigkeit von der Kreisposition geändert werden, sodass sie diese "Rolle" erzeugen.
Vielleicht hilft es zu wissen, dass bei den Winkeln 0 und 180 sowie 90 und 270, jeweils eine Rotation allein geändert werden muss, um diese Rotation zu erzeugen.
Müsste das dann nicht das Verhältnis von mod_y zu mod_x dasselbe sein, wie zwischen der Änderung von ang_y zu ang_x?
 
Die Math-library würde ich nur benutzen, wenn man OBSE nicht benutzen möchte. Ansonsten würde ich OBSE immer vorziehen, weil du dann in deinem eigenen code siehst, was wirklich durchgeführt wird (sin, cos, tan).

Die einfachste Variante wäre folgende, nämlich dass du diesen fettgedruckten Teil wieder annulierst indem du ihn "auskommerst".
Code:
        ;...
        rotate x, 50
        rotate y, 30
        rotate z, 70
        ;...
Die Werte kennst du natürlich beliebig anpassen.

Edit.: Ich versinke in Scham... rotate wird nicht dauerhaft ausgeführt. :oops:
Du kannst den Code also am Ende des Scripts dranhängen, obwohl ein errechnen und setzen der Winkel per setAngle wohl eleganter wäre... Dann köntest du sowas verwenden:

Code:
set ang_x to ang_x + getsecondspassed * 100     ;rotation on the x-axis per seconds, means 100°/s
set ang_y to ang_y + getsecondspassed * 40      ;rotation on the y-axis per seconds, means 40°/s
set ang_z to ang_z + getsecondspassed * 30      ;rotation on the z-axis per seconds, means 30°/s
setangle x ang_x
setangle y ang_y
setangle z ang_z
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Schmelz
Da ich die Library integriert hab, reicht ja der Hinweis, dass andere Mods die sie benötigen danach geladen und die .esm weggelassen werden muss.
Wenn man anständig dokumentiert, ist es auch kein Problem mit der Verständlichkeit des Scripts.
Was willst du denn erreichen, wenn du die Werte einmal festsetzts?
Es geht doch um eine füssige Rotation (also dauernde änderung der Winkel)
 
Habe es eben angepasst... Dachte rotate würde beim einmaligen aufrufen immer ausgeführt. Nimm lieber den zweiten Code, den ich unten drunter geschrieben habe. Dort kannst du eine flüssige Rotation einstellen. Eventuell kannst du noch die Bedingung abfangen, wenn winkel > 360 setze winkel auf 0 und wenn kleiner 0 setze winkel auf 360, nur um den Speicherbereich der float auf Dauer nicht zu sprengen.
 
Dann änderst du es halt in jedem Frame.

Btw. da ich mal was ähnliches (wahrscheinlich sogar das gleiche, angelehnt daran) erstellt habe... ich hatte meist das Gefühl, dass das Skript extrem langsam verläuft. Ich habe die Erfahrung gemacht, dass das Skript flüssiger läuft, wenn man die Code-Zeilen direkt in das Skript integriert.
 
Danke, aber ich glaube du hast das Problem noch nicht ganz verstanden...
Soweit war ich ja, mit dem Problem, dass der zweite Winkel den ich änder, nicht auf das System des Objekts angewandt wird, sondern auf das der Celle.
Somit müsseny- und x-Rotation davon abhänhig sein, wie sich das Objekt in der z-Rotation befindet, weil ich es so aussehen soll, als ob es sich um die eigene Achse drehen würde, diese Achse hatt aber mit den setAngle Befehlen nichts zu tun...

edit: @Diarrhoe: das ist in etwa das was dieser Teil bewirken soll, aber auch nur dieser Teil^^ (Ich kannte das was du da Verlinkt hast üprigens nicht)
 
Zuletzt bearbeitet: