NPCs sprechen lassen (via Papyrus)?

HughJanus

Neuankömmling
Hallo zusammen,

ist es möglich, NPCs via Papyrus sprechen zu lassen?
Ich habe mir auf youtube ein paar Videos angesehen (z.B. dieses) und es scheint so, als könnte man NPCs ausschließlich via Quest-Objekt sprechen lassen. Ist dies korrekt oder gibt es einen Weg via Skript Befehle an einen NPC zu senden, die ihn ausgewählte, generische Sounds (wie z.B. Schnarch-Sounds, eine Begrüßung, etc.) abspielen lassen?
Und gibt es irgendwo eine Liste dieser generischen Sounds?

Beste Grüße
HJ
 
Hier geht es ja nicht darum, einen NPC genau ein Audio sagen zu lassen, ein Topic ist eine Kategorie von Dialogen, die einer zu einem Sachverhalt sagen kann.
Die Namen der Topics findest du in den Dialog-Tabs im Quest-Objekt, auf der linken Seite. Kannst ja mal nach "Dialog" suchen in den Quests. Quests sind ja normalerweise zur Quest-Steuerung da, aber manch Quests dienen nur für Dialoge.
 
Hier geht es ja nicht darum, einen NPC genau ein Audio sagen zu lassen, ein Topic ist eine Kategorie von Dialogen, die einer zu einem Sachverhalt sagen kann.
Die Namen der Topics findest du in den Dialog-Tabs im Quest-Objekt, auf der linken Seite. Kannst ja mal nach "Dialog" suchen in den Quests. Quests sind ja normalerweise zur Quest-Steuerung da, aber manch Quests dienen nur für Dialoge.
Und gibt es da auch Sub-Objekte, die möglicherweise dann die Sounds enthalten?
Wie würde ich ein solches Objekt initialisieren? (kannst du mir vielleicht ein kleines Code-Snippet von 2-3 Zeilen schreiben)
 
Die einzelnen Dialog-Möglichkeiten innerhalb eines Topics enthalten jeweils das Audio. Ich denke, dass das so funktioniert, damit ein NPC nicht immer das exakt gleiche Audio verwendet, es geht um Abwechslung.
Das mit dem Say(Topic) sollte für dich absolut funktionieren, du musst nur das richtige Topic finden, z.B. in der Quest DialogueGeneric oder so.
 
Die einzelnen Dialog-Möglichkeiten innerhalb eines Topics enthalten jeweils das Audio. Ich denke, dass das so funktioniert, damit ein NPC nicht immer das exakt gleiche Audio verwendet, es geht um Abwechslung.
Das mit dem Say(Topic) sollte für dich absolut funktionieren, du musst nur das richtige Topic finden, z.B. in der Quest DialogueGeneric oder so.
Ich habe da nur einen GenericWounded:
upload_2022-11-18_18-38-27.png


Kann ich mir irgendwie anhören, was in den einzelnen gelben Fragezeichen-Boxen so an Sounds drinnen ist?
 
Ich hab jetzt im Reiter "Misc" unter "GenericDialogueWounded" das Topic gefunden, denke ich:
image.thumb.png.ba86e313d73dfc6299836acf59cc7e2b.png

Klappt jedoch leider nicht (es passiert nichts):
Code:
Scriptname EffectScript extends activemagiceffect
 
Topic GenericDialogueWoundedShared
Actor akNPC

Event OnEffectStart(Actor akTarget, Actor akCaster)
    akNPC = akTarget
    RegisterForSingleUpdate(0.25)
EndEvent
 
Event OnUpdate()
    akNPC.Say(GenericDialogueWoundedShared)
    RegisterForSingleUpdate(0.25)
EndEvent
 
Event OnEffectFinish(Actor akTarget, Actor akCaster)
    UnregisterForUpdate()
EndEvent

Ich habe dann, nachdem ich im Loverslab-Forum den Rat bekommen habe, via xEdit Dialoge gesucht und den Standard-Yield-Satz gefunden (den sollte eigentlich jeder NPC haben, oder?):
image.thumb.png.35973d1b8150fda4c4c549321a59dff9.png


Wie könnte ich diesen testen? Denn Say() nimmt leider die FormID nicht (habe den Rückgabewert von GetForm() mit der ID des Satzes im Say() als Argument mitgegeben, doch erhalte Fehler - falscher Typ).
 
Dann such mal nach Dialog oder Generic. Es gibt Quests, die nur für Dialoge sind und sonst keine Eigenschaften haben. In der Quest gibt es verschiedene Tabs, wo die Topics zu finden sind. Innerhalb eines einzelnen Dialogs kannst du wahrscheinlich das Audio hören.
Übrigens gibt es noch eine andere Vorgehensweise. Und zwar machst du den NPC im CK auf, denn du etwas sprechen lassen willst, da hat es einen Button links unter dem Namen, der nach meiner Erinnerung mit Dialogue beschriftet ist. Dann geht ein Fenster auf, wo sämtliche Dialoge drin sind, die dieser NPC sprechen kann. Wahrscheinlich ist es so, dass man mit Say() nur Dialoge kriegt, die der NPC darf. Wenn einer z.B. von Winterhold ist, kann er möglicherweise keine Dialoge von Rifton sprechen, auch wenn das keinen Script-Fehler ergibt.
 
Dann such mal nach Dialog oder Generic. Es gibt Quests, die nur für Dialoge sind und sonst keine Eigenschaften haben. In der Quest gibt es verschiedene Tabs, wo die Topics zu finden sind. Innerhalb eines einzelnen Dialogs kannst du wahrscheinlich das Audio hören.
Übrigens gibt es noch eine andere Vorgehensweise. Und zwar machst du den NPC im CK auf, denn du etwas sprechen lassen willst, da hat es einen Button links unter dem Namen, der nach meiner Erinnerung mit Dialogue beschriftet ist. Dann geht ein Fenster auf, wo sämtliche Dialoge drin sind, die dieser NPC sprechen kann. Wahrscheinlich ist es so, dass man mit Say() nur Dialoge kriegt, die der NPC darf. Wenn einer z.B. von Winterhold ist, kann er möglicherweise keine Dialoge von Rifton sprechen, auch wenn das keinen Script-Fehler ergibt.
Ich weiß leider noch nicht, wie ich so ein Topic korrekt verwende (wie wird es initialisiert, etc.).
Habe jetzt beispielsweise mal das "ActorCollidesWithActor" genommen, doch wieder höre ich nichts (ich force sämtliche NPCs rund um mich via Cloak-Spell - irgendjemand müsste da schon mal was sagen, wenn ich es richtig machen würde^^):
upload_2022-11-18_20-13-30.png


Code ist wieder derselbe wie oben, nur eben mit "ActorCollidewithActor" anstatt dem Wounded.
Ich glaube, das Initialisieren oder das Aufrufen passt noch nicht.
 
Hast du mal rechts in der Liste auf einen Eintrag doppelgeklickt?
Du musst überhaupt nichts initialisieren, alles, was sich auf der rechten Seite befindet, steht zu deiner Verfügung.
Say(CombatGrunt)

Das hier ist wohl der Fehler:
Topic GenericDialogueWoundedShared

Du musst schreiben: Topic Property GenericDialogueWoundedShared Auto
Dann das kompilieren. Dann kannst du mit der rechten Maustaste auf das Script im MagicEffect und Properties auswählen. Hier füllst du den richtigen Topic für GenericDialogueWoundedShared ab.
Wenn du nur Topic GenericDialogueWoundedShared schreibst, dann ist es eine Variable innerhalb des Scripts, die nicht einfach so gefüllt wird.

Tipp:
Topic Property MeinVerwundetDialog Auto <--Variablennamen können beliebig sein
Topic Property GenericDialogueWoundedShared Auto <-- Wenn der Name gleich wie etwa der Topic ist, kannst du aber Autofill klicken, was die Arbeit erleichtert
 
Hast du mal rechts in der Liste auf einen Eintrag doppelgeklickt?
Du musst überhaupt nichts initialisieren, alles, was sich auf der rechten Seite befindet, steht zu deiner Verfügung.
Say(CombatGrunt)

Das hier ist wohl der Fehler:
Topic GenericDialogueWoundedShared

Du musst schreiben: Topic Property GenericDialogueWoundedShared Auto
Dann das kompilieren. Dann kannst du mit der rechten Maustaste auf das Script im MagicEffect und Properties auswählen. Hier füllst du den richtigen Topic für GenericDialogueWoundedShared ab.
Wenn du nur Topic GenericDialogueWoundedShared schreibst, dann ist es eine Variable innerhalb des Scripts, die nicht einfach so gefüllt wird.

Tipp:
Topic Property MeinVerwundetDialog Auto <--Variablennamen können beliebig sein
Topic Property GenericDialogueWoundedShared Auto <-- Wenn der Name gleich wie etwa der Topic ist, kannst du aber Autofill klicken, was die Arbeit erleichtert
Bist der Beste - genau das wars.
Herzlichen Dank!
Dann fehlt mir nur noch die Antwort auf zwei Fragen:

1. Wie kann ich in xEdit oder CK schnell nach Dialogzeilen suchen? Beispiel: ich möchte jetzt die "yield" Zeile finden ("I yield! I yield!") - wie gehe ich am besten vor?
In xEdit gibt es zwar die Suche nach Namen, doch die setzt den Cursor immer nur ans nächste Ergebnis und zeigt keine Ergebnisliste. Im CK sind die Topics in den Quests versteckt, daher wirds hier schwierig beim Suchen.

2. Kann ich einzelne Zeilen (beim ActorCollideswithActor beispielsweise irgendeine der rechterhand ersichtlichen Zeilen) sprechen lassen?
 
1. Wie kann ich in xEdit oder CK schnell nach Dialogzeilen suchen?
Beide Tools sind nicht gut darin, sowas zu finden und gut darzustellen, aber das CK ist in dem Fall wohl besser. Natürlich habe ich auch schon an Dialogen herumgeschraubt und möglicherweise sogar mal das Say() benutzt, aber es ist nicht meine Domäne. Soweit ich weiss, musst du einfach mal alles durchforsten und dir merken, wo Zeug sein könnte.
Wenn ich gerade ein CK installiert hätte, würde ich nachsehen. Hast du probiert, die Zeilen rechts doppelt zu klicken? Es könnte da einen Button geben, um das Audio auszugeben.
 
Beide Tools sind nicht gut darin, sowas zu finden und gut darzustellen, aber das CK ist in dem Fall wohl besser. Natürlich habe ich auch schon an Dialogen herumgeschraubt und möglicherweise sogar mal das Say() benutzt, aber es ist nicht meine Domäne. Soweit ich weiss, musst du einfach mal alles durchforsten und dir merken, wo Zeug sein könnte.
Wenn ich gerade ein CK installiert hätte, würde ich nachsehen. Hast du probiert, die Zeilen rechts doppelt zu klicken? Es könnte da einen Button geben, um das Audio auszugeben.
OK, dann klick ich mich mal durch, danke.
Ja, das hab ich schon probiert, aber keinen solchen Knopf gefunden:
upload_2022-11-19_9-42-24.png
 
Es stellt sich außerdem heraus, dass man die Topics, welche in Klammern stehen, so nicht in der Property-Liste findet.
Eine Idee, wie ich diese zuordnen kann?

Edit: habe in xEdit gefunden, dass diese Dialoge keine EditorID, sondern nur eine FormID haben. Das schließt sie wohl für die Verwendung via Property aus? Gibt es einen anderen Weg?
 
Zuletzt bearbeitet:
Ich denke, dass die nicht dafür gedacht waren, dass die per Script genutzt werden. Man könnte denen aber eine EditorId geben, wenn man wollte.
Ich würde aber alles mit Vorbehalt nehmen, was ich zum Thema Dialoge sage, ich bin da nicht der Spezi.

Möglicherweise könntest du die bsa mit dem Audio an einen Ort entpacken und dann diese so anhören, musst halt einen Player haben, der das Format unterstützt. Oder du probierst halt herum, was die im Game sagen, wenn du NPC verschiedene Topics zuweist.
 
Ich hörs mir eh im Spiel an :)
Gibt es außer dir hier auch noch so bewanderte Modder oder warte in diesem Forum vergebens auf Unterstützung bzgl. Dialogen? (nur damit ich weiß, ob ich mich wo anders auch noch anmelden muss^^)

Danke für deine Hilfe!
 
Gibt es außer dir hier auch noch so bewanderte Modder oder warte in diesem Forum vergebens auf Unterstützung bzgl. Dialogen?
Die meisten sind halt gegangen, da die Games ausgezockt sind. Ich selbst habe Skyrim vor drei Wochen oder so deinstalliert, weil ich es nicht mehr ertragen konnte, und merkte, dass ich nur noch am Basteln bin, aber keine Lust mehr hatte, mich mit irgend wem in dem Game zu kloppen.
Kann aber sein, dass ich nächstens Skyrim wieder spontan installiere und zum Selbstzweck modde, weil nicht nur Bethesda versagt hat; fast jede mir bekannte und/oder einst geliebte Marke hat als letzte Version nur noch ein dünnes bis total abgefucktes Machwerk abgekriegt und ich kann in der Industrie nur noch Gier gepaart mit Inkompetenz erkennen. Da zocke ich doch lieber Creation Kit für Skyrim, als ein total abgefucktes Saints Row-Reboot, für das mir sogar fünf Mücken zu schade sind. Im Gaming bin ich inzwischen definitiv vom Zynismus bestimmt, dass ich überhaupt noch mit extrem wenig Hoffnung auf Starfield schiele, kann man nur mit purer Verzweiflung erklären.
Du bist wahrscheinlich sogar einer der wenigen Gründe, die mich überhaupt noch hier reinsehen lässt, ich habe ehrlich gesagt nicht mal mehr Lust einen Screenshot in "Andere Spiele" zu posten. Danke, Todd, der keinen Finger rührt, solange es noch was auszulutschen gibt. Anyway, ich glaube kaum, dass du ein interessanteres Bethesda-Forum finden wirst, es leiden alle am selben Problem.
 
Die meisten sind halt gegangen, da die Games ausgezockt sind. Ich selbst habe Skyrim vor drei Wochen oder so deinstalliert, weil ich es nicht mehr ertragen konnte, und merkte, dass ich nur noch am Basteln bin, aber keine Lust mehr hatte, mich mit irgend wem in dem Game zu kloppen.
Kann aber sein, dass ich nächstens Skyrim wieder spontan installiere und zum Selbstzweck modde, weil nicht nur Bethesda versagt hat; fast jede mir bekannte und/oder einst geliebte Marke hat als letzte Version nur noch ein dünnes bis total abgefucktes Machwerk abgekriegt und ich kann in der Industrie nur noch Gier gepaart mit Inkompetenz erkennen. Da zocke ich doch lieber Creation Kit für Skyrim, als ein total abgefucktes Saints Row-Reboot, für das mir sogar fünf Mücken zu schade sind. Im Gaming bin ich inzwischen definitiv vom Zynismus bestimmt, dass ich überhaupt noch mit extrem wenig Hoffnung auf Starfield schiele, kann man nur mit purer Verzweiflung erklären.
Du bist wahrscheinlich sogar einer der wenigen Gründe, die mich überhaupt noch hier reinsehen lässt, ich habe ehrlich gesagt nicht mal mehr Lust einen Screenshot in "Andere Spiele" zu posten. Danke, Todd, der keinen Finger rührt, solange es noch was auszulutschen gibt. Anyway, ich glaube kaum, dass du ein interessanteres Bethesda-Forum finden wirst, es leiden alle am selben Problem.
Mhm, verstehe dich absolut.
Ich habe angefangen Skyrim zu modden, da es jetzt endlich DRM-frei auf GOG verfügbar ist :D
Der Kampf ist auch ein Abtörner, darum arbeite ich gerade daran, alles etwas aufzupeppen - zumindest ist das die Idee^^
Meine aktuellen Ziele:
  • NPCs in eine Art "verwundet"-Status zu schicken (habe drei Animationen gefunden, die ich verwenden werde), wenn sie unter einem gewissen Prozensatz an Lebenspunkten sind.
  • NPCs im "verwundet"-Status sprechen lassen (Schmerz, Bitte um Hilfe, etc.)
  • Die paar Hintergrundvariablen (Prozentsatz fürs Niedergehen, verwundet-Audio ein/ausschalten) via MCM veränderbar machen.
Dann kommt der härtere Part:
  • NPCs bewegen sich je nach Verletzung anders (wenn es denn Animationen dazu gibt)
  • NPCs erhalten Mali je nach Verletzung (langsamere Regeneration von Ausdauer/Magica, langsamere Bewegungsgeschwindigkeit, schlechteres Ziel, etc.)
  • Befreundete NPCs können niedergegangene NPCs "wiederbeleben"
Mit dem ersten Part bin ich bald durch, so das Glück mich nicht verlässt. Der zweite Part wird schwierig und ich weiß noch nicht, ob ich das packe bzw. die Muße dazu habe.
Sobald der erste Teil aber mal steht und in Kämpfen eine sich gut anfühlende Abwechslung zwischen "stirbt sofort", "geht in den vanilla bleedout mode" und "geht in eine der 'verwundet'-animationen" herrscht, hab ich bestimmt auch mehr Bock aufs Kämpfen.
 
Ich habe jetzt das Thema, dass NPCs am Boden immer noch mit mir reden lol
Kann ich denen das irgendwie abdrehen? :D
Wie wäre es mit:
if myActor.IsBleedingOut() == false
Say(X)
endif

Lohnt sich sowieso, diese Seite mal anzusehen und sich annähernd zu merken, was möglich ist.
https://www.creationkit.com/index.php?title=Actor_Script

IsBleedingOut ist, glaube ich, auch eine Condition, die man in Dialogen verwenden kann, aber du solltest nicht unnötig Records ändern.