[Gelöst] Modding Tutorial? (Cloak Spell)

HughJanus

Neuankömmling
Hallo zusammen,

das Skyrim nun auf GOG verfügbar ist, würde ich auch gerne in die Modding-Szene einsteigen. Ein laufendes CK habe ich bereits - und auch schon nach diesem Tutorial versucht, eine Mod zu erstellen (https://www.creationkit.com/index.php?title=Dynamically_Attaching_Scripts). Leider passiert ingame gar nichts (eigentlich sollte links oben am Schirm der zugefügte Schaden im Kampf angezeigt werden).
Weiß jemand, ob dieses Tutorial noch aktuell ist bzw. warum es bei mir mit diesem Tutorial nicht funktioniert? (esp nicht anbei, da ich die hier wohl nicht hochladen kann)

Beste Grüße,
HJ
 
Ich habe jetzt etwas recherchiert und anschließend das Papyrus-Log geprüft.
Dort steht Folgendes:
Unable to bind script MonitorScript to Active effect %stets anderer Wert% on %stets anderer Wert% because their base types do not match

Ich habe alles genau nach Anleitung gemacht. Der Error tritt nicht mehr auf, wenn ich den "MagicEffect", der das Skript beinhaltet auf Typ "Spell" ändere (aktuell vom Typ "Script"). Doch dann passiert ingame auch nichts.
 
Im Prinzip kann man Scripte auf jeden MagicEffect setzen, das beschränkt sich nicht nur auf Archetype Script. Man wählt diesen Typ, wenn es etwa ein für den Spieler unsichtbarer konstanter Effekt ist, der mit einem Script einen Actor überwacht. MonitorScript klingt genau nach dem.

Aber wenn ein Script auf einem MagicEffect steht, muss es in der obersten Zeile so aussehen:
Scriptname MonitorScript extends ActiveMagicEffect

Das mit dem "because their base types do not match" bedeutet, dass das Script etwa "extends ObjectReference" statt "extends MagicEffect" drin hat. Wobei das eigentlich regulär nicht möglich sein sollte, weil das CK nur die richtigen Scripte vorschlagen sollte. Oder es könnte sein, dass das Script an den falschen Ort kompiliert wurde, d.h. nicht nach Data/Scripts, dann wird es nicht gefunden.

Auf jeden Fall erscheint mir dieses Tutorial absolut aktuell, auch wenn ich nicht jede Zeile durchgelesen habe. Grundsätzlich hat sich an diesem Verfahren auch seit 2011 überhaupt nichts geändert, in egal welcher Edition.

Aber bitte gib nicht auf, ich werde dir gerne weiterhelfen, falls mehr Fragen sind.
 
Im Prinzip kann man Scripte auf jeden MagicEffect setzen, das beschränkt sich nicht nur auf Archetype Script. Man wählt diesen Typ, wenn es etwa ein für den Spieler unsichtbarer konstanter Effekt ist, der mit einem Script einen Actor überwacht. MonitorScript klingt genau nach dem.

Aber wenn ein Script auf einem MagicEffect steht, muss es in der obersten Zeile so aussehen:
Scriptname MonitorScript extends ActiveMagicEffect

Das mit dem "because their base types do not match" bedeutet, dass das Script etwa "extends ObjectReference" statt "extends MagicEffect" drin hat. Wobei das eigentlich regulär nicht möglich sein sollte, weil das CK nur die richtigen Scripte vorschlagen sollte. Oder es könnte sein, dass das Script an den falschen Ort kompiliert wurde, d.h. nicht nach Data/Scripts, dann wird es nicht gefunden.

Auf jeden Fall erscheint mir dieses Tutorial absolut aktuell, auch wenn ich nicht jede Zeile durchgelesen habe. Grundsätzlich hat sich an diesem Verfahren auch seit 2011 überhaupt nichts geändert, in egal welcher Edition.

Aber bitte gib nicht auf, ich werde dir gerne weiterhelfen, falls mehr Fragen sind.

Danke für die Antwort.
Das Skript sieht so aus (also eigentlich korrekt, nach dem was du beschreibst):
Code:
Scriptname MonitorScript extends ActiveMagicEffect 
 
Actor MySelf
Float Health
 
Event OnEffectStart(Actor akTarget, Actor akCaster)
    MySelf = akTarget
    Health = MySelf.GetActorValue("Health")
    RegisterForSingleUpdate(0.25)
EndEvent
 
Event OnUpdate()
    Health = MySelf.GetActorValue("Health")
    RegisterForSingleUpdate(0.25)
EndEvent
 
Event OnEffectFinish(Actor akTarget, Actor akCaster)
    UnregisterForUpdate()
EndEvent
 
Event OnHit(ObjectReference akAggressor, Form akSource, Projectile akProjectile, bool abPowerAttack, \
  bool abSneakAttack, bool abBashAttack, bool abHitBlocked)
    Float Damage = Health - MySelf.GetActorValue("Health")
    Health = MySelf.GetActorValue("Health")
    if (akAggressor == Game.GetPlayer()) && (Damage > 0)
        Debug.Notification("You did " + Damage as Int + " points of damage.")
    endif
EndEvent

Ich arbeite im CK der Steam Version, die Mod läuft beim Testen aber in der GOG Version - laut Nexus sollte das keine Auswirkungen haben (es werden auch nur vanilla Papyrus-Befehle benutzt, kein SKSE oder sonstiges).
Woran könnte es noch liegen?
Den Cloak-Spell sehe ich am Charakter, doch es passiert einfach nichts. Dem Error zufolge, hat es wohl ausschließlich mit dem Script zu tun.

Ganz oben im Log bekomme ich auch diese Meldung:
Code:
Cannot open store for class "MonitoringScript", missing file?
Doch laut Recherche bedeutet die nichts (bzw. ist kein Indikator für einen Fehler) und nur Bethesda-Jank.
 
Doch laut Recherche bedeutet die nichts (bzw. ist kein Indikator für einen Fehler) und nur Bethesda-Jank.
Ich würde das nicht als Bagatelle betrachten, ich arbeite ja nicht bei Bethesda ;)
Es gibt in Logs tausende Zeilen, die keine Bedeutung haben, aber diese musst du ernst nehmen.

Es kann ein Indikator dafür sein, dass die PEX-Datei nicht am richtigen Ort ist. Möglicherweise hat es in einer Ini einen falschen Pfad, was dazu führt, dass Scripte an den falschen Ort kompiliert werden.
Um sicherzugehen, kannst du sinngemäss folgende Zeilen jeweils als erste Zeile in OnEffectStart und OnHit reinkopieren, die anschliessend im Log stehen sollten:
Debug.Trace("Meine Mod: Effekt gestartet")
 
Ich würde das nicht als Bagatelle betrachten, ich arbeite ja nicht bei Bethesda ;)
Es gibt in Logs tausende Zeilen, die keine Bedeutung haben, aber diese musst du ernst nehmen.

Es kann ein Indikator dafür sein, dass die PEX-Datei nicht am richtigen Ort ist. Möglicherweise hat es in einer Ini einen falschen Pfad, was dazu führt, dass Scripte an den falschen Ort kompiliert werden.
Um sicherzugehen, kannst du sinngemäss folgende Zeilen jeweils als erste Zeile in OnEffectStart und OnHit reinkopieren, die anschliessend im Log stehen sollten:
Debug.Trace("Meine Mod: Effekt gestartet")
Wie kann sie denn am falschen Ort sein? Ich mache alles übers Creation Kit - Spells mit Effekten werden erstellt, dann via QuestAlias der Cloak-Spell dem Spieler zugeordnet (in der Theorie trigger der Cloak-Spell dann den nächsten Spell, wenn ein NPC mit dem Cloak kollidiert - dieser Spell entscheidet, dann ob die Ability auf den NPC übertragen wird (wenn dieser nicht tot ist und die Ability nicht schon hat). Ich kann mir da keine Pfade oder ini-Einträge aussuchen..?
Wo muss ich ansetzen, um die Papyrus-Datei an einen anderen/richtigen Ort schieben zu können? Alles was ich habe, ist eine .esp, die all meine Effekte, Spells und die Quest beinhaltet.
 
Befindet sich dein Script in Data/Scripts?
Gibt es Log-Meldungen aus, wenn du Debug.Trace nutzt?
Ich habe gestern nichts mehr probiert.
Verstehe noch nicht ganz, was du mit dem Skript bzw. der .pex Datei meinst. Ich speichere sämtlichen Content aus dem Creation Kit als .esp - eine andere Datei erhalte ich nicht. Wo soll ich die .pex hernehmen?
 
Wenn du ein neues Script entwirfst, dann hat es die Endung psc, und kann mit einem Notepad bearbeitet werden. Damit das Script aber vom Game gefunden wird, muss es vom CK zu einer pex-Datei kompiliert werden, die in Data/Scripts liegen muss.

Ich würde zuerst mal das hier durchlesen, bevor du weiter machst.
https://www.creationkit.com/index.php?title=Bethesda_Tutorial_Papyrus_Hello_World
Danke. Ich denke, die Infos aus dem Link habe ich verstanden.
Was neu für mich ist (steht aber auch nicht im Link) ist, dass die Skripte nicht IN der .esp Datei gespeichert werden, sondern außerhalb in einem Verzeichnis.
Ich habe Mods installiert, von denen ich überzeugt war, dass diese mit Skripten arbeiten - sie haben jedoch nur eine .esp Datei (was bedeuten würde, dass dem nicht so ist).
Verstehe ich das richtig? Jede Mod, die eigens geschriebene Skripte verwendet, muss neben der .esp auch das "Scripts" Verzeichnis im Archiv besitzen?
 
sie haben jedoch nur eine .esp Datei
Nur neue Scripte müssen mitgeliefert werden, wenn man vorhandene aus Vanilla verwendet, nicht. Bei dir braucht es eine esp und eine pex-Datei. psc-Dateien als Source-Datei können, müssen aber nicht mitgeliefert werden.

Vor Fallout 4 waren die Scripte übrigens tatsächlich in einer esp.
 
Nur neue Scripte müssen mitgeliefert werden, wenn man vorhandene aus Vanilla verwendet, nicht. Bei dir braucht es eine esp und eine pex-Datei. psc-Dateien als Source-Datei können, müssen aber nicht mitgeliefert werden.

Vor Fallout 4 waren die Scripte übrigens tatsächlich in einer esp.
Das ist dann bestimmt der Fehler. Sobald ich das verifizieren konnte, melde ich mich wieder. Vielen Dank!
 
Nur neue Scripte müssen mitgeliefert werden, wenn man vorhandene aus Vanilla verwendet, nicht. Bei dir braucht es eine esp und eine pex-Datei. psc-Dateien als Source-Datei können, müssen aber nicht mitgeliefert werden.

Vor Fallout 4 waren die Scripte übrigens tatsächlich in einer esp.
Das wars, jetzt bekomm ich zumindest einen aussagekräftigeren Error:
Code:
    [ (00013491)].WIDeadBodyCleanupScript.AddSpell() - "<native>" Line ?
    [Active effect 6 on  (00013491)].ApplyingScript.OnEffectStart() - "ApplyingScript.psc" Line 6
[11/11/2022 - 05:52:06AM] Error: Cannot add a None spell to the actor

Das ist jenes Skript, das im Effek des Spells aufgerufen wird, der im Cloak Effect das "Assoc. Item 1" ist. Es wird im Spell geprüft ob der Actor tot ist oder bereits die Monitoring-Ability besitzt - trifft beides nicht zu, wird die Monitoring-Ability auf den Actor angewendet.
Die Zeile des Anwendens wirft diesen Error.

So sehen die Eigenschaften der Monitoring-Ability aus (alles wie im Tutorial):
upload_2022-11-11_6-1-36.png
 
Das ist jenes Skript, das im Effek des Spells aufgerufen wird, der im Cloak Effect das "Assoc. Item 1" ist.
Sind im Script auf dem Cloak-MagicEffect die Werte gefüllt? Mit rechter Maus-Taste auf das Script, dann Properties wählen. Alle Felder darin müssen gefüllt sein, das macht das CK nicht automatisch. None bedeutet, dass eine Variable keinen Wert enthält, z.B. dies hier:
Spell Property CloakAbility Auto

Siehe hier:
https://www.creationkit.com/index.php?title=Dynamically_Attaching_Scripts#Filling_Properties
https://www.creationkit.com/index.php?title=Papyrus_Introduction#Setting_Property_Data_in_the_Editor
 
Sind im Script auf dem Cloak-MagicEffect die Werte gefüllt? Mit rechter Maus-Taste auf das Script, dann Properties wählen. Alle Felder darin müssen gefüllt sein, das macht das CK nicht automatisch. None bedeutet, dass eine Variable keinen Wert enthält, z.B. dies hier:
Spell Property CloakAbility Auto

Siehe hier:
https://www.creationkit.com/index.php?title=Dynamically_Attaching_Scripts#Filling_Properties
https://www.creationkit.com/index.php?title=Papyrus_Introduction#Setting_Property_Data_in_the_Editor
Ja, das war's.
Ich sehe jetzt zwar den Cloak Effect im Spiel nicht mehr und es passiert auch nichts, doch es gibt keine Logeinträge mehr für die Mod^^
Wo fange ich an, den Fehler zu suchen? :)
 
Ich würde an allen relevanten Orten Debug-Meldungen ausgeben, damit man sieht, dass einzelne Programmteile funktionieren. Und zwar überall, wo Scripte gestartet werden, bevor if-Statements.
Kann man sinngemäss so machen:
Debug.Trace("Cloak: Stelle 1 durchlaufen")
Debug.Trace("Monitor: Stelle 2 durchlaufen")
Debug.Trace("Monitor: OnHit gestartet")

Ich habe das Problem auch immer, dass ich nicht genau weiss, ob Dinge funktionieren. Es müssen nicht unbedingt Script-Fehler sein.
Actor- und MagicEffect-Scripte werden ausserhalb des Grids entladen. Du hast einen falschen Save geladen, wo der Spieler den Effekt noch nicht hat. Manche Scripte werden nicht geupdatet, wenn der Effekt mal gestartet hat und mal in einem Save ist.
Für solche Aufgaben merke ich mir einen Save vor einem Dungeon, den ich noch nie betreten habe und bevor die neue Funktion installiert wurde. Dann bei jeder Änderung deiner Mod diesen Save laden, Funktion starten und in den Dungeon gehen. Dann Logs lesen und auswerten.
Wenn du aus irgendeinem Grund einen Test machst mit einem Save, in dem Leute den Effekt bereits bekommen haben, dann solltest du den Spell den NPC oder dir per Konsole abnehmen und eventuell wieder geben. Es ist nicht garantiert, dass Script-Änderungen bei einem laufenden MagicEffect upgedatet werden.

Ich habe übrigens Skyrim gerade nicht installiert, sonst hätte ich gerne deine Mod getestet.
 
Ich würde an allen relevanten Orten Debug-Meldungen ausgeben, damit man sieht, dass einzelne Programmteile funktionieren. Und zwar überall, wo Scripte gestartet werden, bevor if-Statements.
Kann man sinngemäss so machen:
Debug.Trace("Cloak: Stelle 1 durchlaufen")
Debug.Trace("Monitor: Stelle 2 durchlaufen")
Debug.Trace("Monitor: OnHit gestartet")

Ich habe das Problem auch immer, dass ich nicht genau weiss, ob Dinge funktionieren. Es müssen nicht unbedingt Script-Fehler sein.
Actor- und MagicEffect-Scripte werden ausserhalb des Grids entladen. Du hast einen falschen Save geladen, wo der Spieler den Effekt noch nicht hat. Manche Scripte werden nicht geupdatet, wenn der Effekt mal gestartet hat und mal in einem Save ist.
Für solche Aufgaben merke ich mir einen Save vor einem Dungeon, den ich noch nie betreten habe und bevor die neue Funktion installiert wurde. Dann bei jeder Änderung deiner Mod diesen Save laden, Funktion starten und in den Dungeon gehen. Dann Logs lesen und auswerten.
Wenn du aus irgendeinem Grund einen Test machst mit einem Save, in dem Leute den Effekt bereits bekommen haben, dann solltest du den Spell den NPC oder dir per Konsole abnehmen und eventuell wieder geben. Es ist nicht garantiert, dass Script-Änderungen bei einem laufenden MagicEffect upgedatet werden.

Ich habe übrigens Skyrim gerade nicht installiert, sonst hätte ich gerne deine Mod getestet.
Habs jetzt mit folgendem Tutorial geschafft (in Kombination mit dem Artikel aus dem Eingangspost): Link
Danke für deine Unterstützung! Der Knackpunkt war bestimmt, dass ich die Skript-Files nicht mit-installiert habe.

Edit: lol :D Link
 
  • Like
Reaktionen: PixelMurder