Skriptthread zum Creation Kit

Probier' mal folgendes:

Code:
ExhaustedOptionsMenu Property OptionsMenu auto

Das Property dann mit dem Skript bzw. Magic Effect füllen...
 
  • Like
Reaktionen: old_men
Eine Property vom Type eines Scriptes kann man nicht füllen.
Probiere es mal so:

Code:
MagicEffect Property MGwithVar auto

...

(MWwithVar as ExhaustedOptionsMenu).variable = x    ; Cast des MagicEffects zum Script.
 
Hallo^^,
Gibt es eine möglichkeit per script ein Gift auf eine Waffe zu setzen?
Ich hab eigentlich vor eine Power im spiel hinzuzufügen mit der man Gift x auf Waffe y setzen kann. Nur habe ich keine Ahnung wie das am besten umzusetzen wäre ich habe schon etliches versucht aber das war alles nur supoptimal :/
 
Es gibt derzeit nur die Möglichkeit das Gift per EquipItem auszurüsten. Dabei erscheint aber auch die Bestätigungsmessage wie als wenn man das Gift normal ausrüstet. Außerdem muss die gewollte Waffe dazu ausgerüstet sein, sollte aber kein Problem sein, da man die aktuelle Waffe durch getequippedweapon() speichern kann, dann die gewollte Waffe ausrüstet, das Gift aufträgt, sie wieder ablegt und die gespeicherte Waffe wieder ausrüstet.
 
  • Like
Reaktionen: Quad2Core
Hallo leute,

ich arbeite an einer equipable tattoo mod und möchte das ganze so machen:

-> Ich habe die Vanilla Rassen kopiert und zu jedem Skin jeweils eine eigene Vanilla Rasse erstellt. Nun möchte ich durch Items ermöglichen, dass wenn man das Item ausrüstet sich die Rasse z.B. von der normalen BretonRace in die BretonRaceTattoo1 verändert. Beim ablegen sich aber wieder zurückverändert in die BretonRace.

Ich möchte das ganze so ungefähr machen wie der Werewolf script, leider weis ich nicht genau was ich da ändern muss: so sieht der Werewolf script aus:


Scriptname PlayerWerewolfScript extends ReferenceAlias



Race Property WerewolfBeastRace auto


Event OnRaceSwitchComplete()
if (GetActorReference().GetRace() == WerewolfBeastRace)
; Debug.Trace("WEREWOLF: Getting notification that race swap TO werewolf is complete.")
(GetOwningQuest() as PlayerWerewolfChangeScript).StartTracking()
else
; Debug.Trace("WEREWOLF: Getting notification that race swap FROM werewolf is complete.")
(GetOwningQuest() as PlayerWerewolfChangeScript).Shutdown()
endif
EndEvent



Kann mir bitte jemand helfen und eventuell einen script posten der dies möglich macht oder jedenfalls das ändern der Rasse ermöglicht.

Danke schonmal und hoffe mir kann jemand helfen, wäre mir sehr wichtig :)
 
Zuletzt bearbeitet:
Code:
Scriptname ChangeRaceOnEquip extends ObjectReference

Race Property BretonRace auto
Race Property BretonRaceTattoo1 auto
; und so weiter
Race prevRace


Event OnEquipped(Actor actionRef)

prevRace = actionRef.getrace()
if(prevRace == BretonRace)
    actionRef.setrace(BretonRaceTattoo1)
elseif(prevRace == ...)
    ...
endif

EndEvent


Event OnUnequipped(Actor actionRef)

actionRef.setrace(prevRace)

EndEvent
 
  • Like
Reaktionen: chrizXz
Hallo,
gibt es eine Möglichkeit erlittenen Schaden zu ermitteln? Ich würde gerne eine Rüstung nach einem festgelegten erlittenen Schaden in einen schlechteren Zustand zu versetzten.
 
Hallo, ich bräuchte bitte mal ein Script das bewirkt, wenn man eine waffe zieht die sich mit einer anderen austauscht. Also habe Waffe 1 ausgerüstet - ziehe Waffe1 - beim ziehen habe ich Waffe 2 in der Hand - stecke Waffe2 wieder ein - Waffe1 ist wieder ausgerüstet. Also das dass so aussieht das Waffe1 beim ziehen sich in Waffe2 verwandelt.

MFG
Sammael666
 
@Todeskeks:
if game.getplayer().GetActorValuePercentage("health") <= dein Wert

Mich würde übrigens für eine Mod interessieren, ob man abfragen kann, ob ein Spieler gerade einen Zauber castet. Der Script kann auch auf dem Zauber draufliegen. Ich würde nämlich gerne einen bestimmten Wert pro Sekunde verringern, während der Spieler einen Strahl abschießt. OnEffectStart funktioniert doch nur, wenn man Gegner trifft, oder..?
 
@Dark Egon:
Das kenne ich schon. Gibt es sonst keine Möglichkeit, um den erlittenen Schaden zu ermitteln und nicht wie viel Leben der Spieler hat?
 
@ Todeskeks: Relativ kompliziert, wenn Du den genauen Schaden haben willst. Das Abfragen der Lebenspunkte ist nicht empfehlenswert, da Du mit einem OnUpdate-Event dauernd die Lebenspunkte abfragen musst, was dazu noch ziemlich ungenau sein wird, da oft mehrere Schadensquellen auf einmal auf Dich eintreffen. Ich würde eine Ability mit einem OnHit-Script auf einen NPC durch ein OnEquip-Event auf der Rüstung legen, d.h. Rüstung mit OnEquip -> Ability dem Träger hinzufügen -> Ability registriert mit OnHit jeden Treffer -> Schadensrekonstruktion -> Bei Ablegung der Rüstung wird per OnUnequip die Ability entfernt.
Die Schadensrekonstruktion ist jetzt das eigentlich komplizierte. Du musst mithilfe der Formeln den erlittenen Schaden berechnen. Ich habe auf UESP die Rüstungs- und Waffenformel für den Schaden gefunden. Das sollte auf jedenfall ein guter Punkt zum Starten sein.

@ Samael666: Am geschicktesten wäre es auf SKSEs OnKeyPressed-Events zu warten. Dann könntest Du einfach abfragen, ob die Taste zum Waffe ziehen gedrückt wurde und ob Deine Waffe dabei ausgerüstet ist. Andernfalls müsstest Du dauernd ein OnUpdate-Event laufen lassen, um abzufragen, ob die Waffe gezogen wurde, was schön an Papyrus' Leistung ziehen wird, wenn es zu oft läuft. Zur Waffen- Umwandlung würde sich Get/SetModelPath, ebenfalls von SKSE, eignen (falls es überhaupt so funktioniert, wie ich mir das vorstelle - nie getestet). Andernfalls müsstest Du equipItem benutzen, was dazu noch dämlich aussehen wird, weil dann Dein Charakter die Waffe ebenfalls ziehen wird, also zweimal die Animation abgespielt wird. Also alles nicht so einfach zu bewerkstelligen.

@ Darg Egon: Probier' mal OnSpellCast.
 
Hallo,

hat sich eigentlich seit der lettzten Aktualisierung des CK was an dem Scriptsystem verändert?
Alle meine Scripte und Quests, die ich vorher getestet hatte, und die problemlos funktionierten, funktionieren jetzt seltsamerweise nicht mehr. Der Compiler spuckt mir jedes mal aus:
Code:
Starting 1 compile threads for 1 files...
Compiling "testscript"...
g:\steam\steamapps\common\skyrim\Data\Scripts\Source\s.psc(6,32): missing RPAREN at 'Actor'
g:\steam\steamapps\common\skyrim\Data\Scripts\Source\s.psc(6,52): no viable alternative at input ','
g:\steam\steamapps\common\skyrim\Data\Scripts\Source\s.psc(0,0): error  while attempting to read script s: Der Objektverweis wurde nicht auf  eine Objektinstanz festgelegt.
No output generated for testscript, compilation failed.

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



EDIT: Ok - Problem behoben. Keine Ahnung, wo diese "s-Script" herkam, aber nachdem ichs aus dem Ordner gelöscht habe gibts keine Probleme mehr. Frag mich, warum sich das CK an jeglichem Script und jeder Quest an dem Script aufgehangen hat.
 
Zuletzt bearbeitet:
@ Todeskeks und Kahmul:
Doch, die Abfrage der Lebenspunkte wäre meiner Meinung nach sogar sehr sinnvoll, wenn man ganz einfach ein Event OnHit einbaut und dann die Leben mit einer Variable abgleicht.

Für den Fall, dass meine Frage einfach als Teil der Antwort überlesen wurde stelle ich die übrigens nochmal:
Gibt es eine Möglichkeit, eine Variable sekündlich zu verkleinern, während der Spieler mit einem Ziel-Zauber danebenschießt?
 
Also habe mal das Scrip von Oblivion für die Warglaiven genommen. Kann man das so umschreiben das es für Skyrim fuktioniert? Kenne mich leider noch nicht so aus mit den Scripten für Skyrim.

Also hier das für die Waffe wenn sie Ausgerüstet ist:
PHP:
scn cbWarglaiveSheathScriptBack
; original script by ercvomnil


Begin GameMode

if ( GetContainer != Player )
Return
endif

if (Player.GetEquipped cbSelenesWarglaiveBack && Player.IsWeaponOut == 1)

    message " "
    message " "
    Player.EquipItem cbSelenesWarglaive

;--- If the scimitar weapons aren't being used at all, then let's remove the sheathed decoys, if any.

elseif (Player.GetEquipped cbSelenesWarglaive == 0 && Player.GetEquipped cbSelenesWarglaiveBack == 0 && Player.GetItemCount cbSelenesWarglaiveBack > 0)

    message " "
    message " "
    Player.RemoveItem cbSelenesWarglaiveBack 1

endif

End

Und hier das Scrip das wenn die Waffe gezogen wird:

PHP:
scn cbWarglaiveSheathScript
; original script by ercvomnil

float fQuestDelayTime

Begin GameMode

;--- Setting this too variable makes the script run much less often, and does the same thing as "DoOnce" hack
set fQuestDelayTime to 0.1

if ( GetContainer != Player )
    Return
endif

;--- If the scimitar is equipped and sheathed, and if the shield slot has one of the other scimitar off hands...

if (Player.GetEquipped cbSelenesWarglaive == 1 && Player.IsWeaponOut == 0 && (Player.GetEquipped cbWarglaiveOffhand == 1 ))

;--- ...then we want to take off the offhand so the player isn't holding when not in attack mode...

    message " "
    message " "
    if (Player.GetEquipped cbWarglaiveOffhand == 1)
        Player.UnequipItem cbWarglaiveOffhand
    endif

;--- ...and equip the appropriate sheathed decoy. w00t.

    if (Player.GetItemCount cbSelenesWarglaiveBack == 0)
        message " "
        message " "
        Player.AddItem cbSelenesWarglaiveBack 1
    endif

    message " "
    message " "
    Player.EquipItem cbSelenesWarglaiveBack

;--- Finally, if the scrimitar is drawn...

elseif (Player.GetEquipped cbSelenesWarglaive == 1 && Player.IsWeaponOut == 1 && Player.IsShieldOut == 0)

;--- ...then let's re-equip the scimitar offhand, if any...

    if (Player.GetItemCount cbWarglaiveOffhand > 0)
        message " "
        message " "
        Player.EquipItem cbWarglaiveOffhand
    endif

;--- ...and also remove any of those sheathed decoys, if any, from the inventory.

    if (Player.GetItemCount cbSelenesWarglaiveBack > 0)
        message " "
        message " "
        Player.RemoveItem cbSelenesWarglaiveBack 1
    endif

endif

End

MFG
Sammael
 
Zuletzt bearbeitet:
Jep, geht ganz einfach:
if game.getplayer().getequippeded(###) == true && game.getplayer.isweaponout == 1
game.getplayer().equipitem ###2

Das jetzt noch schön verpacken und gegebenenfalls getequipped anpassen. Ich weiß nicht, ob die Anwendung so stimmt. vielleicht ist es auch
...getequipped ### == true
oder
...getequipped == ###
oder so

### und ###2 natürlich mit deinen Waffen ersetzen

Ich würde das übrigens mit einem Zauber mit OnUpdate abfrage machen, den du besitzt, während du die Waffe ausgerüstet hast. Hoffentlich ist das jetzt nicht alles zu durcheinander...
 
@ Dark Egon: Nein, die Abfrage der Lebenspunkte per OnUpdate + OnHit ist nicht empfehlenswert. Du kannst OnUpdate nicht 24/7 bei einem 0.1 Interval laufen lassen, selbst nicht, wenn Du eine RegisterForSingleUpdate()-Chain verwendest. Das würde Papyrus ziemlich belasten und ein größerer Interval wäre bei dieser gewollten Funktion nicht sinnvoll. Außerdem wird das OnUpdate-Event, das die Lebenspunkte feststellt, dem OnHit eventuell zuvorkommen und die ganze Rechnung stören, da er jede Sekunde läuft. Und das Abstellen des OnUpdates während des OnHit-Events würde weitere Treffer außen vorlassen.
Das Einzige, was ich mir noch denken könnte, außer der kompletten Schadensreproduktion, wäre so etwas hier:

Code:
Float health
Actor Property playerRef auto


Event OnEffectStart(Actor Target, Actor Caster)

health = playerRef.getActorValue("Health")

EndEvent

Event OnHit(ObjectReference AttackerObj, Form akSource, Projectile akProjectile, bool abPowerAttack, bool abSneakAttack, bool abBashAttack, bool abHitBlocked)

Health -= playerRef.getActorValue("Health")
; anderes Zeug

health = playerRef.getActorValue("Health")

EndEvent

Würde aber nicht Heilung mit einbeziehen und wäre genauso fehlerhaft. Wie gesagt, Schadensreproduktion durch OnHit ist meiner Meinung nach das beste, aber eben am kompliziertesten.


Zu Deiner Frage: Ich hatte Dir schon in meinem Beitrag oben Dir etwas vorgeschlagen. Müsstest aber testen, ob das Event öfters gecallt wird, wenn der Zauber dauerhaft gecastet wird. Ob der Zauber trifft, könntest Du mit einem OnEffectStart testen. Eine Variable zu verkleinern sollte nicht das Problem sein.

@ Sammael666: Ich habe Dir oben eigentlich bereits alles beschrieben. Selene benutzt eine Methode, die in Oblivion noch funktionierte, aber in Skyrim so nicht mehr nutzbar ist, wenn Du Dein Skyrim nicht zerlegen willst. Du kannst kein Event so oft laufen lassen, wie es in Obl. mit GameMode + fQuestDelayTime ging. Wenn Du jedoch mit einer Verzögerung von 1-2 Sekunden beim Ziehen der Waffe zufrieden bist, geht das jedoch. Ob Du das willst ist die andere Frage. Dazu benutzt Du einfach ein OnUpdate-Event, das Du alle 1-2 Sekunden laufen lässt, und welches checkt, ob Du die Waffe ausgerüstet und gezogen hast, und dann eben die andere Waffe ausrüstet.
 
@Dark Egon

So habe jetzt mal alles so umgeschrieben aber es klappt nicht...

PHP:
Scriptname Waffe1script extends ObjectReference  

Event onadd
game.additem shield 1
Eventend



Event GameMode


;--- If the scimitar is equipped and sheathed, and if the shield slot has one of the other scimitar off hands...

if game.getplayer().getequipped (Waffe1) == true && game.isweaponout == 1 && game.getplayer().equipitem shield

;--- ...then we want to take off the offhand so the player isn't holding when not in attack mode...

    message " "
    message " "
    if game.GetEquipped shield == 1
        game.UnequipItem shield
    endif

;--- ...and equip the appropriate sheathed decoy. w00t.

    if game.GetItemCount waffenormal == 0
        message " "
        message " "
        game.AddItem waffenormal 1
    endif

    message " "
    message " "
    game.EquipItem waffenormal

;--- Finally, if the scrimitar is drawn...

elseif game.GetEquipped waffe == 1 && game.IsWeaponOut == 1 && game.IsShieldOut == 0

;--- ...then let's re-equip the scimitar offhand, if any...

    if game.GetItemCount shield> 0)
        message " "
        message " "
        game.EquipItem shield

;--- ...and also remove any of those sheathed decoys, if any, from the inventory.

    if game.GetItemCount waffenormal > 0
        message " "
        message " "
        game.RemoveItem waffeanormal 1
    endif

endif

EndEvent


Und das andere:

PHP:
Scriptname Waffenormalscript extends ObjectReference  

Event GameMode


if game.GetEquipped Waffenormal && game.IsWeaponOut == 1

    message " "
    message " "
    Game.EquipItem Waffe1

;--- If the scimitar weapons aren't being used at all, then let's remove the sheathed decoys, if any.

elseif game.GetEquipped Waffe1 == 0 && game.GetEquipped Waffenormal == 0 && game.GetItemCount Waffenormal > 0)

    message " "
    message " "
    game.RemoveItem Waffenormal 1

endif

EndEvent

Und was muss ich eigentlich als extends nehemen?
 
Du hast den Syntax von Oblivion und Skyrim total vermischt. Ich weiß nicht, ob Du jetzt für Oblivion das Skript willst oder für Skyrim. Falls Du es für Oblivion willst, schreibe es in den Construction Set-Thread. Falls Du es für Skyrim willst, empfehle ich Dir erstmal Dich mit dem Papyrus-Syntax auseinanderzusetzen. Im Creation Kit-Wiki findest Du dazu alles. Außerdem scheinst Du meinen beiden Beiträge zu Deinem Thema komplett ignoriert zu haben. Wenn Du damit nichts anfangen kannst, empfehle ich Dir wie gesagt das Creation Kit-Wiki.
 
@Kahmul: Habe ich denn jeh etwas von einem OnUpdate-Event gesagt..? Ich meinte nur, dass man folgendes macht (Commands könnten unvollständig sein - ich ziehe sie mir sonst immer aus einer Liste):

Event OnHit
if game.getplayer().getactorvaluepercentage("health") < ###

blablabla

EndEvent

Oder wenn man es mit Schadenswerten statt Verhältnissen machen will:
float Leben

Event OnEquip
Leben = (game.getplayer().getactorvalue("health") / game.getplayer().getactorvaluepercantage("health") * 100) ; (ich glaube, das berechnet das doch in Prozent, oder..?)
EndEvent

Event OnHit
if Leben - game.getplayer().getactorvalue("health") > ##(der Schadenswert)##

blablabla

EndEvent

Und @Sammael:
Probiere es mal mit dieser Seite, verwende die gegebenen Commands und guck mal den Script für ein gebundenes Schwert nach. Dann dürftest du findig werden. Ich habe gerade nicht so viel Zeit. Das hat mir geholfen:

http://www.cipscis.com/skyrim/tutorials/beginners.aspx

Mein voriger Kommentar hatte auch nicht inbegriffen, dass die Waffe in eine bestimmte Hand sollte, das ist aber, glaube ich, in gebundenen Waffen drin. Der Command zur Abfrage, ob die Waffe gezogen ist, existiert in Skyrim noch. Das einzige Problem dabei wäre die Einbindung, wobei mir dieses Mal doch nur OnUpdate einfiele...
 
Ich habe das OnUpdate-Event einfach vorausgesetzt, da es nicht anders geht, wenn man dauernd Leben abgleichen will, da man dauerhaft das Leben des Spielers tracken muss. In Deinem Beispiel hast Du nichts anderes als ich oben geschrieben und wie bereits gesagt funktioniert das nicht, da das Leben des Spielers von mehreren Faktoren wie z.B. Heilung beeinflusst wird, nicht nur durch OnHit. Man kann leider alles nicht so leicht bewerkstelligen im TES-Skripting.