Construction Set Skriptthread zum Construction Set

Ich hab schon wieder Probleme:

Code:
if Player.GetEquipped WeapSteelLongsword 1
Messagebox "Du hast ne Luschenwaffe!!!"

Die Funktion "GetEquipped [Item-ID]" fragt doch ab, ob dieses Item equipped ist, richtig? Das heißt, dass bei dem oben geschrieben Scriptteil die Messagebox nur ausgegeben wird, wenn der Player ein Stahl-Langschwert ausgerüstet hat. Stimmt das so oder hab ich irgendetwas falsch verstanden?

Und wenn man die 1 durch eine 0 ersetzt, wird sie nur ausgegeben, wenn der Player KEIN Stahl-Langschwert ausgerüstet hat, oder?
 
Ich hab schon wieder Probleme:

Code:
if Player.GetEquipped WeapSteelLongsword 1
Messagebox "Du hast ne Luschenwaffe!!!"

Die Funktion "GetEquipped [Item-ID]" fragt doch ab, ob dieses Item equipped ist, richtig? Das heißt, dass bei dem oben geschrieben Scriptteil die Messagebox nur ausgegeben wird, wenn der Player ein Stahl-Langschwert ausgerüstet hat. Stimmt das so oder hab ich irgendetwas falsch verstanden?

Und wenn man die 1 durch eine 0 ersetzt, wird sie nur ausgegeben, wenn der Player KEIN Stahl-Langschwert ausgerüstet hat, oder?

hmm, und ohne 1 oder 0? soweit ich das richtig deute, ist die 1 nur der rückgabewert (also TRUE oder FALSE)
 
Slo wird die Messagebox nur eintreten, wenn ich überhaupt keine zahl dahinter setzte? Oder wie darf man das verstehen?

genau, die 1 dahinter bringt die if-funktion wohl durcheinander.

der befehl Player.GetEquipped WeapSteelLongsword gibt den wert 1 zurück, wenn der spieler diese waffe trägt, ansonsten wohl eine 0.

mit dem if-befehl prüft man nun einfach, ob dieser wert auf 1 ist, oder nicht.

if Player.GetEquipped WeapSteelLongsword == 1

das ist die "korrekte" schreibweise. eine besonderheit des if-befehls ist halt, wenn man eh nur auf den wert 1 oder 0 prüft (bzw. 0 oder nicht 0), kann man das == 1 einfach weglassen. also geht das genauso:

if Player.GetEquipped WeapSteelLongsword

If a variable or the result of a function returns 1 or 0, or you're just interested in whether the result is 0 or not you don't need to test on "== 1" or "!=0"
Code:
IF Done
IF Getisid MyNPC
IF Getitemcount Lockpick
IF IsActor && Flag

Do the same as
Code:
IF Done != 0
IF Getisid MyNPC != 0
IF Getitemcount Lockpick != 0
IF IsActor != 0 && Flag != 0

siehe: http://cs.elderscrolls.com/constwiki/index.php/If#Comparisons_and_Expressions
 
  • Like
Reaktionen: Blacklands
@Nabborad

Danke. Ich hätte nicht gedacht, dass eine einzige 1 so viele Fehler auslösen kann. Aber du hattest recht, ohne die 1 geht das Script. :-D

@All

Ich hab da noch eine Frage: Gibt es so eine Art "Zeitlupen-Disable"?
Also beim normalen Disable sind die Objekte ja sofort weg. Kann man das auch irgendwie so machen, dass das Objekt ganz langsam disables wird also so langsam verblasst und sich dann langsam(!!!) auflöst?

Wenn schon nicht per Scriptbefehl, vielleicht mit einem Magiceefect? Oder etwas vergleichbares? as normale Disable ist einfach langweilig...
 
Nein.

Aber du könntest villeicht erst den Geisteffekt drauflegen, oder schön mit einem Blitzdraufschießen, damit es aussieht, als wäre es pulverisiert worden.
 
  • Like
Reaktionen: Blacklands
Ich hab da noch eine Frage: Gibt es so eine Art "Zeitlupen-Disable"?
Also beim normalen Disable sind die Objekte ja sofort weg. Kann man das auch irgendwie so machen, dass das Objekt ganz langsam disables wird also so langsam verblasst und sich dann langsam(!!!) auflöst?

Wenn schon nicht per Scriptbefehl, vielleicht mit einem Magiceefect? Oder etwas vergleichbares? as normale Disable ist einfach langweilig...
hmm, du könntest das objekt vielleicht erstmal mit dem befehl SetActorAlpha oder SetActorRefraction nach und nach durchsichtig/unsichtbar machen (keine ahnung, was von beidem besser aussieht), bevor du es dann kompett disablest.
in scriptform also etwa so:

Code:
set timer to timer + getsecondspassed

if timer < 1
 set transp to 1 - timer
 SetActorAlpha transp
else
 disable
endif

damit würde das jeweilige objekt innerhalb von 1 sec durchsichtig und wird danach deaktiviert. möchtest du die zeit ändern, musst du natürlich den timer und das set transp entsprechend anpassen :)

edit:
grad gefunden: Make character disappear

macht im grunde wohl das gleiche :)
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Blacklands
Oh Naboradd was würde ich nur ohne dich machen. Du hast mich schon wieder gerettet, dankedankedanke. :-D

Ich teste beide Varianten dann mal aus. :) *sichandiearbeitmach*
 
vielleicht kannst du mit den Skripts zum Shivering-Isles Zauber "Haskill beschwören" was anfangen (dieser verschwindet langsam, nachdem man ihn beschworen und mit ihm gesprochen hatte).


dieses Skript liegt auf dem Beschwörungszauber:

Code:
scn SESummonHaskillSpellSCRIPT

float timer
short returnEffect		; set to 1 when played
float x
float y
float angle

begin ScriptEffectStart
if ( sehaskillref.summoned == 0 ) && ( GetPlayerinSEWorld == 1 )
	set sehaskillref.summoned to 1
	; move marker to Haskill's current spot
	SEHaskillSummonReturnMarker.moveto SEHaskillRef
	; move Haskill to player
	SEHaskillSummonMarker.moveto player	; get orientation of player
	; when we have math functions, we can do this:
	set angle to player.getangle z
	; set x to 100 * ( cos angle )
	; set y to 100 * ( sin angle )
	; SEHaskillRef.moveto SEHaskillSummonMarker x y 0

	; TEMP: for now, just move on axis based on angle
	if angle <= 45 && angle >= -45
		set y to 150
	elseif angle >= 45 && angle <= 135
		set x to 150
	elseif angle >= 135 && angle <= 225
		set y to -150
	else
		set x to -150
	endif
;	messagebox "TEMP: angle = %.1f, x=%.0f, y=%.0f" angle x y
		
	SEHaskillRef.moveto player x y 0
	SEHaskillRef.look player
	SEHaskillRef.pme STRP
	; Haskill force-greet player
	SEHaskillRef.addscriptpackage SEHaskillSummonForcegreet
	;set variable on Haskill to prevent player from talking to him before he forcegreets
	set SEHaskillRef.greetVAR to 1
	set SEHaskillREF.FadeOnce to 3
elseif ( GetPlayerinSEWorld == 1 )
	Message "Haskill wurde gerade erst herbeibeschworen."
elseif ( GetPlayerinSEWorld == 0 )
	Message "Dieser Zauber kann nur auf den Zitternden Inseln verwendet werden."
	dispel SELpSummonHaskill
endif

end

begin ScriptEffectUpdate
	set timer to timer + ScriptEffectElapsedSeconds
	if returnEffect == 0 && timer > 4.5
		SEHaskillRef.pme STRP
		set returnEffect to 1
	endif
end

begin ScriptEffectFinish
	if ( SEHaskillREF.GetInSameCell Player == 0 ) && ( SEHaskillREF.summoned == 1 )
		set SEHaskillSummonQuest.resetVAR to 1
	endif
	; send Haskill back where he came from
	;SEHaskillRef.pme STRP
	;SEHaskillRef.removescriptpackage
	;SEHaskillRef.stoplook
	;SEHaskillRef.moveto SEHaskillSummonReturnMarker
	;set SEHaskillREF.FadeOnce to 4
	;set SEHaskillRef.greetVAR to 0
end


und dieses auf der dazugehörigen Quest:

Code:
scn SEHaskillSummonQuestScript

;this script keeps the player from breaking the Haskill summon by summoning and quickly fast travelling. With this, resetVAR is set
;in the SESummonHaskillSpellScript on ScriptEffectFinish if the player isn't in the same cell. This script then resets all of Haskill's variable
;as they would be if the player remained in the cell with him and Haskills script were still updating every frame

short resetVAR

Begin GameMode

if ( resetVAR == 1 )
	Set SEHaskillREF.HaskillAlpha to 0
	Set SEHaskillREF.FadeOnce to 2
	Set SEHaskillREF.FadeTimer to 0
	SEHaskillREF.MoveTo SEHaskillSummonReturnMarker
	set SEHaskillREF.resetAlpha to 1
	set SEHaskillREF.summoned to 0
	set SEHaskillREF.summontimer to 0
	set SEHaskillREF.summonblocker to 0
	set resetVAR to 0
endif

End
 
  • Like
Reaktionen: Blacklands
vielleicht kannst du mit den Skripts zum Shivering-Isles Zauber "Haskill beschwören" was anfangen (dieser verschwindet langsam, nachdem man ihn beschworen und mit ihm gesprochen hatte).

guter tip, das mit haskill. allerdings werden in den von dir geqoteten scripts nur ein paar variablen gesetzt, das eigentlich interessante script ist dieses:

Code:
scn SEHaskillScript

short introWho
short introWhat
short introDoor
short introWant
short introPeople
short greetVAR

short leaveVAR
float timer
short doOnce
float fadetimer
float HaskillAlpha
short fadeOnce
short resetAlpha
short summoned
float summontimer
short summonblocker


short tutorialVAR


begin OnLoad
	; Haskill is immune from combat -- he is one weird dude.
	setghost 1

end

;this prevents player from interrupting forcegreet after summon
Begin OnActivate
	if ( greetVAR == 0 )
		Activate
	endif
End

Begin GameMode



;this handles him sitting and getting up in SE01
if ( leaveVAR == 1 ) && ( doOnce == 0 )
	set doOnce to 1
	EVP
endif

;this section makes it appear as if Haskill has activated a door and faded out
if ( leaveVAR == 2 ) && ( fadeOnce == 0 )
	;Disable
	;EnablePlayerControls
	Set HaskillAlpha to .9
	Set FadeTimer to 4
	SetActorAlpha HaskillAlpha
	set fadeOnce to 1
endif

if ( FadeOnce == 1 )
	if ( FadeTimer > 0 )
		Set FadeTimer to ( FadeTimer - GetSecondsPassed )
		Set HaskillAlpha to ( HaskillAlpha - .01 )
		SetActorAlpha HaskillAlpha
	elseif ( FadeTimer <= 0 )
		;sw SEClearTrans
		Set HaskillAlpha to 0
		Set FadeOnce to 2
		Set FadeTimer to 0
		MoveTo SE07AThadonMarker
	endif
endif

;this handles him telling the player to sit in SE01

if ( GetStage SE01Door <= 20 ) && ( player.GetSitting != 3 )
	set timer to ( timer - GetSecondsPassed )
	if ( timer <= -10 )
		set timer to SayTo Player SE01HaskillTalk
	endif
endif

;this chunk fades him out after summon
if ( fadeOnce == 4 )
	;Disable
	;EnablePlayerControls
	Set HaskillAlpha to 0.9
	Set FadeTimer to 4
	SetActorAlpha HaskillAlpha
	set fadeOnce to 5
endif

if ( FadeOnce == 5 )
	if ( FadeTimer > 0 )
		Set FadeTimer to ( FadeTimer - GetSecondsPassed )
		Set HaskillAlpha to ( HaskillAlpha - .01 )
		SetActorAlpha HaskillAlpha
	elseif ( FadeTimer <= 0 )
		Set HaskillAlpha to 0
		Set FadeOnce to 2
		Set FadeTimer to 0
		MoveTo SEHaskillSummonReturnMarker
		set resetAlpha to 1
		set summoned to 0
		set summontimer to 0
		set summonblocker to 0
	endif
endif

if ( resetAlpha == 1 )
	setActorAlpha 1
	set resetAlpha to 0
endif

if ( summoned == 1 )
	set summontimer to ( summontimer + GetSecondsPassed )
	if ( summontimer >= 5 )
		if ( summonblocker == 0 )
			;set summoned to 0
			;set summontimer to 0
			; send Haskill back where he came from
			SEHaskillRef.pme STRP
			SEHaskillRef.removescriptpackage
			SEHaskillRef.stoplook
			;SEHaskillRef.moveto SEHaskillSummonReturnMarker
			set SEHaskillREF.FadeOnce to 4
			set SEHaskillRef.greetVAR to 0
			set summonblocker to 1
		endif
	endif
endif

End

Begin OnPackageDone SE01HaskillLeavePackage

;MessageBox "ONPACKAGEDONE"
set leaveVAR to 2

End

die interessanten stellen sind die "if FadeOnce = ...", und da wird ebenfalls mit SetActorAlpha gearbeitet :)
 
  • Like
Reaktionen: Blacklands
Oha ihr bombardiert mich ja... :lol:
Naja danke für alle Scripts, ich werde sie alle mal austesten. Zuerst mal das Script von deinem Link zu "Make Charakter Disappear".

Dazu habe ich noch zwei Fragen:

1. Das Script sieht nun so aus:

Code:
scn OldHouseCrate02

float timer

Begin OnLoad
           PlayMagicShaderVisuals GhostEffect
end

Begin OnActivate Player
           if Player.GetEquipped WeapIronDaggerQUEST
           IllusionCrate.Disable
           Falltuer.Enable
           endif
End

Begin GameMode
set timer to timer + GetSecondsPassed
  
  	if timer == 1
  		saa 0.45
  	endif
  	if timer == 2
  		saa 0.40
  	endif
  	if timer == 3
  		saa 0.35
  	endif
  	if timer == 4
  		saa 0.30
  	endif
  	if timer == 5
  		saa 0.25
  	endif
  	if timer == 6
  		saa 0.20
  	endif
  	if timer == 7
  		saa 0.15
  	endif
  	if timer == 8
  		saa 0.10
  	endif
  	if timer == 9
  		saa 0.05
  	endif
  	if timer == 10
  		saa 0.0
  	endif
  	if timer == 11       
           disable
     endif
End

Wie mache ich es, dass der Timer erst gestartet wird, wenn der Player die Kiste aktiviert? Denn so ist es ja noch unvollständig und wird gar nicht gehen (bei OnActivate steht ja sogar noch disable :))
Geht das Script überhaupt? Weil eine Kiste ist ja kein Actor.
 
Container sowie auch Türen sind eine Art Activator (der Befehl Begin Onactivate funktioniert auch hier) ;)

edit:

wenn Container und Türen zusätzlich geöffnet werden sollen, muss "activate" als letzter Befehl hinter den anderen Scriptbefehlen stehen
 
Zuletzt bearbeitet:
Wird nicht gehen weil:

Syntax:

SetActorAlpha [0.0 - 1.0]
saa [0.0 - 1.0]
Example:

SetActorAlpha .5

Sets the actor's alpha value (how opaque they are), with 1.0 meaning solid and 0.0 meaning fully transparent.

Notice: Since the Gamebryo-Engine has still problems with soft alpha overlays, this parameter may cause strange effects with alpha masks on textures, e.g. leaving a transparency border around some parts of hair meshes.

Retrieved from "http://cs.elderscrolls.com/constwiki/index.php/SetActorAlpha"
 
1. Das Script sieht nun so aus:

Code:
scn OldHouseCrate02

float timer

Begin OnLoad
           PlayMagicShaderVisuals GhostEffect
end

Begin OnActivate Player
           if Player.GetEquipped WeapIronDaggerQUEST
           IllusionCrate.Disable
           Falltuer.Enable
           endif
End

Begin GameMode
set timer to timer + GetSecondsPassed
  
  	if timer == 1
  		saa 0.45
  	endif
  	if timer == 2
  		saa 0.40
  	endif
  	if timer == 3
  		saa 0.35
  	endif
  	if timer == 4
  		saa 0.30
  	endif
  	if timer == 5
  		saa 0.25
  	endif
  	if timer == 6
  		saa 0.20
  	endif
  	if timer == 7
  		saa 0.15
  	endif
  	if timer == 8
  		saa 0.10
  	endif
  	if timer == 9
  		saa 0.05
  	endif
  	if timer == 10
  		saa 0.0
  	endif
  	if timer == 11       
           disable
     endif
End
sorry, mal ganz dumm gefragt, wie gut kannst du eigentlich englisch? :)
zu diesem script steht nämlich ein kommentar dadrunter, daß das script so garnicht richtig funktionieren kann, weil timer eine float-variable ist, das heißt deren wert ist (so gut wie) nie genau eine bestimmte zahl, sondern ehr sowas wie 3.516214. wenn du jetzt nur mit "if timer == 3" und "if timer == 4" prüfst, wirst du die entsprechenden werte also nie "treffen" ;)

Wie mache ich es, dass der Timer erst gestartet wird, wenn der Player die Kiste aktiviert? Denn so ist es ja noch unvollständig und wird gar nicht gehen (bei OnActivate steht ja sogar noch disable :))
das disable muss da oben dann natürlich raus, statt dessen würd ich da eine "ausblend-aktivierungs-variable" ;) reinsetzen, auf die das script in dem gamemode-block dann anspringt. also in etwa so:

Code:
scn OldHouseCrate02

float CrateTimer
float CrateAlpha
short CrateFade

Begin OnLoad
   PlayMagicShaderVisuals GhostEffect
end

Begin OnActivate Player
   if Player.GetEquipped WeapIronDaggerQUEST
      Set CrateFade to 1
      Falltuer.Enable
   endif
End

Begin GameMode
   if CrateFade == 1
      set CrateTimer to CrateTimer + GetSecondsPassed
      if CrateTimer < 10
         set CrateAlpha to 1 - (CrateTimer/10)
         SetActorAlpha CrateAlpha
      else
         Disable
         SetCrateFade to 0
      endif
   endif
End

wenn das script direkt auf der kiste liegt, müsste das so funktionieren. ansonsten musst du dem SetActorAlpha- und dem Disable-befehl noch das jeweilige objekt voranstellen, also IllusionCrate.SetActorAlpha und IllusionCrate.Disable
 
  • Like
Reaktionen: Blacklands
sorry, mal ganz dumm gefragt, wie gut kannst du eigentlich englisch? :)

Gerade gut genug um die Hälfte von sowas zu verstehen. :roll:

zu diesem script steht nämlich ein kommentar dadrunter, daß das script so garnicht richtig funktionieren kann, weil timer eine float-variable ist, das heißt deren wert ist (so gut wie) nie genau eine bestimmte zahl, sondern ehr sowas wie 3.516214. wenn du jetzt nur mit "if timer == 3" und "if timer == 4" prüfst, wirst du die entsprechenden werte also nie "treffen" ;)

Das stand in der Hälfte, die ich nicht verstanden habe. :(:oops:

das disable muss da oben dann natürlich raus, statt dessen würd ich da eine "ausblend-aktivierungs-variable" ;) reinsetzen, auf die das script in dem gamemode-block dann anspringt. also in etwa so:

Das klingt gut.

Code:
scn OldHouseCrate02

float CrateTimer
float CrateAlpha
short CrateFade

Begin OnLoad
   PlayMagicShaderVisuals GhostEffect
end

Begin OnActivate Player
   if Player.GetEquipped WeapIronDaggerQUEST
      Set CrateFade to 1
      Falltuer.Enable
   endif
End

Begin GameMode
   if CrateFade == 1
      set CrateTimer to CrateTimer + GetSecondsPassed
      if CrateTimer < 10
         set CrateAlpha to 1 - (CrateTimer/10)
         SetActorAlpha CrateAlpha
      else
         Disable
         SetCrateFade to 0
      endif
   endif
End

wenn das script direkt auf der kiste liegt, müsste das so funktionieren. ansonsten musst du dem SetActorAlpha- und dem Disable-befehl noch das jeweilige objekt voranstellen, also IllusionCrate.SetActorAlpha und IllusionCrate.Disable

Alles klar, jetzt habe sogar ich es verstanden. Ich teste es mal aus.