Properties - bitte um eine ausführliche Erklärung

blackHawk

Abenteurer
Hallo zusammen

Ich bin ein wenig mit den "Properties" in den Skripts überfordert. Da ich im Netz nicht wirklich fündig über ein anständiges Tutorial (Bei den meisten verstehe ich nur Bahnhof) geworden und ich sicher nicht der Einzige mit diesem Problem bin, dachte ich mir ich mache doch mal einen Thread auf damit er auch für andere User schnell auffindbar ist und evtl. helfen kann.

Ich habe natürlich auch schon, leider mit wenig Erfolg, herumgebastelt.

Bei mir tauchen dabei allgemeine Fragen auf:

1. Muss das Script auf eine bestimmte Art aufgebaut sein? Was ich meine ist, gibt es im Vergleich mit dem CS grosse Vergleiche? In meinen Augen würde ich ein Script im CK folgendermassen schreiben (die roten Fragezeichen stehen als Frage, ob dort noch etwas eingefügt werden muss):

Scriptname *Scriptname* (?)

(?)

Event *Bedienung* (?)

(Muss neuerdings ZWINGEND eine if-Formel stehen?)
abc*.enable (Beispiel)
(endif?)

EndEvent

2. Nachdem das Script geschrieben worden ist, muss ja auf den Actor oder auf den Gegenstand das Script angelegt werden und gleich anschliessend die Properties definiert werden. In der ersten Frage habe ich den Actor abc als Beispiel mit dem Befehl enable genohmen. Wie muss man ihn nun genau definieren?

Ihr seht, ich habe den Durchblick noch nicht.

Ich bin für jede erdenkliche Hilfe dankbar.

LG

blackHawk
 
Ne, nicht wirklich.
Die meisten scheinen sich an Papyrus die Zähne auszubeissen oder mehr schlecht als Recht damit irgendwie ihr Skript hinzu bekommen, während ein kleiner Teil weis wie es funktioniert, nur sich geflissentlich dazu ausschweigt.

Also, was sind Propertys?
Kurz gesagt, Propertys stellen die Schnittstelle zwischen den Skript- und ESP Dateien dar.

3 simple Beispiele

ObjectReference[] Property Ziele Auto

Damit können zum Beispiel XMarker, Container, platzierte Ausrüstungsteile oder auch NPCs dem Skript als Referenz Objekt überreicht werden.

Dieses hier, ist ein Array und bezieht sich auf eine Liste von Referenz Objekten, wie zum Beispiel mehreren XMarkern als Teleportziele.

MiscObject Property Material01 Auto

Eine Schnittstelle zur Misc Objekt Liste im CK.
Dieses kann man jedem Item aus der MiscObject Liste (Einbalsamierungswerkzeuge, Körbe, die Tröten und Trommeln die man oft in den Regalen stehen sieht) verbunden werden.

Weapon Property Eisenschwert Auto

Eine Schnittstelle zur Waffenliste im CK.


usw. usw.

Propertys können aber noch mehr. Was genau, kannst du hier nachlesen .
 
Okey, ich wäre trotzdem froh wenn man hier kurz helfen würde.

Ich möchte, dass wenn Gegenstand "Abwasser" aufgehoben wird, S1002 verschwindet und S1 erscheint (Beides Gegner)

Ich habe es folgendermassen versucht:
Scriptname senable extends objectreference

event onadd (objectreference akActionRef)

if(akActionRef == game.getplayer())
S1002.disable (true)
S1.enable (true)
endif

endevent

Und wenn ich die Properties defeniere, erhalte ich folgende Fehlermeldungen:

Starting 1 compile threads for 1 files...
Compiling "senable"...
c:\program files (x86)\steam\steamapps\common\skyrim\Data\Scripts\Source\senable.psc(6,0): variable S1002 is undefined
c:\program files (x86)\steam\steamapps\common\skyrim\Data\Scripts\Source\senable.psc(6,6): none is not a known user-defined type
No output generated for senable, compilation failed.

Batch compile of 1 files finished. 0 succeeded, 1 failed.
Failed on senable

Und so hätte ich sie dann definiert:

Unbenannt.png

Wo liegt der Fehler? Was mache ich falsch?
 
Soll so lauten:

Code:
Scriptname <Scriptname> extends ObjectReference

Actor Property S1002 auto
Actor Property S1 auto

Event OnAdd(ObjectReference Actor)

if(actor == game.getplayer())
  S1002.disable(true)
  S1.enable(true)
endif

EndEvent

Das reicht schon. Properties per Property-Fenster hinzuzufügen ist viel zu umständlich. Außerdem hast Du in dem Fenster die Properties als Array gekennzeichnet. Und im Skript oben stehen sie auch nicht drin. Kein Wunder findet er die Variablen nicht.
 
  • Like
Reaktionen: blackHawk
Ok, wieder etwas gelernt, vielen herzlichen Dank. Soll das also heissen, dass man die Propertys im Propertys-Fenster gar nicht zwingend hinzufügen muss?
 
Ich habe immernoch das Problem, das beim Aufheben nichts passiert. Hier ein Screen von meiner Arbeit:

Unbenannt.png

Hier der Script noch in Textform:

Scriptname Senable extends ObjectReference

Actor Property S1002 auto

Event OnActivate(ObjectReference akactionref)

if(akActionRef == game.getplayer())
S1002.enable (True)
endif

EndEvent

Und folgendes möchte ich eigentlich erreichen: Wenn Schlüssel W aufgehoben wird, soll S1 (Skelett 1) erscheinen.

Edit: Habe erst jetzt gemerkt, dass der Thread im falschen Forum ist. Könnte ein Moderator ihn bitteschön ins richtige Forum verschieben?
 
Zuletzt bearbeitet:
Ich habe auch erst vor kurzem mit Papyrus angefangen und sehe hier direkt keine Fehler. Also heißt die Devise wohl Debugging:
  • Probier es mal mit S1002.enable(false). Vielleicht fadet er ja einfach zu langsam?
  • Vielleicht steht der Actor nicht da, wo er sein sollte? Überprüfe seine Position nochmal im Renderwindow und stelle sicher, dass da ein Haken bei "Initially Disabled" ist. Wenn der da ist, sollte er sich bis zu seiner Aktivierung nicht bewegen, da "Diasbled" ja auch die AI ausschaltet...
  • Lass die if-Klausel weg. Vielleicht gibt es ja ein Problem mot der Abfrage? (Halte ich für unwahrscheinlich)
  • Ersetze Event OnActivate(ObjectReference akactionref) mit Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer) und akActionRef durch akNewContainer. Dadurch wird das Skript aktiviert, sobald der Schlüssel ins Inventar des Spielers wandert und nicht allgemein bei Aktivierung des Schlüssels.
Ich weiß, dass Debugging im CK etwas eklig ist, da man immer die langen Wartezeiten hat, bis das Soiel endlich geladen hat, aber manchmal kann einem dabei ein Licht aufgehen. :)
 
  • Like
Reaktionen: blackHawk
Zu 1-3 habe ich es schon probiert und hat nix genützt und zu Punkt 4 bin ich nicht sicher, ob du das so gemeint hast:

Scriptname Senable extends ObjectReference

Actor Property Skelett1 auto
Actor Property Skelett2 auto

OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)

Skelett1.enable (true)
Skelett2.disable(true)

EndEvent
 
Fast:
Scriptname Senable extends ObjectReference

Actor Property Skelett1 auto
Actor Property Skelett2 auto

Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
if (akNewContainer==game.getplayer())
Skelett1.enable (true)
Skelett2.disable(true)
endif
EndEvent
Das Script liegt auch auf dem Schlüssel, oder? Nicht, dass du das vergessen hast.
 
  • Like
Reaktionen: blackHawk
Danke! Es hat endlich geklappt. Man, das man auch sich auch bei solchen kleinen Scripts die Zähne zusammenknirscht kann hatte ich nicht erwartet.

Noch eine kleine Zusatzfrage: Wenn man will, dass es nur einmal ausgeführt wird, muss man "BOOL (Platzhalter)" einfügen oder?
 
Das hättest Du auch selbst auf die Schnelle ausprobieren können. Aber ja, man macht das hauptsächlich mit einer bool-Variable.

Ob Integer oder Bool Variable spielt keine Rolle.

Code:
int NurEinmal = 0

If (NurEinmal == 0)

hamptidampti tut etwas

NurEinmal = 1
EndIf

Code:
bool NurEinmal = True

If NurEinmal

hamptidampti tut etwas

NurEinmal = False
EndIf
 
Zuletzt bearbeitet von einem Moderator:
Egal, ich bedanke mich. Aber trotzdem, mein Fluch hört einfach nicht auf!

Also das Skelett erscheint jetzt, aber ich möchte dass noch ein paar mehr ebenfalls erscheinen. Wenn ich jetzt denn Schlüssel an mich nehme, erscheint das erste Skelett, aber die anderen dafür nicht. Und einmal ist etwas ganz Komisches passiert, nähmlich dass alle Skelette an einem Ort erschienen sind, obwohl sie ganz anders plaziert sind. Langsam frage ich mich, ob das ein Bug ist?

Sorry übrigends dass ich euch mit Kleinigkeiten belästige, aber ich werde es wohl nur auf diese Weise lernen.
Scriptname Senable extends ObjectReference

Actor Property Skelett1 auto
Actor Property Skelett2 auto
Actor Property S2 auto
Actor Property S3 auto
Actor Property S4 auto

BOOL doonce = TRUE

Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)

if (akNewContainer==game.getplayer() && Doonce)
Skelett1.enable (true)
Skelett2.disable(true)
S2.enable (true)
S3.enable (true)
S4.enable (true)
Doonce = false
endif

EndEvent

Und ja, sie sind alle disabled.
 
Warum hängst du der Einfachheit halber nicht die anderen Skellies per "Enable Parent" an Skelett1 ?
 
Diese Vorgehensweise kenn ich ja noch gar nicht. Werd das mal ausprobieren.

Vielleicht stimmt aber etwas mit meinem Ablauf nicht?

1. Referenzen festlegen
2. Script schreiben
3. Mit Compile überprüfen, ob das Script so angenohmen werden kann
4. Script auf Gegenstand oder Actor legen
5. Die Propertys mit Werten versehen
6. speichern

fertig.
Ich wette, ich muss noch etwas machen damit es funktioniert, komme aber nicht darauf.