[Tutorial] Messages mit Papyrusskripts verbinden für Dummies

E

Ehemaliger Benutzer

Gast
Skripte mit Messages verbinden für Dummies



Begriffserläuterung:

LK = Links Klick
RK = Rechts Klick
TAB = Karteireiter des CK
Filter = Die kleine Zeile im Kopf des Object Window


Ziel der Übung:

[video=youtube;2PcNF4foTUE]http://www.youtube.com/watch?v=2PcNF4foTUE[/video]


Dieses Tutorial zeigt Euch wie Ihr eine Messagebox + die Textausgabe Messages erstellt und mit einem Pyprusskript verbindet, um aufzuzeigen wie das System funktioniert. Dazu wird eine Triggerbox & 3 Messages benötigt. Jetzt wird wieder jemand anmerken, dass man dazu doch auch die Debug Ausgabe von Papyrus kapern kann, da dies ja um so vieles einfacher und besser wäre....
Ja, könnte man, aber einfacher und besser?

Gegenargumente:

1.) Die Debug Ausgabe wurde dazu nicht gedacht, so dass keine Möglichkeit besteht einen Rückgabewert von ihr entgegen zu nehmen. Dies müsste man erst mit weiteren Skripting sozusagen "dazu bauen"....
2.) Es sinnfrei ist, jedesmal das Skript neu kompilieren zu müssen nur weil sich der/die Ausgabetext/e geändert hat/haben. Besonders witzig wird es, wenn man die Quelltexte nicht hat...
3.) Zeugt es von schlechtem Programmierstil, da Bethesda die Texte und Textausgabe Box nicht grundlos seit Fallout 3 in eine eigene Gruppe ausgelagert und in Papyrus eine spezielle Debugausgabe eingebaut hat.
4.) Man kann eine Torxschraube auch mit einem Schlitzschraubenzieher drehen, nur macht dass wenig Sinn wenn man einen Torxschraubendreher hat....

Das Skript

Das Skript ist kurz und simpel und enthält nur 3 Propertys, eine Variable vom Typ Integer sowie ein OnActivate Event.
Das Präfix der Propertys sowie des Skripts könnt Ihr frei Schnauze wählen, ich nehme wie immer meinen Nicknamen.

===============================================================================================================

ScriptName NNWMessageTutorialSkript extends ObjectReference

Message Property NNWFensterBox Auto
{Die MessageBox mit zwei Knoepfen}

Message Property NNWRichtig Auto
{Wenn die Antwort richtig ist}

Message Property NNWFalsch Auto
{Wenn die Antwort falsch ist}

Event OnActivate(ObjectReference akActionRef)

Int wert = NNWFensterBox.Show() ; Die MessageBox samt Variable für den Rückgabewert

If(wert == 0) ;Knopf 1
NNWRichtig.Show()
ElseIf(wert == 1) ;Knopf 2
NNWFalsch.Show()
Else ; Sollte aus einem unerfindlichen Grund sich ein anderer Wert in der Variablen befinden, geben wir eine Warnung über die Debug Ausgabe aus

Debug.Notification("Da funktioniert etwas nicht, den die Variable enthaelt weder 1 noch 0 sondern: " + wert)

EndIf
EndEvent


===============================================================================================================

Kompiliert das Skript und startet das CK.

Messages erstellen
Die EditorIds der Messages sollten genauso wie Namen der Propertys lauten, dann könnt ihr sie per Auto Fill im CK einbinden, ohne zuerst nach ihnen im Dropdownmenü des Skriptdialogs suchen zu müssen.

  1. Wählt in der Kategorie Miscellaneous den Unterpunkt Message aus. RK=>New. Gebt der neuen Nachricht die ID eurer ersten Property (NNWFensterBox) und kontrolliert ob das Häkchen vor MessageBox gesetzt ist.
  2. Gebt bei Title nun euren Messagetext ein, zum Beispiel: Wie hies der kaiser, der 433 der 3. Ära von der Mythischen Morgenröte ermordet wurde?

    MTut03.jpg
  3. Dann macht ihr in der Sparte Menu Buttons einen RK in die leere Tabelle und wählt NEW. In die jetzt aktive Zeile "Item Text" schreibt ihr die "richige" Antwort.
    Der "Knopf" bekommt als Index automatisch 0 zugewiesen. Der Index ist gleichzeitig der Rückgabewert, der beim Aufruf der Funktion Show() der zuvor definierten Variablen zugewiesen wird.
  4. Erstellt noch einen Knopf und schreibt eine "falsche" Antwort in die Textzeile.
    Schliesst das Fenster mit einem Klick auf OK.
  5. Nun erstellt noch eine Message (NNWRichtig) und gebt bei Message Text etwas sinnvolles wie z.B: Richtig, Uriel Septim wurde im Jahre 433 der 3. Ära durch die Mythische Morgenröte ermordet.
  6. Das selbe nochmal (NNWFalsch) und als Text: Ist nicht weiter schlimm, du warst ja nur dabei. Blindheit ist nicht strafbar.


Aktivator erstellen

  1. *]Geht in der Kategorie World Objects zum Unterpunkt Activators und nehmt am besten etwas simples wie zum Beispiel ImpButton01.
  2. Gebt diesem eine neue ID, schliesst das Fenster mit OK und öffnet den "neuen" Aktivator erneut. Löscht das angehängte Skript und schliesst das Fenster wieder mit LK auf OK. Dieses Prozedere ist leider notwendig, da beim ersten mal der Skriptanhang nicht gleich entfernt wird. CK Bug lässt grüssen....
    Öffnet den Aktivatordialog zum dritten mal, klickt bei Scripts auf Add und fügt euer vorher zuvor erstelltes Skript hinzu. MTut01.jpg
    Klickt nun auf Propertys und im neuen Dialog Fenster auf Auto Fill. MTut02.jpg
  3. Schliesst beide Dialogfenster mit OK und speichert Euer Plugin.

Das war schon die ganze Kunst. Platziert den Aktivator an einem Ort eurer Wahl und testet ihn Ingame.


Fragen / Anregungen / Verbesserungsvorschläge?
 
Hallo,

mal wieder ein schönes Tutorial von dir, das hier bestimmt einigen Moddern weiterhelfen wird.

Gruß, mde.
 
Skripte mit Messages verbinden - für Dummies - Teil 2

Begriffserläuterung:

LK = Links Klick
RK = Rechts Klick
Filter = Die kleine Zeile im Kopf des Object Window


Ziel der Übung:

[video=youtube;0A73XXbZq2A]http://www.youtube.com/watch?v=0A73XXbZq2A[/video]


Im 2.Teil werden nun 2 Messages mit dem Skript verbunden, damit dieses dem Spiel einen "Markieren und Rückkehrzauber" hinzufügt.
Dazu wird ausserdem eine XMarkerHeading und eine Dummyzelle zur Platzierung des Markers, ein Magiceffect sowie ein Zauber (welch Überraschung) benötigt.
Ich gehe davon aus, dass ihr wisst wie man eine leere Interior Zelle erstellt.

Das geänderte Skript

Das Skript ist kurz und simpel und enthält auch weiterhin nur 3 Propertys, eine Variable vom Typ Integer sowie ein OnEffectStart Event.
Dieses sorgt dafür, dass das Skript beim "Start" des Zaubers sofort ausgeführt wird. Damit der Shadereffect bei der Ausführung vom Messagefenster nicht unterbrochen wird könnte man den ausführenden Teil in ein zusätzliches Event => OnEffectFinish oder eine eigene Funktion verlagern. Oder, viel einfacher man verzögert die Anzeige des Meldungsfensters um 2 Sekunden. Ich habe mich für letzteres entschieden - Keep it simple.

================================================== ================================================== ===========

ScriptName NNWMessageTutorialSkript extends ActiveMagicEffect

Message Property NNWTeleportText Auto
{Die MessageBox mit zwei Knoepfen - Markieren = 0, Rueckkehr = 1}

Message Property NNWMarkierText Auto
{Position markiert}

ObjectReference Property NNWMarkerPosition Auto
{Der XMarker fuer den Rueckkehrteleport}

Event OnEffectStart(Actor akTarget, Actor akCaster)
Utility.Wait(2)
akCaster = Game.GetPlayer()

Int wert = NNWTeleportText.Show()

If(wert == 0)
NNWMarkerPosition.Disable() ;Marker deaktivieren
NNWMarkerPosition.MoveTo(akCaster) ; Zur Position des Spielers verschieben
NNWMarkerPosition.Enable() ; Marker wieder aktivieren
NNWMarkierText.Show() ;Bestaetigungsmeldung anzeigen
ElseIf(wert == 1)
akCaster.MoveTo(NNWMarkerPosition) ; Spieler zur Markerpostion verschieben
Else
Debug.Notification("Da funktioniert etwas nicht, den die Variable enthaelt weder 1 noch 0 sondern: " + wert)
EndIf
EndEvent


================================================== ================================================== ===========

Kompiliert das Skript und startet das CK.

Messages erstellen und XMarker platzieren


Die EditorIds der Messages sollten genauso wie Namen der Propertys lauten, dann könnt ihr sie per Auto Fill im CK einbinden, ohne zuerst nach ihnen im Dropdown Menü des Skriptdialogs suchen zu müssen.

  1. Wählt in der Kategorie Miscellaneous den Unterpunkt Message aus. RK=>New. Gebt der neuen Nachricht die ID eurer ersten Property (NNWTeleportText) und kontrolliert ob das Häkchen vor MessageBox gesetzt ist.


  2. Dann macht ihr in der Sparte Menu Buttons einen RK in die leere Tabelle und wählt NEW. In die jetzt aktive Zeile "Item Text" schreibt ihr "Position markieren".
    Der "Knopf" bekommt als Index automatisch 0 zugewiesen. Der Index ist gleichzeitig der Rückgabewert, der beim Aufruf der Funktion Show() der zuvor definierten Variablen zugewiesen wird.
  3. Erstellt noch einen Knopf und schreibt "Rückkehr" in die Textzeile.
    Schliesst das Fenster mit einem Klick auf OK.
  4. Nun erstellt noch eine Message (NNWMarkierText) und gebt bei Message Text etwas sinnvolles wie z.B: Aktuelle Position markiert. Schließt das Fenster mit OK.
  5. Erstellt eine neue Interiorzelle und ladet diese ins Render Window.
  6. Gebt im Filter des Object Windows XMarker ein, wählt in der Kategorie World Objects den Unterpunkt Static aus und zieht die FORM Object XMarkerHeading in eure Zelle. Vorsichtshalber solltet ihr ein Bodenteil irgendeines Tilesets unter dem Marker platzieren, für den Fall das versehentlich Rückkehr gewählt wurde, bevor zum ersten mal die Position Ingame markiert wird.

MTut05.jpg


Einen Magic Effect erstellen

1)Geht in die Kategorie Magic zum Unterpunkt Magic Effect und erstellt einen neuen Effekt: RK=>NEW und gebt diesem eine ID.
2)Selektiert in den Dropdownmenüs:
Name: Teleportation"
Effect Archetype: "Script".
Casting Type: "Fire and Forget"
Delivery: Selbst
Magic Type: "Veränderung".
Minimum Skill Level: 5

Setzt unter Flags bei FX Persist, No Magnitude und No Area das Häkchen.

4) Wechselt in die Spalte Visual Effects und ändert im Dropdown Menü von Menu Display Object darüber den Wert auf Magic Hat Marker.
5) In der Zeile Casting Art stellt ihr: FXLightSpellHandEffects, bei Casting Light:MagicLightLightSpeelHand01 und bei Hit Effect Art: ShieldSpellBodyFX ein.

6) Jetzt sind die Sounds an der Reihe:
Draw/Sheathe: MAGAlterationLightDrawSheatheLPMSD
Charge: MAGLightChargeSD
Ready: MAGLightReadyLPSD
Release: MagicLightFireSD

7)Fügt nun eurer Papyrus Skript dem Effekt hinzu, füllt die Propertys, schliesst das Dialogfenster mit OK und speichert Euer Plugin.


MTut04.jpg

MTut06.jpg

Einen neuen Zauber erstellen

1) Bleibt in der Kategorie Magic und wählt Spell. Erstellt einen neuen Eintrag RK => NEW.
2) Gebt ihm eine ID und sinnvollen Namen: vielleicht Markieren & Rückkehr?
3) In den Dropdownmenüs stellt ihr folgendes ein:
Type: Zauber
Casting: "Fire and Forget"
Delivery: Selbst
Menu Display Object: MagicHatMarker
Equip Type: BothHands

MTut07.jpg

Macht einen RK in die Effects Tabelle =>New und sucht im Menü neben Effect nach eurem zuvor erstellten Magic Effect. Schliesst beide Dialogfenster mit OK und speichert das Plugin.

Ein Zauberbuch erstellen

Wechselt jetzt in die Kategorie Items=>Book und gebt im Filter des Object Window spelltomecandle ein. Es bleibt ein Zauberspruchbuch übrig. RK=>Edit. Gebt ihm eine neue ID und Namen, passt den Beschreibungstext ein wenig an und stellt unter Spell euren neuen Zauberspruch ein. Platziert dann das Buch an einem Ort in der Spielewelt und testet den Zauber Ingame.


Fragen / Anregungen / Verbesserungsvorschläge?
 
Zuletzt bearbeitet von einem Moderator:
Zu was man sich von Frauen alles überreden lässt.
Da der Thread sowieso bald in den Tiefen des Forums verschwindet, ist es egal. Liest ja doch keiner :-D
 
Rückgabewerte in Messages



Begriffserläuterung:

LK = Links Klick
RK = Rechts Klick
TAB = Karteireiter des CK
Filter = Die kleine Zeile im Kopf des Object Window


Ziel der Übung:

[video=youtube;Tc62N6Ks8Xk]http://www.youtube.com/watch?v=Tc62N6Ks8Xk[/video]

Im 3.Teil geht es nun um die Anzeige von Rückgabewerten aus Skript Variablen in Messages.

Das Skript

===============================================================================================================

ScriptName NNWMessageTutorialSkript extends ObjectReference

Message Property NNWFensterBox Auto
{Die MessageBox}

Potion[] Property trank Auto
{Ein Potion Array}

Event OnActivate(ObjectReference akActionRef)

Int zahl = Game.GetPlayer().GetItemCount(trank[0])
Int zahl2 = Game.GetPlayer().GetItemCount(trank[1])

Int NNWFensterBox.Show(zahl, zahl2) ; Die MessageBox samt Variablen für den Rückgabewert

EndEvent

===============================================================================================================

Kompiliert das Skript und startet das CK.

Message ändern und Aktivator anpassen

  1. Wählt in der Kategorie Miscellaneous den Unterpunkt Message aus und öffnet die Nachricht aus Teil 1 (NNWFensterBox). Entfernt die beiden Buttontexte sowie den Titeltext und schreibt stattdessen bei Message Text: Du hast %.0f Zaubertrank der Heilung und %.0f Zaubertrank der Ewigen Heilung im Inventar.
  2. Schließt das Fenster mit OK.
  3. Geht in der Kategorie World Objects zum Unterpunkt Activators und öffnet den in Teil 1 erstellten Aktivatorbutton. Öffnet die Property des angehängte Skripts mit einem doppelten LK und markiert die Potion Property. Klickt auf Edit Value und dann auf ADD. Fügt im Dropdownmenü neben Pick Object den Heiltrank RestoreHealth02 dem Array hinzu. Klickt mit der Maus in den leeren Bereich der Tabelle und markiert anschließend den ersten Eintrag: RestoreHealth02(0003EADE). Drückt nun auf Duplicate, markiert den zweiten Eintrag und ändert ihn zu RestoreHealth06(00039BE5). Markiert ihn erneut und schließt das Fenster mit OK.
  4. Schließt das Aktivator Dialogfenster ebenfalls mit OK und speichert Euer Plugin.

Was bedeuted nun genau: %.0f?
Das Prozent Zeichen leitet einen Variablenplatzhalter ein. Da Skyrim an dieser Stelle immer eine Float als Wert erwartet habe ich mittels der Angabe .0f die Nachkommastelle auf ein Zeichen beschränkt. Es sind maximal Zehn Variablen gleichzeitig pro Messageaufruf erlaubt, die mittels Kommas voneinander getrennt in die Klammern der Funktion Show() geschrieben werden => (zahl, zahl2).


Das war schon die ganze Kunst. Platziert den Aktivator an einem Ort eurer Wahl und testet ihn Ingame.


Fragen / Anregungen / Verbesserungsvorschläge?