Construction Set Skriptthread zum Construction Set

Habs nochmal im CS-Wiki nachgeguckt und muss den Befehl wohl ein bisschen berichtigen...
Es heißt nämlich:
Code:
GetScriptVariable [COLOR="Red"]<Objekt-REF>[/COLOR], <Variablenname> == x
Also bei Objekt-REF muss das Objekt eingetragen werden, auf dem das Script liegt... Ist zwar nur ne Kleinigkeit, aber um den Fehler auszumerzen...

MfG
 
Eigentlich sollte es mein Geheimnis bleiben... ^^

Nein, es ist eigentlich ziemlich einfach:
Code:
set [ObjektREF].[Variable] to [Wert]
[B];oder[/B]
set [ObjektID].[Variable] to [Wert]

Es geht beides. Dabei müsst ihr aber aufpassen, dass ihr das richtige wählt.
Der erste Scriptbefehl ändert hierbei nur die Variable bei der ausgewählten Referenz. Der zweite Scriptbefehl hingegen ändert die Variable bei allen, in der Welt platzierten Objekten, mit dieser ID.

Ihr könnt mit dieser Syntax, also [ObjektREF].[Variable] bzw. [ObjektID].[Variable] auch genauso gut bestimmte Werte abfragen, übertragen, und damit rechnen.
 
  • Like
Reaktionen: Nathaniel
Hey, das ist doch mal was!

Hab noch ne Frage:
Es gibt ja die Condition:
Code:
if IsActionRef <ObjektRefID> == 0/1
Kann man das auch weniger speziell schreiben, sodass er das nicht nur für bestimmte Actors überprüft, sondern für alle?

MfG
 
Was genau meinst du damit? Normalerweise reicht doch ein BeginOnActivate-Block. Da spielt es ja keine Rolle, wer aktiviert. Das einzige, was man ausschließen könnte, wären Kreaturen:
Code:
scn Scriptname

ref actor

Begin OnActivate
set actor to getactionref
If actor.GetIsCreature == 1
return
Else
;......
Endif
End

Sorry, ich konnte nicht mit Tabs arbeiten. Das sollte dringend eingeführt werden. Stört mich schon ewig.

Gildur
 
Nein, ich möchte ausschließen, dass überhaupt irgendjemand Aktivator sein kann, das Aktivieren soll nur über einen Schalter oder eine Triggerbox funktionieren.
In meinem speziellen Beispiel ist es eine Tür, die ich zum Activator machen würde und die dann folgendes Script bekommt:
Code:
scn name

short triggered
float timer

ref myself
ref target

Begin onActivate

	if IsActionRef player == 1
		if triggered == 0
			message "Dieses Tor wird anderweitig geöffnet."

		endif

	elseif IsActionRef player == 0
		if triggered == 0
			playgroup forward 0
			set triggered to 1
			enableLinkedPathPoints
			set timer to 3

		elseif triggered == 1
			playgroup backward 0
			set triggered to 0
			disableLinkedPathPoints

		endif

	endif

end

Begin GameMode

	if timer == 3
		set timer to timer - GetSecondsPassed

	endif
	
	if timer <= 2 && triggered == 1
		set target to GetParentRef
		set myself to GetSelf
		target.activate myself 1
		set triggered to 2

	endif

end

Begin onReset

	reset 3DState
	set triggered to 0

end
Bislang ist es so, dass jeder, außer dem Spieler, der diese Tür aktiviert, sie auch öffnet, was ja eben nicht der Fall sein soll...

Edit: Dieses Script soll für Alle von mir erstellten Tür-Activators benutzbar sein können...
 
Zuletzt bearbeitet:
Ich schreibe es dir mal so auf, wie ich persönlich es machen würde:
Code:
scn name

short triggered
float timer

ref myself
ref target

Begin onActivate

	if IsActionRef player == 1
		message "Dieses Tor wird anderweitig geöffnet."
	elseif [COLOR="SeaGreen"]triggered == 1[/COLOR]
		playgroup forward 0
		set timer to 3
		[COLOR="SeaGreen"]set triggered to 2[/COLOR]
	endif

end

Begin GameMode

[COLOR="SeaGreen"]If triggered == 0
	return
Else

	if timer >= 0[/COLOR]
		set timer to timer - GetSecondsPassed
	endif
	
	if timer <= 2 && [COLOR="SeaGreen"]triggered == 2[/COLOR]
		set target to GetParentRef
		set myself to GetSelf
		target.activate myself 1
		[COLOR="SeaGreen"]set triggered to 3[/COLOR]

	endif

[COLOR="SeaGreen"]Endif[/COLOR]

end

Begin onReset

	reset 3DState
	set triggered to 0
	set open to 0

end
Ich habe in einem anderen Grün markiert, was ich geändert/hinzugefügt habe. Beim OnActiovate habe ich auch was entfernt.
Und dann würde ich in dem Script, der auf dem Knopf liegt und dieses Tor öffnen soll, folgendes reinschreiben:

Code:
scn name2

Begin OnActivate
If IsActionref player
set [TorREF].triggered to 1
[TorREF].activate
End
 
Code:
set [ObjektREF].[Variable] to [Wert]
[B];oder[/B]
set [ObjektID].[Variable] to [Wert]
Es geht beides. Dabei müsst ihr aber aufpassen, dass ihr das richtige wählt.
Der erste Scriptbefehl ändert hierbei nur die Variable bei der ausgewählten Referenz. Der zweite Scriptbefehl hingegen ändert die Variable bei allen, in der Welt platzierten Objekten, mit dieser ID.

Ihr könnt mit dieser Syntax, also [ObjektREF].[Variable] bzw. [ObjektID].[Variable] auch genauso gut bestimmte Werte abfragen, übertragen, und damit rechnen.

Man lernt doch immer wieder dazu. :)
 
Hiho!

Ich habe wieder ein Problem :oops:, diesmal zwar nicht mit dem Script selbst, sondern vielmehr mit dem CS... und zwar weigert sich eben dieses, ein Script zu speichern (um Fragen vorzubeugen: Ja, andere Scripts speichert es problemlos, auch längere, nur dieses eine nicht). Ich tippe das Script ein und speichere und bekomme KEINE Anzeigen von wegen Synataxfehlern oder so, aber wenn ich schließen will zeigt er mir trotzdem

an. Auf "JA" klicken, bringt nichts und bei "NEIN" schließt er das halt - ohne zu speichern.

Das Script sieht wie folgt aus (Gildur wirds vielleicht ansatzweise wiedererkennen... ;) ):
Code:
scn name2

ref myself
ref target

Begin onActivate

	if IsActionRef player == 1

		set target to GetParentRef
		set myself to GetSelf

		if GetScriptVariable target, open == 0
			set target.open to 1
			target.activate myself 1
			playgroup forward 0

		elseif GetScriptVariable target, open == 1
			set target.open to 2
			target.activate myself 1
			playgroup backward 0

		elseif GetScriptVariable target, open == 2
			set target.open to 1
			target.activate myself 1
			playgroup forward 0

		endif

	endif

end 

Begin onReset

	reset3DState

end

Da das Script auf ein anderes, spezielles abzielt, auch noch mal das andere Script:
Code:
scn name

short open
short triggered
float timer

ref myself
ref target

Begin onActivate

	if IsActionRef player == 1
		message "Dieses Tor wird anderweitig geöffnet."
		
	elseif open == 1
		playgroup forward 0
		enableLinkedPathPoints

		if triggered == 0
			set triggered to 1
			set timer to 3
			
		endif

	elseif open == 2
		playgroup backward 0
		disableLinkedPathPoints
		
	endif

end

Begin GameMode

	if triggered == 0
		return

	else
		if timer >= 0
		set timer to timer - GetSecondsPassed

		endif
	

		if timer <= 2 && triggered == 1
			set target to GetParentRef
			set myself to GetSelf
			target.activate myself 1
			set triggered to 2

		endif

	endif

end

Begin onReset

	reset3DState
	set triggered to 0
	set open to 0
	disableLinkedPathPoints

end

Ich hab keine Ahnung, woran das liegen kann, auch eine CS-Neuinstallation hat nichts gebracht...

Ich hoffe, jemand weiß da bescheid.

MfG

Edit: Auch wenn ich das Script weniger allgemein schreibe und für das "target" eine spezielle Referenz einsetze, speichert das CS das Script nicht.
 
Zuletzt bearbeitet:
Ich schreibe gerade an einem Skript das seinen Effekt erst ausüben soll wenn man Held von Kvatch ist. Leider finde ich nicht die Richtige Quest, nach der man Held von Kvatch wird.

Code:
scn SkriptName
begin GameMode
if player.GetStageEnd
Ref.startconversation, TopicXY
endif
end
Es fehlt nur noch der Questname und die "Stagenummer".

Mfg Master of Worlds
 
@ Diarrhoe: Wundert mich etwas, dass der Compiler keine Fehlermeldung ausschmeißt. Und zwar klappt es eigentlich nicht, wenn man per Parent versucht die variable zu ändern. Gib dem Parent am besten eine einmalige REF, und schreibe das Script dementsprechend um. Ohne GetParent. So hat es bei mir geklappt.

@ Master Of Worlds: Versuch mal das:
If GetStageDone MQ03 60
 
  • Like
Reaktionen: Master of Worlds
Die Quest "Durchbruch der Belagerung von Kvatch" hat die ID "MS48".

Edit:
@Gildur: Auch bei einer speziellen Referenz speichert er das Script nicht ab:
Code:
name2

Begin onActivate

	if IsActionRef player == 1
		if GetScriptVariable [Tor-REF], open == 0
			set [Tor-REF].open to 1
			[Tor-REF].activate 1
			playgroup forward 0

		elseif GetScriptVariable [Tor-REF], open == 1
			set [Tor-REF].open to 2
			[Tor-REF].activate 1
			playgroup backward 0

		elseif GetScriptVariable [Tor-REF], open == 2
			set [Tor-REF].open to 1
			[Tor-REF].activate 1
			playgroup forward 0

		endif

	endif

end 

Begin onReset

	reset3DState

end

Muss ich vielleicht vorher die Variablen des anderen Scripts deklarieren?
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Master of Worlds
Du solltest vorher auf jeden Fall den anderen Script auf die Referenz legen.
Das sollte reichen (damit sind die Variablen ja deklariert - sie sind ja im Script).
 
Das hab ich auch schon probiert, ändert aber nichts daran.
Oder erkennt das CS die Referenz nicht, wenn ein REF im Namen (also in der Referenz) vorkommt?
 
Hallöle
sorry wenn das vielleicht ein doppelpost ist, aber ich hab keine Zeit, mir 251 Seiten anzusehen.
Zu meiner Frage:
Ist es möglich, dass man durch ein Skript weniger Schaden durch z.B. stumpfe waffen erhält, aber mehr durch Bögen/Pfeile? Wenn ja, wie?
Vielen Dank im Voraus.
 
Zuletzt bearbeitet: