Properties - Verständnis

Iceflame

Abenteurer
Guten Abend!

Ich beschäftige mich gerade mit den Properties beim Scripting.
Grundsätzlich will ich beim aktivieren eines Gegenstands prüfen, ob der Spieler einen bestimmten Perk gelernt hat.
Meinem Verständnis nach muss ich den Perk über eine Property im Script verfügbar machen:
Code:
Perk Property myPerkRef auto
Anschließend muss ich dieser Property an jedem Gegenstand, an dem ich das Script 'anhänge', den richtigen Perk zuweisen.

Ich brauche das Script allerdings an einer ganzen Reihe von Objekten, der verwendete Perk ist dabei immer der Selbe.
Gibt es hier die Möglichkeit, dass der Property automatisch der richtige Perk zugewiesen wird?

Und - wie kann ich prüfen, ob der beim Event onActivate mitgereichte akActionRef der Spieler selbst ist? Ich will nämlich vermeiden, dass dieses Script ausgeführt wird, wenn ein NPC den Gegenstand aktiviert.

Ich danke im Voraus für die Hilfe.
lg
 
Ich brauche das Script allerdings an einer ganzen Reihe von Objekten, der verwendete Perk ist dabei immer der Selbe.
Gibt es hier die Möglichkeit, dass der Property automatisch der richtige Perk zugewiesen wird?

Naja du kannst innerhalb des Scripts die Property genauso benennen wie sie im Editor heißt, das gilt auch für Referenzen die du selbst benannt hast dann unter Properties auf 'Auto-Fill' gehen und die Property wird automatisch richtig gefüllt.

Und - wie kann ich prüfen, ob der beim Event onActivate mitgereichte akActionRef der Spieler selbst ist? Ich will nämlich vermeiden, dass dieses Script ausgeführt wird, wenn ein NPC den Gegenstand aktiviert.
Code:
Event OnActivate(Actor akActionRef)

If akActionRef == Game.GetPlayer()
 ;Mach dies und das
Endif

EndEvent
 
  • Like
Reaktionen: Iceflame
Code:
Event OnActivate(Actor akActionRef)

If akActionRef == Game.GetPlayer()
 ;Mach dies und das
Endif

EndEvent

Das funktioniert leider nicht - akActionRef ist vom Typ ObjectReference - wenn ich das Ganze so Compile, bekomme ich einen Fehler gemeldet:
the parameter types of function onactivate in the empty state on script myscript do not match the parent script objectreference
 
Stimmt, mein Fehler akActionRef muss als ObjectReference declariert werden also einfach statt Actor ObjectReference nehmen.
 
  • Like
Reaktionen: Iceflame
Hmm, interessanterweise kann ich, wenn ich die Property exakt nach dem Perk benannt habe, diese nicht mehr über HasPerk() abfragen.
Der Compiler meldet zwar keinen Fehler, allerdings gibt HasPerk() in jedem Fall false zurück.
 
Iceflame schrieb:
Ich brauche das Script allerdings an einer ganzen Reihe von Objekten

Sind es denn nur viele References des gleichen Objekts, oder tatsächlich völlig unterschiedliche Objekte? Denn um allen Fehlern vorzubeugen, solltest du die Property schon anständig definieren. So geht's zwar auch, aber es birgt, wie du schon feststellen musstest, scheinbar Fehlerpotenzial.

Wenn die Objekte nur Referenzen des gleichen Basisobjekts sind, dann würde es ja reichen, den Skript auf das Basisobjekt zu legen. Alle References haben den dann automatisch und die Properties müssten, wenn im Basisobjekt richtig definiert, auch auf den References liegen...
 
  • Like
Reaktionen: Iceflame
Hmm, interessanterweise kann ich, wenn ich die Property exakt nach dem Perk benannt habe, diese nicht mehr über HasPerk() abfragen.
Der Compiler meldet zwar keinen Fehler, allerdings gibt HasPerk() in jedem Fall false zurück.
Wie du die Property benennst ist ja grundsätzlich egal, nur gefüllt muss sie werden. Meinte nur das du die Property dann nicht per Hand zuweisen musst sondern ein klick auf auto-fill und das CK erkennt was du meinst, trotzdem müsstest du das für jedes Object dann machen wenns unterschiedliche BaseObjects sind.

Code:
Perk Property myPerk auto

Event OnActivate(ObjectReference akActionRef)

If (akActionRef == Game.GetPlayer()) && (Game.GetPlayer().HasPerk(myPerk))
   ;do something
endIf

EndEvent
 
  • Like
Reaktionen: Iceflame
Wie du die Property benennst ist ja grundsätzlich egal, nur gefüllt muss sie werden. Meinte nur das du die Property dann nicht per Hand zuweisen musst sondern ein klick auf auto-fill und das CK erkennt was du meinst, trotzdem müsstest du das für jedes Object dann machen wenns unterschiedliche BaseObjects sind.
Leider ist es eben nicht egal - wenn ich die Property wie den Perk benenne, gibt HasPerk() false zurück, egal ob ich die Property per Hand oder mit Autofill zuweise.
 
"Leider ist es eben nicht egal - wenn ich die Property wie den Perk benenne, gibt HasPerk() false zurück, egal ob ich die Property per Hand oder mit Autofill zuweise. "

Kann das sein, dass du ein weiteres Objekt/Variable mit dem selben Namen wie der Perk hast?

möglicherweise übergibst du HasPerk() dann das falsche Objekt...
 
  • Like
Reaktionen: Iceflame
Abgesehen von der Property, und dem dazugehörigen Perk, nicht.
Das CK würde ohnehin herummaulen, wenn ich aus versehen 2 Objekte mit der selben ID anlegen würde, und im Script selbst habe ich nur diese Property definiert, ansonsten verwende ich nur den Parameter von onActivate.
 
Abgesehen von der Property, und dem dazugehörigen Perk, nicht.
Das CK würde ohnehin herummaulen, wenn ich aus versehen 2 Objekte mit der selben ID anlegen würde, und im Script selbst habe ich nur diese Property definiert, ansonsten verwende ich nur den Parameter von onActivate.

nur um nochmal 100% sicher zu gehen: du machst nicht z.B: sowas ähnliches:

Perk Property MyPerk Auto
[...] ; irgend ein code
Perk myPerk = MyPerk.GetValue()
(oder int myPerk = 3)

... das wird nicht funktionieren, denn soweit ich weiß ist Papyrus nicht case-sensitive (d.h. myPerk ist das selbe wie MyPerk) (und du hast im CK keine 2 Objekte mit gleicher ID)


Wenn das nicht der Fall ist, hast du evtl. davor irgendwelche Properties entfernt und eine Fehlermeldung dabei bekommen?

Ich habe mal ein paar Rassen als Property einem QuestScript hinzugefügt, diese Race-Properties dann wieder entfernt. Beim Entfernen kam dann ein Hinweis, dass noch Verknüpfungen zu den objekten mit ID soundso bestehen und die Frage, ob ich die Verknüpfungen löschen möchte.
Seitdem ich hier "JA" gedrückt habe hab ich in dem betroffenen QuestScript keinen Zugriff mehr auf die Race-Propertys, obwohl ich die Properties wieder hinzugefügt habe....
Wenn ich in dem einen Script auf eine der Rassen zugreife kommt immer "null" zurück. (die RaceProperties wurden sogar vom CK korrekt mit Autofill vorbelegt.)
 
Nein, sowas mache ich nicht.
Ich habe nirgends Properties entfernt, und dieses Skript, mit dem einen OnActivate-Event ist das einzige slebsterstellte Skript, dass ich habe.
Sonst habe ich nur den Perk angelegt.

Das Skript selbst liegt auf einem schon vorhanden gewesenen Objekt.