Construction Set Unterwasser warten und schlafen?

Andy1967

Reisender
Hat irgend jemand eine Idee ob es sich einrichten lässt, dass man unterwasser rasten und/oder schlafen kann? Ich hab leider keine Ahnung wie diese Möglichkeit im Spiel blockiert wird, so dass ich im Moment gar nicht wüsste wo ich suchen sollte um zu schauen ob sich da irgendwas dran drehen lässt.
 
Geht nur mit OBSE.

Code:
scn GDTestBook01SCRIPT

float positionz

Begin MenuMode 1012
	if (positionz != 0)
		player.setPos z positionz
		let positionz := 0
	endif
End

Begin GameMode
	if (OnControlDown 16 && player.IsUnderWater)
		let positionz := player.GetPos z
		player.SetPos z 10000
	endif
End

Der Script muss auf einem Gegenstand in der Nähe liegen, am Besten ist wahrscheinlich ein Item im Inventar des Spielers.
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Andy1967
Gegenstand im Inventar sollte kein Problem sein, dazu aber die Frage ob es einen Unterschied für dieses Script macht ob der Gegenstand "nur" im Inventar ist oder ausgerüstet ist. Unterwasser atmen können muss ich ja doch, kann ich das Scruipt also einfach auf den Unterwasseratmungsgegenstand packen? Mit OBSE hab ich mich bislang noch nicht beschäftigt, in so fern tue ich mich im Moment noch etwas schwer damit zu verstehen wie das Script in der Praxis funktioniert.
 
Egal was für ein Gegenstand und er muss auch nicht ausgerüstet sein. Es reicht wenn er im Inventar ist. Der Script ist eigentlich so recht simpel: Wenn der Spieler rasten will, wird er für die Dauer eines Frames auf eine Höhe von 10000 Einheiten gesetzt. Somit ist er nicht mehr unter Wasser und das Spiel registriert auch nicht sofort, dass er in der Luft ist, somit kann man rasten. Wenn der Rasten Dialog beendet wird, wird der Spieler wieder zu seiner vorherigen Position, also unter Wasser, gesetzt. Das einzig unschöne, was passieren kann ist, dass der Spieler im Hintergrund des Rasten-Menus sieht, dass er in der Luft ist. Musst du aber einfach ausprobieren.
 
  • Like
Reaktionen: Andy1967
Ich hab's getestet und es funktioniert tadellos. Im Moment liegt das Script auf einer Sitzbank die als Rastplatz für den Spieler vorgesehen ist, aber auch an anderen Stellen in der selben Cell läuft es tadellos. Vielen herzlichen Dank. :)

Und ja, man sieht im Hintergrund des Rasten-Bildschirms, dass man in der Luft ist, aber das stört mich im Moment nicht weiter. Und da es mir momentan sowieso eigentlich nur um ein oder zwei "wasserhaltige" Indoor Zellen geht kann ich ja vielleicht an der passenden Stelle im Himmel noch ein paar entsprechend texturierte Modelle einbauen um den Eindruck von Wasser zu erwecken, sollte es mich doch eines Tages stören. Aber für den Moment bin ich erst mal voll auf zu frieden.


Im dem Wasserzusammenhang noch eine kleine Frage: Gibt es eigentlich einen Status vergleichbar mit "isUnderWater", der einem Script sagen würde, dass man im Wasser steht, aber noch nicht schwimmt oder unterwasser ist? Müsste es doch eigentlich, da beim laufen durch Wasser ein anderes Laufgeräusch abgespielt wird, als beim laufen auf trockenem Land? Ich bin bei meiner Internet Recherche bislang nur auf "isSwimming", "isOnGround", "isJumping", und "isInAir" gestoßen, aber nichts was diesen Fall abdeckt.
 
Ich bin bei meiner Internet Recherche bislang nur auf "isSwimming", "isOnGround", "isJumping", und "isInAir" gestoßen, aber nichts was diesen Fall abdeckt.
Es gibt auch keine entsprechende Funktion. Du kannst dir aber selbst eine mit den vorhandenen Funktionen schreiben.

Code:
scn isOnWater

ref target
float waterheight
float positionz

Begin Function { target }
	let waterheight := target.getparentCellWaterHeight
	let positionz := target.getpos z + 5
	if positionz == waterheight
		SetFunctionValue 1
		return
	endif
	SetFunctionValue 0
End
Dieser Script ist eine Funktion, die du von jedem beliebigen script aus abrufen kannst. Syntax ist wie folgt:
Code:
call isOnWater reference

Das kann dann beispielsweise wie folgt aussehen:
Code:
Begin GameMode	
	if call isOnWater player
		printc "is on water"
	endif
End
 
Zuletzt bearbeitet:
Okay... jetzt lass mich das mal langsam aufdröseln, damit ich mir sicher bin ich verstehe was hier grade passieren soll...

let positionz := target.getpos z + 5

Target wird in dem Moment mit Player gleichgesetzt wenn die Funktion im eigentlichen Script aufgerufen wird, also in dem "call isOnWater player"?

Und in dem Moment wenn der Player 5 z-Achse Schritte unterhalb des Wasserspiegels der Zelle ist, also die gegenwärtige Position +5 dem vorher abgefragten Wasserspiegel der Zelle entspricht setzt ein was auch immer in dem eigentlichen Script zwischen "if" und "endif" definiert ist?

So weit richtig verstanden?

Wo und wie würdest Du in einem solchen Fall das ausrüsten und un-ausrüsten eines Gegenstands definieren? Mir geht es darum, daß ein Charakter / Spieler einen Wasseratmungsgegenstand ausrüstet, so bald er nasse Füße bekommt und ich bin mir jetzt nicht ganz sicher wie ich das "Function Value", welches ja die Abfrage nach den nassen Füßen setzt am besten und elegantesten in diese Routine integrieren würde. OBSE scheint ja so viele Möglichkeiten zu bieten, da dacht ich mir ich frag mal besser noch mal nach, falls Du mir gestattest noch einen Moment Deiner Zeit in Anspruch zu nehmen, statt einfach einen equip/unequip block in das eigentliche Script zu setzen.
 
Target wird in dem Moment mit Player gleichgesetzt wenn die Funktion im eigentlichen Script aufgerufen wird, also in dem "call isOnWater player"?

Soweit richtig. Das heißt, du kannst diese Funktion auf jedem beliebigen Gegenstand/NPC ausführen und somit herausfinden, ob derjenige sich im Wasser befindet.

Und in dem Moment wenn der Player 5 z-Achse Schritte unterhalb des Wasserspiegels der Zelle ist, also die gegenwärtige Position +5 dem vorher abgefragten Wasserspiegel der Zelle entspricht setzt ein was auch immer in dem eigentlichen Script zwischen "if" und "endif" definiert ist?

Fast richtig. Ich muss dazu sagen, dass ich deine erste Anforderung offensichtlich auf ein winziges Detail falsch verstanden habe. Man muss nur == in <= ändern:
Code:
scn [B][I]isInWater[/I][/B]

ref target
float waterheight
float positionz

Begin Function { target }
	SetFunctionValue 0
[B][I]	if target.ParentCellHasWater == 0
		return
	endif[/I][/B]
	let waterheight := target.getparentCellWaterHeight
	let positionz := target.getpos z + 5
	if positionz [B][I]<=[/I][/B] waterheight
		SetFunctionValue 1
		return
	endif
End
Habe die Änderungen dick markiert. Jetzt zur Erläuterung: In der Fuktion wird getestet, ob die Referenz (zB. der Spieler) in einer Zelle ist, in der sich überhaupt Wasser befindet. Wenn nicht, wird 0 zurückgegeben. Der Rückgabewert wird mit SetFunctionValue 0 festgelegt. Wenn diese Zelle Wasser besitzt, wird anschließend überprüft, ob der Spieler das Wasser berührt, wie du schon richtig erkannt hast. Wenn dem so ist, gibt die Funktion 1 zurück. Diese Funktionen nennt man user-defined functions und werden nie selbst auf Gegenstände oder Quest gelegt, sondern nur von anderen Scripten aufgerufen.

Wo und wie würdest Du in einem solchen Fall das ausrüsten und un-ausrüsten eines Gegenstands definieren? Mir geht es darum, daß ein Charakter / Spieler einen Wasseratmungsgegenstand ausrüstet, so bald er nasse Füße bekommt und ich bin mir jetzt nicht ganz sicher wie ich das "Function Value", welches ja die Abfrage nach den nassen Füßen setzt am besten und elegantesten in diese Routine integrieren würde. OBSE scheint ja so viele Möglichkeiten zu bieten, da dacht ich mir ich frag mal besser noch mal nach, falls Du mir gestattest noch einen Moment Deiner Zeit in Anspruch zu nehmen, statt einfach einen equip/unequip block in das eigentliche Script zu setzen.

Du könntest so ein Script auf den Gegenstand legen:

Code:
scn script

short doonce
short playerIsInWater

Begin GameMode
        ; diese Funktion gibt wie erläutert 1 oder 0 zurück, je nachdem ob der Spieler Wasser berührt
	let playerIsInWater := call isInWater player
	
        ;geht der Spieler ins Wasser? Wenn ja rüste das item aus
	if doonce == 0 && playerIsInWater == 1
		player.EquipItem MyItem
		let doonce := 1
        ;verlässt der Spieler das Wasser? Doonce Variable zurücksetzen
	elseif doonce == 1 && playerIsInWater == 0
		let doonce := 0
	endif
End
 
Zuletzt bearbeitet:
  • Like
Reaktionen: Andy1967
Das sieht wesentlich eleganter aus als alles was ich wahrscheinlich hinbekommen hätte und funktioniert wirklich tadellos. Nicht das ich anderes erwartet hätte. :)

Vielen herzlichen Dank nochmal.