Construction Set Problem mit Travelpackage und "PlayerDisableControls"

Xaephrim

Abenteurer
Okay, hier erstmal was ich vorhabe! (Ist etwas komplex also vorsicht ^^)

In meiner Mod wird der Spieler zu einem bestimmten Zeitpunkt ganz elderscrolls-typisch in eine Gefängniszelle gesteckt. ;)
Sobald er dann in die Nähe der Zellentür geht, kommt der Bösewicht meiner Mod an und erzählt dem Spieler was. Danach haut er wieder ab und lässt den Spieler allein.

Hier was ich gemacht habe:

1.) Ich habe eine Triggerzone mit folgendem Script erstellt und an der Zellentür platziert:
Code:
scn 222PrisonTrigger01

short Trigger
float Timer

begin OnTrigger player
	if Trigger == 0
		DisablePlayerControls ; damit der Spieler nicht den Bösewicht angreift
		set Trigger to 1
endif

if GetStage QuestXYZ == 25 ; wird im Dialog mit dem Bösewicht gesetzt
		if Trigger == 1
			set timer to 8 ; damit der Bösewicht Zeit hat, abzuhauen ohne dass der Spieler angreifen kann
	endif
endif
else
	if timer > 0 
		set timer to timer - GetSecondsPassed
endif
else
		EnablePlayerControls
		set Trigger to 2
endif

end

2.) Dazu habe ich meinen Bösewicht erstellt, der außer Sichtweite des Spielers wartet.
Dieser hat zwei Travelpackages A und B:
A bringt ihn zu einem XMarkerHeading vor der Zellentür mit der Condition "GetPlayerControlsDisabled == 1"
B soll ihn zu seiner Ausgangsposition (auch ein Xmarker) zurückbringen, sobald das Gespräch beendet ist. Condition "Getstage QuestXYZ >= 25" (siehe Script oben)

Außerdem liegt noch ein Script auf ihm:

Code:
scn 222VillainPrisonGreet

short doOnce

begin gamemode
	if doOnce == 0
		if GetDistance player <= 256
			StartConversation player, TopicXYZ
			set doOnce to 1
		endif
	endif
end

Bis zum Ende des Gesprächs funktioniert alles soweit ganz gut, aber dann gibt es 2 Probleme:
1.) Der Bösewicht bleibt nach dem Gespräch vor der Zelle stehen und geht nicht wieder weg.
2.) PlayerEnableControls wird nicht ausgeführt, d.h. der Spieler kann sich nach dem Gespräch NIE mehr bewegen ...

Ich hoffe jemand nimmt sich die Zeit das durchzugucken und kann mir helfen. ;)

PUH! Das war's :eek:
 
Ist das Script korrekt?
Wozu gehören die dick gedruckten Abschnitte?
Code:
scn 222PrisonTrigger01

short Trigger
float Timer

begin OnTrigger player
	if Trigger == 0
		DisablePlayerControls
		set Trigger to 1
endif

if GetStage QuestXYZ == 25
		if Trigger == 1
			set timer to 8
	endif
endif
[B]ELSE[/B]
	if timer > 0 
		set timer to timer - GetSecondsPassed
endif
[B]ELSE[/B]
		EnablePlayerControls
		set Trigger to 2
[B]ENDIF[/B]

end

Wenn ich den Anfang übersehen habe, entschuldige ich mich ;)
 
Wahrscheinlich ist es nicht korrekt, sonst würde es ja funktionieren. :-D

Ich bin auch nicht besonders gut im Scripten, aber ich versuch mich zu bessern. ;)

So etwa? Ich teste das mal.

Code:
scn 222PrisonTrigger01

short Trigger
float Timer

begin OnTrigger player
	if Trigger == 0
		DisablePlayerControls
		set Trigger to 1
endif

if GetStage QuestXYZ == 25
		if Trigger == 1
		set timer to 8
	endif
endif

if timer > 0 
	set timer to timer - GetSecondsPassed
endif
if timer == 0
	EnablePlayerControls
	set Trigger to 2
endif

end
 
Also so:
Code:
scn 222PrisonTrigger01

short Trigger
float timer

begin OnTrigger player
if Trigger == 0
	DisablePlayerControls
	set Trigger to 1
endif

if GetStage QuestXYZ == 25
	if Trigger == 1
		set timer to 8
	endif
endif

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

If ( timer <= 0 ) && ( Trigger == 1 )
	EnablePlayerControls
	set Trigger to 2
endif

end
der 2.:
Code:
scn 222VillainPrisonGreet

short doOnce

begin gamemode

if ( GetDistance player <= 256 ) && ( DoOnce == 0 )
	StartConversation player, TopicXYZ
	set doOnce to 1
endif

end

So vielleicht?

Edit: Doch er geht doch jetzt gar nicht weg, oder?
 
Zuletzt bearbeitet:
Funktioniert leider immer noch nicht. :cry:
1.) In deinem zweitletzten Script steht "timer <=0", das muss ==0 heißen, denn sonst werden die controls nach dem disablen sofort wieder enabled.
Wenn man aber timer==0 schreibt, funktioniert das enablen jedoch immer noch nicht.

2.) Das zweite Script funktionierte auch in meiner Version schon. Das Gespräch findet ja statt und wird auch korrekt beendet (inklusive Tagebucheintrag), nur geht halt der Kerl nicht von der Zelle weg und die Controls funzen nicht.

Dass er nicht weggeht, liegt aber vermutlich am Travelpackage?! Ich weiß nur nicht, was da falsch sein soll.
 
Dann bau doch vor dem enableplayercontrols einfach noch eine Abfrage nach der Queststage ein. Also quasi so:
Code:
scn 222PrisonTrigger01

short Trigger
float timer

begin OnTrigger player
if Trigger == 0
	DisablePlayerControls
	set Trigger to 1
endif

if GetStage QuestXYZ == 25
	if Trigger == 1
		set timer to 8
	endif
endif

if timer >= 0 && GetStage QuestXYZ >= 25
	set timer to timer - GetSecondsPassed
endif

If ( timer <= 0 ) && ( Trigger == 1 )
	EnablePlayerControls
	set Trigger to 2
endif

end
Probier das mal.


Was das Travelpackage angeht kann ich dir aber nicht helfen, da kenn ich mich mal so überhaupt nicht aus.
 
Okay, ich habe jetzt genau das Script von Low Post genommen und das Resultat ist genau das selbe.

Sieht dann so aus:


Wie man sieht, steht er einfach da rum und ich habe weder Menü noch Controls.

:cry:
 
Verdammt, waren meine Augen blind für das Offensichtliche^^
Code:
scn 222PrisonTrigger01

short Trigger
float timer

begin OnTrigger player
if Trigger == 0
	DisablePlayerControls
	set Trigger to 1
endif

if Trigger == 1
	set timer to 8
	set Trigger to 2
endif

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

If ( timer <= 0 ) && ( Trigger == 2 )
	EnablePlayerControls
	set Trigger to 3
endif

end

Ich hoffe, so klappts und wünsche dir viel Erfolg ;)
Ich muss jetzt schlafen :)

MfG Gildur
 
  • Like
Reaktionen: Xaephrim
Offensichtlich? :lol: Na wenn du meinst. ;)

Auf jeden Fall funktioniert es jetzt!!! :D

Fehlt nur noch die Geschichte mit dem Travelpackage ... habe jetzt festgestellt, dass der Kerl mir nach dem Gespräch immer folgt, denn wenn ich von der Tür zurücktrete, rennt er die ganze Zeit dagegen und wenn ich per "tcl" aus der Zelle rausgehe, rennt er hinterher. :huh:

EDIT:
Funktioniert jetzt! Ich musste nur die Travelpackages etwas genauer einstellen.
A: Conditions:
GetStage QuestXYZ <25
GetPlayerControlsDisabled == 1
B: Conditions:
GetStage QuestXYZ >= 25
Außerdem habe ich bei den Flags alles ausgestellt, denn sobald ich irgendwas eigentlich sinnvolles wie "continue if PC near" oder "must reach location" anmache, funzt es nicht mehr.
Verstehe ich nicht ganz, aber immerhin geht es jetzt.
 
Zuletzt bearbeitet:
Ich habe einfach mal die größtenteils komplett falschen Timer-Scripts abgeändert. Das CS Wiki hilft besonders bei Timer- und MessageBox-Scripts weiter, aber auch bei allem anderen. Bevor also deine ganzen Scripts hier reinschreibst, sollet du im Wiki nach einer Lösung suchen.

Code:
scn 222PrisonTrigger01

short Trigger
float Timer

begin OnTrigger player
    if Trigger == 0
        DisablePlayerControls ; damit der Spieler nicht den Bösewicht angreift
        set Trigger to 1
endif

[B]end[/B] ;der Timer wird in einem GameMode-Block gesetzt!


begin GameMode

if GetStage QuestXYZ == 25 ; wird im Dialog mit dem Bösewicht gesetzt
if Trigger == 1
            set timer to 8
            [B]set Triggered to 2[/B] ;damit der Timer nicht ständig wieder auf 8 gesetzt wird!
elseif Trigger == 2
    if timer > 0 
        set timer to timer - GetSecondsPassed
else
        EnablePlayerControls
        set Trigger to [B]3[/B] ;damit der Trigger das ganze nicht wieder startet. Bei einem Activator, der immer wieder funktionieren soll, setzt du es auf 0, damit der Script wieder von vorne starten kann.
endif
endif
endif
end
Dazu das CS Wiki.

Zum zweiten Script (im ersten Post, die "verbesserten" habe ich mir nicht alle angesehen): Gib dem NPC ein AI-Package, das ihn zu jeder Zeit an den Ort gehen soll, an den er dann gehen soll, wenn er mit dem Spieler gesprochen hat. Du erstellst eine Global Variable mit dem Namen "222BosewichtGehtWegGlobal", die standardmäßig == 0 ist. Als Condition für das Weggeh-Package des NPCs setzt du ""222BosewichtGehtWegGlobal == 1". Mit der TriggerZone oben wird dann auch die Global auf 1 gesetzt bzw. im ResultScript des letzten Topics des NPCs, mit dem das Gespräch beendet wird.

Da AI-Packages einige Sekunden Zeit benötigen, um automatisch "upzudaten", also dass der NPC auch weggeht, veranlasst du den NPC per Script, "nachzusehen", ob er nicht ein anderes Package, am Besten das von dir neu hinzugefügte an erster Stelle der Liste, benutzt. Das machst du mit dem Befehl

[ActorID].EVP

"EVP" steht für "EvaluatePackage" - das kannst du auch ausschreiben, wenn du willst. Dazu das CS Wiki.

edit: Ich weiß ja nicht, wie dein NPC vor die Gefängniszelle gelangt, aber da du dazu keine Frage gestellt hast, gehe ich davon aus, dass das irgendwie geklappt hat. ;)
 
@Fellan:

Danke, den EVP Befehl kannte ich auch noch nicht, aber dir ist schon klar, dass wir beide Probleme mittlerweile gelöst haben oder? ;)
Guck dir mal die letzten beiden Posts vor deinem Post an ... es geht nämlich auch ohne Globals. ^^

Und zum CS Wiki kann ich nur sagen, dass ich da in den letzten Tagen SEHR viel drin rumgewühlt habe und ich kann nicht behaupten, dass da irgendetwas besonders gut erklärt wäre. Vielleicht für jemanden, der sich ohnehin schon mit irgendwelchen Programmiersprachen wie z.B. C++ auseinandergesetzt hat, aber für jemanden wie mich, der damit nichts am Hut hat, ist das alles ziemlich konfus. :oops:
Bis ich WIRKLICH begriffen hatte, was z.B. "set timer to timer - GetSecondsPassed" bewirkt und wie man einen Timer erstellt, hat es echt ne Weile gedauert. :(
Und mein Englisch ist nicht gerade das Schlechteste ...

Momentan hänge ich z.B. schon wieder am nächsten Problem - dieses mal an der "activate" Funktion. Ich versuche nämlich gerade einen Activator über ein Skript zu aktivieren, das NICHT auf dem Activator selbst liegt. Genauer gesagt "ARSecretWall01", also diese ayleidische Geheimtür. (die soll sich öffnen)
Mit

MySecretDoor01REF.activate

in einem gamemode Block funktioniert es zumindest nicht.
(bis zum activate Befehl funktioniert das Skript, denn an der Stelle soll auch eine Messagebox erscheinen und die wird angezeigt)
 
Zuletzt bearbeitet:
Xaephrim schrieb:
es geht nämlich auch ohne Globals.

Ich weiß, ich arbeite aber sehr gerne damit. Finde ich einfach übersichtlicher und hatte nie Probleme damit.

Xaephrim schrieb:
dir ist schon klar, dass wir beide Probleme mittlerweile gelöst haben oder?

Nein, sonst hätte ich das ja nicht geschrieben. Ich habe mir nur die ersten paar Scripts am Anfang angesehen und wollte das nicht so stehenlassen. ;)

@Beolo: Türen öffnet und schließt man nicht mit "playgroup"-Befehlen, damit "bewegt" man Dinge wie Activator, Türen bewegt man mit "Open" und "Close", ich mache das aber mit

"TürRef.activate Player"

Ohne "Player" (oder irgendein Dummy-Objekt, ein anderes Objekt, ein anderer NPC, sonstwas) funktioniert das zumindest bei mir nicht, ist wahrscheinlich ein Bug im CS.
 
sry, aber da muss ich wiedersprechen. Das ist kein Bug.

Es ist nur so, dass man bei dem Befehl "activate" auch eine Reference des Aktivierenden angeben muss, solange er im "Begin OnActivate"-Block steht. Sprich in "GameMode"s ist eine Reference nicht nötig, aber bei einem "Begin OnActivate" brauch der Befehl einen festgelegten Aktivierer.

MfG Gildur
 
  • Like
Reaktionen: Fellan
Ah, danke Beolo, ich fing schon an, an mir zu zweifeln. :D

Funktioniert jetzt einwandfrei mit "playgroup", da es ja im eigentlichen Sinne gar keine Tür ist, sondern eine Wand, die im Boden verschwindet.