Skriptthread zum Creation Kit

Hallo Leute!
Ich suche ein Skript für an ein Gespräch, das überprüft ob ich von einem Misc objekt (Einer Münze) genügend als 5 und mehr Einheiten im Inventar hab, und nur dann die möglichkeit gibt ein neues passendes topic auszuwählen

Hoffe ihr könnt mir helfen
Grüze
LindayWolf

Wenn ich dich richtig verstehe brauchst du da kein Script, das sollte mit einer Condition klappen. Dialoge sind nur dann auswählbr, wenn die Condition erfüllt ist
 
  • Like
Reaktionen: LindayWolf
Danke für die schnelle Antwort :)

Kannst du mir zufällig auch sagen welche condition das ist?
denn gei itemcount funktioniert nicht, oder mache ich was falsch
 
Moin.
Ich versuche mich grade zum ersten mal im Scripten für Skyrim. Anfangs lief das noch ganz gut, aber jetzt scheitere ich schon an einem simplen OnKeyDown Event.

Code:
Event OnEquipped(Actor akActor)
    Int iForwardKey = Input.GetMappedKey("Forward")
    Debug.Messagebox(iForwardKey)
    RegisterForKey(17)
    Page.Show(1.0 , 2.0 , 31.0)
EndEvent


Event OnKeyDown(int keyCode)
    Debug.Messagebox("pressed")
EndEvent


Message Property Page  Auto  


[

Soweit so gut. Anstandslos kompiliert, aber beim Tastendruck tut sich einfach rein gar nichts. Wo liegt min Fehler?
 
Moin.
Ich versuche mich grade zum ersten mal im Scripten für Skyrim. Anfangs lief das noch ganz gut, aber jetzt scheitere ich schon an einem simplen OnKeyDown Event.

Code:
Event OnEquipped(Actor akActor)
    Int iForwardKey = Input.GetMappedKey("Forward")
    Debug.Messagebox(iForwardKey)
    RegisterForKey(17)
    Page.Show(1.0 , 2.0 , 31.0)
EndEvent


Event OnKeyDown(int keyCode)
    Debug.Messagebox("pressed")
EndEvent


Message Property Page  Auto  


[

Soweit so gut. Anstandslos kompiliert, aber beim Tastendruck tut sich einfach rein gar nichts. Wo liegt min Fehler?

Zunächst müssen die benötigten Tasten für dieses Event registriert werden: RegisterForKey

Beispiel:
Code:
Event OnInit()
	RegisterForKey(30)	;Taste A für OnKey-Events registrieren
EndEvent

Event OnKeyDown(int keyCode)
    if keyCode == 30	        ;Taste A wurde gedrückt
		Debug.Messagebox("'A' pressed")
    endif
EndEvent
 
Stimmt, hab ich doch auch gemacht, nur eben unter dem Event OnEquipped. Die Registrierung wird auch aufgerufen, sonst würde die Messagebox aus dem gleichen Event nicht erscheinen. Dennoch passiert nichts, auch nicht bei Registrierung unter OnInit.
 
Ja, sieht eigentlich gut aus. Wo hast du das Skript platziert, wie sieht der Header aus?
 
Für RegisterForKey gilt wohl dasselbe wie für RegisterForUpdate oder RegisterForUpdateGameTime. Es funktioniert nicht mit Objekten in Containern.

Auf der CK-Seite steht dazu nur folgendes:
When an object is equipped it is inside a container, which means that you cannot call Member Functions on it. (Unless it is a persistent reference)

Ich habe ein Buch in der Welt platziert und OnEquipped() durch OnRead() erstzt, das hat funktioniert. Testweise das Skript auch mal auf den Player gelegt, mit OnInit() Event. Auch das funktionierte. Vielleicht musst du die Methode mit dem Buch noch einmal überdenken.

Edit: Es ist auch möglich eine Quest zu erstellen und das Buch zu einer ReferenceAlias zu machen. Dazu schreibe ich heute aber keine Anleitung mehr.
 
Zuletzt bearbeitet von einem Moderator:
Hallo.

Wäre ich denn nun hier im richtigen Thread gelandet, um eine Antwort auf meine Frage zu bekommen: Ich würde gern meine Quest starten, indem meinem Charakter bei Betreten der Taverne eine Notiz "in die Manteltasche" gesteckt wird - also ohne beteiligten NPC.

Wie müsste ein solches Skript aussehen?

Vielen Dank für die Hilfe.

Schöne Grüße
Darmok
 
Hallo.
Wäre ich denn nun hier im richtigen Thread gelandet, um eine Antwort auf meine Frage zu bekommen: Ich würde gern meine Quest starten, indem meinem Charakter bei Betreten der Taverne eine Notiz "in die Manteltasche" gesteckt wird - also ohne beteiligten NPC.

Das könnte eigentlich auch ohne einem Script mit einem dynamisch erzeugten Alias funktionieren. Also beim Betreten der Location wird das Notiz-Alias im Inventar des Spielers erzeugt (CreateIn). Aber bin mir da nicht 100% sicher... kenne mich mit dynamisch erzeugten Alias nicht wirklich aus...

Ansonsten kannst du auch nen Trigger erstellen, an diesen hägst du ein Script, das auf das Betreten des Triggers reagiert (OnTriggerEnter() oder so ähnlich - schau mal in die Script-Referenz auf creationkit.com). In dem Event fügst du dann die Notiz dem Spieler hinzu (Game.GetPlayer().AddItem(Notiz))
 
Ich mache gerade das Skript-Tutorial auf creationkit.com. Könnte mir mal jemand mit einfachen deutschen Worten erklären, was ich hier mache, wenn ich ich

if count == 1 Debug.MessageBox("Hello, World!")
elseif count == 2 Debug.MessageBox("Hello, World. Again!")
else Debug.MessageBox("Hello, World. Enough already!")
endif


ersetze durch:

if count == 1 box1.Show()
elseif count == 2 box2.Show()
else box3.Show()
endif

Worin liegt denn der Unterschied? Der Effekt im Spiel ist doch derselbe...

Danke.
Gruß
Darmok
 
Ich mache gerade das Skript-Tutorial auf creationkit.com. Könnte mir mal jemand mit einfachen deutschen Worten erklären, was ich hier mache, wenn ich ich

if count == 1 Debug.MessageBox("Hello, World!")
elseif count == 2 Debug.MessageBox("Hello, World. Again!")
else Debug.MessageBox("Hello, World. Enough already!")
endif


ersetze durch:

if count == 1 box1.Show()
elseif count == 2 box2.Show()
else box3.Show()
endif

Ich versuch's mal. Im ersten Beispiel wird eine reine MessageBox angezeigt, der angezeigte Text ist fest im Skript verankert.

Im zweiten Beispiel dagegen, wird eine im CK erstellte Message aufgerufen. Ein wesentlicher Unterschied liegt darin, dass der angezeigte Text außerhalb des Skripts verändert werden kann, was z.B. bei Übersetzungen von Vorteil ist. Eine Message bietet außerdem noch mehr Funktionalität, sie kann beispielsweise sowohl als MessageBox oder als Notification angezeigt werden, es können Menü-Buttons hinzugefügt werden und eine Message unterstützt Text Replacement (benötigt eine Quest).

Damit das Skript weiß, welche Message-Objekte angezeigt werden sollen, müssen diese als Properties dem Skript zugewiesen werden. Das ist ein weiterer Vorteil, denn so kann das gleiche Skript mit unterschiedlichen Messages genutzt werden.

Hoffe, das war einigermaßen verständlich.

Grüße
 
  • Like
Reaktionen: Bosmerland
Hallo,

brauche wieder einmal die Hilfe erfahrener Skripter.
Zu meinem Problem.
Ein bestehendes Vanilla Skript (TempleBlessingScript),
sollte seinen Ablauf/Animation verzögert starten.
Angebracht wären etwa 7 sek.
Etwas näher erläutert.
Der PlayerChar nutzt den BlessingKneelMarker, um vor einem Brunnen
knieend zu beten, aufzustehen und danach aus dem Brunnen zu trinken.
Ist diese Aktion abgeschlossen, sollte nun das TempleBlessingScript greifen,
welches auf dem BlessingKneelMarker liegt.
Dieses ermöglicht auch die Anim beim aktivieren des Schrein von Talos.
Sollte eigentlich jeder kennen.
Natürlich wird diese sofort abgespult, ideal wäre aber erst nach
ca. 7 sek und eben erst dann wenn die Trinkanim beendet ist.
Wie müsste ein Eintrag im Skript dafür aussehen, um so etwas zu bewerkstelligen?
Sprich, das Skript quasi 7 sek nach Aktivierung ruhen zu lassen.
Hier noch das Vanilla Skript:

Scriptname TempleBlessingScript extends ObjectReference Conditional

Spell Property TempleBlessing Auto

Event OnActivate(ObjectReference akActionRef)

TempleBlessing.Cast(akActionRef, akActionRef)
if akActionRef == Game.GetPlayer()
AltarRemoveMsg.Show()
BlessingMessage.Show()
endif

EndEvent

Message Property BlessingMessage Auto

Message Property AltarRemoveMsg Auto
 
Zuletzt bearbeitet:
@Little Ice

Dieses Skript bewirkt, dass die Cast() Funktion erst nach Ablauf der BlessingKneelMarker-Animation gestartet wird:

Code:
Scriptname TempleBlessingScript extends ObjectReference Conditional  

Spell Property TempleBlessing  Auto
Actor Property PlayerRef Auto

Event OnActivate(ObjectReference akActionRef)
    if akActionRef == PlayerRef
        RegisterForAnimationEvent(PlayerRef, "IdleFurnitureExit")
    endif
EndEvent

Event OnAnimationEvent(ObjectReference akSource, string asEventName)
    if (akSource == PlayerRef) && (asEventName == "IdleFurnitureExit")
        Utility.wait(1)
        TempleBlessing.Cast(PlayerRef, PlayerRef)
        AltarRemoveMsg.Show()
        BlessingMessage.Show()
        UnregisterForAnimationEvent(PlayerRef, "IdleFurnitureExit")
    endif
EndEvent

Message Property BlessingMessage  Auto  

Message Property AltarRemoveMsg  Auto

Ich habe ein Property für den Player hinzugefügt, ist schneller als Game.GetPlayer(). Außerdem wäre es besser, wenn du für das Skript einen anderen Namen verwendest, sonst wirkt sich das auf alle Schreine im Spiel aus.

Grüße
 
Zuletzt bearbeitet von einem Moderator:
@Ghaunadaur,

rasch noch mein Feedback zu später (früher?) Stunde.
Vielen Dank erst einmal für deine Mühen, wirklich nett von dir.
Leider wird das Skript nicht kompiliert und spuckt mir die folgenden
Meldungen, hier in gekürzter Form, aus:

RegisterForAnimationEvent is not a function or does not exist

UnregisterForAnimationEvent is not a function or does not exist

MfG

PS: Skriptname wurde natürlich und selbstverständlich in meinem PI geändert...
 
@Ghaunadaur,
Leider wird das Skript nicht kompiliert und spuckt mir die folgenden
Meldungen, hier in gekürzter Form, aus:

RegisterForAnimationEvent is not a function or does not exist

UnregisterForAnimationEvent is not a function or does not exist


Seltsam. Skript kompiliert bei mir einwandfrei und wurde erfolgreich im Spiel getestet. Schwer zu sagen, was da los ist. Hast du irgendwas daran verändert?
 
  • Like
Reaktionen: Little Ice
Für den einmaligen Aufruf in diesem Skript , ist die Player Property nicht notwendig.

Code:
Scriptname LITempleBlessingScript extends ObjectReference Conditional  

Spell Property TempleBlessing  Auto

Message Property BlessingMessage  Auto  

Message Property AltarRemoveMsg  Auto

Event OnActivate(ObjectReference akActionRef)
    Actor PlayerRef = Game.GetPlayer()
        if akActionRef == PlayerRef
        RegisterForAnimationEvent(PlayerRef, "IdleFurnitureExit")
    endif
EndEvent

Event OnAnimationEvent(ObjectReference akSource, string asEventName)
    if (akSource == PlayerRef) && (asEventName == "IdleFurnitureExit")
        Utility.wait(1)
        TempleBlessing.Cast(PlayerRef, PlayerRef)
        AltarRemoveMsg.Show()
        BlessingMessage.Show()
        UnregisterForAnimationEvent(PlayerRef, "IdleFurnitureExit")
    endif
EndEvent

Kompiliert auch bei mir ohne Probleme.
 
@Ghaunadaur,

und wieder ein großes Dankeschön an dich für deine kompetente Hilfe.
Alles funktioniert nun perfekt!
Mein Fehler war beim Erstellen des Skripts, unter der Option Extends,
ObjectReference außer Acht gelassen zu haben.
Skript neu angelegt...funktioniert hervorragend!

@nnw

auch dir für deine Hilfe und Info ein Danke.
Dein vorgeschlagenes Skript wird bei mir aber
nicht kompiliert, so das ich auf Ghaunadaurs
Entwurf zurückgreifen muss.
Meldung des Kompiliers:

variable PlayerRef is undefined

Hmm...und bei dir hat es funktioniert?
Ja, du hast schon recht.
Die Player Property wäre nicht notwendig.
Egal, euch beiden ein schönes Wochenende.

MfG
 
Hatte im unteren Event "Actor PlayerRef = Game.GetPlayer()" vergessen, da es eine lokale und keine globale Variable ist.