Script - Fehler in der Papyrus.log

Eigengrau

Abenteurer
Hallo.

Leider ist mir kein besserer Beitragstitel eingefallen, daher allgemein gehalten.

Ich habe mich an einem kleinen Script versucht (nur 1KB groß und nicht riesiges) was einen Effekt auf den Spieler legen soll sobald dieser sich in den Schleichmodus begeben tut. Die erste gute Nachricht ist (und das hat mich schon vom sprichwörtlichen Hocker gehauen): Im Spiel funktioniert es. Ich ziehe die Rüstung an (auf welcher das Script liegt) und sobald ich mit dieser Rüstung in den Schleichmodus wechsle bekommt mein Char diesen Spell und wenn ich wieder aufstehe wird der Spell wieder entfernt.

Nun wollte ich sehen ob das Spiel da irgendetwas zu meckern hat und habe in der INI Datei das logging angeschaltet. Ich war nur ganz kurz im Spiel um das Script zu testen und als ich wieder aus dem Spiel draußen war hatte ich eine 82KB große Log-Datei (und Panik im Gesicht). Nun sieht das echt furchtbar aus was da so alles an Fehlermeldungen drinnen steht, wobei das meiste nichts mit meinem Script zu tun hat sondern oft mit dem DLC und etlichen anderen Scripts (was die Sache irgendwie nicht besser macht und ich mich frage ob das so sein sollte bzw. darf?).

Konkret aber zu meiner Fehlermeldung die da lautet:



[12/19/2021 - 04:50:56PM] error: Cannot add a None spell to the actor
stack:
[ (00000014)].Actor.AddSpell() - "<native>" Line ?
[Item 145 in container (00000014)].Eigengrau:Eigengrau_ProjektLedaScript.OnEquipped() - "<unknown file>" Line ?
[12/19/2021 - 04:50:57PM] error: Cannot add a None spell to the actor
stack:
[ (00000014)].Actor.AddSpell() - "<native>" Line ?
[Item 117 in container (00000014)].Eigengrau:Eigengrau_ProjektLedaScript.OnEquipped() - "<unknown file>" Line ?
[12/19/2021 - 04:52:14PM] VM is freezing...
[12/19/2021 - 04:52:14PM] VM is frozen
[12/19/2021 - 04:52:15PM] Log closed


Kann damit jemand etwas anfangen? Also was ist damit gemeint dass die Datei nicht gefunden wird? Stört das Spiel sich da vielleicht an dem Doppelpunkt? Ich selbst habe eine Weile gebraucht um zu verstehen dass Bethesda mit so einem Doppelpunkt einen Ordner-Unterordner meint, also statt "/" hier ein ":" (konkret lautet der Pfad "Scripts/Eigengrau/Eigengrau_ProjektLedaScript.pex"). Und was meint das Spiel damit dass es den Spell nicht auferlegen kann!? Im Spiel ist dieser vorhanden. Und warum steht dort dass der VM eingefroren ist?

Ich finde diese Papyrus.log Datei echt erschreckend schlimm da diese voll mit Fehlermeldungen ist. Die obigen Dinge lese ich zum Teil auch bei vielen anderen vanilla Scripts in der Log. Eigentlich sollte ein Spiel doch so gemacht sein dass nicht schon von Haus aus etliche Fehlermeldungen erscheinen.

Nun ja, ich hoffe hier kann mich jemand etwas beruhigen ohne dass ich wieder zu viel Baldrian schlucken muß. :p

Und dann gleich eine Frage hinterher (Edit: Ich denke damit hat es etwas zu tun!?):

Ich habe ein Rüstungs-Sets aus Rüstung + dem Helm und dafür nutze ich nur ein (1) Script (das oben genannte) um einen Effekt für die Rüstung und einen für den Helm zu zuweisen (diese 2 Befehle stehen also in dem einen Script). Kann man das beides in einem Script stehen haben oder sollte man besser für jeden Befehl ein eigenes Script erstellen? Wird das Script eher nacheinander abgearbeitet oder sucht sich das Spiel nur die Befehle/die Stellen raus die es benötigt und ignoriert die anderen die gerade nicht angefordert sind (ich frage da es ansonsten ständig zu Fehlermeldungen kommen müsste wenn der Char jetzt gerade nur die Rüstung trägt nicht aber den Helm und dann das Script aktiviert wird wo ja die Befehle für beide Rüstungsteile drinne stehen)?

Lieben Gruß und Danke für's lesen!


Edit:

Falls es jemandem hilft hier ist das ganze Script auf was sich die obige Fehlermeldung bezieht:


ScriptName Eigengrau:Eigengrau_ProjektLedaScript extends ObjectReference Const

;-- Properties --------------------------------------
Spell Property SpellRuestung_Stealth Auto Const mandatory
Spell Property SpellHelm_Detect Auto Const mandatory
;-- Variables ---------------------------------------

;-- Functions ---------------------------------------

Event OnEquipped(Actor akActor)
akActor.AddSpell(SpellRuestung_Stealth, True)
akActor.AddSpell(SpellHelm_Detect, True)
EndEvent

Event OnUnequipped(Actor akActor)
akActor.RemoveSpell(SpellRuestung_Stealth)
akActor.RemoveSpell(SpellHelm_Detect)
EndEvent
 
Zuletzt bearbeitet:
Also zuerst sollte man auch für sich selber genauer dokumentieren, was das Skript wie genau macht.

Dann: wird der Zauberspruch zur Sprücheliste des Spielers hinzugefügt, oder soll der Zauber einfach nur ausgesprochen werden, al la Abracadabra und x ist für y Zeiteinheiten verzaubert?
Also beispielsweise, man zieht die Rüstung an, und anschließend werden sternförmig Feuerbälle ausgesprochen, in jede Himmelsrichtung.


Zaubersprüche selber haben auch immer noch gewisse Einstellungen, die sie voneinander unterscheiden. Es gibt verschiedene Zauberspruchtypen, mit verschiedenen Auswahlmöglichkeiten.
Dieses muss genauer untersucht und verstanden werden - erst dann mit dem Scripten weitermachen. ;)

Und dann noch: braucht man überhaupt ein Script, oder reicht nicht auch eine einfache Rüstungsverzauberung?
 
Scripte kommentieren tue ich in der Regel schon aber nun nicht bei so einem paar Zeilen Script unbedingt. Das hat sicher trotzdem Vorteile aber zumindest sehe ich da derzeit keine Notwendigkeit oder Mehrwert da es mich nicht weiterbringt.

Der Zauber soll weder in die Leiste noch irgendwo hin oder grafische Effekte. Der Zauber ist an die Rüstungsteile gebunden und wird aktiv sobald sich der Spieler in den Schleichmodus begibt und wird wieder deaktiviert sobald der Schleichmodus verlassen wird.

Das bringt mich auch gleich zum letzten Punkt: Eine Rüstungsverzauberung wäre, soweit ich weiß, permanent. Das ist hier aber nicht gewollt von mir.


Das obige Script lässt sich kompilieren und funktioniert im Spiel auch wie gewollt. Die Fehlermeldungen kommen wohl daher weil wohl immer das ganze Event abgearbeitet wird, unabhängig von der vordefinierten Sprungmarke in der ESL Datei (also SpellRuestung_Stealth oder SpellHelm_Detect).

Würde ich beides in ein eigenes Event setzen müßte es wohl klappen oder auch mit einer Wenn-dann Schleife - aber so viel Erfahrung habe ich mit dem scripten dann eher doch nicht.

Ich hatte mich an so etwas versucht aber das klappt gar nicht:


Event OnEquipped(Actor akActor)
if
akActor.EquipItem(Eigengrau_Armor_SingleSuit, True)
than
akActor.AddSpell(SpellRuestung_Stealth, True)
endif
if
akActor.EquipItem(Eigengrau_Armor_SingleHelm, True)
than
akActor.AddSpell(SpellHelm_Detect, True)
endif
EndEvent


Die einfachste Lösung die ich bisher habe (die auch funktioniert) ist das ganze auf 2 Scripts aufzuteilen, ein Script für die Brustplatte und ein Script für den Helm. Das funktioniert auch und vielleicht sollte ich es dabei belassen, auch wenn ich persönlich das eher nicht so glücklich finde da sich das Spiel ab und an (nicht immer) "verschluckt" und eines der Scripts dann unterschlägt/nicht abarbeitet (vielleicht müßte ich dagegen dann eine Art Timer einbauen dass nicht beide zeitgleich starten!?). Ich finde es schon etwas merkwürdig dass so ein Spiel mit 64-Bit Grundgerüst überhaupt manchmal nicht mit so Mini-Fitzel-Scripten hinterher kommt.
 
Manche Einträge in den Logs sind fast unvermeidlich. Manche Funktionen brauchen einen Actor und Mesh, deren 3D geladen ist und wenn man sich durch die Welt bewegt, können Scripte noch laufen, aber die Actors sind bereits entladen.

Folgender Check kann sinnlose Fehler unterdrücken. "if akActor" fragt ab, ob die eingehende Referenz ein Actor und geladen ist.
Event OnEquipped(Actor akActor)
if akActor
akActor.EquipItem(Eigengrau_Armor_SingleSuit, True)
endif


Du kannst und sollst Scripte schreiben, die wiederverwendbar sind. In dem Fall kannt du das problemlos jeder Rüstung anhängen, die im Stealth-Modus einen bestimmten Spell kriegen soll. Mit dem selben Script kannst du Rüstung A Effekt A zuweisen und Rüstung B Effekt B oder auch A.
 
Ich habe mal die Log-Datei durchgesehen und die ist wirklich irre. Fehler über Fehlermeldungen/Warnmeldungen und dergleichen. Das alles aber von vanilla Sachen inklusive des offiziellen DLC. An Mods habe ich derzeit gar keine drauf sondern in diesem extra dafür angelegten immer nur die aktuelle Mod aktiv an der ich gerade herumfummeln tue.

Die Fehlermeldung aus meinem Eingangsbeitrag kommt in der Tat dadurch dass beide Befhle in einem Event sind und das Script dort alles abarbeitet. Kommt Spell A dann auf Rüstung A und Spell B auf Helm B funktioniert das auch alles. Wenn ich dann aber z.B. Helm B nicht trage und das Script aber versucht den Spell darauf zu legen wird diese kryptische Fehlermeldung ausgegeben (auch wenn die eher besagt dass die Datei nicht gefunden werden kann).

@PixelMurder
Danke für die Richtigstellung mit dem Script, das werde ich gerne gleich mal ausprobieren ob dann noch eine Fehlermeldung erscheint. Ich nehme an jeder Befehl muß in eine eigene If-Abfrage?! Na, ich probiere es gleich mal aus. Mit Scripten bin ich nicht fit und mache damit auch wenig (zumindest mit solchen). So war ich schon froh dass das so überhaupt funktionierte.


Edit:

Viel habe ich nun ausprobiert aber weiter bin ich leider noch nicht. Ich würde das schon gerne in einem einzigen Script unterbringen aber da komme ich einfach nicht weiter.

Wenn ich Rüstung A anhabe und Helm B dann klappt alles. Wenn ich aber nur Rüstung A anhabe oder auch nur den Helm B (also nur ein Teil) dann sagt mir das Log-File dass das Objekt nicht gefunden werden kann (weil ich es ja auch nicht trage) und das Script den Befehl dafür trotzdem ausführt.

Ich hatte dein obiges Beispiel probiert, mit beiden Spells in einer If-Abfrage oder auch seperat in einer If-Abfrage. Oder es auch so:

Event OnEquipped(Actor akActor)
if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellAnzug_Stealth, True)
Game.GetPlayer().AddSpell(SpellHut_Detect, True)
endif
EndEvent

Es muß doch irgendwie bestimmt möglich sein dass der jeweilige Befehl nur dann ausgeführt wird wenn ich das jeweilige Rüstungsteil auch trage.
 
Zuletzt bearbeitet:
Wenn du willst, dass beim Anziehen eines Helms der Spieler einen Helm-Spell kriegt und beim Anziehen der Rüstung einen Rüstung-Spell, dann reicht dafür ein Script.
Dass Script könnte sich AddSpellOnEquip nennen und hat eine Eigenschaft MySpell. Deises Script lässt sich je dem Helm und der Rüstung zuweisen und die Eigenschaft ist jeweils der richtige Spell zur Rüstung.

Du möchtest, dass ein Effekt auf einem Rüstungsteil beim Schleichen etwas tut. Ich überlege mir gerade, ob das mit einer regulären Verzauberung auf der Rüstung gehen würde. Der Magic-Effect würde hinter einer Condition IsSneaking oder so ähnlich liegen, dann würde dass nur aktiviert, wenn du schleichst.

In solchen Fällen würde ich zuerst abchecken, ob es im Vanilla-Game bereits etwas Ähnliches hat. Hat nicht eine Rüstung der Diebes- oder Assassinen-Gilde sowas ähnliches?

Eine andere gute Anlaufstelle ist der Script-Manager, da kannst du nach Begriffen wie Equip suchen und dir die Scripte ansehen. Es gibt für viele Dinge irgend ein generisches Script, das du ab der Stange nehmen kannst.
Oder du suchst nach OnEquip mit Notepad++ in PSC-Dateien.

Ich habe von diesem PC aus keinen Zugriff auf die Scripte und es ist auch noch zu früh am Tag. Kann aber heute abend auch mal nachsehen.
 
"Zu früh am Tag" eher fast schon wieder zu spät am Tag. ;)

Ich bin derzeit fast nie Creation Kit. Irgendwie habe ich mir angewöhnt (wenn möglich) die ESM/ESP/ESL Dateien unter xEdit zu erstellen/bearbeiten. Da ich gerne sowohl einen Tarnumhang in Skyrim SE als auch eine Tarnrüstung in Fallout 4 hätte versuche ich das derzeit für beide Spiele. Allzu viel unterscheidet sich da ja nicht im Grundgerüst. Das Tool xEdit finde ich da schön handlich, übersichtlich und vor allem schneller. Mit Notepad++ wollte ich dann die Scripte kompilieren und habe mir dafür das Plugin (Name gerade entfallen) vom Nexus heruntergeladen und eingepflegt. Dabei stürzt mit Notepad++ aber immer komplett ab sobald ich versuche das Plugin auszuführen. Scheint aber auch nicht gemacht zu sein für die neue Version von Notepad++ und so kompiliere ich derzeit im Creation Kit.

So toll kenne ich mich mit dem Creation Kit auch nicht aus. Ich habe in dem CK mal, mit Hilfe von den Leutchen aus diesem Forum, ein kleines Haus eingerichtet und dabei halt etwas aufgeschnappt.

In diesem Fall hier habe ich mir aus einer anderen Modifikationen (mit Credits und Erlaubniss natürlich) die Meshes und Texturen ausgeliehen um mir daraus eine Art Tarnumhang mit Hut zu erstellen. Die ESL dazu habe ich in FO4Edit angefangen zu erstellen. Wie dem auch sei habe ich die Conditionen direkt an den Spell gebunden, so dass diese auch erst aktiv werden wenn ich schleiche und deaktiviert wenn ich wieder aufstehe.

Ob man den Spell nun ohne Script an die Rüstung binden könnte weiß ich nicht bzw. dazu habe ich bisher keine Möglichkeit gefunden. Einen Effekt (Perk-Punkte erhöhen etc.) kann ich ohne Probleme an ein Kleidungsstück binden, bei einem nicht permanenten Spell habe ich das bisher immer nur mit Script gesehen. Ich habe mich da an Bethesda selbst orientiert und mein obiges Script ist etwas abgewandelt aber ansonsten das wie Bethesda es gemacht hat (was nun nicht heißt dass es die beste Möglichkeit wäre - Bethesda macht ja scheinbar alles gerne schnell und schnell und egal wie es wird).

Mh, du erwähnst den Script-Manager. Da hatte ich etwas im Hinterkopf dass es so etwas gibt im Creation Kit doch hatte das auf die schnelle nicht gefunden. Werde ich mal suchen. Danke.

Doch wie gesagt bin ich schon froh dass die Modifikation nun soweit schon läuft und auch funktioniert, derzeit halt aber mit 3 kleinen Einzelscripten (2 für Rüstung+Helm und eines um den Spieler eine Nachricht auf den Bildschirm zu klatschen und etwas ins Inventar zu legen). An einer Mini-Quest zu dem Tarnumhang versuche ich mich auch gerade (orientiere mich da wieder viel an Bethesda selbst) aber das ist ein anderes Thema.

Was mich den ganzen Abend über wahnsinnig gemacht hat war der Fakt dass in meiner Papyrus.log immer eine Fehlermeldung zu einem Script stand was ich schon seit Tagen nicht mehr im Spiel habe. Und diese Meldung erschien immer wieder obwohl kein Objekt, kein Nichts, mehr auf dieses Script verweisen tut. Manchmal sieht man die Bäume vor lauter Wald nicht mehr. Letztendlich lag es einfach daran weil ich den Test-Spielstand abgespeichert hatte als ich das besagte Script noch nutzte und der Spielstand immer versuchte das Script aufzurufen und nicht meine Modifikation. Da muß man erstmal drauf kommen.
 
Zuletzt bearbeitet:
Scripte werden in Saves gespeichert, muss es ja auch, sonst weiss die Engine nicht, wo ein Script stand, wenn du gespeichert hast. Theoretisch könnte ich jemanden dafür bestrafen, dass er meine Mod deinstalliert hat, ohne dass er es merkt, indem ich Plotstopper scripte. Generell sollte man gescriptete Mods oder Scripte nicht in einem laufenden Durchgang entfernen.

Den Script Manager findet man im Dropdown Gameplay oder so rechts oben.

Ist alles Gewöhnungssache, es gibt Zeug, das im CK besser geht und anderes in XEdit.
 
@Eigengrau:
Warum nicht einfacher?
Dein Script:

Event OnEquipped(Actor akActor)
if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellAnzug_Stealth, True)
Game.GetPlayer().AddSpell(SpellHut_Detect, True)
endif
EndEvent


Dein Script als universal:


Spell Property SpellToAdd Auto
{AnzugSpell oder HutSpell, je nachdem auf welchem Rüstungsteil das liegt}

Event OnEquipped(Actor akActor)

if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellToAdd)
endif
EndEvent


Dein Script als universal MIT Message und Item ins Inventar:


Spell Property SpellToAdd Auto
{AnzugSpell oder HutSpell, je nachdem auf welchem Rüstungsteil das liegt}

Message Property myMessage auto

{Nachricht die gezeigt werden soll}

MiscObject Property MyItem auto ;Je nachdem was für ein Item das sein soll, bei Buch "Book Property", Waffe "Weapon Property", Rüstung "Armor Property" usw
{Mein Ding das der Spieler Ins Inventar Bekommen Soll}

Event OnEquipped(Actor akActor)

if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellToAdd)
Game.GetPlayer().AddItem(MyItem,1)
myMessage.Show()
endif
EndEvent



Dann ruft er immer nur den Spell auf, den du im Property SpellToAdd angegeben hast. Wenn das Script aufm Anzug liegt, gibst deinen AnzugSpell (und dein AnzugItem und deine AnzugMessage)an, wenns aufm Hut liegt, den HutSpell (und HutItem und HutMessage), also ein Script für beide Teile, du musst nur dementsprechend die Properties ändern.
Ich hatte mir da für die Mausnthamz eins gebaut, da ich nur einen Spell auf einem Teil brauchte, aber da gibts schon eins (Dlc2AddSpellsOnEquip oder so ähnlich) für 3 Spells OnEquip.

LG
 
@.mausetot

Hey, vielen Dank erst einmal für den Aufwand und sorry für die späte Antwort. Tannenbaum-Zeit halt. Da will alles geschmückt werden und niemand ist zufrieden bevor der Weihnachtsstern nicht ganz genau auf der Spitze sitzt (manche sind sogar so penetrant und gehen dann mit der Wasserwaage an die Sache^^).

Gehören die If-Abfragen jeweils in ein eigenes OnEquipped-Event? Oder darf man diese Events gar nicht mehrmals innerhalb eines einzigen Scripts aufrufen!?

Ich habe es nun bisher so und das sollte dann doch eigentlich funktionieren (konnte es noch nicht testen):

ScriptName Eigengrau:Eigengrau_ProjektLeda_Full extends ObjectReference Const

;-- Properties --------------------------------------
Spell Property SpellAnzug_Stealth Auto
Spell Property SpellHut_Detect Auto
;-- Variables ---------------------------------------

;-- Functions ---------------------------------------

Event OnEquipped(Actor akActor)

if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellAnzug_Stealth, True)
endif
if akActor == Game.GetPlayer()
Game.GetPlayer().AddSpell(SpellHut_Detect, True)
endif
EndEvent

Event OnUnequipped(Actor akActor)
akActor.RemoveSpell(SpellAnzug_Stealth)
akActor.RemoveSpell(SpellHut_Detect)
EndEvent


@PixelMurder

Habe es gefunden und schaue mich da ein wenig um im CK.


Frohes Festtage euch und euren Familien! :)
 
Gehören die If-Abfragen jeweils in ein eigenes OnEquipped-Event? Oder darf man diese Events gar nicht mehrmals innerhalb eines einzigen Scripts aufrufen!?
Ich verstehe deine Frage nicht. Das Event ist das Anziehen des Rüstungsteil und das ganze Ding kommt in das Rüstungsteil was du anziehst.
Du kannst soviele ifs im Event haben wie du brauchst, du musst nur drauf achten, dass sie auch abgeschlossen werden und sich nicht gegenseitig ausklammern oder aushebeln. Das ist eigentlich scho alles wenn mich nicht alles täuscht - aber ich täusche mich gern ;) Vor allem, wenn ich vom Skripten nun mal so gar keine Ahnung habe =P
Ich bin gespannt, ob's so funzt - wovon ich jetzt stark ausgehe.
Frohes Festtage euch
Danke, dir auch =)
 
  • Like
Reaktionen: .mausetot
Ich würde auf der Creation Kit-Seite alle Einsteiger-Materie durchlesen:
https://www.creationkit.com/index.php?title=Category:Papyrus

Ich würde dir auch vorschlagen, mal in den Source-Ordner zu sehen und interessant klingende Scripte mit dem Notepad++ anzusehen, damit du ein Gefühl dafür kriegst, wie gescriptet wird und wie Dinge umgesetzt wurden.
Ich habe so das Payrus-Scripting gelernt und wenn ich im Zweifel bin, wie ich etwas umsetze, schaue ich mir ähnliche Scripte an. Wobei ich den Vorteil hatte, dass ich bereits mit einigen Script-Sprachen arbeite.

Ausserdem kannst du im Script Manager mit rechter Maustaste auf die Scripte und "Use Info" klicken. Da sieht man, wo die betreffenden Scripte genutzt werden. Man kann ja nicht jedes beleibige Script an jedes beliebige Objekt anhängen. Das "extends" erweitert z.B. ein Basis-Script MagicEffect(jedes Objekt im CK hat ein Basis-Script, auch wenn es sich nicht scripten lässt) und du kannst so ein Script nicht einem Actor zuweisen.
Lustigerweise kannst du aber in einem MagicEffect-Script gleich coden wie in einem Actor-Script, weil MagicEffect sowas wie eine Erweiterung eines Actors darstellt.

Die Events sind eine Schnittstelle zu Ereignisen, die ein Objekt registrieren kann. OnEnterBleedout kann z.B. in einem Actor-Script genutzt werden, aber nicht in einem Armor-Script.

Hier alle Möglichkeiten, die es für einen Actor gibt, unten sind alle Events gelistet, die dieses Script empfängt.
https://www.creationkit.com/index.php?title=Actor_Script
 
Huhu,
So wie du das Script jetzt gepostet hast bekommst du zwei Spells wenn du das Teil anlegst.
Bildlich gesprochen:
Du rüstest das Rüstungsteil aus und das Script sagt „Hey, ich bin dran, gleich mal checken ob das der Spieler ist, der das anhat (if akActor...). Cool, das isser, also bekommt der gleich nen Spell für die Rüstung. Ok, weiter im Text: erstmal checken ob das der Spieler ist, der das anhat (das 2. if akActor...). Sehr geil, isser, dann bekommt der auch noch den HutSpell mit drauf“ ;)

Machs doch einfacher, so wie das Script, das ich oben gepostet hab: eine Abfrage ob Spieler, wenn ja, dann ein Spell, festgelegt durch ein Property.
Dadurch kannst du auch beim unequip bei nur einem Spell bleiben, der entfernt werden soll.

LG

Die liebe Edith:
Nur um mal die Grundbedingungen nochmals rauszukramen.
- das Script wird auf beide Rüstungsteile gelegt
- wenn es auf der Rüstung liegt füllst du das Property von SpellToAdd mit deinem Rüstungszauber
- wenn es auf dem Hut liegt füllst du es mit dem Hutzauber

Ich glaube, dass es gerade ein Verständlichkeitsproblem gibt, da du das ganze in XEdit machst?
Im CK legst das Script drauf, klickst auf Properties und holst dir ausm Klappmenü den entsprechenden Zauber. Und das einfach bei jedem Rüstungsteil einzeln, das du mit dem Script belegt hast. Wie das aufm XEdit funzt weiss ich nicht ;)
 
Zuletzt bearbeitet:
@Eigengrau
So, Schau mal, das ist das VanillaScript aus dem Dawnguard DLC:

Scriptname DLC2defaultAddSpellsOnEquipScript extends ObjectReference ;den Kopf des Scripts generiert das CK selber sobald du den Namen angegeben hast
{Generic script for adding spells to an actor when an item is equipped.}

Spell property SpellToAdd01 Auto
Spell property SpellToAdd02 Auto
Spell property SpellToAdd03 Auto

Event OnEquipped(Actor akActor) ;Du hast gerade deine Rüstung angezogen
if (SpellToAdd01 != None) ;da checkt das Script ob bei SpellToAdd01 was eingetragen ist. d.h. wenn da keiner eingetragen ist, sucht das Script nach keinem
akActor.AddSpell(SpellToAdd01) ; Wenn JA, dann bekommst du hier den ersten Spell
EndIf
if (SpellToAdd02 != None) ;Check fürn 2.Spell
akActor.AddSpell(SpellToAdd02) ;Wenn JA, hier bitteschön
EndIf
if (SpellToAdd03 != None) ;wie oben
akActor.AddSpell(SpellToAdd03)
EndIf
EndEvent

Event OnUnequipped(Actor akActor) ;Du hast gerade die Rüstung wieder ausgezogen
Spell left = akActor.GetEquippedSpell(0)
Spell right = akActor.GetEquippedSpell(1)
if (SpellToAdd01 != None) ;Check ob erster Spell eingetragen (A)
if (left == SpellToAdd01) ;Wenn JA (A), dann check ob links ausgerüstet (B)
akActor.UnequipSpell(SpellToAdd01, 0) ;Wenn JA (B), dann Spell raus aus der Hand
EndIf ;Check Links (B) fertig
if (right == SpellToAdd01) ;Check ob rechts ausgerüstet (C)
akActor.UnequipSpell(SpellToAdd01, 1) ;Wenn JA (C), dann Spell raus aus der Hand
EndIf ;Check rechts (C) fertig
akActor.RemoveSpell(SpellToAdd01) ;Spell in die Tonne kloppen bis wieder Rüstung/Ring/Hut/etc ausgerüstet
EndIf ;Check ob eingetragen (A) fertig
;**************Selbiges Spiel wie oben************
if (SpellToAdd02 != None)
if (left == SpellToAdd02)
akActor.UnequipSpell(SpellToAdd02, 0)
EndIf
if (right == SpellToAdd02)
akActor.UnequipSpell(SpellToAdd02, 1)
EndIf
akActor.RemoveSpell(SpellToAdd02)
EndIf
if (SpellToAdd03 != None)
if (left == SpellToAdd03)
akActor.UnequipSpell(SpellToAdd03, 0)
EndIf
if (right == SpellToAdd03)
akActor.UnequipSpell(SpellToAdd03, 1)
EndIf
akActor.RemoveSpell(SpellToAdd03)
EndIf

Also du bräuchtest rein theoretisch nicht mal ein eigenes Script schreiben, sondern kannst einfach auf "Add" im Reiter Scripts (in deinem Objekt), dann im Suchfeld den Namen eintragen. Dann Properties eintragen, fertig :)
Hoffe du kannst was mit meinen Farben und (A)s, (B)s und (C)s anfangen.

Schöne Feiertage :)
 
  • Like
Reaktionen: Moorkopp
Hui, das ist eine Menge. Ersteinmal vielen Dank an euch alle für die Antworten und die Mühe!

Wie gesagt habe ich von scripten nun nicht viel Ahnung und möchte mich da aber auch nicht groß einlesen da mir dafür einfach die Zeit fehlt, gerade in diesen elenden Feiertagen.

Von früher her kenne ich es aber zumindest noch so dass eine If-Abfrage oft mit Then und mit else weitergeführt wird. Nur als grobes Beispiel (ungetestet - man könnte auch einen GoTo-Ankerpunkt einstreuen statt den Wert Nothing):

if akActor == Game.GetPlayer()
then Game.GetPlayer().AddSpell(SpellAnzug_Stealth, True)
else nothing
endif

Wie dem auch sei sollte ja alles in ein Script untergebracht werden und da liegt mein Problem. Alles was in einem Event steht (im OnEquipped-Event) wird immer ausgeführt (wenn nicht gesondert gekennzeichnet durch Code). Wie .mausetot es schon richtig schreibt bekomme ich bisher beide Spells auferlegt egal was ich davon nun trage. Im Script von .mausetot wird von einem Spell ausgegangen, was dann ja auch funktioniert. Aber nicht mit 2 Spells in einem Script und dazu wurde mir hier ja quasi geraten das in einem Script unterzubringen.

Natürlich funktioniert die Sache auch mit 2 Spells, wie schon in meinem Eingangspost, aber dann gibt es immer eine Fehlermeldung in der Papyrus.log da das andere Rüstungsteil (wenn ich nur eines trage) vom Spiel nicht gefunden werden kann. Und rufe ich die beiden Spells einzeln im selben Event auf mit einer einfachen If-Abfrage dann kommt es ebenfalls zu einer Fehlermeldung da das Event ganz abgearbeitet wird.

Bei dem Dawnguard DLC Script ist es quasi dasselbe. Das Script scheint von einem festen Fakt auszugehen (Item angezogen = Spell) aber nicht auf ein Szenerio/Check ob das Item auch vorhanden ist und den Code nur dann auszuführen und andererseits den Code zu überspringen. Die Eigenschaft akActor sagt ja nur aus dass es sich um den Spieler handelt, nicht ob das Item gerade aktiv ist (und wenn es so sein sollte dann funktioniert es nicht).

Im Script habe ich 2 Eigenschaften/Property definiert/eingetragen für meine 2 Spells und diese werden mir auferlegt beim anziehen da die Property vorhanden und eingetragen sind. Nur habe ich z.B. gerade nur das eine Rüstungsteil an aber nicht den Hut, das Script arbeitet die Abfrage im Event trotzdem komplett ab und die für den Hut kann ja nicht ausgeführt werden da ich den gar nicht trage. Also wird in der Papyrus.log wieder ein Fehler notiert.

Ich bin mir sicher dass man da etwas daraus basteln kann doch mir ist das zu kompliziert, auch da ich es derzeit nur einmal brauche. Und Bethesda scheint da recht schlampig zu sein mit seinen eigenen Scripts, ein Blick in die Papyrus.log sieht echt schlimm aus.

Daher belasse ich es jetzt erst einmal bei meinen 3 Einzelscripts, das ist nicht die Welt und ich persönlich erkenne da nun nichts negatives dran. Ich bedanke mich jedenfalls recht herzlich bei allen die mir hier geantwortet haben und helfen wollten und vor allem auch bei .mausetot für die Mühe und das tolle, bunte, Auskommentieren!

Ich hoffe ihr hattet alle frohe Festtage und habt schöne Leckereien gegessen!
 
  • Like
Reaktionen: Moorkopp
Richtige Programmierer fangen die Events ab, bevor sie entstehen. Das ist schon richtig mit else.
Du bräuchtest ein Script, was prüft ob du das Ding anhanst, dann prüft ob Bedingungen erfüllt sind - Wenn Rüssi 1 an -> prüfe ob Rüssi 2 an, else (dann) Zauber ->
else if (Wenn nicht) dann nur den Zauber, usw.

Programmieren kann nicht jeder - es bedarf einer eigenen Logik dahinter da du Sachen schon von vorneherein ausschließen solltest, an die du noch gar nicht gedacht hast.
Wie in deinem Fall, was ist wenn Rüssiteil angelegt ist, Teil zwei, drei, vier und fünf aber nicht... usw. und was soll dann passieren.
Die Entwickler haben hier vielleicht nicht gerade gespart ja, doch auf verschiedene Globalen gesetzt, die im Einzelfall Mist waren und gedacht es fällt eh keinem auf!
Tut es auch nicht, denn ungemoddet verpackt die paar Fehlermeldungen die Engine ziemlich gut.
Kompliziert wurde es nur, als Programmier-Modder sich "einmischte". Und auch so, sind Vanilla viele Scripte drin, die einmal anlaufen und dann nie wieder resettet werden. Dabei ist alles vorhanden. Man hat es nur nie mit... und jetzt sag ich was was ich sonst nie sage: "Mit der nötigen Sorgfalt" eingepflegt. Warum auch immer. =/
 
Hui, das ist eine Menge. Ersteinmal vielen Dank an euch alle für die Antworten und die Mühe!

Wie gesagt habe ich von scripten nun nicht viel Ahnung und möchte mich da aber auch nicht groß einlesen da mir dafür einfach die Zeit fehlt, gerade in diesen elenden Feiertagen.

Von früher her kenne ich es aber zumindest noch so dass eine If-Abfrage oft mit Then und mit else weitergeführt wird. Nur als grobes Beispiel (ungetestet - man könnte auch einen GoTo-Ankerpunkt einstreuen statt den Wert Nothing):

if akActor == Game.GetPlayer()
then Game.GetPlayer().AddSpell(SpellAnzug_Stealth, True)
else nothing
endif

Wie dem auch sei sollte ja alles in ein Script untergebracht werden und da liegt mein Problem. Alles was in einem Event steht (im OnEquipped-Event) wird immer ausgeführt (wenn nicht gesondert gekennzeichnet durch Code). Wie .mausetot es schon richtig schreibt bekomme ich bisher beide Spells auferlegt egal was ich davon nun trage. Im Script von .mausetot wird von einem Spell ausgegangen, was dann ja auch funktioniert. Aber nicht mit 2 Spells in einem Script und dazu wurde mir hier ja quasi geraten das in einem Script unterzubringen.

Natürlich funktioniert die Sache auch mit 2 Spells, wie schon in meinem Eingangspost, aber dann gibt es immer eine Fehlermeldung in der Papyrus.log da das andere Rüstungsteil (wenn ich nur eines trage) vom Spiel nicht gefunden werden kann. Und rufe ich die beiden Spells einzeln im selben Event auf mit einer einfachen If-Abfrage dann kommt es ebenfalls zu einer Fehlermeldung da das Event ganz abgearbeitet wird.

Bei dem Dawnguard DLC Script ist es quasi dasselbe. Das Script scheint von einem festen Fakt auszugehen (Item angezogen = Spell) aber nicht auf ein Szenerio/Check ob das Item auch vorhanden ist und den Code nur dann auszuführen und andererseits den Code zu überspringen. Die Eigenschaft akActor sagt ja nur aus dass es sich um den Spieler handelt, nicht ob das Item gerade aktiv ist (und wenn es so sein sollte dann funktioniert es nicht).

Im Script habe ich 2 Eigenschaften/Property definiert/eingetragen für meine 2 Spells und diese werden mir auferlegt beim anziehen da die Property vorhanden und eingetragen sind. Nur habe ich z.B. gerade nur das eine Rüstungsteil an aber nicht den Hut, das Script arbeitet die Abfrage im Event trotzdem komplett ab und die für den Hut kann ja nicht ausgeführt werden da ich den gar nicht trage. Also wird in der Papyrus.log wieder ein Fehler notiert.

Ich bin mir sicher dass man da etwas daraus basteln kann doch mir ist das zu kompliziert, auch da ich es derzeit nur einmal brauche. Und Bethesda scheint da recht schlampig zu sein mit seinen eigenen Scripts, ein Blick in die Papyrus.log sieht echt schlimm aus.

Daher belasse ich es jetzt erst einmal bei meinen 3 Einzelscripts, das ist nicht die Welt und ich persönlich erkenne da nun nichts negatives dran. Ich bedanke mich jedenfalls recht herzlich bei allen die mir hier geantwortet haben und helfen wollten und vor allem auch bei .mausetot für die Mühe und das tolle, bunte, Auskommentieren!

Ich hoffe ihr hattet alle frohe Festtage und habt schöne Leckereien gegessen!

Heyho, gerne ;)

Vielleicht stehe ich gerade auf dem Schlauch, aber irgendwie check ich gerade nicht worauf du rauswillst. Willst du dass die Spells erst gegeben werden, wenn du beide Rüstungsteile anhast? Also EIN Rüstungsteil KEIN Spell, ZWEI Rüstungsteile ZWEI Spells? Oder Hut an, Hutzauber geben, Rüstung an,RüstungsSpell geben?
Wenn zweiteres der Fall ist, ist das Vanillascript, das ich oben gepostet hab, genau das richtige, denn:

"Aber nicht mit 2 Spells in einem Script und dazu wurde mir hier ja quasi geraten das in einem Script unterzubringen.", und ich finde die Stelle nicht, an der dir dazu geraten wurde.

Aber eine Stelle hab ich gefunden, von @PixelMurder glaub:
"Du kannst und sollst Scripte schreiben, die wiederverwendbar sind.".
Und das heisst nix anderes, dass man Scripte schreiben sollte, die mehrfach eingesetzt werden können, und das geht mit dem Zauberwort Property
Da ich nicht weiss inwieweit du dich mit dem CK auskennst, nochmal Krümel für Krümel:

(im Creation Kit)
-du baust dir ne Rüstung
-du legst das Script vom oberen Post auf die Rüstung
-du bearbeitest per Klappmenu in den Properties vom Script deine Properties (SpellToAdd) und füllst das mit dem Rüstungszauber.
-Rüstung fertig

dann

-du baust einen Hut
-du legst genau das gleiche Script vom oberen Post auf den Hut
-du bearbeitest per Klappmenu in den Properties vom Script deine Properties (SpellToAdd) und füllst das mit dem Hutzauber
-Hut fertig

Und das ist das was @PixelMurder damit meinte (verbesser mich falls ich falsch liege Mr. Pixel ;) ):
Zwei Items - ein Script, das du für beide, oder noch für Stiefel, oder nen Ring , oder ne Halskette usw nutzen kannst, ohne dass nachher in deinem Ordner Scripts:

(Beispielnamen)
OnEquippedAddHutSpellScript
OnEquippedAddRuestungSpellScript
OnEquippedAddRingSpellScript
OnEquippedAddStiefelSpellScript
usw

drin sind, sondern nur ein Script, das für jeden ausrüstbaren Gegenstand benutzt werden kann.
Oder halt auch kein neues, wenn du das Vanillascript nimmst

(Um mal beim If-Then Basic zu bleiben: die Properties sind deine Variablen, und die können für jeden Einsatz(ort) des Scriptes neu festgelegt werden, OHNE dass du das Script ändern musst. Das Property Fenster ist quasi so ein kleiner Manager, die dir die angegebene Variable definiert, OHNE dass du erneut ins Script selber eingreifen musst um was zu ändern. Deswegen kannst du den Spell auch nur über diese SpellToAdd-Variable angeben, und nicht direkt mit Editor ID)

"Bei dem Dawnguard DLC Script ist es quasi dasselbe. Das Script scheint von einem festen Fakt auszugehen (Item angezogen = Spell) aber nicht auf ein Szenerio/Check ob das Item auch vorhanden ist und den Code nur dann auszuführen und andererseits den Code zu überspringen. Die Eigenschaft akActor sagt ja nur aus dass es sich um den Spieler handelt, nicht ob das Item gerade aktiv ist (und wenn es so sein sollte dann funktioniert es nicht)."

Natürlich prüft das Script nicht welches Item vorhanden ist, da das ja auf GENAU DEM ITEM liegen soll das dir nen bestimmten Spell gibt, und wenn du dann GENAU DAS ITEM anziehst muss es ja vorhanden sein, sonst kannst es ja nicht anziehen. Deswegen hast du das Script ja auf jedem Teil drauf, das dir nen Zauber geben soll. Sonst müsstest du, wenn du die Rüssi anziehst, im Script abfragen ob du den Hut auch auf hast, und wenn JA, dann auch noch den Hutzauber geben (und andersrum genauso), und je weniger "querverweisende Abfragen" du hast, umso schneller läuft das Script, da es nicht erst auf Rückmeldung warten muss.

Eigentlich ist das ganze recht easy, wobei ich natürlich auch zugeben muss, dass ich eigentlich überhaut nicht scripten kann. Ich suche mir ein paar Scripte raus, die das machen, was ich vorhabe, kopiere mir die benötigten Sachen raus, dann bringe ich die in einem Script unter, das alles zusammen das macht, was die Scripte eigentlich einzeln gemacht hätten, und das zu den Bedingungen, die ich brauche (OnEquipped, OnActivate, usw.)
Ich denke, dass das was es bei dir komplizierter macht, die Tatsache ist, dass du das hauptsächlich im XEdit machst, und nicht im CK.

LG und schöne Restfeiertage ;)



 
Ach lol... er macht das über XEdit? Okay... das erklärt dann einiges und ich bin hier raus ^^" Ich dachte er guckt sich die Scripte im CK auch mal an *rolleyes
 
  • Like
Reaktionen: .mausetot