Construction Set Skriptthread zum Construction Set

Okay, sind zwar vielleicht blöde Fragen, da ich ziemlicher Frischling bei der Scripterei bin, aber:

a) Du hast die ForceSubtitleFlag auf 1 gesetzt. Hat der Char schon Subtitles? Oder dürfte sich das Script nicht dran stören wenn er keine hat?

b) Brauchst Du in
Let Timer := DROrdHQ07YrmoRef.SayTo Player aaDROrdHQ07YrmoKrevakTalk2 1
wirklich den Verweis auf die Ref des sprechenden Chars, wenn Du das Script auf den NSC legst?

Sollte da nicht
PHP:
Set Timer to SayTo Player...
auch tun?
 
Ich habe ein neues Problem. :(

Es werden keine Musikstücke abgespielt.
Sie befinden sich jedoch korrekt im Data/Musik/DRsCalenad-Ordner und haben auch die korrekte Benennung. Statt der Musik ertönt nur wieder die normale Vanillamusik.

PHP:
scn aaDROrdzzMusikQuestskript

Short ToggleGiven
Short Toggle
;0	=	Musik aktiv
;1	=	Musik inaktiv
Short Insel					;Die momentane Insel
;0	=	Nicht Calenad
;1	=	Graufels / Graufelsburg
;2	=	Schwarzfels
;3	=	Rotfels
;4	=	Blutfels
;5	=	Donnerfels / Donnerfelsburg
;6	=	Grünfels / Grünfelsburg
;7	=	Yrmos Insel
;8	=	Specials
Short InselPrevious			;Die vorherige Insel
Short MusikReihenfolge			;Das momentane Lied
Short MusikReihenfolgePrev		;Speichert das vorherige Lied
Float MusikTimer				;Dauer des Lieds

Begin GameMode

;###################################
;####Vergabe des Umschaltgerätes####
;###################################
If ( ToggleGiven == 0 )
	Set ToggleGiven To 1
	Player.AddItem aaDROrdzzMusikToggle 1
Endif

If ( Toggle == 1 )
	Return
Endif	
;###################################
;#########Inseldefinition###########
;###################################	
If ( Insel != InselPrevious )
	Player.PrintToConsole "Calenad - Musik - Insel == %.0f" Insel
	Player.PrintToConsole "Calenad - Musik - InselPrevious == %.0f" InselPrevious
	Set InselPrevious To Insel
Endif
If ( Player.IsInInterior == 0 )	
	If ( Player.GetInWorldspace aaDROrdHQGraufels == 1 )
		Set Insel To 1
	Elseif ( Player.GetInWorldspace aaDROrdHQGraufelsFestung == 1 )
		Set Insel To 1
	Elseif ( Player.GetInWorldspace aaDROrdHQSchwarzfels == 1 )
		Set Insel To 2
	Elseif ( Player.GetInWorldspace aaDROrdHQRotfels == 1 )
		Set Insel To 3
	Elseif ( Player.GetInWorldspace aaDROrdHQYrmoWelt == 1 )
		Set Insel To 7
	Elseif ( Player.GetInWorldspace aaDROrdNQBlutfels == 1 )
		Set Insel To 4
	Elseif ( Player.GetInWorldspace aaDROrdNQDonnerfels == 1 )
		Set Insel To 5
	Elseif ( Player.GetInWorldspace aaDROrdNQDonnerfelsBurg == 1 )
		Set Insel To 5
	Elseif ( Player.GetInWorldspace aaDROrdNQGruenfels == 1 )
		Set Insel To 6
	Elseif ( Player.GetInWorldspace aaDROrdNQGruenfelsBurg == 1 )
		Set Insel To 6
	Else
		Set Insel To 0
	Endif
Elseif ( Player.IsInInterior == 1 )
	;Specials
Endif
	
;###################################
;##########Musik abspielen##########
;###################################
If ( Insel == 0 )
	Return
Elseif ( Insel == 1 )
	If ( MusikTimer > 0 )
		Set MusikTimer To ( MusikTimer - GetSecondsPassed )
	Else
		If ( MusikReihenfolge == MusikReihenfolgePrev )
			Set MusikReihenfolge To ( rand 1 4 )
			StreamMusic random 		;Default-Fixer
			Return
		Else
			If ( MusikReihenfolge == 1 )
				Set MusikTimer To 158
				PrintToConsole "Calenad - Musik - Graufels - Musik = %.0f" MusikReihenfolge
				PrintToConsole "Calenad - Musik - Graufels - MusikP = %.0f" MusikReihenfolgePrev
				Set MusikReihenfolgePrev To MusikReihenfolge
				StreamMusic "Data\Music\DRsCalenad\Graufels1.mp3"
			Elseif ( MusikReihenfolge == 2 )
				Set MusikTimer To 152
				PrintToConsole "Calenad - Musik - Graufels - Musik = %.0f" MusikReihenfolge
				PrintToConsole "Calenad - Musik - Graufels - MusikP = %.0f" MusikReihenfolgePrev
				Set MusikReihenfolgePrev To MusikReihenfolge
				StreamMusic "Data\Music\DRsCalenad\Graufels2.mp3"
			Elseif ( MusikReihenfolge == 3 )
				Set MusikTimer To 135
				PrintToConsole "Calenad - Musik - Graufels - Musik = %.0f" MusikReihenfolge
				PrintToConsole "Calenad - Musik - Graufels - MusikP = %.0f" MusikReihenfolgePrev
				Set MusikReihenfolgePrev To MusikReihenfolge
				StreamMusic "Data\Music\DRsCalenad\Graufels3.mp3"
			Elseif ( MusikReihenfolge == 4 )
				Set MusikTimer To 155
				PrintToConsole "Calenad - Musik - Graufels - Musik = %.0f" MusikReihenfolge
				PrintToConsole "Calenad - Musik - Graufels - MusikP = %.0f" MusikReihenfolgePrev
				Set MusikReihenfolgePrev To MusikReihenfolge
				StreamMusic "Data\Music\DRsCalenad\Graufels4.mp3"
			Endif
		Endif
	Endif
Endif
End
 
Lies dir mal die Anmerkungen zu den Funktionen durch. Da findet man oft den Grund warum ein Script nicht läuft:
http://cs.elderscrolls.com/index.php/StreamMusic

Ein paar Ansatzpunkte:

StreamMusic works fine in cells with the music type set to either "Dungeon" or "Public" When used in a "Default" cell, StreamMusic only restarts the current track.
Bei der Worldspace-Data kannst du die Zellen eines WS einstellen

If you want to stream specific tracks in specific cells of your own mod, relying on StreamMusic alone is not a good approach, because many users will have either SoundCommands installed, or Enhanced Music Controls, or Better Music System, or even a combination of them. The best approach is to use OBSE function IsPluginInstalled to detect which of these plugins are installed, and then use the appropriate commands to start your track. There are tutorials about how to do this (see the two linked articles below).

Hier kannst du zwei scripts schreiben. Einen mit StreamMusic und einen für Soundcommands
 
Habs hinbekommen. Danke.

Jetzt gleich die nächste Frage.
Ich möchte eine OBSE-Abfrage machen.
Ob man OBSE installiert hat und wenn ja, welche Version.
Problem? Ich möchte den Spieler nicht zubomben damit.

Gibt es eine Möglichkeit, eine Variable nach dem NEUSTART des Spiels zu resetten.
Sodass die Nachricht nur 1x pro Spielsession kommt. Begin onLoad für das ganze Spiel quasi.
 
Es gibt "getGameRestarted" und "getOBSEVersion". Dummerweise sind es beides OBSE-Befehle, sodass du ohnehin OBSE benötigst, um sie auszuführen. Aber wenn ich mich richtig erinnere, werden Plug-Ins, die OBSE benötigen sowieso nicht mitgeladen, wenn Oblivion ohne OBSE gestartet wird.
 
Frage an euch Experten: Gibt es eine Möglichkeit per Script einen statischen Gegenstand zum "flackern" zu bringen. Was ich damit meine ist den Gegenstand in regelmäßigen (oder auch unregelmäßigen) Abständen für ein halbe Sekunde quasi "auszublenden", so daß sich der Spieler fragt "war da eben was? hat sich das Ding jetzt grad bewegt?", ohne daß der Gegenstand für eine längere Zeit mal da und wieder nicht da ist. Der Effekt den ich mir vorstelle soll den Spieler verunsichert lassen ob er seiner eigenen Wahrnehmung trauen kann, oder ob er sich vielleicht nur was einbildet.
 
Dafür gibts "enable" und "disable". Das Skript müsste in etwa so aussehen:
Code:
scn name

short disabled
float timer
float Zeit


Begin onLoad

set disabled to getDisabled

end


Begin GameMode

set timer to timer+getSecondsPassed
if timer < Zeit
  return
endif

if disabled
  enable
  set disabled to 0
  set Zeit to 15+10*getRandomPercent/100  ;setzt die Zeit, in der das Objekt sichtbar ist auf einen Wert zwischen 15 und 25 Sekunden
else
  disable
  set disabled to 1
  set Zeit to 0.4+0.4*getRandomPercent/100  ;setzt die Zeit, in der das Objekt ausgeblendet ist auf einen Wert zwischen 0.4 und 0.8 Sekunden
endif

set timer to 0

end
 
Ich brauch nochmal eure Hilfe.
Ich habe es geschafft, meinem Begleiter eine Tanz-Animation über ein Topic ausführen zu lassen. Ich möchte es noch ein wenig verfeinern, weiß aber noch nicht wie.

1. sie soll solange tanzen, wie die Musik läuft. Die Musik ist zur Zeit ca 1/2 Minute länger als ihre kf-Anim
2. die Musik soll stoppen, wenn man sie während der Tanz-Anim anspricht. Im Moment hört sie bei Ansprache auf zu tanzen, die Musik läuft aber bis zum Schluss weiter.
3. ich habe ihr ein Tanzkleid zugewiesen, das sie beim Tanzen tragen soll über den Skriptbefehl "NPCRef.equipItem Tanzkleid", und zwar steht es im Result-Skript-Fenster bei den Dialogen. Sie zieht es aber nur kurz an, nach einer Sekunde hat sie wieder ihr altes Kleid an. Wie erreiche ich es, dass sie dieses Kleid während der gesamten Animation trägt?
 
  • Like
Reaktionen: Harvald
Vermutlich handelt es sich um eine geloopte Animation. Was Du brauchst ist eine mit Anfang und Ende, da könnte man dann auch gleich einen Sound-String mit einbauen, so dass die Musik automatisch von der kf gestartet wird. Damit wären alle deine Probleme gelöst. Doch mit Hausmitteln geht das nicht, das geht nur mit einem 3d-Programm.
Man könnte den Loop so oft hintereinander lopieren, bis die gewünschte Tanzlänge erreicht ist.

Falls ich jetzt nicht noch tausend Tanzschritte animieren muss, sondern nur deine kf anpassen, dann kann ich das schon schnell machen. Schick mir die Anim einfach zu und das Musikstück am Besten auch.

Zu den Klamotten. Die NPC sind manchmal recht eigenwillig in der Wahl ihrer Klamotten - ist eben wie bei den Menschen auch. Wer nur einen Rock besitzt, behält den auf der Strasse auch an und zieht sich nicht nackt aus. Nimm ihr einfach die andere Klamotte solange weg, dann gibts nichts mehr zum Umziehen. :lol:

Ich weiss nicht genau weshalb die Engine diese Sperenzchen macht, könnte aber daran liegen, dass die wertigeren Klamotten Priorität haben, sollten mehrere zur Auswahl stehen.
Mach doch mal das Tanzkleid attraktiver. Richtig teuer, mit Verzauberungen und was weiss ich noch alles - vielleicht hilft´s was. :)
 
  • Like
Reaktionen: Harvald
Guten Morgen

Ist es möglich einen Gegenstand aus dem Inventar per Script an eine Wand zu hängen. Und es ggf. auch wieder wegzunehmen. (Einen Bilderrahmen zum Beispiel)

3. ich habe ihr ein Tanzkleid zugewiesen, das sie beim Tanzen tragen soll über den Skriptbefehl "NPCRef.equipItem Tanzkleid", und zwar steht es im Result-Skript-Fenster bei den Dialogen. Sie zieht es aber nur kurz an, nach einer Sekunde hat sie wieder ihr altes Kleid an. Wie erreiche ich es, dass sie dieses Kleid während der gesamten Animation trägt?

Sollte das mit dem teurer machen nicht funktionieren wäre eine recht sichere Methode den Kleidercontainer mit beginn der Animation zu leeren (alles ausser dem Tanzkleid). Bei Ende der Animation weißt du dem Container die entsprechenden Kleidungs/Rüstungsteile wieder zu und lässt sie den Npc wieder anziehen. Ist zwar mehr Schreibarbeit aber ein recht sicherer Weg einen Kleidungswechsel zu vermeiden. Ich kann dir nur leider dazu kein Script geben da ich mich grade selber nach langer Pause wieder in das Scripten einarbeite. Ich weiß immo nur das diese Möglichkeit funktioniert.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Arielle 1000
Nicht wirklich.
An der Wand bzw. die Wand selbst müsste ein Activator sein den man anklicken kann, im CS müsstest Du den Bilderrahmen disabled an der Wand positionieren. Wenn Spieler mit Bilderrahmen-Item im Inventar die Wand aktiviert kann der Bilderrahmen-Activator enabled und das Item aus dem Inventar entfernt werden und wenn Spieler den Bilderrahmen-Aktivator an der Wand aktiviert müsste er disabled und dem Spieler wieder ein Bilderrahmen-Item ins Inventar gegeben werden. Das ist natürlich wenig flexibel, weil es nur erlaubt an vorgesehenen Stellen Bilder aufzuhängen. Die hängen dann aber ordentlich.

Eine andere Möglichkeit wäre, dem Bilderrahmen-Item ein Script anzuhängen das bei Drop einen Bilderrahmen-Activator in die Welt setzt und das Item selbst disabled. An dem Activator könnte ein Positionierungs-Script hängen welches den Spieler beim Aktivieren des Bilderrahmens verschiedene Aktionen auswählen lässt um den Bilderrahmen exakt zu positionieren oder wieder abzuhängen:
"Höher", "Tiefer", "Vor", "Zurück", "nach links schieben", "nach rechts schieben", "drehe links rum", "drehe rechts rum", "einsammeln".
Nachteil ist, das das Bild wahrscheinlich in der Luft schwebt bis Spieler es ordentlich platziert hat und vermutlich bis dahin ein Hindernis in der Welt darstellt an dem man hängenbleibt. Ausserdem könnte der Bilderrahmen-Aktivator auf diese Weise unerreichbar werden wenn man ihn durch eine Wand schiebt.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Thayja
Hallo

Eine andere Möglichkeit wäre, dem Bilderrahmen-Item ein Script anzuhängen das bei Drop einen Bilderrahmen-Activator in die Welt setzt und das Item selbst disabled. An dem Activator könnte ein Positionierungs-Script hängen welches den Spieler beim Aktivieren des Bilderrahmens verschiedene Aktionen auswählen lässt um den Bilderrahmen exakt zu positionieren oder wieder abzuhängen:
"Höher", "Tiefer", "Vor", "Zurück", "nach links schieben", "nach rechts schieben", "drehe links rum", "drehe rechts rum", "einsammeln".
Nachteil ist, das das Bild wahrscheinlich in der Luft schwebt bis Spieler es ordentlich platziert hat und vermutlich bis dahin ein Hindernis in der Welt darstellt an dem man hängenbleibt. Ausserdem könnte der Bilderrahmen-Aktivator auf diese Weise unerreichbar werden wenn man ihn durch eine Wand schiebt.

Ähm Frage warum das Bild disablen ? ist der Aktivator selbst sichtbar? Und kann man dem Aktivator nicht eine Collision verpassen damit er nicht durch eine wand hindurchgeschoben werden kann?
 
Naja, ich rede da von zwei Items:
Das welches der Spieler im Inventar herumträgt und das andere, welches den aufgehängten Bilderrahmen in der Welt darstellt.
Sobald der Spieler sein Inventar-Objekt in die Welt dropped wird der dazugehörige Aktivator in der Zelle platziert: Somit ist das Inventar-Objekt nun überflüssig (brauchst es ja nicht zwei mal sichtbar in der Welt) und kann disabled werden. Agiert wird nun mit dem Aktivator den man anklicken und positionieren kann (ohne ihn dabei automatisch aufzunehmen). Ein Aktivator-Objekt "fällt" auch nicht runter und "bleibt in der Luft stehen" - anders als ein misc-Item welches automatisch solange fällt bis es auf eine Oberfläche trifft.
Soll das Objekt doch wieder ins Inventar aufgenommen werden wird es einfach disabled und dem Spieler ein tragbares Item ins Inventar gepackt, sobald der Spieler die entsprechende Auswahl getroffen hat.

Kollisionseigenschaften (Havok) hat das Aktivator-Bild wahrscheinlich bereits- nur prüft die Engine diese Kollisionen nicht automatisch zwischen Objekten wie Statics und Activators sondern nur zwischen Kreaturen/NPCs und diesen Objekten. Lediglich bei "ObjectID.Fall" wird die Bodenhöhe getestet, aber das nützt ja überhaupt nichts bei einem Bild an der Wand wo Du vermutlich nicht einmal vorher weisst, in welcher Richtung die Wand liegt bzw. wohin die sichtbare Fläche der Wand zeigt.

Damit das Bilderrahmen-Objekt möglichst nicht in bzw. hinter der Wand verschwindet könntest Du nach dem Verschieben eine Rückfrage machen ("Bild so lassen", "weiter verschieben" "wieder einsammeln") oder das Wieder-Einsammeln automatisch geschehen lassen sobald der Spieler einen bestimmten Zauber wirkt, innerhalb der Zelle auf Schleichen drückt oder einen Bilder-Einsammel-Gegenstand erstellen, z.B. ein einzigartiges Amulett welches bei Anlegen automatisch "alle Bilder in der Zelle einsammelt" indem sie disabled und dem Spieler wieder die tragbaren Versionen ins Inventar gepackt werden. Das Script dazu wäre aber mit an den Aktivatoren anzubringen die dann prüfen ob die von Dir gewählte Einsammel-Bedingung zutrifft. (=Zauber gewirkt wurde/Amulett angelegt ist/Spieler schleicht). Diese Art des Wieder-Einsammelns sollte aber nur eine Rettungs-Möglichkeit für aus der erreichbaren Zone geratene Gegenstände und nicht die reguläre Einsammel-Funktion sein
 
  • Like
Reaktionen: Thayja
Nun gut damit kann ich ja schonmal einiges anfangen ,ob es sich auch vollständig in die Praxis umsetzen läässt wird der Versuch zeigen .
Ich danke dir erstmal für deine Auskünfte und werd mich mal an die Arbeit machen. Mal sehen was dabei heraus kommt.
 
Ich habe einen Taucheranzug gebaut, ebenso eine Lampe, die man am Helm befestigen kann. Beide Teile sind als Klamotte eingebaut. Die Lampe soll aber nur im Wasser leuchten, nicht ausserhalb. Ich bräuchte nun eine Lösung dafür.

Meine Idee ist, einfach IsSwimming und GetEquiped abzufragen und mit AddSpell dem Spieler einen Lichtzauber verpassen, bzw. den wieder wegnehmen. Das könnte ich zwar in jedem Objektskript der betreffenden Zelle regeln, doch die Lampe soll auch später in anderen Gewässern funktionieren. Vermutlich wäre ein Magic-Skript dazu besser geeignet, doch meine Erfahrungen mit diesen sind etwas spärlich.
Vielleicht könnte man das sogar eleganter direkt über den Spell-Effekt LGHT machen, ohne Umweg über einen Spell.

Wer kennt eine praktikable Lösung zum Steuern dieses Lichtzaubers (kein OBSE)?
 
Nur die lahme Ausführung - und das Skript in der Geschwindigkeit hochzusetzen, ist als Dauerzustand auch nicht so das Wahre.
Aber als vielleicht ist es in diesem Fall gar nicht so störend, sind ja im ungünstigsten Fall nur 5 Sekunden. Dann hat die Lampe eben einen kleinen Wackelkontakt, soll´s ja auch geben. :D
 
Also wieso kein OBSE.

Das verstehe ich beim besten Willen nicht. OBSE gibt dir nur bessere und mehr Befehlsmöglichkeiten und macht dein Game nicht kaputt. Nicht eine Mod wäre bei mir ohne OBSE verwirklicht werden können. Ohne OBSE gehen die meisten Sachen einfach nicht und wenn, dann nur mit immensen Aufwand. Ohne OBSE hätte ich (Aufgrund unzähliger Wichtigkeiten die dem Hauptgame fehlen) das Game nicht einmal angefasst.

Aber mal was anderes.
Gehört hier zwar überhaupt nicht hin, aber ich komme nicht weiter:

Nachdem ich jetzt Stunden danach gesucht habe eine hilfreiche Information zu meinem jetzigen Mod für New Vegas zu bekommen. Dachte ich, ich frag einfach mal hier.
Hat jemand hierzu einen Link, wo es einen Ähnlichen Thread wie diesen (aktiv) gibt. Da wo Sripter aktuell vorbeischauen und einem Tipps geben. Leider gibt es das ja in diesem doch recht guten deutschem Forum für die Falloutreihe überhaupt nicht. Warum?

Die NewVegas-Entwickler haben zwar daran gedacht das eine Waffenmodifikation möglich ist, jedoch nicht daran, dass diese sich auch wieder entfernen lässt. Deshalb suche ich Informationen dazu, wie sich eine Waffenmoddifikation per Script abfragen lässt. Auch zu NVSE finde ich dazu nichts. Unter der Doku nach Weaponmods zu suchen ergibt kein Ergebnis und unter Goggle lässt sich auch nichts brauchbares finden.