Construction Set Skriptthread zum Construction Set

Skripte für Player auf alle Actors erweitern

Hallo, ich habe eine Frage zu einem Skript:

Code:
Scriptname aaaSchattenumarmung

short gotRST

begin OnEquip player

if gotRST == 0
	player.AddSpell aaaarmorshaderSpell
	set gotRST to 1		
endif

End


begin OnUnequip player

if gotRST == 1
	player.removespell aaaarmorshaderSpell
	set gotRST to 0	
endif

End

Dieses Script auf einer Rüstung sorgt dafür, das dem Player ein Shadereffekt hinzugefügt wird.
Dies funktioniert auch tadellos.
Wie muß ich das Skript ändern, damit der Shader nicht nur dem Player zugefügt wird, sonderm jedem Char, der diese Rüstung trägt?
BTW: Warum funktionieren Shader eigendlich nicht in Verzauberungen?
 
Wie muß ich das Skript ändern, damit der Shader nicht nur dem Player zugefügt wird, sonderm jedem Char, der diese Rüstung trägt?
Lass einfach player bei den begin-Anweisungen weg.

CS-Wiki schrieb:
If no parameter is used, the block will be run whenever the object is equipped by any actor.

http://cs.elderscrolls.com/index.php/OnEquip

Edit: Hmm, bei AddSpell und RemoveSpell muss player natürlich auch noch weg.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: dark_ossi
hat leider nicht geklapt; vor den begin- Blöcken kann ich den Player tatsächlich weglassen, aber das addspell-Kommando scheint nicht ohne Actor-Zuweisung zu funktionieren.

trotzdem vielen Dank;)
 
@ Kahmul: Auch das funktioniert leider nicht:

PlayMagicShaderVisuals erfordert ebenfalls eine Referenz - was ich vermeiden will -
und getcontainer verursacht diese Fehlermeldung, wenn ich das Script abspeichern will:

Code:
Syntas error. Invalid reference 'getcontainer' (only object references and reference variables are allowed in this context).
 
Ich bin Oblivions Skriptsprache nicht mehr gewohnt. Ich habe vergessen, dass man keine Befehle an andere koppeln kann. Du musst den Wert von getcontainer in einer Variable speichern.

Code:
ref container
set container to getcontainer
container.AddSpell <Spell>

Außerdem kenne ich keinen Grund der gegen Referenzen spricht, Du kommst sowieso nicht um sie rum. Wie Du siehst brauchst sie auch hier.
 
  • Like
Reaktionen: dark_ossi
Code:
scn

Begin onHit
 ResetHealth
End

Begin OnMagicEffectHit
 ResetHealth
End

Das aufn NPC.

Und im Skript vom Zauber
Code:
scn ...
Ref Target

Begin ScriptEffectStarted
Set Target To GetSelf
If ( Target.IsActionRef <ActorREF> == 1 )
Target.Kill
Endif
End

Hallo, der erste Teil funzt einwandfrei. Aber der zweite Teil will einfach nicht klappen.

Gibt es einen Fehler in dem Script?
(ActorREF setze ich richtig ein, also nicht den der generellen Figur.
Habe Zauber und Waffe angelegt - kein Unterschied)

Einzigste Änderung habe "Begin ScriptEffectStart" eingesetzt.
 
Kann mir bitte jemand diesen Script verändern, dass er immer Funktioniert?
Es ist der Script wo man nochmal die Rasse, Klasse und das Sternzeichen ändern kann.

scn CGSewerExitScript

short button

begin OnActivate

if IsActionRef player == 1 && getstagedone MQ01 88 == 0
player.scaonactor
messagebox "Bevor Ihr die Abwasserkanäle verlasst, könnt Ihr euren Charakter überprüfen.", "Rasse auswählen", "Sternzeichen auswählen", "Klasse auswählen", "Zum Ausgang der Abwasserkanäle"
else
if IsActionRef player == 1
player.scaonactor
endif
Activate
endif

end

begin gamemode

;if button > 0 && button < 4
; set button to -1
; forceweather clear
; activate player 1
; return
;endif

set button to getbuttonpressed
if button > -1
if charactergen.debug == 1
message "Button = %.0f", button
endif

if button == 3
; exit sewers
setstage MQ01 88
activate player
elseif button == 0
showracemenu
player.moveto CGSewerExitMarker
elseif button == 1
showbirthsignmenu
elseif button == 2
showclassmenu
endif

; nice starry/sunny sky
forceweather clear
; just in case
player.setcrimegold 0

; regenerate rat
if CGRegenerat.getdead == 1
CGRegenerat.resurrect
endif

endif

end
 
Nimm einfach
PHP:
 && getstagedone MQ01 88 == 0
in Zeile 7 raus. Dann kannst Du das Skript auf ein aktivierbares Objekt deiner Wahl legen und es sollte funktionieren, auch wenn Du schon Teile der MainQuest (= MQ) erledigt hast.
 
Beachte ich hier irgendetwas Wichtiges bei derm Abspielen von Sounds nicht?

PHP:
scn aaDROrd0HQ06KellerHornBlowController

Short Once
Float Timer

Begin GameMode
If ( aaDROrd006.KellerHornBlow == 1 ) && ( Once == 0 )
	Set Once To 1
	PrintToConsole "Calenad - Kerkerdebug - Once == %.0f" Once
	Set Timer To ( 15 )
	PrintToConsole "Calenad - Kerkerdebug - Timer == %.0f" Timer
Elseif ( Once == 1 )
	If ( Timer > 0 )
		Set Timer To ( Timer - GetSecondsPassed )
	Else
		Set Once To 2
		PrintToConsole "Calenad - Kerkerdebug - Once == %.0f" Once
	Endif
Elseif ( Once == 2 )
	Set Once To 3
	PrintToConsole "Calenad - Kerkerdebug - Once == %.0f" Once
	Set aaDROrd006.KellerHornBlow To 2
	Player.PlaySound SPLAlterationCast
	SetStage aaDROrd006 35
	EnablePlayerControls
Endif
End

Alles bei dem Part, wo aaDROrd006 auf 35 gesetzt wird, funktioniert nur das Abspielen des Testsounds SPLAlternationCast (ein vanillasound!!) funktioniert nicht. Muss ich da was Besonderes beachten??
 
Vielleicht verträgt sich "playSound" nicht mit einer Referenz davor. Die Referenz ist ja ohnehin überflüssig, da es ja ohne hörbarer Quelle abgespielt wird, anders als "playSound3D".
 
Wird durch das SetStage nach dem PlaySound eine Quest-Messagebox der Stage 35 angezeigt? Vielleicht blockiert das in irgendeiner Weise den Sound. Setze den PlaySound-Befehl mal nach SetStage.
 
  • Like
Reaktionen: TheDarkRuler
Hab ein Problem.
Ich habe einen Skript, welcher eine Bärenfalle auslösen soll.
Leider macht die Falle keinen Schaden! Was muss ich ändern?
PHP:
scn aaDROrd0ObjektSkriptBaerenfalle

Short Once
Ref Target

;Fallenvariablen
;==================
float fTrapDamage
float fLevelledDamage
float fTrapPushBack
float fTrapMinVelocity
float fTrapDeathPushBack
short bTrapContinuous

Begin onTriggerActor
If ( Once == 0 )
	Set Once To 1
	Set Target To getActionRef
	PlayGroup Forward 0

	set fTrapDamage to 250
	set fTrapPushBack to 100
	set fLevelledDamage to 1.5
	set fTrapDeathPushBack to 80
	set fTrapMinVelocity to 100
	set bTrapContinuous to 0	
Endif
End

Begin GameMode
If ( Once == 0 )
	Return
Elseif ( Once == 1 ) && ( IsAnimPlaying == 0 )
	Set Once To 2	
Endif
End

Begin onReset
	Reset3DState
	ResetAllVariables
End

Begin onHit
If ( Once == 0 )
	Set Once To 1
	PlayGroup Forward 0
Endif
End

Begin onActivate
If ( isActionref Player == 1 )
	If ( Once == 0 )
		Set Once To 1
		PlayGroup Forward 0
	Endif
Endif
End
 
Hat die Falle denn eine korrekte Kollision? Wenn man sich die Kollision anderer Fallen im CS ansieht (Tastenkürzel w glaube ich), kann man rote Linien sehen; etwas, das anscheinend nur Fallen haben... Aber damit kenne ich mich nicht gut aus.
 
Moin moin,

ich arbeite gerade an einem Script welches nach dem Betreten einer Triggerbox ein Video abspielen und den Spieler anschließend zu einem bestimmten Objekt teleportieren soll. Am Zielort befindet sich in der Nähe eine Trigger-Box mit dem gleichen Script, nur das abzuspielende Video und der Zielort unterscheiden sich darin, diesmal handelt es sich nämlich um ein Objekt in der Nähe der ersten Triggerbox. Dadurch soll man zwischen diesen beiden Orten Hin und Her reisen können.


Hier die Scripte:

PHP:
scn Bla01Script

short state

begin ontrigger player
    if state == 0
        playbink "Blablabla/Bla01.bik"
        set state to 1
    endif
end

begin gamemode
    if state == 0
        return
    elseif state == 1
        set state to 0
        player.moveto BlaRef01
    endif
end

PHP:
scn Bla02Script

short state

begin ontrigger player
    if state == 0
        playbink "Blablabla/Bla02.bik"
        set state to 1
    endif
end

begin gamemode
    if state == 0
        return
    elseif state == 1
        set state to 0
        player.moveto BlaRef02
    endif
end

Nun zu meinem Problem: Beim ersten Teleport funktioniert alles wie gewünscht, das Video wird abgespielt und der Spieler zum Objekt bewegt. Wenn man nun aber den Weg zurück antritt wird das Video abgespielt, der Spieler teleportiert, doch dann sofort wieder das erste Video abgespielt und der Spieler erneut bewegt. Das geht dann in einer Endlosschleife immer so weiter, die Videos werden nacheinander abgespielt und der Spieler wird teleportiert, ohne eine Chance zu haben sich zu bewegen.

Der jeweilige XMarker befindet sich nicht in der Triggerbox.


Weiss jemand Rat?


Mit freundlichen Grüßen,
Finkreghan
 
Versuch mal, einfach zusätzliche Frames zwischen den Aktionen vergehen zu lassen. Möglicherweise aktualisiert die Engine die Kollision nicht schnell genug (findet beim Teleport ein Zellenwechsel statt?). In etwa so:
Code:
scn name

short state

Begin onTrigger player

if state == 0
  set state to 1
  playBink "Bla"
  return
endif

end


Begin GameMode

if state == 0
  return
elseif state == 1
  set state to 2
  player.moveTo "Ziel-Ref"
elseif state == 2
  set state to 0
endif

end
 
  • Like
Reaktionen: TheDarkRuler