Könntet ihr mir mal helfen in Sachen (auf Events regarieren, Ablaufwiederholung)

Daimonicon

Neuankömmling
Hallo,

ich hab das Problem das ich wohl irgendwie die das Story Event System noch nicht richtig geschnallt habe.

Ich hatte angedacht das jedesmal wenn das Change Location Event ausgelöst wird eine Hilfs/Steuerquest angesprochen wird die Werte ermittelt (nur Nachts zw. 22-4 Uhr).

Diese Werte sollen einer zweiten Hilfs/Steuerquest dafür dienen ihre Konditionen danach zu richten welche Werte ermittelt wurden.

Die erste Quest wird nun aber entweder garnicht abgearbeitet oder nur 1-2 Mal hintereinander. Ich hab ne Menge Beispiele durchgesehen wie Kurierquest Beispiele - Aber wohl das Timing drum herum nicht gänzlich gepeilt. Ob RegisterForUpdate nötig oder richtig ist weiss ich nicht genau - Nur tut sich dann eben nur überhaupt etwas

Stage 0 - Fragment 0 *Hab ich dies stehen
Code:
UnregisterForUpdate()
RegisterForUpdate(5)
kmyQuest.GoToState("StartCheck")

Das Script zur Quest das an sich auch funktioniert:
Code:
Auto State StartCheck
    Event OnUpdate()
        ...
        ...
        UnregisterForUpdate()
    EndEvent
EndState

Der Story Manager war meine Wahl weil ich Konditionen so prima schon vorgeben kann und das Event bot sich an da die zweite Quest nur ausgeführte werden soll wenn Spieler in Range von Ref ABC u.s.w ist und die Werte zutreffen welche die erste Steuerquest ermittelt hat.

Also kurz gesagt:
Quest A soll die Werte immer abfragen wenn das Event ausgelöst wird
Quest B soll anlaufen wenn Spieler in korrekter Distanz zu Ref ist und Werte aus A zutreffen.

Ich hatte überlegt "UnregisterForUpdate()" weg zu lassen hab aber irgendwie auch schiess das es Performance Technisch ungünstig wäre.

Ich hoffe ich konnte einigermassen schlüssig erklären was ich vor habe. Würde mich freuen wenn mir da jemand weiterhelfen könnte - Vieleicht gibt es ja auch einen völlig simpleren Ansatz.
 
Ich glaube da liegt ein genereller Denkfehler vor, erklär mir mal bitte in einer PN, was genau du machen möchtest in deiner Quest, denn so funktioniert das nicht wirklich :)

Mal auf die Schnelle:
Im Bezug auf den ersten Code setzt du einen Timer (RegisterForUpdate), benutzt ihn aber nicht durch ein Event, sondern änderst mit StartCheck einmalig den State vom zweiten Skript. Im zweiten Skript (StartCheck) hast du einen Eventhandler (OnUpdate) ABER das Skript bekommt dieses Event nicht. (Keine RegisterForUpdate)


Quest A soll die Werte immer abfragen wenn das Event ausgelöst wird
Quest B soll anlaufen wenn Spieler in korrekter Distanz zu Ref ist und Werte aus A zutreffen.
Hier mal nen PseudoCode wie es aussehen könnte:
Code:
Event OnInit()
  RegisterForUpdate(alle 5 stunden)
endevent

Event OnUpdate()
  frage werte ab()
  wenn werte ok, dann Quest_B.start() und
      UnregisterForUpdate .. dieses Event nicht mehr auslösen da Quest B jetzt gestartet ist und die Abfrage der Werte alle 5 Stunden nun nicht mehr gebraucht wird 
endevent
Wie gesagt, auf die Schnelle...
Winke :bye:
Ladyfalk
 
Zuletzt bearbeitet von einem Moderator:
Soweit ich es verstanden und in meinen Mod auch umgesetzt habe, gilt ein Update immer für dasselbe Script.
Wenn du also ein "RegisterForUpdate" machst, dann gilt dies für dieses Script. Es wird dann die Prozedur „Event OnUpdate()“ vom diesem Script ausgeführt.

Zudem würde ich dir dringend von der Nutzung von „RegisterForUpdate“ abraten.

Nicht zu empfehlen:

Code:
Event OnInit()
  RegisterForUpdate(5)
endevent

Event OnUpdate()
    Wenn werte ok dann 
        Quest_B.start()
        Und UnregisterForUpdate
    Ende Wenn
Endevent

Besser so:

Code:
Event OnInit()
  RegisterFor[B]Single[/B]Update(5)
endevent

Event OnUpdate()
  Wenn werte ok dann 
     Quest_B.start()
  Wenn werte NICHT OK 
     RegisterFor[B]Single[/B]Update(5)
  Ende Wenn
endevent
 
  • Like
Reaktionen: Daimonicon
Heyhou,
ergänzend dazu, damit jeder weiß wieso RegisterForSingleUpdate im Allgemeinen besser ist:
Bei Deinstallation einer Mod laufen die Skripte der aktuellen Events erstmal weiter und sind im Save auch gespeichert. Bei einem RegisterForSingleUpdate wird das Event natürlich nur noch ein weiteres Mal ausgelöst und ein Extra Unregister ist nicht nötig. :D