PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Skripten: Zaubereffekte und Wasseranstieg



Indy
17.12.2007, 19:09
Hallo

Ich möchte gerne eine Statue machen, die beim Wirken eines bestimmten Zaubereffekts eine Reaktion hervorruft. Gut, das ist ja nicht schwer. Aber ich möchte nicht die Reaktion durch einen ganz bestimmten Zauber hervorrufen (zB "StandardCalmTarget2Apprentice"), sondern durch alle Zauber einer Art (also zB alle "Beruhigungs"-Zauber).
Wie setze ich dies per Skript um?

Andere Frage:
Ist es möglich über Skript per Schalter den Wasserpegel ansteigen zu lassen? Also nicht schlagartig, sondern eher langsam, da sich der Spieler gleichzeitig in der selben Zelle befinden soll.

bg2408
17.12.2007, 20:33
[1]sondern durch alle Zauber einer Art (also zB alle "Beruhigungs"-Zauber).
Wie setze ich dies per Skript um?

[2]Ist es möglich über Skript per Schalter den Wasserpegel ansteigen zu lassen?
1. Begin OnMagicEffectHit ####
#### = gewünschter Effekt.
2. Uah. Nicht, daß ich wüßte.

Indy
17.12.2007, 21:04
Danke, dieser Befehl wird mir noch sehr hilfreich sein. :)

zum 2. Also langsames Ansteigen ist auch nicht unbedingt nötig, es kann auch eine schlagartige Änderung der Wasserhöhe sein, falls dies möglich ist.

Atoom
17.12.2007, 21:19
wie wärs mit vielen kleinen schlagatigen Anstiegen hintereinander, mit nem zeitintervall dazwischen?

bg2408
17.12.2007, 22:11
http://cs.elderscrolls.com/constwiki/index.php/Changing_Water_Level_via_Script

Indy
18.12.2007, 09:09
Ist wie es aussieht nicht möglich ohne OBSE....

Naja, dann werde ich mein "Problem" wohl ein wenig anders lösen müssen. :)

Indy
18.12.2007, 17:31
So, hab noch ein Problem.

Bei Begin OnMagicEffectHit gehört eine 4-stellige Buchstabenfolge hin, welche den Zaubereffekt beschreibt. Woher soll ich jetzt wissen, was ich hier nehmen soll?

Und wie würde das Resultat-Skript aussehen, das beim Anwenden des gewünschten Zaubers einen Activator auslösen soll?

bg2408
18.12.2007, 17:56
Bei Begin OnMagicEffectHit gehört eine 4-stellige Buchstabenfolge hin, welche den Zaubereffekt beschreibt. Woher soll ich jetzt wissen, was ich hier nehmen soll?Aus dem CS. Die EditorID jedes Zaubereffekts wird im CS angezeigt, wenn man da ein paar Balken verschiebt. Beispiel: FIDG = Fire Damage.

Script: Schau einfach vorhandene Scripts an, z.B. das des Magiergildenauftrags ;)

Indy
18.12.2007, 18:14
Script: Schau einfach vorhandene Scripts an, z.B. das des Magiergildenauftrags

Ja, das hab ich mir schon ausführlich angeschaut. ;)

Das Problem ist, dass die bereits vorhandenen Skripte immer mit so vielen anderen Dingen "vollgestopft" sind. So enthält dieses Magiergildenskripte erstmal 4 solche Abfragen, dann noch andere Questabfragegen und und und.

Ich möchte ein sauberes, einfaches Skript, das auf eine kurze Magieeffektabfrage einen Activator auslöst. :(

Edit:
Die Lösung war ganz einfach. :) Warum müssen selbst die einfachsten Skripte von Bethesda Softworks immer so komplex und kompliziert aufgebaut sein? :D (zB stinknormale Schalter).

Mein Ergebnis ist ganz kurz, benötigt gerade mal 2 Variablen und sieht sauber aus:


Scriptname 1FeueraufActivator

;Feuer auf den Activator löst den ParentActivator aus.

ref myParent
ref mySelf

Begin OnMagicEffectHit FIDG

set myParent to getParentRef
set mySelf to getSelf
myParent.activate mySelf 1
return

End

Funktioniert schon hervorragend, nur den Balken für die 4 Buchsttabenkennung habe ich nach langen Rumschiebeversuchen immer noch nicht gefunden. Könntest du mir eventuell einen Screenshot schicken?

Low Post
18.12.2007, 20:12
Schau dir alternativ die Liste im Wiki (http://cs.elderscrolls.com/constwiki/index.php/Magic_Effects_List) an.

PS:
Ich hab mal deine Posts zusammengefügt. In Zukunft bitte Doppelpost innerhalb so kurzer Zeit unterlassen.

Atoom
19.12.2007, 12:32
hier is noch mal ein screenshot ausm cs:
http://img340.imageshack.us/img340/9118/neubitmapzp1.th.jpg (http://img340.imageshack.us/my.php?image=neubitmapzp1.jpg)

Indy
19.12.2007, 19:07
Danke, funktioniert jetzt so wie es sein sollte.

Neues Problem:

Ich möchte ein kleines Skript schreiben, das den Spieler prüft, ob ein bestimmter Magiezustand auf ihm liegt. Ich habe in den bereits vorhandenen Skripten gesucht, aber nichts gefunden. Kann mir jemand dabei behilflich sein?

Edit:
Ein Trigger ist nach einmaligem Auslösen "aufgebraucht", wenn ich mich nicht irre? Ließe sich dieser in diesem Fall durch das Betreten eines anderen Triggers wieder aktivieren? Oder schreibe ich gerade Humbug und Triger können so oft ausgelöst werden, wie man will?

Indy
20.12.2007, 14:15
*auf sich aufmerksam mach*

Was ich genau bezwecken will:
Bei Berührung eines Triggers soll per Skript geprüft werden, ob der Spieler unsichtbar ist (=> MagicEffect!).

Gibt es dafür einen geeigneten Befehl?


Und so nebenbei:
Wie heißt eigentlich die Skriptsprache, die im CS verwendet wird?

Low Post
20.12.2007, 15:49
HasMagicEffect (http://cs.elderscrolls.com/constwiki/index.php/HasMagicEffect)


Bei deinem Trigger-Problem kann ich dir leider nicht weiterhelfen. Die haben mir auch noch nicht ihr Geheimniss offenbart.

kenet_korva
20.12.2007, 16:58
Sieh dir mal das Script des Triggers an. Höchstwarscheinlich gibt es dort eine Variable "doonce" die am ende des Scripts auf einen Wert gesezt wird der höher als 0 ist. Das Script des anderen Triggers könnte dann wiefolgt lauten:


scn Scriptname

short doonce
ref parent

begin OnTrigger Player
if doonce == 0
Set Parent to GetParentRef
Set Parent.doonce to 0
set doonce to 1
endif
end


Dann musst du nur den Trigger den du wieder aktiviert haben willst als Parent des anderen einstellen.

Indy
20.12.2007, 17:07
Es funktioniert jetzt. Nur habe ich jetzt ein Problem.

Sobald ich den Trigger betrete, der auf Unsichtbarkeit prüft soll dieser danach nicht mehr ausgelöst werden können, bis der andere Trigger passiert wurde. Beim Betreten des anderen Triggers soll das Auslösen dieses Triggers dann wieder möglich sein.


Edit: (Keine Codefunktion bei Edit? :( )
Hier beide Quellcodes:

Haupttrigger:


Scriptname 1TestUnsichtbartest

short triggered
ref target
ref mySelf
ref timer

begin onTriggerActor

if timer != 1
if player.HasMagicEffect INVI != 1
set target to getParentRef
set mySelf to getSelf
target.activate mySelf 1

set timer to 1
endif
else
MessageBox "Test - Tür nicht aktiviert!"
endif

end

Rücksetztrigger:


scn 1DoonceRuecksetzen

short timer
ref parent

begin OnTrigger Player
Set Parent to GetParentRef
Set Parent.timer to 0
end


Beim Rücksetzen wird der Timer nicht wie erwartet zurückgesetzt - Die Messagebox "Test - Tür nicht aktiviert!" wird ausgegeben. Und ja, der Rücksetztrigger hat den Haupttrigger als Parent.

Sieht ganz danauch aus, als ob bei dem Rücksetzsrkipt was nicht klappt.

Low Post
20.12.2007, 17:59
Beim Edit gibt's sehr wohl Code-Tags:
Entweder klickst du auf Erweitert um in den normalen Editor zu kommen, oder du schreibst selber an den Anfang des Codes
und an's Ende hin.


Zu deinem Script:
ich würde Timer noch zu einer Short-Variablen machen.
als Ref ist das imho etwas doof. ;)


Außerdem ist bei deinem Script, so wie es jetzt aussieht die Timer-Variable im Zurücksetzt-Script etwas sinnlos ist (wird nicht verwendet).

Indy
20.12.2007, 18:02
Derzeitiger Zustand des Skripts:


Scriptname 1TestUnsichtbartest

ref target
short doonce
ref myself

begin onTriggerActor

if doonce == 0
MessageBox "Test - Tür aktiviert!"
if player.HasMagicEffect INVI != 1
set target to getParentRef
set myself to getself
target.activate myself 1
set doonce to 1
set myself to 0
endif
endif

end


scn 1DoonceRuecksetzen

short doonce
ref parent

begin OnTrigger Player
Set Parent to GetParentRef
Set Parent.doonce to 0
end
(Wenn ich versuche im Rücksetzskript "short doonce" zu entfernen wirft er mir Skript Errors entgegen)

Funktioniert nur leider nicht wie es sollte -> Hauptskript wird einmal ausgelöst, danach nie wieder. -> doonce wird nicht zurückgesetzt!

Edit: Hier noch das vorgefertigte Skript des Activator-Doors, falls dieses irgendwie reinpfuschen könnte:


scn RuinsGATEopenSCRIPT

; activated by linked child
; activates optionally linked parent after 1 sec delay

short init
short closed
short next
short busy
float timer

ref mySelf
ref myParent

begin onActivate

set mySelf to getSelf
set myParent to getParentRef

if isActionRef player == 1

if closed == 1
message "Dieses Tor wird anderswo geöffnet."
endif

elseif isActionRef mySelf == 0 && busy == 0

if closed == 0
playgroup forward 0
set closed to 1
disableLinkedPathPoints
else
playgroup backward 0
set closed to 0
enableLinkedPathPoints
endif

set next to 1
set timer to 1
set busy to 1

endif

end

begin gameMode

if init == 0
; set up ref vars
set mySelf to getSelf
set myParent to getParentRef
; prepare linked pathsgrid points
enableLinkedPathPoints
set init to 1
endif

; daisy-chain activation
if next == 1 && timer <=0
set next to 0
myParent.activate mySelf 1
endif

if timer > 0
set timer to timer - getSecondsPassed
endif

if isAnimPlaying == 0 && busy == 1
set busy to 0
endif

end

begin onReset

reset3DState
set closed to 0
set next to 0
set busy to 0
enableLinkedPathPoints

end

Indy
20.12.2007, 19:31
Problem gelöst. Ich habe das Skript auf nun anders geschrieben, sodass doonce automatisch zurückgesetzt wird, wenn sich der Spieler davon entfernt.

Nun ein neues Problem:


scn 1FalscherSchrittTeleport2

short triggered
float timer
ref me

begin onTriggerActor

if triggered == 0
set me to getself
cast 1Eiseffekt me
Player.MovetoMarker 1MarkerBack
set triggered to 1
set timer to 5
endif

end

begin gameMode

if triggered == 1 && timer <= 0
set triggered to 0
endif

if timer >= 0
set timer to timer - getSecondsPassed
endif

end


Dieses Skript soll beim Betreten eines Triggers den Spieler einfach zum Marker teleportieren. Dummerweise wird dies zu einer Endlosschleife. Was habe ich hier vergessen?

Indy
24.12.2007, 11:55
So, ich habe nun ein neues Problem.

Ich möchte in einem Skript nach ein if-Abfrage ganz einfach einen bestimmten NPC töten.
Versucht habe ich dies mit


kill NameRef

doch der NPC stirbt nicht wie geplant.

Low Post
25.12.2007, 00:06
Wiki hilf (http://cs.elderscrolls.com/constwiki/index.php/Kill)


kill bewirkt, dass der "Calling Actor" stirbt. Der Paramteter danach bestimmt den Verursacher.

Richtig wäre also:

NameRef.kill

Falls du dem Spiel noch sagen willst, der Spieler ist verantwortlich:

NameRef.kill Player