Skriptthread zum Creation Kit

Code:
Scriptname XY extends ObjectReference  

ObjectReference Reference
FormList Property Doors Auto 

Event OnActivate(ObjectReference ActionRef)

if(actionref != game.getplayer())
  return
endif
int locklevel = getlocklevel()
if IsLocked()
    if(getlocklevel() < 255)
        if(game.getplayer().getactorvalue("Lockpicking") < locklevel)
            debug.Notification("You need lockpick skill " + locklevel + " to open!")
            blockactivation(true)
            return
        else
            blockactivation(false)
        endif
    endif
else
    blockactivation(false)    
endif
EndEvent

Warum hast Du eine while-Schleife eingebaut? Ein OnActivate-Event läuft doch sowieso nur einen Frame.
 
  • Like
Reaktionen: Quad2Core
Vielen dank noch mal :)
Hab wohl den wald vor lauter bäumen nicht gesehen^^ und wegen der while schleife um ehrlich zu sein ich weis es nicht mehr xD
hab halt so einiges ausprobiert nicht nur im bezug auf das genannte problem und habs vergessen wieder zu ändern^^
 
Skriptanfrage:

  • Was soll durch das Skript bewirkt werden?
--> Wenn der Spieler eine bestimmte Antwort auswählt bei einer anderen Person, soll diese aggressive werden und ihn angreifen.


Ich bin relativ unbewandert in Sachen Scripten und weiß auf diese bestimmt einfache Frage keine Antwort :?

MfG
Der SauerBauer
 
Ok, das ist jetzt schon fast peinlich, aber ich sehe gerade überhaupt nicht, was ich hier falsch mache:
Code:
Quest Property q auto

Event OnTriggerEnter (ObjectReference akActionRef)
	if (akActionRef==game.getplayer())
		Debug.MessageBox("Yippee!")
		q.setstage(30)
		q.SetObjectiveDisplayed(30)
	endif
endevent
Der Trigger wird aktiviert (Textbox wird angezeigt), aber die Queststage wird nicht umgeschaltet. Was übersehe ich?

@SauerBauer:
Im Topic-Info Fenster gibt es die "Papyrus-Fragment" Boxen. In die, die du haben willst, schreibst du rein:
Code:
akspeaker.startcombat(Game.GetPlayer())
 
Zuletzt bearbeitet:
  • Like
Reaktionen: SauerBauer
Hallo nochmal,

Ich habe eine kurze Frage bezüglich eines Papyrus-Fragments für Stage 20 einer meiner Quests.
Mein Script bisher ist:
if (KyneshainArbeiterhausQuest.isstagedone(10)==true)
SetObjectiveCompleted(10)
Debug.messagebox("Test erfolgreich")
endif
Das Script soll also bewirken, dass die 'Abgeschlossen-Meldung' nur kommt, wenn vorher Stage 10 ausgelöst wurde. Leider funktioniert das aber nicht so ganz, wie ichs mir vorgestellt habe.:huh: Was müsste ich dabei verändern?
(Das Debug.messagebox braucht nicht beachtet werden)


mfg alien_seth
 
Ich weiß nicht genau, wann eine stage als "done" gilt. Du könntest das aber vielleicht umgehen, indem du mit getstage()>10 arbeitest...

Übrigens hat sich mein Problem erledigt, es war kein Script-Problem sondern ein Problem mit der Quest.
 
@ royalflush: Dann würde die 'Abgeschlossen-Meldung' ja sowieso kommen, wenn stage 20 vor stage 10 aktiv ist. Genau das will ich ja verhindern.


mfg

edit: hat sich erledigt, hab die quest verändert.
 
Zuletzt bearbeitet:
Ich weiß nicht genau, wann eine stage als "done" gilt.

Sobald alle definierten Bedingungen für diesen Index erfüllt worden sind und die Engine auf die der nächsten wartet.
 
Hallo mal wieder,
dieses mal habe ich irgendwie ein problem mit den SM Even node's bzw quest's darüber zu starten.
Also bisher habe ich:

SM Event Node -> Crime Gold Event
-> Stacked Quest Node: xy ;bisher ohne irgendwelche Conditions weil ich erstmal wissen wollte ob das so überhaupt klappt
-> Quest: PPQ01

erstellt und im Quest Data Tab von PPQ01 Event:Crime Gold Event ausgewählt.

Anscheinend wird die Quest jedoch,erst garnicht über SM Crime gold event gestartet wird...
habe auch schon versucht simple Conditions einzufügen (wie GetQuestRunning == 0) um zu sehen obs dann klappt...
vllt habe ich das ganze konzept auch nicht richtig verstanden, aber hab halt schon die CK wiki dannach durchsucht und keine lösung gefunden :x

Edit: mit dem Change location event funktioniert alles wunderbar oO, hilft mir aber leider nicht weiter...
sehr merkwürdig....
 
Zuletzt bearbeitet:
Könnte mir bitte jemand einen Script erstellen, der:
Bei einem Miscobjekt, ein MagicEffect freisetzt/startet?
 
Nochmal ne Frage bezüglich eines Scripts, dass bei Aktivierung eines Schalters prüfen soll, ob der Spieler mind. 10 Gold im Inventar hat, dann 10 Gold aus dem Spielerinventar entfernen soll und im Anschluss seine Funktion (Steine erscheinen/verschwinden lassen) ausführen soll.
Dummerweise passiert beim aktivieren des Schalters allerdings nix.

Code:
ScriptName Testscript extends ObjectReference

ObjectReference Property Stein1 Auto Hidden
MiscObject Property Gold001 Auto

Event OnActivate (ObjectReference akActor)

if(akActor == game.getplayer())

  if(game.GetPlayer().getitemcount(Gold001) >= 10)   
     akActor.removeitem(Gold001, 10)

       Stein1 = GetLinkedRef()
         if (Stein1.IsDisabled())
            Stein1.enable(True)
         else
            Stein1.disable(True)
         endif

       utility.wait(0.001)
       Debug.messagebox("Aktivierung + Gold")
  endif
  
endif

EndEvent


Was hab ich denn da falsch gemacht? Ich komm einfach nicht dahinter, wo mein Fehler liegt.:huh:


mfg, alien_seth


edit: Fehler gefunden: Hatte vergessen, die Property festzulegen - Ich Idiot!:roll:
 
Zuletzt bearbeitet:
Hallöchen.
Ich habe folgendes Script:


Scriptname zzz extends ObjectReference

Perk Property wantedPerk auto

Event OnRead
()
if(!
game.getplayer().hasperk(wantedPerk))
game.getplayer().addperk(wantedPerk)
endif
EndEvent

und möchte es um die Message "wantedPerk erhalten" erweitern.

Dankeschön

 
@enorm
Was für eine Message hast du dir denn vorgestellt?
Also die am einfachsten umzusetzenden varianten wären sichlich

debug.Notification("wantedPerk erhalten") ;sendet eine top-left corner message

oder

debug.Messagebox("wantedPerk erhalten") ;wie der name sage sendet eine message box^^

die dann einfach unter den script der den perk added hinzufügen sprich:
Code:
[COLOR=#000000][COLOR=#0000BB]Scriptname zzz [/COLOR][COLOR=#007700]extends [/COLOR][COLOR=#0000BB]ObjectReference 

Perk Property wantedPerk auto 

Event OnRead[/COLOR][COLOR=#007700]() 
    if(![/COLOR][COLOR=#0000BB]game[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]getplayer[/COLOR][COLOR=#007700]().[/COLOR][COLOR=#0000BB]hasperk[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]wantedPerk[/COLOR][COLOR=#007700])) 
        [/COLOR][COLOR=#0000BB]game[/COLOR][COLOR=#007700].[/COLOR][COLOR=#0000BB]getplayer[/COLOR][COLOR=#007700]().[/COLOR][COLOR=#0000BB]addperk[/COLOR][COLOR=#007700]([/COLOR][COLOR=#0000BB]wantedPerk[/COLOR][COLOR=#007700])
        [/COLOR][/COLOR]debug.Messagebox("wantedPerk erhalten")[COLOR=#000000][COLOR=#007700] ;oder halt debug.Notification^^
    endif 
  [/COLOR][COLOR=#0000BB]EndEvent  [/COLOR][/COLOR]
 
  • Like
Reaktionen: enorm
debug.Messagebox("wantedPerk erhalten") ;wie der name sage sendet eine message box^^
Wie der Name sagt, sendet das eine Debug-Messagebox. Debug.Notification und Debug.Messagebox sind dafür gedacht, schnell Testnachrichten einzufügen, um den Ablauf eines Skriptes zu überprüfen. Für reguläre Meldungen sollte man die Funktionen nicht verwenden.

@enorm:
Das richtige Vorgehen besteht darin, zunächst im CK unter Miscellaneus -> Message eine neue Message anzulegen. Sagen wir, Du gibst ihr die ID WantedPerkMsg. Im Dialogfeld für die Message kannst Du unter anderem anhakeln, ob es eine Messagebox werden soll oder nur eine Nachricht, die kurz oben links eingeblendet wird.

Hast Du die Message erstellt, kannst Du sie im Skript wie gewohnt per Property einbinden:

Message Property WantedPerkMsg Auto

und mit

WantedPerkMsg.Show()

ausgeben lassen. Der Vorteil besteht darin, dass der Nachrichtentext im CK definiert und somit in der Esp gespeichert wird. Will man den Text später ändern, oder jemand vielleicht die Mod übersetzen, braucht dafür nicht in den Quelltexten der Skripte herumgefummelt zu werden. Die man möglicherweise auch gar nicht hat, da viele Mods für Skyrim ohne die Skript-Quelltexte veröffentlicht werden. Dass Bethesda die Meldungsausgabe von den Skripten entkoppelt hat, war m.E. eine der positiven Neuerungen des Skript-Systems. Man sollte davon Gebrauch machen - auch wenn's etwas mehr Mühe macht, als fix 'ne Debug-Message ins Skript zu schreiben.
 
  • Like
Reaktionen: enorm
Hey ihr,

ich hab mal wieder ein Problem mit einem Script:
Es soll (bis jetzt) die Anzahl aller Edelsteine im Inventar überprüfen, wegnehmen und bei einem Marker in eine offene Kiste legen. Allerdings gibt er mir in Zeile 15 (das Fett markierte): required (...)+ loop did not match anything at input '[' und required (...)+ loop did not match anything at input ']'.

Dann zum 2. Teil des Scripts, bei dem ich noch nicht weiß, wie ich das machen soll / kann. Ich will bei einer zweiten Aktivierung die Edelsteine entfernen und sie wieder ins Spielerinventar geben. Die Anzahlen sind in den Variablen gespeichert, das wäre kein Problem, aber ich weiß nicht, wie ich die aus der Kiste wieder entfernen kann.

Vielen Dank schonmal im Voraus.

Code:
Scriptname AA13GemsScr extends ObjectReference  

MiscObject[] Property Gems auto
ObjectReference Property Marker auto
Int i
Int once
Int[] count

Event OnActivate(ObjectReference akActionRef)
If once == 0
i = 0
    While i <= 11
        count[i] = Game.GetPlayer().GetItemCount(Gems[i])
        Game.GetPlayer().RemoveItem(Gems[i], count[i])
            ObjectReference [B]Gems[i]b[/B] = Marker.PlaceAtMe(Game.GetForm(Gems[i]), count[i]) <-- Zeile 15
        i += 1
    EndWhile
ElseIf once == 1

EndIf
EndEvent
 
Ich habe gerade keine Zeit das Skript zu schreiben, aber ich kann Dir sagen, dass die Verwendung von PlaceAtMe in diesem Fall und ohne disable() und delete() zu Savegame-Schäden führen kann. Außerdem denke ich, dass Du keine [] in einem Namen verwenden solltest, Papyrus scheint es falsch zu erkennen.
 
Außerdem denke ich, dass Du keine [] in einem Namen verwenden solltest, Papyrus scheint es falsch zu erkennen.

Nein, es denkt dann du möchtest mit einem Array arbeiten.

In Zeile 15 versucht er allerdings erst aus dem MiscObject Array Gems eine Object Referenz zu machen, als auch gleichzeitig mit der uninitialisierten Variable b zu arbeiten. Daran hängt sich der Compiler auf.