Construction Set Der Scriptthread

Welcher Befehl fragt denn jeden Frame ab?

Ich glaube, dass du einen entscheidenden Teil des Scriptens in Morrowind noch nicht verstanden hast, JEDES Script wird in jedem Frame erneut ausgehürt. Deswegen sind in vielen Scripten die MenuMode oder doOnce-BAfragen so wichtig. Du brauchst also keinen besondern Befehl. Das Script könnte in etwa so aussehen:

Code:
begin my_gegenstand_beweg_script

float posx
float posy
float posz

if (MenuMode == 1 )
  return
endif

;Position des Spielers speichern
set posx to Player->GetPos, X
set posy to Player->GetPos, Y
set posz to Player->GetPos, Z

;konstante Entfernung zum Spieler eingeben
set posx to posx + 256
set posy to posy +256
set posz to posz + 0

;Gegenstand auf neue Position setzten
SetPos, X, posx
SetPos, Y, posy
SetPos, Z, posz

end
 
Man muß dabei natürlich erwähnen, dass diese Form des Scripts nur innerhalb einer Zelle funktioniert, bzw. nur im Exterior. Bei Zellwechseln durch eine LoadDoor kommt der Activator erstmal nicht mit.

Auch etwaige Drehungen und Richtungsänderungen des Spielers werden so erst einmal nicht berücksichtigt, das Objekt würde stur an seiner relativen Position bleiben, egal in welche Richtung der Spieler geht. Nehmen wir an, der Spieler geht vorwärts nach Norden und das Objekt wäre "links" von ihm... würde er sich nun umdrehen, und auf dem gleichen Weg vorwärts nach Süden gehen, wäre das Objekt immer noch auf seiner Bahn... nur dann eben vom Spieler aus nicht mehr links, sondern rechts...

Keine Ahnung ob irgendwas von meinen Gedankengängen überhaupt Relevanz für diese Anforderung hat... aber falls ja, wird wird es doch wesentlich komplexer als mit einer simplen GetPos/SetPos Abfrage.
 
Keine Ahnung ob irgendwas von meinen Gedankengängen überhaupt Relevanz für diese Anforderung hat... aber falls ja, wird wird es doch wesentlich komplexer als mit einer simplen GetPos/SetPos Abfrage.

Im Prinzip schon, man muss nur die Blickrichtung ermitteln und ein wenig Trogonmetrie betreiben. Da die Reihenentwicklung von Sinus und Cosinus kein Problem mit der Scriptsprache ist und ich auch eine Lösung für die Blickrichtung habe (mit PlaceAtPC und ein bisschen mehr Trigonometrie), könnte man das noch immer so machen.

Am Zellenwechsel arbeite ich gerade für meine Adventskalendermod ;)
 
Ich hab ja auch nicht gesagt, dass es nicht geht... es wird halt nur ein ziemliches Monsterscript und kein 15-Zeiler :-D
 
Angenommen ich wollte so ein script machen, dass dem spieler beispielsweise einen trank an den gürtel "klebt", oder waffen auf den rücken schnallt, würde das dann ingame mikrolags haben? Also immer so hinterher-ruckeln, wenn mans aus der dritten person guckt? Oder wäre das flüssig?
Wenn jeden frame abgefragt wird darf es doch nicht ruckeln?

EDIT: Und wegen der drehung: Gibt es keinen setRot oder setAng befehl?
 
hey!
ich habe einen script für ein bett erstellt. man wird angewiesen, sich auszuruhen, weil man eine sehr lange seefahrt beginnt. sobald das bett aktiviert wird, soll sich der bildschirm ins komplette schwarz verdunkeln und dann soll die nachricht "5 wochen später" erscheinen. wenn man auf "ok" drück, wird man an seinen neuen standpunkt (immer noch in der schiffskabine, aber schon weit draußen auf dem meer) teleportiert und es soll sich der bildschirm wieder erhellen. das habe ich in diesem script versucht, aber es funktioniert nur bis zum fadeout. es wird dunkel, aber es bleiben die teleportation und die nachricht aus. ich hab wieder mal 0 ahnung, was daran falsch gescriptet sein soll. guckt euch das bitte mal an:

begin bedScript

float timer
short state

if ( OnActivate == 1 )
if ( GetJournalIndex "P_4:mondschein" >= 10 )
if ( GetJournalIndex "P_4:mondschein" < 15 )
set timer to ( timer + GetSecondsPassed )
if ( state == 0 )
fadeout, 4
set state to 1
endif
endif
endif
endif

if ( timer >= 4 )
if ( state == 1 )
messagebox "Fünf Wochen später" "OK"
set state to 2
endif
endif

if ( state == 2 )
player->PositionCell 4186 3963 15500 0 "Geistermeer, Elf-Skerring, Kabine"
fadein, 4
set state to 3
endif

end
 
Hi, ich habe noch 2 Fragen :roll:

also erstemal das kürzere: hattet ihr auch schonmal das problem, dass morrowind einfach abstürzt, wenn ihr eine bestimmte zelle lädt? ich habe eine zelle erstell, aber die habe ich schon seit etwa 2 monaten. und man konnte bis jetzt immer ungehindert durch eine tür in diese zelle gelangen, aber jetzt stürzt sie jedes mal ab. das letzte, was man wahrnimmt, bevor es abstürzt, ist das geräusch der tür. wolte wisen, ob ihr das kennt und was das problem ist

und 2:

ich habe einen script erstellt, dessen sinn es ist, dass man sich nachdem man in einer bestimmten neuen zelle angekommen ist nicht mehr bewegen kann, bis sein gefährte nachkommt (in diesem fall wird er nicht mit in die höhle teleportiert, sondern durch "gals arethi höhle" ersetzt), der einen dann selbst anspricht. während des gesprächs wird man wieder fähig gemacht, sich zu bewegen. der script wurde einem zusammenhanglosen activator zugewiesen.

begin M1_FirstGreetingScript

float timer
short state

if ( state == 0 )
"gals arethi höhle"->disable
endif

if ( GetPCCell "Mondscheinhöhle, Frostige Ebene" )
if ( state == 0 )
set state to 1
DisablePlayerControls
endif
endif

if ( state == 1 )
Set timer to ( timer + GetSecondsPassed )
endif

if ( state == 1 )
if ( timer > 3 )
"gals arethi höhle"->enable
set state to 3
endif
endif

if ( state == 3 )
if ( timer > 4 )
"gals arethi höhle"->forcegreeting
set state to 4
endif
endif

end

thx 4 answers
 
Ich habe mal eine Frage...
Wie kann ich Musik in z.B. Interior Gebieten Musik einfügen???
Und wie kann ich die Musik dann laufen lassen ohne das die Erkundungs Musik weiter läuft???
Ich hoffe ihr könnt mir weiter helfen... ;)
 
Ich habe mal eine Frage...
Wie kann ich Musik in z.B. Interior Gebieten Musik einfügen???
Und wie kann ich die Musik dann laufen lassen ohne das die Erkundungs Musik weiter läuft???
Ich hoffe ihr könnt mir weiter helfen... ;)

StreamMusic, "Musik.mp3"

Spielt die angegebene Musik als Hintergrundmusik. Die Musikdatei muss sich im Morrowind-Unterordner \Data Files\Music\ befinden. Diese Musik wird durch andere eintretende Musikstücke unterbrochen (z.B. Kampfmusik).
 
  • Like
Reaktionen: ZeRo
Hi, ich habe noch 2 Fragen :roll:

also erstemal das kürzere: hattet ihr auch schonmal das problem, dass morrowind einfach abstürzt, wenn ihr eine bestimmte zelle lädt? ich habe eine zelle erstell, aber die habe ich schon seit etwa 2 monaten. und man konnte bis jetzt immer ungehindert durch eine tür in diese zelle gelangen, aber jetzt stürzt sie jedes mal ab. das letzte, was man wahrnimmt, bevor es abstürzt, ist das geräusch der tür. wolte wisen, ob ihr das kennt und was das problem ist

und 2:

ich habe einen script erstellt, dessen sinn es ist, dass man sich nachdem man in einer bestimmten neuen zelle angekommen ist nicht mehr bewegen kann, bis sein gefährte nachkommt (in diesem fall wird er nicht mit in die höhle teleportiert, sondern durch "gals arethi höhle" ersetzt), der einen dann selbst anspricht. während des gesprächs wird man wieder fähig gemacht, sich zu bewegen. der script wurde einem zusammenhanglosen activator zugewiesen.

begin M1_FirstGreetingScript

float timer
short state

if ( state == 0 )
"gals arethi höhle"->disable
endif

if ( GetPCCell "Mondscheinhöhle, Frostige Ebene" )
if ( state == 0 )
set state to 1
DisablePlayerControls
endif
endif

if ( state == 1 )
Set timer to ( timer + GetSecondsPassed )
endif

if ( state == 1 )
if ( timer > 3 )
"gals arethi höhle"->enable
set state to 3
endif
endif

if ( state == 3 )
if ( timer > 4 )
"gals arethi höhle"->forcegreeting
set state to 4
endif
endif

end

thx 4 answers
Bei der ersten Frage:

überprüfe alle Items in der zu betretenden Zelle - also alles, was nicht normal oder besser gesagt Standard ist. Solche kommentarlosen crashes können sich überall verstecken, z.B. durch fehlerhafte Meshes, schmutzige Scripts mit Endlosschleifen, fehlerhafte Sounds... was auch immer. du mußt dich nur erinnern, was du alles gemacht hast, seit es das letzte Mal ging und das dann nacheinander ausschliessen - jedenfalls wenn das "Warnings.txt" nichts verwertbares enthält.

Zu deiner zweiten Frage... ähm, was ist eigentlich die zweite Frage? :p

Ich rate mal: dein Script macht alles mögliche, aber nicht das, was es soll? Schau dir deinen Timer genau an... du wirst vermutlich schnell selbst merken, warum das nicht funktionieren kann:

Code:
if ( [COLOR="Magenta"][B]state == 1[/B][/COLOR] )
  Set timer to ( timer + GetSecondsPassed )
endif
;)
 
okay, thx erstmal.

also, bei meinem ersten problem muss ich mal gucken, ob da was nicht stimmt in nem script weil ich in der zelle keine neuen sounds/meshes benutze. ich kreiere allgemein keine meshes, da mir das zu aufwändig ist^^

und beim 2.
bis zum punkt, dass gals arethi nachkommt klappt alles, aber danach passiert rein gar nichts. er spricht einen einfach nicht an.
heißt das, dass der timer auhört zu zählen, sobald die voraussetzung nicht mehr erfüllt ist? das wusste ich nicht. woraus sich allerdings ne neue frage ergibt: wenn ich jetzt
if ( state >= 1 )
Set timer to ( timer + GetSecondsPassed )
endif draus mache, fängt er dann nicht unendlich oft an, zu zählen?
 
wenn ich jetzt
if ( state >= 1 )
Set timer to ( timer + GetSecondsPassed )
endif draus mache, fängt er dann nicht unendlich oft an, zu zählen?
Jup, das würde er. Hast du richtig erkannt. Nur ist das gar kein Problem, wenn man die letzte Bedingung minimal abwandelt.

Code:
if ( timer > 4 )
 "gals arethi höhle"->forcegreeting
 set state to [B][COLOR="Magenta"]-1[/COLOR][/B]
endif
;)

Andererseits frage ich mich, warum dieses Script eigentlich auf einem Activator liegt, wo es doch viel sinnvoller auf der NPC selbst liegen könnte. Spart eine Referenz ein. Oder hat die NPC noch ein eigenes Script?
 
what? da seh ich etz nicht durch. wieso jetzt erst nach dem force greeting?

if ( state == 1 )
Set timer to ( timer + GetSecondsPassed )
endif

if ( state == 1 )
if ( timer > 3 )
"gals arethi höhle"->enable
set state to 3
endif
endif

if ( state == 3 )
if ( timer > 4 )
"gals arethi höhle"->forcegreeting
set state to 4
endif
endif

abgesehen davon, dass ich noch nie wusste, dass es auch negative variablen gibt^^, denke ich, dass das iwie keinen sinn macht, weil es ja auch noch den abschnitt mit set state to 3 gibt.

also: was ist etz eig mit set state to -1 gemeint? stellt er den wert um einen wert runter?
 
StreamMusic, "Musik.mp3"

Spielt die angegebene Musik als Hintergrundmusik. Die Musikdatei muss sich im Morrowind-Unterordner \Data Files\Music\ befinden. Diese Musik wird durch andere eintretende Musikstücke unterbrochen (z.B. Kampfmusik).

Ok, das gleiche wollte ich auch. Die Musikdatei die ich nutzen will heißt Greensleeves_ und befindet sich im Music Ordner. Gespielt soll die Music in dem Pu ... in dem Freudenhaus in Suran ^^ Der Script sieht bei mir gerade so aus:

Code:
Begin Greensleeves

if ( GetPCCell "Suran, Deseles Haus der irdischen Freuden" == 1 )
    StreamMusic, "Greensleeves_"
endif

end Greensleeves

Ich denke ich aheb alles richtig gemacht, doch im Spiel ist rein gar keine Veränderung zu spüren :(

Und ja, ich hab die Lautsprecher an, und auch nicht die Musik ausgestellt ^^
 
Salve nochmals,

entschuldigt bitte den Doppelpost doch ich habe ein neues kleines Problem bei dem sich diesmal aber sicher schnell eine Lösung finden wird. Also folgendes:
Durch meinen unglaublichen Römischen Genius bin ich auf die Idee gekommen den Mesh der Hellebarde für ein Licht zu benutzen, den Radius auf 0 stellen damit es nicht leuchtet und einer Wache in die Hand zu drücken. Ok, den mesh hab ich schon so verwurstet das er schön in der Hand der Wache ist. Jetzt brauche ich nurnoch diese torch_infinitive_time dings da, nur eben auf 24 Stunden bezogen ^^
Das kann mann doch bestimmt Scripten und den Script dann der Hellebarde aufs Auge drücken, oder ?

Ihr seid da die Profis, wie soll ich da vorgehen ? :lol:
 
Tach Leute,
wie ihr warscheinlich bemerkt mein erster Beitrag, also bitte noch nicht köpfen falls ich i-was falsch mache^^
1. Ich wollte mir jetzt nicht die ganzen 87 Seiten durchlesen um zu gucken ob es das schon gibt...
2. Vermutlich braucht man einen Script um bestimmten NPCs (Wachen) zu Befehlen irgendwo zu patroullieren oder stehen zu bleiben und keinen durchzulassen.
3. Tja so einen bräuchte ich.

Danke im vorraus

Edit: Schon passiert, falscher TES Teil :p
 
Zuletzt bearbeitet:
Hallo zusammen,

ich nutze gerade eine Zugbrücken-Ressource, die im mit gelieferten Plug-In an einem platzierten Schalter für die Zugbrücke folgendes Skript aufweist:

PHP:
Begin PL1
float timer
If (OnActivate == 1)
if ("Imp_PontLevis".state == 0 )
set timer to ( timer + GetSecondsPassed )
"Imp_PontLevis"->playgroup "Idle2",0
set "Imp_PontLevis".state to 1
playgroup "Idle2",0
Set State To 1
endif
if ("Imp_PontLevis".state == 2 )
"Imp_PontLevis"->playgroup "Idle4",0
set "Imp_PontLevis".state to 3
playgroup "Idle4",0
"Imp_PontLevis"->Playsound3DVP "Pont_Levis" 1.0 1.0
Set State To 3
endif
endif
if ("Imp_PontLevis".state == 1 )
set timer to ( timer + GetSecondsPassed )
if ( timer >= 2 )
"Imp_PontLevis"->playgroup "Idle3",0
set "Imp_PontLevis".state to 2
playgroup "Idle3",0
Set State To 2
set timer to 0
return
endif
endif
if ("Imp_PontLevis".state == 3 )
set timer to ( timer + GetSecondsPassed )
if ( timer >= 2 )
"Imp_PontLevis"->playgroup "Idle",0
set "Imp_PontLevis".state to 0
playgroup "Idle",0
"Imp_PontLevis"->Playsound3DVP "Pont_Levis" 1.0 1.0
Set State To 0
set timer to 0
return
endif
endif
 
End PL1

Tante Edit hat folgende Frage:

Da der Activator ja persisten sein muss, ich jedoch ein zweite Zugbrücke einbauen will, die ebenfalls gleichzeitig durch dieses Hebel-Skript angesprochen werden soll, weiss ich jetzt nicht genau, wie ich jetzt vorgehen muss. Nochmal den Activator Imp-PontLevis in die Zelle zu setzen, bringt nichts, da nur einer der Aktivatoren angesprochen wird, wenn ich den Hebel betätige. Ich habe also nochmal einen Activator mit gleicher Mesh als Imp_PontLevis1 eingebaut.
Wie sähe jetzt das Skript aus, wenn ich jetzt Imp_PontLevis und ImpPontLevis1 gleichzeitig mit dem Skript betätigen will?

*Nochmal Tante Edit*

Ich habs jetzt doch noch geschafft, gleichzeitig Imp_pontLevis und ImpPontLevis1 gleichzeitig zum laufen zu bringen mit einem modifizierten Script. Also hat sich dieses Problem jetzt auch von selbst gelöst.
 
Zuletzt bearbeitet: