quest "Bring mir 10 Tomaten" erstellen

azraelb

Abenteurer
Hallo,

ich habe folgendes Problem:

Ich möchte eine Quest erstellen, in dem der Spieler dem Questgeber 10 beliebige Tomaten bringen und dafür eine Belohnung erhalten soll (Tomaten als Beispiel).

Wie ich das mit einer Tomate machen kann ist mir klar (und habe das schon geschafft). Ich kann z.B. die Tomate als Quest-Alias z.B. im Inventar eines NPCs spawnen lassen, die Tomate in einem Dialog mit AddItem(Alias_Tomate.GetReference()) Script dem Spieler ins Inventar legen und die Quest updaten...

Aber wie mache ich das bei 10 Tomaten, die überall in Skyrim aufgelesen/gekauft usw. werden können, da habe ich ja keine spezifische Referenz zu einem Objekt? Und was mache ich wenn der Spieler eine Tomate verkauft und er wieder nur noch 9 Tomaten hat - ich kann ja keine 10 beliebige Tomaten zum Questobject machen?^^

Eigentlich eine einfache quest, dafür muss es doch auch eine einfache Lösung geben aber irgendwie stehe ich auf dem schlauch^^

wäre nett, wenn mir jemand einen Tipp geben könnte.
DAnke,

Gruß Az
 
Ich kann dir jetzt zwar nicht direkt im Bezug auf dein Problem helfen, da ich mich auf diesem Gebiet im CK so überhaupt nicht auskenne, aber ich glaube, das dieser Youtuber in seiner Tutorialreihe zu Quests in einem Part die Lösung dazu anspricht.
Ich bin mir aber nicht ganz sicher.

Aber es gibt bestimmt jemandem hier im Forum der dir direkter helfen kann :)
 
Gibt es die gute alte Methode aus Oblivion nicht mehr? Dort konnte man einfach prüfen, ob der Spieler eine bestimmte Anzahl des Items im Inventar hat.

Edit: Gerade nachgeschaut, es geht.
Sowohl unter "Quest Stages", "Quest Objectives" als auch unter "Quest Data" kannst Du bei Conditions auf New klicken und dann die Funktion GetItemCount wählen. Bei "INVALID" kannst Du dann die ObjectID deiner Tomaten einstellen. "Run on" setzt Du auf Player. Bei Comparison hast Du die Wahl zwischen ungleich (!=), gleich (==), größer bzw. kleiner gleich (>= bzw. <=) und größer bzw. kleiner (> bzw. <). Bei "Value" stellst Du die Anzahl ein.
 
Zuletzt bearbeitet von einem Moderator:
Hi,

Ich kann dir jetzt zwar nicht direkt im Bezug auf dein Problem helfen, da ich mich auf diesem Gebiet im CK so überhaupt nicht auskenne, aber ich glaube, das dieser Youtuber in seiner Tutorialreihe zu Quests in einem Part die Lösung dazu anspricht.

Ich kenne das Tutorial bereits (habe es nicht nochmal komplett angesehen). So wie ich das sehe ist das das gleiche Tutorial, wie das offizielle von Bethesda, nur als Video-Tutorial und in Deutsch...
Hier geht es um ein spezifisches Amulett, das in einem NPC platziert wird, ist also nicht das was ich suche.


Gibt es die gute alte Methode aus Oblivion nicht mehr? Dort konnte man einfach prüfen, ob der Spieler eine bestimmte Anzahl des Items im Inventar hat.

Edit: Gerade nachgeschaut, es geht.
Sowohl unter "Quest Stages", "Quest Objectives" als auch unter "Quest Data" kannst Du bei Conditions auf New klicken und dann die Funktion GetItemCount wählen. Bei "INVALID" kannst Du dann die ObjectID deiner Tomaten einstellen. "Run on" setzt Du auf Player. Bei Comparison hast Du die Wahl zwischen ungleich (!=), gleich (==), größer bzw. kleiner gleich (>= bzw. <=) und größer bzw. kleiner (> bzw. <). Bei "Value" stellst Du die Anzahl ein.

danke für die Info, leider bringt mich das auch nicht weiter: die Funktion GetItemCount() habe ich in der Script-Referenz auch schon entdeckt. Ich weiß nur nicht wie ich die Methode anwende:

Quest Data
Code:
[B][URL="http://www.creationkit.com/Category:Conditions"]Quest Conditions[/URL]:[/B]  Any conditions here are considered to apply to all dialogue in the  quest. The quest conditions are checked first; only if those are true  are the conditions on the infos evaluated.
So wie ich das sehe bezieht sich eine Condition unter "Quest Data" auf alle Dialoge der Quest. Ich müsste (bei der Condition von oben in Quest Data) also 10 Tomaten im Inventar haben, damit überhaupt die Dialoge der Quest eingeblendet werden -> Das ist nicht was ich will

- Quest stages:
Code:
[B][URL="http://www.creationkit.com/Category:Conditions"]Conditions[/URL]:[/B]  The conditions must be true for the quest stage item to be applied.
Bin mir nicht sicher wie das gemeint ist, aber ich denke dass ich immernoch ein Script irgendwo brauche, dass auf ein Event reagiert, um die Quest überhaupt auf die Stage zu setzen oder wird die Quest automaisch auf die Stage gesetzt, wenn die Bedingung der Queststage true ist?
Mal angenommen die Quest würde das automatisch machen woher soll die Quest dann wissen, auf welche Stage sie sich zurücksetzen muss, wenn die Bedingung wieder false wird?

Quest objectives:

Code:
[B][URL="http://www.creationkit.com/Category:Conditions"]Conditions[/URL]:[/B]  Note that the conditions are applied to the quest target. Note also  that "Run on Target" is invalid for conditions on quest targets.
Selbes wie bei den Stages: Auch wenn ich die Ausgabe des Questobjectives "Bringe die 10 Tomaten zum Questgeber" an die o.g. Bedingung knüpfe muss immernoch die Stage gesetzt werden und das Problem "Auf dem weg zurück zum Questgeber verkaufen wir 1 Tomate" besteht noch.


Lösungsmöglichkeiten:

  • Ich bin mir sicher, dass es mit einem Questscript funktionieren müsste, das sich für ein OnUpdateGameTime Event registriert und in regelmäßigen Zeitabständen überprüft, ob sich 10 Tomaten im Inventar befinden. Wenn ja, dann wird die Stage auf "Kehre zurück" gesetzt, wenn "nein" dann wird die quest wieder auf "Sammle 10 Tomaten" gesetzt.-> Das würde ich aber ungerne machen, da die quest dann nicht direkt aktualisiert wird, wenn der Player die 10. Tomate aufhebt

  • Es würde auch funktionieren, wenn ich dem Basisobjekt "tomate" ein Script verpasse, das auf OnContainerChanged Event reagiert und jedes mal prüft, ob sich 10 Tomaten im Inventar befinden, wenn eine Tomate in oder aus dem Inventar bewegt wird. -> DAs wiederum will ich nicht, da die Mod dann mit allem nicht kompatibel ist, was das Basisobjekt ändert.

Beides imho nicht akzeptabel. Das ist doch ne typische Bethesda Quest^^ da muss es doch ne einfache Lösung geben?
 
Zuletzt bearbeitet:
azraelb schrieb:
So wie ich das sehe bezieht sich eine Condition unter "Quest Data" auf alle Dialoge der Quest. Ich müsste (bei der Condition von oben in Quest Data) also 10 Tomaten im Inventar haben, damit überhaupt die Dialoge der Quest eingeblendet werden -> Das ist nicht was ich will
Richtig, den Reiter hatte ich nur der Vollständigkeit halber erwähnt.

azraelb schrieb:
oder wird die Quest automaisch auf die Stage gesetzt, wenn die Bedingung der Queststage true ist?
Mal angenommen die Quest würde das automatisch machen woher soll die Quest dann wissen, auf welche Stage sie sich zurücksetzen muss, wenn die Bedingung wieder false wird?
Zumindest geschah es bei Oblivion noch automatisch. Ich wüsste nicht, warum das jetzt anders sein sollte. Auch wäre mir neu, dass man in den Stages zurück kann. Bei Oblivion ging das definitiv nicht, bei Skyrim habe ich damit noch keine Erfahrung.

azraelb schrieb:
das Problem "Auf dem weg zurück zum Questgeber verkaufen wir 1 Tomate" besteht noch.
Da sehe ich kein Problem.

Lösungsmöglichkeit:
Du erstellst Quest Stages, wie es dir gefällt. Also beispielsweise für "Spieler hat 1 Tomate", "Spieler hat 3 Tomaten", "Spieler hat >= 10 Tomaten". Beim Abgabe-Dialog prüfst Du (wieder mit den Conditions) ob der Spieler mindestens 10 Tomaten (>= 10) hat. Wenn ja: Spieler erhält seine Belohnung. Wenn nein: Spieler wird darauf hingewiesen, dass er nicht genung Tomaten dabei hat - zum Beispiel weil er eine gegessen hat.
Ist dir das jetzt einfach genug? ;)
 
Zumindest geschah es bei Oblivion noch automatisch. Ich wüsste nicht, warum das jetzt anders sein sollte. Auch wäre mir neu, dass man in den Stages zurück kann. Bei Oblivion ging das definitiv nicht, bei Skyrim habe ich damit noch keine Erfahrung.

Habe erst mit Skyrim angefangen zu modden also ka von Oblivion-CK.
hmm weiß auch nicht genau ob das geht, dachte mit Allow Repeated Stages in "Quest Data Tab" funktioniert das (zumindest hört sich das so an finde ich). Was auf jeden Fall geht ist die Quest.Reset() + Quest.Start() und Quest.SetStage(). SO habe ich bereits in einem anderen Fall eine Quest zurück gesetzt (bzw.


Lösungsmöglichkeit:
Du erstellst Quest Stages, wie es dir gefällt. Also beispielsweise für "Spieler hat 1 Tomate", "Spieler hat 3 Tomaten", "Spieler hat >= 10 Tomaten". Beim Abgabe-Dialog prüfst Du (wieder mit den Conditions) ob der Spieler mindestens 10 Tomaten (>= 10) hat. Wenn ja: Spieler erhält seine Belohnung. Wenn nein: Spieler wird darauf hingewiesen, dass er nicht genung Tomaten dabei hat - zum Beispiel weil er eine gegessen hat.
Ist dir das jetzt einfach genug? ;)

Hmm, wenn das mit den Stage Conditions wirklich automatisch passiert könnte ich das so machen...

Kann ich auf Stage 40 ein Quest Objective von 20 anzeigen lassen?
 
Du hast recht, "Allow Repeated Stages" hört sich tatsächlich so an.
Die Quest "CWFortSiegeCapital" hat diese Option und in bei Stage 1000 gibt es unter "Papyrus Fragment" tatsächlich den Befehl "setStage(950)". Du kannst also auf jeden Fall in Stages auch zurück.

Zu den Stages und Objectives:
So wie ich das sehe (bei DB01) sind die Stages und Objectives unabhängig voneinander. Du müsstest also bei Stage 40 einfach unter "Papyrus Fragment" den Befehl "SetObjectiveDisplayed(x)" eingeben, wobei Du x mit dem Index des anzuzeigenden Objectives ersetzt. Allerdings ist das reine Spekulation von mir.
 
Du hast recht, "Allow Repeated Stages" hört sich tatsächlich so an.
Die Quest "CWFortSiegeCapital" hat diese Option und in bei Stage 1000 gibt es unter "Papyrus Fragment" tatsächlich den Befehl "setStage(950)". Du kannst also auf jeden Fall in Stages auch zurück.

Zu den Stages und Objectives:
So wie ich das sehe (bei DB01) sind die Stages und Objectives unabhängig voneinander. Du müsstest also bei Stage 40 einfach unter "Papyrus Fragment" den Befehl "SetObjectiveDisplayed(x)" eingeben, wobei Du x mit dem Index des anzuzeigenden Objectives ersetzt. Allerdings ist das reine Spekulation von mir.

Hmm, also könnte ich sowohl eine Stage zurück gehen, als auch den Schritt faken, indem ich das vorherige quest objective (sammle 10 tomaten) erneut ausgebe wenn der Spieler eine Tomate isst.
Wobei eine Stage zurück gehen sicher besser ist, da sich dann auch der Eintrag im Journal ändert.
Was mir allerdings immer noch nicht klar ist: Wie kann ich die Stage bzw. das Questobjective zurück setzen. Ich muss ja auf ein Event reagieren (wahrscheinlich OnContainerChanged? aber das muss ja an der Tomate hängen und ich will ja an das Baseobject Tomate kein Script anhängen und kann kein Alias für "beliebige Tomate" erstellen)


Aber erstmal DAnke für die Infos, wenn mir nichts einfällt, dann werde ich es so machen wie du es vorschlägst und prüfe bei der Abgabe ob es genug Tomaten sind ohne die Quest zu updaten wenn der Spieler eine Tomate isst
 
Wie bereits erwähnt sollte sich der Stage automatisch ändern, sobald die entsprechenden Bedinungen erfüllt sind. Das sollte zumindest aufwärts (also 0->5->10->77->...) funktionieren, wenn sich da von Oblivion nichts geändert hat. Ob Skyrim auch automatisch abwärts kann, weiß ich nicht.
An den Objectives musst Du nichts ändern. Du verknüpfst lediglich den entsprechenden Stage mit dem entsprechenden Objective. Sobald Du dann den Stage wechselst, wechselt der Objective ja mit.

Zu deinem Script:
Eventuell kannst Du es bei der Quest im Reiter "Scripts" unterbringen.
Im Script selber fragst Du einfach in regelmäßigen Abständen ab, wie viele Tomaten der Spieler im Inventar hat.
Bei Oblivion sähe das ungefähr so aus:
Code:
Scn MeinQuestScript

Begin GameMode

If Player.GetItemCount Tomaten-ObjID == 1
   SetStage 5
ElseIf Player.GetItemCount Tomaten-ObjID == 2
   SetStage 10
EndI

End GameMode
Hier würde das Script alle X Sekunden ausgeführt werden, wenn der Spieler im Spielmodus ist (also kein Menü offen). Die Anzahl der Sekunden war im CS einstellbar. Meines Wissens waren es sogar nur Millisekunden.
 
Das funktioniert noch genau gleich wie in Oblivion damals. Die erstellst zunächst einen Dialog, der dir den Auftrag gibt 10 Tomaten zu suchen. Dann setzt du die Queststage auf eine bestimmte Stufe, z.B. 10.

Dann erstellst du ein neues Topic und fügst unter den Bedingungen für dieses Thema "getstage 10" ein und "getItemCount >= 10". Wobei du bei getItemCount nicht vergessen darfst auf "Run on Target" umzustellen (statt subject).
Dieses Thema ist dann nur sichtbar, wenn du sowohl 10 Tomaten im Inventar hast und vorher den entsprechenden Dialog gehört hast, der dir den Auftrag gibt die 10 Tomaten zu suchen.
 
@DICE:

Ob es aufwärts funktioniert konnte ich noch nicht ausprobieren, aber abwärts bezweifle ich stark vielleicht könnte es klappen wenn man wirklich jede stage eindeutig mit conditions identifiziert...
Zu deinem Script... daran hatte ich auch schon gedacht... in Skyrim wäre das ein OnUpdateGameTime Event, das in regelmäßigen abständen prüft.
Das ist imho aber unsauber ich will eigentlich, dass jedes Mal geprüft wird wenn ich eine Tomate ins Inventar schiebe oder entferne und sonst nicht das wäre viel präziser und auch performance sparender.
Vielleicht sollte ich aber auch den einfachen Weg wählen und die Quest nicht updaten, sondern beim Questgeber nur die Dialoge ändern, wenn der Spieler nicht mehr genügend Tomaten hat. Im questlog steht dann aber halt noch dass man alle 10 Tomaten hat...

@Hebrock

Ist bei "Run on Target" nicht der NPC, mit dem man spricht Target?
Ich hätte hier "Run on Player" gewählt bzw. Wenn der Spieler als Questalias angelegt wurde "Run on Alias"
 
@ azraelb: Das macht schon Sinn was du schreibst, darüber wundere ich mich schon seit Oblivion. Jedenfalls klappt es soweit ich weiß nur wenn man "Run on Target" auswählt.
 
@Hebrok:
Ich habe nun "Run On Player" ausgewählt und es funktioniert. "Run on Target habe ich nicht versucht, hört sich imho aber auch falsch an.


DICE:
habe es jetzt mit nem onUpdateGameTime() umgesetzt. Es wird nun alle 0,1 ingame stunden geprüft, ob der Benutzer 10 Tomaten im Inventar hat. Es kann nun zwar vorkommen, dass der Spieler 10 Tomaten kauft, die Quest aber erst ein paar sec später aktualisiert wird, ich bekomme es aber wirklich nicht hin, dass ich es beim verschieben ins oder aus dem Inventar prüfen kann. Ich habe mich auch entschlossen (erstmal) nicht in der quest zurück zu gehen. Wenn der Benutzer eine Tomate isst, dann wird im Log noch angezeigt, dass er die Tomaten abgeben soll. Beim Questgeber gibt es dann andere Gesprächsoption

Die Queststage wird auch nicht automatisch gesetzt, wenn ich hierfür conditions definiere (also zumindest nicht bei mir - weder aufwärts noch abwärts). Weiß grad gar nicht für was das gut sein soll
 
Wieso guckst du dir nicht bereits im Spiel befindliche Quests dieser Art an und kopierst sie (oder geht das nicht)? Ich erinnere mich an den Schmied Balimund in Rifton, der 10 Feuersalze wollte...

Gruß
Darmok