Skriptthread zum Creation Kit

@Enorm:

Laut dem CK-Wiki gibt es für das Setzen des Levels keinen Befehl.

Alles andere wäre aber kein Problem. Ich denke aber, dass Du die Level eben überspringen willst und die entsprechenden Werte von Leben, Magicka und Ausdauer erhöhen willst. Solltest Du trotzdem ohne Levelerhöhung auskommen, schreibe ich Dir das Skript gerne.
 
  • Like
Reaktionen: enorm
Sagt mal, was mache ich denn, wenn ich eine GlobalVariable brauch, die kein "short, long oder float" ist?
Bei "int" gibt es ja MyGlobal.GetValueInt(), für andere Datentypen habe ich allerdings nichts in der CK Script-Referenz gefunden...

konkretes Beispiel:
Ich prüfe momentan in einem meiner Scripts folgendes:

If (PlayerIsCool.GetValueInt() == 1)
; Do anything
EndIf

Momentan ist die Global "PlayerIsCool" von Typ "Short" und ich wandle im Script den Short-Wert in ein Integer um.
Ich hätte aber gerne eine boolean GlobalVariable, da PlayerIsCool eh nur true oder false sein kann (Boolean braucht weniger speicher als Integer oder short).

Kann ich evtl. folgendes machen, obwohl PlayerIsCool ein Short ist?
bool isCool = PlayerIsCool.GetValueInt()
=> Wobei das eigentlich nicht das ist, was ich gerne hätte, da die Globale Variable ja immernoch Speicherplatz von der Größe eines "Short" belegt.
Die Größe der temporären Variable isCool ist mir eigentlich mehr oder weniger wurst, da die Variable eh nur zur Laufzeit der Function() existiert...

Danke für die Tipps...
 
Ganz ehrlich - ob jetzt 1 bit oder oder 16 Bit belegt werden sollte auf Skyrim-Fähigen Rechnern keinen Unterschied mehr machen.

Tatsächlich wird für boolean mehr als 1 Bit im Speicher belegt.
Wieviel genau kann ich dir nicht sagen - aber meines Wissens nach lässt sich RAM nicht Bitweise Adressieren.

Lange Rede, kurzer Sinn: Es macht keinen Unterschied.
 
Warum fragst du die Global denn erst als int ab? GetValue() reicht dann bekommst du bei deinen Beispiel auch ein bool zurück.
 
Ganz ehrlich - ob jetzt 1 bit oder oder 16 Bit belegt werden sollte auf Skyrim-Fähigen Rechnern keinen Unterschied mehr machen.
Tatsächlich wird für boolean mehr als 1 Bit im Speicher belegt.
Wieviel genau kann ich dir nicht sagen - aber meines Wissens nach lässt sich RAM nicht Bitweise Adressieren.
Lange Rede, kurzer Sinn: Es macht keinen Unterschied.

Bei kleinen Projekten hast du natürlich recht, aber bei wirklich großen Projekten kann das durchaus die Performance und vor allem den Speicherbedarf beeinflussen.
Da die globalen Variablen in den save-dateien gespeichert werden und es in Skyrim bei großen save-Dateien eh ein Problem gibt will ich das möglichst gering halten. Zumal ich auch mit OnUpdateGameTime() arbeite, das regelmäßige Berechnungen anstellt...
Bei einer Mod alleine macht das sicher noch nichts aus, aber es werden im Laufe der Zeit immer mehr und größere Mods auf der Platte => größere Save-Files + mehr registrierte On(single)Update -Events => mehr Berechnungen. Einige Leute haben schon mit Skyrim alleine Performance Probleme...

Wenn ich die Möglichkeit dazu habe ohne Mehr-Aufwand einen besseren Code zu schreiben, warum sollte ich das nicht tun?

bool 1 bit
byte
8 bit-2[SUP]7[/SUP] .. 2[SUP]7 [/SUP]-1 entspricht -128 ... 127
short
16 bit
2[SUP]15[/SUP] .. 2[SUP]15 [/SUP]-1 entspricht -32768 ... 32767
int32 bit-2[SUP]31[/SUP] .. 2[SUP]31 [/SUP]-1 entspricht -2147483648 ... 2147483647
long64 bit-2[SUP]63[/SUP] .. 2[SUP]63 [/SUP]-1 entspricht -9223372036854775808 ... 9223372036854775807


So etwas erreichst Du mit Casten. Würde also so aussehen:

Code:
bool Var = PlayerIsCool.GetValueInt() as bool

Ok, danke! Das wollte ich wissen. Jetzt kann meine Variable auch nur noch 2 Zustände haben (true / false) :)
Aber sie hat immernoch min. 16 bit - keine Möglichkeit kleinere Globals zu erstellen oder?
 
Hey,
ich bin nicht grade ein scripter, daher bräuchte ich eure Hilfe für einen kleinen aber recht Simpelen script.

Ich habe ein Objekt, welches man Aufnehmen kann. Sobald das Objekt im Inventar ist soll der script aktivieren. So das nach 24 Ingame Stunden das Objekt verschwindet und ein Actor vor dem Spieler erscheint.
Ich hoffe ihr könnt mir helfen :)

mfg
Xenos
 
Habs nicht ausprobiert aber sollte funktionieren:
Code:
Scriptname myScript extends ObjectReference

Actor Property act auto
bool Done = false

Event OnContainerChanged(ObjectReference akNewContainer, ObjectReference akOldContainer)
 RegisterForUpdateGameTime(24)
EndEvent

Event OnUpdateGameTime
 if (!Done)
  Game.GetPlayer().RemoveItem(Self)
  act.enable()
  Done=true
 endif
EndEvent
Ich bin mir nicht sicher, ob man "Self" so einsetzen darf, wie ich das hier tue, habe aber momentan auch keine Möglichkeit, es zu überprüfen...
 
  • Like
Reaktionen: Xenos
Ich hab den script einfach mal auf das Objekt gelegt. Würde das so gehen?
Code:
Scriptname Actorscript01 extends ObjectReference

Actor Property act auto
bool Done = false

Event OnContainerChanged(ID von Actor akNewContainer, ID vom Objekt akOldContainer)
 RegisterForUpdateGameTime(24)
EndEvent

Event OnUpdateGameTime
 if (!Done)
  Game.GetPlayer().RemoveItem(Self)
  act.enable()
  Done=true
 endif
EndEvent
 
Mein Script will hier nicht funktionieren. Ich arbeite im CK erstmals mit Int, wäre deshalb froh wenn mir jemand sagen kann wie das aussehen muss.

Hier mein Script:

Scriptname Aufgabe1 extends ObjectReference

Message Property Aufgabe15 auto
Objectreference Property Marker1 auto
actor property player auto
int I

event onactivate (objectreference akActionRef)

Player.moveto (marker1)
I == 1

endevent

if I == 1
Aufgabe15.show ()
endif

endevent

Ach ja und noch etwas: Wenn Aufgabe15 gezeigt wird, soll man zwischen zwei Antworten wählen. Wenn man jeweils eines wählt, soll noch etwas passieren. Wie sieht das aus?
 
Zuletzt bearbeitet:
Code:
Scriptname Aufgabe1 extends ObjectReference

Message Property Aufgabe15 auto
ObjectReference Property Marker1 auto

int Eins = 0
int Knopf

Event OnActivate (ObjectReference akActionRef)
If (Eins == 0)

Game.GetPlayer().MoveTo(marker1)
Eins = 1

EndIf

If(Eins == 1)

Knopf = Aufgabe15.show()

EndIf

If(Knopf == -1)
Return
ElseIf(Knopf == 0)

Mach irgendetwas

ElseIf(Knopf == 1)

Tu etwas anderes

Endif

EndEvent

Allerdings ist das etwas Konfus, da der Spieler gleich zu Anfang vom Aktivator weg teleportiert wird.
Den Teil mit der Message solltest du vielleicht auf eine Triggerbox am Zielort legen.
Wie sieht das Szenario den eigentlich im Gesamtem aus?
 
Spieler berührt Stein -> Spieler wird in einen anderen Bereich teleportiert -> Messagebox erscheint

Auswahl 1 -> Spieler wird zurückteleportiert
Auswahl 2 -> Spieler bleibt
_______________________________________________

Danke übrigends, so hat es nun endlich geklappt.

Jetzt habe ich noch eine etwas heikle Frage: Was muss man alles tun, um bei der grossen Schrifttafel ein Wort der Macht zu erlernen?
 
Zuletzt bearbeitet:
Ich hab auch ein Problem mit meinem Script. Es ist ein Magischer Effekt, der auf einen Zauber gelegt ist, und mich zu einer Zelle hin (Dest1), bzw. wenn ich in dieser Zelle bin, wieder zum Ursprungsort (Dest2) zurückporten soll. Allerdings will der Compiler das GetInCell nicht (no viable alternative at input 'GetInCell'). Dest1 und Dest2 sind beides X Marker mit Richtung.
Irgendwelche Vorschläge?

Danke schonmal im Voraus

Code:
Scriptname TeleportationScript extends activemagiceffect  

ObjectReference property Dest1 auto
ObjectReference property Dest2 auto

Event OnEffectStart(Actor Target, Actor Caster)

    If Game.GetPlayer().GetInCell AAHome
        Target.MoveTo(Dest2)
    Else
        Dest2.MoveTo(Target)
        Target.MoveTo(Dest1)
    EndIf

EndEvent
 
Was ist an diesem Script falsch?

Scriptname skeever extends objectreference

objectreference Property Marker2 auto
Actor property player auto

event

if (game.getPlayer().DamageActorValue("health", 1)
Game.getplayer()moveto (Marker2)

endevent

und wie muss man das umschreiben, wenn man will das z.B. verschiedene I zusammengezählt werden?

Ich mein das so:

Wenn Skeever a tot ist, i +1 )
Wenn Skeever b tot ist, i +1 )
Wenn Skeever c tot ist, i +1 )--> = 5Is
Wenn Skeever d tot ist, i +1 )
Wenn Skeever e tot ist, i +1 )
 
Was willst Du überhaupt machen? Dem Spieler Schaden zufügen, eine Variable hochzählen und ihn dann teleportieren, sobald etwas gestorben ist?
Ich gehe jetzt mal von so etwas aus:

Code:
Scriptname <SinnvollerScriptname> extends ObjectReference

ObjectReference Property Marker2 auto
Int i

Event OnDeath(Actor Murderer)

if(murderer == game.getplayer())
  game.getplayer().damageactorvalue("health", 1)
  i += 1
  if(i == 5)
    i = 0
    game.getplayer().moveTo(Marker2)
  endif
endif

EndEvent

EDIT: @Royal_Flush: Gut, dass ich nicht der Einzige bin, der kein Wort von ihm versteht.
 
Zuletzt bearbeitet:
Was ist an diesem Script falsch?
Sehr vieles. Ich schreib mal in Rot rein:

Code:
Scriptname skeever extends objectreference

 objectreference Property Marker2 auto
 Actor property player auto [COLOR="#FF0000"];wozu brauchst du das?[/COLOR]

 event [COLOR="#FF0000"];event was? OnActivate, OnEquip, ... Du musst dem Spiel schon sagen, wann das Skript ausgeführt werden soll.[/COLOR]

 if (game.getPlayer().DamageActorValue("health", 1) [COLOR="#FF0000"];Ich denke du willst, dass erkannt wird, ob der Spieler Schaden nimmt. Das funktioniert so nicht, DamageAV direkt Schaden zufügt. Was also passieren wird ist, dass dem Spieler ein HP abgezogen wird und wenn dies erfolgreich geschen ist (DamegeAV gibt "true" zurück) wird der Spieler zum Marker teleportiert. Ich habe leider keine Lösung dafür, da du Skripte meines Wissens nach nicht auf den Player legen kannst und [URL="http://www.creationkit.com/OnHit_-_ObjectReference"]OnHit[/URL] somit wegfällt...[/COLOR]
 Game.getplayer()[COLOR="#FF0000"].[/COLOR]moveto (Marker2)

 endevent

und wie muss man das umschreiben, wenn man will das z.B. verschiedene I zusammengezählt werden?

Ich mein das so:

Wenn Skeever a tot ist, i +1 )
Wenn Skeever b tot ist, i +1 )
Wenn Skeever c tot ist, i +1 )--> = 5Is
Wenn Skeever d tot ist, i +1 )
Wenn Skeever e tot ist, i +1 )
Ich verstehe die Frage nicht ganz. Willst du eine Laufvariable, sodass etwas einsetzt, sobald alle Skeever tot sind?
 
Ich wollte das so darstellen:

Spieler berührt Stein -> Spieler wird in einen anderen Raum teleportiert -> Messagebox erscheint -> 2 Möglichkeiten: Er geht oder bleibt (angenohmen er bleibt und so weit habe ich es fertiggebracht -> Wenn Player einmal verletzt wird, zurück zum startmarker ausserhalb des Raumes -> Wenn alle Gegner tot (In diesem Fall 5 Skever) Türe T1 unlock

Das in der rote Farbe konnte ich noch nicht zusammenstellen.

Ich bin ja noch etwas ungeübt mit dem Scripten, daher habe ich noch eine andere Anfängerfrage: Nach Event (z.B. onActivate), was ist das in den Klammern genau, wozu wird das gebraucht (z.b. ObjectReference akActionref)?
 
Das Einfachste wäre, wenn Du das auf die Tür legst:

Code:
Scriptname <SinnvollerScriptnameBitte> extends ObjectReference

import game
 
ObjectReference Property Marker2 auto
Int health

Event OnInit()

health = getplayer().getav("health")
registerforsingleupdate(1)

EndEvent

Event OnUpdate()

if(health > getplayer().getav("health"))
     health = getplayer().getav("health")
     getplayer().moveTo(marker2)
elseif(health < getplayer().getav("health"))   ; falls der Spieler sich heilt.
     health = getplayer().getav("health")
endif

if(islocked())
  registerforsingleupdate(1)
endif

EndEvent

(Das ginge noch einfacher über eine Perk-Ability, das schaust Du Dir aber am besten selber an, da ich recht wenig Lust habe, alles zu erklären.)

Und das auf die Skeever-Base:

Code:
Scriptname <SinnvollerScriptnameBitte> extends ObjectReference

ObjectReference Property lockedDoor auto
Int i

Event OnDeath(Actor Killer)

i += 1
if(i == 5)
  lockedDoor.lock(false)
endif

EndEvent


Zu den Events: Das sind die Parameter der Events. Wenn Du z.B. eine Function aufrufst, und den Parameter Argumente mitlieferst, dann ist das quasi dasselbe:

Code:
int function doSomething(int x)
 return x
endfunction

; der Function-Aufruf
int y = doSomething(5)

Hier gibst Du dem Parameter der Function den Wert 5.
Dasselbe macht das Spiel. Es ruft das Event mit den entsprechenden Argumenten (= Werte) auf, z.B. bei OnHit gibt es dem Event die Referenz des Angreifenden "mit auf den Weg".
 
Zuletzt bearbeitet:
  • Like
Reaktionen: blackHawk