Construction Set Skriptthread zum Construction Set

Ich habe im Bereich
Begin onTriggerActor Player "Playsound DRSStoneOpen" eingegeben

An sich sollte es dann funktionieren.

Vielleicht willst du es so mal versuchen.
PHP:
scn MeclatonsTriggerPortScript

short once

Begin onTriggerActor Player
    If(once == 0)
        set once to 1
		Playsound DRSStoneOpen
    Endif
End

Begin GameMode
    If(once == 1)
        set once to 2
        Player.moveto <MeclatonsXMarker>
	ElseIf(once == 2)
        set once to 0
    EndIf
End

MfG Master of Worlds
 
  • Like
Reaktionen: Meclaton
Bei einer wechselseitigen Unterhaltung zwischen zwei NPC kannst Du auch einfach die Conversation-Topics im CS verlinken. Dann braucht dein Skript nur noch NPC1Ref.SayTo NPC2Ref ErstesTopic um das Gespräch zu starten, der Rest funktioniert automatisch.


Das hört sich gut an. Aber es ist keine wechselseitige Unterhaltung, die mir in meiner Quest vorschwebt. NPC1 hat nur ein Greeting, das aus mehreren Zeilen besteht. Dieses muss er zu NPC2 sagen, der nur zuhören soll.
Dieses Greeting steht wie gewöhnlich unter dem Topic-Flag.
Was du vorschlägst muss, wenn ich das richtig verstanden habe, beim Conversation-Flag eingearbeitet werden.
Gibt es denn keine Möglichkeit, NPC1 nur ein Greeting aufsagen zu lassen?
 
Ich probiers mal. Danke.

Hallo, der Test hat ergeben, daß es auch mit dieser Einstellung erst nach dem zweiten Durchlauf des Triggers der Sound abgespielt wird.

Gibt es noch eine andere Möglichkeit?

Danke
 
Zuletzt bearbeitet:
@Meclaton
Komisch. Ich würde wohl entweder versuchen einen komplett eigenen Trigger für den Sound zu nehmen oder es weiter stufenweise zu machen. Die Variablen würde ich vielleicht so anpassen, dass man erst einmal als Initialisierungsvorgang eintreten muss.

Hast du mal versucht einfach eine zweite PlaySound-Zeile einzufügen? Geht es immer wirklich erst bei dem zweiten Durchlauf? Was ist, wenn du einen Trigger erstellst, der wirklich nur einen Sound abspielen soll, funktioniert dieser korrekt oder ebenso nicht?

MfG Master of Worlds
 
  • Like
Reaktionen: Meclaton
Ich würde alles in den GameMode verlagern und im OnTrigger nur eine Variable hochsetzen. Im GameMode als erstes PlaySound, dann einen Timer mit der Soundlänge und nach dessen Ablauf das MoveTo. Dann sind MoveTo und Playsound zeitlich getrennt und der Sound wird dann auch immer abgespielt.
 
  • Like
Reaktionen: Meclaton
@Meclaton
Komisch. Ich würde wohl entweder versuchen einen komplett eigenen Trigger für den Sound zu nehmen oder es weiter stufenweise zu machen. Die Variablen würde ich vielleicht so anpassen, dass man erst einmal als Initialisierungsvorgang eintreten muss.

Hast du mal versucht einfach eine zweite PlaySound-Zeile einzufügen? Geht es immer wirklich erst bei dem zweiten Durchlauf? Was ist, wenn du einen Trigger erstellst, der wirklich nur einen Sound abspielen soll, funktioniert dieser korrekt oder ebenso nicht?

MfG Master of Worlds

Hi, ein Trigger der nur Sound abspielen soll funktioniert einwandfrei in dieser Zelle.
(Eigentlich wollte ich gerade schreiben, daß es möglicherweise damit zusammenhängt, daß ich mit dem Trigger auch gleichzeitig diese Zelle verlasse. Aber dann dürfte es ja eigentlich nie funktionieren!?)

Ich probiere einmal einen zweiten Trigger an diese Stelle zu platzieren. Das habe ich noch nie gemacht, daß sich zwei Trigger überschneiden, ich hoffe es kommt hier nicht zu Problemen.

Melde mich wieder - und wieder vielen Dank für's helfen.
 
Ich würde alles in den GameMode verlagern und im OnTrigger nur eine Variable hochsetzen. Im GameMode als erstes PlaySound, dann einen Timer mit der Soundlänge und nach dessen Ablauf das MoveTo. Dann sind MoveTo und Playsound zeitlich getrennt und der Sound wird dann auch immer abgespielt.

Danke werde ich auch einmal ausprobieren
 
Ich würde es wie Beolo machen.
Der OnTrigger-Block reagiert oft seltsam, wenn im gleichen Frame eine Aktion stattfindet. Bei SetStage macht das nichts, aber MoveTo solltest Du eher in den GameMode-Block verfrachten. Öhm ja, Beolo hat ja eigentlich schon alles gesagt. :)
 
  • Like
Reaktionen: Meclaton
Hi, mal wieder eine Frage an die Fachleute:

wie muß ein Skript aussehen der folgendes steuert:

NPC soll bei erreichen von nur noch 20% Lebenspunkte disablen (würde ich in einem Interior ablegen und ein Restore auf Health machen)

Nach 20 Sekunden soll er wieder hinter dem Player auftauchen (erneuter Kampf bis 20%)

Diesen Ablauf am besten noch ein oder zweimal wiederholen, bis er beim letzten Durchlauf komplett besiegt werden kann.


Schon einmal ein Danke für die Hilfe
 
Dafür braucht es eigentlich nur ein Skript auf dem NPC:
Code:
scn name

short count
short once
short disabled
short sign
long bHealth
float ang
float ang2
float timer

Begin GameMode

if once == 0
  set once to 1
  set bHealth to getBaseAV health
endif

if disabled
  if timer < 20
    set timer to timer + getSecondsPassed
    return
  else
    set disabled to 0
    set timer to 0
    enable

    set sign to 1
    set ang to player.getAngle z
    if ang > 270
        set ang to ang - 360
    elseif ang > 90
        set ang to ang - 180
        set sign to -1
    endif
    set ang to 0.017453*ang 
    set ang2 to ang * ang
    set sin to  sign * ( ang * ( 0.99972 + ang2 * ( -0.16567 + 0.007502 * ang2 ) ) )
    set cos to sign * ( 1 + ang2 * ( -0.499932 + ang2 * ( 0.0415 + -0.001273 * ang2 ) ) )

    set xpos to -200*cos  ;ungefähr drei Meter hinter dem Spieler
    set ypos to -200*sin
    moveTo player xpos, ypos, 0
  endif
else
  if count < 3
    if getAV health < 0.2 * bHealth
      restoreHealth
      disable
      set disabled to 1
      set count to count + 1
    endif
  endif
endif

end

Dieses Skript funktioniert aber nicht unbedingt, wenn der Spieler es schafft, dem NPC mit einem Schlag mehr als 20% seiner HP abzuziehen, dann wäre da noch sehr viel mehr nötig (mit OBSE).
Mit OBSE könnte man das Skript im Übrigen auch sehr viel kürzer fassen, dann entfällt nämlich die Polynomapproximation für Sinus und Cosinus. Für deine Zwecke könntest du möglicherweise auch die letzten Potenzen in den Approximationen weglassen, es muss ja nicht so genau sein.
Was passiert, wenn hinter dem Spieler nicht genug Platz ist, ist wahrscheinlich dem Zufall überlassen.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Meclaton
Wir haben bei uns das Problem, dass der Fallschirmskript hier seltsamerweise funktioniert, sobald er in einer ESP steckt. Sobald wir den Skript aber in unsere ESM reinmergen, funktioniert es nicht mehr. Weiß jemand woran es liegen könnte?
PHP:
scn aaaSOFParachute3ProbeSCRIPT

;====================================
; General Parameters - change to fine tuning
;====================================
short xParmFallDetectionSensibility
short xParmEndOfFallDetectionSensibility
short xParmProbeFrames
float xParmSpeed 
float xParmVerticalViewAngleMin
float xParmVerticalViewAngleMax
float xParmVRZdif
;====================================

ref xParachute
ref xParachuteOpen

ref xProbe
ref xVR

short xTurn
short xGroundIsNear
short xEquiped
short xViewOK
short xFCount
short xGoingUpCount

float xDistance 
float xAngle
float xSecondsPassed
float xxTrigAngle 
float xSpeed
float xHorDist 

Float xPosXplayer
Float xPosYplayer
Float xPosZplayer

float xAngleXplayer 
float xAngleZplayer  

Float xPosX
Float xPosY
Float xPosZ

Float xPosZlow

Float xPosXprev
Float xPosYprev 
Float xPosZprev

Float xPosXnext
Float xPosYnext
Float xPosZnext

Float xDeltaXplayer
Float xDeltaYplayer
Float xDeltaZplayer

;Float xDeltaX
;Float xDeltaY
Float xDeltaZ

float xFall

;float Osin
;float Ocos
float Xang 
float Xrad 
float Xexp 
float Xsin 
float Xcos 

short xCount

begin gamemode
	if getcontainer != Player
		return
	endif

	if xProbe == 0
		;set xVR to aaaVRinVSoF
		;set xProbe to aaaProbeSoF

		;====================================
		; General Parameters - change to fine tuning
		;====================================
		set xParmFallDetectionSensibility to 2		; Number of falling frames until opening parachute
		set xParmEndOfFallDetectionSensibility to 2	; Number of up frames until removing
		set xParmProbeFrames to 3
		set xParmSpeed to 320					; Parachute speed in units/sec
		set xParmVerticalViewAngleMin to 20			; Min limit to player view movement while parachute equipped
		set xParmVerticalViewAngleMax to 60			; Max  ...
		set xParmVRZdif to  -1.25 				; Z difference between the center of the Virtual Road and the player 

		set xParachute to aaaParachute3ClosedBase
		set xParachuteOpen to aaaParachute3OpenBase

	endif


	if xEquiped == 0
		if  Player.getEquipped xParachute 

			;=================================
			;	Fall detection
			;=================================
			if xPosZprev == 0
				set xPosZprev to player.getpos Z
				return
			endif
			set xPosXplayer to Player.getpos X 
			set xPosYplayer to Player.getpos Y
			set xPosZplayer to Player.getpos Z
			set xDeltaZ to xPosZplayer - xPosZprev 
			set xSpeed to xDeltaZ / GetSecondsPassed 
			set xPosZprev to xPosZplayer 

			if xSpeed < -500 
				set xFCount to xFCount + 1		; Count frames falling
			else
				set xFCount to 0					; Reset frames falling
			endif

			if xFCount >= xParmFallDetectionSensibility 
				;=================================
				;	Initialize parachute - Reset variables
				;=================================
				set xEquiped to 1
				
				Message " " 
				Message " " 
				player.additem xParachuteOpen 1
				Message " " 
				Message " " 
				player.equipitem xParachuteOpen 

				xProbe.moveto player 100 100 -100
	
				set xTurn to 0
				set xViewOK to 0
				set xFCount to 0
				set xGoingUpCount  to 0
				set xPosZlow to player.getpos Z

				if player.getlos xProbe  == 0 ||  xProbe.getinsamecell player != 1
					xProbe.disable
					xProbe.MoveTo player 0 0 -100 
				endif

				if xVR.getinsamecell player != 1
					xVR.disable
					xVR.MoveTo player 0 0 xParmVRZdif 
				endif      

				DisablePlayerControls
				playGroup JumpLoop 1
			endif
		endif

	else
		set xTurn to xTurn + 1
		set xSecondsPassed to GetSecondsPassed 

		if xProbe.getdisabled
			xProbe.enable
			set xPosZ to player.getpos Z - 10
			xProbe.setpos Z xPosZ
		endif

		;=== Make sure the Virtial Road didn't stay behind when entering new cells ===
		if xVR.getinsamecell player != 1 || xVR.getdisabled
			xVR.enable
			xVR.MoveTo player 0 0 xParmVRZdif 
			xVR.setangle Y 90
		endif      

		set xPosXplayer to Player.getpos X 
		set xPosYplayer to Player.getpos Y
		set xPosZplayer to Player.getpos Z
		set xAngleZplayer  to player.getangle Z 
		set xAngleXplayer  to player.getangle X

		;=================================
		;	Limit player vertical view
		;=================================
		if xAngleXplayer < xParmVerticalViewAngleMin
			player.setangle X xParmVerticalViewAngleMin
			set xAngleXplayer to xParmVerticalViewAngleMin
		elseif xAngleXplayer > xParmVerticalViewAngleMax
			player.setangle X xParmVerticalViewAngleMax
			set xAngleXplayer to xParmVerticalViewAngleMax
		endif

		;=================================
		;	Detect end of fall
		;=================================
		set xFall to 	xPosZplayer - xPosZprev 
		if xTurn > 8 &&  xFall  >= 0
			set xGoingUpCount to xGoingUpCount + 1
		else
			set xGoingUpCount to 0
		endif

		if xGoingUpCount > xParmEndOfFallDetectionSensibility  

			set xEquiped to 0
			set xPosZprev to 0

			xVR.positioncell 0 0 0 0 TestingHall 
			xProbe.positioncell 0 0 0 0 TestingHall 

			Message " " 
			Message " " 
			player.equipitem xParachute
			Message " " 
			Message " " 
			player.removeitem xParachuteOpen 1

		;	player.resetHealth	;	$$$$$$$$$$ TEST ONLY $$$$$$$$$$$$

			enablePlayerControls
			player.playgroup jumpland 1

			return
		endif


		;=================================
		;	Calc next player position
		;=================================
		set xAngle to Player.getangle Z
		if  xAngle <= 90
			 set xxTrigAngle  to 90 - xAngle
		else
			set xxTrigAngle to 450 - xAngle
		endif 

		set xDistance to  xParmSpeed * xSecondsPassed 

		set Xang to xAngleXplayer 
		if Xang < -180
			 set Xang to ( Xang + 360 ) 
		elseif Xang > 180
			set Xang to Xang - 360
		endif
		set Xrad to ( Xang * 0.0174533 )
		set Xcos to 1
		set Xexp to Xrad                          ; 1st
		set Xsin to Xexp
		set Xexp to ( Xexp * Xrad )           ; 2nd
		set Xcos to ( Xcos - Xexp / 2 )
		set Xexp to ( Xexp * Xrad )           ; 3rd
		set Xsin to ( Xsin - Xexp / 6 )
		set Xexp to ( Xexp * Xrad )           ; 4th
		set Xcos to ( Xcos + Xexp / 24 )
		set Xexp to ( Xexp * Xrad )           ; 5th
		set Xsin to ( Xsin + Xexp / 120 )
		set Xexp to ( Xexp * Xrad )           ; 6th
		set Xcos to ( Xcos - Xexp / 720 )
		set Xexp to ( Xexp * Xrad )           ; 7th
		set Xsin to ( Xsin - Xexp / 5040 )
		set Xexp to ( Xexp * Xrad )           ; 8th
		set Xcos to ( Xcos + Xexp / 40320 )
		set Xexp to ( Xexp * Xrad )           ; 9th
		set Xsin to ( Xsin + Xexp / 362880 )

		set xDeltaZplayer to xDistance * Xsin 
		set xHorDist to  xDistance * Xcos


		set Xang to xxTrigAngle 
		if Xang < -180
			 set Xang to ( Xang + 360 ) 
		elseif Xang > 180
			set Xang to Xang - 360
		endif
		set Xrad to ( Xang * 0.0174533 )
		set Xcos to 1
		set Xexp to Xrad                          ; 1st
		set Xsin to Xexp
		set Xexp to ( Xexp * Xrad )           ; 2nd
		set Xcos to ( Xcos - Xexp / 2 )
		set Xexp to ( Xexp * Xrad )           ; 3rd
		set Xsin to ( Xsin - Xexp / 6 )
		set Xexp to ( Xexp * Xrad )           ; 4th
		set Xcos to ( Xcos + Xexp / 24 )
		set Xexp to ( Xexp * Xrad )           ; 5th
		set Xsin to ( Xsin + Xexp / 120 )
		set Xexp to ( Xexp * Xrad )           ; 6th
		set Xcos to ( Xcos - Xexp / 720 )
		set Xexp to ( Xexp * Xrad )           ; 7th
		set Xsin to ( Xsin - Xexp / 5040 )
		set Xexp to ( Xexp * Xrad )           ; 8th
		set Xcos to ( Xcos + Xexp / 40320 )
		set Xexp to ( Xexp * Xrad )           ; 9th
		set Xsin to ( Xsin + Xexp / 362880 )

		set xDeltaXplayer to xHorDist * Xcos
		set xDeltaYplayer to xHorDist * Xsin

		set xPosXnext to xPosXplayer + xDeltaXplayer
		set xPosYnext to xPosYplayer + xDeltaYplayer
		set xPosZnext to xPosZplayer - xDeltaZplayer

		;=======================================================
		;=== Probes ahead to detect ground level      ===
		;=======================================================
		set xGroundIsNear to 0
		set xCount to 0

		xProbe.moveto player 

		set xCount to 125 / xDeltaZplayer  + xParmProbeFrames

		set xPosX to xPosXplayer + ( xDeltaXplayer * xCount ) / 2
		set xPosY to xPosYplayer + ( xDeltaYplayer * xCount ) / 2
		set xPosZ to xPosZplayer - xDeltaZplayer * xCount + 125
		xProbe.setpos X xPosX	
		xProbe.setpos Y xPosY
		xProbe.setpos Z xPosZ	

		if player.getlos xProbe == 0
			set xGroundIsNear to 1
		else
			set xGroundIsNear to 0
		endif

		;========================
		;=== Position Virtual Road ===
		;========================
		if xGroundIsNear 
			xVR.setpos Z 0
		else
			if xPosZnext >= xPosZlow
				xVR.setpos X xPosXnext
				xVR.setpos Y xPosYnext
				xVR.setpos Z xPosZlow

				player.setpos X xPosXnext
				player.setpos Y xPosYnext

			else
				xVR.setpos X xPosXnext
				xVR.setpos Y xPosYnext
				set xPosZ to xPosZnext + xParmVRZdif 
				xVR.setpos Z xPosZ

				player.setpos X xPosXnext
				player.setpos Y xPosYnext
				Player.setpos Z xPosZnext

				set xPosZlow to xPosZnext
			endif
		endif

		player.ResetFallDamageTimer

		;=================================
		;	Save player position
		;=================================
		set xPosXprev to xPosXplayer
		set xPosYprev to xPosYplayer
		set xPosZprev to xPosZplayer

	endif
end
 
Wenn das Script in einer esp funktioniert, muss es auch in einer esm funktionieren.

Der Grund warum euer Script trotzdem nicht funktioniert ist wahrscheinlich der, dass das Script auf Referenzen oder Base-objects zugreift, die es in der esm nicht gibt.
 
Hallo,

Könnt ihr für mich ein script für ein Zauber machen?
Er soll bewirken, dass man ein Spriggan beschwören kann.
 
Ich würd sagen da wär es am einfachsten analog der existierenden Beschwörungszauber erst mal einen solchen Zauber zu erstellen und den dann einem der Zauberverkäufer in den Magiergilden in die Spell List zu packen. Dann kannst du den Zauber auf üblichem Weg erwerben ohne ein Script anfassen zu müssen.

Wie willst du den Zauber verwenden? Beim aktivieren eines Gegenstandes, direkt dem Spieler ins Zauberbuch schreiben gleich bei Spielbeginn, irgendwas anderes?

Anmerkung am Rande: Was du auf jeden Fall aber (m.E.) als Ausgangspunkt brauchen wirst ist ein Duplikat des 08/15 Spriggan mit neuer ID und keiner Fraktionszugehörigkeit. Wenn du den standard Spriggan beschwörst wird der eher auf deinen Char als auf die Feinde losgehen.
 
Also den Zauber wollte ich so verwenden, wie man auch die anderen verwendet.
Das man ein neuen Spriggan erstellen muss weiß ich, dass wurde auch schon bereits getan.
Mir fehlt nur noch ein Script um es mit ein Zauber beschwören zu können.
 
Bin zwar etwas eingerostet, aber soltle denke ich funktionieren. Setze dir den Spriggan in die Spielwelt (am besten einfach eine leere Celle erstellen) und gib ihm die Reference "MeinSpriggan01". Ein Scripteffect-Zauber mit diesem Script sollte dann genügen:

Code:
scn MeinSprigganZauberScript

begin scritpeffectstart
MeinSpriggan01.enable
MeinSpriggan01.resurrect
MeinSpriggan01.pme  ZDRE ;ZDRE steht für den visuellen Effekt von "Dremora beschwören. Du  kannst dir aber auch die Magic Effect ID eines anderen Zaubers  raussuchen udn dessen 4 Buchstaben benutzen
MeinSpriggan01.moveto player
end

begin scripteffectfinish
MeinSpriggan01.kill
MeinSpriggan01.disable
end

Edit: Du wirst ein Follow-Package brauchen, damit der Spriggan nicht an der Stelle stehenbleibt, an der du ihn beschwörst. Es wäre also sinnvoll, den Spriggan als "initially disabled" zu markieren, sonst kann es sein, dass er z.B. nach einer Schnellreise plötzlich neben dir steht, ohne dass du ihn beschworen hast. Damit der Zauber endet, sobald dein Spriggan stirbt, gib dem Monster am besten noch dieses Script
Code:
scn MeinSprigganScript

begin ondeath
player.dispel ZAUBER-ID
end
 
Zuletzt bearbeitet:
Hiho scharesoft com.

Ich würde gern für Oblivion Scripten, da ich einige sachen gerne an Oblivion ändern möchte bevor ich es mal wieder Spiele.
Ich habe mir auch ein paar script tutorials angesehen, leider hat das aber woll nicht gereicht damit ich das ändern kann was ich gerne würde.
(Oder ich bin schwer von kappe! :oops: )
Von daher hoffe ich hier auf hilfe. (Und das ich hoffentlich kein zu schwieriger schüler bin! :oops: )

Ich möchte nämlich gerne:

Das ich wärend des Laufen langsam Ausdauer verliere! (da mit es sich auch lohnt ein pferd zu besorgen)
Zudem soll sich die Ausdauer beim Gehen nur sehr leicht regenerieren und sogar beim "Stehen bleiben" wird die erholung nur leicht erhöht.
Wenn man möchte das sich die Ausdauer schnell erholt muss man sich Hinsetzen!
Zudem, wenn man mehr Sachen aufgesammelt hat als man eigentlich tragen darf kann man nur noch gehen, allerdings verliert man
dann sogar beim gehen Ausdauer, und je mahr sachen man aufsammelt desto schneller verliert man sie.
Wenn man keine Ausdauer mehr hat bleibt der char stehen und man muss ein paar sekunden warten bevor sich wieder anfängt
die Ausdauer langsam zu erholen.

Ich hoffe ich habe alles verständlich erklärt.

Ach könnt ihr mir dann vielleicht noch sagen wo ich denn "Block" script finde?
Denn daran möchte ich auch was ändern. Und an der Originalen wollte ich mich "Orientieren", nur find ich denn irgentwie nicht. :(

Hoffe ich gehe niemandem mit meinen fragen auf denn senkel. :)

In Voller Hoffnung: Lk
 
Hallo zusammen.
http://cs.elderscrolls.com/index.php?title=OnStartCombat
Hier steht...
Code:
begin OnStartCombat TargetActorRefID
Gibt es eine Möglichkeit, die TargetActorRefID herauszufinden, die gerade mit einem NSC kämpfen will, auf dem dieser Begin onStartCombat-Block liegt?

Ich würde nämlich gerne etwas tun.
In diesem Schema.
Code:
scn xxx

Begin onStartCombat
If ( Bedingung erfüllt )
 TargetRef.StopCombat
 SetAv Aggression 0
Endif
End